Using less and less XGetWindowAttributes. I m using the configure events to keep...
authorJulien Moutte <julien@moutte.net>
Thu, 13 Nov 2003 10:46:12 +0000 (10:46 +0000)
committerJulien Moutte <julien@moutte.net>
Thu, 13 Nov 2003 10:46:12 +0000 (10:46 +0000)
Original commit message from CVS:
Using less and less XGetWindowAttributes. I m using the configure events to keep our internal data up to date and use that to work (faster).
Implemented offset management in the navigation event if the image is centered in the window.

sys/ximage/ximagesink.c

index e892b4de46d83fa9215c3d8f60d026b222ae6be2..d71dce9b240b004fe9d3be71764cd590fef2b4fb 100644 (file)
@@ -78,15 +78,32 @@ gst_ximagesink_navigation_send_event (GstNavigation *navigation, GstStructure *s
 {
   GstXImageSink *ximagesink = GST_XIMAGESINK (navigation);
   GstEvent *event;
-
+  gint x_offset, y_offset;
+  double x,y;
+  
   event = gst_event_new (GST_EVENT_NAVIGATION);
   event->event_data.structure.structure = structure;
 
   /* We are not converting the pointer coordinates as there's no hardware 
      scaling done here. The only possible scaling is done by videoscale and
      videoscale will have to catch those events and tranform the coordinates
-     to match the applied scaling */
+     to match the applied scaling. So here we just add the offset if the image
+     is centered in the window.  */
+  
+  x_offset = ximagesink->xwindow->width - ximagesink->width;
+  y_offset = ximagesink->xwindow->height - ximagesink->height;
   
+  if (gst_structure_get_double (structure, "pointer_x", &x))
+    {
+      x += x_offset;
+      gst_structure_set (structure, "pointer_x", G_TYPE_DOUBLE, x, NULL);
+    }
+  if (gst_structure_get_double (structure, "pointer_y", &y))
+    {
+      y += y_offset;
+      gst_structure_set (structure, "pointer_y", G_TYPE_DOUBLE, y, NULL);
+    }
+    
   gst_pad_send_event (gst_pad_get_peer (ximagesink->sinkpad), event);
 }
 
@@ -224,8 +241,7 @@ static void
 gst_ximagesink_ximage_put (GstXImageSink *ximagesink, GstXImage *ximage)
 {
   gint x, y;
-  XWindowAttributes attr; 
-  
   g_return_if_fail (ximage != NULL);
   g_return_if_fail (ximagesink != NULL);
   g_return_if_fail (GST_IS_XIMAGESINK (ximagesink));
@@ -233,11 +249,8 @@ gst_ximagesink_ximage_put (GstXImageSink *ximagesink, GstXImage *ximage)
   g_mutex_lock (ximagesink->x_lock);
   
   /* We center the image in the window */
-  XGetWindowAttributes (ximagesink->xcontext->disp,
-                        ximagesink->xwindow->win, &attr); 
-
-  x = MAX (0, (attr.width - ximage->width) / 2);
-  y = MAX (0, (attr.height - ximage->height) / 2);
+  x = MAX (0, (ximagesink->xwindow->width - ximage->width) / 2);
+  y = MAX (0, (ximagesink->xwindow->height- ximage->height) / 2);
 
 #ifdef HAVE_XSHM
   if (ximagesink->xcontext->use_xshm)
@@ -374,6 +387,9 @@ gst_ximagesink_handle_xevents (GstXImageSink *ximagesink, GstPad *pad)
             if ( (ximagesink->xwindow->width != e.xconfigure.width) ||
                  (ximagesink->xwindow->height != e.xconfigure.height) )
               {
+                ximagesink->xwindow->width = e.xconfigure.width;
+                ximagesink->xwindow->height = e.xconfigure.height;
+                
                 gst_pad_try_set_caps (ximagesink->sinkpad,
                                       GST_CAPS_NEW ("ximagesink_ximage_caps", "video/x-raw-rgb",
                                                     "bpp",        GST_PROPS_INT (ximagesink->xcontext->bpp),