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 ...
This commit is contained in:
110
kbfunc.c
110
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)) ?
|
||||
@@ -540,6 +548,33 @@ kbfunc_menu_group(void *ctx, struct cargs *cargs)
|
||||
menuq_clear(&menuq);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user