On Mon, Aug 24, 2009 at 05:17:08PM +0100, Owain Ainsworth wrote:
> On Thu, Aug 20, 2009 at 01:50:37PM +0200, Thomas Pfaff wrote:
> > This diff adds a new command, hmaximize, that maximizes the current
> > window horizontally.  I find it useful when lines displayed by
> > commands are longer than my xterm; this way I can quickly maximize
> > horizontally and get the whole picture without lines wrapping.
> > 
> > Comments?

After discussion with okan@, here's a new diff, based on yours.

It fixes the flags issue that I brought up, and adds a default
keybinding (CMS-=). It works for me, but I don't have much use for
horizontal maximisation.

-0-
-- 
The best defense against logic is ignorance.
? cwm
? cwm.cat1
? cwmrc.cat5
? hmax.diff
? parse.c
? y.tab.h
Index: calmwm.h
===================================================================
RCS file: /cvs/xenocara/app/cwm/calmwm.h,v
retrieving revision 1.94
diff -u -p -r1.94 calmwm.h
--- calmwm.h    26 Jun 2009 12:21:58 -0000      1.94
+++ calmwm.h    24 Aug 2009 17:15:11 -0000
@@ -96,6 +96,8 @@ TAILQ_HEAD(screen_ctx_q, screen_ctx);
 #define CLIENT_MAXIMIZED       0x08
 #define CLIENT_DOVMAXIMIZE     0x10
 #define CLIENT_VMAXIMIZED      0x20
+#define CLIENT_DOHMAXIMIZE     0x40
+#define CLIENT_HMAXIMIZED      0x80
 
 #define CLIENT_HIGHLIGHT_GROUP         1
 #define CLIENT_HIGHLIGHT_UNGROUP       2
@@ -347,6 +349,7 @@ void                         client_ptrsave(struct 
client_ctx
 void                    client_draw_border(struct client_ctx *);
 void                    client_maximize(struct client_ctx *);
 void                    client_vertmaximize(struct client_ctx *);
+void                    client_horizmaximize(struct client_ctx *);
 void                    client_map(struct client_ctx *);
 void                    client_mtf(struct client_ctx *);
 struct client_ctx      *client_cycle(int);
@@ -434,6 +437,8 @@ void                         
kbfunc_client_movetogroup(struct
 void                    kbfunc_client_maximize(struct client_ctx *,
                             union arg *);
 void                    kbfunc_client_vmaximize(struct client_ctx *,
+                            union arg *);
+void                    kbfunc_client_hmaximize(struct client_ctx *,
                             union arg *);
 void                    kbfunc_reload(struct client_ctx *, union arg *);
 void                    kbfunc_quit_wm(struct client_ctx *, union arg *);
Index: client.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/client.c,v
retrieving revision 1.58
diff -u -p -r1.58 client.c
--- client.c    24 Aug 2009 17:04:39 -0000      1.58
+++ client.c    24 Aug 2009 17:15:11 -0000
@@ -238,7 +238,7 @@ client_maximize(struct client_ctx *cc)
        if (cc->flags & CLIENT_MAXIMIZED) {
                cc->geom = cc->savegeom;
        } else {
-               if (!(cc->flags & CLIENT_VMAXIMIZED))
+               if (!(cc->flags & (CLIENT_VMAXIMIZED | CLIENT_HMAXIMIZED)))
                        cc->savegeom = cc->geom;
                if (HasXinerama) {
                        XineramaScreenInfo *xine;
@@ -277,7 +277,7 @@ client_vertmaximize(struct client_ctx *c
        if (cc->flags & CLIENT_VMAXIMIZED) {
                cc->geom = cc->savegeom;
        } else {
-               if (!(cc->flags & CLIENT_MAXIMIZED))
+               if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_HMAXIMIZED)))
                        cc->savegeom = cc->geom;
                if (HasXinerama) {
                        XineramaScreenInfo *xine;
@@ -300,9 +300,41 @@ calc:
 }
 
 void
+client_horizmaximize(struct client_ctx *cc)
+{
+       struct screen_ctx       *sc = CCTOSC(cc);
+       int                      x_org = 0, xmax = sc->xmax;
+
+       if (cc->flags & CLIENT_HMAXIMIZED) {
+               cc->geom = cc->savegeom;
+       } else {
+               if (!(cc->flags & (CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED)))
+                       cc->savegeom = cc->geom;
+               if (HasXinerama) {
+                       XineramaScreenInfo *xine;
+                       xine = screen_find_xinerama(CCTOSC(cc),
+                           cc->geom.x + cc->geom.width / 2,
+                           cc->geom.y + cc->geom.height / 2);
+                       if (xine == NULL)
+                               goto calc;
+                       x_org = xine->x_org;
+                       xmax = xine->width;
+               }
+calc:
+               cc->geom.x = x_org + Conf.gap_left;
+               cc->geom.width = xmax - (cc->bwidth * 2) - (Conf.gap_left +
+                   Conf.gap_right);
+               cc->flags |= CLIENT_DOHMAXIMIZE;
+       }
+
+       client_resize(cc);
+}
+
+void
 client_resize(struct client_ctx *cc)
 {
-       cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED);
+       cc->flags &= ~(CLIENT_MAXIMIZED | CLIENT_VMAXIMIZED |
+           CLIENT_HMAXIMIZED);
 
        if (cc->flags & CLIENT_DOMAXIMIZE) {
                cc->flags &= ~CLIENT_DOMAXIMIZE;
@@ -310,6 +342,9 @@ client_resize(struct client_ctx *cc)
        } else if (cc->flags & CLIENT_DOVMAXIMIZE) {
                cc->flags &= ~CLIENT_DOVMAXIMIZE;
                cc->flags |= CLIENT_VMAXIMIZED;
+       } else if (cc->flags & CLIENT_DOHMAXIMIZE) {
+               cc->flags &= ~CLIENT_DOHMAXIMIZE;
+               cc->flags |= CLIENT_HMAXIMIZED;
        }
 
        XMoveResizeWindow(X_Dpy, cc->win, cc->geom.x,
Index: conf.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/conf.c,v
retrieving revision 1.66
diff -u -p -r1.66 conf.c
--- conf.c      26 Jun 2009 12:21:58 -0000      1.66
+++ conf.c      24 Aug 2009 17:15:11 -0000
@@ -135,6 +135,7 @@ conf_init(struct conf *c)
        conf_bindname(c, "CM-g", "grouptoggle");
        conf_bindname(c, "CM-f", "maximize");
        conf_bindname(c, "CM-equal", "vmaximize");
+       conf_bindname(c, "CMS-equal", "hmaximize");
        conf_bindname(c, "CMS-r", "reload");
        conf_bindname(c, "CMS-q", "quit");
 
@@ -338,6 +339,7 @@ static struct {
        { "grouptoggle", kbfunc_client_grouptoggle, KBFLAG_NEEDCLIENT, {0}},
        { "maximize", kbfunc_client_maximize, KBFLAG_NEEDCLIENT, {0} },
        { "vmaximize", kbfunc_client_vmaximize, KBFLAG_NEEDCLIENT, {0} },
+       { "hmaximize", kbfunc_client_hmaximize, KBFLAG_NEEDCLIENT, {0} },
        { "reload", kbfunc_reload, 0, {0} },
        { "quit", kbfunc_quit_wm, 0, {0} },
        { "exec", kbfunc_exec, 0, {.i = CWM_EXEC_PROGRAM} },
Index: cwm.1
===================================================================
RCS file: /cvs/xenocara/app/cwm/cwm.1,v
retrieving revision 1.42
diff -u -p -r1.42 cwm.1
--- cwm.1       19 Jun 2009 10:43:49 -0000      1.42
+++ cwm.1       24 Aug 2009 17:15:11 -0000
@@ -92,6 +92,8 @@ Reverse cycle through active groups.
 Toggle full-screen size of current window.
 .It Ic CM-=
 Toggle vertical maximization of current window.
+.It Ic CMS-=
+Toggle horizontal maximization of current window.
 .It Ic M-?
 Spawn
 .Dq exec program
Index: cwmrc.5
===================================================================
RCS file: /cvs/xenocara/app/cwm/cwmrc.5,v
retrieving revision 1.27
diff -u -p -r1.27 cwmrc.5
--- cwmrc.5     8 Aug 2009 17:27:51 -0000       1.27
+++ cwmrc.5     24 Aug 2009 17:15:11 -0000
@@ -292,6 +292,8 @@ Label current window.
 Maximize current window full-screen.
 .It vmaximize
 Maximize current window vertically.
+.It hmaximize
+Maximize current window horizontally.
 .It moveup
 Move window
 .Ar moveamount
Index: kbfunc.c
===================================================================
RCS file: /cvs/xenocara/app/cwm/kbfunc.c,v
retrieving revision 1.40
diff -u -p -r1.40 kbfunc.c
--- kbfunc.c    20 Jun 2009 00:55:42 -0000      1.40
+++ kbfunc.c    24 Aug 2009 17:15:11 -0000
@@ -482,6 +482,12 @@ kbfunc_client_vmaximize(struct client_ct
 }
 
 void
+kbfunc_client_hmaximize(struct client_ctx *cc, union arg *arg)
+{
+       client_horizmaximize(cc);
+}
+
+void
 kbfunc_quit_wm(struct client_ctx *cc, union arg *arg)
 {
        _xev_quit = 1;

Reply via email to