diff options
author | okan <okan> | 2018-02-06 15:05:20 +0000 |
---|---|---|
committer | okan <okan> | 2018-02-06 15:05:20 +0000 |
commit | 63ebc0cd8b65300104929d3463fed431996f4374 (patch) | |
tree | f547800ff23c62896ad849d2148ec7adf3f08f0d /kbfunc.c | |
parent | a0774f4777a4a94ea4bbc867c16cde3167075f80 (diff) | |
parent | f3211427c16b755db20bc71ce4074e9fb9aae8af (diff) | |
download | cwm-63ebc0cd8b65300104929d3463fed431996f4374.tar.gz cwm-63ebc0cd8b65300104929d3463fed431996f4374.tar.xz cwm-63ebc0cd8b65300104929d3463fed431996f4374.zip |
cvsimport
* refs/heads/master: (28 commits) Use screen's saved view instead of re-querying the server. Slightly expand and expose verbose debugging. add debugging for x events Add a simple debug logging mechanism. Simplification; use asprintf where appropriate now. Use func attributes where appropriate. Fix wins comparison declaration since it's unsigned from XQueryTree(). Generate name_to_func[] in a clean and readable fashion. Shrink tier[] by one after removing matchname in r1.55. If the requested group number is invalid, bail but don't kill cwm. Quick fix: exit after a failed execvp in u_spawn instead; previously we did in u_exec, but the introduction of re-exec'ing the previous invocation of cwm if 'exec_wm' failed missed the 'exec' failing path. Will likely split out as a proper fix. Only exec the fallback when in CWM_EXEC_WM state. Typo, from Julien Steinhauser. Convert menu-exec-wm from an abritrary exec menu, into a config-based menu from which one may configure (wm <name> <path_and_args>) (and choose) specific window managers to replace the running one. 'wm cwm cwm' is included by default. As done for buttonrelease, work specific un-cycling and un-highlighting actions into the keyrelease event, only performing what's actually needed for each; should result in much fewer events against keyreleases. No intended behaviour change. Merge group_toggle_membership_leave into the buttonrelease event and only do border work for a group/ungroup action. add helper function client_show to bring together like actions for unhide/raise Add support for re-exec'ing with SIGHUP; equivalent to the already built-in 'restart' function. Use poll and XNextEvent to replace XNextEvent blocking inside the x11 event handler. zap stray that snuck in ...
Diffstat (limited to 'kbfunc.c')
-rw-r--r-- | kbfunc.c | 110 |
1 files changed, 61 insertions, 49 deletions
diff --git a/kbfunc.c b/kbfunc.c index e2a125b..b6fb13e 100644 --- a/kbfunc.c +++ b/kbfunc.c @@ -401,7 +401,14 @@ kbfunc_client_vtile(void *ctx, struct cargs *cargs) void kbfunc_client_cycle(void *ctx, struct cargs *cargs) { - client_cycle(ctx, cargs->flag); + struct screen_ctx *sc = ctx; + + /* For X apps that ignore/steal events. */ + if (cargs->xev == CWM_XEV_KEY) + XGrabKeyboard(X_Dpy, sc->rootwin, True, + GrabModeAsync, GrabModeAsync, CurrentTime); + + client_cycle(sc, cargs->flag); } void @@ -409,12 +416,12 @@ kbfunc_client_toggle_group(void *ctx, struct cargs *cargs) { struct client_ctx *cc = ctx; - /* For X apps that steal events. */ + /* For X apps that ignore/steal events. */ if (cargs->xev == CWM_XEV_KEY) XGrabKeyboard(X_Dpy, cc->win, True, GrabModeAsync, GrabModeAsync, CurrentTime); - group_toggle_membership_enter(cc); + group_toggle_membership(cc); } void @@ -454,8 +461,11 @@ kbfunc_menu_client(void *ctx, struct cargs *cargs) struct client_ctx *cc, *old_cc; struct menu *mi; struct menu_q menuq; - int m = (cargs->xev == CWM_XEV_BTN); int all = (cargs->flag & CWM_MENU_WINDOW_ALL); + int mflags = 0; + + if (cargs->xev == CWM_XEV_BTN) + mflags |= CWM_MENU_LIST; old_cc = client_current(); @@ -468,15 +478,10 @@ kbfunc_menu_client(void *ctx, struct cargs *cargs) menuq_add(&menuq, cc, NULL); } - if ((mi = menu_filter(sc, &menuq, - (m) ? NULL : "window", NULL, - ((m) ? CWM_MENU_LIST : 0), + if ((mi = menu_filter(sc, &menuq, "window", NULL, mflags, search_match_client, search_print_client)) != NULL) { cc = (struct client_ctx *)mi->ctx; - if (cc->flags & CLIENT_HIDDEN) - client_unhide(cc); - else - client_raise(cc); + client_show(cc); if (old_cc) client_ptrsave(old_cc); client_ptrwarp(cc); @@ -492,7 +497,10 @@ kbfunc_menu_cmd(void *ctx, struct cargs *cargs) struct cmd_ctx *cmd; struct menu *mi; struct menu_q menuq; - int m = (cargs->xev == CWM_XEV_BTN); + int mflags = 0; + + if (cargs->xev == CWM_XEV_BTN) + mflags |= CWM_MENU_LIST; TAILQ_INIT(&menuq); TAILQ_FOREACH(cmd, &Conf.cmdq, entry) { @@ -502,9 +510,7 @@ kbfunc_menu_cmd(void *ctx, struct cargs *cargs) menuq_add(&menuq, cmd, NULL); } - if ((mi = menu_filter(sc, &menuq, - (m) ? NULL : "application", NULL, - ((m) ? CWM_MENU_LIST : 0), + if ((mi = menu_filter(sc, &menuq, "application", NULL, mflags, search_match_cmd, search_print_cmd)) != NULL) { cmd = (struct cmd_ctx *)mi->ctx; u_spawn(cmd->path); @@ -520,7 +526,10 @@ kbfunc_menu_group(void *ctx, struct cargs *cargs) struct group_ctx *gc; struct menu *mi; struct menu_q menuq; - int m = (cargs->xev == CWM_XEV_BTN); + int mflags = 0; + + if (cargs->xev == CWM_XEV_BTN) + mflags |= CWM_MENU_LIST; TAILQ_INIT(&menuq); TAILQ_FOREACH(gc, &sc->groupq, entry) { @@ -529,8 +538,7 @@ kbfunc_menu_group(void *ctx, struct cargs *cargs) menuq_add(&menuq, gc, NULL); } - if ((mi = menu_filter(sc, &menuq, - (m) ? NULL : "group", NULL, (CWM_MENU_LIST), + if ((mi = menu_filter(sc, &menuq, "group", NULL, mflags, search_match_group, search_print_group)) != NULL) { gc = (struct group_ctx *)mi->ctx; (group_holds_only_hidden(gc)) ? @@ -541,6 +549,33 @@ kbfunc_menu_group(void *ctx, struct cargs *cargs) } void +kbfunc_menu_wm(void *ctx, struct cargs *cargs) +{ + struct screen_ctx *sc = ctx; + struct cmd_ctx *wm; + struct menu *mi; + struct menu_q menuq; + int mflags = 0; + + if (cargs->xev == CWM_XEV_BTN) + mflags |= CWM_MENU_LIST; + + TAILQ_INIT(&menuq); + TAILQ_FOREACH(wm, &Conf.wmq, entry) + menuq_add(&menuq, wm, NULL); + + if ((mi = menu_filter(sc, &menuq, "wm", NULL, mflags, + search_match_wm, search_print_wm)) != NULL) { + wm = (struct cmd_ctx *)mi->ctx; + free(Conf.wm_argv); + Conf.wm_argv = xstrdup(wm->path); + cwm_status = CWM_EXEC_WM; + } + + menuq_clear(&menuq); +} + +void kbfunc_menu_exec(void *ctx, struct cargs *cargs) { #define NPATHS 256 @@ -548,24 +583,12 @@ kbfunc_menu_exec(void *ctx, struct cargs *cargs) char **ap, *paths[NPATHS], *path, *pathcpy; char tpath[PATH_MAX]; struct stat sb; - const char *label; DIR *dirp; struct dirent *dp; struct menu *mi; struct menu_q menuq; - int l, i, cmd = cargs->flag; - - switch (cmd) { - case CWM_MENU_EXEC_EXEC: - label = "exec"; - break; - case CWM_MENU_EXEC_WM: - label = "wm"; - break; - default: - errx(1, "%s: invalid cmd %d", __func__, cmd); - /* NOTREACHED */ - } + int l, i; + int mflags = (CWM_MENU_DUMMY | CWM_MENU_FILE); TAILQ_INIT(&menuq); @@ -605,24 +628,11 @@ kbfunc_menu_exec(void *ctx, struct cargs *cargs) } free(path); - if ((mi = menu_filter(sc, &menuq, label, NULL, - (CWM_MENU_DUMMY | CWM_MENU_FILE), + if ((mi = menu_filter(sc, &menuq, "exec", NULL, mflags, search_match_exec, search_print_text)) != NULL) { if (mi->text[0] == '\0') goto out; - switch (cmd) { - case CWM_MENU_EXEC_EXEC: - u_spawn(mi->text); - break; - case CWM_MENU_EXEC_WM: - cwm_status = CWM_EXEC_WM; - free(Conf.wm_argv); - Conf.wm_argv = xstrdup(mi->text); - break; - default: - errx(1, "%s: egad, cmd changed value!", __func__); - /* NOTREACHED */ - } + u_spawn(mi->text); } out: if (mi != NULL && mi->dummy) @@ -644,6 +654,7 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs) int l; size_t len; ssize_t slen; + int mflags = (CWM_MENU_DUMMY); TAILQ_FOREACH(cmd, &Conf.cmdq, entry) { if (strcmp(cmd->name, "term") == 0) @@ -679,7 +690,7 @@ kbfunc_menu_ssh(void *ctx, struct cargs *cargs) err(1, "%s", path); (void)fclose(fp); menu: - if ((mi = menu_filter(sc, &menuq, "ssh", NULL, (CWM_MENU_DUMMY), + if ((mi = menu_filter(sc, &menuq, "ssh", NULL, mflags, search_match_text, search_print_text)) != NULL) { if (mi->text[0] == '\0') goto out; @@ -701,11 +712,12 @@ kbfunc_client_menu_label(void *ctx, struct cargs *cargs) struct client_ctx *cc = ctx; struct menu *mi; struct menu_q menuq; + int mflags = (CWM_MENU_DUMMY); TAILQ_INIT(&menuq); /* dummy is set, so this will always return */ - mi = menu_filter(cc->sc, &menuq, "label", cc->label, (CWM_MENU_DUMMY), + mi = menu_filter(cc->sc, &menuq, "label", cc->label, mflags, search_match_text, search_print_text); if (!mi->abort) { |