wmii

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

commit ceb97d3dd83ca8e5b9cfcf0562c22f8b550ab765
parent 5ce54fd1b5612bc0b10ac4c3c6a27be66d788933
Author: Kris Maglione <jg@suckless.org>
Date:   Fri,  2 Oct 2009 17:06:41 -0400

Restore windows from floating layer to their original Xinerama screen. Closes issue #70.

Diffstat:
cmd/wmii/area.c | 5+++--
cmd/wmii/client.c | 2+-
cmd/wmii/column.c | 1+
cmd/wmii/dat.h | 3+++
cmd/wmii/float.c | 4++--
cmd/wmii/fns.h | 2+-
cmd/wmii/message.c | 14+++++++++-----
cmd/wmii/view.c | 9++++++---
8 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/cmd/wmii/area.c b/cmd/wmii/area.c @@ -291,9 +291,10 @@ area_focus(Area *a) { return; v->sel = a; - /* XXX: Multihead. */ - if(!a->floating) + if(!a->floating) { v->selcol = area_idx(a); + v->selscreen = a->screen; + } if(a != old_a) v->oldsel = nil; diff --git a/cmd/wmii/client.c b/cmd/wmii/client.c @@ -613,7 +613,7 @@ fullscreen(Client *c, int fullscreen, long screen) { } else if(f->oldarea > 0) { wassel = (f == f->area->sel); - area_moveto(view_findarea(f->view, f->oldarea, true), + area_moveto(view_findarea(f->view, f->oldscreen, f->oldarea, true), f); if(wassel) frame_focus(f); diff --git a/cmd/wmii/column.c b/cmd/wmii/column.c @@ -107,6 +107,7 @@ column_insert(Area *a, Frame *f, Frame *pos) { f->area = a; f->client->floating = false; + f->screen = a->screen; f->column = area_idx(a); frame_insert(f, pos); if(a->sel == nil) diff --git a/cmd/wmii/dat.h b/cmd/wmii/dat.h @@ -209,7 +209,9 @@ struct Frame { Client* client; View* view; Area* area; + int oldscreen; int oldarea; + int screen; int column; ushort id; bool collapsed; @@ -277,6 +279,7 @@ struct View { Area* oldsel; Area* revert; int selcol; + int selscreen; bool dead; Rectangle *r; Rectangle *pad; diff --git a/cmd/wmii/float.c b/cmd/wmii/float.c @@ -29,7 +29,7 @@ float_detach(Frame *f) { v = f->view; a = f->area; - sel = view_findarea(v, v->selcol, false); + sel = view_findarea(v, v->selscreen, v->selcol, false); oldsel = v->oldsel; pr = f->aprev; @@ -203,7 +203,7 @@ float_placeframe(Frame *f) { else if (selclient()) s = ownerscreen(selclient()->sel->r); else { - sel = view_findarea(a->view, a->view->selcol, false); + sel = view_findarea(a->view, a->view->selscreen, a->view->selcol, false); if (sel) s = sel->screen; } diff --git a/cmd/wmii/fns.h b/cmd/wmii/fns.h @@ -270,7 +270,7 @@ void view_attach(View*, Frame*); View* view_create(const char*); void view_destroy(View*); void view_detach(Frame*); -Area* view_findarea(View*, int, bool); +Area* view_findarea(View*, int, int, bool); void view_focus(WMScreen*, View*); bool view_fullscreen_p(View*, int); char* view_index(View*); diff --git a/cmd/wmii/message.c b/cmd/wmii/message.c @@ -1003,7 +1003,7 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) { Frame *f, *ff; Client *c; char *s; - ulong i; + ulong i, scrn; int sym; s = msg_getword(m); @@ -1041,9 +1041,9 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) { if(!a->floating) to = v->floating; else if(f->column) - to = view_findarea(v, f->column, true); + to = view_findarea(v, f->screen, f->column, true); else - to = view_findarea(v, v->selcol, true); + to = view_findarea(v, v->selscreen, v->selcol, true); break; case LTILDE: if(a->floating) @@ -1051,9 +1051,13 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) { to = v->floating; break; default: - if(!getulong(s, &i) || i == 0) + scrn = 0; + if(!getulong(s, &i)) + if(2 != sscanf(s, "%lu:%lu", &scrn, &i)) + return Ebadvalue; + if(i == 0 || scrn > nscreens) return Ebadvalue; - to = view_findarea(v, i, true); + to = view_findarea(v, scrn, i, true); break; } diff --git a/cmd/wmii/view.c b/cmd/wmii/view.c @@ -154,12 +154,14 @@ view_destroy(View *v) { } Area* -view_findarea(View *v, int idx, bool create) { +view_findarea(View *v, int screen, int idx, bool create) { Area *a; - for(a=v->firstarea; a && --idx > 0; a=a->next) + assert(screen >= 0 && screen < nscreens); + + for(a=v->areas[screen]; a && --idx > 0; a=a->next) if(create && a->next == nil) - return area_create(v, a, screen->idx, 0); + return area_create(v, a, screen, 0); return a; } @@ -282,6 +284,7 @@ view_update(View *v) { f->collapsed = false; if(!f->area->floating) { f->oldarea = area_idx(f->area); + f->oldscreen = f->area->screen; area_moveto(v->floating, f); area_setsel(v->floating, f); }else if(f->oldarea == -1)