Browse Source

Client: Keep free-size after toggle_{free, max}.

OldMan 14 years ago
parent
commit
2b7d1c115d
3 changed files with 14 additions and 2 deletions
  1. 1 0
      src/client.c
  2. 11 2
      src/layout.c
  3. 2 0
      src/structs.h

+ 1 - 0
src/client.c

@@ -555,6 +555,7 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar)
      c->ogeo.y = c->geo.y = my;
      c->ogeo.width = c->geo.width = wa->width;
      c->ogeo.height = c->geo.height = wa->height;
+     c->free_geo = c->geo;
      c->tag = seltag[c->screen];
 
      c->layer = (sel && sel->layer > 0) ? sel->layer : 1;

+ 11 - 2
src/layout.c

@@ -71,7 +71,7 @@ freelayout(int screen)
              && c->screen == screen_get_sel()
              && !(c->flags & MaxFlag))
           {
-               client_moveresize(c, c->ogeo, True);
+               client_moveresize(c, c->free_geo, True);
                c->flags &= ~(TileFlag | LMaxFlag);
           }
 
@@ -93,7 +93,10 @@ layoutswitch(Bool b)
 
      if(tags[selscreen][seltag[selscreen]].layout.func == freelayout)
           for(c = clients; c && (c->tag != seltag[selscreen] && c->screen != selscreen); c = c->next)
+          {
                c->ogeo = c->geo;
+               c->free_geo = c->geo;
+          }
 
      for(i = 0; i < conf.nlayout; ++i)
      {
@@ -775,11 +778,14 @@ uicb_togglefree(uicb_t cmd)
      if((sel->flags & FreeFlag))
      {
           sel->flags &= ~(TileFlag | MaxFlag | LMaxFlag);
-          client_moveresize(sel, sel->ogeo, True);
+          client_moveresize(sel, sel->free_geo, True);
           client_raise(sel);
      }
      else
+     {
+          sel->free_geo = sel->geo;
           sel->ogeo = sel->geo;
+     }
 
      client_update_attributes(sel);
 
@@ -802,6 +808,7 @@ uicb_togglemax(uicb_t cmd)
      if(!(sel->flags & MaxFlag))
      {
           sel->ogeo = sel->geo;
+          sel->free_geo = sel->geo;
           sel->flags &= ~(TileFlag | FreeFlag);
           client_maximize(sel);
           client_raise(sel);
@@ -809,6 +816,8 @@ uicb_togglemax(uicb_t cmd)
      }
      else
      {
+          sel->geo = sel->free_geo;
+          client_moveresize(sel, sel->geo, True);
           sel->flags &= ~MaxFlag;
           tags[selscreen][seltag[selscreen]].layout.func(selscreen);
      }

+ 2 - 0
src/structs.h

@@ -176,6 +176,8 @@ struct Client
      XRectangle frame_geo;
      /* Old window attribute */
      XRectangle ogeo;
+     /* Free window attribute */
+     XRectangle free_geo;
      /* For resizehint usage */
      int basew, baseh, incw, inch;
      int maxw, maxh, minw, minh;