made status bar drawing more robust, implemented togglemax and togglemode, works quite well
4688ad18
5 file(s) · +59 −33
| 70 | 70 | if(!sel) |
|
| 71 | 71 | return; |
|
| 72 | 72 | ||
| 73 | + | if(sel->ismax) |
|
| 74 | + | togglemax(NULL); |
|
| 75 | + | ||
| 73 | 76 | if(!(c = getnext(sel->next, tsel))) |
|
| 74 | 77 | c = getnext(clients, tsel); |
|
| 75 | 78 | if(c) { |
|
| 86 | 89 | ||
| 87 | 90 | if(!sel) |
|
| 88 | 91 | return; |
|
| 92 | + | ||
| 93 | + | if(sel->ismax) |
|
| 94 | + | togglemax(NULL); |
|
| 89 | 95 | ||
| 90 | 96 | if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { |
|
| 91 | 97 | higher(c); |
|
| 234 | 240 | c->next = clients; |
|
| 235 | 241 | clients = c; |
|
| 236 | 242 | ||
| 237 | - | XGrabButton(dpy, Button1, ControlMask, c->win, False, ButtonPressMask, |
|
| 238 | - | GrabModeAsync, GrabModeSync, None, None); |
|
| 239 | 243 | XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonPressMask, |
|
| 240 | 244 | GrabModeAsync, GrabModeSync, None, None); |
|
| 241 | 245 | XGrabButton(dpy, Button2, MODKEY, c->win, False, ButtonPressMask, |
|
| 264 | 268 | } |
|
| 265 | 269 | ||
| 266 | 270 | void |
|
| 267 | - | maximize(Arg *arg) |
|
| 268 | - | { |
|
| 269 | - | if(!sel) |
|
| 270 | - | return; |
|
| 271 | - | sel->x = sx; |
|
| 272 | - | sel->y = sy + bh; |
|
| 273 | - | sel->w = sw - 2 * sel->border; |
|
| 274 | - | sel->h = sh - 2 * sel->border - bh; |
|
| 275 | - | higher(sel); |
|
| 276 | - | resize(sel, False, TopLeft); |
|
| 277 | - | } |
|
| 278 | - | ||
| 279 | - | void |
|
| 280 | 271 | pop(Client *c) |
|
| 281 | 272 | { |
|
| 282 | 273 | Client **l; |
|
| 402 | 393 | } |
|
| 403 | 394 | XFree(name.value); |
|
| 404 | 395 | resizetitle(c); |
|
| 396 | + | } |
|
| 397 | + | ||
| 398 | + | void |
|
| 399 | + | togglemax(Arg *arg) |
|
| 400 | + | { |
|
| 401 | + | int ox, oy, ow, oh; |
|
| 402 | + | XEvent ev; |
|
| 403 | + | ||
| 404 | + | if(!sel) |
|
| 405 | + | return; |
|
| 406 | + | ||
| 407 | + | if((sel->ismax = !sel->ismax)) { |
|
| 408 | + | ox = sel->x; |
|
| 409 | + | oy = sel->y; |
|
| 410 | + | ow = sel->w; |
|
| 411 | + | oh = sel->h; |
|
| 412 | + | sel->x = sx; |
|
| 413 | + | sel->y = sy + bh; |
|
| 414 | + | sel->w = sw - 2 * sel->border; |
|
| 415 | + | sel->h = sh - 2 * sel->border - bh; |
|
| 416 | + | ||
| 417 | + | higher(sel); |
|
| 418 | + | resize(sel, False, TopLeft); |
|
| 419 | + | ||
| 420 | + | sel->x = ox; |
|
| 421 | + | sel->y = oy; |
|
| 422 | + | sel->w = ow; |
|
| 423 | + | sel->h = oh; |
|
| 424 | + | } |
|
| 425 | + | else |
|
| 426 | + | resize(sel, False, TopLeft); |
|
| 427 | + | while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
|
| 405 | 428 | } |
|
| 406 | 429 | ||
| 407 | 430 | void |
|
| 107 | 107 | void |
|
| 108 | 108 | drawstatus() |
|
| 109 | 109 | { |
|
| 110 | - | int i; |
|
| 110 | + | int i, x; |
|
| 111 | 111 | Bool istile = arrange == dotile; |
|
| 112 | 112 | ||
| 113 | 113 | dc.x = dc.y = 0; |
|
| 123 | 123 | else |
|
| 124 | 124 | drawtext(tags[i], (i != tsel), True); |
|
| 125 | 125 | } |
|
| 126 | - | if(sel) { |
|
| 127 | - | dc.x += dc.w; |
|
| 128 | - | dc.w = textw(sel->name); |
|
| 129 | - | drawtext(sel->name, istile, True); |
|
| 130 | - | } |
|
| 126 | + | x = dc.x + dc.w; |
|
| 131 | 127 | dc.w = textw(stext); |
|
| 132 | 128 | dc.x = bx + bw - dc.w; |
|
| 133 | 129 | drawtext(stext, !istile, False); |
|
| 134 | - | ||
| 130 | + | if(sel && ((dc.w = dc.x - x) >= bh)) { |
|
| 131 | + | dc.x = x; |
|
| 132 | + | drawtext(sel->name, istile, True); |
|
| 133 | + | } |
|
| 135 | 134 | XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0); |
|
| 136 | 135 | XSync(dpy, False); |
|
| 137 | 136 | } |
|
| 74 | 74 | unsigned int border; |
|
| 75 | 75 | long flags; |
|
| 76 | 76 | Bool isfloat; |
|
| 77 | + | Bool ismax; |
|
| 77 | 78 | Client *next; |
|
| 78 | 79 | Client *revert; |
|
| 79 | 80 | Window win; |
|
| 104 | 105 | extern void killclient(Arg *arg); |
|
| 105 | 106 | extern void lower(Client *c); |
|
| 106 | 107 | extern void manage(Window w, XWindowAttributes *wa); |
|
| 107 | - | extern void maximize(Arg *arg); |
|
| 108 | 108 | extern void pop(Client *c); |
|
| 109 | 109 | extern void resize(Client *c, Bool inc, Corner sticky); |
|
| 110 | 110 | extern void setsize(Client *c); |
|
| 111 | 111 | extern void settitle(Client *c); |
|
| 112 | + | extern void togglemax(Arg *arg); |
|
| 112 | 113 | extern void unmanage(Client *c); |
|
| 113 | 114 | extern void zoom(Arg *arg); |
|
| 114 | 115 | ||
| 137 | 138 | extern void heretag(Arg *arg); |
|
| 138 | 139 | extern void replacetag(Arg *arg); |
|
| 139 | 140 | extern void settags(Client *c); |
|
| 141 | + | extern void togglemode(Arg *arg); |
|
| 140 | 142 | extern void view(Arg *arg); |
|
| 141 | 143 | ||
| 142 | 144 | /* util.c */ |
|
| 40 | 40 | { MODKEY, XK_3, view, { .i = Twork } }, |
|
| 41 | 41 | { MODKEY, XK_j, focusnext, { 0 } }, |
|
| 42 | 42 | { MODKEY, XK_k, focusprev, { 0 } }, |
|
| 43 | - | { MODKEY, XK_m, maximize, { 0 } }, |
|
| 44 | - | { MODKEY, XK_space, dotile, { 0 } }, |
|
| 43 | + | { MODKEY, XK_m, togglemax, { 0 } }, |
|
| 44 | + | { MODKEY, XK_space, togglemode, { 0 } }, |
|
| 45 | 45 | { MODKEY, XK_Return, zoom, { 0 } }, |
|
| 46 | 46 | { ControlMask|ShiftMask,XK_0, heretag, { .i = Tscratch } }, |
|
| 47 | 47 | { ControlMask|ShiftMask,XK_1, heretag, { .i = Tdev } }, |
|
| 55 | 55 | { MODKEY|ShiftMask, XK_g, spawn, { .argv = gimp } }, |
|
| 56 | 56 | { MODKEY|ShiftMask, XK_l, spawn, { .argv = xlock } }, |
|
| 57 | 57 | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, |
|
| 58 | - | { MODKEY|ShiftMask, XK_space, dofloat, { 0 } }, |
|
| 59 | 58 | { MODKEY|ShiftMask, XK_w, spawn, { .argv = browse } }, |
|
| 60 | 59 | { MODKEY|ShiftMask, XK_Return, spawn, { .argv = term } }, |
|
| 61 | 60 | }; |
|
| 170 | 169 | default: |
|
| 171 | 170 | break; |
|
| 172 | 171 | case Button1: |
|
| 173 | - | if(arrange == dotile && !c->isfloat) { |
|
| 174 | - | if((ev->state & ControlMask) && (ev->button == Button1)) |
|
| 175 | - | zoom(NULL); |
|
| 176 | - | } |
|
| 177 | - | else { |
|
| 172 | + | if(arrange == dofloat || c->isfloat) { |
|
| 178 | 173 | higher(c); |
|
| 179 | 174 | movemouse(c); |
|
| 180 | 175 | } |
|
| 51 | 51 | { |
|
| 52 | 52 | Client *c; |
|
| 53 | 53 | ||
| 54 | - | arrange = dofloat; |
|
| 55 | 54 | for(c = clients; c; c = c->next) { |
|
| 55 | + | c->ismax = False; |
|
| 56 | 56 | if(c->tags[tsel]) { |
|
| 57 | 57 | resize(c, True, TopLeft); |
|
| 58 | 58 | } |
|
| 75 | 75 | Client *c; |
|
| 76 | 76 | ||
| 77 | 77 | w = sw - mw; |
|
| 78 | - | arrange = dotile; |
|
| 79 | 78 | for(n = 0, c = clients; c; c = c->next) |
|
| 80 | 79 | if(c->tags[tsel] && !c->isfloat) |
|
| 81 | 80 | n++; |
|
| 86 | 85 | h = sh - bh; |
|
| 87 | 86 | ||
| 88 | 87 | for(i = 0, c = clients; c; c = c->next) { |
|
| 88 | + | c->ismax = False; |
|
| 89 | 89 | if(c->tags[tsel]) { |
|
| 90 | 90 | if(c->isfloat) { |
|
| 91 | 91 | higher(c); |
|
| 210 | 210 | } |
|
| 211 | 211 | if(!matched) |
|
| 212 | 212 | c->tags[tsel] = tags[tsel]; |
|
| 213 | + | } |
|
| 214 | + | ||
| 215 | + | void |
|
| 216 | + | togglemode(Arg *arg) |
|
| 217 | + | { |
|
| 218 | + | arrange = arrange == dofloat ? dotile : dofloat; |
|
| 219 | + | arrange(NULL); |
|
| 213 | 220 | } |
|
| 214 | 221 | ||
| 215 | 222 | void |
|