[hackers] [wmii] Bugfixes, cleanup, remove SunCC compatibility patch. Add adding/removing tags by writing +tag/-tag

From: Kris Maglione <jg_AT_suckless.org>
Date: Mon Feb 12 04:21:36 2007

changeset: 1849:51a8198adb08
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Sun Feb 11 22:17:20 2007 -0500
summary: Bugfixes, cleanup, remove SunCC compatibility patch. Add adding/removing tags by writing +tag/-tag

diff -r bd06709e5602 -r 51a8198adb08 Makefile
--- a/Makefile Sun Feb 11 20:36:00 2007 -0500
+++ b/Makefile Sun Feb 11 22:17:20 2007 -0500
@@ -4,7 +4,7 @@ include config.mk
 include config.mk
 
 SRC = area.c bar.c client.c column.c draw.c event.c \
- frame.c fs.c geom.c key.c main.c mouse.c rule.c view.c
+ frame.c fs.c geom.c key.c main.c mouse.c rule.c util.c view.c
 OBJ = ${SRC:.c=.o}
 
 all: options wmiiwm
diff -r bd06709e5602 -r 51a8198adb08 area.c
--- a/area.c Sun Feb 11 20:36:00 2007 -0500
+++ b/area.c Sun Feb 11 22:17:20 2007 -0500
@@ -9,13 +9,6 @@
 
 static void place_client(Area *a, Client *c);
 
-static int
-max(int a, int b) {
- if(a > b)
- return a;
- return b;
-}
-
 Client *
 sel_client_of_area(Area *a) {
         if(a && a->sel)
@@ -52,8 +45,6 @@ create_area(View *v, Area *pos, unsigned
                 w = min_width;
         if(col_num && (col_num * min_width + w) > screen->rect.width)
                 return nil;
- if(pos)
- scale_view(v, screen->rect.width - w);
 
         a = ixp_emallocz(sizeof(Area));
         a->view = v;
@@ -67,7 +58,13 @@ create_area(View *v, Area *pos, unsigned
         a->next = *p;
         *p = a;
 
- if(!v->sel || (v->sel->floating && v->area->next == a && a->next == nil))
+ if(pos)
+ scale_view(v, screen->rect.width);
+
+ if(a == v->area)
+ a->floating = True;
+ if((!v->sel) ||
+ (v->sel->floating && v->area->next == a && a->next == nil))
                 focus_area(a);
 
         if(i)
diff -r bd06709e5602 -r 51a8198adb08 client.c
--- a/client.c Sun Feb 11 20:36:00 2007 -0500
+++ b/client.c Sun Feb 11 22:17:20 2007 -0500
@@ -17,18 +17,21 @@ static char Ebadcmd[] = "bad command",
 
 Client *
 create_client(Window w, XWindowAttributes *wa) {
- Client **t, *c = (Client *) ixp_emallocz(sizeof(Client));
+ Client **t, *c;
         XSetWindowAttributes fwa;
         long msize;
 
+ c = ixp_emallocz(sizeof(Client));
         c->win = w;
         c->rect.x = wa->x;
         c->rect.y = wa->y;
         c->border = wa->border_width;
         c->rect.width = wa->width;
         c->rect.height = wa->height;
- XSetWindowBorderWidth(blz.dpy, c->win, 0);
         c->proto = win_proto(c->win);
+ update_client_name(c);
+
+ c->fixedsize = False;
         XGetTransientForHint(blz.dpy, c->win, &c->trans);
         if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags)
                 c->size.flags = PSize;
@@ -36,27 +39,38 @@ create_client(Window w, XWindowAttribute
                 && c->size.min_width == c->size.max_width
                 && c->size.min_height == c->size.max_height)
                         c->fixedsize = True;
- else
- c->fixedsize = False;
+
+ XSetWindowBorderWidth(blz.dpy, c->win, 0);
         XAddToSaveSet(blz.dpy, c->win);
- update_client_name(c);
         fwa.override_redirect = 1;
         fwa.background_pixmap = ParentRelative;
- fwa.event_mask =
- SubstructureRedirectMask | SubstructureNotifyMask | ExposureMask
- | PointerMotionMask | KeyPressMask | ButtonPressMask | ButtonReleaseMask;
- fwa.backing_store = Always;
- c->framewin = XCreateWindow(blz.dpy, blz.root, c->rect.x, c->rect.y,
- c->rect.width + 2 * def.border,
- c->rect.height + def.border + labelh(&def.font), 0,
- DefaultDepth(blz.dpy, blz.screen), CopyFromParent,
- DefaultVisual(blz.dpy, blz.screen),
- CWOverrideRedirect | CWEventMask, &fwa);
+ fwa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
+ | ExposureMask | PointerMotionMask | KeyPressMask
+ | ButtonPressMask | ButtonReleaseMask;
+ c->framewin = XCreateWindow(
+ /* display */ blz.dpy,
+ /* parent */ blz.root,
+ /* x */ c->rect.x,
+ /* y */ c->rect.y,
+ /* width */ c->rect.width + 2 * def.border,
+ /* height */ c->rect.height + def.border + labelh(&def.font),
+ /* border */ 0,
+ /* depth */ DefaultDepth(blz.dpy, blz.screen),
+ /* class */ CopyFromParent,
+ /* visual */ DefaultVisual(blz.dpy, blz.screen),
+ /* valuemask */ CWOverrideRedirect | CWEventMask,
+ /* attributes */&fwa
+ );
         c->gc = XCreateGC(blz.dpy, c->framewin, 0, 0);
         XSync(blz.dpy, False);
- for(t=&client; *t; t=&(*t)->next);
- c->next = *t; /* *t == nil */
- *t = c;
+
+ for(t=&client ;; t=&(*t)->next)
+ if(!*t) {
+ c->next = *t;
+ *t = c;
+ break;
+ }
+
         write_event("CreateClient 0x%x\n", c->win);
         return c;
 }
@@ -68,13 +82,14 @@ manage_client(Client *c) {
 
         tags.nitems = 0;
         XGetTextProperty(blz.dpy, c->win, &tags, tags_atom);
- if(c->trans && (trans = client_of_win(c->trans)))
+ if((c->trans) && (trans = client_of_win(c->trans)))
                 strncpy(c->tags, trans->tags, sizeof(c->tags));
         else if(tags.nitems)
                 strncpy(c->tags, (char *)tags.value, sizeof(c->tags));
         XFree(tags.value);
 
         reparent_client(c, c->framewin, c->rect.x, c->rect.y);
+
         if(!strlen(c->tags))
                 apply_rules(c);
         else
@@ -83,6 +98,7 @@ manage_client(Client *c) {
         if(!starting)
                 update_views();
         XSync(blz.dpy, False);
+
         if(c->sel->area->view == screen->sel)
                 focus(c, True);
         flush_masked_events(EnterWindowMask);
@@ -90,21 +106,27 @@ manage_client(Client *c) {
 
 Client *
 sel_client() {
- return screen->sel && screen->sel->sel->sel ? screen->sel->sel->sel->client : nil;
+ if(screen->sel && screen->sel->sel->sel)
+ return screen->sel->sel->sel->client;
+ return nil;
 }
 
 Client *
 client_of_win(Window w) {
         Client *c;
- for(c=client; c && c->win != w; c=c->next);
+ for(c=client; c; c=c->next)
+ if(c->win == w) break;
         return c;
 }
 
 Frame *
 frame_of_win(Window w) {
         Client *c;
- for(c=client; c && c->framewin != w; c=c->next);
- return c ? c->frame : nil;
+ for(c=client; c; c=c->next)
+ if(c->framewin == w) break;
+ if(c)
+ return c->frame;
+ return nil;
 }
 
 static void
@@ -133,9 +155,10 @@ update_client_name(Client *c) {
         }
         XFree(name.value);
         if(XGetClassHint(blz.dpy, c->win, &ch)) {
- snprintf(c->props, sizeof(c->props), "%s:%s:%s",
- ch.res_class ? ch.res_class : "",
- ch.res_name ? ch.res_name : "",
+ snprintf(c->props, sizeof(c->props),
+ "%s:%s:%s",
+ str_nil(ch.res_class),
+ str_nil(ch.res_name),
                                 c->name);
                 if(ch.res_class)
                         XFree(ch.res_class);
@@ -143,6 +166,7 @@ update_client_name(Client *c) {
                         XFree(ch.res_name);
         }
 }
+
 void
 update_client_grab(Client *c) {
         Frame *f;
@@ -173,8 +197,16 @@ set_client_state(Client * c, int state)
 set_client_state(Client * c, int state)
 {
         long data[] = { state, None };
- XChangeProperty(blz.dpy, c->win, wm_atom[WMState], wm_atom[WMState], 32,
- PropModeReplace, (unsigned char *) data, 2);
+ XChangeProperty(
+ /* display */ blz.dpy,
+ /* parent */ c->win,
+ /* property */ wm_atom[WMState],
+ /* type */ wm_atom[WMState],
+ /* format */ 32,
+ /* mode */ PropModeReplace,
+ /* data */ (unsigned char *) data,
+ /* npositions */2
+ );
 }
 
 void
@@ -275,10 +307,9 @@ set_urgent(Client *c, Bool urgent, Bool
         XWMHints *wmh;
         char *cwrite;
 
+ cwrite = "Manager";
         if(write)
                 cwrite = "Client";
- else
- cwrite = "Manager";
 
         if(urgent != c->urgent) {
                 if(urgent)
@@ -294,14 +325,14 @@ set_urgent(Client *c, Bool urgent, Bool
 
         if(write) {
                 wmh = XGetWMHints(blz.dpy, c->win);
- if(!wmh)
- return;
- if(urgent)
- wmh->flags |= XUrgencyHint;
- else
- wmh->flags &= ~XUrgencyHint;
- XSetWMHints(blz.dpy, c->win, wmh);
- XFree(wmh);
+ if(wmh) {
+ if(urgent)
+ wmh->flags |= XUrgencyHint;
+ else
+ wmh->flags &= ~XUrgencyHint;
+ XSetWMHints(blz.dpy, c->win, wmh);
+ XFree(wmh);
+ }
         }
 }
 
@@ -322,12 +353,11 @@ prop_client(Client *c, XPropertyEvent *e
                 if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags) {
                         c->size.flags = PSize;
                 }
+ c->fixedsize = False;
                 if(c->size.flags & PMinSize && c->size.flags & PMaxSize
                         && c->size.min_width == c->size.max_width
                         && c->size.min_height == c->size.max_height)
                                 c->fixedsize = True;
- else
- c->fixedsize = False;
                 break;
         case XA_WM_HINTS:
                 wmh = XGetWMHints(blz.dpy, c->win);
@@ -417,21 +447,26 @@ destroy_client(Client *c) {
                 c->rect.x = c->sel->rect.x;
                 c->rect.y = c->sel->rect.y;
         }
- for(tc=&client; *tc && *tc != c; tc=&(*tc)->next)
- if(*tc == c) break;
- assert(*tc == c);
- *tc = c->next;
+ for(tc=&client; *tc; tc=&(*tc)->next)
+ if(*tc == c) {
+ *tc = c->next;
+ break;
+ }
+
         update_client_views(c, &dummy);
+ update_views();
+
         unmap_client(c, WithdrawnState);
         reparent_client(c, blz.root, c->rect.x, c->rect.y);
         XFreeGC(blz.dpy, c->gc);
         XDestroyWindow(blz.dpy, c->framewin);
- update_views();
- free(c);
         XSync(blz.dpy, False);
+
         XSetErrorHandler(wmii_error_handler);
         XUngrabServer(blz.dpy);
         flush_masked_events(EnterWindowMask);
+
+ free(c);
         write_event("DestroyClient 0x%x\n", c->win);
 }
 
@@ -518,8 +553,9 @@ resize_client(Client *c, XRectangle *r)
         }
 
         if(f->area->view == screen->sel)
- XMoveResizeWindow(blz.dpy, c->framewin, f->rect.x,
- f->rect.y, f->rect.width, f->rect.height);
+ XMoveResizeWindow(blz.dpy, c->framewin,
+ f->rect.x, f->rect.y,
+ f->rect.width, f->rect.height);
         else {
                 unmap_client(c, IconicState);
                 unmap_frame(c);
@@ -533,7 +569,8 @@ resize_client(Client *c, XRectangle *r)
                         unmap_client(c, IconicState);
                         break;
                 case Colstack:
- XMoveResizeWindow(blz.dpy, c->win, c->rect.x, c->rect.y,
+ XMoveResizeWindow(blz.dpy, c->win,
+ c->rect.x, c->rect.y,
                                         c->rect.width, c->rect.height);
                         map_frame(c);
                         unmap_client(c, IconicState);
@@ -543,18 +580,17 @@ resize_client(Client *c, XRectangle *r)
                 }
         else {
         ShowWindow:
+ c->rect = f->rect;
                 c->rect.y = labelh(&def.font);
- c->rect.width = f->rect.width;
- c->rect.height = f->rect.height;
                 match_sizehints(c, &c->rect, False, NORTH|EAST);
                 c->rect.width -= def.border * 2;
                 c->rect.height -= labelh(&def.font) + def.border;
                 c->rect.x = (f->rect.width - c->rect.width) / 2;
- XMoveResizeWindow(blz.dpy, c->win, c->rect.x, c->rect.y,
+ XMoveResizeWindow(blz.dpy, c->win,
+ c->rect.x, c->rect.y,
                                 c->rect.width, c->rect.height);
                 map_client(c);
                 map_frame(c);
-
         }
         configure_client(c);
 }
@@ -570,7 +606,8 @@ newcol_client(Client *c, char *arg) {
         if(!f->anext && f == a->frame)
                 return;
         if(!strncmp(arg, "prev", 5)) {
- for(to=v->area; to && to->next != a; to=to->next);
+ for(to=v->area; to; to=to->next)
+ if(to->next == a) break;
                 to = new_column(v, to, 0);
                 send_to_area(to, a, f);
         }
@@ -638,9 +675,10 @@ send_client(Frame *f, char *arg) {
                 if(!strncmp(arg, "left", 5)) {
                         if(a->floating)
                                 return Ebadvalue;
- for(to=v->area->next; to && a != to->next; to=to->next);
+ for(to=v->area->next; to; to=to->next)
+ if(a == to->next) break;
                         if(!to && (f->anext || f != a->frame))
- to=new_column(v, v->area, 0);
+ to=new_column(v, v->area, 0);
                         if(!to)
                                 return Ebadvalue;
                         send_to_area(to, a, f);
@@ -648,14 +686,15 @@ send_client(Frame *f, char *arg) {
                 else if(!strncmp(arg, "right", 5)) {
                         if(a->floating)
                                 return Ebadvalue;
- if(!(to = a->next) && (f->anext || f!= a->frame))
+ if(!(to = a->next) && (f->anext || f != a->frame))
                                 to = new_column(v, a, 0);
                         if(!to)
                                 return Ebadvalue;
                         send_to_area(to, a, f);
                 }
                 else if(!strncmp(arg, "up", 3)) {
- for(tf=a->frame; tf && tf->anext != f; tf=tf->anext);
+ for(tf=a->frame; tf; tf=tf->anext)
+ if(tf->anext == f) break;
                         if(!tf)
                                 return Ebadvalue;
                         remove_frame(f);
@@ -691,7 +730,12 @@ update_client_views(Client *c, char **ta
         Frame **fp = &c->frame;
 
         while(*fp || *tags) {
- while(*fp && (!*tags || (cmp=strcmp((*fp)->view->name, *tags)) < 0)) {
+ while(*fp) {
+ if(*tags) {
+ cmp = strcmp((*fp)->view->name, *tags);
+ if(cmp >= 0)
+ break;
+ }
                         f = *fp;
                         detach_from_area(f->area, f);
                         *fp = f->cnext;
@@ -712,7 +756,7 @@ update_client_views(Client *c, char **ta
                         tags++;
                 }
         }
- focus_view(screen, screen->sel);
+ update_views();
 }
 
 static int
@@ -722,24 +766,71 @@ compare_tags(const void *a, const void *
 
 void
 apply_tags(Client *c, const char *tags) {
- unsigned int i, j, n;
+ unsigned int i, j, k, n;
         int len;
- char buf[256];
- char *toks[32];
-
- strncpy(buf, tags, sizeof(buf));
+ Bool add;
+ char buf[512], last;
+ char *toks[32], *cur;
+
+ buf[0] = 0;
+ for(n = 0; tags[n]; n++)
+ if(tags[n] != ' ' && tags[n] != '\t') break;
+ if(tags[n] == '+' || tags[n] == '-')
+ strncpy(buf, c->tags, sizeof(c->tags));
+ strncat(buf, &tags[n], sizeof(buf) - strlen(buf));
         trim(buf, " \t/");
- if(!(n = ixp_tokenize(toks, 31, buf, '+')))
- return;
- for(i=0, j=0; i < n; i++) {
- if(!strncmp(toks[i], "~", 2))
- c->floating = True;
- else if(!strncmp(toks[i], "!", 2))
- toks[j++] = view ? screen->sel->name : "nil";
- else if(strncmp(toks[i], "sel", 4)
- && strncmp(toks[i], ".", 2)
- && strncmp(toks[i], "..", 3))
- toks[j++] = toks[i];
+
+ n = 0;
+ j = 0;
+ add = True;
+ if(buf[0] == '+')
+ n++;
+ else if(buf[0] == '-') {
+ n++;
+ add = False;
+ }
+ while(buf[n] && n < sizeof(buf) && j < 32) {
+ for(i = n; i < sizeof(buf) - 1; i++)
+ if(buf[i] == '+'
+ || buf[i] == '-'
+ || buf[i] == '\0')
+ break;
+ last = buf[i];
+ buf[i] = '\0';
+
+ cur = nil;
+ if(!strncmp(&buf[n], "~", 2))
+ c->floating = add;
+ else if(!strncmp(&buf[n], "!", 2))
+ cur = view ? screen->sel->name : "nil";
+ else if(strncmp(&buf[n], "sel", 4)
+ && strncmp(&buf[n], ".", 2)
+ && strncmp(&buf[n], "..", 3))
+ cur = &buf[n];
+
+ n = i + 1;
+ if(cur) {
+ if(add)
+ toks[j++] = cur;
+ else {
+ for(i = 0, k = 0; i < j; i++)
+ if(strcmp(toks[i], cur))
+ toks[k++] = toks[i];
+ j = k;
+ }
+ }
+
+ switch(last) {
+ case '+':
+ add = True;
+ break;
+ case '-':
+ add = False;
+ break;
+ case '\0':
+ buf[n] = '\0';
+ break;
+ }
         }
         c->tags[0] = '\0';
         qsort(toks, j, sizeof(char *), compare_tags);
diff -r bd06709e5602 -r 51a8198adb08 fs.c
--- a/fs.c Sun Feb 11 20:36:00 2007 -0500
+++ b/fs.c Sun Feb 11 22:17:20 2007 -0500
@@ -699,9 +699,8 @@ fs_write(P9Req *r) {
                 return;
         case FsFCtags:
                 data_to_cstring(r);
- i=strlen(f->content.client->tags);
- write_to_buf(r, &f->content.client->tags, &i, 255);
- r->ofcall.count = i- r->ifcall.offset;
+ apply_tags(f->content.client, r->ifcall.data);
+ r->ofcall.count = r->ifcall.count;
                 respond(r, nil);
                 return;
         case FsFBar:
diff -r bd06709e5602 -r 51a8198adb08 main.c
--- a/main.c Sun Feb 11 20:36:00 2007 -0500
+++ b/main.c Sun Feb 11 22:17:20 2007 -0500
@@ -360,8 +360,8 @@ main(int argc, char *argv[]) {
         screen = &screens[0];
 
         scan_wins();
+ starting = False;
         update_views();
- starting = False;
 
         /* main event loop */
         errstr = ixp_server_loop(&srv);
diff -r bd06709e5602 -r 51a8198adb08 util.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/util.c Sun Feb 11 22:17:20 2007 -0500
@@ -0,0 +1,14 @@
+
+int
+max(int a, int b) {
+ if(a > b)
+ return a;
+ return b;
+}
+
+char *
+str_nil(char *s) {
+ if(s)
+ return s;
+ return "<nil>";
+}
diff -r bd06709e5602 -r 51a8198adb08 view.c
--- a/view.c Sun Feb 11 20:36:00 2007 -0500
+++ b/view.c Sun Feb 11 22:17:20 2007 -0500
@@ -64,7 +64,6 @@ create_view(const char *name) {
         strncpy(v->name, name, sizeof(v->name));
         create_area(v, nil, 0);
         create_area(v, v->area, 0);
- v->area->floating = True;
         for(i=&view; *i; i=&(*i)->next)
                 if(strcmp((*i)->name, name) < 0) break;
         v->next = *i;
@@ -146,11 +145,9 @@ select_view(const char *arg) {
 
 void
 attach_to_view(View *v, Frame *f) {
- Area *a;
         Client *c = f->client;
 
         c->revert = nil;
- a = v->sel;
         if(c->trans || c->floating || c->fixedsize
                 || (c->rect.width == screen->rect.width && c->rect.height == screen->rect.height))
                 v->sel = v->area;
diff -r bd06709e5602 -r 51a8198adb08 wmii.h
--- a/wmii.h Sun Feb 11 20:36:00 2007 -0500
+++ b/wmii.h Sun Feb 11 22:17:20 2007 -0500
@@ -375,6 +375,10 @@ extern void update_rules(Rule **rule, co
 extern void update_rules(Rule **rule, const char *data);
 extern void trim(char *str, const char *chars);
 
+/* util.c */
+extern int max(int a, int b);
+extern char *str_nil(char *s);
+
 /* view.c */
 extern void arrange_view(View *v);
 extern void scale_view(View *v, float w);
Received on Mon Feb 12 2007 - 04:21:36 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:55:11 UTC