some more changes towards a better dwm
2f70a14e
2 file(s) · +49 −61
| 11 | 11 | #define SELBGCOLOR "#0066ff" |
|
| 12 | 12 | #define SELFGCOLOR "#ffffff" |
|
| 13 | 13 | ||
| 14 | - | /* tagging */ |
|
| 14 | + | /* old */ |
|
| 15 | 15 | const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "nil", "6", "7", "8", "www" }; |
|
| 16 | 16 | unsigned int vtags[LENGTH(tags)] = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 }; |
|
| 17 | 17 | Bool initags[LENGTH(tags)] = { [0] = True, [5] = True }; |
| 71 | 71 | unsigned int border, oldborder; |
|
| 72 | 72 | Bool isbanned, isfixed, isfloating, isurgent; |
|
| 73 | 73 | Bool *tags; |
|
| 74 | + | View *view; |
|
| 74 | 75 | Client *next; |
|
| 75 | 76 | Client *prev; |
|
| 76 | 77 | Client *snext; |
|
| 110 | 111 | Bool isfloating; |
|
| 111 | 112 | } Rule; |
|
| 112 | 113 | ||
| 113 | - | typedef struct { |
|
| 114 | - | const char name[MAXTAGLEN]; |
|
| 115 | - | unsigned int view; |
|
| 116 | - | } Tag; |
|
| 117 | - | ||
| 118 | 114 | struct View { |
|
| 115 | + | unsigned int id; |
|
| 119 | 116 | int x, y, w, h, wax, way, wah, waw; |
|
| 120 | 117 | double mwfact; |
|
| 121 | 118 | Layout *layout; |
|
| 139 | 136 | void detach(Client *c); |
|
| 140 | 137 | void detachstack(Client *c); |
|
| 141 | 138 | void drawbar(View *v); |
|
| 142 | - | void drawsquare(View *v, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); |
|
| 143 | - | void drawtext(View *v, const char *text, unsigned long col[ColLast], Bool invert); |
|
| 139 | + | void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); |
|
| 140 | + | void drawtext(const char *text, unsigned long col[ColLast], Bool invert); |
|
| 144 | 141 | void *emallocz(unsigned int size); |
|
| 145 | 142 | void enternotify(XEvent *e); |
|
| 146 | 143 | void eprint(const char *errstr, ...); |
|
| 153 | 150 | Client *getclient(Window w); |
|
| 154 | 151 | unsigned long getcolor(const char *colstr); |
|
| 155 | 152 | View *getviewbar(Window barwin); |
|
| 156 | - | View *getview(Client *c); |
|
| 157 | 153 | long getstate(Window w); |
|
| 158 | 154 | Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); |
|
| 159 | 155 | void grabbuttons(Client *c, Bool focused); |
|
| 211 | 207 | /* variables */ |
|
| 212 | 208 | char stext[256], buf[256]; |
|
| 213 | 209 | int nviews = 1; |
|
| 214 | - | View *selview; |
|
| 215 | 210 | int screen; |
|
| 216 | 211 | int (*xerrorxlib)(Display *, XErrorEvent *); |
|
| 217 | 212 | unsigned int bh, bpos; |
|
| 246 | 241 | Display *dpy; |
|
| 247 | 242 | DC dc = {0}; |
|
| 248 | 243 | View *views; |
|
| 244 | + | View *selview; |
|
| 249 | 245 | Window root; |
|
| 250 | 246 | ||
| 251 | 247 | /* configuration, allows nested code to access above variables */ |
|
| 260 | 256 | if(c->tags[i] && vtags[i] != vtags[tidx]) |
|
| 261 | 257 | return; /* conflict */ |
|
| 262 | 258 | c->tags[tidx] = True; |
|
| 259 | + | c->view = &views[vtags[tidx]]; |
|
| 263 | 260 | } |
|
| 264 | 261 | ||
| 265 | 262 | void |
|
| 288 | 285 | XFree(ch.res_class); |
|
| 289 | 286 | if(ch.res_name) |
|
| 290 | 287 | XFree(ch.res_name); |
|
| 291 | - | if(!matched) |
|
| 288 | + | if(!matched) { |
|
| 292 | 289 | memcpy(c->tags, seltags, sizeof initags); |
|
| 290 | + | c->view = selview; |
|
| 291 | + | } |
|
| 293 | 292 | } |
|
| 294 | 293 | ||
| 295 | 294 | ||
| 330 | 329 | ban(Client *c) { |
|
| 331 | 330 | if(c->isbanned) |
|
| 332 | 331 | return; |
|
| 333 | - | XMoveWindow(dpy, c->win, c->x + 3 * getview(c)->w, c->y); |
|
| 332 | + | XMoveWindow(dpy, c->win, c->x + 3 * c->view->w, c->y); |
|
| 334 | 333 | c->isbanned = True; |
|
| 335 | 334 | } |
|
| 336 | 335 | ||
| 340 | 339 | Client *c; |
|
| 341 | 340 | XButtonPressedEvent *ev = &e->xbutton; |
|
| 342 | 341 | ||
| 343 | - | View *v = selview; |
|
| 344 | - | ||
| 345 | - | if(ev->window == v->barwin) { |
|
| 342 | + | if(ev->window == selview->barwin) { |
|
| 346 | 343 | x = 0; |
|
| 347 | 344 | for(i = 0; i < LENGTH(tags); i++) { |
|
| 348 | 345 | x += textw(tags[i]); |
|
| 370 | 367 | if(CLEANMASK(ev->state) != MODKEY) |
|
| 371 | 368 | return; |
|
| 372 | 369 | if(ev->button == Button1) { |
|
| 373 | - | restack(getview(c)); |
|
| 370 | + | restack(c->view); |
|
| 374 | 371 | movemouse(c); |
|
| 375 | 372 | } |
|
| 376 | 373 | else if(ev->button == Button2) { |
|
| 377 | - | if((floating != v->layout->arrange) && c->isfloating) |
|
| 374 | + | if((floating != c->view->layout->arrange) && c->isfloating) |
|
| 378 | 375 | togglefloating(NULL); |
|
| 379 | 376 | else |
|
| 380 | 377 | zoom(NULL); |
|
| 381 | 378 | } |
|
| 382 | 379 | else if(ev->button == Button3 && !c->isfixed) { |
|
| 383 | - | restack(getview(c)); |
|
| 380 | + | restack(c->view); |
|
| 384 | 381 | resizemouse(c); |
|
| 385 | 382 | } |
|
| 386 | 383 | } |
|
| 457 | 454 | XFreePixmap(dpy, dc.drawable); |
|
| 458 | 455 | dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(root, screen), bh, DefaultDepth(dpy, screen)); |
|
| 459 | 456 | XResizeWindow(dpy, v->barwin, v->w, bh); |
|
| 460 | - | updatebarpos(v); |
|
| 457 | + | updatebarpos(selview); |
|
| 461 | 458 | arrange(); |
|
| 462 | 459 | } |
|
| 463 | 460 | } |
|
| 469 | 466 | XWindowChanges wc; |
|
| 470 | 467 | ||
| 471 | 468 | if((c = getclient(ev->window))) { |
|
| 472 | - | View *v = getview(c); |
|
| 469 | + | View *v = c->view; |
|
| 473 | 470 | if(ev->value_mask & CWBorderWidth) |
|
| 474 | 471 | c->border = ev->border_width; |
|
| 475 | 472 | if(c->isfixed || c->isfloating || (floating == v->layout->arrange)) { |
|
| 541 | 538 | Client *c; |
|
| 542 | 539 | ||
| 543 | 540 | dc.x = 0; |
|
| 544 | - | for(c = stack; c && (!isvisible(c) || getview(c) != v); c = c->snext); |
|
| 541 | + | for(c = stack; c && (!isvisible(c) || c->view != v); c = c->snext); |
|
| 545 | 542 | for(i = 0; i < LENGTH(tags); i++) { |
|
| 543 | + | if(&views[vtags[i]] != v) |
|
| 544 | + | continue; |
|
| 546 | 545 | dc.w = textw(tags[i]); |
|
| 547 | 546 | if(seltags[i]) { |
|
| 548 | - | drawtext(v, tags[i], dc.sel, isurgent(i)); |
|
| 549 | - | drawsquare(v, c && c->tags[i], isoccupied(i), isurgent(i), dc.sel); |
|
| 547 | + | drawtext(tags[i], dc.sel, isurgent(i)); |
|
| 548 | + | drawsquare(c && c->tags[i], isoccupied(i), isurgent(i), dc.sel); |
|
| 550 | 549 | } |
|
| 551 | 550 | else { |
|
| 552 | - | drawtext(v, tags[i], dc.norm, isurgent(i)); |
|
| 553 | - | drawsquare(v, c && c->tags[i], isoccupied(i), isurgent(i), dc.norm); |
|
| 551 | + | drawtext(tags[i], dc.norm, isurgent(i)); |
|
| 552 | + | drawsquare(c && c->tags[i], isoccupied(i), isurgent(i), dc.norm); |
|
| 554 | 553 | } |
|
| 555 | 554 | dc.x += dc.w; |
|
| 556 | 555 | } |
|
| 557 | 556 | dc.w = blw; |
|
| 558 | - | drawtext(v, v->layout->symbol, dc.norm, False); |
|
| 557 | + | drawtext(v->layout->symbol, dc.norm, False); |
|
| 559 | 558 | x = dc.x + dc.w; |
|
| 560 | 559 | if(v == selview) { |
|
| 561 | 560 | dc.w = textw(stext); |
|
| 564 | 563 | dc.x = x; |
|
| 565 | 564 | dc.w = v->w - x; |
|
| 566 | 565 | } |
|
| 567 | - | drawtext(v, stext, dc.norm, False); |
|
| 566 | + | drawtext(stext, dc.norm, False); |
|
| 568 | 567 | } |
|
| 569 | 568 | else |
|
| 570 | 569 | dc.x = v->w; |
|
| 571 | 570 | if((dc.w = dc.x - x) > bh) { |
|
| 572 | 571 | dc.x = x; |
|
| 573 | 572 | if(c) { |
|
| 574 | - | drawtext(v, c->name, dc.sel, False); |
|
| 575 | - | drawsquare(v, False, c->isfloating, False, dc.sel); |
|
| 573 | + | drawtext(c->name, dc.sel, False); |
|
| 574 | + | drawsquare(False, c->isfloating, False, dc.sel); |
|
| 576 | 575 | } |
|
| 577 | 576 | else |
|
| 578 | - | drawtext(v, NULL, dc.norm, False); |
|
| 577 | + | drawtext(NULL, dc.norm, False); |
|
| 579 | 578 | } |
|
| 580 | 579 | XCopyArea(dpy, dc.drawable, v->barwin, dc.gc, 0, 0, v->w, bh, 0, 0); |
|
| 581 | 580 | XSync(dpy, False); |
|
| 582 | 581 | } |
|
| 583 | 582 | ||
| 584 | 583 | void |
|
| 585 | - | drawsquare(View *v, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { |
|
| 584 | + | drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { |
|
| 586 | 585 | int x; |
|
| 587 | 586 | XGCValues gcv; |
|
| 588 | 587 | XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
| 603 | 602 | } |
|
| 604 | 603 | ||
| 605 | 604 | void |
|
| 606 | - | drawtext(View *v, const char *text, unsigned long col[ColLast], Bool invert) { |
|
| 605 | + | drawtext(const char *text, unsigned long col[ColLast], Bool invert) { |
|
| 607 | 606 | int x, y, w, h; |
|
| 608 | 607 | unsigned int len, olen; |
|
| 609 | 608 | XRectangle r = { dc.x, dc.y, dc.w, dc.h }; |
|
| 680 | 679 | View *v; |
|
| 681 | 680 | XExposeEvent *ev = &e->xexpose; |
|
| 682 | 681 | ||
| 683 | - | if(ev->count == 0 && (v = getviewbar(ev->window))) |
|
| 682 | + | if(ev->count == 0 && ((v = getviewbar(ev->window)))) |
|
| 684 | 683 | drawbar(v); |
|
| 685 | 684 | } |
|
| 686 | 685 | ||
| 698 | 697 | focus(Client *c) { |
|
| 699 | 698 | View *v = selview; |
|
| 700 | 699 | if(c) |
|
| 701 | - | selview = getview(c); |
|
| 700 | + | selview = c->view; |
|
| 702 | 701 | else |
|
| 703 | 702 | selview = viewat(); |
|
| 704 | 703 | if(selview != v) |
|
| 705 | 704 | drawbar(v); |
|
| 706 | 705 | if(!c || (c && !isvisible(c))) |
|
| 707 | - | for(c = stack; c && (!isvisible(c) || getview(c) != selview); c = c->snext); |
|
| 706 | + | for(c = stack; c && (!isvisible(c) || c->view != selview); c = c->snext); |
|
| 708 | 707 | if(sel && sel != c) { |
|
| 709 | 708 | grabbuttons(sel, False); |
|
| 710 | 709 | XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]); |
|
| 718 | 717 | if(c) { |
|
| 719 | 718 | XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); |
|
| 720 | 719 | XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
|
| 721 | - | selview = getview(c); |
|
| 720 | + | selview = c->view; |
|
| 722 | 721 | } |
|
| 723 | 722 | else |
|
| 724 | 723 | XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); |
|
| 744 | 743 | for(c = clients; c && !isvisible(c); c = c->next); |
|
| 745 | 744 | if(c) { |
|
| 746 | 745 | focus(c); |
|
| 747 | - | restack(getview(c)); |
|
| 746 | + | restack(c->view); |
|
| 748 | 747 | } |
|
| 749 | 748 | } |
|
| 750 | 749 | ||
| 761 | 760 | } |
|
| 762 | 761 | if(c) { |
|
| 763 | 762 | focus(c); |
|
| 764 | - | restack(getview(c)); |
|
| 763 | + | restack(c->view); |
|
| 765 | 764 | } |
|
| 766 | 765 | } |
|
| 767 | 766 | ||
| 793 | 792 | return NULL; |
|
| 794 | 793 | } |
|
| 795 | 794 | ||
| 796 | - | View * |
|
| 797 | - | getview(Client *c) { |
|
| 798 | - | unsigned int i; |
|
| 799 | - | ||
| 800 | - | for(i = 0; i < LENGTH(tags); i++) |
|
| 801 | - | if(c->tags[i]) |
|
| 802 | - | return &views[c->tags[i] - 1]; |
|
| 803 | - | return &views[0]; /* fallback */ |
|
| 804 | - | } |
|
| 805 | - | ||
| 806 | 795 | long |
|
| 807 | 796 | getstate(Window w) { |
|
| 808 | 797 | int format, status; |
|
| 1058 | 1047 | ||
| 1059 | 1048 | applyrules(c); |
|
| 1060 | 1049 | ||
| 1061 | - | v = getview(c); |
|
| 1050 | + | v = c->view; |
|
| 1062 | 1051 | ||
| 1063 | 1052 | c->x = wa->x + v->x; |
|
| 1064 | 1053 | c->y = wa->y + v->y; |
|
| 1137 | 1126 | ||
| 1138 | 1127 | ocx = nx = c->x; |
|
| 1139 | 1128 | ocy = ny = c->y; |
|
| 1140 | - | v = getview(c); |
|
| 1129 | + | v = c->view; |
|
| 1141 | 1130 | if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1142 | 1131 | None, cursor[CurMove], CurrentTime) != GrabSuccess) |
|
| 1143 | 1132 | return; |
|
| 1176 | 1165 | ||
| 1177 | 1166 | Client * |
|
| 1178 | 1167 | nexttiled(Client *c, View *v) { |
|
| 1179 | - | for(; c && (c->isfloating || getview(c) != v || !isvisible(c)); c = c->next); |
|
| 1168 | + | for(; c && (c->isfloating || c->view != v || !isvisible(c)); c = c->next); |
|
| 1180 | 1169 | return c; |
|
| 1181 | 1170 | } |
|
| 1182 | 1171 | ||
| 1201 | 1190 | break; |
|
| 1202 | 1191 | case XA_WM_HINTS: |
|
| 1203 | 1192 | updatewmhints(c); |
|
| 1204 | - | drawbar(getview(c)); |
|
| 1193 | + | drawbar(c->view); |
|
| 1205 | 1194 | break; |
|
| 1206 | 1195 | } |
|
| 1207 | 1196 | if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { |
|
| 1234 | 1223 | View *v; |
|
| 1235 | 1224 | XWindowChanges wc; |
|
| 1236 | 1225 | ||
| 1237 | - | v = getview(c); |
|
| 1226 | + | v = c->view; |
|
| 1238 | 1227 | if(sizehints) { |
|
| 1239 | 1228 | /* set minimum possible */ |
|
| 1240 | 1229 | if (w < 1) |
|
| 1305 | 1294 | ||
| 1306 | 1295 | ocx = c->x; |
|
| 1307 | 1296 | ocy = c->y; |
|
| 1308 | - | v = getview(c); |
|
| 1297 | + | v = c->view; |
|
| 1309 | 1298 | if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, |
|
| 1310 | 1299 | None, cursor[CurResize], CurrentTime) != GrabSuccess) |
|
| 1311 | 1300 | return; |
|
| 1484 | 1473 | if(sel) |
|
| 1485 | 1474 | arrange(); |
|
| 1486 | 1475 | else |
|
| 1487 | - | drawbar(v); |
|
| 1476 | + | drawbar(selview); |
|
| 1488 | 1477 | } |
|
| 1489 | 1478 | ||
| 1490 | 1479 | void |
|
| 1491 | 1480 | setmwfact(const char *arg) { |
|
| 1492 | 1481 | double delta; |
|
| 1493 | - | ||
| 1494 | 1482 | View *v = selview; |
|
| 1495 | 1483 | ||
| 1496 | 1484 | if(!domwfact) |
|
| 1537 | 1525 | isxinerama = True; |
|
| 1538 | 1526 | nviews = 2; /* aim Xinerama */ |
|
| 1539 | 1527 | #endif |
|
| 1540 | - | selview = views = emallocz(nviews * sizeof(View)); |
|
| 1528 | + | views = emallocz(nviews * sizeof(View)); |
|
| 1541 | 1529 | ||
| 1542 | 1530 | screen = DefaultScreen(dpy); |
|
| 1543 | 1531 | root = RootWindow(dpy, screen); |
|
| 1627 | 1615 | if(info) |
|
| 1628 | 1616 | XFree(info); |
|
| 1629 | 1617 | ||
| 1618 | + | selview = viewat(); |
|
| 1619 | + | ||
| 1630 | 1620 | /* grab keys */ |
|
| 1631 | 1621 | grabkeys(); |
|
| 1632 | - | ||
| 1633 | - | selview = &views[0]; |
|
| 1634 | 1622 | } |
|
| 1635 | 1623 | ||
| 1636 | 1624 | void |
|
| 1990 | 1978 | ||
| 1991 | 1979 | if(!sel || !dozoom || sel->isfloating) |
|
| 1992 | 1980 | return; |
|
| 1993 | - | if(c == nexttiled(clients, getview(c))) |
|
| 1994 | - | if(!(c = nexttiled(c->next, getview(c)))) |
|
| 1981 | + | if(c == nexttiled(clients, c->view)) |
|
| 1982 | + | if(!(c = nexttiled(c->next, c->view))) |
|
| 1995 | 1983 | return; |
|
| 1996 | 1984 | detach(c); |
|
| 1997 | 1985 | attach(c); |
|