summaryrefslogtreecommitdiffstats
path: root/chrome/common
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/common')
-rw-r--r--chrome/common/x11_util.cc30
-rw-r--r--chrome/common/x11_util.h95
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_