| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "views/events/event.h" | 5 #include "ui/base/events.h" |
| 6 | 6 |
| 7 #include <gdk/gdk.h> | 7 #include <gdk/gdk.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" | 10 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" |
| 11 | 11 #include "ui/gfx/point.h" |
| 12 namespace views { | |
| 13 | 12 |
| 14 namespace { | 13 namespace { |
| 15 | 14 |
| 16 ui::EventType EventTypeFromNative(NativeEvent native_event) { | 15 unsigned int GetGdkStateFromNative(const ui::NativeEvent& native_event) { |
| 17 // Add new event types as necessary. | |
| 18 switch (native_event->type) { | |
| 19 case GDK_2BUTTON_PRESS: | |
| 20 case GDK_3BUTTON_PRESS: | |
| 21 case GDK_BUTTON_PRESS: | |
| 22 return ui::ET_MOUSE_PRESSED; | |
| 23 case GDK_BUTTON_RELEASE: | |
| 24 return ui::ET_MOUSE_RELEASED; | |
| 25 case GDK_DRAG_MOTION: | |
| 26 return ui::ET_MOUSE_DRAGGED; | |
| 27 case GDK_ENTER_NOTIFY: | |
| 28 return ui::ET_MOUSE_ENTERED; | |
| 29 case GDK_KEY_PRESS: | |
| 30 return ui::ET_KEY_PRESSED; | |
| 31 case GDK_KEY_RELEASE: | |
| 32 return ui::ET_KEY_RELEASED; | |
| 33 case GDK_LEAVE_NOTIFY: | |
| 34 return ui::ET_MOUSE_EXITED; | |
| 35 case GDK_MOTION_NOTIFY: | |
| 36 if (native_event->motion.state & GDK_BUTTON1_MASK || | |
| 37 native_event->motion.state & GDK_BUTTON2_MASK || | |
| 38 native_event->motion.state & GDK_BUTTON3_MASK || | |
| 39 native_event->motion.state & GDK_BUTTON4_MASK || | |
| 40 native_event->motion.state & GDK_BUTTON5_MASK) { | |
| 41 return ui::ET_MOUSE_DRAGGED; | |
| 42 } | |
| 43 return ui::ET_MOUSE_MOVED; | |
| 44 case GDK_SCROLL: | |
| 45 return ui::ET_MOUSEWHEEL; | |
| 46 default: | |
| 47 NOTREACHED(); | |
| 48 break; | |
| 49 } | |
| 50 return ui::ET_UNKNOWN; | |
| 51 } | |
| 52 | |
| 53 GdkEventKey* GetGdkEventKeyFromNative(NativeEvent native_event) { | |
| 54 DCHECK(native_event->type == GDK_KEY_PRESS || | |
| 55 native_event->type == GDK_KEY_RELEASE); | |
| 56 return &native_event->key; | |
| 57 } | |
| 58 | |
| 59 gfx::Point GetMouseEventLocation(NativeEvent native_event) { | |
| 60 double x = 0, y = 0; | |
| 61 if (gdk_event_get_coords(native_event, &x, &y)) | |
| 62 return gfx::Point(static_cast<int>(x), static_cast<int>(y)); | |
| 63 return gfx::Point(); | |
| 64 } | |
| 65 | |
| 66 int GetMouseWheelOffset(NativeEvent native_event) { | |
| 67 DCHECK(native_event->type == GDK_SCROLL); | |
| 68 int offset = (native_event->scroll.direction == GDK_SCROLL_UP || | |
| 69 native_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; | |
| 70 return MouseWheelEvent::kWheelDelta * offset; | |
| 71 } | |
| 72 | |
| 73 unsigned int GetGdkStateFromNative(NativeEvent native_event) { | |
| 74 switch (native_event->type) { | 16 switch (native_event->type) { |
| 75 case GDK_KEY_PRESS: | 17 case GDK_KEY_PRESS: |
| 76 case GDK_KEY_RELEASE: | 18 case GDK_KEY_RELEASE: |
| 77 return native_event->key.state; | 19 return native_event->key.state; |
| 78 case GDK_BUTTON_PRESS: | 20 case GDK_BUTTON_PRESS: |
| 79 case GDK_2BUTTON_PRESS: | 21 case GDK_2BUTTON_PRESS: |
| 80 case GDK_3BUTTON_PRESS: | 22 case GDK_3BUTTON_PRESS: |
| 81 case GDK_BUTTON_RELEASE: | 23 case GDK_BUTTON_RELEASE: |
| 82 return native_event->button.state; | 24 return native_event->button.state; |
| 83 case GDK_SCROLL: | 25 case GDK_SCROLL: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 101 flags |= (state & GDK_SHIFT_MASK) ? ui::EF_SHIFT_DOWN : 0; | 43 flags |= (state & GDK_SHIFT_MASK) ? ui::EF_SHIFT_DOWN : 0; |
| 102 flags |= (state & GDK_MOD1_MASK) ? ui::EF_ALT_DOWN : 0; | 44 flags |= (state & GDK_MOD1_MASK) ? ui::EF_ALT_DOWN : 0; |
| 103 flags |= (state & GDK_BUTTON1_MASK) ? ui::EF_LEFT_BUTTON_DOWN : 0; | 45 flags |= (state & GDK_BUTTON1_MASK) ? ui::EF_LEFT_BUTTON_DOWN : 0; |
| 104 flags |= (state & GDK_BUTTON2_MASK) ? ui::EF_MIDDLE_BUTTON_DOWN : 0; | 46 flags |= (state & GDK_BUTTON2_MASK) ? ui::EF_MIDDLE_BUTTON_DOWN : 0; |
| 105 flags |= (state & GDK_BUTTON3_MASK) ? ui::EF_RIGHT_BUTTON_DOWN : 0; | 47 flags |= (state & GDK_BUTTON3_MASK) ? ui::EF_RIGHT_BUTTON_DOWN : 0; |
| 106 return flags; | 48 return flags; |
| 107 } | 49 } |
| 108 | 50 |
| 109 } // namespace | 51 } // namespace |
| 110 | 52 |
| 111 //////////////////////////////////////////////////////////////////////////////// | 53 namespace ui { |
| 112 // Event, public: | |
| 113 | 54 |
| 114 // static | 55 EventType EventTypeFromNative(const ui::NativeEvent& native_event) { |
| 115 int Event::GetFlagsFromGdkEvent(NativeEvent native_event) { | 56 // Add new event types as necessary. |
| 57 switch (native_event->type) { |
| 58 case GDK_2BUTTON_PRESS: |
| 59 case GDK_3BUTTON_PRESS: |
| 60 case GDK_BUTTON_PRESS: |
| 61 return ET_MOUSE_PRESSED; |
| 62 case GDK_BUTTON_RELEASE: |
| 63 return ET_MOUSE_RELEASED; |
| 64 case GDK_DRAG_MOTION: |
| 65 return ET_MOUSE_DRAGGED; |
| 66 case GDK_ENTER_NOTIFY: |
| 67 return ET_MOUSE_ENTERED; |
| 68 case GDK_KEY_PRESS: |
| 69 return ET_KEY_PRESSED; |
| 70 case GDK_KEY_RELEASE: |
| 71 return ET_KEY_RELEASED; |
| 72 case GDK_LEAVE_NOTIFY: |
| 73 return ET_MOUSE_EXITED; |
| 74 case GDK_MOTION_NOTIFY: |
| 75 if (native_event->motion.state & GDK_BUTTON1_MASK || |
| 76 native_event->motion.state & GDK_BUTTON2_MASK || |
| 77 native_event->motion.state & GDK_BUTTON3_MASK || |
| 78 native_event->motion.state & GDK_BUTTON4_MASK || |
| 79 native_event->motion.state & GDK_BUTTON5_MASK) { |
| 80 return ET_MOUSE_DRAGGED; |
| 81 } |
| 82 return ET_MOUSE_MOVED; |
| 83 case GDK_SCROLL: |
| 84 return ET_MOUSEWHEEL; |
| 85 default: |
| 86 NOTREACHED(); |
| 87 break; |
| 88 } |
| 89 return ET_UNKNOWN; |
| 90 } |
| 91 |
| 92 int EventFlagsFromNative(const ui::NativeEvent& native_event) { |
| 116 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(native_event)); | 93 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(native_event)); |
| 117 if (native_event->type == GDK_2BUTTON_PRESS) | 94 if (native_event->type == GDK_2BUTTON_PRESS) |
| 118 flags |= ui::EF_IS_DOUBLE_CLICK; | 95 flags |= ui::EF_IS_DOUBLE_CLICK; |
| 119 if (native_event->type == GDK_BUTTON_PRESS || | 96 if (native_event->type == GDK_BUTTON_PRESS || |
| 120 native_event->type == GDK_2BUTTON_PRESS || | 97 native_event->type == GDK_2BUTTON_PRESS || |
| 121 native_event->type == GDK_3BUTTON_PRESS || | 98 native_event->type == GDK_3BUTTON_PRESS || |
| 122 native_event->type == GDK_BUTTON_RELEASE) { | 99 native_event->type == GDK_BUTTON_RELEASE) { |
| 123 switch (native_event->button.button) { | 100 switch (native_event->button.button) { |
| 124 case 1: | 101 case 1: |
| 125 return flags | ui::EF_LEFT_BUTTON_DOWN; | 102 return flags | ui::EF_LEFT_BUTTON_DOWN; |
| 126 case 2: | 103 case 2: |
| 127 return flags | ui::EF_MIDDLE_BUTTON_DOWN; | 104 return flags | ui::EF_MIDDLE_BUTTON_DOWN; |
| 128 case 3: | 105 case 3: |
| 129 return flags | ui::EF_RIGHT_BUTTON_DOWN; | 106 return flags | ui::EF_RIGHT_BUTTON_DOWN; |
| 130 } | 107 } |
| 131 } | 108 } |
| 132 return flags; | 109 return flags; |
| 133 } | 110 } |
| 134 | 111 |
| 135 //////////////////////////////////////////////////////////////////////////////// | 112 gfx::Point EventLocationFromNative(const ui::NativeEvent& native_event) { |
| 136 // Event, private: | 113 double x = 0, y = 0; |
| 137 | 114 if (gdk_event_get_coords(native_event, &x, &y)) |
| 138 void Event::Init() { | 115 return gfx::Point(static_cast<int>(x), static_cast<int>(y)); |
| 139 native_event_ = NULL; | 116 return gfx::Point(); |
| 140 native_event_2_ = NULL; | |
| 141 } | 117 } |
| 142 | 118 |
| 143 void Event::InitWithNativeEvent(NativeEvent native_event) { | 119 KeyboardCode KeyboardCodeFromNative(const NativeEvent& native_event) { |
| 144 native_event_ = native_event; | 120 DCHECK(native_event->type == GDK_KEY_PRESS || |
| 145 // TODO(beng): remove once we rid views of Gtk/Gdk. | 121 native_event->type == GDK_KEY_RELEASE); |
| 146 native_event_2_ = NULL; | 122 return KeyboardCodeFromGdkEventKey(&native_event->key); |
| 147 } | 123 } |
| 148 | 124 |
| 149 //////////////////////////////////////////////////////////////////////////////// | |
| 150 // LocatedEvent, protected: | |
| 151 | 125 |
| 152 LocatedEvent::LocatedEvent(NativeEvent native_event) | 126 bool IsMouseEvent(const ui::NativeEvent& native_event) { |
| 153 : Event(native_event, EventTypeFromNative(native_event), | 127 return native_event->type == GDK_MOTION_NOTIFY || |
| 154 GetFlagsFromGdkEvent(native_event)), | 128 native_event->type == GDK_BUTTON_PRESS || |
| 155 location_(GetMouseEventLocation(native_event)) { | 129 native_event->type == GDK_2BUTTON_PRESS || |
| 130 native_event->type == GDK_3BUTTON_PRESS || |
| 131 native_event->type == GDK_BUTTON_RELEASE; |
| 156 } | 132 } |
| 157 | 133 |
| 158 //////////////////////////////////////////////////////////////////////////////// | 134 int GetMouseWheelOffset(const ui::NativeEvent& native_event) { |
| 159 // MouseEvent, public: | 135 DCHECK(native_event->type == GDK_SCROLL); |
| 160 | 136 int offset = (native_event->scroll.direction == GDK_SCROLL_UP || |
| 161 MouseEvent::MouseEvent(NativeEvent native_event) | 137 native_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; |
| 162 : LocatedEvent(native_event) { | 138 return offset; |
| 163 } | 139 } |
| 164 | 140 |
| 165 //////////////////////////////////////////////////////////////////////////////// | 141 } // namespace ui |
| 166 // KeyEvent, public: | |
| 167 | |
| 168 KeyEvent::KeyEvent(NativeEvent native_event) | |
| 169 : Event(native_event, EventTypeFromNative(native_event), | |
| 170 GetFlagsFromGdkEvent(native_event)), | |
| 171 key_code_(ui::KeyboardCodeFromGdkEventKey( | |
| 172 GetGdkEventKeyFromNative(native_event))), | |
| 173 character_(0), | |
| 174 unmodified_character_(0) { | |
| 175 } | |
| 176 | |
| 177 //////////////////////////////////////////////////////////////////////////////// | |
| 178 // MouseWheelEvent, public: | |
| 179 | |
| 180 MouseWheelEvent::MouseWheelEvent(NativeEvent native_event) | |
| 181 : MouseEvent(native_event), | |
| 182 offset_(GetMouseWheelOffset(native_event)) { | |
| 183 } | |
| 184 | |
| 185 } // namespace views | |
| OLD | NEW |