Chromium Code Reviews| 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 // This file defines utility functions for X11 (Linux only). This code has been | 5 // This file defines utility functions for X11 (Linux only). This code has been |
| 6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support | 6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support |
| 7 // remains woefully incomplete. | 7 // remains woefully incomplete. |
| 8 | 8 |
| 9 #include "ui/base/x/x11_util.h" | 9 #include "ui/base/x/x11_util.h" |
| 10 | 10 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 max_length, // max length to get | 95 max_length, // max length to get |
| 96 False, // deleted | 96 False, // deleted |
| 97 AnyPropertyType, | 97 AnyPropertyType, |
| 98 type, | 98 type, |
| 99 format, | 99 format, |
| 100 num_items, | 100 num_items, |
| 101 &remaining_bytes, | 101 &remaining_bytes, |
| 102 property); | 102 property); |
| 103 } | 103 } |
| 104 | 104 |
| 105 bool SupportsEWMH() { | |
| 106 static bool supports_ewmh = false; | |
| 107 static bool supports_ewmh_cached = false; | |
|
Daniel Erat
2014/09/23 15:32:41
i was going to say that i'm not sure how i feel ab
| |
| 108 if (!supports_ewmh_cached) { | |
| 109 supports_ewmh_cached = true; | |
| 110 | |
| 111 int wm_window = 0u; | |
| 112 if (!GetIntProperty(GetX11RootWindow(), | |
| 113 "_NET_SUPPORTING_WM_CHECK", | |
| 114 &wm_window)) { | |
| 115 supports_ewmh = false; | |
| 116 return false; | |
| 117 } | |
| 118 | |
| 119 // It's possible that a window manager started earlier in this X session | |
| 120 // left a stale _NET_SUPPORTING_WM_CHECK property when it was replaced by a | |
| 121 // non-EWMH window manager, so we trap errors in the following requests to | |
| 122 // avoid crashes (issue 23860). | |
| 123 | |
| 124 // EWMH requires the supporting-WM window to also have a | |
| 125 // _NET_SUPPORTING_WM_CHECK property pointing to itself (to avoid a stale | |
| 126 // property referencing an ID that's been recycled for another window), so | |
| 127 // we check that too. | |
| 128 gfx::X11ErrorTracker err_tracker; | |
| 129 int wm_window_property = 0; | |
| 130 bool result = GetIntProperty( | |
| 131 wm_window, "_NET_SUPPORTING_WM_CHECK", &wm_window_property); | |
| 132 supports_ewmh = !err_tracker.FoundNewError() && | |
| 133 result && | |
| 134 wm_window_property == wm_window; | |
| 135 } | |
| 136 | |
| 137 return supports_ewmh; | |
| 138 } | |
| 139 | |
| 105 bool GetWindowManagerName(std::string* wm_name) { | 140 bool GetWindowManagerName(std::string* wm_name) { |
| 106 DCHECK(wm_name); | 141 DCHECK(wm_name); |
| 142 if (!SupportsEWMH()) | |
| 143 return false; | |
| 144 | |
| 107 int wm_window = 0; | 145 int wm_window = 0; |
| 108 if (!GetIntProperty(GetX11RootWindow(), | 146 if (!GetIntProperty(GetX11RootWindow(), |
| 109 "_NET_SUPPORTING_WM_CHECK", | 147 "_NET_SUPPORTING_WM_CHECK", |
| 110 &wm_window)) { | 148 &wm_window)) { |
| 111 return false; | 149 return false; |
| 112 } | 150 } |
| 113 | 151 |
| 114 // It's possible that a window manager started earlier in this X session left | |
| 115 // a stale _NET_SUPPORTING_WM_CHECK property when it was replaced by a | |
| 116 // non-EWMH window manager, so we trap errors in the following requests to | |
| 117 // avoid crashes (issue 23860). | |
| 118 | |
| 119 // EWMH requires the supporting-WM window to also have a | |
| 120 // _NET_SUPPORTING_WM_CHECK property pointing to itself (to avoid a stale | |
| 121 // property referencing an ID that's been recycled for another window), so we | |
| 122 // check that too. | |
| 123 gfx::X11ErrorTracker err_tracker; | 152 gfx::X11ErrorTracker err_tracker; |
| 124 int wm_window_property = 0; | 153 bool result = GetStringProperty( |
| 125 bool result = GetIntProperty( | |
| 126 wm_window, "_NET_SUPPORTING_WM_CHECK", &wm_window_property); | |
| 127 if (err_tracker.FoundNewError() || !result || | |
| 128 wm_window_property != wm_window) { | |
| 129 return false; | |
| 130 } | |
| 131 | |
| 132 result = GetStringProperty( | |
| 133 static_cast<XID>(wm_window), "_NET_WM_NAME", wm_name); | 154 static_cast<XID>(wm_window), "_NET_WM_NAME", wm_name); |
| 134 return !err_tracker.FoundNewError() && result; | 155 return !err_tracker.FoundNewError() && result; |
| 135 } | 156 } |
| 136 | 157 |
| 137 // A process wide singleton that manages the usage of X cursors. | 158 // A process wide singleton that manages the usage of X cursors. |
| 138 class XCursorCache { | 159 class XCursorCache { |
| 139 public: | 160 public: |
| 140 XCursorCache() {} | 161 XCursorCache() {} |
| 141 ~XCursorCache() { | 162 ~XCursorCache() { |
| 142 Clear(); | 163 Clear(); |
| (...skipping 1128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1271 // TODO(erg): Actually doing this correctly would require pulling out xrandr, | 1292 // TODO(erg): Actually doing this correctly would require pulling out xrandr, |
| 1272 // which we don't even do in the desktop screen yet. | 1293 // which we don't even do in the desktop screen yet. |
| 1273 ::XDisplay* display = gfx::GetXDisplay(); | 1294 ::XDisplay* display = gfx::GetXDisplay(); |
| 1274 ::Screen* screen = DefaultScreenOfDisplay(display); | 1295 ::Screen* screen = DefaultScreenOfDisplay(display); |
| 1275 int width = WidthOfScreen(screen); | 1296 int width = WidthOfScreen(screen); |
| 1276 int height = HeightOfScreen(screen); | 1297 int height = HeightOfScreen(screen); |
| 1277 return window_rect.size() == gfx::Size(width, height); | 1298 return window_rect.size() == gfx::Size(width, height); |
| 1278 } | 1299 } |
| 1279 | 1300 |
| 1280 bool WmSupportsHint(XAtom atom) { | 1301 bool WmSupportsHint(XAtom atom) { |
| 1302 if (!SupportsEWMH()) | |
| 1303 return false; | |
| 1304 | |
| 1281 std::vector<XAtom> supported_atoms; | 1305 std::vector<XAtom> supported_atoms; |
| 1282 if (!GetAtomArrayProperty(GetX11RootWindow(), | 1306 if (!GetAtomArrayProperty(GetX11RootWindow(), |
| 1283 "_NET_SUPPORTED", | 1307 "_NET_SUPPORTED", |
| 1284 &supported_atoms)) { | 1308 &supported_atoms)) { |
| 1285 return false; | 1309 return false; |
| 1286 } | 1310 } |
| 1287 | 1311 |
| 1288 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != | 1312 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != |
| 1289 supported_atoms.end(); | 1313 supported_atoms.end(); |
| 1290 } | 1314 } |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1434 << "request_code " << static_cast<int>(error_event.request_code) << ", " | 1458 << "request_code " << static_cast<int>(error_event.request_code) << ", " |
| 1435 << "minor_code " << static_cast<int>(error_event.minor_code) | 1459 << "minor_code " << static_cast<int>(error_event.minor_code) |
| 1436 << " (" << request_str << ")"; | 1460 << " (" << request_str << ")"; |
| 1437 } | 1461 } |
| 1438 | 1462 |
| 1439 // ---------------------------------------------------------------------------- | 1463 // ---------------------------------------------------------------------------- |
| 1440 // End of x11_util_internal.h | 1464 // End of x11_util_internal.h |
| 1441 | 1465 |
| 1442 | 1466 |
| 1443 } // namespace ui | 1467 } // namespace ui |
| OLD | NEW |