"fghGetWindowProperty");
if (type_returned != type)
- {
- number_of_elements = 0;
- }
+ {
+ number_of_elements = 0;
+ }
return number_of_elements;
}
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". */
/* 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");
fgDisplay.pDisplay.StateFullScreen = full_screen;
}
}
+
+ fgDisplay.pDisplay.NetWMPid = fghGetAtom("_NET_WM_PID");
+ fgDisplay.pDisplay.ClientMachine = fghGetAtom("WM_CLIENT_MACHINE");
}
/* Get start time */
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;
#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
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