OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <X11/keysym.h> | 5 #include <X11/keysym.h> |
6 #include <X11/Xlib.h> | 6 #include <X11/Xlib.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "ui/aura/client/screen_position_client.h" | 10 #include "ui/aura/client/screen_position_client.h" |
11 #include "ui/aura/env.h" | 11 #include "ui/aura/env.h" |
12 #include "ui/aura/test/aura_test_utils.h" | 12 #include "ui/aura/test/aura_test_utils.h" |
13 #include "ui/aura/test/ui_controls_factory_aura.h" | 13 #include "ui/aura/test/ui_controls_factory_aura.h" |
| 14 #include "ui/aura/test/x11_event_sender.h" |
14 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
15 #include "ui/aura/window_tree_host.h" | 16 #include "ui/aura/window_tree_host.h" |
16 #include "ui/base/test/ui_controls_aura.h" | 17 #include "ui/base/test/ui_controls_aura.h" |
17 #include "ui/base/x/x11_util.h" | 18 #include "ui/base/x/x11_util.h" |
18 #include "ui/compositor/dip_util.h" | 19 #include "ui/compositor/dip_util.h" |
19 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 20 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
20 #include "ui/events/test/platform_event_waiter.h" | 21 #include "ui/events/test/platform_event_waiter.h" |
21 | 22 |
22 namespace aura { | 23 namespace aura { |
23 namespace test { | 24 namespace test { |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); | 73 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); |
73 if (shift) | 74 if (shift) |
74 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); | 75 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); |
75 if (alt) | 76 if (alt) |
76 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); | 77 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); |
77 if (command) | 78 if (command) |
78 SetKeycodeAndSendThenMask(&xevent, XK_Meta_L, Mod4Mask); | 79 SetKeycodeAndSendThenMask(&xevent, XK_Meta_L, Mod4Mask); |
79 xevent.xkey.keycode = | 80 xevent.xkey.keycode = |
80 XKeysymToKeycode(gfx::GetXDisplay(), | 81 XKeysymToKeycode(gfx::GetXDisplay(), |
81 ui::XKeysymForWindowsKeyCode(key, shift)); | 82 ui::XKeysymForWindowsKeyCode(key, shift)); |
82 host_->PostNativeEvent(&xevent); | 83 PostEventToWindowTreeHost(xevent, host_); |
83 | 84 |
84 // Send key release events. | 85 // Send key release events. |
85 xevent.xkey.type = KeyRelease; | 86 xevent.xkey.type = KeyRelease; |
86 host_->PostNativeEvent(&xevent); | 87 PostEventToWindowTreeHost(xevent, host_); |
87 if (alt) | 88 if (alt) |
88 UnmaskAndSetKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L); | 89 UnmaskAndSetKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L); |
89 if (shift) | 90 if (shift) |
90 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); | 91 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); |
91 if (control) | 92 if (control) |
92 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); | 93 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); |
93 if (command) | 94 if (command) |
94 UnmaskAndSetKeycodeThenSend(&xevent, Mod4Mask, XK_Meta_L); | 95 UnmaskAndSetKeycodeThenSend(&xevent, Mod4Mask, XK_Meta_L); |
95 DCHECK(!xevent.xkey.state); | 96 DCHECK(!xevent.xkey.state); |
96 RunClosureAfterAllPendingUIEvents(closure); | 97 RunClosureAfterAllPendingUIEvents(closure); |
(...skipping 23 matching lines...) Expand all Loading... |
120 host_->window()->MoveCursorTo(root_location); | 121 host_->window()->MoveCursorTo(root_location); |
121 } else { | 122 } else { |
122 XEvent xevent = {0}; | 123 XEvent xevent = {0}; |
123 XMotionEvent* xmotion = &xevent.xmotion; | 124 XMotionEvent* xmotion = &xevent.xmotion; |
124 xmotion->type = MotionNotify; | 125 xmotion->type = MotionNotify; |
125 xmotion->x = root_location.x(); | 126 xmotion->x = root_location.x(); |
126 xmotion->y = root_location.y(); | 127 xmotion->y = root_location.y(); |
127 xmotion->state = button_down_mask; | 128 xmotion->state = button_down_mask; |
128 xmotion->same_screen = True; | 129 xmotion->same_screen = True; |
129 // WindowTreeHost will take care of other necessary fields. | 130 // WindowTreeHost will take care of other necessary fields. |
130 host_->PostNativeEvent(&xevent); | 131 PostEventToWindowTreeHost(xevent, host_); |
131 } | 132 } |
132 RunClosureAfterAllPendingUIEvents(closure); | 133 RunClosureAfterAllPendingUIEvents(closure); |
133 return true; | 134 return true; |
134 } | 135 } |
135 bool SendMouseEvents(MouseButton type, int state) override { | 136 bool SendMouseEvents(MouseButton type, int state) override { |
136 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); | 137 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); |
137 } | 138 } |
138 bool SendMouseEventsNotifyWhenDone(MouseButton type, | 139 bool SendMouseEventsNotifyWhenDone(MouseButton type, |
139 int state, | 140 int state, |
140 const base::Closure& closure) override { | 141 const base::Closure& closure) override { |
(...skipping 19 matching lines...) Expand all Loading... |
160 xbutton->state = Button2Mask; | 161 xbutton->state = Button2Mask; |
161 break; | 162 break; |
162 case RIGHT: | 163 case RIGHT: |
163 xbutton->button = Button3; | 164 xbutton->button = Button3; |
164 xbutton->state = Button3Mask; | 165 xbutton->state = Button3Mask; |
165 break; | 166 break; |
166 } | 167 } |
167 // WindowEventDispatcher will take care of other necessary fields. | 168 // WindowEventDispatcher will take care of other necessary fields. |
168 if (state & DOWN) { | 169 if (state & DOWN) { |
169 xevent.xbutton.type = ButtonPress; | 170 xevent.xbutton.type = ButtonPress; |
170 host_->PostNativeEvent(&xevent); | 171 PostEventToWindowTreeHost(xevent, host_); |
171 button_down_mask |= xbutton->state; | 172 button_down_mask |= xbutton->state; |
172 } | 173 } |
173 if (state & UP) { | 174 if (state & UP) { |
174 xevent.xbutton.type = ButtonRelease; | 175 xevent.xbutton.type = ButtonRelease; |
175 host_->PostNativeEvent(&xevent); | 176 PostEventToWindowTreeHost(xevent, host_); |
176 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; | 177 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; |
177 } | 178 } |
178 RunClosureAfterAllPendingUIEvents(closure); | 179 RunClosureAfterAllPendingUIEvents(closure); |
179 return true; | 180 return true; |
180 } | 181 } |
181 bool SendMouseClick(MouseButton type) override { | 182 bool SendMouseClick(MouseButton type) override { |
182 return SendMouseEvents(type, UP | DOWN); | 183 return SendMouseEvents(type, UP | DOWN); |
183 } | 184 } |
184 void RunClosureAfterAllPendingUIEvents( | 185 void RunClosureAfterAllPendingUIEvents( |
185 const base::Closure& closure) override { | 186 const base::Closure& closure) override { |
186 if (closure.is_null()) | 187 if (closure.is_null()) |
187 return; | 188 return; |
188 static XEvent* marker_event = NULL; | 189 static XEvent* marker_event = NULL; |
189 if (!marker_event) { | 190 if (!marker_event) { |
190 marker_event = new XEvent(); | 191 marker_event = new XEvent(); |
191 marker_event->xclient.type = ClientMessage; | 192 marker_event->xclient.type = ClientMessage; |
192 marker_event->xclient.display = NULL; | 193 marker_event->xclient.display = NULL; |
193 marker_event->xclient.window = None; | 194 marker_event->xclient.window = None; |
194 marker_event->xclient.format = 8; | 195 marker_event->xclient.format = 8; |
195 } | 196 } |
196 marker_event->xclient.message_type = MarkerEventAtom(); | 197 marker_event->xclient.message_type = MarkerEventAtom(); |
197 host_->PostNativeEvent(marker_event); | 198 PostEventToWindowTreeHost(*marker_event, host_); |
198 ui::PlatformEventWaiter::Create(closure, base::Bind(&Matcher)); | 199 ui::PlatformEventWaiter::Create(closure, base::Bind(&Matcher)); |
199 } | 200 } |
200 private: | 201 private: |
201 void SetKeycodeAndSendThenMask(XEvent* xevent, | 202 void SetKeycodeAndSendThenMask(XEvent* xevent, |
202 KeySym keysym, | 203 KeySym keysym, |
203 unsigned int mask) { | 204 unsigned int mask) { |
204 xevent->xkey.keycode = | 205 xevent->xkey.keycode = |
205 XKeysymToKeycode(gfx::GetXDisplay(), keysym); | 206 XKeysymToKeycode(gfx::GetXDisplay(), keysym); |
206 host_->PostNativeEvent(xevent); | 207 PostEventToWindowTreeHost(*xevent, host_); |
207 xevent->xkey.state |= mask; | 208 xevent->xkey.state |= mask; |
208 } | 209 } |
209 | 210 |
210 void UnmaskAndSetKeycodeThenSend(XEvent* xevent, | 211 void UnmaskAndSetKeycodeThenSend(XEvent* xevent, |
211 unsigned int mask, | 212 unsigned int mask, |
212 KeySym keysym) { | 213 KeySym keysym) { |
213 xevent->xkey.state ^= mask; | 214 xevent->xkey.state ^= mask; |
214 xevent->xkey.keycode = | 215 xevent->xkey.keycode = |
215 XKeysymToKeycode(gfx::GetXDisplay(), keysym); | 216 XKeysymToKeycode(gfx::GetXDisplay(), keysym); |
216 host_->PostNativeEvent(xevent); | 217 PostEventToWindowTreeHost(*xevent, host_); |
217 } | 218 } |
218 | 219 |
219 WindowTreeHost* host_; | 220 WindowTreeHost* host_; |
220 | 221 |
221 DISALLOW_COPY_AND_ASSIGN(UIControlsX11); | 222 DISALLOW_COPY_AND_ASSIGN(UIControlsX11); |
222 }; | 223 }; |
223 | 224 |
224 } // namespace | 225 } // namespace |
225 | 226 |
226 UIControlsAura* CreateUIControlsAura(WindowTreeHost* host) { | 227 UIControlsAura* CreateUIControlsAura(WindowTreeHost* host) { |
227 return new UIControlsX11(host); | 228 return new UIControlsX11(host); |
228 } | 229 } |
229 | 230 |
230 } // namespace test | 231 } // namespace test |
231 } // namespace aura | 232 } // namespace aura |
OLD | NEW |