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 "ui/aura/window_tree_host_x11.h" | 5 #include "ui/aura/window_tree_host_x11.h" |
6 | 6 |
7 #include <strings.h> | 7 #include <strings.h> |
8 #include <X11/cursorfont.h> | 8 #include <X11/cursorfont.h> |
9 #include <X11/extensions/XInput2.h> | 9 #include <X11/extensions/XInput2.h> |
10 #include <X11/extensions/Xrandr.h> | 10 #include <X11/extensions/Xrandr.h> |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 #include "ui/events/platform/platform_event_source.h" | 52 #include "ui/events/platform/platform_event_source.h" |
53 #include "ui/events/platform/x11/x11_event_source.h" | 53 #include "ui/events/platform/x11/x11_event_source.h" |
54 | 54 |
55 using std::max; | 55 using std::max; |
56 using std::min; | 56 using std::min; |
57 | 57 |
58 namespace aura { | 58 namespace aura { |
59 | 59 |
60 namespace { | 60 namespace { |
61 | 61 |
62 const char* kAtomsToCache[] = { | |
63 "WM_DELETE_WINDOW", | |
64 "_NET_WM_PING", | |
65 "_NET_WM_PID", | |
66 NULL | |
67 }; | |
68 | |
69 constexpr uint32_t kInputEventMask = | 62 constexpr uint32_t kInputEventMask = |
70 ButtonPressMask | ButtonReleaseMask | FocusChangeMask | KeyPressMask | | 63 ButtonPressMask | ButtonReleaseMask | FocusChangeMask | KeyPressMask | |
71 KeyReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask; | 64 KeyReleaseMask | EnterWindowMask | LeaveWindowMask | PointerMotionMask; |
72 | 65 |
73 constexpr uint32_t kEventMask = kInputEventMask | ExposureMask | | 66 constexpr uint32_t kEventMask = kInputEventMask | ExposureMask | |
74 VisibilityChangeMask | StructureNotifyMask | | 67 VisibilityChangeMask | StructureNotifyMask | |
75 PropertyChangeMask; | 68 PropertyChangeMask; |
76 | 69 |
77 ::Window FindEventTarget(const base::NativeEvent& xev) { | 70 ::Window FindEventTarget(const base::NativeEvent& xev) { |
78 ::Window target = xev->xany.window; | 71 ::Window target = xev->xany.window; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 108 |
116 //////////////////////////////////////////////////////////////////////////////// | 109 //////////////////////////////////////////////////////////////////////////////// |
117 // WindowTreeHostX11 | 110 // WindowTreeHostX11 |
118 | 111 |
119 WindowTreeHostX11::WindowTreeHostX11(const gfx::Rect& bounds) | 112 WindowTreeHostX11::WindowTreeHostX11(const gfx::Rect& bounds) |
120 : xdisplay_(gfx::GetXDisplay()), | 113 : xdisplay_(gfx::GetXDisplay()), |
121 xwindow_(0), | 114 xwindow_(0), |
122 x_root_window_(DefaultRootWindow(xdisplay_)), | 115 x_root_window_(DefaultRootWindow(xdisplay_)), |
123 current_cursor_(ui::CursorType::kNull), | 116 current_cursor_(ui::CursorType::kNull), |
124 window_mapped_(false), | 117 window_mapped_(false), |
125 bounds_(bounds), | 118 bounds_(bounds) { |
126 atom_cache_(xdisplay_, kAtomsToCache) { | |
127 XSetWindowAttributes swa; | 119 XSetWindowAttributes swa; |
128 memset(&swa, 0, sizeof(swa)); | 120 memset(&swa, 0, sizeof(swa)); |
129 swa.background_pixmap = None; | 121 swa.background_pixmap = None; |
130 swa.bit_gravity = NorthWestGravity; | 122 swa.bit_gravity = NorthWestGravity; |
131 swa.override_redirect = ui::UseTestConfigForPlatformWindows(); | 123 swa.override_redirect = ui::UseTestConfigForPlatformWindows(); |
132 xwindow_ = XCreateWindow( | 124 xwindow_ = XCreateWindow( |
133 xdisplay_, x_root_window_, | 125 xdisplay_, x_root_window_, |
134 bounds.x(), bounds.y(), bounds.width(), bounds.height(), | 126 bounds.x(), bounds.y(), bounds.width(), bounds.height(), |
135 0, // border width | 127 0, // border width |
136 CopyFromParent, // depth | 128 CopyFromParent, // depth |
137 InputOutput, | 129 InputOutput, |
138 CopyFromParent, // visual | 130 CopyFromParent, // visual |
139 CWBackPixmap | CWBitGravity | CWOverrideRedirect, | 131 CWBackPixmap | CWBitGravity | CWOverrideRedirect, |
140 &swa); | 132 &swa); |
141 if (ui::PlatformEventSource::GetInstance()) | 133 if (ui::PlatformEventSource::GetInstance()) |
142 ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); | 134 ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
143 | 135 |
144 xwindow_events_.reset(new ui::XScopedEventSelector(xwindow_, kEventMask)); | 136 xwindow_events_.reset(new ui::XScopedEventSelector(xwindow_, kEventMask)); |
145 XFlush(xdisplay_); | 137 XFlush(xdisplay_); |
146 | 138 |
147 if (ui::IsXInput2Available()) { | 139 if (ui::IsXInput2Available()) { |
148 ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_); | 140 ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_); |
149 SelectXInput2EventsForRootWindow(xdisplay_, x_root_window_); | 141 SelectXInput2EventsForRootWindow(xdisplay_, x_root_window_); |
150 } | 142 } |
151 | 143 |
152 // TODO(erg): We currently only request window deletion events. We also | 144 // TODO(erg): We currently only request window deletion events. We also |
153 // should listen for activation events and anything else that GTK+ listens | 145 // should listen for activation events and anything else that GTK+ listens |
154 // for, and do something useful. | 146 // for, and do something useful. |
155 ::Atom protocols[2]; | 147 ::Atom protocols[2]; |
156 protocols[0] = atom_cache_.GetAtom("WM_DELETE_WINDOW"); | 148 protocols[0] = ui::GetAtom("WM_DELETE_WINDOW"); |
157 protocols[1] = atom_cache_.GetAtom("_NET_WM_PING"); | 149 protocols[1] = ui::GetAtom("_NET_WM_PING"); |
158 XSetWMProtocols(xdisplay_, xwindow_, protocols, 2); | 150 XSetWMProtocols(xdisplay_, xwindow_, protocols, 2); |
159 | 151 |
160 // We need a WM_CLIENT_MACHINE and WM_LOCALE_NAME value so we integrate with | 152 // We need a WM_CLIENT_MACHINE and WM_LOCALE_NAME value so we integrate with |
161 // the desktop environment. | 153 // the desktop environment. |
162 XSetWMProperties(xdisplay_, xwindow_, NULL, NULL, NULL, 0, NULL, NULL, NULL); | 154 XSetWMProperties(xdisplay_, xwindow_, NULL, NULL, NULL, 0, NULL, NULL, NULL); |
163 ui::SetWindowClassHint(xdisplay_, xwindow_, "chromiumos", "ChromiumOS"); | 155 ui::SetWindowClassHint(xdisplay_, xwindow_, "chromiumos", "ChromiumOS"); |
164 | 156 |
165 // Likewise, the X server needs to know this window's pid so it knows which | 157 // Likewise, the X server needs to know this window's pid so it knows which |
166 // program to kill if the window hangs. | 158 // program to kill if the window hangs. |
167 // XChangeProperty() expects "pid" to be long. | 159 // XChangeProperty() expects "pid" to be long. |
168 static_assert(sizeof(long) >= sizeof(pid_t), | 160 static_assert(sizeof(long) >= sizeof(pid_t), |
169 "pid_t should not be larger than long"); | 161 "pid_t should not be larger than long"); |
170 long pid = getpid(); | 162 long pid = getpid(); |
171 XChangeProperty(xdisplay_, | 163 XChangeProperty(xdisplay_, xwindow_, ui::GetAtom("_NET_WM_PID"), XA_CARDINAL, |
172 xwindow_, | 164 32, PropModeReplace, reinterpret_cast<unsigned char*>(&pid), |
173 atom_cache_.GetAtom("_NET_WM_PID"), | 165 1); |
174 XA_CARDINAL, | |
175 32, | |
176 PropModeReplace, | |
177 reinterpret_cast<unsigned char*>(&pid), 1); | |
178 | |
179 // Allow subclasses to create and cache additional atoms. | |
180 atom_cache_.allow_uncached_atoms(); | |
181 | 166 |
182 XRRSelectInput(xdisplay_, x_root_window_, | 167 XRRSelectInput(xdisplay_, x_root_window_, |
183 RRScreenChangeNotifyMask | RROutputChangeNotifyMask); | 168 RRScreenChangeNotifyMask | RROutputChangeNotifyMask); |
184 CreateCompositor(); | 169 CreateCompositor(); |
185 OnAcceleratedWidgetAvailable(); | 170 OnAcceleratedWidgetAvailable(); |
186 } | 171 } |
187 | 172 |
188 WindowTreeHostX11::~WindowTreeHostX11() { | 173 WindowTreeHostX11::~WindowTreeHostX11() { |
189 if (ui::PlatformEventSource::GetInstance()) | 174 if (ui::PlatformEventSource::GetInstance()) |
190 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); | 175 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 OnHostResizedInPixels(bounds.size()); | 300 OnHostResizedInPixels(bounds.size()); |
316 if (origin_changed) | 301 if (origin_changed) |
317 OnHostMovedInPixels(bounds_.origin()); | 302 OnHostMovedInPixels(bounds_.origin()); |
318 break; | 303 break; |
319 } | 304 } |
320 case GenericEvent: | 305 case GenericEvent: |
321 DispatchXI2Event(xev); | 306 DispatchXI2Event(xev); |
322 break; | 307 break; |
323 case ClientMessage: { | 308 case ClientMessage: { |
324 Atom message_type = static_cast<Atom>(xev->xclient.data.l[0]); | 309 Atom message_type = static_cast<Atom>(xev->xclient.data.l[0]); |
325 if (message_type == atom_cache_.GetAtom("WM_DELETE_WINDOW")) { | 310 if (message_type == ui::GetAtom("WM_DELETE_WINDOW")) { |
326 // We have received a close message from the window manager. | 311 // We have received a close message from the window manager. |
327 OnHostCloseRequested(); | 312 OnHostCloseRequested(); |
328 } else if (message_type == atom_cache_.GetAtom("_NET_WM_PING")) { | 313 } else if (message_type == ui::GetAtom("_NET_WM_PING")) { |
329 XEvent reply_event = *xev; | 314 XEvent reply_event = *xev; |
330 reply_event.xclient.window = x_root_window_; | 315 reply_event.xclient.window = x_root_window_; |
331 | 316 |
332 XSendEvent(xdisplay_, | 317 XSendEvent(xdisplay_, |
333 reply_event.xclient.window, | 318 reply_event.xclient.window, |
334 False, | 319 False, |
335 SubstructureRedirectMask | SubstructureNotifyMask, | 320 SubstructureRedirectMask | SubstructureNotifyMask, |
336 &reply_event); | 321 &reply_event); |
337 XFlush(xdisplay_); | 322 XFlush(xdisplay_); |
338 } | 323 } |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
567 ui::LocatedEvent* event) { | 552 ui::LocatedEvent* event) { |
568 SendEventToSink(event); | 553 SendEventToSink(event); |
569 } | 554 } |
570 | 555 |
571 // static | 556 // static |
572 WindowTreeHost* WindowTreeHost::Create(const gfx::Rect& bounds_in_pixels) { | 557 WindowTreeHost* WindowTreeHost::Create(const gfx::Rect& bounds_in_pixels) { |
573 return new WindowTreeHostX11(bounds_in_pixels); | 558 return new WindowTreeHostX11(bounds_in_pixels); |
574 } | 559 } |
575 | 560 |
576 } // namespace aura | 561 } // namespace aura |
OLD | NEW |