commit d8970ae74a565e16d24be6d79d1d1c19924fdbbf
parent 8102bb76d0f00e6b0abe93a35e822daf7d2b5593
Author: Kris Maglione <jg@suckless.org>
Date: Fri, 2 Oct 2009 02:10:57 -0400
Fix moving between vertically stacked Xinerama screens. Fixes issue #92.
Diffstat:
2 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/cmd/wmii/column.c b/cmd/wmii/column.c
@@ -238,7 +238,7 @@ find(Area **ap, Frame **fp, int dir, bool wrap, bool stack) {
if(!*ap)
return false;
*fp = stack_find(*ap, *fp, dir, stack);
- return *fp;
+ return true;
}
if(dir != East && dir != West)
die("not reached");
diff --git a/cmd/wmii/message.c b/cmd/wmii/message.c
@@ -976,6 +976,27 @@ msg_selectframe(Area *a, IxpMsg *m, int sym) {
return nil;
}
+static char*
+sendarea(Frame *f, Area *to, bool swap) {
+ Client *c;
+
+ c = f->client;
+ if(!to)
+ return Ebadvalue;
+
+ if(!swap)
+ area_moveto(to, f);
+ else if(to->sel)
+ frame_swap(f, to->sel);
+ else
+ return Ebadvalue;
+
+ frame_focus(client_viewframe(c, f->view));
+ /* view_arrange(v); */
+ view_update_all();
+ return nil;
+}
+
char*
msg_sendclient(View *v, IxpMsg *m, bool swap) {
Area *to, *a;
@@ -1036,6 +1057,7 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) {
break;
}
+
if(!to && !swap) {
/* XXX: Multihead - clean this up, move elsewhere. */
if(!f->anext && f == f->area->frame) {
@@ -1050,32 +1072,27 @@ msg_sendclient(View *v, IxpMsg *m, bool swap) {
}
}
- if(!to)
- return Ebadvalue;
-
- if(!swap)
- area_moveto(to, f);
- else if(to->sel)
- frame_swap(f, to->sel);
- else
- return Ebadvalue;
-
- frame_focus(client_viewframe(c, v));
- /* view_arrange(v); */
- view_update_all();
- return nil;
+ return sendarea(f, to, swap);
}
static char*
msg_sendframe(Frame *f, int sym, bool swap) {
Client *c;
+ Area *a;
Frame *fp;
SET(fp);
c = f->client;
+
+ a = f->area;
+ fp = f;
+ if(!find(&a, &fp, DIR(sym), false, false))
+ return Ebadvalue;
+ if(a != f->area)
+ return sendarea(f, a, swap);
+
switch(sym) {
case LUP:
- /* XXX: Multihead. */
fp = f->aprev;
if(!fp)
return Ebadvalue;
@@ -1083,7 +1100,6 @@ msg_sendframe(Frame *f, int sym, bool swap) {
fp = fp->aprev;
break;
case LDOWN:
- /* XXX: Multihead. */
fp = f->anext;
if(!fp)
return Ebadvalue;