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

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

Issue 543663003: Fix maximize on some window managers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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/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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 DesktopNativeWidgetAura* desktop_native_widget_aura) 131 DesktopNativeWidgetAura* desktop_native_widget_aura)
132 : close_widget_factory_(this), 132 : close_widget_factory_(this),
133 xdisplay_(gfx::GetXDisplay()), 133 xdisplay_(gfx::GetXDisplay()),
134 xwindow_(0), 134 xwindow_(0),
135 x_root_window_(DefaultRootWindow(xdisplay_)), 135 x_root_window_(DefaultRootWindow(xdisplay_)),
136 atom_cache_(xdisplay_, kAtomsToCache), 136 atom_cache_(xdisplay_, kAtomsToCache),
137 window_mapped_(false), 137 window_mapped_(false),
138 is_fullscreen_(false), 138 is_fullscreen_(false),
139 is_always_on_top_(false), 139 is_always_on_top_(false),
140 use_native_frame_(false), 140 use_native_frame_(false),
141 should_maximize_after_map_(false),
141 use_argb_visual_(false), 142 use_argb_visual_(false),
142 drag_drop_client_(NULL), 143 drag_drop_client_(NULL),
143 native_widget_delegate_(native_widget_delegate), 144 native_widget_delegate_(native_widget_delegate),
144 desktop_native_widget_aura_(desktop_native_widget_aura), 145 desktop_native_widget_aura_(desktop_native_widget_aura),
145 content_window_(NULL), 146 content_window_(NULL),
146 window_parent_(NULL), 147 window_parent_(NULL),
147 window_shape_(NULL), 148 window_shape_(NULL),
148 custom_window_shape_(false), 149 custom_window_shape_(false),
149 urgency_hint_set_(false) { 150 urgency_hint_set_(false) {
150 } 151 }
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 return this; 360 return this;
360 } 361 }
361 362
362 void DesktopWindowTreeHostX11::ShowWindowWithState( 363 void DesktopWindowTreeHostX11::ShowWindowWithState(
363 ui::WindowShowState show_state) { 364 ui::WindowShowState show_state) {
364 if (!window_mapped_) 365 if (!window_mapped_)
365 MapWindow(show_state); 366 MapWindow(show_state);
366 367
367 if (show_state == ui::SHOW_STATE_NORMAL || 368 if (show_state == ui::SHOW_STATE_NORMAL ||
368 show_state == ui::SHOW_STATE_MAXIMIZED) { 369 show_state == ui::SHOW_STATE_MAXIMIZED) {
369 // Note: XFCE ignores a maximize hint given before mapping the window.
370 if (show_state == ui::SHOW_STATE_MAXIMIZED)
371 Maximize();
372 Activate(); 370 Activate();
373 } 371 }
374 372
375 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state); 373 native_widget_delegate_->AsWidget()->SetInitialFocus(show_state);
376 } 374 }
377 375
378 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( 376 void DesktopWindowTreeHostX11::ShowMaximizedWithBounds(
379 const gfx::Rect& restored_bounds) { 377 const gfx::Rect& restored_bounds) {
380 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED); 378 ShowWindowWithState(ui::SHOW_STATE_MAXIMIZED);
381 // Enforce |restored_bounds_| since calling Maximize() could have reset it. 379 // Enforce |restored_bounds_| since calling Maximize() could have reset it.
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 None); 532 None);
535 533
536 // Resize the window so that it does not have the same size as a monitor. 534 // Resize the window so that it does not have the same size as a monitor.
537 // (Otherwise, some window managers immediately put the window back in 535 // (Otherwise, some window managers immediately put the window back in
538 // fullscreen mode). 536 // fullscreen mode).
539 gfx::Rect adjusted_bounds(bounds_.origin(), AdjustSize(bounds_.size())); 537 gfx::Rect adjusted_bounds(bounds_.origin(), AdjustSize(bounds_.size()));
540 if (adjusted_bounds != bounds_) 538 if (adjusted_bounds != bounds_)
541 SetBounds(adjusted_bounds); 539 SetBounds(adjusted_bounds);
542 } 540 }
543 541
542 // Some WMs do not respect maximization hints on unmapped windows, so we
543 // save this one for later too.
544 should_maximize_after_map_ = !window_mapped_;
545
544 // When we are in the process of requesting to maximize a window, we can 546 // When we are in the process of requesting to maximize a window, we can
545 // accurately keep track of our restored bounds instead of relying on the 547 // accurately keep track of our restored bounds instead of relying on the
546 // heuristics that are in the PropertyNotify and ConfigureNotify handlers. 548 // heuristics that are in the PropertyNotify and ConfigureNotify handlers.
547 restored_bounds_ = bounds_; 549 restored_bounds_ = bounds_;
548 550
549 SetWMSpecState(true, 551 SetWMSpecState(true,
550 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), 552 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"),
551 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); 553 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ"));
552 if (IsMinimized()) 554 if (IsMinimized())
553 ShowWindowWithState(ui::SHOW_STATE_NORMAL); 555 ShowWindowWithState(ui::SHOW_STATE_NORMAL);
554 } 556 }
555 557
556 void DesktopWindowTreeHostX11::Minimize() { 558 void DesktopWindowTreeHostX11::Minimize() {
557 ReleaseCapture(); 559 ReleaseCapture();
558 XIconifyWindow(xdisplay_, xwindow_, 0); 560 XIconifyWindow(xdisplay_, xwindow_, 0);
559 } 561 }
560 562
561 void DesktopWindowTreeHostX11::Restore() { 563 void DesktopWindowTreeHostX11::Restore() {
564 should_maximize_after_map_ = false;
Elliot Glaysher 2014/09/04 17:37:04 This seems fragile. Could you please test in the
Arjan van Leeuwen 2014/09/05 11:23:26 You can't restore the window through the window ma
562 SetWMSpecState(false, 565 SetWMSpecState(false,
563 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"), 566 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"),
564 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")); 567 atom_cache_.GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ"));
565 if (IsMinimized()) 568 if (IsMinimized())
566 ShowWindowWithState(ui::SHOW_STATE_NORMAL); 569 ShowWindowWithState(ui::SHOW_STATE_NORMAL);
567 } 570 }
568 571
569 bool DesktopWindowTreeHostX11::IsMaximized() const { 572 bool DesktopWindowTreeHostX11::IsMaximized() const {
570 return (HasWMSpecProperty("_NET_WM_STATE_MAXIMIZED_VERT") && 573 return (HasWMSpecProperty("_NET_WM_STATE_MAXIMIZED_VERT") &&
571 HasWMSpecProperty("_NET_WM_STATE_MAXIMIZED_HORZ")); 574 HasWMSpecProperty("_NET_WM_STATE_MAXIMIZED_HORZ"));
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 } 1579 }
1577 1580
1578 XMapWindow(xdisplay_, xwindow_); 1581 XMapWindow(xdisplay_, xwindow_);
1579 1582
1580 // We now block until our window is mapped. Some X11 APIs will crash and 1583 // We now block until our window is mapped. Some X11 APIs will crash and
1581 // burn if passed |xwindow_| before the window is mapped, and XMapWindow is 1584 // burn if passed |xwindow_| before the window is mapped, and XMapWindow is
1582 // asynchronous. 1585 // asynchronous.
1583 if (ui::X11EventSource::GetInstance()) 1586 if (ui::X11EventSource::GetInstance())
1584 ui::X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_); 1587 ui::X11EventSource::GetInstance()->BlockUntilWindowMapped(xwindow_);
1585 window_mapped_ = true; 1588 window_mapped_ = true;
1589
1590 // Some WMs only respect maximize hints after the window has been mapped.
1591 // Check whether we need to re-do a maximization.
1592 if (should_maximize_after_map_) {
1593 Maximize();
1594 should_maximize_after_map_ = false;
1595 }
1586 } 1596 }
1587 1597
1588 void DesktopWindowTreeHostX11::SetWindowTransparency() { 1598 void DesktopWindowTreeHostX11::SetWindowTransparency() {
1589 compositor()->SetHostHasTransparentBackground(use_argb_visual_); 1599 compositor()->SetHostHasTransparentBackground(use_argb_visual_);
1590 window()->SetTransparent(use_argb_visual_); 1600 window()->SetTransparent(use_argb_visual_);
1591 content_window_->SetTransparent(use_argb_visual_); 1601 content_window_->SetTransparent(use_argb_visual_);
1592 } 1602 }
1593 1603
1594 void DesktopWindowTreeHostX11::Relayout() { 1604 void DesktopWindowTreeHostX11::Relayout() {
1595 Widget* widget = native_widget_delegate_->AsWidget(); 1605 Widget* widget = native_widget_delegate_->AsWidget();
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
1914 if (linux_ui) { 1924 if (linux_ui) {
1915 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); 1925 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window);
1916 if (native_theme) 1926 if (native_theme)
1917 return native_theme; 1927 return native_theme;
1918 } 1928 }
1919 1929
1920 return ui::NativeTheme::instance(); 1930 return ui::NativeTheme::instance();
1921 } 1931 }
1922 1932
1923 } // namespace views 1933 } // 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