[gst-devel] x input events processing in sinks with xoverlay interface [patch]
ensonic
ensonic at hora-obscura.de
Wed Dec 20 16:01:21 CET 2006
hi julien,
On 3:50:35 pm 18/12/2006 Julien Moutte <julien at moutte.net> wrote:
>
> I really don't understand why this is such a problem to you guys...
>
it took me also quite some time to figure. Here is one scenario:
- we have a daemon that creates the subwindow and supplied the xid to the
xvimagesink
- the ui process can't get hold of that window and it does not need it
- problem, the subwindow swallows the keyevents, unless the ui process
would listen for them there
> When passing an XID to x[v]imagesink those plugins are selecting ONLY
> the event mask that are not exclusive to a single client (all but
> mouse buttons basically).
>
> So that means that you can pass an XID to x[v]imagesink and listen to
> those keypress events on that same window from your application while
> letting the video sink handle them too.
I you split he app into UI and backend engine that you might not have the
xid in the ui :(
Stefan
> Can you please try that before adding stuff to the XOverlay interface
> ?
>
> Thanks
>
> Julien.
>
> On Mon, 2006-12-18 at 14:06 +0100, Radek Doulík wrote:
> > 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/xoverl
> ay.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/xoverl
> ay.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
> > > >
> > >
>
> ----------------------------------------------------------------------
> ---
> 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=sourc
> eforge&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