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/focus/accelerator_handler.h" | 5 #include "views/focus/accelerator_handler.h" |
6 | 6 |
7 #include <bitset> | 7 #include <bitset> |
8 #include <gtk/gtk.h> | 8 #include <gtk/gtk.h> |
9 #if defined(HAVE_XINPUT2) | |
10 #include <X11/extensions/XInput2.h> | 9 #include <X11/extensions/XInput2.h> |
11 #else | |
12 #include <X11/Xlib.h> | |
13 #endif | |
14 | 10 |
15 #include "views/accelerator.h" | 11 #include "views/accelerator.h" |
16 #include "views/events/event.h" | 12 #include "views/events/event.h" |
17 #include "views/focus/focus_manager.h" | 13 #include "views/focus/focus_manager.h" |
18 #include "views/ime/input_method.h" | 14 #include "views/ime/input_method.h" |
19 #include "views/touchui/touch_factory.h" | 15 #include "views/touchui/touch_factory.h" |
20 #include "views/view.h" | 16 #include "views/view.h" |
21 #include "views/widget/native_widget.h" | 17 #include "views/widget/native_widget.h" |
22 | 18 |
23 namespace views { | 19 namespace views { |
(...skipping 12 matching lines...) Expand all Loading... |
36 | 32 |
37 if (!widget) { | 33 if (!widget) { |
38 DLOG(WARNING) << "no NativeWidgetGtk found for that GtkWidget"; | 34 DLOG(WARNING) << "no NativeWidgetGtk found for that GtkWidget"; |
39 return NULL; | 35 return NULL; |
40 } | 36 } |
41 return widget->GetWidget(); | 37 return widget->GetWidget(); |
42 } | 38 } |
43 | 39 |
44 } // namespace | 40 } // namespace |
45 | 41 |
46 #if defined(HAVE_XINPUT2) | |
47 bool DispatchX2Event(Widget* widget, XEvent* xev) { | 42 bool DispatchX2Event(Widget* widget, XEvent* xev) { |
48 XGenericEventCookie* cookie = &xev->xcookie; | 43 XGenericEventCookie* cookie = &xev->xcookie; |
49 switch (cookie->evtype) { | 44 switch (cookie->evtype) { |
50 case XI_KeyPress: | 45 case XI_KeyPress: |
51 case XI_KeyRelease: { | 46 case XI_KeyRelease: { |
52 // TODO(sad): We don't capture XInput2 events from keyboard yet. | 47 // TODO(sad): We don't capture XInput2 events from keyboard yet. |
53 break; | 48 break; |
54 } | 49 } |
55 case XI_ButtonPress: | 50 case XI_ButtonPress: |
56 case XI_ButtonRelease: | 51 case XI_ButtonRelease: |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 mouseev.IsOnlyRightMouseButton()); | 95 mouseev.IsOnlyRightMouseButton()); |
101 TouchFactory::GetInstance()->SetCursorVisible(true, start_timer); | 96 TouchFactory::GetInstance()->SetCursorVisible(true, start_timer); |
102 | 97 |
103 return widget->OnMouseEvent(mouseev); | 98 return widget->OnMouseEvent(mouseev); |
104 } | 99 } |
105 } | 100 } |
106 } | 101 } |
107 return false; | 102 return false; |
108 } | 103 } |
109 | 104 |
110 #endif // HAVE_XINPUT2 | |
111 | |
112 bool DispatchXEvent(XEvent* xev) { | 105 bool DispatchXEvent(XEvent* xev) { |
113 GdkDisplay* gdisp = gdk_display_get_default(); | 106 GdkDisplay* gdisp = gdk_display_get_default(); |
114 XID xwindow = xev->xany.window; | 107 XID xwindow = xev->xany.window; |
115 | 108 |
116 #if defined(HAVE_XINPUT2) | |
117 if (xev->type == GenericEvent) { | 109 if (xev->type == GenericEvent) { |
118 if (!TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) | 110 if (!TouchFactory::GetInstance()->ShouldProcessXI2Event(xev)) |
119 return true; // Consume the event. | 111 return true; // Consume the event. |
120 | 112 |
121 XGenericEventCookie* cookie = &xev->xcookie; | 113 XGenericEventCookie* cookie = &xev->xcookie; |
122 if (cookie->evtype == XI_HierarchyChanged) { | 114 if (cookie->evtype == XI_HierarchyChanged) { |
123 TouchFactory::GetInstance()->UpdateDeviceList(cookie->display); | 115 TouchFactory::GetInstance()->UpdateDeviceList(cookie->display); |
124 return true; | 116 return true; |
125 } | 117 } |
126 | 118 |
127 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(cookie->data); | 119 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(cookie->data); |
128 xwindow = xiev->event; | 120 xwindow = xiev->event; |
129 } | 121 } |
130 #endif | |
131 | 122 |
132 GdkWindow* gwind = gdk_window_lookup_for_display(gdisp, xwindow); | 123 GdkWindow* gwind = gdk_window_lookup_for_display(gdisp, xwindow); |
133 Widget* widget = FindWidgetForGdkWindow(gwind); | 124 Widget* widget = FindWidgetForGdkWindow(gwind); |
134 if (widget) { | 125 if (widget) { |
135 Event::FromNativeEvent2 from_native; | 126 Event::FromNativeEvent2 from_native; |
136 switch (xev->type) { | 127 switch (xev->type) { |
137 case KeyPress: | 128 case KeyPress: |
138 case KeyRelease: { | 129 case KeyRelease: { |
139 KeyEvent keyev(xev, from_native); | 130 KeyEvent keyev(xev, from_native); |
140 InputMethod* ime = widget->GetInputMethod(); | 131 InputMethod* ime = widget->GetInputMethod(); |
(...skipping 11 matching lines...) Expand all Loading... |
152 // Scrolling the wheel triggers button press/release events. | 143 // Scrolling the wheel triggers button press/release events. |
153 MouseWheelEvent wheelev(xev, from_native); | 144 MouseWheelEvent wheelev(xev, from_native); |
154 return widget->OnMouseEvent(wheelev); | 145 return widget->OnMouseEvent(wheelev); |
155 } | 146 } |
156 // fallthrough | 147 // fallthrough |
157 case MotionNotify: { | 148 case MotionNotify: { |
158 MouseEvent mouseev(xev, from_native); | 149 MouseEvent mouseev(xev, from_native); |
159 return widget->OnMouseEvent(mouseev); | 150 return widget->OnMouseEvent(mouseev); |
160 } | 151 } |
161 | 152 |
162 #if defined(HAVE_XINPUT2) | |
163 case GenericEvent: { | 153 case GenericEvent: { |
164 return DispatchX2Event(widget, xev); | 154 return DispatchX2Event(widget, xev); |
165 } | 155 } |
166 #endif | |
167 } | 156 } |
168 } | 157 } |
169 | 158 |
170 return false; | 159 return false; |
171 } | 160 } |
172 | 161 |
173 #if defined(HAVE_XINPUT2) | |
174 void SetTouchDeviceList(std::vector<unsigned int>& devices) { | 162 void SetTouchDeviceList(std::vector<unsigned int>& devices) { |
175 TouchFactory::GetInstance()->SetTouchDeviceList(devices); | 163 TouchFactory::GetInstance()->SetTouchDeviceList(devices); |
176 } | 164 } |
177 #endif | |
178 | 165 |
179 AcceleratorHandler::AcceleratorHandler() {} | 166 AcceleratorHandler::AcceleratorHandler() {} |
180 | 167 |
181 bool AcceleratorHandler::Dispatch(GdkEvent* event) { | 168 bool AcceleratorHandler::Dispatch(GdkEvent* event) { |
182 gtk_main_do_event(event); | 169 gtk_main_do_event(event); |
183 return true; | 170 return true; |
184 } | 171 } |
185 | 172 |
186 base::MessagePumpGlibXDispatcher::DispatchStatus | 173 base::MessagePumpGlibXDispatcher::DispatchStatus |
187 AcceleratorHandler::DispatchX(XEvent* xev) { | 174 AcceleratorHandler::DispatchX(XEvent* xev) { |
188 return DispatchXEvent(xev) ? | 175 return DispatchXEvent(xev) ? |
189 base::MessagePumpGlibXDispatcher::EVENT_PROCESSED : | 176 base::MessagePumpGlibXDispatcher::EVENT_PROCESSED : |
190 base::MessagePumpGlibXDispatcher::EVENT_IGNORED; | 177 base::MessagePumpGlibXDispatcher::EVENT_IGNORED; |
191 } | 178 } |
192 | 179 |
193 } // namespace views | 180 } // namespace views |
OLD | NEW |