wmii

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

commit d61117a3dbacf2aff95b8063d6107ee98f547c2c
parent 67c0cfbd9b073b2aa6266d5894fd1f9c94050ab7
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue, 28 Feb 2006 08:51:53 +0100

modularized focus stuff somewhat (focus_page don't implies focus_client and vice versa)


Diffstat:
cmd/wm/area.c | 8++++----
cmd/wm/client.c | 66++++++++++++++++++++++++++++--------------------------------------
cmd/wm/column.c | 4++--
cmd/wm/event.c | 28++++++++++++++++------------
cmd/wm/fs.c | 1-
cmd/wm/page.c | 17++++++++++++-----
cmd/wm/wm.c | 19++++++++++++-------
cmd/wm/wm.h | 5+++--
cmd/wmiir.c | 5-----
9 files changed, 77 insertions(+), 76 deletions(-)

diff --git a/cmd/wm/area.c b/cmd/wm/area.c @@ -91,9 +91,8 @@ select_area(Area *a, char *arg) } new = p->area[i]; if(new->nclient) - focus_client(new->client[new->sel], True); - else - p->sel = i; + focus_client(new->client[new->sel]); + p->sel = i; } void @@ -109,8 +108,9 @@ sendto_area(Area *new, Client *c) new->client = (Client **)cext_array_attach( (void **)new->client, c, sizeof(Client *), &new->clientsz); new->nclient++; + c->area = new; arrange_column(a); arrange_column(new); - focus_client(c, True); + focus_client(c); } diff --git a/cmd/wm/client.c b/cmd/wm/client.c @@ -20,7 +20,6 @@ alloc_client(Window w, XWindowAttributes *wa) long msize; static unsigned short id = 1; - /* client itself */ c->id = id++; c->win = w; c->rect.x = wa->x; @@ -40,7 +39,6 @@ alloc_client(Window w, XWindowAttributes *wa) free(name.value); } - /* client.frame */ fwa.override_redirect = 1; fwa.background_pixmap = ParentRelative; fwa.event_mask = SubstructureRedirectMask | ExposureMask | ButtonPressMask | PointerMotionMask; @@ -94,27 +92,12 @@ client_focus_event(Client *c) } void -focus_client(Client *c, Bool fevent) +focus_client(Client *c) { - Page *p = page ? page[sel] : nil; - size_t i, j; Client *old = sel_client(); - /* setup indexes */ - if(c->area->page != p) { - focus_page(c->area->page); - p = c->area->page; - } - for(i = 0; i < p->narea; i++) { - Area *a = p->area[i]; - for(j = 0; j < a->nclient && (c != a->client[j]); j++); - if(j < a->nclient) { - p->sel = i; - a->sel = j; - break; - } - } - + c->area->page->sel = area_to_index(c->area); + c->area->sel = client_to_index(c); if(old && (old != c)) { c->revert = old; grab_mouse(old->win, AnyModifier, Button1); @@ -128,8 +111,7 @@ focus_client(Client *c, Bool fevent) draw_client(c); XSync(dpy, False); client_name_event(c); - if(fevent) - client_focus_event(c); + client_focus_event(c); } void @@ -388,7 +370,7 @@ attach_client(Client *c) p = page[sel]; attach_client_to_page(p, c); - focus_client(c, True); + focus_client(c); } void @@ -427,7 +409,7 @@ detach_client(Client *c, Bool unmap) } c->area = nil; if(c->revert) - focus_client(c->revert, True); + focus_client(c->revert); if(c->destroyed) destroy_client(c); } @@ -449,7 +431,7 @@ sel_client() } Client * -win_to_frame(Window w) +win_to_clientframe(Window w) { size_t i; for(i = 0; (i < clientsz) && client[i]; i++) @@ -580,13 +562,13 @@ select_client(Client *c, char *arg) return; i--; } - focus_client(a->client[i], True); + focus_client(a->client[i]); } void sendtopage_client(Client *c, char *arg) { Page *p; - Client *new; + Client *next; if(!strncmp(arg, "new", 4)) p = alloc_page(); @@ -599,15 +581,14 @@ sendtopage_client(Client *c, char *arg) { } detach_client(c, False); attach_client_to_page(p, c); - if((new = sel_client_of_page(page[sel]))) - focus_client(new, True); - + if((next = sel_client_of_page(page[sel]))) + focus_client(next); } void sendtoarea_client(Client *c, char *arg) { const char *errstr; - Area *new, *a = c->area; + Area *next, *a = c->area; Page *p = a->page; int i = area_to_index(a); @@ -615,24 +596,23 @@ sendtoarea_client(Client *c, char *arg) { return; if(!strncmp(arg, "prev", 5)) { if(i == 1) - new = p->area[p->narea - 1]; + next = p->area[p->narea - 1]; else - new = p->area[i - 1]; + next = p->area[i - 1]; } else if(!strncmp(arg, "next", 5)) { if(i < p->narea - 1) - new = p->area[i + 1]; + next = p->area[i + 1]; else - new = p->area[1]; + next = p->area[1]; } else { i = cext_strtonum(arg, 1, p->narea, &errstr); if(errstr) return; - new = p->area[i - 1]; + next = p->area[i - 1]; } - - sendto_area(new, c); + sendto_area(next, c); } void @@ -643,3 +623,13 @@ resize_all_clients() if(client[i]->area) resize_client(client[i], &client[i]->frame.rect, 0); } + +/* convenience function */ +void +focus(Client *c) +{ + Page *p = c->area->page; + if(page[sel] != p) + focus_page(p); + focus_client(c); +} diff --git a/cmd/wm/column.c b/cmd/wm/column.c @@ -138,9 +138,9 @@ drop_moving(Client *c, XRectangle *new, XPoint * pt) src->client[j] = src->client[i]; src->client[i] = tmp; arrange_column(src); + focus_client(c); } } - focus_client(c, False); } } @@ -175,6 +175,6 @@ new_column(Area *old) c->area = col; arrange_page(p, True); - focus_client(c, True); + focus_client(c); return col; } diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -72,10 +72,10 @@ handle_buttonpress(XEvent *e) write_event(buf); } } - else if((c = win_to_frame(ev->window))) { + else if((c = win_to_clientframe(ev->window))) { if(ev->button == Button1) { if(sel_client() != c) { - focus_client(c, False); + focus(c); return; } align = cursor_to_align(c->frame.cursor); @@ -96,11 +96,10 @@ handle_buttonpress(XEvent *e) XRaiseWindow(dpy, c->frame.win); switch (ev->button) { case Button1: - focus_client(c, False); - mouse_move(c); + focus(c); break; case Button3: - focus_client(c, False); + focus(c); align = xy_to_align(&c->rect, ev->x, ev->y); if(align == CENTER) mouse_move(c); @@ -110,9 +109,9 @@ handle_buttonpress(XEvent *e) } } else if(ev->button == Button1) - focus_client(c, False); + focus(c); - if(c && c->area) { + if(c) { snprintf(buf, sizeof(buf), "CB %d %d\n", client_to_index(c) + 1, ev->button); write_event(buf); } @@ -132,7 +131,6 @@ handle_configurerequest(XEvent *e) ev->value_mask &= ~CWSibling; if(c) { - if(c->area) { bw = def.border; bh = bar_height(); @@ -205,7 +203,7 @@ handle_expose(XEvent *e) if(ev->count == 0) { if(ev->window == winbar) draw_bar(); - else if((c = win_to_frame(ev->window))) + else if((c = win_to_clientframe(ev->window))) draw_client(c); } } @@ -254,7 +252,7 @@ handle_maprequest(XEvent *e) static void handle_motionnotify(XEvent *e) { - Client *c = win_to_frame(e->xmotion.window); + Client *c = win_to_clientframe(e->xmotion.window); if(c) { Cursor cursor = cursor_for_motion(c, e->xmotion.x, e->xmotion.y); if(cursor != c->frame.cursor) { @@ -291,11 +289,17 @@ handle_unmapnotify(XEvent *e) static void handle_clientmessage(XEvent *e) { XClientMessageEvent *ev = &e->xclient; + Client *c; if (ev->message_type == net_atoms[NET_NUMBER_OF_DESKTOPS] && ev->format == 32) return; /* ignore */ else if (ev->message_type == net_atoms[NET_CURRENT_DESKTOP] && ev->format == 32) { - focus_page(page[ev->data.l[0]]); - return; + int i = ev->data.l[0]; + if(i < npage) { + Page *p = page[i]; + focus_page(p); + if((c = sel_client_of_page(p))) + focus_client(c); + } } } diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -314,7 +314,6 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) if(iswalk) { Page *p = alloc_page(); new->path = mkqpath(Dpage, p->id, 0, 0); - focus_page(p); } else new->path = mkqpath(Dpage, 0, 0, 0); diff --git a/cmd/wm/page.c b/cmd/wm/page.c @@ -31,7 +31,9 @@ void destroy_page(Page *p) { unsigned int i; - Page *new = p->revert; + Page *old = p->revert; + Client *c; + while(p->narea) destroy_area(p->area[0]); @@ -46,8 +48,11 @@ destroy_page(Page *p) } free(p); - if(npage && new) - focus_page(new); + if(npage && old) { + focus_page(old); + if((c = sel_client_of_page(old))) + focus_client(c); + } else write_event("PN -\n"); } @@ -78,6 +83,7 @@ focus_page(Page *p) p->revert = old; sel = pi; px = sel * rect.width; + /* gives all(!) clients proper geometry (for use of different pagers) */ for(i = 0; i < nclient; i++) { c = client[i]; if(c->area) { @@ -87,8 +93,6 @@ focus_page(Page *p) draw_client(c); } } - if((c = sel_client_of_page(p))) - focus_client(c, False); snprintf(buf, sizeof(buf), "PN %d\n", sel + 1); write_event(buf); XChangeProperty(dpy, root, net_atoms[NET_CURRENT_DESKTOP], XA_CARDINAL, @@ -141,6 +145,7 @@ select_page(char *arg) { size_t new = sel; const char *err; + Client *c; if(!npage) return; @@ -159,4 +164,6 @@ select_page(char *arg) new = idx - 1; } focus_page(page[new]); + if((c = sel_client_of_page(page[new]))) + focus_client(c); } diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -172,13 +172,11 @@ pager() { XEvent ev; int i; - size_t j; + Client *c; - if(!page) + if(!npage) return; - for(j = 0; (j < pagesz) && page[j]; j++); - XClearWindow(dpy, transient); XMapRaised(dpy, transient); draw_pager(); @@ -204,8 +202,11 @@ pager() case KeyPress: XUnmapWindow(dpy, transient); if((i = handle_kpress(&ev.xkey)) != -1) - if(i < j) + if(i < npage) { focus_page(page[i]); + if((c = sel_client_of_page(page[i]))) + focus_client(c); + } XUngrabKeyboard(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime /* ev.xbutton.time */ ); XSync(dpy, False); @@ -213,8 +214,12 @@ pager() break; case ButtonPress: XUnmapWindow(dpy, transient); - if(ev.xbutton.button == Button1) - focus_page(page[xy_to_pager_page(ev.xbutton.x, ev.xbutton.y)]); + if(ev.xbutton.button == Button1) { + i = xy_to_pager_page(ev.xbutton.x, ev.xbutton.y); + focus_page(page[i]); + if((c = sel_client_of_page(page[i]))) + focus_client(c); + } XUngrabKeyboard(dpy, CurrentTime); XUngrabPointer(dpy, CurrentTime /* ev.xbutton.time */ ); XSync(dpy, False); diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -217,8 +217,8 @@ void attach_client_to_page(Page *p, Client *c); void detach_client(Client *c, Bool unmap); Client *sel_client(); Client *sel_client_of_page(Page *p); -void focus_client(Client *c, Bool fevent); -Client *win_to_frame(Window w); +void focus_client(Client *c); +Client *win_to_clientframe(Window w); void resize_client(Client *c, XRectangle *r, XPoint *pt); int cid_to_index(Area *a, unsigned short id); int client_to_index(Client *c); @@ -226,6 +226,7 @@ void select_client(Client *c, char *arg); void sendtopage_client(Client *c, char *arg); void sendtoarea_client(Client *c, char *arg); void resize_all_clients(); +void focus(Client *c); /* event.c */ void init_x_event_handler(); diff --git a/cmd/wmiir.c b/cmd/wmiir.c @@ -39,11 +39,6 @@ write_data(unsigned int fid) } offset += len; } - - if(offset == 0) /* do an explicit empty write when no writing has been done yet */ - if (ixp_client_write(&c, fid, offset, 0, 0) != 0) - fprintf(stderr, "wmiir: cannot write file: %s\n", c.errstr); - free(data); }