summaryrefslogtreecommitdiff
path: root/src/cairo-xlib-display.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2009-09-01 23:12:43 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2009-09-01 23:12:43 +0100
commit7d1eb259f93d3f2f2e754b2b8b90cb88359b477d (patch)
treeb608289649a97f6d0088246c1e09abb9fc1ad17b /src/cairo-xlib-display.c
parentb8ddd66cf6e0d16383580c3c3398343f577b89fd (diff)
downloadcairo-7d1eb259f93d3f2f2e754b2b8b90cb88359b477d.tar.gz
[xlib] Make xlib_display_t private and rename xlib_screen_info_t
The issue Joonas was trying to solve was the unwanted inclusion of the inlines via cairo-freelist-private.h. Unwittingly he included cairoint.h from cairo-xlib-private.h instead, a far more heinous crime as that causes the boilerplate to try to use the hidden, private symbols. Instead we resolve this issue by making the cairo_xlib_display_t structure private to cairo-xlib-display.c and provide functions to manipulate the abstract data type. Whilst in the vicinity, we rename cairo_xlib_screen_info_t to cairo_xlib_screen_t for consistency and cleanliness.
Diffstat (limited to 'src/cairo-xlib-display.c')
-rw-r--r--src/cairo-xlib-display.c126
1 files changed, 121 insertions, 5 deletions
diff --git a/src/cairo-xlib-display.c b/src/cairo-xlib-display.c
index d05bfedd7..0c0ce61c8 100644
--- a/src/cairo-xlib-display.c
+++ b/src/cairo-xlib-display.c
@@ -38,8 +38,32 @@
#include "cairo-xlib-private.h"
#include "cairo-xlib-xrender-private.h"
+#include "cairo-freelist-private.h"
+
#include <X11/Xlibint.h> /* For XESetCloseDisplay */
+struct _cairo_xlib_display {
+ cairo_xlib_display_t *next;
+ cairo_reference_count_t ref_count;
+ cairo_mutex_t mutex;
+
+ Display *display;
+ cairo_xlib_screen_t *screens;
+
+ int render_major;
+ int render_minor;
+ XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_A1 + 1];
+
+ cairo_xlib_job_t *workqueue;
+ cairo_freelist_t wq_freelist;
+
+ cairo_xlib_hook_t *close_display_hooks;
+ unsigned int buggy_gradients :1;
+ unsigned int buggy_pad_reflect :1;
+ unsigned int buggy_repeat :1;
+ unsigned int closed :1;
+};
+
typedef int (*cairo_xlib_error_func_t) (Display *display,
XErrorEvent *event);
@@ -71,14 +95,14 @@ _cairo_xlib_remove_close_display_hook_internal (cairo_xlib_display_t *display,
static void
_cairo_xlib_call_close_display_hooks (cairo_xlib_display_t *display)
{
- cairo_xlib_screen_info_t *screen;
+ cairo_xlib_screen_t *screen;
cairo_xlib_hook_t *hook;
/* call all registered shutdown routines */
CAIRO_MUTEX_LOCK (display->mutex);
for (screen = display->screens; screen != NULL; screen = screen->next)
- _cairo_xlib_screen_info_close_display (screen);
+ _cairo_xlib_screen_close_display (screen);
while (TRUE) {
hook = display->close_display_hooks;
@@ -99,7 +123,7 @@ _cairo_xlib_call_close_display_hooks (cairo_xlib_display_t *display)
static void
_cairo_xlib_display_discard_screens (cairo_xlib_display_t *display)
{
- cairo_xlib_screen_info_t *screens;
+ cairo_xlib_screen_t *screens;
CAIRO_MUTEX_LOCK (display->mutex);
screens = display->screens;
@@ -107,10 +131,10 @@ _cairo_xlib_display_discard_screens (cairo_xlib_display_t *display)
CAIRO_MUTEX_UNLOCK (display->mutex);
while (screens != NULL) {
- cairo_xlib_screen_info_t *screen = screens;
+ cairo_xlib_screen_t *screen = screens;
screens = screen->next;
- _cairo_xlib_screen_info_destroy (screen);
+ _cairo_xlib_screen_destroy (screen);
}
}
@@ -559,3 +583,95 @@ _cairo_xlib_display_get_xrender_format (cairo_xlib_display_t *display,
return xrender_format;
}
+
+Display *
+_cairo_xlib_display_get_dpy (cairo_xlib_display_t *display)
+{
+ return display->display;
+}
+
+void
+_cairo_xlib_display_remove_screen (cairo_xlib_display_t *display,
+ cairo_xlib_screen_t *screen)
+{
+ cairo_xlib_screen_t **prev;
+ cairo_xlib_screen_t *list;
+
+ CAIRO_MUTEX_LOCK (display->mutex);
+ for (prev = &display->screens; (list = *prev); prev = &list->next) {
+ if (list == screen) {
+ *prev = screen->next;
+ break;
+ }
+ }
+ CAIRO_MUTEX_UNLOCK (display->mutex);
+}
+
+cairo_status_t
+_cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
+ Screen *screen,
+ cairo_xlib_screen_t **out)
+{
+ cairo_xlib_screen_t *info = NULL, **prev;
+
+ CAIRO_MUTEX_LOCK (display->mutex);
+ if (display->closed) {
+ CAIRO_MUTEX_UNLOCK (display->mutex);
+ return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED);
+ }
+
+ for (prev = &display->screens; (info = *prev); prev = &(*prev)->next) {
+ if (info->screen == screen) {
+ /*
+ * MRU the list
+ */
+ if (prev != &display->screens) {
+ *prev = info->next;
+ info->next = display->screens;
+ display->screens = info;
+ }
+ break;
+ }
+ }
+ CAIRO_MUTEX_UNLOCK (display->mutex);
+
+ *out = info;
+ return CAIRO_STATUS_SUCCESS;
+}
+
+
+void
+_cairo_xlib_display_add_screen (cairo_xlib_display_t *display,
+ cairo_xlib_screen_t *screen)
+{
+ CAIRO_MUTEX_LOCK (display->mutex);
+ screen->next = display->screens;
+ display->screens = screen;
+ CAIRO_MUTEX_UNLOCK (display->mutex);
+}
+
+void
+_cairo_xlib_display_get_xrender_version (cairo_xlib_display_t *display,
+ int *major, int *minor)
+{
+ *major = display->render_major;
+ *minor = display->render_minor;
+}
+
+cairo_bool_t
+_cairo_xlib_display_has_repeat (cairo_xlib_display_t *display)
+{
+ return ! display->buggy_repeat;
+}
+
+cairo_bool_t
+_cairo_xlib_display_has_reflect (cairo_xlib_display_t *display)
+{
+ return ! display->buggy_pad_reflect;
+}
+
+cairo_bool_t
+_cairo_xlib_display_has_gradients (cairo_xlib_display_t *display)
+{
+ return ! display->buggy_gradients;
+}