From bc5215f41a5a8084b2496b7a3477a4cdac7b4695 Mon Sep 17 00:00:00 2001 From: okan Date: Tue, 19 Dec 2017 14:30:53 +0000 Subject: Add support for _NET_WM_STATE_SKIP_PAGER and _NET_WM_STATE_SKIP_TASKBAR; eerily close to cwm's 'ignore'. Roughly based on an initial diff from Walter Alejandro Iglesias, but with support for both Atoms and without cwm-based bindings. --- conf.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'conf.c') diff --git a/conf.c b/conf.c index 5b392ef..9668e94 100644 --- a/conf.c +++ b/conf.c @@ -720,6 +720,8 @@ static char *ewmhints[] = { "_NET_WM_STATE_HIDDEN", "_NET_WM_STATE_FULLSCREEN", "_NET_WM_STATE_DEMANDS_ATTENTION", + "_NET_WM_STATE_SKIP_PAGER", + "_NET_WM_STATE_SKIP_TASKBAR", "_CWM_WM_STATE_FREEZE", }; -- cgit 1.4.1 From 6e7dbf5bb71d56bb3443f57cb6b8707a291fe0d2 Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 29 Dec 2017 20:03:46 +0000 Subject: Convert menu-exec-wm from an abritrary exec menu, into a config-based menu from which one may configure (wm ) (and choose) specific window managers to replace the running one. 'wm cwm cwm' is included by default. No objections and seems sensible to sthen. --- calmwm.h | 12 ++++++++---- conf.c | 33 ++++++++++++++++++++++++++++----- cwm.1 | 2 +- cwmrc.5 | 6 ++++++ kbfunc.c | 58 ++++++++++++++++++++++++++++++---------------------------- parse.y | 13 ++++++++++++- search.c | 24 ++++++++++++++++++++++++ 7 files changed, 109 insertions(+), 39 deletions(-) (limited to 'conf.c') diff --git a/calmwm.h b/calmwm.h index d289ceb..0913a76 100644 --- a/calmwm.h +++ b/calmwm.h @@ -255,11 +255,8 @@ struct cmd_ctx { char path[PATH_MAX]; }; TAILQ_HEAD(cmd_q, cmd_ctx); +TAILQ_HEAD(wm_q, cmd_ctx); -enum menu_exec { - CWM_MENU_EXEC_EXEC, - CWM_MENU_EXEC_WM -}; #define CWM_MENU_DUMMY 0x0001 #define CWM_MENU_FILE 0x0002 #define CWM_MENU_LIST 0x0004 @@ -284,6 +281,7 @@ struct conf { struct autogroup_q autogroupq; struct ignore_q ignoreq; struct cmd_q cmdq; + struct wm_q wmq; int ngroups; int stickygroups; int nameqlen; @@ -457,10 +455,13 @@ void search_match_cmd(struct menu_q *, struct menu_q *, char *); void search_match_group(struct menu_q *, struct menu_q *, char *); +void search_match_wm(struct menu_q *, struct menu_q *, + char *); void search_print_client(struct menu *, int); void search_print_cmd(struct menu *, int); void search_print_group(struct menu *, int); void search_print_text(struct menu *, int); +void search_print_wm(struct menu *, int); struct region_ctx *region_find(struct screen_ctx *, int, int); struct geom screen_apply_gap(struct screen_ctx *, struct geom); @@ -500,6 +501,7 @@ void kbfunc_group_alltoggle(void *, struct cargs *); void kbfunc_menu_client(void *, struct cargs *); void kbfunc_menu_cmd(void *, struct cargs *); void kbfunc_menu_group(void *, struct cargs *); +void kbfunc_menu_wm(void *, struct cargs *); void kbfunc_menu_exec(void *, struct cargs *); void kbfunc_menu_ssh(void *, struct cargs *); void kbfunc_client_menu_label(void *, struct cargs *); @@ -529,6 +531,8 @@ void conf_clear(struct conf *); void conf_client(struct client_ctx *); int conf_cmd_add(struct conf *, const char *, const char *); +int conf_wm_add(struct conf *, const char *, + const char *); void conf_cursor(struct conf *); void conf_grab_kbd(Window); void conf_grab_mouse(Window); diff --git a/conf.c b/conf.c index 9668e94..9ef730f 100644 --- a/conf.c +++ b/conf.c @@ -193,10 +193,8 @@ static const struct { CWM_MENU_WINDOW_ALL }, { "menu-window-hidden", kbfunc_menu_client, CWM_CONTEXT_SC, CWM_MENU_WINDOW_HIDDEN }, - { "menu-exec", kbfunc_menu_exec, CWM_CONTEXT_SC, - CWM_MENU_EXEC_EXEC }, - { "menu-exec-wm", kbfunc_menu_exec, CWM_CONTEXT_SC, - CWM_MENU_EXEC_WM }, + { "menu-exec", kbfunc_menu_exec, CWM_CONTEXT_SC, 0 }, + { "menu-exec-wm", kbfunc_menu_wm, CWM_CONTEXT_SC, 0 }, { "terminal", kbfunc_exec_term, CWM_CONTEXT_SC, 0 }, { "lock", kbfunc_exec_lock, CWM_CONTEXT_SC, 0 }, @@ -298,6 +296,7 @@ conf_init(struct conf *c) TAILQ_INIT(&c->ignoreq); TAILQ_INIT(&c->cmdq); + TAILQ_INIT(&c->wmq); TAILQ_INIT(&c->keybindq); TAILQ_INIT(&c->autogroupq); TAILQ_INIT(&c->mousebindq); @@ -314,6 +313,8 @@ conf_init(struct conf *c) conf_cmd_add(c, "lock", "xlock"); conf_cmd_add(c, "term", "xterm"); + conf_wm_add(c, "cwm", "cwm"); + (void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s", c->homedir, ".ssh/known_hosts"); @@ -327,7 +328,7 @@ conf_clear(struct conf *c) struct autogroup *ag; struct bind_ctx *kb, *mb; struct winname *wn; - struct cmd_ctx *cmd; + struct cmd_ctx *cmd, *wm; int i; while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) { @@ -335,6 +336,11 @@ conf_clear(struct conf *c) free(cmd->name); free(cmd); } + while ((wm = TAILQ_FIRST(&c->wmq)) != NULL) { + TAILQ_REMOVE(&c->wmq, wm, entry); + free(wm->name); + free(wm); + } while ((kb = TAILQ_FIRST(&c->keybindq)) != NULL) { TAILQ_REMOVE(&c->keybindq, kb, entry); free(kb); @@ -393,6 +399,23 @@ conf_cmd_remove(struct conf *c, const char *name) } } +int +conf_wm_add(struct conf *c, const char *name, const char *path) +{ + struct cmd_ctx *wm; + + wm = xmalloc(sizeof(*wm)); + wm->name = xstrdup(name); + if (strlcpy(wm->path, path, sizeof(wm->path)) >= sizeof(wm->path)) { + free(wm->name); + free(wm); + return(0); + } + + TAILQ_INSERT_TAIL(&c->wmq, wm, entry); + return(1); +} + void conf_autogroup(struct conf *c, int num, const char *name, const char *class) { diff --git a/cwm.1 b/cwm.1 index d8ffb07..5c258ca 100644 --- a/cwm.1 +++ b/cwm.1 @@ -143,7 +143,7 @@ will be executed via the configured terminal emulator. .It Ic CM-w Spawn .Dq exec WindowManager -dialog, allowing a switch to another window manager. +menu, allowing a switch to another window manager. .It Ic CMS-r Restart. .It Ic CMS-q diff --git a/cwmrc.5 b/cwmrc.5 index 6851faa..2e16850 100644 --- a/cwmrc.5 +++ b/cwmrc.5 @@ -245,6 +245,12 @@ A special keyword .Dq all can be used to unbind all buttons. +.It Ic wm Ar name path +Every +.Ar name +entry is shown in the wm menu. +When selected, the window manager is replaced by +.Ar path . .El .Sh BIND FUNCTION LIST .Bl -tag -width 23n -compact diff --git a/kbfunc.c b/kbfunc.c index cf3f7e3..4fc0b4d 100644 --- a/kbfunc.c +++ b/kbfunc.c @@ -545,6 +545,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) { @@ -553,26 +580,13 @@ 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; + int l, i; int mflags = (CWM_MENU_DUMMY | CWM_MENU_FILE); - 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 */ - } - TAILQ_INIT(&menuq); if ((path = getenv("PATH")) == NULL) @@ -611,23 +625,11 @@ kbfunc_menu_exec(void *ctx, struct cargs *cargs) } free(path); - if ((mi = menu_filter(sc, &menuq, label, NULL, mflags, + 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) diff --git a/parse.y b/parse.y index 0c9606a..fbc19ed 100644 --- a/parse.y +++ b/parse.y @@ -70,7 +70,7 @@ typedef struct { %token BINDKEY UNBINDKEY BINDMOUSE UNBINDMOUSE %token FONTNAME STICKY GAP -%token AUTOGROUP COMMAND IGNORE +%token AUTOGROUP COMMAND IGNORE WM %token YES NO BORDERWIDTH MOVEAMOUNT %token COLOR SNAPDIST %token ACTIVEBORDER INACTIVEBORDER URGENCYBORDER @@ -146,6 +146,16 @@ main : FONTNAME STRING { free($2); free($3); } + | WM STRING string { + if (!conf_wm_add(conf, $2, $3)) { + yyerror("wm name/path too long"); + free($2); + free($3); + YYERROR; + } + free($2); + free($3); + } | AUTOGROUP NUMBER STRING { if ($2 < 0 || $2 > 9) { yyerror("invalid autogroup"); @@ -317,6 +327,7 @@ lookup(char *s) { "unbind-mouse", UNBINDMOUSE}, { "ungroupborder", UNGROUPBORDER}, { "urgencyborder", URGENCYBORDER}, + { "wm", WM}, { "yes", YES} }; const struct keywords *p; diff --git a/search.c b/search.c index 59aa841..7d3bd21 100644 --- a/search.c +++ b/search.c @@ -227,6 +227,21 @@ search_match_text(struct menu_q *menuq, struct menu_q *resultq, char *search) } } +void +search_match_wm(struct menu_q *menuq, struct menu_q *resultq, char *search) +{ + struct menu *mi; + struct cmd_ctx *wm; + + TAILQ_INIT(resultq); + TAILQ_FOREACH(mi, menuq, entry) { + wm = (struct cmd_ctx *)mi->ctx; + if ((match_substr(search, wm->name, 0)) || + (match_substr(search, wm->path, 0))) + TAILQ_INSERT_TAIL(resultq, mi, resultentry); + } +} + void search_print_client(struct menu *mi, int listing) { @@ -266,3 +281,12 @@ search_print_text(struct menu *mi, int listing) { (void)snprintf(mi->print, sizeof(mi->print), "%s", mi->text); } + +void +search_print_wm(struct menu *mi, int listing) +{ + struct cmd_ctx *wm = (struct cmd_ctx *)mi->ctx; + + (void)snprintf(mi->print, sizeof(mi->print), "%s [%s]", + wm->name, wm->path); +} -- cgit 1.4.1 From 03a2e9cf052f9dcc3e357c38f0c527cdfe40eac1 Mon Sep 17 00:00:00 2001 From: okan Date: Tue, 23 Jan 2018 16:00:21 +0000 Subject: Generate name_to_func[] in a clean and readable fashion. --- calmwm.h | 10 ++- conf.c | 246 +++++++++++++++++++++++++++------------------------------------ 2 files changed, 114 insertions(+), 142 deletions(-) (limited to 'conf.c') diff --git a/calmwm.h b/calmwm.h index 0913a76..e59ddb8 100644 --- a/calmwm.h +++ b/calmwm.h @@ -55,7 +55,15 @@ #define CWM_LEFT 0x0004 #define CWM_RIGHT 0x0008 #define CWM_BIGAMOUNT 0x0010 -#define DIRECTIONMASK (CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT) +#define CWM_UP_BIG (CWM_UP | CWM_BIGAMOUNT) +#define CWM_DOWN_BIG (CWM_DOWN | CWM_BIGAMOUNT) +#define CWM_LEFT_BIG (CWM_LEFT | CWM_BIGAMOUNT) +#define CWM_RIGHT_BIG (CWM_RIGHT | CWM_BIGAMOUNT) +#define CWM_UP_RIGHT (CWM_UP | CWM_RIGHT) +#define CWM_UP_LEFT (CWM_UP | CWM_LEFT) +#define CWM_DOWN_RIGHT (CWM_DOWN | CWM_RIGHT) +#define CWM_DOWN_LEFT (CWM_DOWN | CWM_LEFT) +#define DIRECTIONMASK (CWM_UP | CWM_DOWN | CWM_LEFT | CWM_RIGHT) #define CWM_CYCLE_FORWARD 0x0001 #define CWM_CYCLE_REVERSE 0x0002 diff --git a/conf.c b/conf.c index 9ef730f..9fcee2a 100644 --- a/conf.c +++ b/conf.c @@ -60,147 +60,111 @@ static const struct { enum context context; int flag; } name_to_func[] = { - { "window-menu-label", kbfunc_client_menu_label, CWM_CONTEXT_CC, 0 }, - { "window-lower", kbfunc_client_lower, CWM_CONTEXT_CC, 0 }, - { "window-raise", kbfunc_client_raise, CWM_CONTEXT_CC, 0 }, - { "window-hide", kbfunc_client_hide, CWM_CONTEXT_CC, 0 }, - { "window-delete", kbfunc_client_delete, CWM_CONTEXT_CC, 0 }, - { "window-htile", kbfunc_client_htile, CWM_CONTEXT_CC, 0 }, - { "window-vtile", kbfunc_client_vtile, CWM_CONTEXT_CC, 0 }, - { "window-stick", kbfunc_client_toggle_sticky, CWM_CONTEXT_CC, 0 }, - { "window-fullscreen", kbfunc_client_toggle_fullscreen, CWM_CONTEXT_CC, 0 }, - { "window-maximize", kbfunc_client_toggle_maximize, CWM_CONTEXT_CC, 0 }, - { "window-vmaximize", kbfunc_client_toggle_vmaximize, CWM_CONTEXT_CC, 0 }, - { "window-hmaximize", kbfunc_client_toggle_hmaximize, CWM_CONTEXT_CC, 0 }, - { "window-freeze", kbfunc_client_toggle_freeze, CWM_CONTEXT_CC, 0 }, - { "window-cycle", kbfunc_client_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_FORWARD) }, - { "window-rcycle", kbfunc_client_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_REVERSE) }, - { "window-cycle-ingroup", kbfunc_client_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP) }, - { "window-rcycle-ingroup", kbfunc_client_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP) }, - { "window-group", kbfunc_client_toggle_group, CWM_CONTEXT_CC, 0 }, - { "window-movetogroup-1", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 1 }, - { "window-movetogroup-2", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 2 }, - { "window-movetogroup-3", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 3 }, - { "window-movetogroup-4", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 4 }, - { "window-movetogroup-5", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 5 }, - { "window-movetogroup-6", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 6 }, - { "window-movetogroup-7", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 7 }, - { "window-movetogroup-8", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 8 }, - { "window-movetogroup-9", kbfunc_client_movetogroup, CWM_CONTEXT_CC, 9 }, - - { "window-snap-up", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_UP) }, - { "window-snap-down", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_DOWN) }, - { "window-snap-left", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_LEFT) }, - { "window-snap-right", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_RIGHT) }, - - { "window-snap-up-right", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_UP|CWM_RIGHT) }, - { "window-snap-up-left", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_UP|CWM_LEFT) }, - { "window-snap-down-right", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_DOWN|CWM_RIGHT) }, - { "window-snap-down-left", kbfunc_client_snap, CWM_CONTEXT_CC, - (CWM_DOWN|CWM_LEFT) }, - - { "window-move", kbfunc_client_move, CWM_CONTEXT_CC, 0 }, - { "window-move-up", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_UP) }, - { "window-move-down", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_DOWN) }, - { "window-move-right", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_RIGHT) }, - { "window-move-left", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_LEFT) }, - { "window-move-up-big", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_UP | CWM_BIGAMOUNT) }, - { "window-move-down-big", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_DOWN | CWM_BIGAMOUNT) }, - { "window-move-right-big", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_RIGHT | CWM_BIGAMOUNT) }, - { "window-move-left-big", kbfunc_client_move, CWM_CONTEXT_CC, - (CWM_LEFT | CWM_BIGAMOUNT) }, - { "window-resize", kbfunc_client_resize, CWM_CONTEXT_CC, 0 }, - { "window-resize-up", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_UP) }, - { "window-resize-down", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_DOWN) }, - { "window-resize-right", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_RIGHT) }, - { "window-resize-left", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_LEFT) }, - { "window-resize-up-big", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_UP | CWM_BIGAMOUNT) }, - { "window-resize-down-big", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_DOWN | CWM_BIGAMOUNT) }, - { "window-resize-right-big", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_RIGHT | CWM_BIGAMOUNT) }, - { "window-resize-left-big", kbfunc_client_resize, CWM_CONTEXT_CC, - (CWM_LEFT | CWM_BIGAMOUNT) }, - - { "group-cycle", kbfunc_group_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_FORWARD) }, - { "group-rcycle", kbfunc_group_cycle, CWM_CONTEXT_SC, - (CWM_CYCLE_REVERSE) }, - { "group-toggle-all", kbfunc_group_alltoggle, CWM_CONTEXT_SC, 0 }, - { "group-toggle-1", kbfunc_group_toggle, CWM_CONTEXT_SC, 1 }, - { "group-toggle-2", kbfunc_group_toggle, CWM_CONTEXT_SC, 2 }, - { "group-toggle-3", kbfunc_group_toggle, CWM_CONTEXT_SC, 3 }, - { "group-toggle-4", kbfunc_group_toggle, CWM_CONTEXT_SC, 4 }, - { "group-toggle-5", kbfunc_group_toggle, CWM_CONTEXT_SC, 5 }, - { "group-toggle-6", kbfunc_group_toggle, CWM_CONTEXT_SC, 6 }, - { "group-toggle-7", kbfunc_group_toggle, CWM_CONTEXT_SC, 7 }, - { "group-toggle-8", kbfunc_group_toggle, CWM_CONTEXT_SC, 8 }, - { "group-toggle-9", kbfunc_group_toggle, CWM_CONTEXT_SC, 9 }, - { "group-only-1", kbfunc_group_only, CWM_CONTEXT_SC, 1 }, - { "group-only-2", kbfunc_group_only, CWM_CONTEXT_SC, 2 }, - { "group-only-3", kbfunc_group_only, CWM_CONTEXT_SC, 3 }, - { "group-only-4", kbfunc_group_only, CWM_CONTEXT_SC, 4 }, - { "group-only-5", kbfunc_group_only, CWM_CONTEXT_SC, 5 }, - { "group-only-6", kbfunc_group_only, CWM_CONTEXT_SC, 6 }, - { "group-only-7", kbfunc_group_only, CWM_CONTEXT_SC, 7 }, - { "group-only-8", kbfunc_group_only, CWM_CONTEXT_SC, 8 }, - { "group-only-9", kbfunc_group_only, CWM_CONTEXT_SC, 9 }, - - { "pointer-move-up", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_UP) }, - { "pointer-move-down", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_DOWN) }, - { "pointer-move-left", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_LEFT) }, - { "pointer-move-right", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_RIGHT) }, - { "pointer-move-up-big", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_UP | CWM_BIGAMOUNT) }, - { "pointer-move-down-big", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_DOWN | CWM_BIGAMOUNT) }, - { "pointer-move-left-big", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_LEFT | CWM_BIGAMOUNT) }, - { "pointer-move-right-big", kbfunc_ptrmove, CWM_CONTEXT_SC, - (CWM_RIGHT | CWM_BIGAMOUNT) }, - - { "menu-cmd", kbfunc_menu_cmd, CWM_CONTEXT_SC, 0 }, - { "menu-group", kbfunc_menu_group, CWM_CONTEXT_SC, 0 }, - { "menu-ssh", kbfunc_menu_ssh, CWM_CONTEXT_SC, 0 }, - { "menu-window", kbfunc_menu_client, CWM_CONTEXT_SC, - CWM_MENU_WINDOW_ALL }, - { "menu-window-hidden", kbfunc_menu_client, CWM_CONTEXT_SC, - CWM_MENU_WINDOW_HIDDEN }, - { "menu-exec", kbfunc_menu_exec, CWM_CONTEXT_SC, 0 }, - { "menu-exec-wm", kbfunc_menu_wm, CWM_CONTEXT_SC, 0 }, - - { "terminal", kbfunc_exec_term, CWM_CONTEXT_SC, 0 }, - { "lock", kbfunc_exec_lock, CWM_CONTEXT_SC, 0 }, - { "restart", kbfunc_cwm_status, CWM_CONTEXT_SC, CWM_EXEC_WM }, - { "quit", kbfunc_cwm_status, CWM_CONTEXT_SC, CWM_QUIT }, - +#define FUNC_CC(t, h, n) \ + #t, kbfunc_ ## h, CWM_CONTEXT_CC, n +#define FUNC_SC(t, h, n) \ + #t, kbfunc_ ## h, CWM_CONTEXT_SC, n + + { FUNC_CC(window-lower, client_lower, 0) }, + { FUNC_CC(window-raise, client_raise, 0) }, + { FUNC_CC(window-hide, client_hide, 0) }, + { FUNC_CC(window-delete, client_delete, 0) }, + { FUNC_CC(window-htile, client_htile, 0) }, + { FUNC_CC(window-vtile, client_vtile, 0) }, + { FUNC_CC(window-stick, client_toggle_sticky, 0) }, + { FUNC_CC(window-fullscreen, client_toggle_fullscreen, 0) }, + { FUNC_CC(window-maximize, client_toggle_maximize, 0) }, + { FUNC_CC(window-vmaximize, client_toggle_vmaximize, 0) }, + { FUNC_CC(window-hmaximize, client_toggle_hmaximize, 0) }, + { FUNC_CC(window-freeze, client_toggle_freeze, 0) }, + { FUNC_CC(window-group, client_toggle_group, 0) }, + { FUNC_CC(window-movetogroup-1, client_movetogroup, 1) }, + { FUNC_CC(window-movetogroup-2, client_movetogroup, 2) }, + { FUNC_CC(window-movetogroup-3, client_movetogroup, 3) }, + { FUNC_CC(window-movetogroup-4, client_movetogroup, 4) }, + { FUNC_CC(window-movetogroup-5, client_movetogroup, 5) }, + { FUNC_CC(window-movetogroup-6, client_movetogroup, 6) }, + { FUNC_CC(window-movetogroup-7, client_movetogroup, 7) }, + { FUNC_CC(window-movetogroup-8, client_movetogroup, 8) }, + { FUNC_CC(window-movetogroup-9, client_movetogroup, 9) }, + { FUNC_CC(window-snap-up, client_snap, (CWM_UP)) }, + { FUNC_CC(window-snap-down, client_snap, (CWM_DOWN)) }, + { FUNC_CC(window-snap-right, client_snap, (CWM_RIGHT)) }, + { FUNC_CC(window-snap-left, client_snap, (CWM_LEFT)) }, + { FUNC_CC(window-snap-up-right, client_snap, (CWM_UP_RIGHT)) }, + { FUNC_CC(window-snap-up-left, client_snap, (CWM_UP_LEFT)) }, + { FUNC_CC(window-snap-down-right, client_snap, (CWM_DOWN_RIGHT)) }, + { FUNC_CC(window-snap-down-left, client_snap, (CWM_DOWN_LEFT)) }, + { FUNC_CC(window-move, client_move, 0) }, + { FUNC_CC(window-move-up, client_move, (CWM_UP)) }, + { FUNC_CC(window-move-down, client_move, (CWM_DOWN)) }, + { FUNC_CC(window-move-right, client_move, (CWM_RIGHT)) }, + { FUNC_CC(window-move-left, client_move, (CWM_LEFT)) }, + { FUNC_CC(window-move-up-big, client_move, (CWM_UP_BIG)) }, + { FUNC_CC(window-move-down-big, client_move, (CWM_DOWN_BIG)) }, + { FUNC_CC(window-move-right-big, client_move, (CWM_RIGHT_BIG)) }, + { FUNC_CC(window-move-left-big, client_move, (CWM_LEFT_BIG)) }, + { FUNC_CC(window-resize, client_resize, 0) }, + { FUNC_CC(window-resize-up, client_resize, (CWM_UP)) }, + { FUNC_CC(window-resize-down, client_resize, (CWM_DOWN)) }, + { FUNC_CC(window-resize-right, client_resize, (CWM_RIGHT)) }, + { FUNC_CC(window-resize-left, client_resize, (CWM_LEFT)) }, + { FUNC_CC(window-resize-up-big, client_resize, (CWM_UP_BIG)) }, + { FUNC_CC(window-resize-down-big, client_resize, (CWM_DOWN_BIG)) }, + { FUNC_CC(window-resize-right-big, client_resize, (CWM_RIGHT_BIG)) }, + { FUNC_CC(window-resize-left-big, client_resize, (CWM_LEFT_BIG)) }, + { FUNC_CC(window-menu-label, client_menu_label, 0) }, + + { FUNC_SC(window-cycle, client_cycle, (CWM_CYCLE_FORWARD)) }, + { FUNC_SC(window-rcycle, client_cycle, (CWM_CYCLE_REVERSE)) }, + { FUNC_SC(window-cycle-ingroup, client_cycle, + (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)) }, + { FUNC_SC(window-rcycle-ingroup, client_cycle, + (CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP)) }, + + { FUNC_SC(group-cycle, group_cycle, (CWM_CYCLE_FORWARD)) }, + { FUNC_SC(group-rcycle, group_cycle, (CWM_CYCLE_REVERSE)) }, + { FUNC_SC(group-toggle-all, group_alltoggle, 0) }, + { FUNC_SC(group-toggle-1, group_toggle, 1) }, + { FUNC_SC(group-toggle-2, group_toggle, 2) }, + { FUNC_SC(group-toggle-3, group_toggle, 3) }, + { FUNC_SC(group-toggle-4, group_toggle, 4) }, + { FUNC_SC(group-toggle-5, group_toggle, 5) }, + { FUNC_SC(group-toggle-6, group_toggle, 6) }, + { FUNC_SC(group-toggle-7, group_toggle, 7) }, + { FUNC_SC(group-toggle-8, group_toggle, 8) }, + { FUNC_SC(group-toggle-9, group_toggle, 9) }, + { FUNC_SC(group-only-1, group_only, 1) }, + { FUNC_SC(group-only-2, group_only, 2) }, + { FUNC_SC(group-only-3, group_only, 3) }, + { FUNC_SC(group-only-4, group_only, 4) }, + { FUNC_SC(group-only-5, group_only, 5) }, + { FUNC_SC(group-only-6, group_only, 6) }, + { FUNC_SC(group-only-7, group_only, 7) }, + { FUNC_SC(group-only-8, group_only, 8) }, + { FUNC_SC(group-only-9, group_only, 9) }, + + { FUNC_SC(pointer-move-up, ptrmove, (CWM_UP)) }, + { FUNC_SC(pointer-move-down, ptrmove, (CWM_DOWN)) }, + { FUNC_SC(pointer-move-left, ptrmove, (CWM_LEFT)) }, + { FUNC_SC(pointer-move-right, ptrmove, (CWM_RIGHT)) }, + { FUNC_SC(pointer-move-up-big, ptrmove, (CWM_UP_BIG)) }, + { FUNC_SC(pointer-move-down-big, ptrmove, (CWM_DOWN_BIG)) }, + { FUNC_SC(pointer-move-left-big, ptrmove, (CWM_LEFT_BIG)) }, + { FUNC_SC(pointer-move-right-big, ptrmove, (CWM_RIGHT_BIG)) }, + + { FUNC_SC(menu-cmd, menu_cmd, 0) }, + { FUNC_SC(menu-group, menu_group, 0) }, + { FUNC_SC(menu-ssh, menu_ssh, 0) }, + { FUNC_SC(menu-window, menu_client, CWM_MENU_WINDOW_ALL) }, + { FUNC_SC(menu-window-hidden, menu_client, CWM_MENU_WINDOW_HIDDEN) }, + { FUNC_SC(menu-exec, menu_exec, 0) }, + { FUNC_SC(menu-exec-wm, menu_wm, 0) }, + + { FUNC_SC(terminal, exec_term, 0) }, + { FUNC_SC(lock, exec_lock, 0) }, + { FUNC_SC(restart, cwm_status, CWM_EXEC_WM) }, + { FUNC_SC(quit, cwm_status, CWM_QUIT) }, }; static unsigned int ignore_mods[] = { 0, LockMask, Mod2Mask, Mod2Mask | LockMask -- cgit 1.4.1 From 9bf750b0549f10fdd4f5898dbab40ad4c946eee6 Mon Sep 17 00:00:00 2001 From: okan Date: Fri, 2 Feb 2018 13:27:25 +0000 Subject: Simplification; use asprintf where appropriate now. --- calmwm.h | 8 ++++---- conf.c | 60 ++++++++++++++++++++++++++---------------------------------- parse.y | 10 ++++++---- search.c | 6 +++--- 4 files changed, 39 insertions(+), 45 deletions(-) (limited to 'conf.c') diff --git a/calmwm.h b/calmwm.h index 117cdb0..b2183e7 100644 --- a/calmwm.h +++ b/calmwm.h @@ -260,7 +260,7 @@ TAILQ_HEAD(mousebind_q, bind_ctx); struct cmd_ctx { TAILQ_ENTRY(cmd_ctx) entry; char *name; - char path[PATH_MAX]; + char *path; }; TAILQ_HEAD(cmd_q, cmd_ctx); TAILQ_HEAD(wm_q, cmd_ctx); @@ -298,13 +298,13 @@ struct conf { int snapdist; struct gap gap; char *color[CWM_COLOR_NITEMS]; - char known_hosts[PATH_MAX]; char *font; char *wmname; Cursor cursor[CF_NITEMS]; int xrandr; int xrandr_event_base; char *homedir; + char *known_hosts; char *wm_argv; }; @@ -540,9 +540,9 @@ int conf_bind_mouse(struct conf *, const char *, const char *); void conf_clear(struct conf *); void conf_client(struct client_ctx *); -int conf_cmd_add(struct conf *, const char *, +void conf_cmd_add(struct conf *, const char *, const char *); -int conf_wm_add(struct conf *, const char *, +void conf_wm_add(struct conf *, const char *, const char *); void conf_cursor(struct conf *); void conf_grab_kbd(Window); diff --git a/conf.c b/conf.c index 9fcee2a..9c02e3e 100644 --- a/conf.c +++ b/conf.c @@ -33,7 +33,6 @@ #include "calmwm.h" static const char *conf_bind_getmask(const char *, unsigned int *); -static void conf_cmd_remove(struct conf *, const char *); static void conf_unbind_key(struct conf *, struct bind_ctx *); static void conf_unbind_mouse(struct conf *, struct bind_ctx *); @@ -279,8 +278,7 @@ conf_init(struct conf *c) conf_wm_add(c, "cwm", "cwm"); - (void)snprintf(c->known_hosts, sizeof(c->known_hosts), "%s/%s", - c->homedir, ".ssh/known_hosts"); + xasprintf(&c->known_hosts, "%s/%s", c->homedir, ".ssh/known_hosts"); c->font = xstrdup("sans-serif:pixelsize=14:bold"); c->wmname = xstrdup("CWM"); @@ -298,11 +296,13 @@ conf_clear(struct conf *c) while ((cmd = TAILQ_FIRST(&c->cmdq)) != NULL) { TAILQ_REMOVE(&c->cmdq, cmd, entry); free(cmd->name); + free(cmd->path); free(cmd); } while ((wm = TAILQ_FIRST(&c->wmq)) != NULL) { TAILQ_REMOVE(&c->wmq, wm, entry); free(wm->name); + free(wm->path); free(wm); } while ((kb = TAILQ_FIRST(&c->keybindq)) != NULL) { @@ -327,57 +327,49 @@ conf_clear(struct conf *c) for (i = 0; i < CWM_COLOR_NITEMS; i++) free(c->color[i]); + free(c->known_hosts); free(c->font); free(c->wmname); } -int +void conf_cmd_add(struct conf *c, const char *name, const char *path) { - struct cmd_ctx *cmd; + struct cmd_ctx *cmd, *cmdtmp = NULL, *cmdnxt; cmd = xmalloc(sizeof(*cmd)); cmd->name = xstrdup(name); - if (strlcpy(cmd->path, path, sizeof(cmd->path)) >= sizeof(cmd->path)) { - free(cmd->name); - free(cmd); - return(0); - } - conf_cmd_remove(c, name); - - TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry); - return(1); -} - -static void -conf_cmd_remove(struct conf *c, const char *name) -{ - struct cmd_ctx *cmd = NULL, *cmdnxt; - - TAILQ_FOREACH_SAFE(cmd, &c->cmdq, entry, cmdnxt) { - if (strcmp(cmd->name, name) == 0) { - TAILQ_REMOVE(&c->cmdq, cmd, entry); - free(cmd->name); - free(cmd); + cmd->path = xstrdup(path); + + TAILQ_FOREACH_SAFE(cmdtmp, &c->cmdq, entry, cmdnxt) { + if (strcmp(cmdtmp->name, name) == 0) { + TAILQ_REMOVE(&c->cmdq, cmdtmp, entry); + free(cmdtmp->name); + free(cmdtmp->path); + free(cmdtmp); } } + TAILQ_INSERT_TAIL(&c->cmdq, cmd, entry); } -int +void conf_wm_add(struct conf *c, const char *name, const char *path) { - struct cmd_ctx *wm; + struct cmd_ctx *wm, *wmtmp = NULL, *wmnxt; wm = xmalloc(sizeof(*wm)); wm->name = xstrdup(name); - if (strlcpy(wm->path, path, sizeof(wm->path)) >= sizeof(wm->path)) { - free(wm->name); - free(wm); - return(0); + wm->path = xstrdup(path); + + TAILQ_FOREACH_SAFE(wmtmp, &c->cmdq, entry, wmnxt) { + if (strcmp(wmtmp->name, name) == 0) { + TAILQ_REMOVE(&c->wmq, wmtmp, entry); + free(wmtmp->name); + free(wmtmp->path); + free(wmtmp); + } } - TAILQ_INSERT_TAIL(&c->wmq, wm, entry); - return(1); } void diff --git a/parse.y b/parse.y index fbc19ed..6c4a556 100644 --- a/parse.y +++ b/parse.y @@ -137,22 +137,24 @@ main : FONTNAME STRING { conf->snapdist = $2; } | COMMAND STRING string { - if (!conf_cmd_add(conf, $2, $3)) { - yyerror("command name/path too long"); + if (strlen($3) >= PATH_MAX) { + yyerror("%s command path too long", $2); free($2); free($3); YYERROR; } + conf_cmd_add(conf, $2, $3); free($2); free($3); } | WM STRING string { - if (!conf_wm_add(conf, $2, $3)) { - yyerror("wm name/path too long"); + if (strlen($3) >= PATH_MAX) { + yyerror("%s wm path too long", $2); free($2); free($3); YYERROR; } + conf_wm_add(conf, $2, $3); free($2); free($3); } diff --git a/search.c b/search.c index 0ab75b2..6911436 100644 --- a/search.c +++ b/search.c @@ -162,12 +162,11 @@ static void match_path_type(struct menu_q *resultq, char *search, int flag) { struct menu *mi; - char pattern[PATH_MAX]; + char *pattern; glob_t g; int i; - (void)strlcpy(pattern, search, sizeof(pattern)); - (void)strlcat(pattern, "*", sizeof(pattern)); + xasprintf(&pattern, "%s*", search); if (glob(pattern, GLOB_MARK, NULL, &g) != 0) return; for (i = 0; i < g.gl_pathc; i++) { @@ -178,6 +177,7 @@ match_path_type(struct menu_q *resultq, char *search, int flag) TAILQ_INSERT_TAIL(resultq, mi, resultentry); } globfree(&g); + free(pattern); } void -- cgit 1.4.1