[gst-devel] x input events processing in sinks with xoverlay interface [patch]

Stefan Kost ensonic at hora-obscura.de
Sun Dec 17 10:48:19 CET 2006


Hi Radek,

Radek Doulík wrote:
> Hi all,
>
> 	while working on gstreamer support for OpenOffice I run into problem
> where xvimagesink and ximagesink are eating keypress/keyrelease events
> in OOo embedded window (I set xwindow ID with GstXOverlay iface) and I
> am unable to receive them in OOo.
>
> 	I am attaching a patch which introduces new method
> gst_x_overlay_set_process_input in GstXOverlay interface. This method
> can be used to tell X based video sinks to not process input events. The
> patch also implements this new function in xvimage and ximage sinks.
>   
Sounds like a good idea to me, will review the patch once its in
bugzilla. We (nokia) currently hardcoded disable the input processing,
because it causes trouble in our product. Two comments now already:
* why don#t use a boolean iface property?
* shouldn't it be an instance specific setting and not class wide?

Stefan
> 	Please review my patch. Would it be possible to merge it in gstreamer?
>
> Cheers
> Radek
>
>   
> ------------------------------------------------------------------------
>
> diff -rup gst-plugins-base-0.10.5-orig/gst-libs/gst/interfaces/xoverlay.c gst-plugins-base-0.10.5/gst-libs/gst/interfaces/xoverlay.c
> --- gst-plugins-base-0.10.5-orig/gst-libs/gst/interfaces/xoverlay.c	2006-01-22 15:50:53.000000000 +0100
> +++ gst-plugins-base-0.10.5/gst-libs/gst/interfaces/xoverlay.c	2006-12-14 17:32:06.000000000 +0100
> @@ -232,3 +232,25 @@ gst_x_overlay_expose (GstXOverlay * over
>      klass->expose (overlay);
>    }
>  }
> +
> +/**
> + * gst_x_overlay_set_process_input:
> + * @overlay: a #GstXOverlay to set the process input on.
> + * @process_input: a flag enabling/disabling processing of input events.
> + *
> + * This will call the video overlay's set_process_input method. You should
> + * use this method to tell to a XOverlay whether you want it to process
> + * input events (such as PointerMotion, KeyPress, KeyRelease, ButtonPress,
> + * ButtonRelease events). You should call this function before setting window
> + * #XID. It will only work with window created in application and set with
> + * gst_x_overlay_set_xwindow_id, not with the window created by sinks.
> + */
> +void
> +gst_x_overlay_set_process_input (GstXOverlay * overlay, gboolean process_input)
> +{
> +  GstXOverlayClass *klass = GST_X_OVERLAY_GET_CLASS (overlay);
> +
> +  if (klass->set_process_input) {
> +    klass->set_process_input (overlay, process_input);
> +  }
> +}
> diff -rup gst-plugins-base-0.10.5-orig/gst-libs/gst/interfaces/xoverlay.h gst-plugins-base-0.10.5/gst-libs/gst/interfaces/xoverlay.h
> --- gst-plugins-base-0.10.5-orig/gst-libs/gst/interfaces/xoverlay.h	2005-12-06 20:42:00.000000000 +0100
> +++ gst-plugins-base-0.10.5/gst-libs/gst/interfaces/xoverlay.h	2006-12-14 17:21:27.000000000 +0100
> @@ -47,13 +47,16 @@ typedef struct _GstXOverlayClass {
>    GTypeInterface klass;
>  
>    /* virtual functions */
> -  void (* set_xwindow_id) (GstXOverlay *overlay,
> -                           gulong       xwindow_id);
> +  void (* set_xwindow_id)    (GstXOverlay *overlay,
> +                              gulong       xwindow_id);
>  
> -  void (* expose)         (GstXOverlay *overlay);
> +  void (* expose)            (GstXOverlay *overlay);
> +
> +  void (* set_process_input) (GstXOverlay *overlay,
> +                              gboolean process_input);
>  
>    /*< private >*/
> -  gpointer                 _gst_reserved[GST_PADDING];
> +  gpointer                   _gst_reserved[GST_PADDING];
>  } GstXOverlayClass;
>  
>  GType   gst_x_overlay_get_type          (void);
> @@ -63,6 +66,8 @@ void gst_x_overlay_set_xwindow_id     (G
>  
>  void gst_x_overlay_expose             (GstXOverlay *overlay);
>  
> +void gst_x_overlay_set_process_input  (GstXOverlay *overlay, gboolean process_input);
> +
>  /* public methods to dispatch bus messages */
>  void gst_x_overlay_got_xwindow_id     (GstXOverlay *overlay, gulong xwindow_id);
>  
> diff -rup gst-plugins-base-0.10.5-orig/sys/ximage/ximagesink.c gst-plugins-base-0.10.5/sys/ximage/ximagesink.c
> --- gst-plugins-base-0.10.5-orig/sys/ximage/ximagesink.c	2006-03-07 20:18:22.000000000 +0100
> +++ gst-plugins-base-0.10.5/sys/ximage/ximagesink.c	2006-12-14 17:46:48.000000000 +0100
> @@ -1719,8 +1719,8 @@ gst_ximagesink_set_xwindow_id (GstXOverl
>      xwindow->height = attr.height;
>      xwindow->internal = FALSE;
>      XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask |
> -        StructureNotifyMask | PointerMotionMask | KeyPressMask |
> -        KeyReleaseMask);
> +        StructureNotifyMask | (ximagesink->process_input ?
> +            (PointerMotionMask | KeyPressMask | KeyReleaseMask) : 0));
>  
>      xwindow->gc = XCreateGC (ximagesink->xcontext->disp, xwindow->win, 0, NULL);
>      g_mutex_unlock (ximagesink->x_lock);
> @@ -1744,10 +1744,19 @@ gst_ximagesink_expose (GstXOverlay * ove
>  }
>  
>  static void
> +gst_ximagesink_set_process_input (GstXOverlay * overlay, gboolean process_input)
> +{
> +  GstXImageSink *ximagesink = GST_XIMAGESINK (overlay);
> +
> +  ximagesink->process_input = process_input;
> +}
> +
> +static void
>  gst_ximagesink_xoverlay_init (GstXOverlayClass * iface)
>  {
>    iface->set_xwindow_id = gst_ximagesink_set_xwindow_id;
>    iface->expose = gst_ximagesink_expose;
> +  iface->set_process_input = gst_ximagesink_set_process_input;
>  }
>  
>  /* =========================================== */
> @@ -1895,6 +1904,8 @@ gst_ximagesink_init (GstXImageSink * xim
>  
>    ximagesink->synchronous = FALSE;
>    ximagesink->keep_aspect = FALSE;
> +
> +  ximagesink->process_input = TRUE;
>  }
>  
>  static void
> diff -rup gst-plugins-base-0.10.5-orig/sys/ximage/ximagesink.h gst-plugins-base-0.10.5/sys/ximage/ximagesink.h
> --- gst-plugins-base-0.10.5-orig/sys/ximage/ximagesink.h	2005-11-28 18:32:55.000000000 +0100
> +++ gst-plugins-base-0.10.5/sys/ximage/ximagesink.h	2006-12-14 17:47:33.000000000 +0100
> @@ -211,6 +211,8 @@ struct _GstXImageSink {
>  
>    gboolean synchronous;
>    gboolean keep_aspect;
> +
> +  gboolean process_input;
>  };
>  
>  struct _GstXImageSinkClass {
> diff -rup gst-plugins-base-0.10.5-orig/sys/xvimage/xvimagesink.c gst-plugins-base-0.10.5/sys/xvimage/xvimagesink.c
> --- gst-plugins-base-0.10.5-orig/sys/xvimage/xvimagesink.c	2006-03-07 20:18:22.000000000 +0100
> +++ gst-plugins-base-0.10.5/sys/xvimage/xvimagesink.c	2006-12-15 10:52:13.000000000 +0100
> @@ -2143,9 +2143,11 @@ gst_xvimagesink_set_xwindow_id (GstXOver
>      xwindow->width = attr.width;
>      xwindow->height = attr.height;
>      xwindow->internal = FALSE;
> +
>      XSelectInput (xvimagesink->xcontext->disp, xwindow->win, ExposureMask |
> -        StructureNotifyMask | PointerMotionMask | KeyPressMask |
> -        KeyReleaseMask);
> +        StructureNotifyMask | (xvimagesink->process_input ?
> +            (PointerMotionMask | KeyPressMask |
> +             KeyReleaseMask) : 0));
>  
>      xwindow->gc = XCreateGC (xvimagesink->xcontext->disp,
>          xwindow->win, 0, NULL);
> @@ -2170,10 +2172,19 @@ gst_xvimagesink_expose (GstXOverlay * ov
>  }
>  
>  static void
> +gst_xvimagesink_set_process_input (GstXOverlay * overlay, gboolean process_input)
> +{
> +  GstXvImageSink *xvimagesink = GST_XVIMAGESINK (overlay);
> +
> +  xvimagesink->process_input = process_input;
> +}
> +
> +static void
>  gst_xvimagesink_xoverlay_init (GstXOverlayClass * iface)
>  {
>    iface->set_xwindow_id = gst_xvimagesink_set_xwindow_id;
>    iface->expose = gst_xvimagesink_expose;
> +  iface->set_process_input = gst_xvimagesink_set_process_input;
>  }
>  
>  static const GList *
> @@ -2432,6 +2443,8 @@ gst_xvimagesink_init (GstXvImageSink * x
>    xvimagesink->running = FALSE;
>    xvimagesink->keep_aspect = FALSE;
>    xvimagesink->par = NULL;
> +
> +  xvimagesink->process_input = TRUE;
>  }
>  
>  static void
> diff -rup gst-plugins-base-0.10.5-orig/sys/xvimage/xvimagesink.h gst-plugins-base-0.10.5/sys/xvimage/xvimagesink.h
> --- gst-plugins-base-0.10.5-orig/sys/xvimage/xvimagesink.h	2005-11-28 18:32:55.000000000 +0100
> +++ gst-plugins-base-0.10.5/sys/xvimage/xvimagesink.h	2006-12-14 17:47:53.000000000 +0100
> @@ -252,6 +252,8 @@ struct _GstXvImageSink {
>  
>    guint video_width, video_height;     /* size of incoming video;
>                                          * used as the size for XvImage */
> +
> +  gboolean process_input;
>  };
>  
>  struct _GstXvImageSinkClass {
>   
> ------------------------------------------------------------------------
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> ------------------------------------------------------------------------
>
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
>   





More information about the gstreamer-devel mailing list