[hackers] [wmii] Replaced a bunch of the nasty, old focus code, and fixed focusing of the empty floating area

From: Kris Maglione <jg_AT_suckless.org>
Date: Sat Feb 10 08:14:05 2007

changeset: 1824:566fa270b730
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Sat Feb 10 02:13:29 2007 -0500
summary: Replaced a bunch of the nasty, old focus code, and fixed focusing of the empty floating area

diff -r 28ff345a976f -r 566fa270b730 area.c
--- a/area.c Sat Feb 10 01:09:34 2007 -0500
+++ b/area.c Sat Feb 10 02:13:29 2007 -0500
@@ -7,6 +7,8 @@
 #include <stdio.h>
 #include <string.h>
 
+static void place_client(Area *a, Client *c);
+
 static int
 max(int a, int b) {
         if(a > b)
@@ -26,7 +28,7 @@ create_area(View *v, Area *pos, unsigned
         static unsigned short id = 1;
         unsigned int area_num, col_num, i;
         unsigned int min_width;
- Area *ta, *a, **p;
+ Area *a, **p;
 
         min_width = screen->rect.width/NCOL;
         p = pos ? &pos->next : &v->area;
@@ -62,15 +64,12 @@ create_area(View *v, Area *pos, unsigned
         a->sel = nil;
         a->next = *p;
         *p = a;
- v->sel = a;
-
- if(i) write_event("CreateColumn %d\n", i);
-
- i = 0;
- for(ta=v->area; ta != v->sel; ta=ta->next)
- i++;
- if(i) write_event("ColumnFocus %d\n", i);
- else write_event("FocusFloating\n");
+
+ if(i)
+ write_event("CreateColumn %d\n", i);
+
+ focus_area(a);
+
         return a;
 }
 
@@ -90,18 +89,124 @@ destroy_area(Area *a) {
                 if(c->revert == a)
                         c->revert = nil;
 
- i = 0;
- for(ta=v->area; ta && ta->next != a; ta=ta->next)
- i++;
+ i = 1;
+ for(ta=v->area; ta; ta=ta->next)
+ if(ta->next == a) break;
+ else i++;
         if(ta) {
                 ta->next = a->next;
- if(v->sel == a) {
- v->sel = ta->floating ? ta->next : ta;
- if(i) write_event("ColumnFocus %d\n", i + 1);
- else write_event("FocusFloating\n");
- }
- }
+ if(ta->floating && ta->next)
+ ta = ta->next;
+ if(v->sel == a)
+ focus_area(ta);
+ }
+ if(i) write_event("DestroyColumn %d\n", i);
         free(a);
+}
+
+void
+send_to_area(Area *to, Area *from, Frame *f) {
+ assert(to->view == f->view);
+ if(to->floating != from->floating) {
+ XRectangle temp = f->revert;
+ f->revert = f->rect;
+ f->rect = temp;
+ }
+ f->client->revert = from;
+ detach_from_area(from, f);
+ attach_to_area(to, f, True);
+}
+
+void
+attach_to_area(Area *a, Frame *f, Bool send) {
+ unsigned int h, n_frame;
+ Frame *ft;
+ Client *c;
+ View *v;
+
+ v = a->view;
+ c = f->client;
+ h = 0;
+
+ n_frame = 1;
+ for(ft=a->frame; ft; ft=ft->anext)
+ n_frame++;
+
+ c->floating = a->floating;
+ if(!c->floating) {
+ h = a->rect.height / n_frame;
+ if(a->frame)
+ scale_column(a, a->rect.height - h);
+ }
+ if(!send && !c->floating) { /* column */
+ unsigned int w = newcolw_of_view(v);
+ if(v->area->next->frame && w) {
+ a = new_column(v, a, w);
+ arrange_view(v);
+ }
+ }
+ f->area = a;
+ if(a->sel)
+ insert_frame(nil, f, False);
+ else
+ insert_frame(a->sel, f, False);
+ if(!c->floating) /* column */
+ f->rect.height = h;
+ else /* floating */
+ place_client(a, c);
+
+ focus_client(f->client, False);
+
+ update_client_grab(f->client);
+}
+
+void
+detach_from_area(Area *a, Frame *f) {
+ Frame *pr;
+ Client *c;
+ View *v;
+ Area *ta;
+ unsigned int i;
+
+ v = a->view;
+ c = f->client;
+
+ for(pr = a->frame; pr; pr = pr->anext)
+ if(pr->anext == f) break;
+ remove_frame(f);
+ if(a->sel == f)
+ a->sel = pr;
+ if(a->sel == nil)
+ a->sel = a->frame;
+
+ if(!a->floating) {
+ if(a->frame)
+ arrange_column(a, False);
+ else {
+ i = 0;
+ for(ta=v->area; ta && ta != a; ta=ta->next)
+ i++;
+ if(v->area->next->next)
+ destroy_area(a);
+ else if(!a->frame && v->area->frame)
+ /* focus floating area if it contains something */
+ focus_area(v->area);
+ arrange_view(v);
+ }
+ }
+ else if(!a->frame) {
+ if(c->trans) {
+ /* focus area of transient, if possible */
+ Client *cl = client_of_win(c->trans);
+ if(cl && cl->frame) {
+ a = cl->sel->area;
+ if(a->view == v)
+ focus_area(a);
+ }
+ }
+ else if(v->area->next->frame)
+ focus_area(v->area->next);
+ }
 }
 
 static void
@@ -201,122 +306,57 @@ place_client(Area *a, Client *c) {
 }
 
 void
-send_to_area(Area *to, Area *from, Frame *f) {
- assert(to->view == f->view);
- if(to->floating != from->floating) {
- XRectangle temp = f->revert;
- f->revert = f->rect;
- f->rect = temp;
- }
- f->client->revert = from;
- detach_from_area(from, f);
- attach_to_area(to, f, True);
- focus_client(f->client, True);
-}
-
-void
-attach_to_area(Area *a, Frame *f, Bool send) {
- unsigned int h, n_frame;
- Frame *ft;
- Client *c;
- View *v;
-
- v = a->view;
- c = f->client;
- h = 0;
-
- n_frame = 1;
- for(ft=a->frame; ft; ft=ft->anext)
- n_frame++;
-
- c->floating = a->floating;
- if(!c->floating) {
- h = a->rect.height / n_frame;
- if(a->frame)
- scale_column(a, a->rect.height - h);
- }
- if(!send && !c->floating) { /* column */
- unsigned int w = newcolw_of_view(v);
- if(v->area->next->frame && w) {
- a = new_column(v, a, w);
- arrange_view(v);
- }
- }
- f->area = a;
- if(a->sel)
- insert_frame(nil, f, False);
+focus_area(Area *a) {
+ Frame *f;
+ View *v;
+ Area *old_a;
+ int i;
+
+ v = a->view;
+ f = a->sel;
+ old_a = v->sel;
+
+ /* XXX: Replace this with an assert later */
+ if(a == old_a)
+ return;
+
+ v->sel = a;
+ if(v != screen->sel)
+ return;
+
+ if(f)
+ XSetInputFocus(blz.dpy, f->client->win, RevertToPointerRoot, CurrentTime);
         else
- insert_frame(a->sel, f, False);
- a->sel = f;
- if(!c->floating) { /* column */
- f->rect.height = h;
- arrange_column(a, False);
- }else /* floating */
- place_client(a, c);
-
- update_client_grab(f->client);
-}
-
-void
-detach_from_area(Area *a, Frame *f) {
- Frame *pr;
- Client *c;
- View *v;
- Area *ta;
- unsigned int i;
-
- v = a->view;
- c = f->client;
-
- for(pr = a->frame; pr; pr = pr->anext)
- if(pr->anext == f) break;
- remove_frame(f);
- if(a->sel == f)
- a->sel = pr;
- if(a->sel == nil)
- a->sel = a->frame;
-
- if(!a->floating) {
- if(a->frame)
- arrange_column(a, False);
- else {
- i = 0;
- for(ta=v->area; ta && ta != a; ta=ta->next)
- i++;
- if(v->area->next->next)
- destroy_area(a);
- else if(!a->frame && v->area->frame) {
- /* focus floating area if it contains something */
- focus(v->area->sel->client, False);
- write_event("FocusFloating\n");
- }
- arrange_view(v);
- if(i) write_event("DestroyColumn %d\n", i);
- }
- }
- else if(!a->frame) {
- if(c->trans) {
- /* focus area of transient, if possible */
- Client *cl = client_of_win(c->trans);
- if(cl && cl->frame) {
- a = cl->sel->area;
- if(a->view == v)
- focus(a->sel->client, False);
- }
- }
- else if(v->area->next->frame)
- focus(v->area->next->sel->client, False); /* focus first col as fallback */
+ XSetInputFocus(blz.dpy, blz.root, RevertToPointerRoot, CurrentTime);
+
+ if(f) {
+ update_frame_widget_colors(f);
+ draw_frame(f);
+ }
+ if(old_a) {
+ if(old_a->sel) {
+ update_frame_widget_colors(old_a->sel);
+ draw_frame(old_a->sel);
+ }
+ if(a->floating != old_a->floating)
+ v->revert = old_a;
+ }
+
+
+ if(a != old_a) {
                 i = 0;
- for(ta=v->area; ta && ta != v->sel; ta=ta->next)
+ for(a = v->area; a != v->sel; a = a->next)
                         i++;
- if(i) write_event("ColumnFocus %d\n", i);
- else write_event("FocusFloating\n");
+ if(i)
+ write_event("ColumnFocus %d\n", i);
+ else
+ write_event("FocusFloating\n");
         }
 }
 
 char *
 select_area(Area *a, char *arg) {
- Area *new, *ta;
+ Area *new;
         unsigned int i;
         Frame *p, *f;
         View *v;
@@ -370,15 +410,6 @@ select_area(Area *a, char *arg) {
                 for(new=view->area; i && new->next; new=new->next)
                         i--;
         }
- if(new->sel)
- focus_client(new->sel->client, True);
- if(v->sel != new) {
- i = 0;
- for(ta=v->area; ta && ta != new; ta=ta->next)
- i++;
- if(i) write_event("ColumnFocus %d\n", i);
- else write_event("FocusFloating\n");
- v->sel = new;
- }
+ focus_area(new);
         return nil;
 }
diff -r 28ff345a976f -r 566fa270b730 client.c
--- a/client.c Sat Feb 10 01:09:34 2007 -0500
+++ b/client.c Sat Feb 10 02:13:29 2007 -0500
@@ -154,54 +154,60 @@ update_client_grab(Client *c) {
                 grab_button(c->framewin, AnyButton, AnyModifier);
 }
 
+/* convenience function */
+void
+focus(Client *c, Bool restack) {
+ View *v;
+ Frame *f;
+
+ if(!(f = c->sel)) return;
+ v = f->area->view;
+ arrange_column(f->area, False);
+ focus_client(c, restack);
+ focus_view(screen, v);
+}
+
 void
 focus_client(Client *c, Bool restack) {
- Client *old_in_area;
         Client *old;
- Frame *f;
+ Frame *f, *old_f;
         View *v;
- unsigned int a_i;
         Area *a, *old_a;
 
- if(!sel_screen)
- return;
         f = c->sel;
+ a = f->area;
         v = f->view;
         old = sel_client();
- old_in_area = sel_client_of_area(f->area);
- old_a = v->sel;
-
- if(old_a->floating != f->area->floating)
- v->revert = old_a;
- v->sel = f->area;
- f->area->sel = f;
- c->floating = f->area->floating;
+ old_a = nil;
+ if(old) {
+ old_f = old->sel;
+ old_a = old_f->area;
+ }
+
+ a->sel = f;
+ if(!a->floating && (a->mode == Colstack))
+ arrange_column(a, False);
+
+ if(v != screen->sel)
+ return;
+
+ if(f->area != old_a)
+ focus_area(f->area);
+ else {
+ XSetInputFocus(blz.dpy, f->client->win, RevertToPointerRoot, CurrentTime);
+ update_frame_widget_colors(f);
+ draw_frame(f);
+ if(old) {
+ update_frame_widget_colors(old_f);
+ draw_frame(old_f);
+ }
+ }
+
+ if(c != old)
+ write_event("ClientFocus 0x%x\n", c->win);
+
         if(restack)
                 restack_view(v);
- if(!c->floating && f->area->mode == Colstack)
- arrange_column(f->area, False);
- XSetInputFocus(blz.dpy, c->win, RevertToPointerRoot, CurrentTime);
- if(old && old != old_in_area && old != c) {
- update_frame_widget_colors(old->sel);
- draw_frame(old->sel);
- }
- if(old_in_area && old_in_area != c) {
- update_frame_widget_colors(old_in_area->sel);
- draw_frame(old_in_area->sel);
- }
- update_frame_widget_colors(c->sel);
- draw_frame(c->sel);
- XSync(blz.dpy, False);
- if(old_a != v->sel) {
- for(a = v->area, a_i = 0; a; a = a->next, a_i++)
- if(a == v->sel) break;
- if(a_i)
- write_event("ColumnFocus %d\n", a_i);
- else
- write_event("FocusFloating\n");
- }
- if(c != old)
- write_event("ClientFocus 0x%x\n", c->win);
 }
 
 void
@@ -653,19 +659,6 @@ send_client(Frame *f, char *arg) {
         return nil;
 }
 
-/* convenience function */
-void
-focus(Client *c, Bool restack) {
- View *v;
- Frame *f;
-
- if(!(f = c->sel)) return;
- v = f->area->view;
- arrange_column(f->area, False);
- focus_client(c, restack);
- focus_view(screen, v);
-}
-
 void
 update_client_views(Client *c, char **tags) {
         int cmp;
diff -r 28ff345a976f -r 566fa270b730 wmii.h
--- a/wmii.h Sat Feb 10 01:09:34 2007 -0500
+++ b/wmii.h Sat Feb 10 02:13:29 2007 -0500
@@ -251,6 +251,7 @@ extern Area *create_area(View *v, Area *
 extern Area *create_area(View *v, Area *pos, unsigned int w);
 extern void destroy_area(Area *a);
 extern Area *area_of_id(View *t, unsigned short id);
+extern void focus_area(Area *a);
 extern char *select_area(Area *a, char *arg);
 extern void send_to_area(Area *to, Area *from, Frame *f);
 extern void attach_to_area(Area *a, Frame *f, Bool send);
Received on Sat Feb 10 2007 - 08:14:05 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:55:07 UTC