[272/906] add a visible member to deal better with the first expose events
authorJulien Isorce <julien.isorce@gmail.com>
Mon, 17 Nov 2008 00:04:32 +0000 (01:04 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Sat, 9 Dec 2017 19:31:20 +0000 (19:31 +0000)
gst-libs/gst/gl/gstglwindow_x11.c

index 95fe949..ee84079 100644 (file)
@@ -40,6 +40,7 @@ struct _GstGLWindowPrivate
   GMutex *x_lock;
   GCond *cond_send_message;
   gboolean running;
+  gboolean visible;
 
   gchar *display_name;
   Display *device;
@@ -228,7 +229,6 @@ gst_gl_window_new (gint width, gint height)
 
   XSetWindowAttributes win_attr;
   XTextProperty text_property;
-  XSizeHints size_hints;
   XWMHints wm_hints;
   unsigned long mask;
   const gchar *title = "OpenGL renderer";
@@ -240,12 +240,10 @@ gst_gl_window_new (gint width, gint height)
   priv->x_lock = g_mutex_new ();
   priv->cond_send_message = g_cond_new ();
   priv->running = TRUE;
+  priv->visible = FALSE;
 
   g_mutex_lock (priv->x_lock);
 
-  x += 20;
-  y += 20;
-
   priv->device = XOpenDisplay (priv->display_name);
 
   g_debug ("gl device id: %ld\n", (gulong) priv->device);
@@ -258,6 +256,7 @@ gst_gl_window_new (gint width, gint height)
   priv->black = XBlackPixel (priv->device, priv->screen_num);
   priv->depth = DefaultDepthOfScreen (priv->screen);
 
+  g_debug ("gl root id: %lld\n", (guint64) priv->root);
 
   priv->device_width = DisplayWidth (priv->device, priv->screen_num);
   priv->device_height = DisplayHeight (priv->device, priv->screen_num);
@@ -280,6 +279,9 @@ gst_gl_window_new (gint width, gint height)
     width, height, 0, priv->visual_info->depth, InputOutput,
     priv->visual_info->visual, mask, &win_attr);
 
+  x += 20;
+  y += 20;
+
   XSync (priv->device, FALSE);
 
   XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None);
@@ -303,12 +305,6 @@ gst_gl_window_new (gint width, gint height)
   if (!glXIsDirect(priv->device, priv->gl_context))
     g_debug ("direct rendering failed\n");
 
-  size_hints.flags = USPosition | USSize;
-  size_hints.x = x; //FIXME: not working
-  size_hints.y = y; //FIXME: not working
-  size_hints.width = width;
-  size_hints.height= height;
-
   wm_hints.flags = StateHint;
   wm_hints.initial_state = NormalState;
   wm_hints.input = False;
@@ -316,7 +312,7 @@ gst_gl_window_new (gint width, gint height)
   XStringListToTextProperty ((char**)&title, 1, &text_property);
 
   XSetWMProperties (priv->device, priv->internal_win_id, &text_property, &text_property, 0, 0,
-    &size_hints, &wm_hints, NULL);
+    NULL, &wm_hints, NULL);
 
   XFree (text_property.value);
 
@@ -416,21 +412,8 @@ gst_gl_window_visible (GstGLWindow *window, gboolean visible)
 
     g_mutex_lock (priv->x_lock);
 
-    if (priv->running)
-    {
-      Display *disp = XOpenDisplay (priv->display_name);
-
-      g_debug ("set visible %lld\n", (guint64) priv->internal_win_id);
-
-      if (visible)
-        XMapWindow (disp, priv->internal_win_id);
-      else
-        XUnmapWindow (disp, priv->internal_win_id);
-
-      XSync(disp, FALSE);
-
-      XCloseDisplay (disp);
-    }
+    if (priv->visible != visible)
+      priv->visible = visible;
 
     g_mutex_unlock (priv->x_lock);
   }
@@ -455,6 +438,12 @@ gst_gl_window_draw (GstGLWindow *window)
 
       disp = XOpenDisplay (priv->display_name);
 
+      if (priv->visible)
+      {
+        XMapWindow (disp, priv->internal_win_id);
+        priv->visible = FALSE;
+      }
+
       XGetWindowAttributes (disp, priv->internal_win_id, &attr);
 
       event.xexpose.type = Expose;
@@ -538,7 +527,7 @@ gst_gl_window_run_loop (GstGLWindow *window)
         {
           XEvent event;
 
-          g_debug ("Close\n");
+          g_debug ("Close %lld\n", (guint64) priv->internal_win_id);
 
           priv->running = FALSE;
 
@@ -582,6 +571,7 @@ gst_gl_window_run_loop (GstGLWindow *window)
         if (priv->draw_cb)
         {
           priv->draw_cb (priv->draw_data);
+          glFlush();
           glXSwapBuffers (priv->device, priv->internal_win_id);
         }
         break;
@@ -671,6 +661,8 @@ gst_gl_window_send_message (GstGLWindow *window, GstGLWindowCB callback, gpointe
 
     g_mutex_lock (priv->x_lock);
 
+    g_debug ("AA CUSTOM IN: %lld\n", (guint64)priv->internal_win_id);
+
     if (priv->running)
     {
       Display *disp;