diff options
-rw-r--r-- | ext/xlib/gstcairoxsink.c | 46 | ||||
-rw-r--r-- | ext/xlib/gstcairoxtarget.c | 2 |
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, |