| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/browser/renderer_host/gtk_window_utils.h" | |
| 6 | |
| 7 #include <X11/Xlib.h> | |
| 8 #include <gdk/gdkx.h> | |
| 9 #include <gtk/gtk.h> | |
| 10 | |
| 11 #include <vector> | |
| 12 | |
| 13 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | |
| 14 #include "ui/base/x/x11_util.h" | |
| 15 #include "ui/gfx/gtk_compat.h" | |
| 16 #include "ui/gfx/rect.h" | |
| 17 #include "ui/gfx/x/x11_types.h" | |
| 18 | |
| 19 namespace content { | |
| 20 | |
| 21 namespace { | |
| 22 | |
| 23 // Returns the region of |window|'s desktop that isn't occupied by docks or | |
| 24 // panels. Returns an empty rect on failure. | |
| 25 gfx::Rect GetWorkArea(Window window) { | |
| 26 Window root = ui::GetX11RootWindow(); | |
| 27 int desktop = -1; | |
| 28 if (!ui::GetIntProperty(window, "_NET_WM_DESKTOP", &desktop)) { | |
| 29 // Hack for ion3: _NET_WM_DESKTOP doesn't get set on individual windows, but | |
| 30 // _NET_CURRENT_DESKTOP and _NET_WORKAREA do get set. | |
| 31 ui::GetIntProperty(root, "_NET_CURRENT_DESKTOP", &desktop); | |
| 32 } | |
| 33 if (desktop < 0) | |
| 34 return gfx::Rect(); | |
| 35 | |
| 36 std::vector<int> property; | |
| 37 if (!ui::GetIntArrayProperty(root, "_NET_WORKAREA", &property)) | |
| 38 return gfx::Rect(); | |
| 39 | |
| 40 size_t start_index = 4 * desktop; | |
| 41 if (property.size() < start_index + 4) | |
| 42 return gfx::Rect(); | |
| 43 | |
| 44 return gfx::Rect(property[start_index], property[start_index + 1], | |
| 45 property[start_index + 2], property[start_index + 3]); | |
| 46 } | |
| 47 | |
| 48 blink::WebScreenInfo GetScreenInfo(XDisplay* display, int screenNumber) { | |
| 49 // XDisplayWidth() and XDisplayHeight() return cached values. To ensure that | |
| 50 // we return the correct dimensions after the screen is resized, query the | |
| 51 // root window's geometry each time. | |
| 52 Window root = RootWindow(display, screenNumber); | |
| 53 Window root_ret; | |
| 54 int x, y; | |
| 55 unsigned int width, height, border, depth; | |
| 56 XGetGeometry( | |
| 57 display, root, &root_ret, &x, &y, &width, &height, &border, &depth); | |
| 58 | |
| 59 blink::WebScreenInfo results; | |
| 60 results.depthPerComponent = 8; // Assume 8bpp, which is usually right. | |
| 61 results.depth = depth; | |
| 62 results.isMonochrome = depth == 1; | |
| 63 results.rect = blink::WebRect(x, y, width, height); | |
| 64 results.availableRect = results.rect; | |
| 65 return results; | |
| 66 } | |
| 67 | |
| 68 } // namespace | |
| 69 | |
| 70 void GetScreenInfoFromNativeWindow( | |
| 71 GdkWindow* gdk_window, blink::WebScreenInfo* results) { | |
| 72 GdkScreen* screen = gdk_window_get_screen(gdk_window); | |
| 73 *results = GetScreenInfo(gdk_x11_drawable_get_xdisplay(gdk_window), | |
| 74 gdk_x11_screen_get_screen_number(screen)); | |
| 75 | |
| 76 int monitor_number = gdk_screen_get_monitor_at_window(screen, gdk_window); | |
| 77 GdkRectangle monitor_rect; | |
| 78 gdk_screen_get_monitor_geometry(screen, monitor_number, &monitor_rect); | |
| 79 results->rect = blink::WebRect(monitor_rect.x, monitor_rect.y, | |
| 80 monitor_rect.width, monitor_rect.height); | |
| 81 | |
| 82 gfx::Rect available_rect = results->rect; | |
| 83 gfx::Rect work_area = GetWorkArea(GDK_WINDOW_XID(gdk_window)); | |
| 84 if (!work_area.IsEmpty()) | |
| 85 available_rect.Intersect(work_area); | |
| 86 results->availableRect = available_rect; | |
| 87 } | |
| 88 | |
| 89 } // namespace content | |
| OLD | NEW |