Hi folks,

Here's a patch I've been dragging around for years now that allows cwm
to cycle through windows of the same window class as the current one.
Man page parts included, and a default key binding to M-grave,
respectively Alt-Tilde, like other window managers have as well.

Who likes it?

Cheers,
Simon

P.S.: As I'm still inactive, please feel free to take the commit.

Index: calmwm.h
===================================================================
RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
retrieving revision 1.378
diff -u -p -r1.378 calmwm.h
--- calmwm.h    26 Feb 2022 15:19:18 -0000      1.378
+++ calmwm.h    14 Jul 2023 20:12:40 -0000
@@ -67,6 +67,7 @@
 #define CWM_CYCLE_FORWARD      0x0001
 #define CWM_CYCLE_REVERSE      0x0002
 #define CWM_CYCLE_INGROUP      0x0004
+#define CWM_CYCLE_INCLASS      0x0008
 
 enum cwm_status {
        CWM_QUIT,
Index: conf.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/conf.c,v
retrieving revision 1.255
diff -u -p -r1.255 conf.c
--- conf.c      26 Feb 2022 15:19:18 -0000      1.255
+++ conf.c      14 Jul 2023 20:12:40 -0000
@@ -136,6 +136,10 @@ static const struct {
                (CWM_CYCLE_FORWARD | CWM_CYCLE_INGROUP)) },
        { FUNC_SC(window-rcycle-ingroup, client_cycle,
                (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-rcycle, group_cycle, (CWM_CYCLE_REVERSE)) },
@@ -220,6 +224,8 @@ static const struct {
        { "C-slash",    "menu-cmd" },
        { "M-Tab",      "window-cycle" },
        { "MS-Tab",     "window-rcycle" },
+       { "M-grave",    "window-cycle-inclass" },
+       { "MS-grave",   "window-rcycle-inclass" },
        { "CM-n",       "window-menu-label" },
        { "CM-x",       "window-close" },
        { "CM-a",       "group-toggle-all" },
Index: cwm.1
===================================================================
RCS file: /cvs/xenocara/app/cwm/cwm.1,v
retrieving revision 1.65
diff -u -p -r1.65 cwm.1
--- cwm.1       9 Jul 2019 21:38:44 -0000       1.65
+++ cwm.1       14 Jul 2023 20:12:40 -0000
@@ -102,6 +102,10 @@ Label current window.
 Cycle through currently visible windows.
 .It Ic MS-Tab
 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
 Close current window.
 .It Ic CM-[n]
Index: cwmrc.5
===================================================================
RCS file: /cvs/xenocara/app/cwm/cwmrc.5,v
retrieving revision 1.77
diff -u -p -r1.77 cwmrc.5
--- cwmrc.5     27 Jan 2022 18:45:10 -0000      1.77
+++ cwmrc.5     14 Jul 2023 20:12:40 -0000
@@ -295,6 +295,10 @@ Reverse cycle through windows.
 Forward cycle through windows in current group.
 .It window-rcycle-ingroup
 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
 Close current window.
 .It window-hide
Index: kbfunc.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/kbfunc.c,v
retrieving revision 1.173
diff -u -p -r1.173 kbfunc.c
--- kbfunc.c    27 Feb 2022 14:59:55 -0000      1.173
+++ kbfunc.c    14 Jul 2023 20:12:40 -0000
@@ -430,7 +430,9 @@ kbfunc_client_cycle(void *ctx, struct ca
                /* Only cycle visible and non-ignored windows. */
                if ((newcc->flags & (CLIENT_SKIP_CYCLE)) ||
                    ((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;
 
                /* Is oldcc the only non-hidden window? */

Reply via email to