wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 918fa1cf9dabdf48a0bbd58748c5b1eda51b4983
parent 962d2784f06c5697314211a5eb49ded3ecfc67bb
Author: Kris Maglione <jg@suckless.org>
Date:   Sat, 24 May 2008 20:32:01 -0400

Eliminate some round trips. Some rather ugly cleanup.

Diffstat:
cmd/wmii/client.c | 14+++++---------
cmd/wmii/dat.h | 1+
cmd/wmii/event.c | 13+++++++++++++
cmd/wmii/frame.c | 12++++++++++--
cmd/wmii/fs.c | 50+++++++++++++++-----------------------------------
cmd/wmii/main.c | 5+++--
cmd/wmii/message.c | 2--
cmd/wmii/mouse.c | 61++++++++++++++++++++++++++-----------------------------------
cmd/wmii/view.c | 3---
9 files changed, 73 insertions(+), 88 deletions(-)

diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -132,6 +132,7 @@ client_create(XWindow w, XWindowAttributes *wa) { fwa.colormap = XCreateColormap(display, scr.root.w, vis, AllocNone); fwa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask + | StructureNotifyMask | ExposureMask | EnterWindowMask | PointerMotionMask @@ -141,7 +142,7 @@ client_create(XWindow w, XWindowAttributes *wa) { c->framewin = createwindow_visual(&scr.root, c->r, depth, vis, InputOutput, &fwa, CWBackPixmap - /* These next two matter for argb windows. Donno why. */ + /* These next two matter for ARGB windows. Donno why. */ | CWBorderPixel | CWColormap | CWEventMask @@ -226,7 +227,7 @@ client_manage(Client *c) { view_restack(c->sel->view); } - flushenterevents(); + ignoreenter = true; } static int /* Temporary Xlib error handler */ @@ -284,7 +285,7 @@ client_destroy(Client *c) { group_remove(c); event("DestroyClient %C\n", c); - flushenterevents(); + ignoreenter = true; flushevents(FocusChangeMask, true); free(c->w.hints); free(c); @@ -533,9 +534,6 @@ client_resize(Client *c, Rectangle r) { client_configure(c); ewmh_framesize(c); } - sync(); /* Not ideal. */ - flushenterevents(); - flushevents(FocusChangeMask|ExposureMask, true); } void @@ -834,8 +832,6 @@ configreq_event(Window *w, XConfigureRequestEvent *e) { if(c->sel->area->floating) { client_resize(c, r); - sync(); - flushenterevents(); }else { c->sel->floatr = r; client_configure(c); @@ -855,7 +851,7 @@ enter_event(Window *w, XCrossingEvent *e) { c = w->aux; if(e->detail != NotifyInferior) { - if(screen->focus != c) { + if(!ignoreenter && screen->focus != c) { Dprint(DFocus, "enter_notify([%C]%s)\n", c, c->name); focus(c, false); } diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -369,6 +369,7 @@ EXTERN XHandler handler[LASTEvent]; /* Misc */ EXTERN bool starting; +EXTERN bool ignoreenter; EXTERN char* user; EXTERN char* execstr; EXTERN int debugflag; diff --git a/cmd/wmii/event.c b/cmd/wmii/event.c @@ -138,6 +138,16 @@ configurerequest(XEvent *e) { } static void +configurenotify(XEvent *e) { + XConfigureEvent *ev; + Window *w; + + ev = &e->xconfigure; + if((w = findwin(ev->window))) + handle(w, config, ev); +} + +static void clientmessage(XEvent *e) { XClientMessageEvent *ev; @@ -323,6 +333,8 @@ motionnotify(XEvent *e) { XMotionEvent *ev; Window *w; + ignoreenter = false; + ev = &e->xmotion; xtime = ev->time; if((w = findwin(ev->window))) @@ -366,6 +378,7 @@ void (*handler[LASTEvent]) (XEvent *) = { [ButtonPress] = buttonpress, [ButtonRelease] = buttonrelease, [ConfigureRequest] = configurerequest, + [ConfigureNotify] = configurenotify, [ClientMessage] = clientmessage, [DestroyNotify] = destroynotify, [EnterNotify] = enternotify, diff --git a/cmd/wmii/frame.c b/cmd/wmii/frame.c @@ -198,6 +198,13 @@ bdown_event(Window *w, XButtonEvent *e) { } static void +config_event(Window *w, XConfigureEvent *e) { + + USED(w, e); + ignoreenter = true; +} + +static void enter_event(Window *w, XCrossingEvent *e) { Client *c; Frame *f; @@ -206,7 +213,7 @@ enter_event(Window *w, XCrossingEvent *e) { f = c->sel; if(screen->focus != c || selclient() != c) { Dprint(DFocus, "enter_notify(f) => %s\n", f->client->name); - if(f->area->floating || !f->collapsed) + if(!ignoreenter && (f->area->floating || !f->collapsed)) focus(f->client, false); } mouse_checkresize(f, Pt(e->x, e->y), false); @@ -237,6 +244,7 @@ motion_event(Window *w, XMotionEvent *e) { Handlers framehandler = { .bup = bup_event, .bdown = bdown_event, + .config = config_event, .enter = enter_event, .expose = expose_event, .motion = motion_event, @@ -341,7 +349,7 @@ frame_resize(Frame *f, Rectangle r) { Rectangle fr, cr; int collapsed, dx; - if(btassert("4 full", Dx(r) <= 0 || Dy(r) <= 0)) { + if(btassert("8 full", Dx(r) <= 0 || Dy(r) <= 0)) { fprint(2, "Frame rect: %R\n", r); r.max.x = min(r.min.x+1, r.max.x); r.max.y = min(r.min.y+1, r.max.y); diff --git a/cmd/wmii/fs.c b/cmd/wmii/fs.c @@ -507,27 +507,30 @@ lookup_file(FileId *parent, char *name) uint id; int i; + if(!(parent->tab.perm & DMDIR)) return nil; dir = dirtab[parent->tab.type]; last = &ret; ret = nil; for(; dir->name; dir++) { +# define push_file(nam) \ + file = get_file(); \ + *last = file; \ + last = &file->next; \ + file->tab = *dir; \ + file->tab.name = estrdup(nam) /* Dynamic dirs */ if(dir->name[0] == '\0') { switch(parent->tab.type) { case FsDClients: if(!name || !strcmp(name, "sel")) { if((c = selclient())) { - file = get_file(); - *last = file; - last = &file->next; + push_file("sel"); file->volatil = true; file->p.client = c; file->id = c->w.w; file->index = c->w.w; - file->tab = *dir; - file->tab.name = estrdup("sel"); }if(name) goto LastItem; } SET(id); @@ -537,15 +540,11 @@ lookup_file(FileId *parent, char *name) } for(c=client; c; c=c->next) { if(!name || c->w.w == id) { - file = get_file(); - *last = file; - last = &file->next; + push_file(sxprint("%C", c)); file->volatil = true; file->p.client = c; file->id = c->w.w; file->index = c->w.w; - file->tab = *dir; - file->tab.name = smprint("%C", c); assert(file->tab.name); if(name) goto LastItem; } @@ -554,38 +553,26 @@ lookup_file(FileId *parent, char *name) case FsDDebug: for(i=0; i < nelem(pdebug); i++) if(!name || !strcmp(name, debugtab[i])) { - file = get_file(); - *last = file; - last = &file->next; + push_file(debugtab[i]); file->id = i; - file->tab = *dir; - file->tab.name = estrdup(debugtab[i]); if(name) goto LastItem; } break; case FsDTags: if(!name || !strcmp(name, "sel")) { if(screen->sel) { - file = get_file(); - *last = file; - last = &file->next; + push_file("sel"); file->volatil = true; file->p.view = screen->sel; file->id = screen->sel->id; - file->tab = *dir; - file->tab.name = estrdup("sel"); }if(name) goto LastItem; } for(v=view; v; v=v->next) { if(!name || !strcmp(name, v->name)) { - file = get_file(); - *last = file; - last = &file->next; + push_file(v->name); file->volatil = true; file->p.view = v; file->id = v->id; - file->tab = *dir; - file->tab.name = estrdup(v->name); if(name) goto LastItem; } } @@ -593,14 +580,10 @@ lookup_file(FileId *parent, char *name) case FsDBars: for(b=*parent->p.bar_p; b; b=b->next) { if(!name || !strcmp(name, b->name)) { - file = get_file(); - *last = file; - last = &file->next; + push_file(b->name); file->volatil = true; file->p.bar = b; file->id = b->id; - file->tab = *dir; - file->tab.name = estrdup(b->name); if(name) goto LastItem; } } @@ -608,14 +591,10 @@ lookup_file(FileId *parent, char *name) } }else /* Static dirs */ if(!name && !(dir->flags & FLHide) || name && !strcmp(name, dir->name)) { - file = get_file(); - *last = file; - last = &file->next; + push_file(file->tab.name); file->id = 0; file->p.ref = parent->p.ref; file->index = parent->index; - file->tab = *dir; - file->tab.name = estrdup(file->tab.name); /* Special considerations: */ switch(file->tab.type) { case FsDBars: @@ -635,6 +614,7 @@ lookup_file(FileId *parent, char *name) } NextItem: continue; +# undef push_file } LastItem: *last = nil; diff --git a/cmd/wmii/main.c b/cmd/wmii/main.c @@ -15,7 +15,7 @@ #include "fns.h" static const char - version[] = "wmii-"VERSION", ©2007 Kris Maglione\n"; + version[] = "wmii-"VERSION", ©2008 Kris Maglione\n"; static int (*xlib_errorhandler) (Display*, XErrorEvent*); static char* address; @@ -332,7 +332,8 @@ main(int argc, char *argv[]) { check_other_wm = true; selectinput(&scr.root, SubstructureRedirectMask - | EnterWindowMask); + | EnterWindowMask + | PointerMotionMask); sync(); check_other_wm = false; diff --git a/cmd/wmii/message.c b/cmd/wmii/message.c @@ -931,7 +931,6 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) { else return Ebadvalue; - flushenterevents(); frame_focus(client_viewframe(c, v)); /* view_arrange(v); */ view_update_all(); @@ -971,7 +970,6 @@ msg_sendframe(Frame *f, int sym, bool swap) { /* view_arrange(f->view); */ - flushenterevents(); frame_focus(client_viewframe(c, f->view)); view_update_all(); return nil; diff --git a/cmd/wmii/mouse.c b/cmd/wmii/mouse.c @@ -97,46 +97,37 @@ rect_morph(Rectangle *r, Point d, Align *mask) { } } +/* Yes, yes, macros are evil. So are patterns. */ +#define frob(xy, yx) \ + Rectangle *rp; \ + int i, txy; \ + \ + for(i=0; i < nrect; i++) { \ + rp = &rects[i]; \ + if((rp->min.yx <= r->max.yx) && (rp->max.yx >= r->min.yx)) { \ + txy = rp->min.xy; \ + if(abs(txy - xy) <= abs(dxy)) \ + dxy = txy - xy; \ + \ + txy = rp->max.xy; \ + if(abs(txy - xy) <= abs(dxy)) \ + dxy = txy - xy; \ + } \ + } \ + return dxy \ + static int -snap_hline(Rectangle *rects, int nrect, int dy, Rectangle *r, int y) { - Rectangle *rp; - int i, ty; - - for(i=0; i < nrect; i++) { - rp = &rects[i]; - if((rp->min.x <= r->max.x) && (rp->max.x >= r->min.x)) { - ty = rp->min.y; - if(abs(ty - y) <= abs(dy)) - dy = ty - y; - - ty = rp->max.y; - if(abs(ty - y) <= abs(dy)) - dy = ty - y; - } - } - return dy; +snap_hline(Rectangle *rects, int nrect, int dxy, Rectangle *r, int y) { + frob(y, x); } static int -snap_vline(Rectangle *rects, int nrect, int dx, Rectangle *r, int x) { - Rectangle *rp; - int i, tx; - - for(i=0; i < nrect; i++) { - rp = &rects[i]; - if((rp->min.y <= r->max.y) && (rp->max.y >= r->min.y)) { - tx = rp->min.x; - if(abs(tx - x) <= abs(dx)) - dx = tx - x; - - tx = rp->max.x; - if(abs(tx - x) <= abs(dx)) - dx = tx - x; - } - } - return dx; +snap_vline(Rectangle *rects, int nrect, int dxy, Rectangle *r, int x) { + frob(x, y); } +#undef frob + /* Returns a gravity for increment handling. It's normally the opposite of the mask * (the directions that we're resizing in), unless a snap occurs, in which case, it's the * direction of the snap. @@ -240,7 +231,7 @@ mouse_resizecolframe(Frame *f, Align align) { /* At any rate, set the limits of where this box may be * dragged. */ -#define frob(pred, f, aprev, rmin, rmax, plus, minus, xy) BLOCK( \ +#define frob(pred, f, aprev, rmin, rmax, plus, minus, xy) BLOCK( \ if(pred) { \ r.rmin.xy = f->aprev->r.rmin.xy plus min.xy; \ r.rmax.xy = f->r.rmax.xy minus min.xy; \ diff --git a/cmd/wmii/view.c b/cmd/wmii/view.c @@ -259,9 +259,6 @@ view_update(View *v) { else area_focus(v->sel); frame_draw_all(); - - sync(); - flushenterevents(); } void