Hello everyone.
I have problem with pertag patch on DWM 5.6.1. I try to patch source but with 
no result. Patch was found on ML (attached). I also attached dwm.c.rej file. 
Could somebody help me to solve this problem becouse patch is very usefull.
P.S. Sorry for mu ang.

***************
*** 1596,1607 ****
  void
  toggletag(const Arg *arg) {
        unsigned int mask;
  
        if(!selmon->sel)
                return;
        mask = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(mask) {
-               selmon->sel->tags = mask;
                arrange();
        }
  }
--- 1622,1647 ----
  void
  toggletag(const Arg *arg) {
        unsigned int mask;
+       unsigned int i;
  
        if(!selmon->sel)
                return;
        mask = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(mask) {
+               if(mask == ~0) {
+       selmon->prevtag = selmon->curtag;
+       selmon->curtag = 0;
+     }
+     if(!(mask & 1 << (selmon->curtag - 1))) {
+       selmon->prevtag = selmon->curtag;
+       for (i=0; !(mask & 1 << i); i++);
+       selmon->curtag = i + 1;
+     }
+     selmon->sel->tags = mask;
+     selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
+     selmon->mfact = selmon->mfacts[selmon->curtag];
+     if (selmon->showbar != selmon->showbars[selmon->curtag])
+       togglebar(NULL);
                arrange();
        }
  }
--- a/dwm.c     2009-07-14 20:07:55.000000000 +0200
+++ b/dwm.c     2009-07-15 15:32:33.000000000 +0200
@@ -120,25 +120,6 @@
        void (*arrange)(Monitor *);
 } Layout;
 
-struct Monitor {
-       float mfact;
-       int num;
-       int by;               /* bar geometry */
-       int mx, my, mw, mh;   /* screen size */
-       int wx, wy, ww, wh;   /* window area  */
-       unsigned int seltags;
-       unsigned int sellt;
-       unsigned int tagset[2];
-       Bool showbar;
-       Bool topbar;
-       Client *clients;
-       Client *sel;
-       Client *stack;
-       Monitor *next;
-       Window barwin;
-       const Layout *lt[2];
-};
-
 typedef struct {
        const char *class;
        const char *instance;
@@ -270,6 +251,30 @@
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
+struct Monitor {
+  float mfact;
+  int num;
+  int by;               /* bar geometry */
+  int mx, my, mw, mh;   /* screen size */
+  int wx, wy, ww, wh;   /* window area  */
+  unsigned int seltags;
+  unsigned int sellt;
+  unsigned int tagset[2];
+  Bool showbar;
+  Bool topbar;
+  Client *clients;
+  Client *sel;
+  Client *stack;
+  Monitor *next;
+  Window barwin;
+  const Layout *lt[2];
+  int curtag;
+  int prevtag;
+  Layout *lts[LENGTH(tags) + 1];
+  double mfacts[LENGTH(tags) + 1];
+  Bool showbars[LENGTH(tags) + 1];
+};
+
 /* compile-time check if all tags fit into an unsigned int bit array. */
 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
 
@@ -1401,7 +1406,7 @@
        if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
                selmon->sellt ^= 1;
        if(arg && arg->v)
-               selmon->lt[selmon->sellt] = (Layout *)arg->v;
+               selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = 
(Layout *)arg->v;
        if(selmon->sel)
                arrange();
        else
@@ -1418,7 +1423,7 @@
        f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
        if(f < 0.1 || f > 0.9)
                return;
-       selmon->mfact = f;
+       selmon->mfact = selmon->mfacts[selmon->curtag] = f;
        arrange();
 }
 
@@ -1427,6 +1432,7 @@
        unsigned int i;
        int w;
        XSetWindowAttributes wa;
+       Monitor *m;
 
        /* init screen */
        screen = DefaultScreen(dpy);
@@ -1458,11 +1464,31 @@
        XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
        if(!dc.font.set)
                XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+       /* init tags */
+  for(m = mons; m; m = m->next)
+    m->curtag = m->prevtag = 1;
+  /* init mfacts */
+  for(m = mons; m; m = m->next) {
+               for(i=0; i < LENGTH(tags) + 1 ; i++) {
+                       m->mfacts[i] = m->mfact;
+               }
+       }
+  /* init layouts */
+       for(m = mons; m; m = m->next) {
+               for(i=0; i < LENGTH(tags) + 1; i++) {
+                       m->lts[i] = &layouts[0];
+               }
+       }
        /* init bars */
        for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) {
                w = TEXTW(layouts[i].symbol);
                blw = MAX(blw, w);
        }
+       for(m = mons; m; m = m->next) {
+               for(i=0; i < LENGTH(tags) + 1; i++) {
+                       m->showbars[i] = m->showbar;
+               }
+       }
        updatebars();
        updatestatus();
        /* EWMH support per view */
@@ -1572,7 +1598,7 @@
 
 void
 togglebar(const Arg *arg) {
-       selmon->showbar = !selmon->showbar;
+       selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
        updatebarpos(selmon);
        XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, 
selmon->ww, bh);
        arrange();
@@ -1592,12 +1618,26 @@
 void
 toggletag(const Arg *arg) {
        unsigned int mask;
+       unsigned int i;
 
        if(!selmon->sel)
                return;
        mask = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(mask) {
-               selmon->sel->tags = mask;
+               if(mask == ~0) {
+      selmon->prevtag = selmon->curtag;
+      selmon->curtag = 0;
+    }
+    if(!(mask & 1 << (selmon->curtag - 1))) {
+      selmon->prevtag = selmon->curtag;
+      for (i=0; !(mask & 1 << i); i++);
+      selmon->curtag = i + 1;
+    }
+    selmon->sel->tags = mask;
+    selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
+    selmon->mfact = selmon->mfacts[selmon->curtag];
+    if (selmon->showbar != selmon->showbars[selmon->curtag])
+      togglebar(NULL);
                arrange();
        }
 }
@@ -1848,11 +1888,28 @@
 
 void
 view(const Arg *arg) {
+       unsigned int i;
        if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
                return;
        selmon->seltags ^= 1; /* toggle sel tagset */
-       if(arg->ui & TAGMASK)
-               selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
+       if(arg->ui & TAGMASK) {
+    selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
+    selmon->prevtag = selmon->curtag;
+    if(arg->ui == ~0)
+      selmon->curtag = 0;
+    else {
+      for (i=0; !(arg->ui & 1 << i); i++);
+      selmon->curtag = i + 1;
+    }
+  } else {
+    selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+    selmon->curtag^= selmon->prevtag;
+    selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+  }
+  selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
+  selmon->mfact = selmon->mfacts[selmon->curtag];
+  if(selmon->showbar != selmon->showbars[selmon->curtag])
+    togglebar(NULL);
        arrange();
 }
 

Attachment: pgpAsOqfOUrTm.pgp
Description: PGP signature

Reply via email to