Chromium Code Reviews| 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/views/widget/desktop_aura/desktop_window_tree_host_x11.h" | 5 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" |
| 6 | 6 |
| 7 #include <X11/extensions/shape.h> | 7 #include <X11/extensions/shape.h> |
| 8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
| 9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> |
| 10 #include <X11/Xregion.h> | 10 #include <X11/Xregion.h> |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 "XdndProxy", // Proxy windows? | 121 "XdndProxy", // Proxy windows? |
| 122 "XdndSelection", | 122 "XdndSelection", |
| 123 "XdndStatus", | 123 "XdndStatus", |
| 124 "XdndTypeList", | 124 "XdndTypeList", |
| 125 NULL | 125 NULL |
| 126 }; | 126 }; |
| 127 | 127 |
| 128 const char kX11WindowRolePopup[] = "popup"; | 128 const char kX11WindowRolePopup[] = "popup"; |
| 129 const char kX11WindowRoleBubble[] = "bubble"; | 129 const char kX11WindowRoleBubble[] = "bubble"; |
| 130 | 130 |
| 131 // Returns the whole path from |window| to the root. | |
| 132 std::vector<::Window> GetParentsList(XDisplay* xdisplay, ::Window window) { | |
| 133 ::Window parent_win, root_win; | |
| 134 Window* child_windows; | |
| 135 unsigned int num_child_windows; | |
| 136 std::vector<::Window> result; | |
| 137 | |
| 138 while (window) { | |
| 139 result.push_back(window); | |
| 140 if (!XQueryTree(xdisplay, window, | |
| 141 &root_win, &parent_win, &child_windows, &num_child_windows)) | |
|
Elliot Glaysher
2015/06/05 22:03:01
Doing a whole query tree here seems a bit unfortun
vasilii
2015/06/08 09:14:37
I don't see another function to get a parent.
| |
| 142 break; | |
| 143 if (child_windows) | |
| 144 XFree(child_windows); | |
| 145 window = parent_win; | |
| 146 } | |
| 147 return result; | |
| 148 } | |
| 149 | |
| 131 } // namespace | 150 } // namespace |
| 132 | 151 |
| 133 //////////////////////////////////////////////////////////////////////////////// | 152 //////////////////////////////////////////////////////////////////////////////// |
| 134 // DesktopWindowTreeHostX11, public: | 153 // DesktopWindowTreeHostX11, public: |
| 135 | 154 |
| 136 DesktopWindowTreeHostX11::DesktopWindowTreeHostX11( | 155 DesktopWindowTreeHostX11::DesktopWindowTreeHostX11( |
| 137 internal::NativeWidgetDelegate* native_widget_delegate, | 156 internal::NativeWidgetDelegate* native_widget_delegate, |
| 138 DesktopNativeWidgetAura* desktop_native_widget_aura) | 157 DesktopNativeWidgetAura* desktop_native_widget_aura) |
| 139 : xdisplay_(gfx::GetXDisplay()), | 158 : xdisplay_(gfx::GetXDisplay()), |
| 140 xwindow_(0), | 159 xwindow_(0), |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 408 bool size_changed = bounds_in_pixels_.size() != size_in_pixels; | 427 bool size_changed = bounds_in_pixels_.size() != size_in_pixels; |
| 409 XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(), | 428 XResizeWindow(xdisplay_, xwindow_, size_in_pixels.width(), |
| 410 size_in_pixels.height()); | 429 size_in_pixels.height()); |
| 411 bounds_in_pixels_.set_size(size_in_pixels); | 430 bounds_in_pixels_.set_size(size_in_pixels); |
| 412 if (size_changed) { | 431 if (size_changed) { |
| 413 OnHostResized(size_in_pixels); | 432 OnHostResized(size_in_pixels); |
| 414 ResetWindowRegion(); | 433 ResetWindowRegion(); |
| 415 } | 434 } |
| 416 } | 435 } |
| 417 | 436 |
| 437 void DesktopWindowTreeHostX11::StackAbove(aura::Window* window) { | |
| 438 if (window && window->GetRootWindow()) { | |
| 439 ::Window window_below = window->GetHost()->GetAcceleratedWidget(); | |
| 440 // Find all parent windows up to the root. | |
| 441 std::vector<::Window> window_below_parents = | |
| 442 GetParentsList(xdisplay_, window_below); | |
| 443 std::vector<::Window> window_above_parents = | |
| 444 GetParentsList(xdisplay_, xwindow_); | |
| 445 | |
| 446 // Find their common ancestor. | |
| 447 auto it_below_window = window_below_parents.rbegin(); | |
| 448 auto it_above_window = window_above_parents.rbegin(); | |
| 449 for (; it_below_window != window_below_parents.rend() && | |
| 450 it_above_window != window_above_parents.rend() && | |
| 451 *it_below_window == *it_above_window; | |
| 452 ++it_below_window, ++it_above_window) { | |
| 453 } | |
| 454 | |
| 455 if (it_below_window != window_below_parents.rend() && | |
| 456 it_above_window != window_above_parents.rend()) { | |
| 457 // First stack |xwindow_| below so Z-order of |window| stays the same. | |
| 458 ::Window windows[] = {*it_below_window, *it_above_window}; | |
| 459 if (XRestackWindows(xdisplay_, windows, 2) == 0) { | |
| 460 // Now stack them properly. | |
| 461 std::swap(windows[0], windows[1]); | |
| 462 XRestackWindows(xdisplay_, windows, 2); | |
| 463 } | |
| 464 } | |
| 465 } | |
| 466 } | |
| 467 | |
| 418 void DesktopWindowTreeHostX11::StackAtTop() { | 468 void DesktopWindowTreeHostX11::StackAtTop() { |
| 419 XRaiseWindow(xdisplay_, xwindow_); | 469 XRaiseWindow(xdisplay_, xwindow_); |
| 420 } | 470 } |
| 421 | 471 |
| 422 void DesktopWindowTreeHostX11::CenterWindow(const gfx::Size& size) { | 472 void DesktopWindowTreeHostX11::CenterWindow(const gfx::Size& size) { |
| 423 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(size)).size(); | 473 gfx::Size size_in_pixels = ToPixelRect(gfx::Rect(size)).size(); |
| 424 gfx::Rect parent_bounds_in_pixels = GetWorkAreaBoundsInPixels(); | 474 gfx::Rect parent_bounds_in_pixels = GetWorkAreaBoundsInPixels(); |
| 425 | 475 |
| 426 // If |window_|'s transient parent bounds are big enough to contain |size|, | 476 // If |window_|'s transient parent bounds are big enough to contain |size|, |
| 427 // use them instead. | 477 // use them instead. |
| (...skipping 1571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1999 if (linux_ui) { | 2049 if (linux_ui) { |
| 2000 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); | 2050 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); |
| 2001 if (native_theme) | 2051 if (native_theme) |
| 2002 return native_theme; | 2052 return native_theme; |
| 2003 } | 2053 } |
| 2004 | 2054 |
| 2005 return ui::NativeTheme::instance(); | 2055 return ui::NativeTheme::instance(); |
| 2006 } | 2056 } |
| 2007 | 2057 |
| 2008 } // namespace views | 2058 } // namespace views |
| OLD | NEW |