From 3a0f86f2fd73fc56e0ac2e0df502e994c0c5344b Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Fri, 19 Sep 2008 21:37:41 +0200 Subject: [PATCH] [ALL] New code stuff for layout/tag , struct... --- config.c | 30 ++++++++-------- event.c | 9 ++++- wmfs.c | 106 +++++++++++++++++++++++++------------------------------ wmfs.h | 22 ++++++------ 4 files changed, 83 insertions(+), 84 deletions(-) diff --git a/config.c b/config.c index 8b8069a..0b832f4 100644 --- a/config.c +++ b/config.c @@ -51,6 +51,13 @@ func_name_list_t func_list[] = {"quit", quit} }; +func_name_list_t layout_list[] = +{ + {"tile", tile}, + {"max", maxlayout}, + {"free", freelayout} +}; + key_name_list_t key_list[] = { {"Control", ControlMask}, @@ -74,13 +81,6 @@ name_to_uint_t mouse_button_list[] = {"Button5", Button5} }; -name_to_uint_t layout_list[] = -{ - {"tile", Tile}, - {"max", Max}, - {"free", Free} -}; - void* name_to_func(char *name) { @@ -117,7 +117,7 @@ char_to_button(char *name) return 0; } -unsigned int +void* layout_name_to_layout(char *name) { int i; @@ -125,7 +125,7 @@ layout_name_to_layout(char *name) if(name) for(i=0; layout_list[i].name; ++i) if(!strcmp(name, layout_list[i].name)) - return layout_list[i].button; + return layout_list[i].func; return 0; } @@ -289,13 +289,13 @@ init_conf(void) /* tag */ conf.ntag = cfg_size(cfg_tags, "tag"); - for(i=0; i < cfg_size(cfg_tags, "tag"); ++i) + for(i = 0; i < conf.ntag + 1; ++i) { - cfgtmp = cfg_getnsec(cfg_tags, "tag", i); - conf.tag[i].name = strdup(cfg_getstr(cfgtmp, "name")); - conf.tag[i].mwfact = cfg_getfloat(cfgtmp, "mwfact"); - conf.tag[i].nmaster = cfg_getint(cfgtmp, "nmaster"); - conf.tag[i].layout = layout_name_to_layout(cfg_getstr(cfgtmp, "layout")); + cfgtmp = cfg_getnsec(cfg_tags, "tag", ((i > 0) ? i - 1 : i)); + tags[i].name = strdup(cfg_getstr(cfgtmp, "name")); + tags[i].mwfact = cfg_getfloat(cfgtmp, "mwfact"); + tags[i].nmaster = cfg_getint(cfgtmp, "nmaster"); + tags[i].layout.func = layout_name_to_layout(cfg_getstr(cfgtmp, "layout")); } /* keybind ('tention ça rigole plus) */ diff --git a/event.c b/event.c index c04ea75..f32e477 100644 --- a/event.c +++ b/event.c @@ -99,7 +99,7 @@ buttonpress(XEvent ev) /* layout switch */ if(ev.xbutton.x >= taglen[conf.ntag] - 3 && ev.xbutton.x < taglen[conf.ntag] + - (strlen((getlayoutsym(layout[seltag])))*fonty+3) - 3) + (strlen((getlayoutsym(seltag)))*fonty+3) - 3) { if(ev.xbutton.button == Button1 || ev.xbutton.button == Button4) @@ -183,9 +183,16 @@ enternotify(XEvent ev) void expose(XEvent ev) { + Client *c; + if(ev.xexpose.count == 0 && (ev.xexpose.window == bar)) updatebar(); + for(c = clients; c; c = c->next) + if(conf.ttbarheight > 10 + && ev.xexpose.window == c->tbar) + updatetitle(c); + return; } diff --git a/wmfs.c b/wmfs.c index c62f461..5ed88e7 100644 --- a/wmfs.c +++ b/wmfs.c @@ -44,7 +44,7 @@ arrange(void) hide(c); focus(NULL); - layoutfunc[seltag](); + tags[seltag].layout.func(); updatebar(); } @@ -138,8 +138,7 @@ freelayout(void) { Client *c; - layout[seltag] = Free; - layoutfunc[seltag] = freelayout; + tags[seltag].layout.func = freelayout; for(c = clients; c; c = c->next) { @@ -179,14 +178,15 @@ getnext(Client *c) } char* -getlayoutsym(int l) +getlayoutsym(int tag) { - switch(layout[seltag]) - { - case Free: return conf.layouts.free; break; - case Tile: return conf.layouts.tile; break; - case Max: return conf.layouts.max; break; - } + if(tags[tag].layout.func == freelayout) + return conf.layouts.free; + else if(tags[tag].layout.func == tile) + return conf.layouts.tile; + else if(tags[tag].layout.func == maxlayout) + return conf.layouts.max; + return NULL; } @@ -296,18 +296,6 @@ init(void) mh = DisplayHeight (dpy, screen); seltag = 1; taglen[0] = 3; - for(i = 0; i < conf.ntag+1; ++i) - { - mwfact[i] = conf.tag[i-1].mwfact; - layout[i] = conf.tag[i-1].layout; - nmaster[i] = conf.tag[i-1].nmaster; - if(layout[i] == Tile) - layoutfunc[i] = tile; - else if(layout[i] == Max) - layoutfunc[i] = maxlayout; - else - layoutfunc[i] = freelayout; - } /* INIT FONT */ font = XLoadQueryFont(dpy, conf.font); @@ -458,24 +446,28 @@ killclient(char *cmd) void layoutswitch(char *cmd) { + void (*tmpfunc)(void); + if(cmd[0] == '+') { - switch(layout[seltag]) - { - case Free: layoutfunc[seltag] = tile; break; - case Tile: layoutfunc[seltag] = maxlayout; break; - case Max: layoutfunc[seltag] = freelayout; break; - } + if(tags[seltag].layout.func == freelayout) + tmpfunc = tile; + else if(tags[seltag].layout.func == tile) + tmpfunc = maxlayout; + else if(tags[seltag].layout.func == maxlayout) + tmpfunc = freelayout; } else if(cmd[0] == '-') { - switch(layout[seltag]) - { - case Free: layoutfunc[seltag] = maxlayout; break; - case Tile: layoutfunc[seltag] = freelayout; break; - case Max: layoutfunc[seltag] = tile; break; - } + if(tags[seltag].layout.func == freelayout) + tmpfunc = maxlayout; + else if(tags[seltag].layout.func == tile) + tmpfunc = freelayout; + else if(tags[seltag].layout.func == maxlayout) + tmpfunc = tile; } + + tags[seltag].layout.func = tmpfunc; arrange(); return; } @@ -567,15 +559,14 @@ maxlayout(void) { Client *c; - layout[seltag] = Max; - layoutfunc[seltag] = maxlayout; + tags[seltag].layout.func = maxlayout; for(c = nexttiled(clients); c; c = nexttiled(c->next)) { c->tile = False; c->ox = c->x; - c->oy = c->y; + c->oy = c->y; c->ow = c->w; c->oh = c->h; moveresize(c, 0, @@ -792,11 +783,11 @@ set_mwfact(char *cmd) if(!(sscanf(cmd, "%lf", &c))) return; - if(mwfact[seltag] + c > 0.95 - || mwfact[seltag] + c < 0.05 - || layout[seltag] != Tile) + if(tags[seltag].mwfact + c > 0.95 + || tags[seltag].mwfact + c < 0.05 + || tags[seltag].layout.func != tile) return; - mwfact[seltag] += c; + tags[seltag].mwfact += c; arrange(); return; } @@ -806,9 +797,9 @@ set_nmaster(char *cmd) { int n = atoi(cmd); - if(nmaster[seltag] + n == 0) + if(tags[seltag].nmaster + n == 0) return; - nmaster[seltag] += n; + tags[seltag].nmaster += n; arrange(); return; } @@ -929,11 +920,10 @@ tile(void) bord = conf.borderheight * 2; barto = conf.ttbarheight + barheight; - mwf = mwfact[seltag] * mw; - nm = nmaster[seltag]; + mwf = tags[seltag].mwfact * mw; + nm = tags[seltag].nmaster; - layout[seltag] = Tile; - layoutfunc[seltag] = tile; + tags[seltag].layout.func = tile; /* count all the "can-be-tiled" client */ for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++); @@ -1092,9 +1082,9 @@ updatebar(void) { /* Make the tags string */ ITOA(p, clientpertag(i+1)); - sprintf(buf[i], "%s<%s> ", conf.tag[i].name, (clientpertag(i+1)) ? p : ""); - taglen[i+1] = (taglen[i] + fonty * (strlen(conf.tag[i].name) + - strlen(buf[i]) - strlen(conf.tag[i].name)) + fonty) - 2; + sprintf(buf[i], "%s<%s> ", tags[i].name, (clientpertag(i+1)) ? p : ""); + taglen[i+1] = (taglen[i] + fonty * (strlen(tags[i].name) + + strlen(buf[i]) - strlen(tags[i].name)) + fonty) - 2; /* Rectangle for the tag background */ XSetForeground(dpy, gc, (i+1 == seltag) ? conf.colors.tagselbg : conf.colors.bar); XFillRectangle(dpy, dr, gc, taglen[i] - 3, 0, (strlen(buf[i])*fonty) -2, barheight); @@ -1107,17 +1097,17 @@ updatebar(void) /* Draw layout symbol */ XSetForeground(dpy, gc, conf.colors.layout_bg); XFillRectangle(dpy, dr, gc, taglen[conf.ntag] - 5, 0, - (strlen(getlayoutsym(layout[seltag]))*fonty) + 1, barheight); + (strlen(getlayoutsym(seltag))*fonty) + 1, barheight); XSetForeground(dpy, gc, conf.colors.layout_fg); XDrawString(dpy, dr, gc, taglen[conf.ntag] - 4, fonth, - getlayoutsym(layout[seltag]), - strlen(getlayoutsym(layout[seltag]))); + getlayoutsym(seltag), + strlen(getlayoutsym(seltag))); /* Draw status */ sprintf(bartext,"mwfact: %.2f nmaster: %i - %02i:%02i", - mwfact[seltag], - nmaster[seltag], + tags[seltag].mwfact, + tags[seltag].nmaster, tm->tm_hour, tm->tm_min); @@ -1128,6 +1118,7 @@ updatebar(void) XCopyArea(dpy, dr, bar, gc, 0, 0, mw, barheight, 0, 0); XSync(dpy, False); + /* Update Bar Buttons */ updatebutton(1); free(p); @@ -1148,7 +1139,7 @@ updatebutton(Bool c) at.background_pixmap = ParentRelative; at.event_mask = ButtonPressMask | ExposureMask; - j = taglen[conf.ntag] + ((strlen(getlayoutsym(layout[seltag]))*fonty) + 2); + j = taglen[conf.ntag] + ((strlen(getlayoutsym(seltag))*fonty) + 2); XSetFont(dpy, gc, font_b->fid); @@ -1186,6 +1177,7 @@ updatebutton(Bool c) } } XSetFont(dpy, gc, font->fid); + XSync(dpy, False); return; } @@ -1313,9 +1305,9 @@ main(int argc,char **argv) init(); scan(); updatebar(); + while(!exiting) { - // updatebar(); getevent(); updateall(); } diff --git a/wmfs.h b/wmfs.h index 03dcf8d..c323f4b 100644 --- a/wmfs.h +++ b/wmfs.h @@ -113,13 +113,20 @@ typedef struct unsigned int mouse[NBUTTON]; } BarButton; +/* Layout Structure */ +typedef struct +{ + char *symbol; + void (*func)(void); +} Layout; + /* Tag Structure */ typedef struct { char *name; float mwfact; int nmaster; - int layout; + Layout layout; } Tag; /* Configuration structure */ @@ -148,7 +155,6 @@ typedef struct char *tile; char *max; } layouts; - Tag tag[MAXTAG]; BarButton barbutton[64]; int ntag; int nkeybind; @@ -176,10 +182,9 @@ typedef struct /* Enum */ -enum { CurNormal, CurResize, CurMove, CurInput, CurLast }; +enum { CurNormal, CurResize, CurMove, CurLast }; enum { WMState, WMProtocols, WMName, WMDelete, WMLast }; enum { NetSupported, NetWMName, NetLast }; -enum { Free = 0, Tile, Max}; /* Functions Prototypes */ @@ -216,7 +221,7 @@ void freelayout(void); Client* getbutton(Window w); Client* getclient(Window w); Client* getnext(Client *c); -char* getlayoutsym(int l); +char* getlayoutsym(int tag); Client* gettbar(Window w); void grabbuttons(Client *c, Bool focused); void grabkeys(void); @@ -282,6 +287,7 @@ int fonth, fonty; /* Bar / Tags */ Window bar; +Tag tags[MAXTAG]; int barheight; char bartext[1024]; int seltag; @@ -292,12 +298,6 @@ Drawable dr; Client *clients; Client *sel; -/* Layout/Tile Important variables */ -float mwfact[MAXTAG]; -int nmaster[MAXTAG]; -int layout[MAXTAG]; -void (*layoutfunc[MAXTAG])(void); - /* Other */ unsigned int numlockmask; fd_set fd;