OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // X macro fail. | 8 // X macro fail. |
9 #if defined(RootWindow) | 9 #if defined(RootWindow) |
10 #undef RootWindow | 10 #undef RootWindow |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 class UIControlsX11 : public UIControlsAura { | 80 class UIControlsX11 : public UIControlsAura { |
81 public: | 81 public: |
82 UIControlsX11(aura::RootWindow* root_window) : root_window_(root_window) { | 82 UIControlsX11(aura::RootWindow* root_window) : root_window_(root_window) { |
83 } | 83 } |
84 | 84 |
85 virtual bool SendKeyPress(gfx::NativeWindow window, | 85 virtual bool SendKeyPress(gfx::NativeWindow window, |
86 ui::KeyboardCode key, | 86 ui::KeyboardCode key, |
87 bool control, | 87 bool control, |
88 bool shift, | 88 bool shift, |
89 bool alt, | 89 bool alt, |
90 bool command) { | 90 bool command) OVERRIDE { |
91 DCHECK(!command); // No command key on Aura | 91 DCHECK(!command); // No command key on Aura |
92 return SendKeyPressNotifyWhenDone( | 92 return SendKeyPressNotifyWhenDone( |
93 window, key, control, shift, alt, command, base::Closure()); | 93 window, key, control, shift, alt, command, base::Closure()); |
94 } | 94 } |
95 virtual bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, | 95 virtual bool SendKeyPressNotifyWhenDone( |
96 ui::KeyboardCode key, | 96 gfx::NativeWindow window, |
97 bool control, | 97 ui::KeyboardCode key, |
98 bool shift, | 98 bool control, |
99 bool alt, | 99 bool shift, |
100 bool command, | 100 bool alt, |
101 const base::Closure& closure) { | 101 bool command, |
| 102 const base::Closure& closure) OVERRIDE { |
102 DCHECK(!command); // No command key on Aura | 103 DCHECK(!command); // No command key on Aura |
103 XEvent xevent = {0}; | 104 XEvent xevent = {0}; |
104 xevent.xkey.type = KeyPress; | 105 xevent.xkey.type = KeyPress; |
105 if (control) | 106 if (control) |
106 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); | 107 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); |
107 if (shift) | 108 if (shift) |
108 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); | 109 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); |
109 if (alt) | 110 if (alt) |
110 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); | 111 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); |
111 xevent.xkey.keycode = | 112 xevent.xkey.keycode = |
112 XKeysymToKeycode(base::MessagePumpAuraX11::GetDefaultXDisplay(), | 113 XKeysymToKeycode(base::MessagePumpAuraX11::GetDefaultXDisplay(), |
113 ui::XKeysymForWindowsKeyCode(key, shift)); | 114 ui::XKeysymForWindowsKeyCode(key, shift)); |
114 root_window_->PostNativeEvent(&xevent); | 115 root_window_->PostNativeEvent(&xevent); |
115 | 116 |
116 // Send key release events. | 117 // Send key release events. |
117 xevent.xkey.type = KeyRelease; | 118 xevent.xkey.type = KeyRelease; |
118 root_window_->PostNativeEvent(&xevent); | 119 root_window_->PostNativeEvent(&xevent); |
119 if (alt) | 120 if (alt) |
120 UnmaskAndSetKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L); | 121 UnmaskAndSetKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L); |
121 if (shift) | 122 if (shift) |
122 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); | 123 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); |
123 if (control) | 124 if (control) |
124 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); | 125 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); |
125 DCHECK(!xevent.xkey.state); | 126 DCHECK(!xevent.xkey.state); |
126 RunClosureAfterAllPendingUIEvents(closure); | 127 RunClosureAfterAllPendingUIEvents(closure); |
127 return true; | 128 return true; |
128 } | 129 } |
129 | 130 |
130 // Simulate a mouse move. (x,y) are absolute screen coordinates. | 131 // Simulate a mouse move. (x,y) are absolute screen coordinates. |
131 virtual bool SendMouseMove(long x, long y) { | 132 virtual bool SendMouseMove(long x, long y) OVERRIDE { |
132 return SendMouseMoveNotifyWhenDone(x, y, base::Closure()); | 133 return SendMouseMoveNotifyWhenDone(x, y, base::Closure()); |
133 } | 134 } |
134 virtual bool SendMouseMoveNotifyWhenDone(long x, | 135 virtual bool SendMouseMoveNotifyWhenDone( |
135 long y, | 136 long x, |
136 const base::Closure& closure) { | 137 long y, |
| 138 const base::Closure& closure) OVERRIDE { |
137 XEvent xevent = {0}; | 139 XEvent xevent = {0}; |
138 XMotionEvent* xmotion = &xevent.xmotion; | 140 XMotionEvent* xmotion = &xevent.xmotion; |
139 xmotion->type = MotionNotify; | 141 xmotion->type = MotionNotify; |
140 gfx::Point point = ui::ConvertPointToPixel( | 142 gfx::Point point = ui::ConvertPointToPixel( |
141 root_window_->layer(), | 143 root_window_->layer(), |
142 gfx::Point(static_cast<int>(x), static_cast<int>(y))); | 144 gfx::Point(static_cast<int>(x), static_cast<int>(y))); |
143 g_current_x = xmotion->x = point.x(); | 145 g_current_x = xmotion->x = point.x(); |
144 g_current_y = xmotion->y = point.y(); | 146 g_current_y = xmotion->y = point.y(); |
145 xmotion->state = button_down_mask; | 147 xmotion->state = button_down_mask; |
146 xmotion->same_screen = True; | 148 xmotion->same_screen = True; |
147 // RootWindow will take care of other necessary fields. | 149 // RootWindow will take care of other necessary fields. |
148 root_window_->PostNativeEvent(&xevent); | 150 root_window_->PostNativeEvent(&xevent); |
149 RunClosureAfterAllPendingUIEvents(closure); | 151 RunClosureAfterAllPendingUIEvents(closure); |
150 return true; | 152 return true; |
151 } | 153 } |
152 virtual bool SendMouseEvents(MouseButton type, int state) { | 154 virtual bool SendMouseEvents(MouseButton type, int state) OVERRIDE { |
153 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); | 155 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); |
154 } | 156 } |
155 virtual bool SendMouseEventsNotifyWhenDone(MouseButton type, | 157 virtual bool SendMouseEventsNotifyWhenDone( |
156 int state, | 158 MouseButton type, |
157 const base::Closure& closure) { | 159 int state, |
| 160 const base::Closure& closure) OVERRIDE { |
158 XEvent xevent = {0}; | 161 XEvent xevent = {0}; |
159 XButtonEvent* xbutton = &xevent.xbutton; | 162 XButtonEvent* xbutton = &xevent.xbutton; |
160 DCHECK_NE(g_current_x, -1000); | 163 DCHECK_NE(g_current_x, -1000); |
161 DCHECK_NE(g_current_y, -1000); | 164 DCHECK_NE(g_current_y, -1000); |
162 xbutton->x = g_current_x; | 165 xbutton->x = g_current_x; |
163 xbutton->y = g_current_y; | 166 xbutton->y = g_current_y; |
164 xbutton->same_screen = True; | 167 xbutton->same_screen = True; |
165 switch (type) { | 168 switch (type) { |
166 case LEFT: | 169 case LEFT: |
167 xbutton->button = Button1; | 170 xbutton->button = Button1; |
(...skipping 15 matching lines...) Expand all Loading... |
183 button_down_mask |= xbutton->state; | 186 button_down_mask |= xbutton->state; |
184 } | 187 } |
185 if (state & UP) { | 188 if (state & UP) { |
186 xevent.xbutton.type = ButtonRelease; | 189 xevent.xbutton.type = ButtonRelease; |
187 root_window_->PostNativeEvent(&xevent); | 190 root_window_->PostNativeEvent(&xevent); |
188 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; | 191 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; |
189 } | 192 } |
190 RunClosureAfterAllPendingUIEvents(closure); | 193 RunClosureAfterAllPendingUIEvents(closure); |
191 return true; | 194 return true; |
192 } | 195 } |
193 virtual bool SendMouseClick(MouseButton type) { | 196 virtual bool SendMouseClick(MouseButton type) OVERRIDE { |
194 return SendMouseEvents(type, UP | DOWN); | 197 return SendMouseEvents(type, UP | DOWN); |
195 } | 198 } |
196 virtual void RunClosureAfterAllPendingUIEvents(const base::Closure& closure) { | 199 virtual void RunClosureAfterAllPendingUIEvents( |
| 200 const base::Closure& closure) OVERRIDE { |
197 if (closure.is_null()) | 201 if (closure.is_null()) |
198 return; | 202 return; |
199 static XEvent* marker_event = NULL; | 203 static XEvent* marker_event = NULL; |
200 if (!marker_event) { | 204 if (!marker_event) { |
201 marker_event = new XEvent(); | 205 marker_event = new XEvent(); |
202 marker_event->xclient.type = ClientMessage; | 206 marker_event->xclient.type = ClientMessage; |
203 marker_event->xclient.display = NULL; | 207 marker_event->xclient.display = NULL; |
204 marker_event->xclient.window = None; | 208 marker_event->xclient.window = None; |
205 marker_event->xclient.format = 8; | 209 marker_event->xclient.format = 8; |
206 } | 210 } |
(...skipping 27 matching lines...) Expand all Loading... |
234 DISALLOW_COPY_AND_ASSIGN(UIControlsX11); | 238 DISALLOW_COPY_AND_ASSIGN(UIControlsX11); |
235 }; | 239 }; |
236 | 240 |
237 } // namespace | 241 } // namespace |
238 | 242 |
239 UIControlsAura* CreateUIControlsAura(aura::RootWindow* root_window) { | 243 UIControlsAura* CreateUIControlsAura(aura::RootWindow* root_window) { |
240 return new UIControlsX11(root_window); | 244 return new UIControlsX11(root_window); |
241 } | 245 } |
242 | 246 |
243 } // namespace ui_controls | 247 } // namespace ui_controls |
OLD | NEW |