X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=layout.c;h=96e125ade5dfb0ea5b4d156ca5c0944a0a4c63aa;hb=78d1a22d4e847d0e596af59d7707da1bbfe9583a;hp=c4670801b35db635a19cee0d00e78dfe2bcfa965;hpb=10bc0ce912eb99fec49d954c80d92e04429ed0ee;p=dwm.git diff --git a/layout.c b/layout.c index c467080..96e125a 100644 --- a/layout.c +++ b/layout.c @@ -1,6 +1,9 @@ /* See LICENSE file for copyright and license details. */ #include "dwm.h" #include +#include +#include +#include /* static */ @@ -10,7 +13,8 @@ typedef struct { } Layout; unsigned int blw = 0; -static Layout *lt = NULL; +static char prop[128]; +static unsigned int ltidx = 0; /* default */ static void floating(void) { /* default floating layout */ @@ -36,7 +40,7 @@ arrange(void) { unban(c); else ban(c); - lt->arrange(); + layouts[ltidx].arrange(); focus(NULL); restack(); } @@ -76,33 +80,55 @@ focusprev(const char *arg) { const char * getsymbol(void) { - return lt->symbol; + return layouts[ltidx].symbol; } Bool isfloating(void) { - return lt->arrange == floating; + return layouts[ltidx].arrange == floating; } Bool isarrange(void (*func)()) { - return func == lt->arrange; + return func == layouts[ltidx].arrange; } void initlayouts(void) { unsigned int i, w; - lt = &layout[0]; - nlayouts = sizeof layout / sizeof layout[0]; + /* TODO deserialize ltidx if present */ + nlayouts = sizeof layouts / sizeof layouts[0]; for(blw = i = 0; i < nlayouts; i++) { - w = textw(layout[i].symbol); + w = textw(layouts[i].symbol); if(w > blw) blw = w; } } +void +loaddwmprops(void) { + unsigned int i; + XTextProperty name; + + /* check if window has set a property */ + name.nitems = 0; + XGetTextProperty(dpy, root, &name, dwmprops); + if(name.nitems && name.encoding == XA_STRING) { + strncpy(prop, (char *)name.value, sizeof prop - 1); + prop[sizeof prop - 1] = '\0'; + XFree(name.value); + for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++) + seltags[i] = prop[i] == '1'; + if(i < sizeof prop - 1 && prop[i] != '\0') { + i = prop[i]; + if(i < nlayouts) + ltidx = i; + } + } +} + Client * nexttiled(Client *c) { for(; c && (c->isfloating || !isvisible(c)); c = c->next); @@ -118,9 +144,9 @@ restack(void) { drawstatus(); if(!sel) return; - if(sel->isfloating || lt->arrange == floating) + if(sel->isfloating || isfloating()) XRaiseWindow(dpy, sel->win); - if(lt->arrange != floating) { + if(!isfloating()) { wc.stack_mode = Below; wc.sibling = barwin; if(!sel->isfloating) { @@ -139,24 +165,37 @@ restack(void) { } void +savedwmprops(void) { + unsigned int i; + + for(i = 0; i < ntags && i < sizeof prop - 1; i++) + prop[i] = seltags[i] ? '1' : '0'; + if(i < sizeof prop - 1) + prop[i++] = (char)ltidx; + prop[i] = '\0'; + XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, + PropModeReplace, (unsigned char *)prop, i); +} + +void setlayout(const char *arg) { int i; if(!arg) { - lt++; - if(lt == layout + nlayouts) - lt = layout; + if(++ltidx == nlayouts) + ltidx = 0;; } else { i = atoi(arg); if(i < 0 || i >= nlayouts) return; - lt = &layout[i]; + ltidx = i; } if(sel) arrange(); else drawstatus(); + savedwmprops(); } void @@ -173,7 +212,7 @@ void togglemax(const char *arg) { XEvent ev; - if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed) + if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed) return; if((sel->ismax = !sel->ismax)) { sel->rx = sel->x;