dwm-r1578-pertag.diff - sites - public wiki contents of suckless.org
HTML git clone git://git.suckless.org/sites
DIR Log
DIR Files
DIR Refs
---
dwm-r1578-pertag.diff (4963B)
---
1 diff --git a/dwm.c b/dwm.c
2 --- a/dwm.c
3 +++ b/dwm.c
4 @@ -122,27 +122,6 @@
5 void (*arrange)(Monitor *);
6 } Layout;
7
8 -struct Monitor {
9 - char ltsymbol[16];
10 - float mfact;
11 - int nmaster;
12 - int num;
13 - int by; /* bar geometry */
14 - int mx, my, mw, mh; /* screen size */
15 - int wx, wy, ww, wh; /* window area */
16 - unsigned int seltags;
17 - unsigned int sellt;
18 - unsigned int tagset[2];
19 - Bool showbar;
20 - Bool topbar;
21 - Client *clients;
22 - Client *sel;
23 - Client *stack;
24 - Monitor *next;
25 - Window barwin;
26 - const Layout *lt[2];
27 -};
28 -
29 typedef struct {
30 const char *class;
31 const char *instance;
32 @@ -281,6 +260,33 @@
33 /* configuration, allows nested code to access above variables */
34 #include "config.h"
35
36 +struct Monitor {
37 + char ltsymbol[16];
38 + float mfact;
39 + int nmaster;
40 + int num;
41 + int by; /* bar geometry */
42 + int mx, my, mw, mh; /* screen size */
43 + int wx, wy, ww, wh; /* window area */
44 + unsigned int seltags;
45 + unsigned int sellt;
46 + unsigned int tagset[2];
47 + Bool showbar;
48 + Bool topbar;
49 + Client *clients;
50 + Client *sel;
51 + Client *stack;
52 + Monitor *next;
53 + Window barwin;
54 + const Layout *lt[2];
55 + int curtag;
56 + int prevtag;
57 + const Layout *lts[LENGTH(tags) + 1];
58 + float mfacts[LENGTH(tags) + 1];
59 + int nmasters[LENGTH(tags) + 1];
60 + Bool showbars[LENGTH(tags) + 1];
61 +};
62 +
63 /* compile-time check if all tags fit into an unsigned int bit array. */
64 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
65
66 @@ -661,6 +667,7 @@
67 Monitor *
68 createmon(void) {
69 Monitor *m;
70 + unsigned int i;
71
72 if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
73 die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
74 @@ -672,6 +679,16 @@
75 m->lt[0] = &layouts[0];
76 m->lt[1] = &layouts[1 % LENGTH(layouts)];
77 strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
78 +
79 + /* pertag init */
80 + m->curtag = m->prevtag = 1;
81 + for(i=0; i < LENGTH(tags) + 1 ; i++) {
82 + m->mfacts[i] = mfact;
83 + m->nmasters[i] = nmaster;
84 + m->lts[i] = &layouts[0];
85 + m->showbars[i] = m->showbar;
86 + }
87 +
88 return m;
89 }
90
91 @@ -1028,7 +1045,8 @@
92
93 void
94 incnmaster(const Arg *arg) {
95 - selmon->nmaster = MAX(selmon->nmaster + arg->i, 1);
96 + selmon->nmasters[selmon->curtag] = MAX(selmon->nmaster + arg->i, 1);
97 + selmon->nmaster = selmon->nmasters[selmon->curtag];
98 arrange(selmon);
99 }
100
101 @@ -1515,7 +1533,7 @@
102 if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
103 selmon->sellt ^= 1;
104 if(arg && arg->v)
105 - selmon->lt[selmon->sellt] = (Layout *)arg->v;
106 + selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
107 strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
108 if(selmon->sel)
109 arrange(selmon);
110 @@ -1533,7 +1551,7 @@
111 f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
112 if(f < 0.1 || f > 0.9)
113 return;
114 - selmon->mfact = f;
115 + selmon->mfact = selmon->mfacts[selmon->curtag] = f;
116 arrange(selmon);
117 }
118
119 @@ -1680,7 +1698,7 @@
120
121 void
122 togglebar(const Arg *arg) {
123 - selmon->showbar = !selmon->showbar;
124 + selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar;
125 updatebarpos(selmon);
126 XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
127 arrange(selmon);
128 @@ -1699,13 +1717,28 @@
129
130 void
131 toggletag(const Arg *arg) {
132 - unsigned int newtags;
133 + unsigned int i, newtags;
134
135 if(!selmon->sel)
136 return;
137 newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
138 if(newtags) {
139 selmon->sel->tags = newtags;
140 + if(newtags == ~0) {
141 + selmon->prevtag = selmon->curtag;
142 + selmon->curtag = 0;
143 + }
144 + if(!(newtags & 1 << (selmon->curtag - 1))) {
145 + selmon->prevtag = selmon->curtag;
146 + for (i=0; !(newtags & 1 << i); i++);
147 + selmon->curtag = i + 1;
148 + }
149 + selmon->sel->tags = newtags;
150 + selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
151 + selmon->mfact = selmon->mfacts[selmon->curtag];
152 + selmon->nmaster = selmon->nmasters[selmon->curtag];
153 + if (selmon->showbar != selmon->showbars[selmon->curtag])
154 + togglebar(NULL);
155 focus(NULL);
156 arrange(selmon);
157 }
158 @@ -1982,11 +2015,30 @@
159
160 void
161 view(const Arg *arg) {
162 + unsigned int i;
163 +
164 if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
165 return;
166 selmon->seltags ^= 1; /* toggle sel tagset */
167 - if(arg->ui & TAGMASK)
168 + if(arg->ui & TAGMASK) {
169 selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
170 + selmon->prevtag = selmon->curtag;
171 + if(arg->ui == ~0)
172 + selmon->curtag = 0;
173 + else {
174 + for (i=0; !(arg->ui & 1 << i); i++);
175 + selmon->curtag = i + 1;
176 + }
177 + } else {
178 + selmon->prevtag= selmon->curtag ^ selmon->prevtag;
179 + selmon->curtag^= selmon->prevtag;
180 + selmon->prevtag= selmon->curtag ^ selmon->prevtag;
181 + }
182 + selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
183 + selmon->mfact = selmon->mfacts[selmon->curtag];
184 + selmon->nmaster = selmon->nmasters[selmon->curtag];
185 + if(selmon->showbar != selmon->showbars[selmon->curtag])
186 + togglebar(NULL);
187 focus(NULL);
188 arrange(selmon);
189 }