From: David S. <dsc...@us...> - 2003-11-11 00:43:43
|
CVS Root: /cvsroot/gstreamer Module: gst-plugins Changes by: dschleef Date: Mon Nov 10 2003 16:43:41 PST Log message: Change GstCaps to GstStructure in navigation events. Fix x[v]imagesink to scale navigation events. Modified files: gst-libs/gst/navigation: navigation.c navigation.h gst/debug : gstnavigationtest.c gstnavigationtest.h sys/ximage : ximagesink.c sys/xvideo : xvideosink.c sys/xvimage : xvimagesink.c Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst-libs/gst/navigation/navigation.c.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst-libs/gst/navigation/navigation.h.diff?r1=1.5&r2=1.6 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/debug/gstnavigationtest.c.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/gst/debug/gstnavigationtest.h.diff?r1=1.1&r2=1.2 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/ximage/ximagesink.c.diff?r1=1.10&r2=1.11 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvideo/xvideosink.c.diff?r1=1.57&r2=1.58 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: gstnavigationtest.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/debug/gstnavigationtest.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstnavigationtest.c 10 Nov 2003 22:33:43 -0000 1.1 +++ gstnavigationtest.c 11 Nov 2003 00:43:29 -0000 1.2 @@ -153,10 +153,10 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: - gst_caps_get_float(event->event_data.caps.caps, "pointer_x", - &navigationtest->x); - gst_caps_get_float(event->event_data.caps.caps, "pointer_y", - &navigationtest->y); + gst_structure_get_double(event->event_data.structure.structure, + "pointer_x", &navigationtest->x); + gst_structure_get_double(event->event_data.structure.structure, + "pointer_y", &navigationtest->y); break; default: break; Index: gstnavigationtest.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst/debug/gstnavigationtest.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstnavigationtest.h 10 Nov 2003 22:33:43 -0000 1.1 +++ gstnavigationtest.h 11 Nov 2003 00:43:29 -0000 1.2 @@ -46,8 +46,8 @@ struct _GstNavigationtest { GstVideofilter videofilter; - float x; - float y; + double x; + double y; }; struct _GstNavigationtestClass { Index: navigation.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst-libs/gst/navigation/navigation.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- navigation.c 30 Oct 2003 01:43:45 -0000 1.5 +++ navigation.c 11 Nov 2003 00:43:29 -0000 1.6 @@ -61,31 +61,31 @@ } void -gst_navigation_send_event (GstNavigation *navigation, GstCaps *caps) +gst_navigation_send_event (GstNavigation *navigation, GstStructure *structure) { GstNavigationInterface *iface = GST_NAVIGATION_GET_IFACE (navigation); if (iface->send_event) { - iface->send_event (navigation, caps); + iface->send_event (navigation, structure); } } void gst_navigation_send_key_event (GstNavigation *navigation, const char *key) { - gst_navigation_send_event (navigation, GST_CAPS_NEW ("key_event", - "application/x-gst-navigation", - "key", GST_PROPS_STRING (key))); + gst_navigation_send_event (navigation, gst_structure_new ( + "application/x-gst-navigation", + "key", G_TYPE_STRING, key, NULL)); } void gst_navigation_send_mouse_event (GstNavigation *navigation, double x, double y) { - gst_navigation_send_event (navigation, GST_CAPS_NEW ("mouse_event", + gst_navigation_send_event (navigation, gst_structure_new ( "application/x-gst-navigation", - "pointer_x", GST_PROPS_FLOAT (x), - "pointer_y", GST_PROPS_FLOAT (y))); + "pointer_x", G_TYPE_DOUBLE, x, + "pointer_y", G_TYPE_DOUBLE, y, NULL)); } Index: navigation.h =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/gst-libs/gst/navigation/navigation.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- navigation.h 30 Oct 2003 01:43:45 -0000 1.5 +++ navigation.h 11 Nov 2003 00:43:29 -0000 1.6 @@ -42,7 +42,7 @@ GTypeInterface g_iface; /* virtual functions */ - void (*send_event) (GstNavigation *navigation, GstCaps *caps); + void (*send_event) (GstNavigation *navigation, GstStructure *structure); GST_CLASS_PADDING } GstNavigationInterface; @@ -50,7 +50,7 @@ GType gst_navigation_get_type (void); /* virtual class function wrappers */ -void gst_navigation_send_event (GstNavigation *navigation, GstCaps *caps); +void gst_navigation_send_event (GstNavigation *navigation, GstStructure *structure); void gst_navigation_send_key_event (GstNavigation *navigation, const char *key); void gst_navigation_send_mouse_event (GstNavigation *navigation, double x, Index: ximagesink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/ximage/ximagesink.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- ximagesink.c 10 Nov 2003 19:57:57 -0000 1.10 +++ ximagesink.c 11 Nov 2003 00:43:29 -0000 1.11 @@ -74,13 +74,31 @@ } static void -gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstCaps *caps) +gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstStructure *structure) { GstXImageSink *ximagesink = GST_XIMAGESINK (navigation); + XWindowAttributes attr; GstEvent *event; + double x, y; + + g_mutex_lock (ximagesink->x_lock); + XGetWindowAttributes (ximagesink->xcontext->disp, + ximagesink->xwindow->win, &attr); + g_mutex_unlock (ximagesink->x_lock); event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = caps; + event->event_data.structure.structure = structure; + if(gst_structure_get_double(structure, "pointer_x", &x)){ + x *= ximagesink->width; + x /= attr.width; + gst_structure_set(structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); + } + if(gst_structure_get_double(structure, "pointer_y", &y)){ + y *= ximagesink->height; + y /= attr.height; + gst_structure_set(structure, "pointer_y", G_TYPE_DOUBLE, y, NULL); + } + gst_pad_send_event (gst_pad_get_peer (ximagesink->sinkpad), event); } @@ -351,6 +369,7 @@ ButtonReleaseMask, &e)) { GstEvent *event = NULL; + KeySym keysym; /* We lock only for the X function call */ g_mutex_unlock (ximagesink->x_lock); @@ -383,13 +402,8 @@ events for interactivity/navigation */ GST_DEBUG ("ximagesink pointer moved over window at %d,%d", e.xmotion.x, e.xmotion.y); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "ximagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_INT (e.xmotion.x), - "pointer_y", GST_PROPS_INT (e.xmotion.y), - "state", GST_PROPS_INT (e.xmotion.state)); + gst_navigation_send_mouse_event(GST_NAVIGATION(ximagesink), + e.xmotion.x, e.xmotion.y); break; case ButtonPress: case ButtonRelease: @@ -397,29 +411,21 @@ events for interactivity/navigation */ GST_DEBUG ("ximagesink button %d pressed over window at %d,%d", e.xbutton.button, e.xbutton.x, e.xbutton.x); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "ximagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_INT (e.xbutton.x), - "pointer_y", GST_PROPS_INT (e.xbutton.y), - "button", GST_PROPS_INT (e.xbutton.button), - "state", GST_PROPS_INT (e.xbutton.state)); + gst_navigation_send_mouse_event(GST_NAVIGATION(ximagesink), + e.xmotion.x, e.xmotion.y); break; case KeyPress: case KeyRelease: /* Key pressed/released over our window. We send upstream events for interactivity/navigation */ GST_DEBUG ("ximagesink key %d pressed over window at %d,%d", - e.xbutton.button, e.xbutton.x, e.xbutton.x); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "ximagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_INT (e.xkey.x), - "pointer_y", GST_PROPS_INT (e.xkey.y), - "keycode", GST_PROPS_INT (e.xkey.keycode), - "state", GST_PROPS_INT (e.xkey.state)); + e.xkey.keycode, e.xkey.x, e.xkey.x); + keysym = XKeycodeToKeysym(ximagesink->xcontext->disp, + e.xkey.keycode, 0); + gst_navigation_send_key_event (GST_NAVIGATION (ximagesink), + XKeysymToString (keysym)); + gst_navigation_send_key_event(GST_NAVIGATION(ximagesink), + "unknown"); break; default: GST_DEBUG ("ximagesink unhandled X event (%d)", e.type); Index: xvideosink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvideo/xvideosink.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- xvideosink.c 7 Nov 2003 04:40:38 -0000 1.57 +++ xvideosink.c 11 Nov 2003 00:43:29 -0000 1.58 @@ -60,7 +60,7 @@ static void gst_xvideosink_xoverlay_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id); static void gst_xvideosink_navigation_init (GstNavigationInterface *iface); -static void gst_xvideosink_navigation_send_event (GstNavigation *navigation, GstCaps *caps); +static void gst_xvideosink_navigation_send_event (GstNavigation *navigation, GstStructure *structure); static void gst_xvideosink_chain (GstPad *pad, GstData *_data); static GstElementStateReturn @@ -208,14 +208,15 @@ } static void -gst_xvideosink_navigation_send_event (GstNavigation *navigation, GstCaps *caps) +gst_xvideosink_navigation_send_event (GstNavigation *navigation, + GstStructure *structure) { GstXVideoSink *xvideosink = GST_XVIDEOSINK (navigation); GstEvent *event; event = gst_event_new (GST_EVENT_NAVIGATION); /*GST_EVENT_TIMESTAMP (event) = 0;*/ - event->event_data.caps.caps = caps; + event->event_data.structure.structure = structure; /* FIXME * Obviously, the pointer x,y coordinates need to be adjusted by the Index: xvimagesink.c =================================================================== RCS file: /cvsroot/gstreamer/gst-plugins/sys/xvimage/xvimagesink.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- xvimagesink.c 10 Nov 2003 22:49:20 -0000 1.2 +++ xvimagesink.c 11 Nov 2003 00:43:29 -0000 1.3 @@ -78,13 +78,31 @@ } static void -gst_xvimagesink_navigation_send_event (GstNavigation *navigation, GstCaps *caps) +gst_xvimagesink_navigation_send_event (GstNavigation *navigation, GstStructure *structure) { GstXvImageSink *xvimagesink = GST_XVIMAGESINK (navigation); + XWindowAttributes attr; GstEvent *event; + double x,y; + + g_mutex_lock (xvimagesink->x_lock); + XGetWindowAttributes (xvimagesink->xcontext->disp, + xvimagesink->xwindow->win, &attr); + g_mutex_unlock (xvimagesink->x_lock); event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = caps; + event->event_data.structure.structure = structure; + if(gst_structure_get_double(structure, "pointer_x", &x)){ + x *= xvimagesink->width; + x /= attr.width; + gst_structure_set(structure, "pointer_x", G_TYPE_DOUBLE, x, NULL); + } + if(gst_structure_get_double(structure, "pointer_y", &y)){ + y *= xvimagesink->height; + y /= attr.height; + gst_structure_set(structure, "pointer_y", G_TYPE_DOUBLE, y, NULL); + } + gst_pad_send_event (gst_pad_get_peer (xvimagesink->sinkpad), event); } @@ -359,6 +377,7 @@ ButtonReleaseMask, &e)) { GstEvent *event = NULL; + KeySym keysym; /* We lock only for the X function call */ g_mutex_unlock (xvimagesink->x_lock); @@ -370,43 +389,28 @@ events for interactivity/navigation */ GST_DEBUG ("xvimagesink pointer moved over window at %d,%d", e.xmotion.x, e.xmotion.y); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "xvimagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_FLOAT (e.xmotion.x), - "pointer_y", GST_PROPS_FLOAT (e.xmotion.y), - "state", GST_PROPS_INT (e.xmotion.state)); + gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink), + e.xmotion.x, e.xmotion.y); break; case ButtonPress: case ButtonRelease: /* Mouse button pressed/released over our window. We send upstream events for interactivity/navigation */ GST_DEBUG ("xvimagesink button %d pressed over window at %d,%d", - e.xbutton.button, e.xbutton.x, e.xbutton.x); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "xvimagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_FLOAT (e.xbutton.x), - "pointer_y", GST_PROPS_FLOAT (e.xbutton.y), - "button", GST_PROPS_INT (e.xbutton.button), - "state", GST_PROPS_INT (e.xbutton.state)); + e.xbutton.button, e.xbutton.x, e.xbutton.y); + gst_navigation_send_mouse_event (GST_NAVIGATION (xvimagesink), + e.xbutton.x, e.xbutton.y); break; case KeyPress: case KeyRelease: /* Key pressed/released over our window. We send upstream events for interactivity/navigation */ GST_DEBUG ("xvimagesink key %d pressed over window at %d,%d", - e.xbutton.button, e.xbutton.x, e.xbutton.x); - event = gst_event_new (GST_EVENT_NAVIGATION); - event->event_data.caps.caps = GST_CAPS_NEW ( - "xvimagesink_navigation", - "video/x-raw-rgb", - "pointer_x", GST_PROPS_INT (e.xkey.x), - "pointer_y", GST_PROPS_INT (e.xkey.y), - "keycode", GST_PROPS_INT (e.xkey.keycode), - "state", GST_PROPS_INT (e.xkey.state)); + e.xkey.keycode, e.xkey.x, e.xkey.y); + keysym = XKeycodeToKeysym(xvimagesink->xcontext->disp, + e.xkey.keycode, 0); + gst_navigation_send_key_event (GST_NAVIGATION (xvimagesink), + XKeysymToString (keysym)); break; default: GST_DEBUG ("xvimagesink unhandled X event (%d)", e.type); |