From b012ee7a79c6ebc0f6818a108629571a61e2e5a7 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Tue, 7 Apr 2015 00:08:48 +0000 Subject: [PATCH] Remove root window tracking This is really only applicable to X11, and passing it around though all the function isn't really needed anyway. The only place it was used was in the watch/unwatch functions, but we can just pass NULL to say that we want all events instead of events for a particular window. --- main.c | 10 +++++----- sys-win32.c | 23 ++++++++++------------- sys-x11.c | 20 ++++++++++++-------- sys.h | 8 ++++---- wm-mono.c | 14 +++++++------- wm-tags.c | 8 ++++---- wm-wmii.c | 44 ++++++++++++++++++++++---------------------- wm.h | 4 ++-- 8 files changed, 66 insertions(+), 65 deletions(-) diff --git a/main.c b/main.c index f512b24..58150d3 100644 --- a/main.c +++ b/main.c @@ -34,12 +34,12 @@ int main(int argc, char **argv) signal(SIGINT, on_sigint); conf_init(argc, argv); - win_t *root = sys_init(); - wm_init(root); + sys_init(); + wm_init(); - sys_run(root); + sys_run(); - wm_free(root); - sys_free(root); + wm_free(); + sys_free(); return 0; } diff --git a/sys-win32.c b/sys-win32.c index 96d0f20..c0989de 100644 --- a/sys-win32.c +++ b/sys-win32.c @@ -47,7 +47,7 @@ typedef struct { /* Global data */ static int shellhookid; static void *cache; -static win_t *root; +static HWND root; static list_t *screens; /* Conversion functions */ @@ -200,7 +200,7 @@ LRESULT CALLBACK KbdProc(int msg, WPARAM wParam, LPARAM lParam) msg, wParam, lParam, st->vkCode, st->scanCode, st->flags, ev, mod2int(mod)); - return wm_handle_event(win_focused() ?: root, ev, mod, getptr()) + return wm_handle_event(win_focused(), ev, mod, getptr()) || CallNextHookEx(0, msg, wParam, lParam); } @@ -401,17 +401,16 @@ void sys_unwatch(win_t *win, event_t ev, mod_t mod) //printf("sys_unwatch: %p\n", win); } -list_t *sys_info(win_t *win) +list_t *sys_info(void) { if (screens == NULL) EnumDisplayMonitors(NULL, NULL, MonProc, (LPARAM)&screens); return screens; } -win_t *sys_init(void) +void sys_init(void) { HINSTANCE hInst = GetModuleHandle(NULL); - HWND hwnd = NULL; /* Load configuration */ no_capture = conf_get_int("main.no-capture", no_capture); @@ -432,7 +431,7 @@ win_t *sys_init(void) SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0); /* Create shell hook window */ - if (!(hwnd = CreateWindowEx(0, "wmpus_class", "wmpus", 0, + if (!(root = CreateWindowEx(0, "wmpus_class", "wmpus", 0, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, HWND_MESSAGE, NULL, hInst, NULL))) printf("sys_init: Error Creating Shell Hook Window - %lu\n", GetLastError()); @@ -442,7 +441,7 @@ win_t *sys_init(void) GetModuleHandle("USER32.DLL"), "RegisterShellHookWindow"); if (!RegisterShellHookWindow) printf("sys_init: Error Finding RegisterShellHookWindow - %lu\n", GetLastError()); - if (!RegisterShellHookWindow(hwnd)) + if (!RegisterShellHookWindow(root)) printf("sys_init: Error Registering ShellHook Window - %lu\n", GetLastError()); shellhookid = RegisterWindowMessage("SHELLHOOK"); @@ -452,18 +451,16 @@ win_t *sys_init(void) //SetWindowsHookEx(WH_SHELL, ShlProc, hInst, 0); /* Alternate ways to get input */ - //if (!RegisterHotKey(hwnd, 123, MOD_CONTROL, VK_LBUTTON)) + //if (!RegisterHotKey(root, 123, MOD_CONTROL, VK_LBUTTON)) // printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError()); //if (!RegisterHotKey(NULL, 123, MOD_CONTROL, VK_LBUTTON)) // printf("sys_init: Error Registering Hotkey - %lu\n", GetLastError()); /* Capture ctrl-c and console widnow close */ SetConsoleCtrlHandler(CtrlProc, TRUE); - - return root = win_new(hwnd,0); } -void sys_run(win_t *root) +void sys_run(void) { MSG msg = {}; if (!no_capture) @@ -477,10 +474,10 @@ void sys_run(win_t *root) void sys_exit(void) { - PostMessage(root->sys->hwnd, WM_QUIT, 0, 0); + PostMessage(root, WM_QUIT, 0, 0); } -void sys_free(win_t *root) +void sys_free(void) { /* I don't really care about this * since I don't know how to use diff --git a/sys-x11.c b/sys-x11.c index 2f0087f..5b043ed 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -666,6 +666,8 @@ void sys_show(win_t *win, state_t state) void sys_watch(win_t *win, event_t ev, mod_t mod) { //printf("sys_watch: %p - %x %hhx\n", win, ev, mod); + if (win == NULL) + win = root; XWindowAttributes attr; XGetWindowAttributes(win->sys->dpy, win->sys->xid, &attr); long mask = attr.your_event_mask; @@ -686,19 +688,21 @@ void sys_watch(win_t *win, event_t ev, mod_t mod) void sys_unwatch(win_t *win, event_t ev, mod_t mod) { + if (win == NULL) + win = root; if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) XUngrabButton(win->sys->dpy, ev2xb(ev), mod2x(mod), win->sys->xid); } -list_t *sys_info(win_t *win) +list_t *sys_info(void) { /* Use global copy of screens so we can add struts */ if (screens == NULL) { /* Add Xinerama screens */ int n = 0; XineramaScreenInfo *info = NULL; - if (XineramaIsActive(win->sys->dpy)) - info = XineramaQueryScreens(win->sys->dpy, &n); + if (XineramaIsActive(root->sys->dpy)) + info = XineramaQueryScreens(root->sys->dpy, &n); for (int i = 0; i < n; i++) { win_t *screen = new0(win_t); screen->x = info[i].x_org; @@ -712,13 +716,13 @@ list_t *sys_info(win_t *win) if (screens == NULL) { /* No xinerama support */ win_t *screen = new0(win_t); - *screen = *win; + *screen = *root; screens = list_insert(NULL, screen); } return screens; } -win_t *sys_init(void) +void sys_init(void) { Display *dpy; Window xid; @@ -753,10 +757,10 @@ win_t *sys_init(void) XSelectInput(dpy, xid, SubstructureRedirectMask|SubstructureNotifyMask); xerrorxlib = XSetErrorHandler(xerror); - return root = win_find(dpy, xid, 1); + root = win_find(dpy, xid, 1); } -void sys_run(win_t *root) +void sys_run(void) { /* Add each initial window */ if (!no_capture) { @@ -786,7 +790,7 @@ void sys_exit(void) running = 0; } -void sys_free(win_t *root) +void sys_free(void) { XCloseDisplay(root->sys->dpy); while (screens) { diff --git a/sys.h b/sys.h index 5dc2374..60d705e 100644 --- a/sys.h +++ b/sys.h @@ -47,16 +47,16 @@ void sys_unwatch(win_t *win, event_t event, mod_t mod); /* Return a list of windows representing the geometry of the * physical displays attached to the computer. */ -list_t *sys_info(win_t *root); +list_t *sys_info(void); /* First call, calls wm_insert for each existing window */ -win_t *sys_init(void); +void sys_init(void); /* Starts the main loop */ -void sys_run(win_t *root); +void sys_run(void); /* Exit main loop */ void sys_exit(void); /* Free all static data, for memory debugging */ -void sys_free(win_t *root); +void sys_free(void); diff --git a/wm-mono.c b/wm-mono.c index 4cce155..f100343 100644 --- a/wm-mono.c +++ b/wm-mono.c @@ -89,16 +89,16 @@ void wm_remove(win_t *win) wins = list_remove(wins, node, 0); } -void wm_init(win_t *root) +void wm_init(void) { - screens = sys_info(root); - sys_watch(root, 'j', MOD(.MODKEY=1)); - sys_watch(root, 'k', MOD(.MODKEY=1)); - sys_watch(root, 'c', MOD(.MODKEY=1,.shift=1)); - sys_watch(root, 'q', MOD(.MODKEY=1,.shift=1)); + screens = sys_info(); + sys_watch(NULL, 'j', MOD(.MODKEY=1)); + sys_watch(NULL, 'k', MOD(.MODKEY=1)); + sys_watch(NULL, 'c', MOD(.MODKEY=1,.shift=1)); + sys_watch(NULL, 'q', MOD(.MODKEY=1,.shift=1)); } -void wm_free(win_t *root) +void wm_free(void) { while (wins) wins = list_remove(wins, wins, 0); diff --git a/wm-tags.c b/wm-tags.c index ed3ea79..d0b12ec 100644 --- a/wm-tags.c +++ b/wm-tags.c @@ -85,16 +85,16 @@ void wm_remove(win_t *win) } } -void wm_init(win_t *root) +void wm_init(void) { event_t keys[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; for (int i = 0; i < countof(keys); i++) { - sys_watch(root, keys[i], MOD(.MODKEY=1)); - sys_watch(root, keys[i], MOD(.MODKEY=1,.shift=1)); + sys_watch(NULL, keys[i], MOD(.MODKEY=1)); + sys_watch(NULL, keys[i], MOD(.MODKEY=1,.shift=1)); } } -void wm_free(win_t *root) +void wm_free(void) { for (int i = 0; i < 10; i++) { while (tags[i]) { diff --git a/wm-wmii.c b/wm-wmii.c index b8c6d3d..ba6cea7 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -83,7 +83,6 @@ typedef struct { typedef struct { list_t *tags; // of tag_t tag_t *tag; // focused tag - win_t *root; // root/background window list_t *screens; // display geometry } wm_t; @@ -212,8 +211,8 @@ static void set_mode(win_t *win, layout_t layout) * it as the currently focused window */ static void set_focus(win_t *win) { - if (win == NULL || win == wm->root) { - sys_focus(wm->root); + if (win == NULL) { + sys_focus(NULL); return; } @@ -503,7 +502,7 @@ static void shift_focus(int cols, int rows) if (ncol && COL(ncol) && COL(ncol)->row) set_focus(COL(ncol)->row->win); else - sys_focus(wm->root); + sys_focus(NULL); } } @@ -715,8 +714,6 @@ void wm_update(void) *******************************/ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr) { - if (!win || win == wm_dpy->geom) - return 0; //printf("wm_handle_event: %p - %x %c%c%c%c%c\n", win, ev, // mod.up ? '^' : 'v', // mod.alt ? 'a' : '-', @@ -725,7 +722,7 @@ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr) // mod.win ? 'w' : '-'); /* Mouse events */ - if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) { + if (win && EV_MOUSE0 <= ev && ev <= EV_MOUSE7) { if (ev == EV_MOUSE1 && !mod.MODKEY && !mod.up) return raise_float(win), 0; if ((ev == EV_MOUSE3 && mod.MODKEY && !mod.up) || @@ -745,29 +742,33 @@ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr) return mod.MODKEY || ev == EV_ALT; /* Misc */ - if (mod.MODKEY) { #ifdef DEBUG + if (win && mod.MODKEY) { if (ev == EV_F1) return raise_float(win), 1; if (ev == EV_F2) return set_focus(win), 1; if (ev == EV_F3) return sys_show(win, ST_SHOW), 1; if (ev == EV_F4) return sys_show(win, ST_HIDE), 1; if (ev == EV_F7) return sys_show(win, ST_SHADE), 1; + } #endif + if (mod.MODKEY) { if (ev == EV_F5) return wm_update(), 1; if (ev == EV_F6) return print_txt(), 1; if (ev == 'q') return sys_exit(), 1; + } + if (win && mod.MODKEY) { if (ev == 'f') return wm_handle_state(win, win->state, win->state == ST_FULL ? ST_SHOW : ST_FULL); if (ev == 'g') return wm_handle_state(win, win->state, win->state == ST_MAX ? ST_SHOW : ST_MAX); } - if (mod.MODKEY && mod.shift) { + if (win && mod.MODKEY && mod.shift) { if (ev == 'c') return sys_show(win, ST_CLOSE), 1; } /* Floating layer */ if (ev == ' ') { - if (mod.MODKEY && mod.shift) + if (win && mod.MODKEY && mod.shift) return set_layer(win), 1; if (mod.MODKEY) return switch_layer(), 1; @@ -807,22 +808,22 @@ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr) /* Tag switching */ if (mod.MODKEY && '0' <= ev && ev <= '9') { char name[] = {ev, '\0'}; - if (mod.shift) + if (win && mod.shift) tag_set(win, name); - else + if (!mod.shift) tag_switch(name); wm_update(); } /* Focus change */ - if (ev == EV_ENTER && win->state != ST_SHADE) + if (win && ev == EV_ENTER && win->state != ST_SHADE) return set_focus(win), 1; /* Reset focus after after focus change, * not sure what is causing the focus change in the first place * but preventing that would be a better solution */ if (ev == EV_FOCUS) - sys_focus(wm_focus ?: wm->root); + sys_focus(wm_focus); return mod.MODKEY; } @@ -932,17 +933,16 @@ void wm_remove(win_t *win) print_txt(); } -void wm_init(win_t *root) +void wm_init(void) { - printf("wm_init: %p\n", root); + printf("wm_init\n"); /* Load configuration */ margin = conf_get_int("main.margin", margin); stack = conf_get_int("main.stack", stack); wm = new0(wm_t); - wm->root = root; - wm->screens = list_sort(sys_info(root), 0, sort_win); + wm->screens = list_sort(sys_info(), 0, sort_win); wm->tag = tag_new(wm->screens, "1"); wm->tags = list_insert(NULL, wm->tag); @@ -956,14 +956,14 @@ void wm_init(win_t *root) EV_F7, EV_F8, EV_F9, EV_F10, EV_F11, EV_F12, EV_MOUSE1, EV_MOUSE3}; for (int i = 0; i < countof(ev_e); i++) - sys_watch(root, ev_e[i], MOD()); + sys_watch(NULL, ev_e[i], MOD()); for (int i = 0; i < countof(ev_m); i++) - sys_watch(root, ev_m[i], MOD(.MODKEY=1)); + sys_watch(NULL, ev_m[i], MOD(.MODKEY=1)); for (int i = 0; i < countof(ev_s); i++) - sys_watch(root, ev_s[i], MOD(.MODKEY=1,.shift=1)); + sys_watch(NULL, ev_s[i], MOD(.MODKEY=1,.shift=1)); } -void wm_free(win_t *root) +void wm_free(void) { /* Re-show and free all windows */ while ( wm->tags) { tag_t *tag = wm->tags->data; diff --git a/wm.h b/wm.h index 0f776f9..f9ee2fc 100644 --- a/wm.h +++ b/wm.h @@ -38,7 +38,7 @@ void wm_insert(win_t *win); void wm_remove(win_t *win); /* First call, sets up key bindings, etc */ -void wm_init(win_t *root); +void wm_init(void); /* First call, sets up key bindings, etc */ -void wm_free(win_t *root); +void wm_free(void); -- 2.43.2