Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
X11: Move to XSetWMProperties and add support to _NET_WM_PID
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
3v1n0 committed Jun 27, 2011
1 parent 3f8ce08 commit 1698dc0
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 32 deletions.
3 changes: 3 additions & 0 deletions src/video/x11/SDL_x11video.c
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11video.h
Expand Up @@ -69,6 +69,7 @@ typedef struct SDL_VideoData
{
Display *display;
char *classname;
pid_t pid;
XIM im;
Uint32 screensaver_activity;
int numwindows;
Expand Down
61 changes: 29 additions & 32 deletions src/video/x11/SDL_x11window.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 1698dc0

Please sign in to comment.