summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-04-22 15:17:45 +0200
committerBenjamin Otte <otte@redhat.com>2010-04-22 15:17:45 +0200
commite726b14e60a34dc918afed0092672515ae916a6d (patch)
tree70b0d0c6bc55a9ff3643ec7d521627e6a059f8ec
parentc88e437582a970baa01afeef69a41cd472d62a61 (diff)
cairoxsink: rework size handling
Now the code does the right thing for embedded and native windows
-rw-r--r--ext/xlib/gstcairoxsink.c46
-rw-r--r--ext/xlib/gstcairoxtarget.c2
2 files changed, 36 insertions, 12 deletions
diff --git a/ext/xlib/gstcairoxsink.c b/ext/xlib/gstcairoxsink.c
index c93a7aa..67c6aac 100644
--- a/ext/xlib/gstcairoxsink.c
+++ b/ext/xlib/gstcairoxsink.c
@@ -139,7 +139,7 @@ gst_cairo_x_sink_xoverlay_set_xwindow_id (GstXOverlay * overlay,
if (xsink->window_id == xwindow_id)
return;
- if (xsink->window_surface &&
+ if (xsink->window_surface && xsink->window_id &&
cairo_device_acquire (xsink->device) == CAIRO_STATUS_SUCCESS) {
XSelectInput (cairo_xlib_device_get_display (xsink->device),
xsink->window_id, 0);
@@ -208,7 +208,7 @@ gst_cairo_x_sink_xoverlay_expose (GstXOverlay * overlay)
{
GstCairoXSink *xsink = GST_CAIRO_X_SINK (overlay);
- if (xsink->window_surface == NULL)
+ if (xsink->surface == NULL)
return;
gst_cairo_x_sink_paint (xsink, 0, 0,
@@ -294,11 +294,29 @@ gst_cairo_x_sink_handle_event (XEvent * event, gpointer sink)
case ConfigureNotify:
{
XConfigureEvent *configure = &event->xconfigure;
- cairo_xlib_surface_set_size (xsink->window_surface, configure->width,
- configure->height);
- if (xsink->target)
+ Window child_window;
+
+ if (xsink->surface) {
+ child_window = xsink->target->get_window_id (xsink->surface);
+ } else
+ child_window = 0;
+
+ if (configure->window == child_window) {
xsink->target->resize_window (xsink->surface, configure->width,
configure->height);
+ if (xsink->window_id == 0 && xsink->window_surface)
+ cairo_xlib_surface_set_size (xsink->window_surface, configure->width,
+ configure->height);
+ } else {
+ cairo_xlib_surface_set_size (xsink->window_surface, configure->width,
+ configure->height);
+ if (xsink->surface &&
+ cairo_device_acquire (xsink->device) == CAIRO_STATUS_SUCCESS) {
+ XResizeWindow (cairo_xlib_device_get_display (xsink->device),
+ child_window, configure->width, configure->height);
+ cairo_device_release (xsink->device);
+ }
+ }
break;
}
case ButtonPress:
@@ -416,11 +434,19 @@ gst_cairo_x_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
gst_cairo_x_sink_update_events (xsink);
}
- if (xsink->window_id == 0) {
- Display *display = cairo_xlib_surface_get_display (xsink->window_surface);
- Window window = cairo_xlib_surface_get_drawable (xsink->window_surface);
- XResizeWindow (display, window, width, height);
- XMapWindow (display, window);
+ if (cairo_device_acquire (xsink->device) == CAIRO_STATUS_SUCCESS) {
+ Display *display = cairo_xlib_device_get_display (xsink->device);
+ Window window = xsink->target->get_window_id (xsink->surface);
+ if (xsink->window_id == 0) {
+ cairo_xlib_surface_set_size (xsink->window_surface, width, height);
+ XResizeWindow (display, window, width, height);
+ XMapWindow (display, window);
+ gst_x_overlay_got_xwindow_id (GST_X_OVERLAY (xsink), window);
+ } else {
+ XMapWindow (display, window);
+ }
+
+ cairo_device_release (xsink->device);
}
gst_cairo_format_free (xsink->format);
diff --git a/ext/xlib/gstcairoxtarget.c b/ext/xlib/gstcairoxtarget.c
index bc5286f..155ce34 100644
--- a/ext/xlib/gstcairoxtarget.c
+++ b/ext/xlib/gstcairoxtarget.c
@@ -70,7 +70,6 @@ gst_cairo_x_target_xlib_create_window (cairo_surface_t * window)
cairo_xlib_surface_get_width (window),
cairo_xlib_surface_get_height (window), 0, 0, XBlackPixel (display,
DefaultScreen (display)));
- XMapWindow (display, data->window);
surface = cairo_xlib_surface_create (display, data->window,
cairo_xlib_surface_get_visual (window),
@@ -179,7 +178,6 @@ gst_cairo_x_target_gl_create_window (cairo_surface_t * window)
cairo_xlib_surface_get_height (window), 0, visual->depth, InputOutput,
visual->visual, CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask,
&win_attr);
- XMapWindow (display, data->window);
surface = cairo_gl_surface_create_for_window (glxdevice,
data->window,