From a3b566b69b5ad21bfe8a83c28ce31bb836785032 Mon Sep 17 00:00:00 2001 From: Reginald Kennedy Date: Thu, 21 May 2015 02:40:54 +0800 Subject: [PATCH] Cleanup libswmhack.so. --- lib/swm_hack.c | 132 +++++++++++++++++-------------------------------- 1 file changed, 46 insertions(+), 86 deletions(-) diff --git a/lib/swm_hack.c b/lib/swm_hack.c index 40fa224..04be57b 100644 --- a/lib/swm_hack.c +++ b/lib/swm_hack.c @@ -41,6 +41,7 @@ * Basic hack mechanism (dlopen etc.) taken from e_hack.c in e17. */ #include +#include #include #include #include @@ -54,11 +55,17 @@ static void *lib_xlib = NULL; static void *lib_xtlib = NULL; static Window root = None; -static int xterm = 0; +static bool xterm = false; static Display *display = NULL; void set_property(Display *, Window, char *, char *); +#ifdef _GNU_SOURCE +#define DLOPEN(s) RTLD_NEXT +#else +#define DLOPEN(s) dlopen((s), RTLD_GLOBAL | RTLD_LAZY) +#endif + /* Find our root window */ static Window MyRoot(Display * dpy) @@ -71,7 +78,7 @@ MyRoot(Display * dpy) root = DefaultRootWindow(dpy); s = getenv("ENL_WM_ROOT"); - if (!s) + if (s == NULL) return root; sscanf(s, "%lx", &root); @@ -95,23 +102,15 @@ set_property(Display *dpy, Window id, char *name, char *val) static XIA *xia = NULL; static XCP *xcp = NULL; -#ifdef _GNU_SOURCE - /* load the function pointer with RTLD_NEXT - * this might be the real X function or another - * preloaded intercept - */ - if (!lib_xlib) - lib_xlib = RTLD_NEXT; -#else - /* find the real Xlib and the real X function */ - if (!lib_xlib) - lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); -#endif - if (lib_xlib && !xia) - xia = (XIA *) dlsym(lib_xlib, "XInternAtom"); - if (lib_xlib && !xcp) - xcp = (XCP *) dlsym(lib_xlib, "XChangeProperty"); - if (!xia || !xcp) { + if (lib_xlib == NULL) + lib_xlib = DLOPEN("libX11.so"); + if (lib_xlib) { + if (xia == NULL) + xia = (XIA *) dlsym(lib_xlib, "XInternAtom"); + if (xcp == NULL) + xcp = (XCP *) dlsym(lib_xlib, "XChangeProperty"); + } + if (xia == NULL || xcp == NULL) { fprintf(stderr, "libswmhack.so: ERROR: %s\n", dlerror()); return; } @@ -145,41 +144,31 @@ XCreateWindow(Display *dpy, Window parent, int x, int y, char *env; Window id; -#ifdef _GNU_SOURCE - /* load the function pointer with RTLD_NEXT - * this might be the real X function or another - * preloaded intercept - */ - if (!lib_xlib) - lib_xlib = RTLD_NEXT; -#else - /* find the real Xlib and the real X function */ - if (!lib_xlib) - lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); -#endif - if (lib_xlib && !func) { + if (lib_xlib == NULL) + lib_xlib = DLOPEN("libX11.so"); + if (lib_xlib && func == NULL) { func = (CWF *) dlsym(lib_xlib, "XCreateWindow"); display = dpy; } - if (!func) { + if (func == NULL) { fprintf(stderr, "libswmhack.so: ERROR: %s\n", dlerror()); - return BadImplementation; + return None; } if (parent == DefaultRootWindow(dpy)) parent = MyRoot(dpy); - + id = (*func) (dpy, parent, x, y, width, height, border_width, depth, clss, visual, valuemask, attributes); if (id) { - if ((env = getenv("_SWM_WS")) != NULL) + if ((env = getenv("_SWM_WS")) != NULL) set_property(dpy, id, "_SWM_WS", env); if ((env = getenv("_SWM_PID")) != NULL) set_property(dpy, id, "_SWM_PID", env); if ((env = getenv("_SWM_XTERM_FONTADJ")) != NULL) { unsetenv("_SWM_XTERM_FONTADJ"); - xterm = 1; + xterm = true; } } return (id); @@ -203,23 +192,13 @@ XCreateSimpleWindow(Display *dpy, Window parent, int x, int y, char *env; Window id; -#ifdef _GNU_SOURCE - /* load the function pointer with RTLD_NEXT - * this might be the real X function or another - * preloaded intercept - */ - if (!lib_xlib) - lib_xlib = RTLD_NEXT; -#else - /* find the real Xlib and the real X function */ - if (!lib_xlib) - lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); -#endif - if (lib_xlib && !func) + if (lib_xlib == NULL) + lib_xlib = DLOPEN("libX11.so"); + if (lib_xlib && func == NULL) func = (CSWF *) dlsym(lib_xlib, "XCreateSimpleWindow"); - if (!func) { + if (func == NULL) { fprintf(stderr, "libswmhack.so: ERROR: %s\n", dlerror()); - return BadImplementation; + return None; } if (parent == DefaultRootWindow(dpy)) @@ -229,13 +208,13 @@ XCreateSimpleWindow(Display *dpy, Window parent, int x, int y, border_width, border, background); if (id) { - if ((env = getenv("_SWM_WS")) != NULL) + if ((env = getenv("_SWM_WS")) != NULL) set_property(dpy, id, "_SWM_WS", env); if ((env = getenv("_SWM_PID")) != NULL) set_property(dpy, id, "_SWM_PID", env); if ((env = getenv("_SWM_XTERM_FONTADJ")) != NULL) { unsetenv("_SWM_XTERM_FONTADJ"); - xterm = 1; + xterm = true; } } return (id); @@ -250,23 +229,14 @@ XReparentWindow(Display *dpy, Window window, Window parent, int x, int y) { static RWF *func = NULL; -#ifdef _GNU_SOURCE - /* load the function pointer with RTLD_NEXT - * this might be the real X function or another - * preloaded intercept - */ - if (!lib_xlib) - lib_xlib = RTLD_NEXT; -#else - /* find the real Xlib and the real X function */ - if (!lib_xlib) - lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY); -#endif - if (lib_xlib && !func) + if (lib_xlib == NULL) + lib_xlib = DLOPEN("libX11.so"); + if (lib_xlib && func == NULL) func = (RWF *) dlsym(lib_xlib, "XReparentWindow"); - if (!func) { + if (func == NULL) { fprintf(stderr, "libswmhack.so: ERROR: %s\n", dlerror()); - return BadImplementation; + /* Xlib function always returns 1, so return 0 here. */ + return 0; } if (parent == DefaultRootWindow(dpy)) @@ -290,26 +260,16 @@ XtAppNextEvent(XtAppContext app_context, XEvent *event_return) static ANEF *func = NULL; static KeyCode kp_add = 0, kp_subtract = 0; -#ifdef _GNU_SOURCE - /* load the function pointer with RTLD_NEXT - * this might be the real X function or another - * preloaded intercept - */ - if (!lib_xtlib) - lib_xtlib = RTLD_NEXT; -#else - /* find the real Xlib and the real X function */ - if (!lib_xtlib) - lib_xtlib = dlopen("libXt.so", RTLD_GLOBAL | RTLD_LAZY); -#endif - if (lib_xtlib && !func) { + if (lib_xtlib == NULL) + lib_xtlib = DLOPEN("libXt.so"); + if (lib_xtlib && func == NULL) { func = (ANEF *) dlsym(lib_xtlib, "XtAppNextEvent"); - if (display != NULL) { + if (display) { kp_add = XKeysymToKeycode(display, XK_KP_Add); kp_subtract = XKeysymToKeycode(display, XK_KP_Subtract); } } - if (!func) { + if (func == NULL) { fprintf(stderr, "libswmhack.so: ERROR: %s\n", dlerror()); return; } @@ -319,9 +279,9 @@ XtAppNextEvent(XtAppContext app_context, XEvent *event_return) /* Return here if it's not an Xterm. */ if (!xterm) return; - + /* Allow spoofing of font change keystrokes. */ - if ((event_return->type == KeyPress || + if ((event_return->type == KeyPress || event_return->type == KeyRelease) && event_return->xkey.state == ShiftMask && (event_return->xkey.keycode == kp_add || -- 2.39.2