| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #ifndef UI_BASE_X_X11_UTIL_H_ | 5 #ifndef UI_BASE_X_X11_UTIL_H_ |
| 6 #define UI_BASE_X_X11_UTIL_H_ | 6 #define UI_BASE_X_X11_UTIL_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 // This file declares utility functions for X11 (Linux only). | 9 // This file declares utility functions for X11 (Linux only). |
| 10 // | 10 // |
| 11 // These functions do not require the Xlib headers to be included (which is why | 11 // These functions do not require the Xlib headers to be included (which is why |
| 12 // we use a void* for Visual*). The Xlib headers are highly polluting so we try | 12 // we use a void* for Visual*). The Xlib headers are highly polluting so we try |
| 13 // hard to limit their spread into the rest of the code. | 13 // hard to limit their spread into the rest of the code. |
| 14 | 14 |
| 15 #include <string> | 15 #include <string> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "base/basictypes.h" | 18 #include "base/basictypes.h" |
| 19 #include "ui/ui_api.h" |
| 19 | 20 |
| 20 typedef unsigned long Atom; | 21 typedef unsigned long Atom; |
| 21 typedef struct _GdkDrawable GdkWindow; | 22 typedef struct _GdkDrawable GdkWindow; |
| 22 typedef struct _GtkWidget GtkWidget; | 23 typedef struct _GtkWidget GtkWidget; |
| 23 typedef unsigned long XID; | 24 typedef unsigned long XID; |
| 24 typedef unsigned long XSharedMemoryId; // ShmSeg in the X headers. | 25 typedef unsigned long XSharedMemoryId; // ShmSeg in the X headers. |
| 25 typedef struct _XDisplay Display; | 26 typedef struct _XDisplay Display; |
| 26 | 27 |
| 27 namespace gfx { | 28 namespace gfx { |
| 28 class Rect; | 29 class Rect; |
| 29 } | 30 } |
| 30 | 31 |
| 31 namespace ui { | 32 namespace ui { |
| 32 | 33 |
| 33 // These functions use the GDK default display and this /must/ be called from | 34 // These functions use the GDK default display and this /must/ be called from |
| 34 // the UI thread. Thus, they don't support multiple displays. | 35 // the UI thread. Thus, they don't support multiple displays. |
| 35 | 36 |
| 36 // These functions cache their results --------------------------------- | 37 // These functions cache their results --------------------------------- |
| 37 | 38 |
| 38 // Check if there's an open connection to an X server. | 39 // Check if there's an open connection to an X server. |
| 39 bool XDisplayExists(); | 40 UI_API bool XDisplayExists(); |
| 40 // Return an X11 connection for the current, primary display. | 41 // Return an X11 connection for the current, primary display. |
| 41 Display* GetXDisplay(); | 42 UI_API Display* GetXDisplay(); |
| 42 | 43 |
| 43 // X shared memory comes in three flavors: | 44 // X shared memory comes in three flavors: |
| 44 // 1) No SHM support, | 45 // 1) No SHM support, |
| 45 // 2) SHM putimage, | 46 // 2) SHM putimage, |
| 46 // 3) SHM pixmaps + putimage. | 47 // 3) SHM pixmaps + putimage. |
| 47 enum SharedMemorySupport { | 48 enum SharedMemorySupport { |
| 48 SHARED_MEMORY_NONE, | 49 SHARED_MEMORY_NONE, |
| 49 SHARED_MEMORY_PUTIMAGE, | 50 SHARED_MEMORY_PUTIMAGE, |
| 50 SHARED_MEMORY_PIXMAP | 51 SHARED_MEMORY_PIXMAP |
| 51 }; | 52 }; |
| 52 // Return the shared memory type of our X connection. | 53 // Return the shared memory type of our X connection. |
| 53 SharedMemorySupport QuerySharedMemorySupport(Display* dpy); | 54 UI_API SharedMemorySupport QuerySharedMemorySupport(Display* dpy); |
| 54 | 55 |
| 55 // Return true iff the display supports Xrender | 56 // Return true iff the display supports Xrender |
| 56 bool QueryRenderSupport(Display* dpy); | 57 UI_API bool QueryRenderSupport(Display* dpy); |
| 57 | 58 |
| 58 // Return the default screen number for the display | 59 // Return the default screen number for the display |
| 59 int GetDefaultScreen(Display* display); | 60 int GetDefaultScreen(Display* display); |
| 60 | 61 |
| 61 // These functions do not cache their results -------------------------- | 62 // These functions do not cache their results -------------------------- |
| 62 | 63 |
| 63 // Get the X window id for the default root window | 64 // Get the X window id for the default root window |
| 64 XID GetX11RootWindow(); | 65 UI_API XID GetX11RootWindow(); |
| 65 // Returns the user's current desktop. | 66 // Returns the user's current desktop. |
| 66 bool GetCurrentDesktop(int* desktop); | 67 bool GetCurrentDesktop(int* desktop); |
| 67 // Get the X window id for the given GTK widget. | 68 // Get the X window id for the given GTK widget. |
| 68 XID GetX11WindowFromGtkWidget(GtkWidget* widget); | 69 UI_API XID GetX11WindowFromGtkWidget(GtkWidget* widget); |
| 69 XID GetX11WindowFromGdkWindow(GdkWindow* window); | 70 XID GetX11WindowFromGdkWindow(GdkWindow* window); |
| 70 // Get a Visual from the given widget. Since we don't include the Xlib | 71 // Get a Visual from the given widget. Since we don't include the Xlib |
| 71 // headers, this is returned as a void*. | 72 // headers, this is returned as a void*. |
| 72 void* GetVisualFromGtkWidget(GtkWidget* widget); | 73 UI_API void* GetVisualFromGtkWidget(GtkWidget* widget); |
| 73 // Return the number of bits-per-pixel for a pixmap of the given depth | 74 // Return the number of bits-per-pixel for a pixmap of the given depth |
| 74 int BitsPerPixelForPixmapDepth(Display* display, int depth); | 75 UI_API int BitsPerPixelForPixmapDepth(Display* display, int depth); |
| 75 // Returns true if |window| is visible. | 76 // Returns true if |window| is visible. |
| 76 bool IsWindowVisible(XID window); | 77 UI_API bool IsWindowVisible(XID window); |
| 77 // Returns the bounds of |window|. | 78 // Returns the bounds of |window|. |
| 78 bool GetWindowRect(XID window, gfx::Rect* rect); | 79 UI_API bool GetWindowRect(XID window, gfx::Rect* rect); |
| 79 // Return true if |window| has any property with |property_name|. | 80 // Return true if |window| has any property with |property_name|. |
| 80 bool PropertyExists(XID window, const std::string& property_name); | 81 UI_API bool PropertyExists(XID window, const std::string& property_name); |
| 81 // Get the value of an int, int array, atom array or string property. On | 82 // Get the value of an int, int array, atom array or string property. On |
| 82 // success, true is returned and the value is stored in |value|. | 83 // success, true is returned and the value is stored in |value|. |
| 83 bool GetIntProperty(XID window, const std::string& property_name, int* value); | 84 bool GetIntProperty(XID window, const std::string& property_name, int* value); |
| 84 bool GetIntArrayProperty(XID window, const std::string& property_name, | 85 bool GetIntArrayProperty(XID window, const std::string& property_name, |
| 85 std::vector<int>* value); | 86 std::vector<int>* value); |
| 86 bool GetAtomArrayProperty(XID window, const std::string& property_name, | 87 UI_API bool GetAtomArrayProperty(XID window, const std::string& property_name, |
| 87 std::vector<Atom>* value); | 88 std::vector<Atom>* value); |
| 88 bool GetStringProperty( | 89 UI_API bool GetStringProperty( |
| 89 XID window, const std::string& property_name, std::string* value); | 90 XID window, const std::string& property_name, std::string* value); |
| 90 | 91 |
| 91 // Get |window|'s parent window, or None if |window| is the root window. | 92 // Get |window|'s parent window, or None if |window| is the root window. |
| 92 XID GetParentWindow(XID window); | 93 XID GetParentWindow(XID window); |
| 93 | 94 |
| 94 // Walk up |window|'s hierarchy until we find a direct child of |root|. | 95 // Walk up |window|'s hierarchy until we find a direct child of |root|. |
| 95 XID GetHighestAncestorWindow(XID window, XID root); | 96 XID GetHighestAncestorWindow(XID window, XID root); |
| 96 | 97 |
| 97 static const int kAllDesktops = -1; | 98 static const int kAllDesktops = -1; |
| 98 // Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if | 99 // Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if |
| 99 // property not found. | 100 // property not found. |
| 100 bool GetWindowDesktop(XID window, int* desktop); | 101 bool GetWindowDesktop(XID window, int* desktop); |
| 101 | 102 |
| 102 // Implementers of this interface receive a notification for every X window of | 103 // Implementers of this interface receive a notification for every X window of |
| 103 // the main display. | 104 // the main display. |
| 104 class EnumerateWindowsDelegate { | 105 class EnumerateWindowsDelegate { |
| 105 public: | 106 public: |
| 106 // |xid| is the X Window ID of the enumerated window. Return true to stop | 107 // |xid| is the X Window ID of the enumerated window. Return true to stop |
| 107 // further iteration. | 108 // further iteration. |
| 108 virtual bool ShouldStopIterating(XID xid) = 0; | 109 virtual bool ShouldStopIterating(XID xid) = 0; |
| 109 | 110 |
| 110 protected: | 111 protected: |
| 111 virtual ~EnumerateWindowsDelegate() {} | 112 virtual ~EnumerateWindowsDelegate() {} |
| 112 }; | 113 }; |
| 113 | 114 |
| 114 // Enumerates all windows in the current display. Will recurse into child | 115 // Enumerates all windows in the current display. Will recurse into child |
| 115 // windows up to a depth of |max_depth|. | 116 // windows up to a depth of |max_depth|. |
| 116 bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate, int max_depth); | 117 UI_API bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate, |
| 118 int max_depth); |
| 117 | 119 |
| 118 // Returns all children windows of a given window in top-to-bottom stacking | 120 // Returns all children windows of a given window in top-to-bottom stacking |
| 119 // order. | 121 // order. |
| 120 bool GetXWindowStack(XID window, std::vector<XID>* windows); | 122 UI_API bool GetXWindowStack(XID window, std::vector<XID>* windows); |
| 121 | 123 |
| 122 // Restack a window in relation to one of its siblings. If |above| is true, | 124 // Restack a window in relation to one of its siblings. If |above| is true, |
| 123 // |window| will be stacked directly above |sibling|; otherwise it will stacked | 125 // |window| will be stacked directly above |sibling|; otherwise it will stacked |
| 124 // directly below it. Both windows must be immediate children of the same | 126 // directly below it. Both windows must be immediate children of the same |
| 125 // window. | 127 // window. |
| 126 void RestackWindow(XID window, XID sibling, bool above); | 128 void RestackWindow(XID window, XID sibling, bool above); |
| 127 | 129 |
| 128 // Return a handle to a X ShmSeg. |shared_memory_key| is a SysV | 130 // Return a handle to a X ShmSeg. |shared_memory_key| is a SysV |
| 129 // IPC key. The shared memory region must contain 32-bit pixels. | 131 // IPC key. The shared memory region must contain 32-bit pixels. |
| 130 XSharedMemoryId AttachSharedMemory(Display* display, int shared_memory_support); | 132 UI_API XSharedMemoryId AttachSharedMemory(Display* display, |
| 131 void DetachSharedMemory(Display* display, XSharedMemoryId shmseg); | 133 int shared_memory_support); |
| 134 UI_API void DetachSharedMemory(Display* display, XSharedMemoryId shmseg); |
| 132 | 135 |
| 133 // Return a handle to an XRender picture where |pixmap| is a handle to a | 136 // Return a handle to an XRender picture where |pixmap| is a handle to a |
| 134 // pixmap containing Skia ARGB data. | 137 // pixmap containing Skia ARGB data. |
| 135 XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap); | 138 UI_API XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap); |
| 136 | 139 |
| 137 // Draws ARGB data on the given pixmap using the given GC, converting to the | 140 // Draws ARGB data on the given pixmap using the given GC, converting to the |
| 138 // server side visual depth as needed. Destination is assumed to be the same | 141 // server side visual depth as needed. Destination is assumed to be the same |
| 139 // dimensions as |data| or larger. |data| is also assumed to be in row order | 142 // dimensions as |data| or larger. |data| is also assumed to be in row order |
| 140 // with each line being exactly |width| * 4 bytes long. | 143 // with each line being exactly |width| * 4 bytes long. |
| 141 void PutARGBImage(Display* display, void* visual, int depth, XID pixmap, | 144 UI_API void PutARGBImage(Display* display, void* visual, int depth, XID pixmap, |
| 142 void* pixmap_gc, const uint8* data, int width, int height); | 145 void* pixmap_gc, const uint8* data, int width, |
| 146 int height); |
| 143 | 147 |
| 144 void FreePicture(Display* display, XID picture); | 148 void FreePicture(Display* display, XID picture); |
| 145 void FreePixmap(Display* display, XID pixmap); | 149 void FreePixmap(Display* display, XID pixmap); |
| 146 | 150 |
| 147 // Get the window manager name. | 151 // Get the window manager name. |
| 148 bool GetWindowManagerName(std::string* name); | 152 UI_API bool GetWindowManagerName(std::string* name); |
| 149 | 153 |
| 150 // Change desktop for |window| to the desktop of |destination| window. | 154 // Change desktop for |window| to the desktop of |destination| window. |
| 151 bool ChangeWindowDesktop(XID window, XID destination); | 155 UI_API bool ChangeWindowDesktop(XID window, XID destination); |
| 152 | 156 |
| 153 // Enable the default X error handlers. These will log the error and abort | 157 // Enable the default X error handlers. These will log the error and abort |
| 154 // the process if called. Use SetX11ErrorHandlers() from x11_util_internal.h | 158 // the process if called. Use SetX11ErrorHandlers() from x11_util_internal.h |
| 155 // to set your own error handlers. | 159 // to set your own error handlers. |
| 156 void SetDefaultX11ErrorHandlers(); | 160 UI_API void SetDefaultX11ErrorHandlers(); |
| 157 | 161 |
| 158 // Return true if a given window is in full-screen mode. | 162 // Return true if a given window is in full-screen mode. |
| 159 bool IsX11WindowFullScreen(XID window); | 163 UI_API bool IsX11WindowFullScreen(XID window); |
| 160 | 164 |
| 161 } // namespace ui | 165 } // namespace ui |
| 162 | 166 |
| 163 #endif // UI_BASE_X_X11_UTIL_H_ | 167 #endif // UI_BASE_X_X11_UTIL_H_ |
| OLD | NEW |