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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 65 |
66 DEFINE_WINDOW_PROPERTY_KEY( | 66 DEFINE_WINDOW_PROPERTY_KEY( |
67 DesktopWindowTreeHostX11*, kHostForRootWindow, NULL); | 67 DesktopWindowTreeHostX11*, kHostForRootWindow, NULL); |
68 | 68 |
69 namespace { | 69 namespace { |
70 | 70 |
71 // Constants that are part of EWMH. | 71 // Constants that are part of EWMH. |
72 const int k_NET_WM_STATE_ADD = 1; | 72 const int k_NET_WM_STATE_ADD = 1; |
73 const int k_NET_WM_STATE_REMOVE = 0; | 73 const int k_NET_WM_STATE_REMOVE = 0; |
74 | 74 |
| 75 // Special value of the _NET_WM_DESKTOP property which indicates that the window |
| 76 // should appear on all desktops. |
| 77 const int kAllDesktops = 0xFFFFFFFF; |
| 78 |
75 const char* kAtomsToCache[] = { | 79 const char* kAtomsToCache[] = { |
76 "UTF8_STRING", | 80 "UTF8_STRING", |
77 "WM_DELETE_WINDOW", | 81 "WM_DELETE_WINDOW", |
78 "WM_PROTOCOLS", | 82 "WM_PROTOCOLS", |
79 "_NET_FRAME_EXTENTS", | 83 "_NET_FRAME_EXTENTS", |
80 "_NET_WM_CM_S0", | 84 "_NET_WM_CM_S0", |
| 85 "_NET_WM_DESKTOP", |
81 "_NET_WM_ICON", | 86 "_NET_WM_ICON", |
82 "_NET_WM_NAME", | 87 "_NET_WM_NAME", |
83 "_NET_WM_PID", | 88 "_NET_WM_PID", |
84 "_NET_WM_PING", | 89 "_NET_WM_PING", |
85 "_NET_WM_STATE", | 90 "_NET_WM_STATE", |
86 "_NET_WM_STATE_ABOVE", | 91 "_NET_WM_STATE_ABOVE", |
87 "_NET_WM_STATE_FULLSCREEN", | 92 "_NET_WM_STATE_FULLSCREEN", |
88 "_NET_WM_STATE_HIDDEN", | 93 "_NET_WM_STATE_HIDDEN", |
89 "_NET_WM_STATE_MAXIMIZED_HORZ", | 94 "_NET_WM_STATE_MAXIMIZED_HORZ", |
90 "_NET_WM_STATE_MAXIMIZED_VERT", | 95 "_NET_WM_STATE_MAXIMIZED_VERT", |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 } | 557 } |
553 | 558 |
554 bool DesktopWindowTreeHostX11::IsAlwaysOnTop() const { | 559 bool DesktopWindowTreeHostX11::IsAlwaysOnTop() const { |
555 return is_always_on_top_; | 560 return is_always_on_top_; |
556 } | 561 } |
557 | 562 |
558 void DesktopWindowTreeHostX11::SetVisibleOnAllWorkspaces(bool always_visible) { | 563 void DesktopWindowTreeHostX11::SetVisibleOnAllWorkspaces(bool always_visible) { |
559 SetWMSpecState(always_visible, | 564 SetWMSpecState(always_visible, |
560 atom_cache_.GetAtom("_NET_WM_STATE_STICKY"), | 565 atom_cache_.GetAtom("_NET_WM_STATE_STICKY"), |
561 None); | 566 None); |
| 567 |
| 568 int new_desktop = 0; |
| 569 if (always_visible) { |
| 570 new_desktop = kAllDesktops; |
| 571 } else { |
| 572 if (!ui::GetCurrentDesktop(&new_desktop)) |
| 573 return; |
| 574 } |
| 575 |
| 576 XEvent xevent; |
| 577 memset (&xevent, 0, sizeof (xevent)); |
| 578 xevent.type = ClientMessage; |
| 579 xevent.xclient.window = xwindow_; |
| 580 xevent.xclient.message_type = atom_cache_.GetAtom("_NET_WM_DESKTOP"); |
| 581 xevent.xclient.format = 32; |
| 582 xevent.xclient.data.l[0] = new_desktop; |
| 583 xevent.xclient.data.l[1] = 0; |
| 584 xevent.xclient.data.l[2] = 0; |
| 585 xevent.xclient.data.l[3] = 0; |
| 586 xevent.xclient.data.l[4] = 0; |
| 587 XSendEvent(xdisplay_, x_root_window_, False, |
| 588 SubstructureRedirectMask | SubstructureNotifyMask, |
| 589 &xevent); |
562 } | 590 } |
563 | 591 |
564 bool DesktopWindowTreeHostX11::SetWindowTitle(const base::string16& title) { | 592 bool DesktopWindowTreeHostX11::SetWindowTitle(const base::string16& title) { |
565 if (window_title_ == title) | 593 if (window_title_ == title) |
566 return false; | 594 return false; |
567 window_title_ = title; | 595 window_title_ = title; |
568 std::string utf8str = base::UTF16ToUTF8(title); | 596 std::string utf8str = base::UTF16ToUTF8(title); |
569 XChangeProperty(xdisplay_, | 597 XChangeProperty(xdisplay_, |
570 xwindow_, | 598 xwindow_, |
571 atom_cache_.GetAtom("_NET_WM_NAME"), | 599 atom_cache_.GetAtom("_NET_WM_NAME"), |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 state_atom_list.push_back( | 1099 state_atom_list.push_back( |
1072 atom_cache_.GetAtom("_NET_WM_STATE_SKIP_TASKBAR")); | 1100 atom_cache_.GetAtom("_NET_WM_STATE_SKIP_TASKBAR")); |
1073 } | 1101 } |
1074 | 1102 |
1075 // If the window should stay on top of other windows, add the | 1103 // If the window should stay on top of other windows, add the |
1076 // _NET_WM_STATE_ABOVE property. | 1104 // _NET_WM_STATE_ABOVE property. |
1077 is_always_on_top_ = params.keep_on_top; | 1105 is_always_on_top_ = params.keep_on_top; |
1078 if (is_always_on_top_) | 1106 if (is_always_on_top_) |
1079 state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_ABOVE")); | 1107 state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_ABOVE")); |
1080 | 1108 |
1081 if (params.visible_on_all_workspaces) | 1109 if (params.visible_on_all_workspaces) { |
1082 state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_STICKY")); | 1110 state_atom_list.push_back(atom_cache_.GetAtom("_NET_WM_STATE_STICKY")); |
| 1111 ui::SetIntProperty(xwindow_, "_NET_WM_DESKTOP", "CARDINAL", kAllDesktops); |
| 1112 } |
1083 | 1113 |
1084 // Setting _NET_WM_STATE by sending a message to the root_window (with | 1114 // Setting _NET_WM_STATE by sending a message to the root_window (with |
1085 // SetWMSpecState) has no effect here since the window has not yet been | 1115 // SetWMSpecState) has no effect here since the window has not yet been |
1086 // mapped. So we manually change the state. | 1116 // mapped. So we manually change the state. |
1087 if (!state_atom_list.empty()) { | 1117 if (!state_atom_list.empty()) { |
1088 ui::SetAtomArrayProperty(xwindow_, | 1118 ui::SetAtomArrayProperty(xwindow_, |
1089 "_NET_WM_STATE", | 1119 "_NET_WM_STATE", |
1090 "ATOM", | 1120 "ATOM", |
1091 state_atom_list); | 1121 state_atom_list); |
1092 } | 1122 } |
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1738 if (linux_ui) { | 1768 if (linux_ui) { |
1739 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); | 1769 ui::NativeTheme* native_theme = linux_ui->GetNativeTheme(window); |
1740 if (native_theme) | 1770 if (native_theme) |
1741 return native_theme; | 1771 return native_theme; |
1742 } | 1772 } |
1743 | 1773 |
1744 return ui::NativeTheme::instance(); | 1774 return ui::NativeTheme::instance(); |
1745 } | 1775 } |
1746 | 1776 |
1747 } // namespace views | 1777 } // namespace views |
OLD | NEW |