From: Reginald Kennedy Date: Sat, 7 Apr 2012 17:59:41 +0000 (+0800) Subject: Increase workspace hard limit to 22. X-Git-Tag: SPECTRWM_1_1_0~40 X-Git-Url: https://code.delx.au/spectrwm/commitdiff_plain/b8de26993fd4c73643d3c3f459f7297a07249d0a Increase workspace hard limit to 22. Add new keybindings for workspaces 11 through 22. Defaults for ws_n and mvws_n are NOD+(F1-F12) and MOD+Shift+(F1-F12), respectively. Add a new configuration option 'workspace_limit' to make it possible for the user to adjust the number of available workspaces. Default is 10. ok marco --- diff --git a/spectrwm.1 b/spectrwm.1 index 67aa551..f2df9c9 100644 --- a/spectrwm.1 +++ b/spectrwm.1 @@ -241,6 +241,8 @@ Enable by setting to 1. .It Ic window_name_enabled Enable or disable displaying the window name in the status bar. Enable by setting to 1. +.It Ic workspace_limit +Set the total number of workspaces available. Minimum is 1, maximum is 20. .El .Pp Colors need to be specified per the @@ -343,7 +345,7 @@ Resize window while maintaining it centered .Pp The default key bindings are described below: .Pp -.Bl -tag -width "M-j, M-XXX" -offset indent -compact +.Bl -tag -width "M-j, M-XXXXXX" -offset indent -compact .It Cm M-S- Ns Aq Cm Return term .It Cm M-p @@ -394,10 +396,10 @@ bar_toggle wind_del .It Cm M-S-x wind_kill -.It Cm M- Ns Aq Ar n -.Pf ws_ Ar n -.It Cm M-S- Ns Aq Ar n -.Pf mvws_ Ar n +.It Cm M- Ns Aq Ar 1-9,0,F1-F12 +.Pf ws_ Aq Ar 1-22 +.It Cm M-S- Ns Aq Ar 1-9,0,F1-F12 +.Pf mvws_ Ns Aq Ar 1-22 .It Cm M- Ns Aq Cm Right ws_next .It Cm M- Ns Aq Cm Left @@ -516,13 +518,13 @@ Switch to workspace .Ar n , where .Ar n -is 1 through 10. +is 1 through workspace_limit. .It Cm mvws_ Ns Ar n Move current window to workspace .Ar n , where .Ar n -is 1 through 10. +is 1 through workspace_limit. .It Cm ws_next Switch to next workspace with a window in it. .It Cm ws_prev diff --git a/spectrwm.c b/spectrwm.c index b527e91..9a61347 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -446,7 +446,9 @@ enum { SWM_S_COLOR_BAR, SWM_S_COLOR_BAR_BORDER, SWM_S_COLOR_BAR_FONT, SWM_S_COLOR_FOCUS, SWM_S_COLOR_UNFOCUS, SWM_S_COLOR_MAX }; /* physical screen mapping */ -#define SWM_WS_MAX (10) +#define SWM_WS_MAX (22) /* hard limit */ +int workspace_limit = 10; /* soft limit */ + struct swm_screen { int idx; /* screen index */ struct swm_region_list rl; /* list of regions on this screen */ @@ -1402,11 +1404,11 @@ bar_urgent(char *s, ssize_t sz) if (urgent_enabled == 0) return; - for (i = 0; i < SWM_WS_MAX; i++) + for (i = 0; i < workspace_limit; i++) urgent[i] = 0; for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) { wmh = XGetWMHints(display, win->id); if (wmh == NULL) @@ -1418,7 +1420,7 @@ bar_urgent(char *s, ssize_t sz) } strlcat(s, "* ", sz); - for (i = 0; i < SWM_WS_MAX; i++) { + for (i = 0; i < workspace_limit; i++) { if (urgent[i]) snprintf(b, sizeof b, "%d ", i + 1); else @@ -1847,7 +1849,7 @@ unmap_all(void) int i, j; for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) unmap_window(win); } @@ -1936,7 +1938,7 @@ find_unmanaged_window(Window id) int i, j; for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].unmanagedlist, entry) if (id == win->id) @@ -1953,7 +1955,7 @@ find_window(Window id) unsigned int nc; for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) if (id == win->id) return (win); @@ -1970,7 +1972,7 @@ find_window(Window id) /* look for parent */ for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) if (wpr == win->id) return (win); @@ -2058,7 +2060,7 @@ kill_refs(struct ws_win *win) for (i = 0; i < ScreenCount(display); i++) TAILQ_FOREACH(r, &screens[i].rl, entry) - for (x = 0; x < SWM_WS_MAX; x++) { + for (x = 0; x < workspace_limit; x++) { ws = &r->s->ws[x]; if (win == ws->focus) ws->focus = NULL; @@ -2080,7 +2082,7 @@ validate_win(struct ws_win *testwin) for (i = 0; i < ScreenCount(display); i++) TAILQ_FOREACH(r, &screens[i].rl, entry) - for (x = 0; x < SWM_WS_MAX; x++) { + for (x = 0; x < workspace_limit; x++) { ws = &r->s->ws[x]; TAILQ_FOREACH(win, &ws->winlist, entry) if (win == testwin) @@ -2099,7 +2101,7 @@ validate_ws(struct workspace *testws) /* validate all ws */ for (i = 0; i < ScreenCount(display); i++) TAILQ_FOREACH(r, &screens[i].rl, entry) - for (x = 0; x < SWM_WS_MAX; x++) { + for (x = 0; x < workspace_limit; x++) { ws = &r->s->ws[x]; if (ws == testws) return (0); @@ -2167,7 +2169,7 @@ unfocus_all(void) DNPRINTF(SWM_D_FOCUS, "unfocus_all\n"); for (i = 0; i < ScreenCount(display); i++) - for (j = 0; j < SWM_WS_MAX; j++) + for (j = 0; j < workspace_limit; j++) TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) unfocus_win(win); } @@ -2249,6 +2251,9 @@ switchws(struct swm_region *r, union arg *args) if (!(r && r->s)) return; + if (wsid >= workspace_limit) + return; + this_r = r; old_ws = this_r->ws; new_ws = &this_r->s->ws[wsid]; @@ -2311,7 +2316,7 @@ cyclews(struct swm_region *r, union arg *args) cycle_all = 1; /* FALLTHROUGH */ case SWM_ARG_ID_CYCLEWS_UP: - if (a.id < SWM_WS_MAX - 1) + if (a.id < workspace_limit - 1) a.id++; else a.id = 0; @@ -2323,7 +2328,7 @@ cyclews(struct swm_region *r, union arg *args) if (a.id > 0) a.id--; else - a.id = SWM_WS_MAX - 1; + a.id = workspace_limit - 1; break; default: return; @@ -3239,6 +3244,9 @@ send_to_ws(struct swm_region *r, union arg *args) unsigned char ws_idx_str[SWM_PROPLEN]; union arg a; + if (wsid >= workspace_limit) + return; + if (r && r->ws && r->ws->focus) win = r->ws->focus; else @@ -3437,7 +3445,7 @@ search_workspace(struct swm_region *r, union arg *args) if ((lfile = fdopen(select_list_pipe[1], "w")) == NULL) return; - for (i = 0; i < SWM_WS_MAX; i++) { + for (i = 0; i < workspace_limit; i++) { ws = &r->s->ws[i]; if (ws == NULL) continue; @@ -3605,7 +3613,7 @@ search_resp_search_workspace(char *resp, unsigned long len) p = strchr(q, ':'); if (p != NULL) *p = '\0'; - ws_idx = strtonum(q, 1, SWM_WS_MAX, &errstr); + ws_idx = strtonum(q, 1, workspace_limit, &errstr); if (errstr) { DNPRINTF(SWM_D_MISC, "workspace idx is %s: %s", errstr, q); @@ -4184,6 +4192,18 @@ enum keyfuncid { kf_ws_8, kf_ws_9, kf_ws_10, + kf_ws_11, + kf_ws_12, + kf_ws_13, + kf_ws_14, + kf_ws_15, + kf_ws_16, + kf_ws_17, + kf_ws_18, + kf_ws_19, + kf_ws_20, + kf_ws_21, + kf_ws_22, kf_ws_next, kf_ws_prev, kf_ws_next_all, @@ -4201,6 +4221,18 @@ enum keyfuncid { kf_mvws_8, kf_mvws_9, kf_mvws_10, + kf_mvws_11, + kf_mvws_12, + kf_mvws_13, + kf_mvws_14, + kf_mvws_15, + kf_mvws_16, + kf_mvws_17, + kf_mvws_18, + kf_mvws_19, + kf_mvws_20, + kf_mvws_21, + kf_mvws_22, kf_bar_toggle, kf_wind_kill, kf_wind_del, @@ -4276,6 +4308,18 @@ struct keyfunc { { "ws_8", switchws, {.id = 7} }, { "ws_9", switchws, {.id = 8} }, { "ws_10", switchws, {.id = 9} }, + { "ws_11", switchws, {.id = 10} }, + { "ws_12", switchws, {.id = 11} }, + { "ws_13", switchws, {.id = 12} }, + { "ws_14", switchws, {.id = 13} }, + { "ws_15", switchws, {.id = 14} }, + { "ws_16", switchws, {.id = 15} }, + { "ws_17", switchws, {.id = 16} }, + { "ws_18", switchws, {.id = 17} }, + { "ws_19", switchws, {.id = 18} }, + { "ws_20", switchws, {.id = 19} }, + { "ws_21", switchws, {.id = 20} }, + { "ws_22", switchws, {.id = 21} }, { "ws_next", cyclews, {.id = SWM_ARG_ID_CYCLEWS_UP} }, { "ws_prev", cyclews, {.id = SWM_ARG_ID_CYCLEWS_DOWN} }, { "ws_next_all", cyclews, {.id = SWM_ARG_ID_CYCLEWS_UP_ALL} }, @@ -4293,6 +4337,18 @@ struct keyfunc { { "mvws_8", send_to_ws, {.id = 7} }, { "mvws_9", send_to_ws, {.id = 8} }, { "mvws_10", send_to_ws, {.id = 9} }, + { "mvws_11", send_to_ws, {.id = 10} }, + { "mvws_12", send_to_ws, {.id = 11} }, + { "mvws_13", send_to_ws, {.id = 12} }, + { "mvws_14", send_to_ws, {.id = 13} }, + { "mvws_15", send_to_ws, {.id = 14} }, + { "mvws_16", send_to_ws, {.id = 15} }, + { "mvws_17", send_to_ws, {.id = 16} }, + { "mvws_18", send_to_ws, {.id = 17} }, + { "mvws_19", send_to_ws, {.id = 18} }, + { "mvws_20", send_to_ws, {.id = 19} }, + { "mvws_21", send_to_ws, {.id = 20} }, + { "mvws_22", send_to_ws, {.id = 21} }, { "bar_toggle", bar_toggle, {0} }, { "wind_kill", wkill, {.id = SWM_ARG_ID_KILLWINDOW} }, { "wind_del", wkill, {.id = SWM_ARG_ID_DELETEWINDOW} }, @@ -4886,6 +4942,18 @@ setup_keys(void) setkeybinding(MODKEY, XK_8, kf_ws_8, NULL); setkeybinding(MODKEY, XK_9, kf_ws_9, NULL); setkeybinding(MODKEY, XK_0, kf_ws_10, NULL); + setkeybinding(MODKEY, XK_F1, kf_ws_11, NULL); + setkeybinding(MODKEY, XK_F2, kf_ws_12, NULL); + setkeybinding(MODKEY, XK_F3, kf_ws_13, NULL); + setkeybinding(MODKEY, XK_F4, kf_ws_14, NULL); + setkeybinding(MODKEY, XK_F5, kf_ws_15, NULL); + setkeybinding(MODKEY, XK_F6, kf_ws_16, NULL); + setkeybinding(MODKEY, XK_F7, kf_ws_17, NULL); + setkeybinding(MODKEY, XK_F8, kf_ws_18, NULL); + setkeybinding(MODKEY, XK_F9, kf_ws_19, NULL); + setkeybinding(MODKEY, XK_F10, kf_ws_20, NULL); + setkeybinding(MODKEY, XK_F11, kf_ws_21, NULL); + setkeybinding(MODKEY, XK_F12, kf_ws_22, NULL); setkeybinding(MODKEY, XK_Right, kf_ws_next, NULL); setkeybinding(MODKEY, XK_Left, kf_ws_prev, NULL); setkeybinding(MODKEY, XK_Up, kf_ws_next_all, NULL); @@ -4903,6 +4971,18 @@ setup_keys(void) setkeybinding(MODKEY|ShiftMask, XK_8, kf_mvws_8, NULL); setkeybinding(MODKEY|ShiftMask, XK_9, kf_mvws_9, NULL); setkeybinding(MODKEY|ShiftMask, XK_0, kf_mvws_10, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F1, kf_mvws_11, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F2, kf_mvws_12, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F3, kf_mvws_13, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F4, kf_mvws_14, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F5, kf_mvws_15, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F6, kf_mvws_16, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F7, kf_mvws_17, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F8, kf_mvws_18, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F9, kf_mvws_19, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F10, kf_mvws_20, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F11, kf_mvws_21, NULL); + setkeybinding(MODKEY|ShiftMask, XK_F12, kf_mvws_22, NULL); setkeybinding(MODKEY, XK_b, kf_bar_toggle, NULL); setkeybinding(MODKEY, XK_Tab, kf_focus_next, NULL); setkeybinding(MODKEY|ShiftMask, XK_Tab, kf_focus_prev, NULL); @@ -5197,8 +5277,8 @@ setup_quirks(void) enum { SWM_S_BAR_DELAY, SWM_S_BAR_ENABLED, SWM_S_BAR_BORDER_WIDTH, SWM_S_STACK_ENABLED, SWM_S_CLOCK_ENABLED, SWM_S_CLOCK_FORMAT, - SWM_S_CYCLE_EMPTY, SWM_S_CYCLE_VISIBLE, SWM_S_SS_ENABLED, - SWM_S_TERM_WIDTH, SWM_S_TITLE_CLASS_ENABLED, + SWM_S_CYCLE_EMPTY, SWM_S_CYCLE_VISIBLE, SWM_S_WORKSPACE_LIMIT, + SWM_S_SS_ENABLED, SWM_S_TERM_WIDTH, SWM_S_TITLE_CLASS_ENABLED, SWM_S_TITLE_NAME_ENABLED, SWM_S_WINDOW_NAME_ENABLED, SWM_S_URGENT_ENABLED, SWM_S_FOCUS_MODE, SWM_S_DISABLE_BORDER, SWM_S_BORDER_WIDTH, SWM_S_BAR_FONT, SWM_S_BAR_ACTION, SWM_S_SPAWN_TERM, @@ -5254,6 +5334,13 @@ setconfvalue(char *selector, char *value, int flags) case SWM_S_CYCLE_VISIBLE: cycle_visible = atoi(value); break; + case SWM_S_WORKSPACE_LIMIT: + workspace_limit = atoi(value); + if (workspace_limit > SWM_WS_MAX) + workspace_limit = SWM_WS_MAX; + else if (workspace_limit < 1) + workspace_limit = 1; + break; case SWM_S_SS_ENABLED: ss_enabled = atoi(value); break; @@ -5376,7 +5463,7 @@ setautorun(char *selector, char *value, int flags) if (sscanf(value, "ws[%d]:%1023c", &ws_id, s) != 2) errx(1, "invalid autorun entry, should be 'ws[]:command'"); ws_id--; - if (ws_id < 0 || ws_id >= SWM_WS_MAX) + if (ws_id < 0 || ws_id >= workspace_limit) errx(1, "autorun: invalid workspace %d", ws_id + 1); /* @@ -5441,7 +5528,7 @@ setlayout(char *selector, char *value, int flags) "::::" "'"); ws_id--; - if (ws_id < 0 || ws_id >= SWM_WS_MAX) + if (ws_id < 0 || ws_id >= workspace_limit) errx(1, "layout: invalid workspace %d", ws_id + 1); if (!strcasecmp(s, "vertical")) @@ -5515,6 +5602,7 @@ struct config_option configopt[] = { { "color_unfocus", setconfcolor, SWM_S_COLOR_UNFOCUS }, { "cycle_empty", setconfvalue, SWM_S_CYCLE_EMPTY }, { "cycle_visible", setconfvalue, SWM_S_CYCLE_VISIBLE }, + { "workspace_limit", setconfvalue, SWM_S_WORKSPACE_LIMIT }, { "dialog_ratio", setconfvalue, SWM_S_DIALOG_RATIO }, { "verbose_layout", setconfvalue, SWM_S_VERBOSE_LAYOUT }, { "modkey", setconfmodkey, 0 }, @@ -5832,7 +5920,8 @@ manage_window(Window id) p = NULL; } else if (prop && win->transient == 0) { DNPRINTF(SWM_D_PROP, "manage_window: get _SWM_WS: %s\n", prop); - ws_idx = strtonum((const char *)prop, 0, 9, &errstr); + ws_idx = strtonum((const char *)prop, 0, workspace_limit - 1, + &errstr); if (errstr) { DNPRINTF(SWM_D_EVENT, "manage_window: window: #%s: %s", errstr, prop); @@ -6634,7 +6723,7 @@ new_region(struct swm_screen *s, int x, int y, int w, int h) /* if we don't have a workspace already, find one */ if (ws == NULL) { - for (i = 0; i < SWM_WS_MAX; i++) + for (i = 0; i < workspace_limit; i++) if (s->ws[i].r == NULL) { ws = &s->ws[i]; break; @@ -6838,7 +6927,7 @@ setup_screens(void) /* init all workspaces */ /* XXX these should be dynamically allocated too */ - for (j = 0; j < SWM_WS_MAX; j++) { + for (j = 0; j < workspace_limit; j++) { ws = &screens[i].ws[j]; ws->idx = j; ws->name = NULL; diff --git a/spectrwm.conf b/spectrwm.conf index 5e460d5..69ae883 100644 --- a/spectrwm.conf +++ b/spectrwm.conf @@ -1,11 +1,18 @@ # PLEASE READ THE MAN PAGE BEFORE EDITING THIS FILE! # http://opensource.conformal.com/cgi-bin/man-cgi?spectrwm - -# colors for focussed and unfocussed window borders # NOTE: all colors in this file are in hex! see XQueryColor for examples + +# workspace_limit = 22 +# focus_mode = default + +# window decoration +# border_width = 1 # color_focus = red # color_unfocus = rgb:88/88/88 +# Remove window border when bar is disabled and there is only one window in workspace +# disable_border = 1 + # bar settings # bar_enabled = 1 # bar_border_width = 1 @@ -24,9 +31,6 @@ # title_class_enabled = 0 # window_name_enabled = 0 # verbose_layout = 1 -# focus_mode = default -# disable_border = 1 -# border_width = 1 # urgent_enabled = 1 # spawn app diff --git a/spectrwm_us.conf b/spectrwm_us.conf index f2ce392..6b54d1c 100644 --- a/spectrwm_us.conf +++ b/spectrwm_us.conf @@ -29,6 +29,18 @@ bind[ws_7] = MOD+7 bind[ws_8] = MOD+8 bind[ws_9] = MOD+9 bind[ws_10] = MOD+0 +bind[ws_11] = MOD+F1 +bind[ws_12] = MOD+F2 +bind[ws_13] = MOD+F3 +bind[ws_14] = MOD+F4 +bind[ws_15] = MOD+F5 +bind[ws_16] = MOD+F6 +bind[ws_17] = MOD+F7 +bind[ws_18] = MOD+F8 +bind[ws_19] = MOD+F9 +bind[ws_20] = MOD+F10 +bind[ws_21] = MOD+F11 +bind[ws_22] = MOD+F12 bind[ws_next] = MOD+Right bind[ws_prev] = MOD+Left bind[ws_next_all] = MOD+Up @@ -46,6 +58,18 @@ bind[mvws_7] = MOD+Shift+7 bind[mvws_8] = MOD+Shift+8 bind[mvws_9] = MOD+Shift+9 bind[mvws_10] = MOD+Shift+0 +bind[mvws_11] = MOD+Shift+F1 +bind[mvws_12] = MOD+Shift+F2 +bind[mvws_13] = MOD+Shift+F3 +bind[mvws_14] = MOD+Shift+F4 +bind[mvws_15] = MOD+Shift+F5 +bind[mvws_16] = MOD+Shift+F6 +bind[mvws_17] = MOD+Shift+F7 +bind[mvws_18] = MOD+Shift+F8 +bind[mvws_19] = MOD+Shift+F9 +bind[mvws_20] = MOD+Shift+F10 +bind[mvws_21] = MOD+Shift+F11 +bind[mvws_22] = MOD+Shift+F12 bind[bar_toggle] = MOD+b bind[focus_next] = MOD+Tab bind[focus_prev] = MOD+Shift+Tab