Applied James DeLisle's patch adding EWMH _NET_WM_PID support.
authorJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 28 Aug 2013 14:33:07 +0000 (14:33 +0000)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Wed, 28 Aug 2013 14:33:07 +0000 (14:33 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1626 7f0cb862-5218-0410-a997-914c9d46530a

src/x11/fg_init_x11.c
src/x11/fg_internal_x11.h
src/x11/fg_window_x11.c

index 0df54f2..49aefe6 100644 (file)
@@ -82,9 +82,9 @@ static int fghGetWindowProperty(Window window,
                               "fghGetWindowProperty");
 
   if (type_returned != type)
-    {
-      number_of_elements = 0;
-    }
+  {
+    number_of_elements = 0;
+  }
 
   return number_of_elements;
 }
@@ -113,30 +113,30 @@ static int fghNetWMSupported(void)
                                            XA_WINDOW,
                                            (unsigned char **) window_ptr_1);
   if (number_of_windows == 1)
-    {
-      Window ** window_ptr_2;
-
-      window_ptr_2 = malloc(sizeof(Window *));
+  {
+    Window ** window_ptr_2;
 
-      /* Check that the window has the same property set to the same value. */
-      number_of_windows = fghGetWindowProperty(**window_ptr_1,
-                                               wm_check,
-                                               XA_WINDOW,
-                                               (unsigned char **) window_ptr_2);
-      if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2))
-      {
-        /* NET WM compliant */
-        net_wm_supported = 1;
-      }
+    window_ptr_2 = malloc(sizeof(Window *));
 
-      XFree(*window_ptr_2);
-      free(window_ptr_2);
+    /* Check that the window has the same property set to the same value. */
+    number_of_windows = fghGetWindowProperty(**window_ptr_1,
+                                             wm_check,
+                                             XA_WINDOW,
+                                             (unsigned char **) window_ptr_2);
+    if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2))
+    {
+      /* NET WM compliant */
+      net_wm_supported = 1;
     }
 
-        XFree(*window_ptr_1);
-        free(window_ptr_1);
+    XFree(*window_ptr_2);
+    free(window_ptr_2);
+  }
 
-        return net_wm_supported;
+  XFree(*window_ptr_1);
+  free(window_ptr_1);
+
+  return net_wm_supported;
 }
 
 /*  Check if "hint" is present in "property" for "window". */
@@ -216,8 +216,12 @@ void fgPlatformInitialize( const char* displayName )
     /* Create the state and full screen atoms */
     fgDisplay.pDisplay.State           = None;
     fgDisplay.pDisplay.StateFullScreen = None;
+    fgDisplay.pDisplay.NetWMPid        = None;
+    fgDisplay.pDisplay.ClientMachine   = None;
+
+    fgDisplay.pDisplay.NetWMSupported = fghNetWMSupported();
 
-    if (fghNetWMSupported())
+    if (fgDisplay.pDisplay.NetWMSupported)
     {
       const Atom supported = fghGetAtom("_NET_SUPPORTED");
       const Atom state     = fghGetAtom("_NET_WM_STATE");
@@ -236,6 +240,9 @@ void fgPlatformInitialize( const char* displayName )
           fgDisplay.pDisplay.StateFullScreen = full_screen;
         }
       }
+
+      fgDisplay.pDisplay.NetWMPid = fghGetAtom("_NET_WM_PID");
+      fgDisplay.pDisplay.ClientMachine = fghGetAtom("WM_CLIENT_MACHINE");
     }
 
     /* Get start time */
index 2a3020f..64daf72 100644 (file)
@@ -60,6 +60,9 @@ struct tagSFG_PlatformDisplay
     Atom            DeleteWindow;       /* The window deletion atom          */
     Atom            State;              /* The state atom                    */
     Atom            StateFullScreen;    /* The full screen atom              */
+    int             NetWMSupported;     /* Flag for EWMH Window Managers     */
+    Atom            NetWMPid;           /* The _NET_WM_PID atom              */
+    Atom            ClientMachine;      /* The client machine name atom      */
 
 #ifdef HAVE_X11_EXTENSIONS_XRANDR_H
     int prev_xsz, prev_ysz;
index d2a3bbd..0233f94 100644 (file)
@@ -28,8 +28,9 @@
 
 #define FREEGLUT_BUILDING_LIB
 #include <GL/freeglut.h>
-#include <limits.h>  /* LONG_MAX */
-#include <unistd.h>  /* usleep */
+#include <limits.h>     /* LONG_MAX */
+#include <unistd.h>     /* usleep, gethostname, getpid */
+#include <sys/types.h>  /* pid_t */
 #include "../fg_internal.h"
 
 #ifdef EGL_VERSION_1_0
@@ -340,6 +341,41 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title,
     XSetWMProtocols( fgDisplay.pDisplay.Display, window->Window.Handle,
                      &fgDisplay.pDisplay.DeleteWindow, 1 );
 
+    if (fgDisplay.pDisplay.NetWMSupported
+        && fgDisplay.pDisplay.NetWMPid != None
+        && fgDisplay.pDisplay.ClientMachine != None)
+    {
+      char hostname[HOST_NAME_MAX];
+      pid_t pid = getpid();
+
+      if (pid > 0 && gethostname(hostname, sizeof(hostname)) > -1)
+      {
+        hostname[sizeof(hostname) - 1] = '\0';
+
+        XChangeProperty(
+            fgDisplay.pDisplay.Display,
+            window->Window.Handle,
+            fgDisplay.pDisplay.NetWMPid,
+            XA_CARDINAL,
+            32,
+            PropModeReplace,
+            (unsigned char *) &pid,
+            1
+        );
+
+        XChangeProperty(
+            fgDisplay.pDisplay.Display,
+            window->Window.Handle,
+            fgDisplay.pDisplay.ClientMachine,
+            XA_STRING,
+            8,
+            PropModeReplace,
+            (unsigned char *) hostname,
+            strlen(hostname)
+        );
+      }
+    }
+
 #ifdef EGL_VERSION_1_0
     fghPlatformOpenWindowEGL(window);
 #else