Index: views/events/event_win.cc |
diff --git a/views/events/event_win.cc b/views/events/event_win.cc |
index 6f0eab03fdc569944c00a39f7e1e7ded309f8925..b066c2d8983b7b7ea300963043898419a616b538 100644 |
--- a/views/events/event_win.cc |
+++ b/views/events/event_win.cc |
@@ -4,263 +4,13 @@ |
#include "views/events/event.h" |
-#include <windows.h> |
- |
#include "base/logging.h" |
-#include "ui/base/keycodes/keyboard_code_conversion_win.h" |
namespace views { |
-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; |
- flags |= (GetKeyState(VK_MENU) & 0x80)? ui::EF_ALT_DOWN : 0; |
- flags |= (GetKeyState(VK_SHIFT) & 0x80)? ui::EF_SHIFT_DOWN : 0; |
- flags |= (GetKeyState(VK_CONTROL) & 0x80)? ui::EF_CONTROL_DOWN : 0; |
- return flags; |
-} |
- |
-bool IsButtonDown(NativeEvent native_event) { |
- return (native_event.wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON | |
- MK_XBUTTON1 | MK_XBUTTON2)) != 0; |
-} |
- |
-// Convert windows message identifiers to Event types. |
-ui::EventType EventTypeFromNative(NativeEvent native_event) { |
- switch (native_event.message) { |
- case WM_KEYDOWN: |
- case WM_SYSKEYDOWN: |
- case WM_CHAR: |
- return ui::ET_KEY_PRESSED; |
- case WM_KEYUP: |
- case WM_SYSKEYUP: |
- return ui::ET_KEY_RELEASED; |
- case WM_LBUTTONDBLCLK: |
- case WM_LBUTTONDOWN: |
- case WM_MBUTTONDBLCLK: |
- case WM_MBUTTONDOWN: |
- case WM_NCLBUTTONDBLCLK: |
- case WM_NCLBUTTONDOWN: |
- case WM_NCMBUTTONDBLCLK: |
- case WM_NCMBUTTONDOWN: |
- case WM_NCRBUTTONDBLCLK: |
- case WM_NCRBUTTONDOWN: |
- case WM_NCXBUTTONDBLCLK: |
- case WM_NCXBUTTONDOWN: |
- case WM_RBUTTONDBLCLK: |
- case WM_RBUTTONDOWN: |
- case WM_XBUTTONDBLCLK: |
- case WM_XBUTTONDOWN: |
- return ui::ET_MOUSE_PRESSED; |
- case WM_LBUTTONUP: |
- case WM_MBUTTONUP: |
- case WM_NCLBUTTONUP: |
- case WM_NCMBUTTONUP: |
- case WM_NCRBUTTONUP: |
- case WM_NCXBUTTONUP: |
- case WM_RBUTTONUP: |
- case WM_XBUTTONUP: |
- return ui::ET_MOUSE_RELEASED; |
- case WM_MOUSEMOVE: |
- return IsButtonDown(native_event) ? ui::ET_MOUSE_DRAGGED : |
- ui::ET_MOUSE_MOVED; |
- case WM_NCMOUSEMOVE: |
- return ui::ET_MOUSE_MOVED; |
- case WM_MOUSEWHEEL: |
- return ui::ET_MOUSEWHEEL; |
- case WM_MOUSELEAVE: |
- case WM_NCMOUSELEAVE: |
- return ui::ET_MOUSE_EXITED; |
- default: |
- NOTREACHED(); |
- } |
- return ui::ET_UNKNOWN; |
-} |
- |
-// Get views::Event flags from a native Windows message |
-int EventFlagsFromNative(NativeEvent native_event) { |
- int flags = 0; |
- |
- // TODO(msw): ORing the pressed/released button into the flags is _wrong_. |
- // It makes it impossible to tell which button was modified when multiple |
- // buttons are/were held down. We need to instead put the modified button into |
- // a separate member on the MouseEvent, then audit all consumers of |
- // MouseEvents to fix them to use the resulting values correctly. |
- switch (native_event.message) { |
- case WM_LBUTTONDBLCLK: |
- case WM_LBUTTONDOWN: |
- case WM_LBUTTONUP: |
- case WM_NCLBUTTONDBLCLK: |
- case WM_NCLBUTTONDOWN: |
- case WM_NCLBUTTONUP: |
- native_event.wParam |= MK_LBUTTON; |
- break; |
- case WM_MBUTTONDBLCLK: |
- case WM_MBUTTONDOWN: |
- case WM_MBUTTONUP: |
- case WM_NCMBUTTONDBLCLK: |
- case WM_NCMBUTTONDOWN: |
- case WM_NCMBUTTONUP: |
- native_event.wParam |= MK_MBUTTON; |
- break; |
- case WM_RBUTTONDBLCLK: |
- case WM_RBUTTONDOWN: |
- case WM_RBUTTONUP: |
- case WM_NCRBUTTONDBLCLK: |
- case WM_NCRBUTTONDOWN: |
- case WM_NCRBUTTONUP: |
- native_event.wParam |= MK_RBUTTON; |
- break; |
- case WM_NCXBUTTONDBLCLK: |
- case WM_NCXBUTTONDOWN: |
- case WM_NCXBUTTONUP: |
- case WM_XBUTTONDBLCLK: |
- case WM_XBUTTONDOWN: |
- case WM_XBUTTONUP: |
- native_event.wParam |= MK_XBUTTON1; |
- break; |
- } |
- |
- // Check if the event occurred in the non-client area. |
- if (IsNonClientMouseEvent(native_event)) |
- flags |= ui::EF_IS_NON_CLIENT; |
- |
- // Check for double click events. |
- switch (native_event.message) { |
- case WM_NCLBUTTONDBLCLK: |
- case WM_NCMBUTTONDBLCLK: |
- case WM_NCRBUTTONDBLCLK: |
- case WM_NCXBUTTONDBLCLK: |
- case WM_LBUTTONDBLCLK: |
- case WM_MBUTTONDBLCLK: |
- case WM_RBUTTONDBLCLK: |
- case WM_XBUTTONDBLCLK: |
- flags |= ui::EF_IS_DOUBLE_CLICK; |
- break; |
- } |
- |
- // For non-client mouse message, the WPARAM value represents the hit test |
- // result, instead of the key state. |
- switch (native_event.message) { |
- case WM_NCLBUTTONDOWN: |
- case WM_NCLBUTTONUP: |
- flags |= ui::EF_LEFT_BUTTON_DOWN; |
- break; |
- case WM_NCMBUTTONDOWN: |
- case WM_NCMBUTTONUP: |
- flags |= ui::EF_MIDDLE_BUTTON_DOWN; |
- break; |
- case WM_NCRBUTTONDOWN: |
- case WM_NCRBUTTONUP: |
- flags |= ui::EF_RIGHT_BUTTON_DOWN; |
- break; |
- default: { |
- UINT win_flags = GET_KEYSTATE_WPARAM(native_event.wParam); |
- flags |= (win_flags & MK_CONTROL) ? ui::EF_CONTROL_DOWN : 0; |
- flags |= (win_flags & MK_SHIFT) ? ui::EF_SHIFT_DOWN : 0; |
- flags |= (GetKeyState(VK_MENU) < 0) ? ui::EF_ALT_DOWN : 0; |
- flags |= (win_flags & MK_LBUTTON) ? ui::EF_LEFT_BUTTON_DOWN : 0; |
- flags |= (win_flags & MK_MBUTTON) ? ui::EF_MIDDLE_BUTTON_DOWN : 0; |
- flags |= (win_flags & MK_RBUTTON) ? ui::EF_RIGHT_BUTTON_DOWN : 0; |
- break; |
- } |
- } |
- |
- return flags; |
-} |
- |
-} // namespace |
- |
-bool IsClientMouseEvent(const views::NativeEvent& native_event) { |
- return native_event.message == WM_MOUSELEAVE || |
- native_event.message == WM_MOUSEHOVER || |
- (native_event.message >= WM_MOUSEFIRST && |
- native_event.message <= WM_MOUSELAST); |
-} |
- |
-bool IsNonClientMouseEvent(const views::NativeEvent& native_event) { |
- return native_event.message == WM_NCMOUSELEAVE || |
- native_event.message == WM_NCMOUSEHOVER || |
- (native_event.message >= WM_NCMOUSEMOVE && |
- native_event.message <= WM_NCXBUTTONDBLCLK); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// Event, public: |
- |
-int Event::GetWindowsFlags() const { |
- // TODO: need support for x1/x2. |
- int result = 0; |
- result |= (flags_ & ui::EF_SHIFT_DOWN) ? MK_SHIFT : 0; |
- result |= (flags_ & ui::EF_CONTROL_DOWN) ? MK_CONTROL : 0; |
- result |= (flags_ & ui::EF_LEFT_BUTTON_DOWN) ? MK_LBUTTON : 0; |
- result |= (flags_ & ui::EF_MIDDLE_BUTTON_DOWN) ? MK_MBUTTON : 0; |
- result |= (flags_ & ui::EF_RIGHT_BUTTON_DOWN) ? MK_RBUTTON : 0; |
- return result; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// Event, private: |
- |
-void Event::Init() { |
- ZeroMemory(&native_event_, sizeof(native_event_)); |
- native_event_2_ = NULL; |
-} |
- |
-void Event::InitWithNativeEvent(NativeEvent native_event) { |
- native_event_ = native_event; |
- // TODO(beng): remove once we rid views of Gtk/Gdk. |
- native_event_2_ = NULL; |
-} |
- |
-void Event::InitWithNativeEvent2(NativeEvent2 native_event_2, |
- FromNativeEvent2) { |
- // No one should ever call this on Windows. |
- // TODO(beng): remove once we rid views of Gtk/Gdk. |
- NOTREACHED(); |
- native_event_2_ = NULL; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// LocatedEvent, protected: |
- |
-LocatedEvent::LocatedEvent(NativeEvent native_event) |
- : Event(native_event, EventTypeFromNative(native_event), |
- EventFlagsFromNative(native_event)), |
- location_(native_event.pt.x, native_event.pt.y) { |
-} |
- |
-LocatedEvent::LocatedEvent(NativeEvent2 native_event_2, |
- FromNativeEvent2 from_native) |
- : Event(native_event_2, ui::ET_UNKNOWN, 0, from_native) { |
- // No one should ever call this on Windows. |
- // TODO(msw): remove once we rid views of Gtk/Gdk. |
- NOTREACHED(); |
-} |
- |
//////////////////////////////////////////////////////////////////////////////// |
// KeyEvent, public: |
-KeyEvent::KeyEvent(NativeEvent native_event) |
- : Event(native_event, |
- EventTypeFromNative(native_event), |
- GetKeyStateFlags()), |
- key_code_(ui::KeyboardCodeForWindowsKeyCode(native_event.wParam)), |
- character_(0), |
- unmodified_character_(0) { |
-} |
- |
-KeyEvent::KeyEvent(NativeEvent2 native_event_2, FromNativeEvent2 from_native) |
- : Event(native_event_2, ui::ET_UNKNOWN, 0, from_native) { |
- // No one should ever call this on Windows. |
- // TODO(beng): remove once we rid views of Gtk/Gdk. |
- NOTREACHED(); |
-} |
- |
uint16 KeyEvent::GetCharacter() const { |
if (character_) |
return character_; |
@@ -276,42 +26,4 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const { |
GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); |
} |
-//////////////////////////////////////////////////////////////////////////////// |
-// MouseEvent, public: |
- |
-MouseEvent::MouseEvent(NativeEvent native_event) |
- : LocatedEvent(native_event) { |
- if (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 = location_.ToPOINT(); |
- ScreenToClient(native_event.hwnd, &native_point); |
- location_ = gfx::Point(native_point); |
- } |
-} |
- |
-MouseEvent::MouseEvent(NativeEvent2 native_event_2, |
- FromNativeEvent2 from_native) |
- : LocatedEvent(native_event_2, from_native) { |
- // No one should ever call this on Windows. |
- // TODO(msw): remove once we rid views of Gtk/Gdk. |
- NOTREACHED(); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// MouseWheelEvent, public: |
- |
-MouseWheelEvent::MouseWheelEvent(NativeEvent native_event) |
- : MouseEvent(native_event), |
- offset_(GET_WHEEL_DELTA_WPARAM(native_event.wParam)) { |
-} |
- |
-MouseWheelEvent::MouseWheelEvent(NativeEvent2 native_event_2, |
- FromNativeEvent2 from_native) |
- : MouseEvent(native_event_2, from_native) { |
- // No one should ever call this on Windows. |
- // TODO(msw): remove once we rid views of Gtk/Gdk. |
- NOTREACHED(); |
-} |
- |
} // namespace views |