[gst-devel] x input events processing in sinks with xoverlay interface [patch]
Radek Doulík
rodo at novell.com
Mon Dec 18 14:06:48 CET 2006
Hi Stefan,
On Sun, 2006-12-17 at 11:48 +0200, Stefan Kost wrote:
> 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.
Good idea, I filed http://bugzilla.gnome.org/show_bug.cgi?id=387138 for
it.
> We (nokia) currently hardcoded disable the input processing,
> because it causes trouble in our product.
Good to know I am not alone having troubles with it ;-)
> Two comments now already:
> * why don#t use a boolean iface property?
I am not sure if I understand correctly your question, but I thought it
will make more sense to add it to the X overlay interface, instead of
adding it directly to sinks properties, as it is needed in case where
processing the X input events conflicts with the application which
creates the embedded window (and pass it to gstreamer thru x overlay
iface).
> * shouldn't it be an instance specific setting and not class wide?
It is instance specific, it just adds new virtual method to the iface
class.
Cheers
Radek
> 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
> >
>
--
Radek Doulík <rodo at novell.com>
Novell, Inc.
More information about the gstreamer-devel
mailing list