diff options
author | Benjamin Otte <otte@redhat.com> | 2010-04-15 12:29:54 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-04-16 23:37:26 +0200 |
commit | 3f96ddad8ba528bb7ba29148505c3d69c9d25a24 (patch) | |
tree | a5aa9eafca1271bb596058e19375a3c74dd1b898 | |
parent | d5189be19786fefe9c85f34e2f8a3973ead5b67c (diff) |
Make GstCairoXSource acquire the device when operating on the Display
-rw-r--r-- | ext/xlib/gstcairoglxsink.c | 2 | ||||
-rw-r--r-- | ext/xlib/gstcairoxsink.c | 3 | ||||
-rw-r--r-- | ext/xlib/gstcairoxsource.c | 40 | ||||
-rw-r--r-- | ext/xlib/gstcairoxsource.h | 2 |
4 files changed, 38 insertions, 9 deletions
diff --git a/ext/xlib/gstcairoglxsink.c b/ext/xlib/gstcairoglxsink.c index f08c921..cb5ba34 100644 --- a/ext/xlib/gstcairoglxsink.c +++ b/ext/xlib/gstcairoglxsink.c @@ -203,7 +203,7 @@ gst_cairo_glx_sink_run (gpointer sink) | ButtonReleaseMask | KeyPressMask | KeyReleaseMask); source = - gst_cairo_x_source_new (xsink->display, + gst_cairo_x_source_new (xsink->display, xsink->device, gst_cairo_glx_sink_handle_event, xsink); g_source_attach (source, xsink->context); g_source_unref (source); diff --git a/ext/xlib/gstcairoxsink.c b/ext/xlib/gstcairoxsink.c index d01047e..dd691b1 100644 --- a/ext/xlib/gstcairoxsink.c +++ b/ext/xlib/gstcairoxsink.c @@ -197,7 +197,8 @@ gst_cairo_x_sink_run (gpointer sink) source = gst_cairo_x_source_new (xsink->display, - gst_cairo_x_sink_handle_event, xsink); + cairo_surface_get_device (xsink->window), gst_cairo_x_sink_handle_event, + xsink); g_source_attach (source, xsink->context); g_source_unref (source); g_main_loop_run (xsink->loop); diff --git a/ext/xlib/gstcairoxsource.c b/ext/xlib/gstcairoxsource.c index 6404c56..1cc36e9 100644 --- a/ext/xlib/gstcairoxsource.c +++ b/ext/xlib/gstcairoxsource.c @@ -29,6 +29,7 @@ struct _GstCairoXSource GSource source; Display *display; + cairo_device_t *device; GPollFD event_poll_fd; }; @@ -36,20 +37,33 @@ static gboolean gst_cairo_x_source_prepare (GSource * source, gint * timeout) { GstCairoXSource *xsource = (GstCairoXSource *) source; + gboolean result; *timeout = -1; - return XPending (xsource->display); + + if (cairo_device_acquire (xsource->device) != CAIRO_STATUS_SUCCESS) + return FALSE; + result = XPending (xsource->display); + cairo_device_release (xsource->device); + + return result; } static gboolean gst_cairo_x_source_check (GSource * source) { GstCairoXSource *xsource = (GstCairoXSource *) source; + gboolean result; if (!(xsource->event_poll_fd.revents & G_IO_IN)) return FALSE; - return XPending (xsource->display); + if (cairo_device_acquire (xsource->device) != CAIRO_STATUS_SUCCESS) + return FALSE; + result = XPending (xsource->display); + cairo_device_release (xsource->device); + + return result; } static gboolean @@ -60,30 +74,42 @@ gst_cairo_x_source_dispatch (GSource * source, GSourceFunc callback, GstCairoXEventFunc handler = (GstCairoXEventFunc) callback; XEvent event; - XNextEvent (xsource->display, &event); - if (!handler) return FALSE; + if (cairo_device_acquire (xsource->device) != CAIRO_STATUS_SUCCESS) + return FALSE; + XNextEvent (xsource->display, &event); + cairo_device_release (xsource->device); + return handler (&event, data); } +static void +gst_cairo_x_source_finalize (GSource * source) +{ + GstCairoXSource *xsource = (GstCairoXSource *) source; + + cairo_device_destroy (xsource->device); +} + static GSourceFuncs gst_cairo_x_source_funcs = { gst_cairo_x_source_prepare, gst_cairo_x_source_check, gst_cairo_x_source_dispatch, - NULL + gst_cairo_x_source_finalize, }; GSource * -gst_cairo_x_source_new (Display * display, GstCairoXEventFunc func, - gpointer data) +gst_cairo_x_source_new (Display * display, cairo_device_t * device, + GstCairoXEventFunc func, gpointer data) { GSource *source = g_source_new (&gst_cairo_x_source_funcs, sizeof (GstCairoXSource)); GstCairoXSource *xsource = (GstCairoXSource *) source; xsource->display = display; + xsource->device = cairo_device_reference (device); if (func) g_source_set_callback (source, (GSourceFunc) func, data, NULL); diff --git a/ext/xlib/gstcairoxsource.h b/ext/xlib/gstcairoxsource.h index 04a5a87..1676bab 100644 --- a/ext/xlib/gstcairoxsource.h +++ b/ext/xlib/gstcairoxsource.h @@ -21,6 +21,7 @@ #define __GST_CAIRO_X_SOURCE_H__ #include <glib.h> +#include <cairo.h> #include <X11/Xlib.h> G_BEGIN_DECLS @@ -28,6 +29,7 @@ G_BEGIN_DECLS typedef gboolean (* GstCairoXEventFunc) (XEvent *event, gpointer data); GSource * gst_cairo_x_source_new (Display * display, + cairo_device_t * device, GstCairoXEventFunc func, gpointer data); |