Allow cwm(1) to cycle through windows of the same window class as the

active window; default key binding to M-grave, respectively Alt-Tilde,
like other window managers have as well.

from Simon Dassow
This commit is contained in:
okan
2023-07-20 14:39:34 +00:00
parent 9eb763ab87
commit d86d3aa419
5 changed files with 18 additions and 1 deletions

View File

@@ -67,6 +67,7 @@
#define CWM_CYCLE_FORWARD 0x0001 #define CWM_CYCLE_FORWARD 0x0001
#define CWM_CYCLE_REVERSE 0x0002 #define CWM_CYCLE_REVERSE 0x0002
#define CWM_CYCLE_INGROUP 0x0004 #define CWM_CYCLE_INGROUP 0x0004
#define CWM_CYCLE_INCLASS 0x0008
enum cwm_status { enum cwm_status {
CWM_QUIT, CWM_QUIT,

6
conf.c
View File

@@ -136,6 +136,10 @@ static const struct {
(CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)) }, (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)) },
{ FUNC_SC(window-rcycle-ingroup, client_cycle, { FUNC_SC(window-rcycle-ingroup, client_cycle,
(CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP)) }, (CWM_CYCLE_REVERSE | CWM_CYCLE_INGROUP)) },
{ FUNC_SC(window-cycle-inclass, client_cycle,
(CWM_CYCLE_FORWARD | CWM_CYCLE_INCLASS)) },
{ FUNC_SC(window-rcycle-inclass, client_cycle,
(CWM_CYCLE_REVERSE | CWM_CYCLE_INCLASS)) },
{ FUNC_SC(group-cycle, group_cycle, (CWM_CYCLE_FORWARD)) }, { FUNC_SC(group-cycle, group_cycle, (CWM_CYCLE_FORWARD)) },
{ FUNC_SC(group-rcycle, group_cycle, (CWM_CYCLE_REVERSE)) }, { FUNC_SC(group-rcycle, group_cycle, (CWM_CYCLE_REVERSE)) },
@@ -220,6 +224,8 @@ static const struct {
{ "C-slash", "menu-cmd" }, { "C-slash", "menu-cmd" },
{ "M-Tab", "window-cycle" }, { "M-Tab", "window-cycle" },
{ "MS-Tab", "window-rcycle" }, { "MS-Tab", "window-rcycle" },
{ "M-grave", "window-cycle-inclass" },
{ "MS-grave", "window-rcycle-inclass" },
{ "CM-n", "window-menu-label" }, { "CM-n", "window-menu-label" },
{ "CM-x", "window-close" }, { "CM-x", "window-close" },
{ "CM-a", "group-toggle-all" }, { "CM-a", "group-toggle-all" },

4
cwm.1
View File

@@ -102,6 +102,10 @@ Label current window.
Cycle through currently visible windows. Cycle through currently visible windows.
.It Ic MS-Tab .It Ic MS-Tab
Reverse cycle through currently visible windows. Reverse cycle through currently visible windows.
.It Ic M-grave
Cycle through currently visible windows of the same window class.
.It Ic MS-grave
Reverse cycle through currently visible windows of the same window class.
.It Ic CM-x .It Ic CM-x
Close current window. Close current window.
.It Ic CM-[n] .It Ic CM-[n]

View File

@@ -295,6 +295,10 @@ Reverse cycle through windows.
Forward cycle through windows in current group. Forward cycle through windows in current group.
.It window-rcycle-ingroup .It window-rcycle-ingroup
Reverse cycle through windows in current group. Reverse cycle through windows in current group.
.It window-cycle-inclass
Forward cycle through windows of the current window class.
.It window-rcycle-inclass
Reverse cycle through windows of the current window class.
.It window-close .It window-close
Close current window. Close current window.
.It window-hide .It window-hide

View File

@@ -430,7 +430,9 @@ kbfunc_client_cycle(void *ctx, struct cargs *cargs)
/* Only cycle visible and non-ignored windows. */ /* Only cycle visible and non-ignored windows. */
if ((newcc->flags & (CLIENT_SKIP_CYCLE)) || if ((newcc->flags & (CLIENT_SKIP_CYCLE)) ||
((flags & CWM_CYCLE_INGROUP) && ((flags & CWM_CYCLE_INGROUP) &&
(newcc->gc != oldcc->gc))) (newcc->gc != oldcc->gc)) ||
((flags & CWM_CYCLE_INCLASS) &&
strcmp(newcc->res_class, oldcc->res_class) != 0))
again = 1; again = 1;
/* Is oldcc the only non-hidden window? */ /* Is oldcc the only non-hidden window? */