[268/906] Better deal with Atoms
authorJulien Isorce <julien.isorce@gmail.com>
Sat, 15 Nov 2008 01:24:07 +0000 (02:24 +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 5a2d5f5..f079eb9 100644 (file)
@@ -45,13 +45,16 @@ struct _GstGLWindowPrivate
 
   gchar *display_name;
   Display *device;
-  gint screen;
+  Screen *screen;
+  gint screen_num;
+  Visual *visual;
   Window root;
+  gulong white;
+  gulong black;
+  gint depth;
   gint device_width;
   gint device_height;
   gint connection;
-  Atom atom_delete_window;
-  Atom atom_custom;
   XVisualInfo *visual_info;
 
   Window internal_win_id;
@@ -93,10 +96,12 @@ gst_gl_window_finalize (GObject * object)
 
   XDestroyWindow (priv->device, priv->internal_win_id);
 
+  XSync (priv->device, FALSE);
+
   XFlush (priv->device);
   while (XCheckTypedEvent (priv->device, ClientMessage, &event))
   {
-      g_debug ("discared custom x event\n");
+      g_debug ("last discared custom x events\n");
       g_cond_signal (priv->cond_send_message);
   }
 
@@ -114,9 +119,8 @@ gst_gl_window_finalize (GObject * object)
 
   g_debug ("display closed\n");
 
-  g_mutex_unlock (priv->glwin_lock);
   g_mutex_unlock (priv->x_lock);
-
+  g_mutex_unlock (priv->glwin_lock);
 
   if (priv->cond_send_message)
   {
@@ -253,6 +257,7 @@ gst_gl_window_new (gint width, gint height)
   XWMHints wm_hints;
   unsigned long mask;
   const gchar *title = "OpenGL renderer";
+  Atom wm_delete_and_gl[2];
 
   static gint x = 0;
   static gint y = 0;
@@ -273,20 +278,23 @@ gst_gl_window_new (gint width, gint height)
 
   g_debug ("gl device id: %ld\n", (gulong) priv->device);
 
-  priv->screen = DefaultScreen (priv->device);
-  priv->root = RootWindow (priv->device, priv->screen);
+  priv->screen = DefaultScreenOfDisplay (priv->device);
+  priv->screen_num = DefaultScreen (priv->device);
+  priv->visual = DefaultVisual (priv->device, priv->screen_num);
+  priv->root = DefaultRootWindow (priv->device);
+  priv->white = XWhitePixel (priv->device, priv->screen_num);
+  priv->black = XBlackPixel (priv->device, priv->screen_num);
+  priv->depth = DefaultDepthOfScreen (priv->screen);
 
-  priv->device_width = DisplayWidth (priv->device, priv->screen);
-  priv->device_height = DisplayHeight (priv->device, priv->screen);
+
+  priv->device_width = DisplayWidth (priv->device, priv->screen_num);
+  priv->device_height = DisplayHeight (priv->device, priv->screen_num);
 
   priv->connection = ConnectionNumber (priv->device);
-  priv->atom_delete_window = XInternAtom (priv->device, "WM_DELETE_WINDOW", FALSE);
-  priv->atom_custom = XInternAtom (priv->device, "WM_GSTGLWINDOW", FALSE);
 
-  priv->visual_info = glXChooseVisual (priv->device, priv->screen, attrib);
+  priv->visual_info = glXChooseVisual (priv->device, priv->screen_num, attrib);
 
-  win_attr.event_mask =
-    StructureNotifyMask | SubstructureNotifyMask | ExposureMask | VisibilityChangeMask;
+  win_attr.event_mask = StructureNotifyMask | ExposureMask | VisibilityChangeMask;
 
   win_attr.background_pixmap = None;
   win_attr.background_pixel = 0;
@@ -302,8 +310,22 @@ gst_gl_window_new (gint width, gint height)
 
   XSync (priv->device, FALSE);
 
+  XSetWindowBackgroundPixmap (priv->device, priv->internal_win_id, None);
+
   g_debug ("gl window id: %lld\n", (guint64) priv->internal_win_id);
 
+  wm_delete_and_gl[0] = XInternAtom (priv->device, "WM_DELETE_WINDOW", True);
+  if (wm_delete_and_gl[0] == None)
+    g_debug ("Cannot create WM_DELETE_WINDOW\n");
+
+  //XSetWMProtocols (priv->device, priv->internal_win_id, &wm_delete, 1);
+
+  wm_delete_and_gl[1] = XInternAtom (priv->device, "WM_GL_WINDOW", False);
+  if (wm_delete_and_gl[1] == None)
+    g_debug ("Cannot create WM_GL_WINDOW\n");
+
+  XSetWMProtocols (priv->device, priv->internal_win_id, wm_delete_and_gl, 2);
+
   priv->gl_context = glXCreateContext (priv->device, priv->visual_info, NULL, TRUE);
 
   g_debug ("gl context id: %ld\n", (gulong) priv->gl_context);
@@ -327,8 +349,6 @@ gst_gl_window_new (gint width, gint height)
 
   XFree (text_property.value);
 
-  XSetWMProtocols (priv->device, priv->internal_win_id, &priv->atom_delete_window, 1);
-
   ret = glXMakeCurrent (priv->device, priv->internal_win_id, priv->gl_context);
 
   if (!ret)
@@ -521,19 +541,31 @@ gst_gl_window_run_loop (GstGLWindow *window)
         case ClientMessage:
         {
 
-          if (event.xclient.message_type == priv->atom_custom)
+          Atom wm_delete = XInternAtom (priv->device, "WM_DELETE_WINDOW", True);
+          Atom wm_gl = XInternAtom (priv->device, "WM_GL_WINDOW", True);
+
+          if (wm_delete == None)
+            g_debug ("Cannot create WM_DELETE_WINDOW\n");
+          if (wm_gl == None)
+            g_debug ("Cannot create WM_GL_WINDOW\n");
+
+          if (wm_gl != None && event.xclient.message_type == wm_gl)
           {
             if (running)
             {
               GstGLWindowCB custom_cb = (GstGLWindowCB) event.xclient.data.l[0];
               gpointer custom_data = (gpointer) event.xclient.data.l[1];
+
+              if (!custom_cb || !custom_data)
+                g_debug ("custom cb not initialized\n");
+
               custom_cb (custom_data);
             }
 
             g_cond_signal (priv->cond_send_message);
           }
 
-          else if ( (Atom) event.xclient.data.l[0] == priv->atom_delete_window)
+          else if (wm_delete != None && (Atom) event.xclient.data.l[0] == wm_delete)
           {
             XEvent event;
 
@@ -553,6 +585,10 @@ gst_gl_window_run_loop (GstGLWindow *window)
               g_cond_signal (priv->cond_send_message);
             }
           }
+          else
+          {
+            g_debug("not reconized client message\n");
+          }
           break;
         }
 
@@ -668,21 +704,18 @@ gst_gl_window_send_message (GstGLWindow *window, GstGLWindowCB callback, gpointe
       event.xclient.send_event = TRUE;
       event.xclient.display = priv->device;
       event.xclient.window = priv->internal_win_id;
-      event.xclient.message_type = priv->atom_custom;
+      event.xclient.message_type = XInternAtom (priv->device, "WM_GL_WINDOW", True);
       event.xclient.format = 32;
       event.xclient.data.l[0] = (long) callback;
       event.xclient.data.l[1] = (long) data;
 
       XSendEvent (priv->device, priv->internal_win_id, FALSE, NoEventMask, &event);
-      XFlush (priv->device);
       XSync (priv->device, FALSE);
 
       g_mutex_unlock (priv->x_lock);
 
       g_cond_signal (priv->cond_x_event);
 
-      g_debug("signal\n");
-
       g_cond_wait (priv->cond_send_message, priv->glwin_lock);
 
     }