X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=c49bcf0b5177b1d5b714bda9eb61fb45b60ec63d;hb=7e9b839a7e3be2ba47faf151694961cafd5f68a1;hp=00304b547c8c8256fee343cc45d9bf3924241f1a;hpb=6d0c9ff20705acd526e5b9bfd1d7a7971e6959e3;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 00304b5..c49bcf0 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -279,10 +279,7 @@ xcb_atom_t a_state; xcb_atom_t a_prot; xcb_atom_t a_delete; xcb_atom_t a_takefocus; -xcb_atom_t a_wmname; -xcb_atom_t a_netwmname; xcb_atom_t a_utf8_string; -xcb_atom_t a_string; xcb_atom_t a_swm_iconic; xcb_atom_t a_swm_ws; volatile sig_atomic_t running = 1; @@ -1051,6 +1048,7 @@ void spawn(int, union arg *, int); void spawn_custom(struct swm_region *, union arg *, const char *); int spawn_expand(struct swm_region *, union arg *, const char *, char ***); void spawn_insert(const char *, const char *, int); +struct spawn_prog *spawn_find(const char *); void spawn_remove(struct spawn_prog *); void spawn_replace(struct spawn_prog *, const char *, const char *, int); void spawn_select(struct swm_region *, union arg *, const char *, int *); @@ -4859,7 +4857,7 @@ get_win_name(xcb_window_t win) xcb_get_property_reply_t *r; /* First try _NET_WM_NAME for UTF-8. */ - c = xcb_get_property(conn, 0, win, a_netwmname, + c = xcb_get_property(conn, 0, win, ewmh[_NET_WM_NAME].atom, XCB_GET_PROPERTY_TYPE_ANY, 0, UINT_MAX); r = xcb_get_property_reply(conn, c, NULL); @@ -6040,7 +6038,7 @@ spawn_expand(struct swm_region *r, union arg *args, const char *spawn_name, char ***ret_args) { struct spawn_prog *prog = NULL; - int i; + int i, c; char *ap, **real_args; /* suppress unused warning since var is needed */ @@ -6063,62 +6061,68 @@ spawn_expand(struct swm_region *r, union arg *args, const char *spawn_name, err(1, "spawn_custom: calloc real_args"); /* expand spawn_args into real_args */ - for (i = 0; i < prog->argc; i++) { + for (i = c = 0; i < prog->argc; i++) { ap = prog->argv[i]; DNPRINTF(SWM_D_SPAWN, "spawn_custom: raw arg: %s\n", ap); if (!strcasecmp(ap, "$bar_border")) { - if ((real_args[i] = + if ((real_args[c] = strdup(r->s->c[SWM_S_COLOR_BAR_BORDER].name)) == NULL) err(1, "spawn_custom border color"); } else if (!strcasecmp(ap, "$bar_color")) { - if ((real_args[i] = + if ((real_args[c] = strdup(r->s->c[SWM_S_COLOR_BAR].name)) == NULL) err(1, "spawn_custom bar color"); } else if (!strcasecmp(ap, "$bar_font")) { - if ((real_args[i] = strdup(bar_fonts)) + if ((real_args[c] = strdup(bar_fonts)) == NULL) err(1, "spawn_custom bar fonts"); } else if (!strcasecmp(ap, "$bar_font_color")) { - if ((real_args[i] = + if ((real_args[c] = strdup(r->s->c[SWM_S_COLOR_BAR_FONT].name)) == NULL) err(1, "spawn_custom color font"); } else if (!strcasecmp(ap, "$color_focus")) { - if ((real_args[i] = + if ((real_args[c] = strdup(r->s->c[SWM_S_COLOR_FOCUS].name)) == NULL) err(1, "spawn_custom color focus"); } else if (!strcasecmp(ap, "$color_unfocus")) { - if ((real_args[i] = + if ((real_args[c] = strdup(r->s->c[SWM_S_COLOR_UNFOCUS].name)) == NULL) err(1, "spawn_custom color unfocus"); } else if (!strcasecmp(ap, "$region_index")) { - if (asprintf(&real_args[i], "%d", + if (asprintf(&real_args[c], "%d", get_region_index(r) + 1) < 1) err(1, "spawn_custom region index"); } else if (!strcasecmp(ap, "$workspace_index")) { - if (asprintf(&real_args[i], "%d", r->ws->idx + 1) < 1) + if (asprintf(&real_args[c], "%d", r->ws->idx + 1) < 1) + err(1, "spawn_custom workspace index"); + } else if (!strcasecmp(ap, "$dmenu_bottom")) { + if (!bar_at_bottom) + continue; + if ((real_args[c] = strdup("-b")) == NULL) err(1, "spawn_custom workspace index"); } else { /* no match --> copy as is */ - if ((real_args[i] = strdup(ap)) == NULL) + if ((real_args[c] = strdup(ap)) == NULL) err(1, "spawn_custom strdup(ap)"); } DNPRINTF(SWM_D_SPAWN, "spawn_custom: cooked arg: %s\n", - real_args[i]); + real_args[c]); + ++c; } #ifdef SWM_DEBUG DNPRINTF(SWM_D_SPAWN, "spawn_custom: result: "); - for (i = 0; i < prog->argc; i++) - DNPRINTF(SWM_D_SPAWN, "\"%s\" ", real_args[i]); - DNPRINTF(SWM_D_SPAWN, "\n"); + for (i = 0; i < c; ++i) + DPRINTF("\"%s\" ", real_args[i]); + DPRINTF("\n"); #endif *ret_args = real_args; - return (prog->argc); + return (c); } void @@ -6235,6 +6239,18 @@ spawn_remove(struct spawn_prog *sp) DNPRINTF(SWM_D_SPAWN, "spawn_remove: leave\n"); } +struct spawn_prog* +spawn_find(const char *name) +{ + struct spawn_prog *sp; + + TAILQ_FOREACH(sp, &spawns, entry) + if (!strcasecmp(sp->name, name)) + return sp; + + return NULL; +} + void setspawn(const char *name, const char *args, int flags) { @@ -6246,11 +6262,8 @@ setspawn(const char *name, const char *args, int flags) return; /* Remove any old spawn under the same name. */ - TAILQ_FOREACH(sp, &spawns, entry) - if (!strcmp(sp->name, name)) { - spawn_remove(sp); - break; - } + if ((sp = spawn_find(name)) != NULL) + spawn_remove(sp); if (*args != '\0') spawn_insert(name, args, flags); @@ -6290,11 +6303,7 @@ validate_spawns(void) continue; /* find program */ - TAILQ_FOREACH(sp, &spawns, entry) { - if (!strcasecmp(kp->spawn_name, sp->name)) - break; - } - + sp = spawn_find(kp->spawn_name); if (sp == NULL || sp->flags & SWM_SPAWN_OPTIONAL) continue; @@ -6322,6 +6331,7 @@ setup_spawn(void) setconfspawn("spawn_term", "xterm", 0); setconfspawn("menu", "dmenu_run" + " $dmenu_bottom" " -fn $bar_font" " -nb $bar_color" " -nf $bar_font_color" @@ -6329,6 +6339,7 @@ setup_spawn(void) " -sf $bar_color", 0); setconfspawn("search", "dmenu" + " $dmenu_bottom" " -i" " -fn $bar_font" " -nb $bar_color" @@ -6337,6 +6348,7 @@ setup_spawn(void) " -sf $bar_color", 0); setconfspawn("name_workspace", "dmenu" + " $dmenu_bottom" " -p Workspace" " -fn $bar_font" " -nb $bar_color" @@ -6531,17 +6543,15 @@ setconfbinding(char *selector, char *value, int flags) } } /* search by custom spawn name */ - TAILQ_FOREACH(sp, &spawns, entry) { - if (strcasecmp(selector, sp->name) == 0) { - DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match " - "spawn\n", selector); - if (parsekeys(value, mod_key, &mod, &ks) == 0) { - setkeybinding(mod, ks, KF_SPAWN_CUSTOM, - sp->name); - return (0); - } else - return (1); - } + if ((sp = spawn_find(selector)) != NULL) { + DNPRINTF(SWM_D_KEY, "setconfbinding: %s: match " + "spawn\n", selector); + if (parsekeys(value, mod_key, &mod, &ks) == 0) { + setkeybinding(mod, ks, KF_SPAWN_CUSTOM, + sp->name); + return (0); + } else + return (1); } DNPRINTF(SWM_D_KEY, "setconfbinding: no match\n"); return (1); @@ -9425,10 +9435,7 @@ setup_globals(void) a_prot = get_atom_from_string("WM_PROTOCOLS"); a_delete = get_atom_from_string("WM_DELETE_WINDOW"); a_takefocus = get_atom_from_string("WM_TAKE_FOCUS"); - a_wmname = get_atom_from_string("WM_NAME"); - a_netwmname = get_atom_from_string("_NET_WM_NAME"); a_utf8_string = get_atom_from_string("UTF8_STRING"); - a_string = get_atom_from_string("STRING"); a_swm_iconic = get_atom_from_string("_SWM_ICONIC"); a_swm_ws = get_atom_from_string("_SWM_WS"); } @@ -9457,7 +9464,8 @@ workaround(void) xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win, netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win); xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win, - a_netwmname, a_utf8_string, 8, strlen("LG3D"), "LG3D"); + ewmh[_NET_WM_NAME].atom, a_utf8_string, 8, strlen("LG3D"), + "LG3D"); } }