X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=lib%2Fswm_hack.c;h=c5f5b5b8945d7a0c8f114197ede767f436e4d7f8;hb=3677d289e8a55e369b09eee4eb64df2f59f7922a;hp=5d60d617b584f0635db47bc492b68575351de84f;hpb=bbb499e87a8c905214478e1badd67465701fc5cb;p=spectrwm.git diff --git a/lib/swm_hack.c b/lib/swm_hack.c index 5d60d61..c5f5b5b 100644 --- a/lib/swm_hack.c +++ b/lib/swm_hack.c @@ -1,4 +1,3 @@ -/* $scrotwm$ */ /* * Copyright (c) 2009 Marco Peereboom * Copyright (c) 2009 Ryan McBride @@ -56,7 +55,9 @@ static void *lib_xtlib = NULL; static Window root = None; static int xterm = 0; -static Display *dpy = NULL; +static Display *display = NULL; + +void set_property(Display *, Window, char *, char *); /* Find our root window */ static Window @@ -77,19 +78,38 @@ MyRoot(Display * dpy) return root; } + +typedef Atom (XIA) (Display *display, char *atom_name, Bool + only_if_exists); + +typedef int (XCP) (Display *display, Window w, Atom property, + Atom type, int format, int mode, unsigned char *data, + int nelements); + #define SWM_PROPLEN (16) void set_property(Display *dpy, Window id, char *name, char *val) { Atom atom = 0; char prop[SWM_PROPLEN]; + static XIA *xia = NULL; + static XCP *xcp = NULL; + + /* find the real Xlib and the real X function */ + if (!lib_xlib) + lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); + if (!xia) + xia = (XIA *) dlsym(lib_xlib, "XInternAtom"); + if (!xcp) + xcp = (XCP *) dlsym(lib_xlib, "XChangeProperty"); /* Try to update the window's workspace property */ - atom = XInternAtom(dpy, name, False); - if (atom) + atom = (*xia)(dpy, name, False); + if (atom) if (snprintf(prop, SWM_PROPLEN, "%s", val) < SWM_PROPLEN) - XChangeProperty(dpy, id, atom, XA_STRING, - 8, PropModeReplace, prop, SWM_PROPLEN); + (*xcp)(dpy, id, atom, XA_STRING, + 8, PropModeReplace, (unsigned char *)prop, + strlen((char *)prop)); } typedef Window(CWF) (Display * _display, Window _parent, int _x, @@ -102,7 +122,7 @@ typedef Window(CWF) (Display * _display, Window _parent, int _x, /* XCreateWindow intercept hack */ Window -XCreateWindow(Display * display, Window parent, int x, int y, +XCreateWindow(Display *dpy, Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, int depth, unsigned int clss, Visual * visual, @@ -117,20 +137,20 @@ XCreateWindow(Display * display, Window parent, int x, int y, lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); if (!func) { func = (CWF *) dlsym(lib_xlib, "XCreateWindow"); - dpy = display; + display = dpy; } - if (parent == DefaultRootWindow(display)) - parent = MyRoot(display); + if (parent == DefaultRootWindow(dpy)) + parent = MyRoot(dpy); - id = (*func) (display, parent, x, y, width, height, border_width, + id = (*func) (dpy, parent, x, y, width, height, border_width, depth, clss, visual, valuemask, attributes); if (id) { if ((env = getenv("_SWM_WS")) != NULL) - set_property(display, id, "_SWM_WS", env); + set_property(dpy, id, "_SWM_WS", env); if ((env = getenv("_SWM_PID")) != NULL) - set_property(display, id, "_SWM_PID", env); + set_property(dpy, id, "_SWM_PID", env); if ((env = getenv("_SWM_XTERM_FONTADJ")) != NULL) { unsetenv("_SWM_XTERM_FONTADJ"); xterm = 1; @@ -148,7 +168,7 @@ typedef Window(CSWF) (Display * _display, Window _parent, int _x, /* XCreateSimpleWindow intercept hack */ Window -XCreateSimpleWindow(Display * display, Window parent, int x, int y, +XCreateSimpleWindow(Display *dpy, Window parent, int x, int y, unsigned int width, unsigned int height, unsigned int border_width, unsigned long border, unsigned long background) @@ -163,17 +183,17 @@ XCreateSimpleWindow(Display * display, Window parent, int x, int y, if (!func) func = (CSWF *) dlsym(lib_xlib, "XCreateSimpleWindow"); - if (parent == DefaultRootWindow(display)) - parent = MyRoot(display); + if (parent == DefaultRootWindow(dpy)) + parent = MyRoot(dpy); - id = (*func) (display, parent, x, y, width, height, + id = (*func) (dpy, parent, x, y, width, height, border_width, border, background); if (id) { if ((env = getenv("_SWM_WS")) != NULL) - set_property(display, id, "_SWM_WS", env); + set_property(dpy, id, "_SWM_WS", env); if ((env = getenv("_SWM_PID")) != NULL) - set_property(display, id, "_SWM_PID", env); + set_property(dpy, id, "_SWM_PID", env); if ((env = getenv("_SWM_XTERM_FONTADJ")) != NULL) { unsetenv("_SWM_XTERM_FONTADJ"); xterm = 1; @@ -187,7 +207,7 @@ typedef int (RWF) (Display * _display, Window _window, Window _parent, /* XReparentWindow intercept hack */ int -XReparentWindow(Display * display, Window window, Window parent, int x, int y) +XReparentWindow(Display *dpy, Window window, Window parent, int x, int y) { static RWF *func = NULL; @@ -197,10 +217,10 @@ XReparentWindow(Display * display, Window window, Window parent, int x, int y) if (!func) func = (RWF *) dlsym(lib_xlib, "XReparentWindow"); - if (parent == DefaultRootWindow(display)) - parent = MyRoot(display); + if (parent == DefaultRootWindow(dpy)) + parent = MyRoot(dpy); - return (*func) (display, window, parent, x, y); + return (*func) (dpy, window, parent, x, y); } typedef void (ANEF) (XtAppContext app_context, XEvent *event_return); @@ -216,16 +236,16 @@ void XtAppNextEvent(XtAppContext app_context, XEvent *event_return) { static ANEF *func = NULL; - static int kp_add = 0, kp_subtract = 0; + static KeyCode kp_add = 0, kp_subtract = 0; /* find the real Xlib and the real X function */ if (!lib_xtlib) lib_xtlib = dlopen("libXt.so", RTLD_GLOBAL | RTLD_LAZY); if (!func) { func = (ANEF *) dlsym(lib_xtlib, "XtAppNextEvent"); - if (dpy != NULL) { - kp_add = XKeysymToKeycode(dpy, XK_KP_Add); - kp_subtract = XKeysymToKeycode(dpy, XK_KP_Subtract); + if (display != NULL) { + kp_add = XKeysymToKeycode(display, XK_KP_Add); + kp_subtract = XKeysymToKeycode(display, XK_KP_Subtract); } }