[hackers] [wmii] Implemented the Aspect hint, as well as some moderate cleanup.

From: Kris Maglione <jg_AT_suckless.org>
Date: Fri Mar 02 09:17:37 2007

changeset: 1982:65643b7a63d6
tag: tip
user: Kris Maglione <jg_AT_suckless.org>
date: Fri Mar 02 03:13:32 2007 -0500
summary: Implemented the Aspect hint, as well as some moderate cleanup.

diff -r 18c1736806e7 -r 65643b7a63d6 client.c
--- a/client.c Thu Mar 01 16:37:00 2007 -0500
+++ b/client.c Fri Mar 02 03:13:32 2007 -0500
@@ -26,7 +26,6 @@ create_client(Window w, XWindowAttribute
 create_client(Window w, XWindowAttributes *wa) {
         Client **t, *c;
         XSetWindowAttributes fwa;
- long msize;
 
         c = emallocz(sizeof(Client));
         c->win = w;
@@ -35,23 +34,16 @@ create_client(Window w, XWindowAttribute
         c->border = wa->border_width;
         c->rect.width = wa->width;
         c->rect.height = wa->height;
+
         c->proto = win_proto(c->win);
- update_client_name(c);
-
- c->fixedsize = False;
- XGetTransientForHint(blz.dpy, c->win, &c->trans);
- if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags)
- c->size.flags = PSize;
- if(c->size.flags & PMinSize && c->size.flags & PMaxSize
- && c->size.min_width == c->size.max_width
- && c->size.min_height == c->size.max_height)
- c->fixedsize = True;
- if(c->rect.width == screen->rect.width
- && c->rect.height == screen->rect.height)
- c->fullscreen = True;
+ prop_client(c, XA_WM_TRANSIENT_FOR);
+ prop_client(c, XA_WM_NORMAL_HINTS);
+ prop_client(c, XA_WM_HINTS);
+ prop_client(c, XA_WM_NAME);
 
         XSetWindowBorderWidth(blz.dpy, c->win, 0);
         XAddToSaveSet(blz.dpy, c->win);
+
         fwa.override_redirect = 1;
         fwa.background_pixmap = ParentRelative;
         fwa.event_mask =
@@ -77,6 +69,7 @@ create_client(Window w, XWindowAttribute
                 /* valuemask */ CWOverrideRedirect | CWEventMask | CWBackPixmap,
                 /* attributes */&fwa
                 );
+
         c->gc = XCreateGC(blz.dpy, c->framewin, 0, 0);
         XSync(blz.dpy, False);
 
@@ -93,12 +86,12 @@ create_client(Window w, XWindowAttribute
 
 void
 manage_client(Client *c) {
- XTextProperty tags;
+ XTextProperty tags = { 0 };
         Client *trans;
 
- tags.nitems = 0;
         XGetTextProperty(blz.dpy, c->win, &tags, tags_atom);
- if((c->trans) && (trans = client_of_win(c->trans)))
+
+ if((trans = client_of_win(c->trans)))
                 strncpy(c->tags, trans->tags, sizeof(c->tags));
         else if(tags.nitems)
                 strncpy(c->tags, (char *)tags.value, sizeof(c->tags));
@@ -381,26 +374,28 @@ set_urgent(Client *c, Bool urgent, Bool
 }
 
 void
-prop_client(Client *c, XPropertyEvent *e) {
+prop_client(Client *c, Atom a) {
         XWMHints *wmh;
         long msize;
 
- if(e->atom == wm_atom[WMProtocols]) {
+ if(a == wm_atom[WMProtocols])
                 c->proto = win_proto(c->win);
- return;
- }
- switch (e->atom) {
+ else if(a== net_atom[NetWMName]) {
+wmname:
+ update_client_name(c);
+ if(c->frame)
+ draw_frame(c->sel);
+ }else switch (a) {
         case XA_WM_TRANSIENT_FOR:
                 XGetTransientForHint(blz.dpy, c->win, &c->trans);
                 break;
         case XA_WM_NORMAL_HINTS:
- if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags) {
+ if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags)
                         c->size.flags = PSize;
- }
                 c->fixedsize = False;
- if(c->size.flags & PMinSize && c->size.flags & PMaxSize
- && c->size.min_width == c->size.max_width
- && c->size.min_height == c->size.max_height)
+ if((c->size.flags & PMinSize) && (c->size.flags & PMaxSize)
+ &&(c->size.min_width == c->size.max_width)
+ &&(c->size.min_height == c->size.max_height))
                                 c->fixedsize = True;
                 break;
         case XA_WM_HINTS:
@@ -410,11 +405,8 @@ prop_client(Client *c, XPropertyEvent *e
                         XFree(wmh);
                 }
                 break;
- }
- if(e->atom == XA_WM_NAME || e->atom == net_atom[NetWMName]) {
- update_client_name(c);
- if(c->frame)
- draw_frame(c->sel);
+ case XA_WM_NAME:
+ goto wmname;
         }
 }
 
@@ -491,7 +483,9 @@ destroy_client(Client *c) {
         Client **tc;
 
         XGrabServer(blz.dpy);
+ /* In case the client is already unmapped */
         XSetErrorHandler(dummy_error_handler);
+
         for(tc=&client; *tc; tc=&(*tc)->next)
                 if(*tc == c) {
                         *tc = c->next;
@@ -504,6 +498,7 @@ destroy_client(Client *c) {
         unmap_client(c, WithdrawnState);
         gravitate_client(c, True);
         reparent_client(c, blz.root, c->rect.x, c->rect.y);
+
         XFreeGC(blz.dpy, c->gc);
         XDestroyWindow(blz.dpy, c->framewin);
         XSync(blz.dpy, False);
@@ -517,69 +512,78 @@ destroy_client(Client *c) {
 }
 
 void
-match_sizehints(Client *c, XRectangle *r, Bool floating, BlitzAlign sticky) {
+apply_sizehints(Client *c, XRectangle *r, Bool floating, Bool frame, BlitzAlign sticky) {
         XSizeHints *s;
- uint dx, dy;
- uint hdiff, wdiff;
-
+ XRectangle orig;
+ uint bw, bh;
+
         s = &c->size;
- dx = 2 * def.border;
- dy = def.border + labelh(&def.font);
-
- if(floating && (s->flags & PMinSize)) {
- if(r->width < s->min_width + dx) {
- wdiff = (s->min_width + dx) - r->width;
- r->width += wdiff;
- if((sticky & EAST) && !(sticky & WEST))
- r->x -= wdiff;
- }
- if(r->height < s->min_height + dy) {
- hdiff = (s->min_height + dy) - r->height;
- r->height += hdiff;
- if((sticky & SOUTH) && !(sticky & NORTH))
- r->y -= hdiff;
- }
- }
- if(floating && (s->flags & PMaxSize)) {
- if(r->width > s->max_width + dx) {
- wdiff = r->width - (s->max_width + dx);
- r->width -= wdiff;
- if((sticky & EAST) && !(sticky & WEST))
- r->x += wdiff;
- }
- if(r->height > s->max_height + dy) {
- hdiff = r->height - (s->max_height + dy);
- r->height -= hdiff;
- if((sticky & SOUTH) && !(sticky & NORTH))
- r->y += hdiff;
- }
- }
+ orig = *r;
+ if(frame)
+ frame2client(r);
+ bw = 0;
+ bh = 0;
+
+ if(s->flags & PMinSize) {
+ bw = s->min_width;
+ bh = s->min_height;
+ if(floating) {
+ if(r->width < s->min_width)
+ r->width = s->min_width;
+ if(r->height < s->min_height)
+ r->height = s->min_height;
+ }
+ }
+ if(s->flags & PMaxSize) {
+ if(r->width > s->max_width)
+ r->width = s->max_width;
+ if(r->height > s->max_height)
+ r->height = s->max_height;
+ }
+
+ if(s->flags & PBaseSize) {
+ bw = s->base_width;
+ bh = s->base_height;
+ }
+
         if(s->flags & PResizeInc) {
- int w = 0, h = 0;
- if(s->flags & PBaseSize) {
- w = s->base_width;
- h = s->base_height;
- } else if(s->flags & PMinSize) {
- /* base_{width,height} default to min_{width,height} */
- w = s->min_width;
- h = s->min_height;
- }
- /* client_width = base_width + i * s->width_inc for an integer i */
- w = r->width - dx - w;
- if(s->width_inc > 0) {
- wdiff = w % s->width_inc;
- r->width -= wdiff;
- if((sticky & EAST) && !(sticky & WEST))
- r->x += wdiff;
- }
- h = r->height - dy - h;
- if(s->height_inc > 0) {
- hdiff = h % s->height_inc;
- r->height -= hdiff;
- if((sticky & SOUTH) && !(sticky & NORTH))
- r->y += hdiff;
- }
- }
+ if(s->width_inc > 0)
+ r->width -= (r->width - bw) % s->width_inc;
+ if(s->height_inc > 0)
+ r->height -= (r->height - bh) % s->height_inc;
+ }
+
+ if((s->flags & (PBaseSize|PMinSize)) == PMinSize) {
+ bw = 0;
+ bh = 0;
+ }
+
+ if(s->flags & PAspect) {
+ double min, max, initial;
+
+ min = (double)s->min_aspect.x / s->min_aspect.y;
+ max = (double)s->max_aspect.x / s->max_aspect.y;
+ initial = (double)(r->width - bw) / (r->height - bh);
+ if(initial < min)
+ r->height = bh + (r->width - bw) / min;
+ if(initial > max)
+ r->width = bw + (r->height - bh) * max;
+ }
+
+ if(frame)
+ client2frame(r);
+
+ if(!(s->flags & PMinSize) || !floating) {
+ if(r->width > orig.width)
+ r->width = orig.width;
+ if(r->height > orig.height)
+ r->height = orig.height;
+ }
+
+ if((sticky & (EAST|WEST)) == EAST)
+ r->x = r_east(&orig) - r->width;
+ if((sticky & (NORTH|SOUTH)) == SOUTH)
+ r->y = r_south(&orig) - r->height;
 }
 
 void
@@ -587,8 +591,7 @@ focus_client(Client *c) {
         if(verbose)
                 fprintf(stderr, "focus_client(%p) => %s\n", c, (c ? c->name : nil));
         if(screen->focus != c) {
- if(c)
- if(verbose)
+ if(c && verbose)
                         fprintf(stderr, "\t%s => %s\n", (screen->focus ? screen->focus->name : "<nil>"),
                                         (c ? c->name : "<nil>"));
                 if(c) {
@@ -619,8 +622,8 @@ resize_client(Client *c, XRectangle *r)
         c->rect = f->crect;
         c->rect.x += f->rect.x;
         c->rect.y += f->rect.y;
- if(f->area->mode == Colmax
- && f->area->sel != f) {
+ if((f->area->mode == Colmax)
+ && (f->area->sel != f)) {
                 unmap_frame(c);
                 unmap_client(c, IconicState);
         }else if(f->collapsed) {
@@ -793,12 +796,13 @@ update_client_views(Client *c, char **ta
                                 if(cmp >= 0)
                                         break;
                         }
+
                         f = *fp;
                         detach_from_area(f);
                         *fp = f->cnext;
- free(f);
                         if(c->sel == f)
                                 c->sel = *fp;
+ free(f);
                 }
                 if(*tags) {
                         if(!*fp || cmp > 0) {
@@ -888,9 +892,12 @@ apply_tags(Client *c, const char *tags)
                         break;
                 }
         }
+
         c->tags[0] = '\0';
+ if(!j)
+ return;
         qsort(toks, j, sizeof(char *), compare_tags);
- if(!j) return;
+
         for(i=0, n=0; i < j; i++)
                 if(!n || strcmp(toks[i], toks[n-1])) {
                         if(i)
@@ -899,26 +906,26 @@ apply_tags(Client *c, const char *tags)
                         toks[n++] = toks[i];
                 }
         toks[n] = nil;
+
         update_client_views(c, toks);
         XChangeProperty(blz.dpy, c->win, tags_atom, XA_STRING, 8,
                         PropModeReplace, (uchar *)c->tags, strlen(c->tags));
 }
 
-static void
-match_tags(Client *c, const char *prop) {
+void
+apply_rules(Client *c) {
         Rule *r;
- regmatch_t tmpregm;
-
- for(r=def.tagrules.rule; r; r=r->next)
- if(!regexec(&r->regex, prop, 1, &tmpregm, 0))
- if(!strlen(c->tags) || !strncmp(c->tags, "nil", 4))
+ regmatch_t rm;
+
+ if(strlen(c->tags))
+ return;
+ if(def.tagrules.string)
+ for(r=def.tagrules.rule; r; r=r->next)
+ if(!regexec(&r->regex, c->props, 1, &rm, 0)) {
                                 apply_tags(c, r->value);
-}
-
-void
-apply_rules(Client *c) {
- if(def.tagrules.string)
- match_tags(c, c->props);
+ if(strlen(c->tags) && strcmp(c->tags, "nil"))
+ break;
+ }
         if(!strlen(c->tags))
                 apply_tags(c, "nil");
 }
diff -r 18c1736806e7 -r 65643b7a63d6 column.c
--- a/column.c Thu Mar 01 16:37:00 2007 -0500
+++ b/column.c Fri Mar 02 03:13:32 2007 -0500
@@ -122,7 +122,7 @@ scale_column(Area *a) {
                         if(!i)
                                 f->rect.height = surplus;
                         f->rect.height += min_height + frame_delta_h();
- match_sizehints(f->client, &f->rect, False, NWEST);
+ apply_sizehints(f->client, &f->rect, False, True, NWEST);
 
                         dy -= f->crect.height;
                         surplus -= f->rect.height - frame_delta_h() - min_height;
diff -r 18c1736806e7 -r 65643b7a63d6 event.c
--- a/event.c Thu Mar 01 16:37:00 2007 -0500
+++ b/event.c Fri Mar 02 03:13:32 2007 -0500
@@ -364,7 +364,7 @@ propertynotify(XEvent *e) {
         if(ev->state == PropertyDelete)
                 return; /* ignore */
         if((c = client_of_win(ev->window)))
- prop_client(c, ev);
+ prop_client(c, ev->atom);
 }
 
 static void
diff -r 18c1736806e7 -r 65643b7a63d6 frame.c
--- a/frame.c Thu Mar 01 16:37:00 2007 -0500
+++ b/frame.c Fri Mar 02 03:13:32 2007 -0500
@@ -68,6 +68,18 @@ insert_frame(Frame *pos, Frame *f, Bool
 }
 
 void
+frame2client(XRectangle *r) {
+ r->width = max(r->width - def.border * 2, 1);
+ r->height = max(r->height - frame_delta_h(), 1);
+}
+
+void
+client2frame(XRectangle *r) {
+ r->width += def.border * 2;
+ r->height += frame_delta_h();
+}
+
+void
 resize_frame(Frame *f, XRectangle *r) {
         BlitzAlign stickycorner;
         Client *c;
@@ -75,33 +87,34 @@ resize_frame(Frame *f, XRectangle *r) {
         c = f->client;
         stickycorner = get_sticky(&f->rect, r);
 
+ if(c->fullscreen)
+ send_to_area(f->area->view->area, f);
+
         f->rect = *r;
         f->crect = *r;
- match_sizehints(c, &f->crect, f->area->floating, stickycorner);
+ apply_sizehints(c, &f->crect, f->area->floating, True, stickycorner);
 
         if(f->area->floating)
                 f->rect = f->crect;
 
- if(f->rect.height < frame_delta_h() + labelh(&def.font)) {
+ frame2client(&f->crect);
+
+ if(f->crect.height < labelh(&def.font)) {
                 f->rect.height = frame_delta_h();
                 f->collapsed = True;
         }else
                 f->collapsed = False;
 
- if(f->rect.width < labelh(&def.font)) {
+ if(f->crect.width < labelh(&def.font)) {
                 f->rect.width = frame_delta_h();
                 f->collapsed = True;
         }
 
- if(!f->collapsed) {
- f->crect.width -= def.border * 2;
- f->crect.height -= frame_delta_h();
- }
+ if(f->collapsed)
+ f->crect = f->rect;
         f->crect.y = labelh(&def.font);
         f->crect.x = (f->rect.width - f->crect.width) / 2;
-
- if(f->collapsed)
- f->rect.height = labelh(&def.font);
+
 
         if(f->area->floating) {
                 if(c->fullscreen) {
@@ -312,8 +325,8 @@ check_frame_constraints(XRectangle *rect
                 rect->x = screen->rect.width - barheight;
         if(rect->y + barheight > max_height)
                 rect->y = max_height - barheight;
- if(rect->x + rect->width < barheight)
+ if(r_east(rect) < barheight)
                 rect->x = barheight - rect->width;
- if(rect->y + rect->height < barheight)
+ if(r_south(rect) < barheight)
                 rect->y = barheight - rect->height;
 }
diff -r 18c1736806e7 -r 65643b7a63d6 mouse.c
--- a/mouse.c Thu Mar 01 16:37:00 2007 -0500
+++ b/mouse.c Fri Mar 02 03:13:32 2007 -0500
@@ -106,12 +106,12 @@ snap_line(SnapArgs *a) {
 }
 
 BlitzAlign
-snap_rect(XRectangle *rects, int num, XRectangle *current,
- BlitzAlign *mask, int snap)
-{
+snap_rect(XRectangle *rects, int num, XRectangle *current, BlitzAlign *mask, int snap) {
         SnapArgs a = { rects, num, 0, 0, 0, 0, *mask, nil };
- int dx = snap + 1, dy = snap + 1;
+ int dx, dy;
         BlitzAlign ret;
+
+ dx = dy = snap + 1;
 
         a.x1 = current->x;
         a.x2 = r_east(current);
@@ -137,8 +137,10 @@ snap_rect(XRectangle *rects, int num, XR
                 snap_line(&a);
         }
 
- rect_morph_xy(current, abs(dx) <= snap ? dx : 0,
- abs(dy) <= snap ? dy : 0, mask);
+ rect_morph_xy(current,
+ abs(dx) <= snap ? dx : 0,
+ abs(dy) <= snap ? dy : 0,
+ mask);
 
         ret = *mask;
         if(abs(dx) <= snap)
@@ -159,6 +161,7 @@ draw_xor_border(XRectangle *r) {
         xor.height = xor.height > 4 ? xor.height - 4 : 0;
 
         XSetLineAttributes(blz.dpy, xorgc, 1, LineSolid, CapNotLast, JoinMiter);
+ XSetForeground(blz.dpy, xorgc, def.focuscolor.bg);
         if(xor.height > 4 && xor.width > 2)
                 XDrawLine(blz.dpy, blz.root, xorgc,
                         xor.x + 2,
@@ -173,7 +176,6 @@ draw_xor_border(XRectangle *r) {
                         r_south(&xor) - 2);
         XSetLineAttributes(blz.dpy, xorgc, 4, LineSolid, CapNotLast, JoinMiter);
         XDrawRectangles(blz.dpy, blz.root, xorgc, &xor, 1);
- XSync(blz.dpy, False);
 }
 
 static void
@@ -451,7 +453,8 @@ do_mouse_resize(Client *c, Bool grabbox,
                         pt_y += dy;
 
                         rect_morph_xy(&origin, dx, dy, &align);
- if(align != CENTER) check_frame_constraints(&origin);
+ if(align != CENTER)
+ check_frame_constraints(&origin);
                         frect = origin;
 
                         if(floating)
@@ -459,7 +462,7 @@ do_mouse_resize(Client *c, Bool grabbox,
                         else
                                 grav = align ^ CENTER;
 
- match_sizehints(c, &frect, floating, grav);
+ apply_sizehints(c, &frect, floating, True, grav);
 
                         if(grabbox) {
                                 XMoveWindow(blz.dpy, c->framewin, frect.x, frect.y);
@@ -472,7 +475,8 @@ do_mouse_resize(Client *c, Bool grabbox,
                 case Expose:
                         (handler[Expose])(&ev);
                         break;
- default: break;
+ default:
+ break;
                 }
         }
 }
diff -r 18c1736806e7 -r 65643b7a63d6 wmii.h
--- a/wmii.h Thu Mar 01 16:37:00 2007 -0500
+++ b/wmii.h Fri Mar 02 03:13:32 2007 -0500
@@ -289,7 +289,7 @@ Client *create_client(Window w, XWindowA
 Client *create_client(Window w, XWindowAttributes *wa);
 void destroy_client(Client *c);
 void configure_client(Client *c);
-void prop_client(Client *c, XPropertyEvent *e);
+void prop_client(Client *c, Atom a);
 void kill_client(Client *c);
 void gravitate_client(Client *c, Bool invert);
 void map_client(Client *c);
@@ -303,7 +303,7 @@ void focus(Client *c, Bool restack);
 void focus(Client *c, Bool restack);
 void focus_client(Client *c);
 void resize_client(Client *c, XRectangle *r);
-void match_sizehints(Client *c, XRectangle *r, Bool floating, BlitzAlign sticky);
+void apply_sizehints(Client *c, XRectangle *r, Bool floating, Bool frame, BlitzAlign sticky);
 char *send_client(Frame *f, char *arg, Bool swap);
 char * message_client(Client *c, char *message);
 void move_client(Client *c, char *arg);
@@ -351,6 +351,8 @@ void set_frame_cursor(Frame *f, int x, i
 void set_frame_cursor(Frame *f, int x, int y);
 void swap_frames(Frame *fa, Frame *fb);
 int frame_delta_h();
+void frame2client(XRectangle *r);
+void client2frame(XRectangle *r);
 void draw_frame(Frame *f);
 void draw_frames();
 void update_frame_widget_colors(Frame *f);
Received on Fri Mar 02 2007 - 09:17:37 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:56:02 UTC