Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: views/events/event_gtk.cc

Issue 7942004: Consolidate/cleanup event cracking code; single out GdkEvents. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge removal of compact nav. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « views/events/event_aura.cc ('k') | views/events/event_utils_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« no previous file with comments | « views/events/event_aura.cc ('k') | views/events/event_utils_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698