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 "views/events/event.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(GdkEvent* gdk_event) { |
17 // Add new event types as necessary. | 16 switch (gdk_event->type) { |
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) { | |
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 gdk_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 gdk_event->button.state; |
83 case GDK_SCROLL: | 25 case GDK_SCROLL: |
84 return native_event->scroll.state; | 26 return gdk_event->scroll.state; |
85 case GDK_MOTION_NOTIFY: | 27 case GDK_MOTION_NOTIFY: |
86 return native_event->motion.state; | 28 return gdk_event->motion.state; |
87 case GDK_ENTER_NOTIFY: | 29 case GDK_ENTER_NOTIFY: |
88 case GDK_LEAVE_NOTIFY: | 30 case GDK_LEAVE_NOTIFY: |
89 return native_event->crossing.state; | 31 return gdk_event->crossing.state; |
90 default: | 32 default: |
91 NOTREACHED(); | 33 NOTREACHED(); |
92 break; | 34 break; |
93 } | 35 } |
94 return 0; | 36 return 0; |
95 } | 37 } |
96 | 38 |
97 int GetFlagsFromGdkState(unsigned int state) { | 39 int GetFlagsFromGdkState(unsigned int state) { |
98 int flags = 0; | 40 int flags = 0; |
99 flags |= (state & GDK_LOCK_MASK) ? ui::EF_CAPS_LOCK_DOWN : 0; | 41 flags |= (state & GDK_LOCK_MASK) ? ui::EF_CAPS_LOCK_DOWN : 0; |
100 flags |= (state & GDK_CONTROL_MASK) ? ui::EF_CONTROL_DOWN : 0; | 42 flags |= (state & GDK_CONTROL_MASK) ? ui::EF_CONTROL_DOWN : 0; |
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 //////////////////////////////////////////////////////////////////////////////// |
| 52 // These functions mirror ui/base/events.h, but GTK is in the midst of removal. |
110 | 53 |
111 //////////////////////////////////////////////////////////////////////////////// | 54 ui::EventType EventTypeFromNative(GdkEvent* gdk_event) { |
112 // Event, public: | 55 // Add new event types as necessary. |
| 56 switch (gdk_event->type) { |
| 57 case GDK_2BUTTON_PRESS: |
| 58 case GDK_3BUTTON_PRESS: |
| 59 case GDK_BUTTON_PRESS: |
| 60 return ui::ET_MOUSE_PRESSED; |
| 61 case GDK_BUTTON_RELEASE: |
| 62 return ui::ET_MOUSE_RELEASED; |
| 63 case GDK_DRAG_MOTION: |
| 64 return ui::ET_MOUSE_DRAGGED; |
| 65 case GDK_ENTER_NOTIFY: |
| 66 return ui::ET_MOUSE_ENTERED; |
| 67 case GDK_KEY_PRESS: |
| 68 return ui::ET_KEY_PRESSED; |
| 69 case GDK_KEY_RELEASE: |
| 70 return ui::ET_KEY_RELEASED; |
| 71 case GDK_LEAVE_NOTIFY: |
| 72 return ui::ET_MOUSE_EXITED; |
| 73 case GDK_MOTION_NOTIFY: |
| 74 if (gdk_event->motion.state & GDK_BUTTON1_MASK || |
| 75 gdk_event->motion.state & GDK_BUTTON2_MASK || |
| 76 gdk_event->motion.state & GDK_BUTTON3_MASK || |
| 77 gdk_event->motion.state & GDK_BUTTON4_MASK || |
| 78 gdk_event->motion.state & GDK_BUTTON5_MASK) { |
| 79 return ui::ET_MOUSE_DRAGGED; |
| 80 } |
| 81 return ui::ET_MOUSE_MOVED; |
| 82 case GDK_SCROLL: |
| 83 return ui::ET_MOUSEWHEEL; |
| 84 default: |
| 85 NOTREACHED(); |
| 86 break; |
| 87 } |
| 88 return ui::ET_UNKNOWN; |
| 89 } |
113 | 90 |
114 // static | 91 int EventFlagsFromNative(GdkEvent* gdk_event) { |
115 int Event::GetFlagsFromGdkEvent(NativeEvent native_event) { | 92 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(gdk_event)); |
116 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(native_event)); | 93 if (gdk_event->type == GDK_2BUTTON_PRESS) |
117 if (native_event->type == GDK_2BUTTON_PRESS) | |
118 flags |= ui::EF_IS_DOUBLE_CLICK; | 94 flags |= ui::EF_IS_DOUBLE_CLICK; |
119 if (native_event->type == GDK_BUTTON_PRESS || | 95 if (gdk_event->type == GDK_BUTTON_PRESS || |
120 native_event->type == GDK_2BUTTON_PRESS || | 96 gdk_event->type == GDK_2BUTTON_PRESS || |
121 native_event->type == GDK_3BUTTON_PRESS || | 97 gdk_event->type == GDK_3BUTTON_PRESS || |
122 native_event->type == GDK_BUTTON_RELEASE) { | 98 gdk_event->type == GDK_BUTTON_RELEASE) { |
123 switch (native_event->button.button) { | 99 switch (gdk_event->button.button) { |
124 case 1: | 100 case 1: |
125 return flags | ui::EF_LEFT_BUTTON_DOWN; | 101 return flags | ui::EF_LEFT_BUTTON_DOWN; |
126 case 2: | 102 case 2: |
127 return flags | ui::EF_MIDDLE_BUTTON_DOWN; | 103 return flags | ui::EF_MIDDLE_BUTTON_DOWN; |
128 case 3: | 104 case 3: |
129 return flags | ui::EF_RIGHT_BUTTON_DOWN; | 105 return flags | ui::EF_RIGHT_BUTTON_DOWN; |
130 } | 106 } |
131 } | 107 } |
132 return flags; | 108 return flags; |
133 } | 109 } |
134 | 110 |
135 //////////////////////////////////////////////////////////////////////////////// | 111 gfx::Point EventLocationFromNative(GdkEvent* gdk_event) { |
136 // Event, private: | 112 double x = 0, y = 0; |
137 | 113 if (gdk_event_get_coords(gdk_event, &x, &y)) |
138 void Event::Init() { | 114 return gfx::Point(static_cast<int>(x), static_cast<int>(y)); |
139 native_event_ = NULL; | 115 return gfx::Point(); |
140 native_event_2_ = NULL; | |
141 } | 116 } |
142 | 117 |
143 void Event::InitWithNativeEvent(NativeEvent native_event) { | 118 ui::KeyboardCode KeyboardCodeFromNative(GdkEvent* gdk_event) { |
144 native_event_ = native_event; | 119 DCHECK(gdk_event->type == GDK_KEY_PRESS || |
145 // TODO(beng): remove once we rid views of Gtk/Gdk. | 120 gdk_event->type == GDK_KEY_RELEASE); |
146 native_event_2_ = NULL; | 121 return ui::KeyboardCodeFromGdkEventKey(&gdk_event->key); |
| 122 } |
| 123 |
| 124 |
| 125 bool IsMouseEvent(GdkEvent* gdk_event) { |
| 126 return gdk_event->type == GDK_MOTION_NOTIFY || |
| 127 gdk_event->type == GDK_BUTTON_PRESS || |
| 128 gdk_event->type == GDK_2BUTTON_PRESS || |
| 129 gdk_event->type == GDK_3BUTTON_PRESS || |
| 130 gdk_event->type == GDK_BUTTON_RELEASE; |
| 131 } |
| 132 |
| 133 int GetMouseWheelOffset(GdkEvent* gdk_event) { |
| 134 DCHECK(gdk_event->type == GDK_SCROLL); |
| 135 int offset = (gdk_event->scroll.direction == GDK_SCROLL_UP || |
| 136 gdk_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; |
| 137 return offset; |
| 138 } |
| 139 |
| 140 } // namespace |
| 141 |
| 142 namespace views { |
| 143 |
| 144 //////////////////////////////////////////////////////////////////////////////// |
| 145 // Event, protected: |
| 146 |
| 147 Event::Event(GdkEvent* gdk_event, ui::EventType type, int flags) |
| 148 : native_event_(NULL), |
| 149 gdk_event_(gdk_event), |
| 150 type_(type), |
| 151 time_stamp_(base::Time::NowFromSystemTime()), |
| 152 flags_(flags) { |
147 } | 153 } |
148 | 154 |
149 //////////////////////////////////////////////////////////////////////////////// | 155 //////////////////////////////////////////////////////////////////////////////// |
150 // LocatedEvent, protected: | 156 // LocatedEvent, protected: |
151 | 157 |
152 LocatedEvent::LocatedEvent(NativeEvent native_event) | 158 LocatedEvent::LocatedEvent(GdkEvent* gdk_event) |
153 : Event(native_event, EventTypeFromNative(native_event), | 159 : Event(gdk_event, |
154 GetFlagsFromGdkEvent(native_event)), | 160 EventTypeFromNative(gdk_event), |
155 location_(GetMouseEventLocation(native_event)) { | 161 EventFlagsFromNative(gdk_event)), |
| 162 location_(EventLocationFromNative(gdk_event)) { |
| 163 } |
| 164 |
| 165 //////////////////////////////////////////////////////////////////////////////// |
| 166 // KeyEvent, public: |
| 167 |
| 168 KeyEvent::KeyEvent(GdkEvent* gdk_event) |
| 169 : Event(gdk_event, |
| 170 EventTypeFromNative(gdk_event), |
| 171 EventFlagsFromNative(gdk_event)), |
| 172 key_code_(KeyboardCodeFromNative(gdk_event)), |
| 173 character_(0), |
| 174 unmodified_character_(0) { |
156 } | 175 } |
157 | 176 |
158 //////////////////////////////////////////////////////////////////////////////// | 177 //////////////////////////////////////////////////////////////////////////////// |
159 // MouseEvent, public: | 178 // MouseEvent, public: |
160 | 179 |
161 MouseEvent::MouseEvent(NativeEvent native_event) | 180 MouseEvent::MouseEvent(GdkEvent* gdk_event) |
162 : LocatedEvent(native_event) { | 181 : LocatedEvent(gdk_event) { |
163 } | |
164 | |
165 //////////////////////////////////////////////////////////////////////////////// | |
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 } | 182 } |
176 | 183 |
177 //////////////////////////////////////////////////////////////////////////////// | 184 //////////////////////////////////////////////////////////////////////////////// |
178 // MouseWheelEvent, public: | 185 // MouseWheelEvent, public: |
179 | 186 |
180 MouseWheelEvent::MouseWheelEvent(NativeEvent native_event) | 187 MouseWheelEvent::MouseWheelEvent(GdkEvent* gdk_event) |
181 : MouseEvent(native_event), | 188 : MouseEvent(gdk_event), |
182 offset_(GetMouseWheelOffset(native_event)) { | 189 offset_(kWheelDelta * GetMouseWheelOffset(gdk_event)) { |
183 } | 190 } |
184 | 191 |
185 } // namespace views | 192 } // namespace views |
OLD | NEW |