diff options
Diffstat (limited to 'chrome/common')
-rw-r--r-- | chrome/common/x11_util.cc | 30 | ||||
-rw-r--r-- | chrome/common/x11_util.h | 95 |
2 files changed, 91 insertions, 34 deletions
diff --git a/chrome/common/x11_util.cc b/chrome/common/x11_util.cc index d10c320..83fc02a 100644 --- a/chrome/common/x11_util.cc +++ b/chrome/common/x11_util.cc @@ -6,6 +6,7 @@ // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support // remains woefully incomplete. +#include "base/thread.h" #include "chrome/common/x11_util.h" #include "chrome/common/x11_util_internal.h" @@ -98,6 +99,10 @@ bool QueryRenderSupport(Display* dpy) { return render_supported; } +int GetDefaultScreen(Display* display) { + return XDefaultScreen(display); +} + XID GetX11RootWindow() { return GDK_WINDOW_XID(gdk_get_default_root_window()); } @@ -106,6 +111,10 @@ XID GetX11WindowFromGtkWidget(GtkWidget* widget) { return GDK_WINDOW_XID(widget->window); } +XID GetX11WindowFromGdkWindow(GdkWindow* window) { + return GDK_WINDOW_XID(window); +} + void* GetVisualFromGtkWidget(GtkWidget* widget) { return GDK_VISUAL_XVISUAL(gtk_widget_get_visual(widget)); } @@ -219,4 +228,25 @@ void FreePixmap(Display* display, XID pixmap) { XFreePixmap(display, pixmap); } +// Called on BACKGROUND_X11 thread. +Display* GetSecondaryDisplay() { + static Display* display = NULL; + if (!display) { + display = XOpenDisplay(NULL); + CHECK(display); + } + + return display; +} + +// Called on BACKGROUND_X11 thread. +void GetWindowGeometry(int* x, int* y, unsigned* width, unsigned* height, + XID window) { + Window root_window; + unsigned border_width, depth; + + CHECK(XGetGeometry(GetSecondaryDisplay(), window, + &root_window, x, y, width, height, &border_width, &depth)); +} + } // namespace x11_util diff --git a/chrome/common/x11_util.h b/chrome/common/x11_util.h index 4800a69..aef133f 100644 --- a/chrome/common/x11_util.h +++ b/chrome/common/x11_util.h @@ -11,48 +11,75 @@ // we use a void* for Visual*). The Xlib headers are highly polluting so we try // hard to limit their spread into the rest of the code. +typedef struct _GdkDrawable GdkWindow; typedef struct _GtkWidget GtkWidget; typedef unsigned long XID; typedef struct _XDisplay Display; +namespace base { +class Thread; +} + namespace gfx { class Size; } namespace x11_util { - // These functions cache their results and must be called from the UI thread. - // Currently they don't support multiple screens/displays. - - // Return an X11 connection for the current, primary display. - Display* GetXDisplay(); - // Return true iff the connection supports X shared memory - bool QuerySharedMemorySupport(Display* dpy); - // Return true iff the display supports Xrender - bool QueryRenderSupport(Display* dpy); - - // These functions do not cache their results - - // Get the X window id for the default root window - XID GetX11RootWindow(); - // Get the X window id for the given GTK widget. - XID GetX11WindowFromGtkWidget(GtkWidget*); - // Get a Visual from the given widget. Since we don't include the Xlib - // headers, this is returned as a void*. - void* GetVisualFromGtkWidget(GtkWidget*); - // Return the number of bits-per-pixel for a pixmap of the given depth - int BitsPerPixelForPixmapDepth(Display*, int depth); - - // Return a handle to a server side pixmap. |shared_memory_key| is a SysV - // IPC key. The shared memory region must contain 32-bit pixels. - XID AttachSharedMemory(Display* display, int shared_memory_support); - void DetachSharedMemory(Display* display, XID shmseg); - - // Return a handle to an XRender picture where |pixmap| is a handle to a - // pixmap containing Skia ARGB data. - XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap); - - void FreePicture(Display* display, XID picture); - void FreePixmap(Display* display, XID pixmap); -}; + +// These functions use the GDK default display and this /must/ be called from +// the UI thread. Thus, they don't support multiple displays. + +// These functions cache their results. + +// Return an X11 connection for the current, primary display. +Display* GetXDisplay(); +// Return true iff the connection supports X shared memory +bool QuerySharedMemorySupport(Display* dpy); +// Return true iff the display supports Xrender +bool QueryRenderSupport(Display* dpy); +// Return the default screen number for the display +int GetDefaultScreen(Display* display); + +// These functions do not cache their results + +// Get the X window id for the default root window +XID GetX11RootWindow(); +// Get the X window id for the given GTK widget. +XID GetX11WindowFromGtkWidget(GtkWidget*); +XID GetX11WindowFromGdkWindow(GdkWindow*); +// Get a Visual from the given widget. Since we don't include the Xlib +// headers, this is returned as a void*. +void* GetVisualFromGtkWidget(GtkWidget*); +// Return the number of bits-per-pixel for a pixmap of the given depth +int BitsPerPixelForPixmapDepth(Display*, int depth); + +// Return a handle to a server side pixmap. |shared_memory_key| is a SysV +// IPC key. The shared memory region must contain 32-bit pixels. +XID AttachSharedMemory(Display* display, int shared_memory_support); +void DetachSharedMemory(Display* display, XID shmseg); + +// Return a handle to an XRender picture where |pixmap| is a handle to a +// pixmap containing Skia ARGB data. +XID CreatePictureFromSkiaPixmap(Display* display, XID pixmap); + +void FreePicture(Display* display, XID picture); +void FreePixmap(Display* display, XID pixmap); + +// These functions are for performing X opertions outside of the UI thread. + +// Return the Display for the secondary X connection. We keep a second +// connection around for making X requests outside of the UI thread. +// This function may only be called from the BACKGROUND_X11 thread. +Display* GetSecondaryDisplay(); + +// Since one cannot include both WebKit header and Xlib headers in the same +// file (due to collisions), we wrap all the Xlib functions that we need here. +// These functions must be called on the BACKGROUND_X11 thread since they +// reference GetSecondaryDisplay(). + +void GetWindowGeometry(int* x, int* y, unsigned* width, unsigned* height, + XID window); + +} // namespace x11_util #endif // CHROME_COMMON_X11_UTIL_H_ |