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

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

Issue 26427002: Add always-on-top property to app windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge Created 7 years, 2 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_root_window_host_x11.h" 5 #include "ui/views/widget/desktop_aura/desktop_root_window_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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 DesktopNativeWidgetAura* desktop_native_widget_aura, 117 DesktopNativeWidgetAura* desktop_native_widget_aura,
118 const gfx::Rect& initial_bounds) 118 const gfx::Rect& initial_bounds)
119 : close_widget_factory_(this), 119 : close_widget_factory_(this),
120 xdisplay_(gfx::GetXDisplay()), 120 xdisplay_(gfx::GetXDisplay()),
121 xwindow_(0), 121 xwindow_(0),
122 x_root_window_(DefaultRootWindow(xdisplay_)), 122 x_root_window_(DefaultRootWindow(xdisplay_)),
123 atom_cache_(xdisplay_, kAtomsToCache), 123 atom_cache_(xdisplay_, kAtomsToCache),
124 window_mapped_(false), 124 window_mapped_(false),
125 focus_when_shown_(false), 125 focus_when_shown_(false),
126 is_fullscreen_(false), 126 is_fullscreen_(false),
127 is_always_on_top_(false),
127 current_cursor_(ui::kCursorNull), 128 current_cursor_(ui::kCursorNull),
128 native_widget_delegate_(native_widget_delegate), 129 native_widget_delegate_(native_widget_delegate),
129 desktop_native_widget_aura_(desktop_native_widget_aura) { 130 desktop_native_widget_aura_(desktop_native_widget_aura) {
130 } 131 }
131 132
132 DesktopRootWindowHostX11::~DesktopRootWindowHostX11() { 133 DesktopRootWindowHostX11::~DesktopRootWindowHostX11() {
133 root_window_->ClearProperty(kHostForRootWindow); 134 root_window_->ClearProperty(kHostForRootWindow);
134 aura::client::SetFocusClient(root_window_, NULL); 135 aura::client::SetFocusClient(root_window_, NULL);
135 aura::client::SetActivationClient(root_window_, NULL); 136 aura::client::SetActivationClient(root_window_, NULL);
136 } 137 }
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 bool DesktopRootWindowHostX11::IsMinimized() const { 427 bool DesktopRootWindowHostX11::IsMinimized() const {
427 return HasWMSpecProperty("_NET_WM_STATE_HIDDEN"); 428 return HasWMSpecProperty("_NET_WM_STATE_HIDDEN");
428 } 429 }
429 430
430 431
431 bool DesktopRootWindowHostX11::HasCapture() const { 432 bool DesktopRootWindowHostX11::HasCapture() const {
432 return g_current_capture == this; 433 return g_current_capture == this;
433 } 434 }
434 435
435 void DesktopRootWindowHostX11::SetAlwaysOnTop(bool always_on_top) { 436 void DesktopRootWindowHostX11::SetAlwaysOnTop(bool always_on_top) {
437 is_always_on_top_ = always_on_top;
436 SetWMSpecState(always_on_top, 438 SetWMSpecState(always_on_top,
437 atom_cache_.GetAtom("_NET_WM_STATE_ABOVE"), 439 atom_cache_.GetAtom("_NET_WM_STATE_ABOVE"),
438 None); 440 None);
439 } 441 }
440 442
443 bool DesktopRootWindowHostX11::IsAlwaysOnTop() const {
444 return is_always_on_top_;
445 }
446
441 void DesktopRootWindowHostX11::SetWindowTitle(const string16& title) { 447 void DesktopRootWindowHostX11::SetWindowTitle(const string16& title) {
442 XStoreName(xdisplay_, xwindow_, UTF16ToUTF8(title).c_str()); 448 XStoreName(xdisplay_, xwindow_, UTF16ToUTF8(title).c_str());
443 } 449 }
444 450
445 void DesktopRootWindowHostX11::ClearNativeFocus() { 451 void DesktopRootWindowHostX11::ClearNativeFocus() {
446 // This method is weird and misnamed. Instead of clearing the native focus, 452 // This method is weird and misnamed. Instead of clearing the native focus,
447 // it sets the focus to our |content_window_|, which will trigger a cascade 453 // it sets the focus to our |content_window_|, which will trigger a cascade
448 // of focus changes into views. 454 // of focus changes into views.
449 if (content_window_ && aura::client::GetFocusClient(content_window_) && 455 if (content_window_ && aura::client::GetFocusClient(content_window_) &&
450 content_window_->Contains( 456 content_window_->Contains(
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
891 reinterpret_cast<unsigned char*>(&pid), 1); 897 reinterpret_cast<unsigned char*>(&pid), 1);
892 898
893 XChangeProperty(xdisplay_, 899 XChangeProperty(xdisplay_,
894 xwindow_, 900 xwindow_,
895 atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE"), 901 atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE"),
896 XA_ATOM, 902 XA_ATOM,
897 32, 903 32,
898 PropModeReplace, 904 PropModeReplace,
899 reinterpret_cast<unsigned char*>(&window_type), 1); 905 reinterpret_cast<unsigned char*>(&window_type), 1);
900 906
907 // List of window state properties (_NET_WM_STATE) to set, if any.
908 std::vector< ::Atom> state_atom_list;
909
901 // Remove popup windows from taskbar. 910 // Remove popup windows from taskbar.
902 if (params.type == Widget::InitParams::TYPE_POPUP || 911 if (params.type == Widget::InitParams::TYPE_POPUP ||
903 params.type == Widget::InitParams::TYPE_BUBBLE) { 912 params.type == Widget::InitParams::TYPE_BUBBLE) {
904 Atom atom = atom_cache_.GetAtom("_NET_WM_STATE_SKIP_TASKBAR"); 913 state_atom_list.push_back(
914 atom_cache_.GetAtom("_NET_WM_STATE_SKIP_TASKBAR"));
915 }
905 916
906 // Setting _NET_WM_STATE by sending a message to the root_window (with 917 // If the window should stay on top of other windows, add the
907 // SetWMSpecState) has no effect here since the window has not yet been 918 // _NET_WM_STATE_ABOVE property.
908 // mapped. So we manually change the state. 919 is_always_on_top_ = params.keep_on_top;
909 XChangeProperty (xdisplay_, 920 if (is_always_on_top_)
910 xwindow_, 921 state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_ABOVE"));
911 atom_cache_.GetAtom("_NET_WM_STATE"), 922
912 XA_ATOM, 923 // Setting _NET_WM_STATE by sending a message to the root_window (with
913 32, 924 // SetWMSpecState) has no effect here since the window has not yet been
914 PropModeAppend, 925 // mapped. So we manually change the state.
915 reinterpret_cast<unsigned char*>(&atom), 1); 926 if (!state_atom_list.empty()) {
927 ui::SetAtomArrayProperty(xwindow_,
928 "_NET_WM_STATE",
929 "ATOM",
930 state_atom_list);
916 } 931 }
917 932
918 if (!params.wm_class_name.empty() || !params.wm_class_class.empty()) { 933 if (!params.wm_class_name.empty() || !params.wm_class_class.empty()) {
919 ui::SetWindowClassHint( 934 ui::SetWindowClassHint(
920 xdisplay_, xwindow_, params.wm_class_name, params.wm_class_class); 935 xdisplay_, xwindow_, params.wm_class_name, params.wm_class_class);
921 } 936 }
922 } 937 }
923 938
924 aura::RootWindow* DesktopRootWindowHostX11::InitRootWindow( 939 aura::RootWindow* DesktopRootWindowHostX11::InitRootWindow(
925 const Widget::InitParams& params) { 940 const Widget::InitParams& params) {
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
1348 } else if (IsMaximized() && restored_bounds_.IsEmpty()) { 1363 } else if (IsMaximized() && restored_bounds_.IsEmpty()) {
1349 // The request that we become maximized originated from a different 1364 // The request that we become maximized originated from a different
1350 // process. |bounds_| already contains our maximized bounds. Do a 1365 // process. |bounds_| already contains our maximized bounds. Do a
1351 // best effort attempt to get restored bounds by setting it to our 1366 // best effort attempt to get restored bounds by setting it to our
1352 // previously set bounds (and if we get this wrong, we aren't any 1367 // previously set bounds (and if we get this wrong, we aren't any
1353 // worse off since we'd otherwise be returning our maximized bounds). 1368 // worse off since we'd otherwise be returning our maximized bounds).
1354 restored_bounds_ = previous_bounds_; 1369 restored_bounds_ = previous_bounds_;
1355 } 1370 }
1356 1371
1357 is_fullscreen_ = HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN"); 1372 is_fullscreen_ = HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN");
1373 is_always_on_top_ = HasWMSpecProperty("_NET_WM_STATE_ABOVE");
1358 1374
1359 // Now that we have different window properties, we may need to 1375 // Now that we have different window properties, we may need to
1360 // relayout the window. (The windows code doesn't need this because 1376 // relayout the window. (The windows code doesn't need this because
1361 // their window change is synchronous.) 1377 // their window change is synchronous.)
1362 // 1378 //
1363 // TODO(erg): While this does work, there's a quick flash showing the 1379 // TODO(erg): While this does work, there's a quick flash showing the
1364 // tabstrip/toolbar/etc. when going into fullscreen mode before hiding 1380 // tabstrip/toolbar/etc. when going into fullscreen mode before hiding
1365 // those parts of the UI because we receive the sizing event from the 1381 // those parts of the UI because we receive the sizing event from the
1366 // window manager before we receive the event that changes the 1382 // window manager before we receive the event that changes the
1367 // fullscreen state. Unsure what to do about that. 1383 // fullscreen state. Unsure what to do about that.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1403 if (linux_ui) { 1419 if (linux_ui) {
1404 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(); 1420 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme();
1405 if (native_theme) 1421 if (native_theme)
1406 return native_theme; 1422 return native_theme;
1407 } 1423 }
1408 1424
1409 return ui::NativeTheme::instance(); 1425 return ui::NativeTheme::instance();
1410 } 1426 }
1411 1427
1412 } // namespace views 1428 } // namespace views
OLDNEW
« no previous file with comments | « ui/views/widget/desktop_aura/desktop_root_window_host_x11.h ('k') | ui/views/widget/native_widget_aura.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698