X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=scrotwm.c;h=8564d3d7c9d3c0cf0a5d362af2e03a48080f0ad9;hb=1ebdff4405817d61b3ca6a6ebd865bf226fdcfe4;hp=ae837cd28000dcbb631576c59d5e5af97a1dbb87;hpb=7de8cb229dd6bbcf5b05f39d666e1d604ba3c551;p=spectrwm.git diff --git a/scrotwm.c b/scrotwm.c index ae837cd..8564d3d 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -100,6 +100,8 @@ u_int32_t swm_debug = 0 #define MODKEY Mod1Mask #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask)) +char **start_argv; +Atom astate; int (*xerrorxlib)(Display *, XErrorEvent *); int other_wm; int screen; @@ -131,7 +133,6 @@ char *bar_fonts[] = { /* terminal + args */ char *spawn_term[] = { "xterm", NULL }; char *spawn_menu[] = { "dmenu_run", NULL }; -char *spawn_scrotwm[] = { "scrotwm", NULL }; /* layout manager data */ struct swm_geometry { @@ -415,12 +416,13 @@ quit(union arg *args) running = 0; } - void restart(union arg *args) { + DNPRINTF(SWM_D_MISC, "restart: %s\n", start_argv[0]); + XCloseDisplay(display); - execvp(args->argv[0], args->argv); + execvp(start_argv[0], start_argv); fprintf(stderr, "execvp failed\n"); perror(" failed"); quit(NULL); @@ -603,6 +605,7 @@ cycle_layout(union arg *args) ws[current_ws].cur_layout++; if (ws[current_ws].cur_layout->l_stack == NULL) ws[current_ws].cur_layout = &layouts[0]; + ignore_enter = 1; stack(); } @@ -1027,7 +1030,7 @@ struct key { { MODKEY | ShiftMask, XK_Return, spawn, {.argv = spawn_term} }, { MODKEY, XK_p, spawn, {.argv = spawn_menu} }, { MODKEY | ShiftMask, XK_q, quit, {0} }, - { MODKEY, XK_q, restart, {.argv = spawn_scrotwm } }, + { MODKEY, XK_q, restart, {0} }, { MODKEY, XK_m, focus, {.id = SWM_ARG_ID_FOCUSMAIN} }, { MODKEY, XK_1, switchws, {.id = 0} }, { MODKEY, XK_2, switchws, {.id = 1} }, @@ -1146,6 +1149,17 @@ buttonpress(XEvent *e) #endif } +void +set_win_state(struct ws_win *win, long state) +{ + long data[] = {state, None}; + + DNPRINTF(SWM_D_EVENT, "set_win_state: window: %lu\n", win->id); + + XChangeProperty(display, win->id, astate, astate, 32, PropModeReplace, + (unsigned char *)data, 2); +} + struct ws_win * manage_window(Window id) { @@ -1190,6 +1204,8 @@ manage_window(Window id) XSelectInput(display, id, ButtonPressMask | EnterWindowMask | FocusChangeMask | ExposureMask); + set_win_state(win, NormalState); + return (win); } @@ -1254,6 +1270,7 @@ destroynotify(XEvent *e) ws[current_ws].focus = NULL; TAILQ_REMOVE(&ws[current_ws].winlist, win, entry); + set_win_state(win, WithdrawnState); free(win); break; } @@ -1321,9 +1338,16 @@ mappingnotify(XEvent *e) void maprequest(XEvent *e) { + XMapRequestEvent *ev = &e->xmaprequest; + XWindowAttributes wa; + DNPRINTF(SWM_D_EVENT, "maprequest: window: %lu\n", e->xmaprequest.window); + if(!XGetWindowAttributes(display, ev->window, &wa)) + return; + if(wa.override_redirect) + return; manage_window(e->xmaprequest.window); stack(); } @@ -1377,8 +1401,7 @@ xerror_start(Display *d, XErrorEvent *ee) int xerror(Display *d, XErrorEvent *ee) { - fprintf(stderr, "error: %p %p\n", display, ee); - + /* fprintf(stderr, "error: %p %p\n", display, ee); */ return (-1); } @@ -1400,6 +1423,26 @@ active_wm(void) return (0); } +long +getstate(Window w) +{ + int format, status; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + astate = XInternAtom(display, "WM_STATE", False); + status = XGetWindowProperty(display, w, astate, 0L, 2L, False, astate, + &real, &format, &n, &extra, (unsigned char **)&p); + if(status != Success) + return (-1); + if(n != 0) + result = *p; + XFree(p); + return (result); +} + int main(int argc, char *argv[]) { @@ -1411,6 +1454,7 @@ main(int argc, char *argv[]) Window d1, d2, *wins = NULL; XWindowAttributes wa; + start_argv = argv; fprintf(stderr, "Welcome to scrotwm V%s\n", SWM_VERSION); if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) warnx("no locale support"); @@ -1423,6 +1467,7 @@ main(int argc, char *argv[]) screen = DefaultScreen(display); root = RootWindow(display, screen); + astate = XInternAtom(display, "WM_STATE", False); /* look for local and global conf file */ pwd = getpwuid(getuid()); @@ -1465,12 +1510,23 @@ main(int argc, char *argv[]) /* grab existing windows */ if (XQueryTree(display, root, &d1, &d2, &wins, &num)) { + /* normal windows */ + for (i = 0; i < num; i++) { + XGetWindowAttributes(display, wins[i], &wa); + if (!XGetWindowAttributes(display, wins[i], &wa) || + wa.override_redirect || XGetTransientForHint(display, wins[i], &d1)) + continue; + if (wa.map_state == IsViewable || getstate(wins[i]) == NormalState) + manage_window(wins[i]); + } + /* transient windows */ for (i = 0; i < num; i++) { - if (!XGetWindowAttributes(display, wins[i], &wa) - || wa.override_redirect || - XGetTransientForHint(display, wins[i], &d1)) + if(!XGetWindowAttributes(display, wins[i], &wa)) continue; - manage_window(wins[i]); + if (XGetTransientForHint(display, wins[i], &d1) && + (wa.map_state == IsViewable || getstate(wins[i]) == + NormalState)) + manage_window(wins[i]); } if(wins) XFree(wins);