changeset: 1789:b3d475b0ce82
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Thu Feb 08 20:31:12 2007 -0500
summary: Fixed cycling of floating frames, and stacking issues on 'send toggle'
diff -r 55deb7f197d6 -r b3d475b0ce82 area.c
--- a/area.c Thu Feb 08 13:40:16 2007 -0500
+++ b/area.c Thu Feb 08 20:31:12 2007 -0500
@@ -217,7 +217,7 @@ void
void
attach_to_area(Area *a, Frame *f, Bool send) {
unsigned int h, n_frame;
- Frame **fa, *ft;
+ Frame *ft;
Client *c;
View *v;
@@ -242,10 +242,11 @@ attach_to_area(Area *a, Frame *f, Bool s
arrange_view(v);
}
}
- fa = a->sel ? &a->sel->anext : &a->frame;
- f->anext = *fa;
- *fa = f;
f->area = a;
+ if(a->sel)
+ insert_frame(nil, f, False);
+ else
+ insert_frame(a->sel, f, False);
a->sel = f;
if(!c->floating) { /* column */
f->rect.height = h;
@@ -256,7 +257,7 @@ attach_to_area(Area *a, Frame *f, Bool s
void
detach_from_area(Area *a, Frame *f) {
- Frame **ft, *pr;
+ Frame *pr;
Client *c;
View *v;
Area *ta;
@@ -264,16 +265,16 @@ detach_from_area(Area *a, Frame *f) {
v = a->view;
c = f->client;
- pr = nil;
-
- for(ft=&a->frame; *ft; ft=&(*ft)->anext) {
- if(*ft == f) break;
- pr = *ft;
- }
- assert(*ft == f);
- *ft = f->anext;
- if(a->sel == f)
- a->sel = pr ? pr : *ft;
+
+ for(pr = a->frame; pr; pr = pr->anext)
+ if(pr == f) break;
+ remove_frame(f);
+ if(a->sel == f) {
+ a->sel = pr;
+ if(f->anext)
+ a->sel = f->anext;
+ }
+
if(!a->floating) {
if(a->frame)
arrange_column(a, False);
@@ -285,7 +286,7 @@ detach_from_area(Area *a, Frame *f) {
destroy_area(a);
else if(!a->frame && v->area->frame) {
/* focus floating area if it contains something */
- v->sel = v->area;
+ focus(v->area->sel->client, False);
write_event("FocusFloating\n");
}
arrange_view(v);
@@ -299,11 +300,11 @@ detach_from_area(Area *a, Frame *f) {
if(cl && cl->frame) {
a = cl->sel->area;
if(a->view == v)
- v->sel = a;
+ focus(a->sel->client, False);
}
}
else if(v->area->next->frame)
- v->sel = v->area->next; /* focus first col as fallback */
+ focus(v->area->next->sel->client, False); /* focus first col as fallback */
i = 0;
for(ta=v->area; ta && ta != v->sel; ta=ta->next)
i++;
@@ -323,7 +324,7 @@ select_area(Area *a, char *arg) {
v = a->view;
f = a->sel;
if(!strncmp(arg, "toggle", 7)) {
- if(a != v->area)
+ if(!a->floating)
new = v->area;
else if(v->revert)
new = v->revert;
diff -r 55deb7f197d6 -r b3d475b0ce82 client.c
--- a/client.c Thu Feb 08 13:40:16 2007 -0500
+++ b/client.c Thu Feb 08 20:31:12 2007 -0500
@@ -614,11 +614,9 @@ send_client(Frame *f, char *arg) {
}else
return Ebadvalue;
flush_masked_events(EnterWindowMask);
+ if(f->view == screen->sel)
+ focus(f->client, True);
update_views();
- if(f->view == screen->sel) {
- focus_client(f->client, False);
- focus_view(screen, f->view);
- }
return nil;
}
diff -r 55deb7f197d6 -r b3d475b0ce82 frame.c
--- a/frame.c Thu Feb 08 13:40:16 2007 -0500
+++ b/frame.c Thu Feb 08 20:31:12 2007 -0500
@@ -44,21 +44,34 @@ remove_frame(Frame *f) {
for(ft = &a->frame; *ft; ft=&(*ft)->anext)
if(*ft == f) break;
*ft = f->anext;
+
+ if(a->floating) {
+ for(ft = &a->stack; *ft; ft=&(*ft)->snext)
+ if(*ft == f) break;
+ *ft = f->snext;
+ }
}
void
insert_frame(Frame *pos, Frame *f, Bool before) {
+ Frame *ft, **p;
Area *a = f->area;
if(before) {
- Frame *ft;
for(ft=a->frame; ft; ft=ft->anext)
if(ft->anext == pos) break;
pos=ft;
}
- Frame **p = pos ? &pos->anext : &a->frame;
+ p = &a->frame;
+ if(pos)
+ p = &pos->anext;
f->anext = *p;
*p = f;
+
+ if(a->floating) {
+ f->snext = a->stack;
+ a->stack = f;
+ }
}
void
@@ -90,11 +103,11 @@ frame_to_top(Frame *f) {
a = f->area;
if(!a->floating)
return;
- for(tf=&a->frame; *tf; tf=&(*tf)->anext)
+ for(tf=&a->stack; *tf; tf=&(*tf)->snext)
if(*tf == f) break;
- *tf = f->anext;
- f->anext = a->frame;
- a->frame = f;
+ *tf = f->snext;
+ f->snext = a->stack;
+ a->stack = f;
}
void
diff -r 55deb7f197d6 -r b3d475b0ce82 view.c
--- a/view.c Thu Feb 08 13:40:16 2007 -0500
+++ b/view.c Thu Feb 08 20:31:12 2007 -0500
@@ -183,14 +183,14 @@ restack_view(View *v) {
}
wins[0] = screen->barwin;
- for(a=v->area; a; a=a->next) {
+ for(f=v->area->stack; f; f=f->snext)
+ wins[n++] = f->client->framewin;;
+ for(a=v->area->next; a; a=a->next) {
if(a->frame) {
wins[n++] = a->sel->client->framewin;
- for(f=a->frame; f; f=f->anext) {
- Client *c = f->client;
+ for(f=a->frame; f; f=f->anext)
if(f != a->sel)
- wins[n++] = c->framewin;
- }
+ wins[n++] = f->client->framewin;;
}
}
if(n)
diff -r 55deb7f197d6 -r b3d475b0ce82 wmii.h
--- a/wmii.h Thu Feb 08 13:40:16 2007 -0500
+++ b/wmii.h Thu Feb 08 20:31:12 2007 -0500
@@ -106,6 +106,7 @@ struct Area {
struct Area {
Area *next;
Frame *frame;
+ Frame *stack;
Frame *sel;
View *view;
Bool floating;
@@ -117,6 +118,7 @@ struct Frame {
struct Frame {
Frame *cnext;
Frame *anext;
+ Frame *snext;
View *view;
Area *area;
unsigned short id;
Received on Fri Feb 09 2007 - 02:35:25 UTC
This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:55:01 UTC