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

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

Issue 2057333002: X11: Wait for UnmapNotify before trying to remap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
« no previous file with comments | « ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/Xatom.h> 7 #include <X11/Xatom.h>
8 #include <X11/Xregion.h> 8 #include <X11/Xregion.h>
9 #include <X11/Xutil.h> 9 #include <X11/Xutil.h>
10 #include <X11/extensions/XInput2.h> 10 #include <X11/extensions/XInput2.h>
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 // DesktopWindowTreeHostX11, public: 158 // DesktopWindowTreeHostX11, public:
159 159
160 DesktopWindowTreeHostX11::DesktopWindowTreeHostX11( 160 DesktopWindowTreeHostX11::DesktopWindowTreeHostX11(
161 internal::NativeWidgetDelegate* native_widget_delegate, 161 internal::NativeWidgetDelegate* native_widget_delegate,
162 DesktopNativeWidgetAura* desktop_native_widget_aura) 162 DesktopNativeWidgetAura* desktop_native_widget_aura)
163 : xdisplay_(gfx::GetXDisplay()), 163 : xdisplay_(gfx::GetXDisplay()),
164 xwindow_(0), 164 xwindow_(0),
165 x_root_window_(DefaultRootWindow(xdisplay_)), 165 x_root_window_(DefaultRootWindow(xdisplay_)),
166 atom_cache_(xdisplay_, kAtomsToCache), 166 atom_cache_(xdisplay_, kAtomsToCache),
167 window_mapped_(false), 167 window_mapped_(false),
168 wait_for_unmap_(false),
168 is_fullscreen_(false), 169 is_fullscreen_(false),
169 is_always_on_top_(false), 170 is_always_on_top_(false),
170 use_native_frame_(false), 171 use_native_frame_(false),
171 should_maximize_after_map_(false), 172 should_maximize_after_map_(false),
172 use_argb_visual_(false), 173 use_argb_visual_(false),
173 drag_drop_client_(NULL), 174 drag_drop_client_(NULL),
174 native_widget_delegate_(native_widget_delegate), 175 native_widget_delegate_(native_widget_delegate),
175 desktop_native_widget_aura_(desktop_native_widget_aura), 176 desktop_native_widget_aura_(desktop_native_widget_aura),
176 content_window_(NULL), 177 content_window_(NULL),
177 window_parent_(NULL), 178 window_parent_(NULL),
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 971
971 void DesktopWindowTreeHostX11::ShowImpl() { 972 void DesktopWindowTreeHostX11::ShowImpl() {
972 ShowWindowWithState(ui::SHOW_STATE_NORMAL); 973 ShowWindowWithState(ui::SHOW_STATE_NORMAL);
973 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true); 974 native_widget_delegate_->OnNativeWidgetVisibilityChanged(true);
974 } 975 }
975 976
976 void DesktopWindowTreeHostX11::HideImpl() { 977 void DesktopWindowTreeHostX11::HideImpl() {
977 if (window_mapped_) { 978 if (window_mapped_) {
978 XWithdrawWindow(xdisplay_, xwindow_, 0); 979 XWithdrawWindow(xdisplay_, xwindow_, 0);
979 window_mapped_ = false; 980 window_mapped_ = false;
981 wait_for_unmap_ = true;
980 } 982 }
981 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); 983 native_widget_delegate_->OnNativeWidgetVisibilityChanged(false);
982 } 984 }
983 985
984 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const { 986 gfx::Rect DesktopWindowTreeHostX11::GetBounds() const {
985 return bounds_in_pixels_; 987 return bounds_in_pixels_;
986 } 988 }
987 989
988 void DesktopWindowTreeHostX11::SetBounds( 990 void DesktopWindowTreeHostX11::SetBounds(
989 const gfx::Rect& requested_bounds_in_pixel) { 991 const gfx::Rect& requested_bounds_in_pixel) {
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 XChangeProperty(xdisplay_, 1660 XChangeProperty(xdisplay_,
1659 xwindow_, 1661 xwindow_,
1660 atom_cache_.GetAtom("_NET_WM_USER_TIME"), 1662 atom_cache_.GetAtom("_NET_WM_USER_TIME"),
1661 XA_CARDINAL, 1663 XA_CARDINAL,
1662 32, 1664 32,
1663 PropModeReplace, 1665 PropModeReplace,
1664 reinterpret_cast<const unsigned char *>(&wm_user_time_ms), 1666 reinterpret_cast<const unsigned char *>(&wm_user_time_ms),
1665 1); 1667 1);
1666 } 1668 }
1667 1669
1670 ui::X11EventSource* event_source = ui::X11EventSource::GetInstance();
1671 DCHECK(event_source);
1672
1673 if (wait_for_unmap_) {
1674 // Block until our window is unmapped. This avoids a race condition when
1675 // remapping an unmapped window.
1676 event_source->BlockUntilWindowUnmapped(xwindow_);
1677 DCHECK(!wait_for_unmap_);
1678 }
1679
1668 XMapWindow(xdisplay_, xwindow_); 1680 XMapWindow(xdisplay_, xwindow_);
1669 1681
1670 // We now block until our window is mapped. Some X11 APIs will crash and 1682 // We now block until our window is mapped. Some X11 APIs will crash and
1671 // burn if passed |xwindow_| before the window is mapped, and XMapWindow is 1683 // burn if passed |xwindow_| before the window is mapped, and XMapWindow is
1672 // asynchronous. 1684 // asynchronous.
1673 if (ui::X11EventSource::GetInstance()) 1685 event_source->BlockUntilWindowMapped(xwindow_);
1674 ui::X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_);
1675 } 1686 }
1676 1687
1677 void DesktopWindowTreeHostX11::SetWindowTransparency() { 1688 void DesktopWindowTreeHostX11::SetWindowTransparency() {
1678 compositor()->SetHostHasTransparentBackground(use_argb_visual_); 1689 compositor()->SetHostHasTransparentBackground(use_argb_visual_);
1679 window()->SetTransparent(use_argb_visual_); 1690 window()->SetTransparent(use_argb_visual_);
1680 content_window_->SetTransparent(use_argb_visual_); 1691 content_window_->SetTransparent(use_argb_visual_);
1681 } 1692 }
1682 1693
1683 void DesktopWindowTreeHostX11::Relayout() { 1694 void DesktopWindowTreeHostX11::Relayout() {
1684 Widget* widget = native_widget_delegate_->AsWidget(); 1695 Widget* widget = native_widget_delegate_->AsWidget();
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
1896 // Some WMs only respect maximize hints after the window has been mapped. 1907 // Some WMs only respect maximize hints after the window has been mapped.
1897 // Check whether we need to re-do a maximization. 1908 // Check whether we need to re-do a maximization.
1898 if (should_maximize_after_map_) { 1909 if (should_maximize_after_map_) {
1899 Maximize(); 1910 Maximize();
1900 should_maximize_after_map_ = false; 1911 should_maximize_after_map_ = false;
1901 } 1912 }
1902 1913
1903 break; 1914 break;
1904 } 1915 }
1905 case UnmapNotify: { 1916 case UnmapNotify: {
1917 wait_for_unmap_ = false;
1906 FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11, 1918 FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11,
1907 observer_list_, 1919 observer_list_,
1908 OnWindowUnmapped(xwindow_)); 1920 OnWindowUnmapped(xwindow_));
1909 break; 1921 break;
1910 } 1922 }
1911 case ClientMessage: { 1923 case ClientMessage: {
1912 Atom message_type = xev->xclient.message_type; 1924 Atom message_type = xev->xclient.message_type;
1913 if (message_type == atom_cache_.GetAtom("WM_PROTOCOLS")) { 1925 if (message_type == atom_cache_.GetAtom("WM_PROTOCOLS")) {
1914 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]); 1926 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]);
1915 if (protocol == atom_cache_.GetAtom("WM_DELETE_WINDOW")) { 1927 if (protocol == atom_cache_.GetAtom("WM_DELETE_WINDOW")) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
2053 if (linux_ui) { 2065 if (linux_ui) {
2054 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); 2066 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window);
2055 if (native_theme) 2067 if (native_theme)
2056 return native_theme; 2068 return native_theme;
2057 } 2069 }
2058 2070
2059 return ui::NativeThemeAura::instance(); 2071 return ui::NativeThemeAura::instance();
2060 } 2072 }
2061 2073
2062 } // namespace views 2074 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698