summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-04-15 12:29:54 +0200
committerBenjamin Otte <otte@redhat.com>2010-04-16 23:37:26 +0200
commit3f96ddad8ba528bb7ba29148505c3d69c9d25a24 (patch)
treea5aa9eafca1271bb596058e19375a3c74dd1b898
parentd5189be19786fefe9c85f34e2f8a3973ead5b67c (diff)
Make GstCairoXSource acquire the device when operating on the Display
-rw-r--r--ext/xlib/gstcairoglxsink.c2
-rw-r--r--ext/xlib/gstcairoxsink.c3
-rw-r--r--ext/xlib/gstcairoxsource.c40
-rw-r--r--ext/xlib/gstcairoxsource.h2
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);