OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "ui/views/events/event.h" | |
6 | |
7 #include <gdk/gdk.h> | |
8 | |
9 #include "base/logging.h" | |
10 #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" | |
11 #include "ui/gfx/point.h" | |
12 | |
13 namespace { | |
14 | |
15 unsigned int GetGdkStateFromNative(GdkEvent* gdk_event) { | |
16 switch (gdk_event->type) { | |
17 case GDK_KEY_PRESS: | |
18 case GDK_KEY_RELEASE: | |
19 return gdk_event->key.state; | |
20 case GDK_BUTTON_PRESS: | |
21 case GDK_2BUTTON_PRESS: | |
22 case GDK_3BUTTON_PRESS: | |
23 case GDK_BUTTON_RELEASE: | |
24 return gdk_event->button.state; | |
25 case GDK_SCROLL: | |
26 return gdk_event->scroll.state; | |
27 case GDK_MOTION_NOTIFY: | |
28 return gdk_event->motion.state; | |
29 case GDK_ENTER_NOTIFY: | |
30 case GDK_LEAVE_NOTIFY: | |
31 return gdk_event->crossing.state; | |
32 default: | |
33 NOTREACHED(); | |
34 break; | |
35 } | |
36 return 0; | |
37 } | |
38 | |
39 int GetFlagsFromGdkState(unsigned int state) { | |
40 int flags = 0; | |
41 flags |= (state & GDK_LOCK_MASK) ? ui::EF_CAPS_LOCK_DOWN : 0; | |
42 flags |= (state & GDK_CONTROL_MASK) ? ui::EF_CONTROL_DOWN : 0; | |
43 flags |= (state & GDK_SHIFT_MASK) ? ui::EF_SHIFT_DOWN : 0; | |
44 flags |= (state & GDK_MOD1_MASK) ? ui::EF_ALT_DOWN : 0; | |
45 flags |= (state & GDK_BUTTON1_MASK) ? ui::EF_LEFT_MOUSE_BUTTON : 0; | |
46 flags |= (state & GDK_BUTTON2_MASK) ? ui::EF_MIDDLE_MOUSE_BUTTON : 0; | |
47 flags |= (state & GDK_BUTTON3_MASK) ? ui::EF_RIGHT_MOUSE_BUTTON : 0; | |
48 return flags; | |
49 } | |
50 | |
51 //////////////////////////////////////////////////////////////////////////////// | |
52 // These functions mirror ui/base/events.h, but GTK is in the midst of removal. | |
53 | |
54 ui::EventType EventTypeFromNative(GdkEvent* gdk_event) { | |
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 } | |
90 | |
91 int EventFlagsFromNative(GdkEvent* gdk_event) { | |
92 int flags = GetFlagsFromGdkState(GetGdkStateFromNative(gdk_event)); | |
93 if (gdk_event->type == GDK_2BUTTON_PRESS) | |
94 flags |= ui::EF_IS_DOUBLE_CLICK; | |
95 if (gdk_event->type == GDK_BUTTON_PRESS || | |
96 gdk_event->type == GDK_2BUTTON_PRESS || | |
97 gdk_event->type == GDK_3BUTTON_PRESS || | |
98 gdk_event->type == GDK_BUTTON_RELEASE) { | |
99 switch (gdk_event->button.button) { | |
100 case 1: | |
101 return flags | ui::EF_LEFT_MOUSE_BUTTON; | |
102 case 2: | |
103 return flags | ui::EF_MIDDLE_MOUSE_BUTTON; | |
104 case 3: | |
105 return flags | ui::EF_RIGHT_MOUSE_BUTTON; | |
106 } | |
107 } | |
108 return flags; | |
109 } | |
110 | |
111 gfx::Point EventLocationFromNative(GdkEvent* gdk_event) { | |
112 double x = 0, y = 0; | |
113 if (gdk_event_get_coords(gdk_event, &x, &y)) | |
114 return gfx::Point(static_cast<int>(x), static_cast<int>(y)); | |
115 return gfx::Point(); | |
116 } | |
117 | |
118 ui::KeyboardCode KeyboardCodeFromNative(GdkEvent* gdk_event) { | |
119 DCHECK(gdk_event->type == GDK_KEY_PRESS || | |
120 gdk_event->type == GDK_KEY_RELEASE); | |
121 return ui::KeyboardCodeFromGdkEventKey(&gdk_event->key); | |
122 } | |
123 | |
124 int GetMouseWheelOffset(GdkEvent* gdk_event) { | |
125 DCHECK(gdk_event->type == GDK_SCROLL); | |
126 int offset = (gdk_event->scroll.direction == GDK_SCROLL_UP || | |
127 gdk_event->scroll.direction == GDK_SCROLL_LEFT) ? 1 : -1; | |
128 return offset; | |
129 } | |
130 | |
131 } // namespace | |
132 | |
133 namespace views { | |
134 | |
135 //////////////////////////////////////////////////////////////////////////////// | |
136 // Event, protected: | |
137 | |
138 Event::Event(GdkEvent* gdk_event, ui::EventType type, int flags) | |
139 : native_event_(NULL), | |
140 gdk_event_(gdk_event), | |
141 type_(type), | |
142 time_stamp_(base::Time::NowFromSystemTime()), | |
143 flags_(flags) { | |
144 } | |
145 | |
146 //////////////////////////////////////////////////////////////////////////////// | |
147 // LocatedEvent, protected: | |
148 | |
149 LocatedEvent::LocatedEvent(GdkEvent* gdk_event) | |
150 : Event(gdk_event, | |
151 EventTypeFromNative(gdk_event), | |
152 EventFlagsFromNative(gdk_event)), | |
153 location_(EventLocationFromNative(gdk_event)) { | |
154 } | |
155 | |
156 //////////////////////////////////////////////////////////////////////////////// | |
157 // KeyEvent, public: | |
158 | |
159 KeyEvent::KeyEvent(GdkEvent* gdk_event) | |
160 : Event(gdk_event, | |
161 EventTypeFromNative(gdk_event), | |
162 EventFlagsFromNative(gdk_event)), | |
163 key_code_(KeyboardCodeFromNative(gdk_event)), | |
164 character_(0), | |
165 unmodified_character_(0) { | |
166 } | |
167 | |
168 //////////////////////////////////////////////////////////////////////////////// | |
169 // MouseEvent, public: | |
170 | |
171 MouseEvent::MouseEvent(GdkEvent* gdk_event) | |
172 : LocatedEvent(gdk_event) { | |
173 } | |
174 | |
175 //////////////////////////////////////////////////////////////////////////////// | |
176 // MouseWheelEvent, public: | |
177 | |
178 MouseWheelEvent::MouseWheelEvent(GdkEvent* gdk_event) | |
179 : MouseEvent(gdk_event), | |
180 offset_(kWheelDelta * GetMouseWheelOffset(gdk_event)) { | |
181 } | |
182 | |
183 } // namespace views | |
OLD | NEW |