From 1698dc0b5721292b30f4f0a4402a766bba1e2a2a Mon Sep 17 00:00:00 2001 From: "Marco Trevisan (Trevi?o)" Date: Mon, 27 Jun 2011 19:30:52 +0200 Subject: [PATCH] X11: Move to XSetWMProperties and add support to _NET_WM_PID Use the convenience function XSetWMProperties to set size, input and class hints, it also automatically sets the WM_CLIENT_MACHINE (this one needed by _NET_WM_PID) and WM_LOCALE_NAME windows hints. Plus we add support to the _NET_WM_PID atom which is needed by many windows managers to correctly associate a SDL window to its process and to related .desktop file and icon for the given host. --- src/video/x11/SDL_x11video.c | 3 ++ src/video/x11/SDL_x11video.h | 1 + src/video/x11/SDL_x11window.c | 61 +++++++++++++++++------------------ 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index dd7914307..7b31fb240 100755 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -328,6 +328,9 @@ X11_VideoInit(_THIS) /* Get the window class name, usually the name of the application */ data->classname = get_classname(); + /* Get the process PID to be associated to the window */ + data->pid = getpid(); + /* Open a connection to the X input manager */ #ifdef X_HAVE_UTF8_STRING if (SDL_X11_HAVE_UTF8) { diff --git a/src/video/x11/SDL_x11video.h b/src/video/x11/SDL_x11video.h index f721bec56..9a7ca5474 100755 --- a/src/video/x11/SDL_x11video.h +++ b/src/video/x11/SDL_x11video.h @@ -69,6 +69,7 @@ typedef struct SDL_VideoData { Display *display; char *classname; + pid_t pid; XIM im; Uint32 screensaver_activity; int numwindows; diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 34801ce11..007a81af8 100755 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -258,11 +258,12 @@ X11_CreateWindow(_THIS, SDL_Window * window) int depth; XSetWindowAttributes xattr; Window w; - XSizeHints *sizehints; - XWMHints *wmhints; - XClassHint *classhints; + XSizeHints sizehints; + XWMHints wmhints; + XClassHint classhints; Atom _NET_WM_WINDOW_TYPE; Atom _NET_WM_WINDOW_TYPE_NORMAL; + Atom _NET_WM_PID; int wmstate_count; Atom wmstate_atoms[3]; Uint32 fevent = 0; @@ -414,20 +415,6 @@ X11_CreateWindow(_THIS, SDL_Window * window) } #endif - sizehints = XAllocSizeHints(); - if (sizehints) { - if (!(window->flags & SDL_WINDOW_RESIZABLE)) { - sizehints->min_width = sizehints->max_width = window->w; - sizehints->min_height = sizehints->max_height = window->h; - sizehints->flags = PMaxSize | PMinSize; - } - sizehints->x = window->x; - sizehints->y = window->y; - sizehints->flags |= USPosition; - XSetWMNormalHints(display, w, sizehints); - XFree(sizehints); - } - if (window->flags & SDL_WINDOW_BORDERLESS) { SDL_bool set; Atom WM_HINTS; @@ -511,22 +498,32 @@ X11_CreateWindow(_THIS, SDL_Window * window) } } - /* Set the input hints so we get keyboard input */ - wmhints = XAllocWMHints(); - if (wmhints) { - wmhints->input = True; - wmhints->flags = InputHint; - XSetWMHints(display, w, wmhints); - XFree(wmhints); + /* Setup the normal size hints */ + if (!(window->flags & SDL_WINDOW_RESIZABLE)) { + sizehints.min_width = sizehints.max_width = window->w; + sizehints.min_height = sizehints.max_height = window->h; + sizehints.flags = PMaxSize | PMinSize; } - - /* Set the class hints so we can get an icon (AfterStep) */ - classhints = XAllocClassHint(); - if (classhints != NULL) { - classhints->res_name = data->classname; - classhints->res_class = data->classname; - XSetClassHint(display, w, classhints); - XFree(classhints); + sizehints.x = window->x; + sizehints.y = window->y; + sizehints.flags |= USPosition; + + /* Setup the input hints so we get keyboard input */ + wmhints.input = True; + wmhints.flags = InputHint; + + /* Setup the class hints so we can get an icon (AfterStep) */ + classhints.res_name = data->classname; + classhints.res_class = data->classname; + + /* Set the size, input and class hints, and define WM_CLIENT_MACHINE and WM_LOCALE_NAME */ + XSetWMProperties(display, w, NULL, NULL, NULL, 0, &sizehints, &wmhints, &classhints); + + /* Set the PID related to the window for the given hostname, if possible */ + if (data->pid > 0) { + _NET_WM_PID = XInternAtom(display, "_NET_WM_PID", False); + XChangeProperty(display, w, _NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, + (unsigned char *)&data->pid, 1); } /* Set the window manager state */