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" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 class UIControlsX11 : public UIControlsAura { | 48 class UIControlsX11 : public UIControlsAura { |
49 public: | 49 public: |
50 UIControlsX11(WindowTreeHost* host) : host_(host) { | 50 UIControlsX11(WindowTreeHost* host) : host_(host) { |
51 } | 51 } |
52 | 52 |
53 virtual bool SendKeyPress(gfx::NativeWindow window, | 53 virtual bool SendKeyPress(gfx::NativeWindow window, |
54 ui::KeyboardCode key, | 54 ui::KeyboardCode key, |
55 bool control, | 55 bool control, |
56 bool shift, | 56 bool shift, |
57 bool alt, | 57 bool alt, |
58 bool command) OVERRIDE { | 58 bool command) override { |
59 return SendKeyPressNotifyWhenDone( | 59 return SendKeyPressNotifyWhenDone( |
60 window, key, control, shift, alt, command, base::Closure()); | 60 window, key, control, shift, alt, command, base::Closure()); |
61 } | 61 } |
62 virtual bool SendKeyPressNotifyWhenDone( | 62 virtual bool SendKeyPressNotifyWhenDone( |
63 gfx::NativeWindow window, | 63 gfx::NativeWindow window, |
64 ui::KeyboardCode key, | 64 ui::KeyboardCode key, |
65 bool control, | 65 bool control, |
66 bool shift, | 66 bool shift, |
67 bool alt, | 67 bool alt, |
68 bool command, | 68 bool command, |
69 const base::Closure& closure) OVERRIDE { | 69 const base::Closure& closure) override { |
70 XEvent xevent = {0}; | 70 XEvent xevent = {0}; |
71 xevent.xkey.type = KeyPress; | 71 xevent.xkey.type = KeyPress; |
72 if (control) | 72 if (control) |
73 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); | 73 SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask); |
74 if (shift) | 74 if (shift) |
75 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); | 75 SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask); |
76 if (alt) | 76 if (alt) |
77 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); | 77 SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask); |
78 if (command) | 78 if (command) |
79 SetKeycodeAndSendThenMask(&xevent, XK_Meta_L, Mod4Mask); | 79 SetKeycodeAndSendThenMask(&xevent, XK_Meta_L, Mod4Mask); |
(...skipping 11 matching lines...) Expand all Loading... |
91 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); | 91 UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); |
92 if (control) | 92 if (control) |
93 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); | 93 UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L); |
94 if (command) | 94 if (command) |
95 UnmaskAndSetKeycodeThenSend(&xevent, Mod4Mask, XK_Meta_L); | 95 UnmaskAndSetKeycodeThenSend(&xevent, Mod4Mask, XK_Meta_L); |
96 DCHECK(!xevent.xkey.state); | 96 DCHECK(!xevent.xkey.state); |
97 RunClosureAfterAllPendingUIEvents(closure); | 97 RunClosureAfterAllPendingUIEvents(closure); |
98 return true; | 98 return true; |
99 } | 99 } |
100 | 100 |
101 virtual bool SendMouseMove(long screen_x, long screen_y) OVERRIDE { | 101 virtual bool SendMouseMove(long screen_x, long screen_y) override { |
102 return SendMouseMoveNotifyWhenDone(screen_x, screen_y, base::Closure()); | 102 return SendMouseMoveNotifyWhenDone(screen_x, screen_y, base::Closure()); |
103 } | 103 } |
104 virtual bool SendMouseMoveNotifyWhenDone( | 104 virtual bool SendMouseMoveNotifyWhenDone( |
105 long screen_x, | 105 long screen_x, |
106 long screen_y, | 106 long screen_y, |
107 const base::Closure& closure) OVERRIDE { | 107 const base::Closure& closure) override { |
108 gfx::Point root_location(screen_x, screen_y); | 108 gfx::Point root_location(screen_x, screen_y); |
109 aura::client::ScreenPositionClient* screen_position_client = | 109 aura::client::ScreenPositionClient* screen_position_client = |
110 aura::client::GetScreenPositionClient(host_->window()); | 110 aura::client::GetScreenPositionClient(host_->window()); |
111 if (screen_position_client) { | 111 if (screen_position_client) { |
112 screen_position_client->ConvertPointFromScreen(host_->window(), | 112 screen_position_client->ConvertPointFromScreen(host_->window(), |
113 &root_location); | 113 &root_location); |
114 } | 114 } |
115 gfx::Point root_current_location = | 115 gfx::Point root_current_location = |
116 QueryLatestMousePositionRequestInHost(host_); | 116 QueryLatestMousePositionRequestInHost(host_); |
117 host_->ConvertPointFromHost(&root_current_location); | 117 host_->ConvertPointFromHost(&root_current_location); |
118 | 118 |
119 if (root_location != root_current_location && button_down_mask == 0) { | 119 if (root_location != root_current_location && button_down_mask == 0) { |
120 // Move the cursor because EnterNotify/LeaveNotify are generated with the | 120 // Move the cursor because EnterNotify/LeaveNotify are generated with the |
121 // current mouse position as a result of XGrabPointer() | 121 // current mouse position as a result of XGrabPointer() |
122 host_->window()->MoveCursorTo(root_location); | 122 host_->window()->MoveCursorTo(root_location); |
123 } else { | 123 } else { |
124 XEvent xevent = {0}; | 124 XEvent xevent = {0}; |
125 XMotionEvent* xmotion = &xevent.xmotion; | 125 XMotionEvent* xmotion = &xevent.xmotion; |
126 xmotion->type = MotionNotify; | 126 xmotion->type = MotionNotify; |
127 xmotion->x = root_location.x(); | 127 xmotion->x = root_location.x(); |
128 xmotion->y = root_location.y(); | 128 xmotion->y = root_location.y(); |
129 xmotion->state = button_down_mask; | 129 xmotion->state = button_down_mask; |
130 xmotion->same_screen = True; | 130 xmotion->same_screen = True; |
131 // WindowTreeHost will take care of other necessary fields. | 131 // WindowTreeHost will take care of other necessary fields. |
132 host_->PostNativeEvent(&xevent); | 132 host_->PostNativeEvent(&xevent); |
133 } | 133 } |
134 RunClosureAfterAllPendingUIEvents(closure); | 134 RunClosureAfterAllPendingUIEvents(closure); |
135 return true; | 135 return true; |
136 } | 136 } |
137 virtual bool SendMouseEvents(MouseButton type, int state) OVERRIDE { | 137 virtual bool SendMouseEvents(MouseButton type, int state) override { |
138 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); | 138 return SendMouseEventsNotifyWhenDone(type, state, base::Closure()); |
139 } | 139 } |
140 virtual bool SendMouseEventsNotifyWhenDone( | 140 virtual bool SendMouseEventsNotifyWhenDone( |
141 MouseButton type, | 141 MouseButton type, |
142 int state, | 142 int state, |
143 const base::Closure& closure) OVERRIDE { | 143 const base::Closure& closure) override { |
144 XEvent xevent = {0}; | 144 XEvent xevent = {0}; |
145 XButtonEvent* xbutton = &xevent.xbutton; | 145 XButtonEvent* xbutton = &xevent.xbutton; |
146 gfx::Point mouse_loc = aura::Env::GetInstance()->last_mouse_location(); | 146 gfx::Point mouse_loc = aura::Env::GetInstance()->last_mouse_location(); |
147 aura::client::ScreenPositionClient* screen_position_client = | 147 aura::client::ScreenPositionClient* screen_position_client = |
148 aura::client::GetScreenPositionClient(host_->window()); | 148 aura::client::GetScreenPositionClient(host_->window()); |
149 if (screen_position_client) { | 149 if (screen_position_client) { |
150 screen_position_client->ConvertPointFromScreen(host_->window(), | 150 screen_position_client->ConvertPointFromScreen(host_->window(), |
151 &mouse_loc); | 151 &mouse_loc); |
152 } | 152 } |
153 xbutton->x = mouse_loc.x(); | 153 xbutton->x = mouse_loc.x(); |
(...skipping 20 matching lines...) Expand all Loading... |
174 button_down_mask |= xbutton->state; | 174 button_down_mask |= xbutton->state; |
175 } | 175 } |
176 if (state & UP) { | 176 if (state & UP) { |
177 xevent.xbutton.type = ButtonRelease; | 177 xevent.xbutton.type = ButtonRelease; |
178 host_->PostNativeEvent(&xevent); | 178 host_->PostNativeEvent(&xevent); |
179 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; | 179 button_down_mask = (button_down_mask | xbutton->state) ^ xbutton->state; |
180 } | 180 } |
181 RunClosureAfterAllPendingUIEvents(closure); | 181 RunClosureAfterAllPendingUIEvents(closure); |
182 return true; | 182 return true; |
183 } | 183 } |
184 virtual bool SendMouseClick(MouseButton type) OVERRIDE { | 184 virtual bool SendMouseClick(MouseButton type) override { |
185 return SendMouseEvents(type, UP | DOWN); | 185 return SendMouseEvents(type, UP | DOWN); |
186 } | 186 } |
187 virtual void RunClosureAfterAllPendingUIEvents( | 187 virtual void RunClosureAfterAllPendingUIEvents( |
188 const base::Closure& closure) OVERRIDE { | 188 const base::Closure& closure) override { |
189 if (closure.is_null()) | 189 if (closure.is_null()) |
190 return; | 190 return; |
191 static XEvent* marker_event = NULL; | 191 static XEvent* marker_event = NULL; |
192 if (!marker_event) { | 192 if (!marker_event) { |
193 marker_event = new XEvent(); | 193 marker_event = new XEvent(); |
194 marker_event->xclient.type = ClientMessage; | 194 marker_event->xclient.type = ClientMessage; |
195 marker_event->xclient.display = NULL; | 195 marker_event->xclient.display = NULL; |
196 marker_event->xclient.window = None; | 196 marker_event->xclient.window = None; |
197 marker_event->xclient.format = 8; | 197 marker_event->xclient.format = 8; |
198 } | 198 } |
(...skipping 26 matching lines...) Expand all Loading... |
225 }; | 225 }; |
226 | 226 |
227 } // namespace | 227 } // namespace |
228 | 228 |
229 UIControlsAura* CreateUIControlsAura(WindowTreeHost* host) { | 229 UIControlsAura* CreateUIControlsAura(WindowTreeHost* host) { |
230 return new UIControlsX11(host); | 230 return new UIControlsX11(host); |
231 } | 231 } |
232 | 232 |
233 } // namespace test | 233 } // namespace test |
234 } // namespace aura | 234 } // namespace aura |
OLD | NEW |