Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc

Issue 1162883003: Fix Z-order for a bubble when it appears for inactive window. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: DCHECK and a comment Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h ('k') | ui/views/win/hwnd_message_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698