--- ../src/dwm-5.0.1/dwm.c 2008-06-19 10:11:38.000000000 +0200 +++ dwm.c 2008-07-02 13:02:36.000000000 +0200 @@ -54,6 +54,11 @@ #define TAGMASK ((int)((1LL << LENGTH(tags)) - 1)) #define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) +/* wmii patch */ +#define WMIITAG sizeof(int) * 8 +#define WMIICOL 10 +#define WMIIROW 10 + /* enums */ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ @@ -93,6 +98,13 @@ Client *next; Client *snext; Window win; + + /* wmii patch */ + int wcol[WMIITAG]; + int wrow[WMIITAG]; + int ww[WMIITAG]; + int wh[WMIITAG]; + }; typedef struct { @@ -203,6 +215,20 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); +/* wmii patch */ +static void wappend(int,Client*,int); +static void wnohole(int); +static void wremove(int,Client*); +static int wgettag(void); +static void wmovenext(const Arg*); +static void wmoveprev(const Arg*); +static void wmoveup(const Arg*); +static void wmovedown(const Arg*); +static void warrange(int); +static void wadd(int,Client*); +static void wresize(int,Client*,int,int); +static void wlayout(void); + /* variables */ static char stext[256]; static int screen, sx, sy, sw, sh; @@ -237,6 +263,11 @@ static DC dc = {0}; static Layout *lt = NULL; static Window root, barwin; + +/* wmii patch */ +Client* wtable[WMIITAG][WMIICOL][WMIIROW] = {{{ 0 }}}; +static int wresizing = 0; + /* configuration, allows nested code to access above variables */ #include "config.h" @@ -896,6 +927,16 @@ eprint("fatal: could not calloc() %u bytes\n", sizeof(Client)); c->win = w; + /* wmii patch */ + int i = 0; + for( ; i < WMIITAG ; i++ ) + { + c->wcol[i] = -1; + c->wrow[i] = -1; + c->ww[i] = -1; + c->wh[i] = -1; + } + /* geometry */ c->x = wa->x; c->y = wa->y; @@ -1141,6 +1182,10 @@ restack(); ocx = c->x; ocy = c->y; + + /* wmii patch */ + if ( !strcmp(lt->symbol,"WMII") && !c->isfloating ) { wresizing = 1; } + if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, None, cursor[CurResize], CurrentTime) != GrabSuccess) return; @@ -1153,6 +1198,10 @@ c->w + c->bw - 1, c->h + c->bw - 1); XUngrabPointer(dpy, CurrentTime); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + + /* wmii patch */ + if ( wresizing ) { c->isfloating = False; wresizing = 0; wresize(wgettag(),c,c->w,c->h); } + return; case ConfigureRequest: case Expose: @@ -1518,6 +1567,17 @@ unmanage(Client *c) { XWindowChanges wc; + /* wmii patch */ + int i = 0; + for( ; i < WMIITAG ; i++ ) + { + if ( (c->ww[i] != -1) || (c->wh[i] != -1) ) + { + wremove(i,c); + wnohole(i); + } + } + wc.border_width = c->oldbw; /* The server grab construct avoids race conditions. */ XGrabServer(dpy); @@ -1724,3 +1784,206 @@ XCloseDisplay(dpy); return 0; } + +/* wmii patch */ +void wappend(int wtag,Client* client,int col) +{ + int i = 0; + for( ; (i < WMIIROW) && wtable[wtag][col][i] ; i++ ); + if ( i == WMIIROW) { return; } + wtable[wtag][col][i] = client; + client->wcol[wtag] = col; + client->wrow[wtag] = i; + client->wh[wtag] = -1; + client->ww[wtag] = -1; +} + +void wnohole(int wtag) +{ + int i = 0,ni = 0; + for( ; i < WMIICOL ; i++ ) + { + int j = 0,nj = 0; + for( ; j < WMIIROW ; j++ ) + { + if ( wtable[wtag][i][j] ) + { + wtable[wtag][ni][nj] = wtable[wtag][i][j]; + wtable[wtag][ni][nj]->wcol[wtag] = ni; + wtable[wtag][ni][nj]->wrow[wtag] = nj; + if ( (i != ni) || (j != nj) ) { wtable[wtag][i][j] = 0; } + nj++; + } + } + if ( nj > 0 ) { ni++; } + } +} + +void wremove(int wtag,Client* client) +{ + if ( (client->wcol[wtag] == -1) && (client->wrow[wtag] == -1) ) { return; } + wtable[wtag][client->wcol[wtag]][client->wrow[wtag]] = 0; + client->wcol[wtag] = -1; + client->wrow[wtag] = -1; + client->wh[wtag] = -1; + client->ww[wtag] = -1; +} + +int wgettag(void) +{ + int i = 0; + for( ; (i <= sizeof(int)) && !(tagset[seltags] & (1 << i)) ; i++ ); + return i; +} + +void wmovenext(const Arg* arg) +{ + int wtag = wgettag(); + if ( !sel || sel->isfloating || (sel->wcol[wtag] == WMIICOL - 1) ) { return; } + int col = sel->wcol[wtag]; + wremove(wtag,sel); + wappend(wtag,sel,col + 1); + wnohole(wtag); + warrange(wtag); +} + +void wmoveprev(const Arg* arg) +{ + int wtag = wgettag(); + if ( !sel || sel->isfloating || (sel->wcol[wtag] == 0) ) { return; } + int col = sel->wcol[wtag]; + wremove(wtag,sel); + wappend(wtag,sel,col - 1); + wnohole(wtag); + warrange(wtag); +} + +void wmoveup(const Arg* arg) +{ + int wtag = wgettag(); + if ( !sel || sel->isfloating || (sel->wrow[wtag] == 0) ) { return; } + int row = sel->wrow[wtag]; + Client* p = wtable[wtag][sel->wcol[wtag]][row - 1]; + wtable[wtag][sel->wcol[wtag]][row] = p; + wtable[wtag][sel->wcol[wtag]][row - 1] = sel; + p->wrow[wtag]++; + sel->wrow[wtag]--; + warrange(wtag); +} + +void wmovedown(const Arg* arg) +{ + int wtag = wgettag(); + if ( !sel || sel->isfloating || (sel->wrow[wtag] == WMIIROW - 1) || + (wtable[wtag][sel->wcol[wtag]][sel->wrow[wtag] + 1] == 0) ) { return; } + int row = sel->wrow[wtag]; + Client* n = wtable[wtag][sel->wcol[wtag]][row + 1]; + wtable[wtag][sel->wcol[wtag]][row] = n; + wtable[wtag][sel->wcol[wtag]][row + 1] = sel; + n->wrow[wtag]--; + sel->wrow[wtag]++; + warrange(wtag); +} + +void warrange(int wtag) +{ + if ( strcmp(lt->symbol,"WMII") ) { return; } + int total = 0,old = 0,max = 0; + int i = 0; + for( ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ ) + { + total++; + int w = wtable[wtag][i][0]->ww[wtag]; + if ( w != -1 ) { old++; max += w; } + } + for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ ) + { + int w = wtable[wtag][i][0]->ww[wtag]; + if ( w != -1 ) { w = w * old * ww / total / max; } + else { w = ww / total; } + int j = 0; + for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) { wtable[wtag][i][j]->ww[wtag] = w; } + } + for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ ) + { + total = 0; + old = 0; + max = 0; + int j = 0; + for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) + { + total++; + int h = wtable[wtag][i][j]->wh[wtag]; + if ( h != -1 ) { old++; max += h; } + } + for( j = 0 ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) + { + int h = wtable[wtag][i][j]->wh[wtag]; + if ( h != -1 ) { h = h * old * wh / total / max; } + else { h = wh / total; } + wtable[wtag][i][j]->wh[wtag] = h; + } + } + int x = wx; + for( i = 0 ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ ) + { + int j = 0,y = wy; + for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) + { + Client* t = wtable[wtag][i][j]; + resize(t,x + t->bw,y + t->bw,t->ww[wtag] - 2 * t->bw,t->wh[wtag] - 2 * t->bw,resizehints); + y += wtable[wtag][i][j]->wh[wtag]; + } + x += wtable[wtag][i][0]->ww[wtag]; + } +} + +void wadd(int wtag,Client* client) +{ + int i = 0; + for( ; (i < WMIICOL - 1) && wtable[wtag][i + 1][0] ; i++ ); + wappend(wtag,client,i + ( i == 0 && wtable[wtag][0][0] ? 1 : 0 )); +} + +void wresize(int wtag,Client* client,int w,int h) +{ + int i = 0,old = 0,oldw = client->ww[wtag],oldh = client->wh[wtag]; + client->ww[wtag] = w; client->wh[wtag] = h; + for( ; i < client->wcol[wtag] ; i++) { old += wtable[wtag][i][0]->ww[wtag]; } + i = client->wcol[wtag] + 1; + for( ; (i < WMIICOL) && wtable[wtag][i][0] ; i++ ) + { + wtable[wtag][i][0]->ww[wtag] = wtable[wtag][i][0]->ww[wtag] * (sw - old - w) / (sw - old - oldw); + } + int j = 0; + i = client->wcol[wtag]; + old = 0; + for( ; j < client->wrow[wtag] ; j++ ) { old += wtable[wtag][i][j]->wh[wtag]; } + j = client->wrow[wtag] + 1; + for( ; (j < WMIIROW) && wtable[wtag][i][j] ; j++ ) + { + wtable[wtag][i][j]->wh[wtag] = wtable[wtag][i][j]->wh[wtag] * (sh - bh - old - h) / (sh - bh - old - oldh); + } + warrange(wtag); +} + +void wlayout(void) +{ + if ( wresizing ) { return; } + int wtag = wgettag(); + Client* c = clients; + for( ; c ; c = c->next ) + { + if ( c->tags & (1 << wtag) ) + { + if ( (c->wcol[wtag] == -1) && !c->isfloating ) { wadd(wtag,c); } + if ( (c->wcol[wtag] != -1) && c->isfloating ) { wremove(wtag,c); wnohole(wtag); } + } + else + { + if ( c->wcol[wtag] != -1 ) { wremove(wtag,c); wnohole(wtag); } + } + } + warrange(wtag); +} +