Hello @tech,

with this diff https://marc.info/?l=openbsd-tech&m=149192690925713&w=2 the
behaviour of cwm changed so vtile and htile always use 50% of the screen.

This is a reasonable default but sometimes I want to have the master windows
be bigger.

Inspired by this patch https://marc.info/?l=openbsd-tech&m=154887686615696&w=2
I suggest the following diff.

This adds two new config options "htile percent" and "vtile percent" which
define how much of the screen the current windows should occupy as the master
window. If set to "0" then the old behaviour is restored where the current
vertical or horizontal size of the window defines the size of the master
window. If unset the current behaviour is unchaged that means the master
windows uses half of the screen size.

For example in .cwmrc:

htile 66
vtile 0

For window-htile the master window will occupy 66% of the screen high or for
window-vtile the current window width defines the screen width of the master
window.

Any thoughts?

Regards Uwe


Index: calmwm.h
===================================================================
RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
retrieving revision 1.374
diff -u -p -r1.374 calmwm.h
--- calmwm.h    24 Mar 2020 14:47:29 -0000      1.374
+++ calmwm.h    27 Mar 2020 00:09:43 -0000
@@ -291,6 +291,8 @@ struct conf {
        int                      bwidth;
        int                      mamount;
        int                      snapdist;
+       int                      htile;
+       int                      vtile;
        struct gap               gap;
        char                    *color[CWM_COLOR_NITEMS];
        char                    *font;
Index: client.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/client.c,v
retrieving revision 1.262
diff -u -p -r1.262 client.c
--- client.c    24 Mar 2020 14:47:29 -0000      1.262
+++ client.c    27 Mar 2020 00:09:43 -0000
@@ -940,7 +940,8 @@ client_htile(struct client_ctx *cc)
        cc->geom.x = area.x;
        cc->geom.y = area.y;
        cc->geom.w = area.w - (cc->bwidth * 2);
-       cc->geom.h = (area.h - (cc->bwidth * 2)) / 2;
+  if (Conf.htile > 0)
+       cc->geom.h = ((area.h - (cc->bwidth * 2)) * Conf.htile) / 100;
        client_resize(cc, 1);
        client_ptr_warp(cc);
 
@@ -1007,7 +1008,8 @@ client_vtile(struct client_ctx *cc)
        cc->flags &= ~CLIENT_VMAXIMIZED;
        cc->geom.x = area.x;
        cc->geom.y = area.y;
-       cc->geom.w = (area.w - (cc->bwidth * 2)) / 2;
+  if (Conf.vtile > 0)
+       cc->geom.w = ((area.w - (cc->bwidth * 2)) * Conf.vtile) / 100;
        cc->geom.h = area.h - (cc->bwidth * 2);
        client_resize(cc, 1);
        client_ptr_warp(cc);
Index: conf.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/conf.c,v
retrieving revision 1.251
diff -u -p -r1.251 conf.c
--- conf.c      27 Feb 2020 14:56:39 -0000      1.251
+++ conf.c      27 Mar 2020 00:09:43 -0000
@@ -281,6 +281,8 @@ conf_init(struct conf *c)
        c->stickygroups = 0;
        c->bwidth = 1;
        c->mamount = 1;
+       c->htile = 50;
+       c->vtile = 50;
        c->snapdist = 0;
        c->ngroups = 0;
        c->nameqlen = 5;
Index: cwmrc.5
===================================================================
RCS file: /cvs/xenocara/app/cwm/cwmrc.5,v
retrieving revision 1.75
diff -u -p -r1.75 cwmrc.5
--- cwmrc.5     13 Mar 2020 20:50:07 -0000      1.75
+++ cwmrc.5     27 Mar 2020 00:09:43 -0000
@@ -183,6 +183,11 @@ This
 can be used for applications such as
 .Xr xclock 1 ,
 where the user may wish to remain visible.
+.It Ic htile Ar percent
+The amount of the screen the master window should be resized to when
+.Ic window-htile
+is called. If set to 0 then the size is the vertical size of current current
+window.
 .It Ic ignore Ar windowname
 Ignore, and do not warp to, windows with the name
 .Ar windowname
@@ -216,6 +221,11 @@ A special
 keyword
 .Dq all
 can be used to unbind all buttons.
+.It Ic vtile Ar percent
+The amount of the screen the master window should be resized to when
+.Ic window-vtile
+is called. If set to 0 then the size is the horizontal size of the current
+window.
 .It Ic wm Ar name path
 Every
 .Ar name
@@ -303,11 +313,15 @@ Vertically maximize current window (gap 
 Horizontally maximize current window (gap + border honored).
 .It window-htile
 Current window is placed at the top of the screen, maximized
-horizontally and resized to half of the vertical screen space.
+horizontally and resized to
+.Ar htile
+(default half) of the vertical screen space.
 Other windows in its group share remaining screen space.
 .It window-vtile
 Current window is placed on the left of the screen, maximized vertically
-and resized to half of the horizontal screen space.
+and resized to
+.Ar vtile
+(default half) of the horizontal screen space.
 Other windows in its group share remaining screen space.
 .It window-move
 Move current window.
Index: parse.y
===================================================================
RCS file: /cvs/xenocara/app/cwm/parse.y,v
retrieving revision 1.72
diff -u -p -r1.72 parse.y
--- parse.y     9 Nov 2018 16:00:54 -0000       1.72
+++ parse.y     27 Mar 2020 00:09:43 -0000
@@ -71,7 +71,7 @@ typedef struct {
 %token BINDKEY UNBINDKEY BINDMOUSE UNBINDMOUSE
 %token FONTNAME STICKY GAP
 %token AUTOGROUP COMMAND IGNORE WM
-%token YES NO BORDERWIDTH MOVEAMOUNT
+%token YES NO BORDERWIDTH MOVEAMOUNT HTILE VTILE
 %token COLOR SNAPDIST
 %token ACTIVEBORDER INACTIVEBORDER URGENCYBORDER
 %token GROUPBORDER UNGROUPBORDER
@@ -122,6 +122,20 @@ main               : FONTNAME STRING               {
                        }
                        conf->bwidth = $2;
                }
+               | HTILE NUMBER {
+                       if ($2 < 0 || $2 > 99) {
+                               yyerror("invalid htile percent");
+                               YYERROR;
+                       }
+                       conf->htile = $2;
+               }
+               | VTILE NUMBER {
+                       if ($2 < 0 || $2 > 99) {
+                               yyerror("invalid vtile percent");
+                               YYERROR;
+                       }
+                       conf->vtile = $2;
+               }
                | MOVEAMOUNT NUMBER {
                        if ($2 < 0 || $2 > INT_MAX) {
                                yyerror("invalid movemount");
@@ -316,6 +330,7 @@ lookup(char *s)
                { "fontname",           FONTNAME},
                { "gap",                GAP},
                { "groupborder",        GROUPBORDER},
+               { "htile",              HTILE},
                { "ignore",             IGNORE},
                { "inactiveborder",     INACTIVEBORDER},
                { "menubg",             MENUBG},
@@ -329,6 +344,7 @@ lookup(char *s)
                { "unbind-mouse",       UNBINDMOUSE},
                { "ungroupborder",      UNGROUPBORDER},
                { "urgencyborder",      URGENCYBORDER},
+               { "vtile",              VTILE},
                { "wm",                 WM},
                { "yes",                YES}
        };

Reply via email to