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/root_window_host_linux.h" | 5 #include "ui/aura/root_window_host_linux.h" |
6 | 6 |
7 #include <X11/cursorfont.h> | 7 #include <X11/cursorfont.h> |
8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 ExposureMask | VisibilityChangeMask | | 298 ExposureMask | VisibilityChangeMask | |
299 StructureNotifyMask | PropertyChangeMask | | 299 StructureNotifyMask | PropertyChangeMask | |
300 PointerMotionMask; | 300 PointerMotionMask; |
301 XSelectInput(xdisplay_, xwindow_, event_mask); | 301 XSelectInput(xdisplay_, xwindow_, event_mask); |
302 XSelectInput(xdisplay_, x_root_window_, StructureNotifyMask); | 302 XSelectInput(xdisplay_, x_root_window_, StructureNotifyMask); |
303 XFlush(xdisplay_); | 303 XFlush(xdisplay_); |
304 | 304 |
305 if (base::MessagePumpForUI::HasXInput2()) | 305 if (base::MessagePumpForUI::HasXInput2()) |
306 ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_); | 306 ui::TouchFactory::GetInstance()->SetupXI2ForXWindow(xwindow_); |
307 | 307 |
308 MessageLoopForUI::current()->AddDestructionObserver(this); | |
309 | |
310 // Initialize invisible cursor. | 308 // Initialize invisible cursor. |
311 char nodata[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; | 309 char nodata[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; |
312 XColor black; | 310 XColor black; |
313 black.red = black.green = black.blue = 0; | 311 black.red = black.green = black.blue = 0; |
314 Pixmap blank = XCreateBitmapFromData(xdisplay_, xwindow_, | 312 Pixmap blank = XCreateBitmapFromData(xdisplay_, xwindow_, |
315 nodata, 8, 8); | 313 nodata, 8, 8); |
316 invisible_cursor_ = XCreatePixmapCursor(xdisplay_, blank, blank, | 314 invisible_cursor_ = XCreatePixmapCursor(xdisplay_, blank, blank, |
317 &black, &black, 0, 0); | 315 &black, &black, 0, 0); |
318 if (RootWindow::hide_host_cursor()) | 316 if (RootWindow::hide_host_cursor()) |
319 XDefineCursor(xdisplay_, x_root_window_, invisible_cursor_); | 317 XDefineCursor(xdisplay_, x_root_window_, invisible_cursor_); |
320 } | 318 } |
321 | 319 |
322 RootWindowHostLinux::~RootWindowHostLinux() { | 320 RootWindowHostLinux::~RootWindowHostLinux() { |
323 static_cast<DispatcherLinux*>(Env::GetInstance()->GetDispatcher())-> | 321 static_cast<DispatcherLinux*>(Env::GetInstance()->GetDispatcher())-> |
324 RootWindowHostDestroying(xwindow_, x_root_window_); | 322 RootWindowHostDestroying(xwindow_, x_root_window_); |
325 XDestroyWindow(xdisplay_, xwindow_); | 323 XDestroyWindow(xdisplay_, xwindow_); |
326 | 324 |
327 // Clears XCursorCache. | 325 // Clears XCursorCache. |
328 ui::GetXCursor(ui::kCursorClearXCursorCache); | 326 ui::GetXCursor(ui::kCursorClearXCursorCache); |
329 | 327 |
330 XFreeCursor(xdisplay_, invisible_cursor_); | 328 XFreeCursor(xdisplay_, invisible_cursor_); |
331 | |
332 MessageLoopForUI::current()->RemoveDestructionObserver(this); | |
333 } | 329 } |
334 | 330 |
335 base::MessagePumpDispatcher::DispatchStatus RootWindowHostLinux::Dispatch( | 331 base::MessagePumpDispatcher::DispatchStatus RootWindowHostLinux::Dispatch( |
336 XEvent* xev) { | 332 XEvent* xev) { |
337 bool handled = false; | 333 bool handled = false; |
338 | 334 |
339 // See crbug.com/109884. | 335 // See crbug.com/109884. |
340 // CheckXEventForConsistency(xev); | 336 // CheckXEventForConsistency(xev); |
341 | 337 |
342 switch (xev->type) { | 338 switch (xev->type) { |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 root_window_->ConvertPointToNativeScreen(&point); | 613 root_window_->ConvertPointToNativeScreen(&point); |
618 xevent.xmotion.x_root = point.x(); | 614 xevent.xmotion.x_root = point.x(); |
619 xevent.xmotion.y_root = point.y(); | 615 xevent.xmotion.y_root = point.y(); |
620 } | 616 } |
621 default: | 617 default: |
622 break; | 618 break; |
623 } | 619 } |
624 XSendEvent(xdisplay_, xwindow_, False, 0, &xevent); | 620 XSendEvent(xdisplay_, xwindow_, False, 0, &xevent); |
625 } | 621 } |
626 | 622 |
627 void RootWindowHostLinux::WillDestroyCurrentMessageLoop() { | |
628 aura::RootWindow::DeleteInstance(); | |
629 } | |
630 | |
631 bool RootWindowHostLinux::IsWindowManagerPresent() { | 623 bool RootWindowHostLinux::IsWindowManagerPresent() { |
632 // Per ICCCM 2.8, "Manager Selections", window managers should take ownership | 624 // Per ICCCM 2.8, "Manager Selections", window managers should take ownership |
633 // of WM_Sn selections (where n is a screen number). | 625 // of WM_Sn selections (where n is a screen number). |
634 ::Atom wm_s0_atom = XInternAtom(xdisplay_, "WM_S0", False); | 626 ::Atom wm_s0_atom = XInternAtom(xdisplay_, "WM_S0", False); |
635 return XGetSelectionOwner(xdisplay_, wm_s0_atom) != None; | 627 return XGetSelectionOwner(xdisplay_, wm_s0_atom) != None; |
636 } | 628 } |
637 | 629 |
638 void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) { | 630 void RootWindowHostLinux::SetCursorInternal(gfx::NativeCursor cursor) { |
639 ::Cursor xcursor = | 631 ::Cursor xcursor = |
640 cursor == kCursorNone ? | 632 cursor == kCursorNone ? |
641 invisible_cursor_ : | 633 invisible_cursor_ : |
642 ui::GetXCursor(CursorShapeFromNative(cursor)); | 634 ui::GetXCursor(CursorShapeFromNative(cursor)); |
643 XDefineCursor(xdisplay_, xwindow_, xcursor); | 635 XDefineCursor(xdisplay_, xwindow_, xcursor); |
644 } | 636 } |
645 | 637 |
646 // static | 638 // static |
647 RootWindowHost* RootWindowHost::Create(const gfx::Rect& bounds) { | 639 RootWindowHost* RootWindowHost::Create(const gfx::Rect& bounds) { |
648 return new RootWindowHostLinux(bounds); | 640 return new RootWindowHostLinux(bounds); |
649 } | 641 } |
650 | 642 |
651 // static | 643 // static |
652 gfx::Size RootWindowHost::GetNativeScreenSize() { | 644 gfx::Size RootWindowHost::GetNativeScreenSize() { |
653 ::Display* xdisplay = base::MessagePumpX::GetDefaultXDisplay(); | 645 ::Display* xdisplay = base::MessagePumpX::GetDefaultXDisplay(); |
654 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); | 646 return gfx::Size(DisplayWidth(xdisplay, 0), DisplayHeight(xdisplay, 0)); |
655 } | 647 } |
656 | 648 |
657 } // namespace aura | 649 } // namespace aura |
OLD | NEW |