| Index: ui/views/events/event_win.cc
|
| ===================================================================
|
| --- ui/views/events/event_win.cc (revision 0)
|
| +++ ui/views/events/event_win.cc (revision 0)
|
| @@ -0,0 +1,195 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "ui/views/events/event.h"
|
| +
|
| +#include <windowsx.h>
|
| +
|
| +#include "base/logging.h"
|
| +#include "ui/base/keycodes/keyboard_code_conversion_win.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +// Returns a mask corresponding to the set of modifier keys that are currently
|
| +// pressed. Windows key messages don't come with control key state as parameters
|
| +// as with mouse messages, so we need to explicitly ask for these states.
|
| +int GetKeyStateFlags() {
|
| + int flags = 0;
|
| + if (GetKeyState(VK_MENU) & 0x80)
|
| + flags |= Event::EF_ALT_DOWN;
|
| + if (GetKeyState(VK_SHIFT) & 0x80)
|
| + flags |= Event::EF_SHIFT_DOWN;
|
| + if (GetKeyState(VK_CONTROL) & 0x80)
|
| + flags |= Event::EF_CONTROL_DOWN;
|
| + return flags;
|
| +}
|
| +
|
| +// Convert windows message identifiers to Event types.
|
| +Event::EventType EventTypeFromNative(NativeEvent native_event) {
|
| + switch (native_event.message) {
|
| + case WM_KEYDOWN:
|
| + case WM_SYSKEYDOWN:
|
| + return Event::ET_KEY_PRESSED;
|
| + case WM_KEYUP:
|
| + case WM_SYSKEYUP:
|
| + return Event::ET_KEY_RELEASED;
|
| + case WM_LBUTTONDOWN:
|
| + case WM_MBUTTONDOWN:
|
| + case WM_NCLBUTTONDOWN:
|
| + case WM_NCMBUTTONDOWN:
|
| + case WM_NCRBUTTONDOWN:
|
| + case WM_RBUTTONDOWN:
|
| + return Event::ET_MOUSE_PRESSED;
|
| + case WM_LBUTTONDBLCLK:
|
| + case WM_LBUTTONUP:
|
| + case WM_MBUTTONDBLCLK:
|
| + case WM_MBUTTONUP:
|
| + case WM_NCLBUTTONDBLCLK:
|
| + case WM_NCLBUTTONUP:
|
| + case WM_NCMBUTTONDBLCLK:
|
| + case WM_NCMBUTTONUP:
|
| + case WM_NCRBUTTONDBLCLK:
|
| + case WM_NCRBUTTONUP:
|
| + case WM_RBUTTONDBLCLK:
|
| + case WM_RBUTTONUP:
|
| + return Event::ET_MOUSE_RELEASED;
|
| + case WM_MOUSEMOVE:
|
| + case WM_NCMOUSEMOVE:
|
| + return Event::ET_MOUSE_MOVED;
|
| + case WM_MOUSEWHEEL:
|
| + return Event::ET_MOUSEWHEEL;
|
| + case WM_MOUSELEAVE:
|
| + case WM_NCMOUSELEAVE:
|
| + return Event::ET_MOUSE_EXITED;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| + return Event::ET_UNKNOWN;
|
| +}
|
| +
|
| +bool IsClientMouseEvent(NativeEvent native_event) {
|
| + return native_event.message == WM_MOUSELEAVE ||
|
| + (native_event.message >= WM_MOUSEFIRST &&
|
| + native_event.message <= WM_MOUSELAST);
|
| +}
|
| +
|
| +bool IsNonClientMouseEvent(NativeEvent native_event) {
|
| + return native_event.message == WM_NCMOUSELEAVE ||
|
| + (native_event.message >= WM_NCMOUSEMOVE &&
|
| + native_event.message <= WM_NCMBUTTONDBLCLK);
|
| +}
|
| +
|
| +gfx::Point MousePositionFromNative(NativeEvent native_event) {
|
| + if (IsClientMouseEvent(native_event)) {
|
| + // Client message. The position is contained in the LPARAM.
|
| + return gfx::Point(GET_X_LPARAM(native_event.lParam),
|
| + GET_Y_LPARAM(native_event.lParam));
|
| + }
|
| + DCHECK(IsNonClientMouseEvent(native_event));
|
| + // Non-client message. The position is contained in a POINTS structure in
|
| + // LPARAM, and is in screen coordinates so we have to convert to client.
|
| + POINT native_point = { GET_X_LPARAM(native_event.lParam),
|
| + GET_Y_LPARAM(native_event.lParam) };
|
| + ScreenToClient(native_event.hwnd, &native_point);
|
| + return gfx::Point(native_point);
|
| +}
|
| +
|
| +int MouseEventFlagsFromNative(NativeEvent native_event) {
|
| + int flags = 0;
|
| +
|
| + // Check if the event occurred in the non-client area.
|
| + if (IsNonClientMouseEvent(native_event))
|
| + flags |= MouseEvent::EF_IS_NON_CLIENT;
|
| +
|
| + // Check for double click events.
|
| + switch (native_event.message) {
|
| + case WM_NCLBUTTONDBLCLK:
|
| + case WM_NCMBUTTONDBLCLK:
|
| + case WM_NCRBUTTONDBLCLK:
|
| + case WM_LBUTTONDBLCLK:
|
| + case WM_MBUTTONDBLCLK:
|
| + case WM_RBUTTONDBLCLK:
|
| + flags |= MouseEvent::EF_IS_DOUBLE_CLICK;
|
| + break;
|
| + }
|
| +
|
| + // Check for pressed buttons.
|
| + if (IsClientMouseEvent(native_event)) {
|
| + if (native_event.wParam & MK_LBUTTON)
|
| + flags |= Event::EF_LEFT_BUTTON_DOWN;
|
| + if (native_event.wParam & MK_MBUTTON)
|
| + flags |= Event::EF_MIDDLE_BUTTON_DOWN;
|
| + if (native_event.wParam & MK_RBUTTON)
|
| + flags |= Event::EF_RIGHT_BUTTON_DOWN;
|
| + } else if (IsNonClientMouseEvent(native_event)) {
|
| + switch (native_event.message) {
|
| + case WM_NCLBUTTONDOWN:
|
| + flags |= Event::EF_LEFT_BUTTON_DOWN;
|
| + break;
|
| + case WM_NCMBUTTONDOWN:
|
| + flags |= Event::EF_MIDDLE_BUTTON_DOWN;
|
| + break;
|
| + case WM_NCRBUTTONDOWN:
|
| + flags |= Event::EF_RIGHT_BUTTON_DOWN;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + // Finally make sure the key state flags are included.
|
| + return flags | GetKeyStateFlags();
|
| +}
|
| +
|
| +int MouseWheelEventFlagsFromNative(NativeEvent native_event) {
|
| + int native_flags = GET_KEYSTATE_WPARAM(native_event.wParam);
|
| + int flags = 0;
|
| + if (native_flags & MK_CONTROL)
|
| + flags |= Event::EF_CONTROL_DOWN;
|
| + if (native_flags & MK_SHIFT)
|
| + flags |= Event::EF_SHIFT_DOWN;
|
| + if (GetKeyState(VK_MENU) < 0)
|
| + flags |= Event::EF_ALT_DOWN;
|
| + if (native_flags & MK_LBUTTON)
|
| + flags |= Event::EF_LEFT_BUTTON_DOWN;
|
| + if (native_flags & MK_MBUTTON)
|
| + flags |= Event::EF_MIDDLE_BUTTON_DOWN;
|
| + if (native_flags & MK_RBUTTON)
|
| + flags |= Event::EF_RIGHT_BUTTON_DOWN;
|
| + return flags;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// KeyEvent, public:
|
| +
|
| +KeyEvent::KeyEvent(NativeEvent native_event)
|
| + : Event(EventTypeFromNative(native_event), GetKeyStateFlags()),
|
| + key_code_(KeyboardCodeForWindowsKeyCode(native_event.wParam)),
|
| + repeat_count_(native_event.lParam & 0xFFFF),
|
| + message_flags_((native_event.lParam & 0xFFFF0000) >> 16) {
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// MouseEvent, public:
|
| +
|
| +MouseEvent::MouseEvent(NativeEvent native_event)
|
| + : LocatedEvent(EventTypeFromNative(native_event),
|
| + MousePositionFromNative(native_event),
|
| + MouseEventFlagsFromNative(native_event)) {
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +// MouseWheelEvent, public:
|
| +
|
| +MouseWheelEvent::MouseWheelEvent(NativeEvent native_event)
|
| + : LocatedEvent(ET_MOUSEWHEEL,
|
| + MousePositionFromNative(native_event),
|
| + MouseWheelEventFlagsFromNative(native_event)),
|
| + offset_(GET_WHEEL_DELTA_WPARAM(native_event.wParam)) {
|
| +}
|
| +
|
| +} // namespace ui
|
| +
|
|
|
| Property changes on: ui\views\events\event_win.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|