aewl

diff client.c @ 31:386649deb651

before leaning things up
author Anselm R. Garbe <garbeam@wmii.de>
date Thu, 13 Jul 2006 01:04:38 +0200
parents 2e0fb4130bfb
children 082c75b937b5
line diff
     1.1 --- a/client.c	Wed Jul 12 17:50:31 2006 +0200
     1.2 +++ b/client.c	Thu Jul 13 01:04:38 2006 +0200
     1.3 @@ -11,6 +11,8 @@
     1.4  #include "util.h"
     1.5  #include "wm.h"
     1.6  
     1.7 +void (*arrange)(void *aux);
     1.8 +
     1.9  void
    1.10  max(void *aux)
    1.11  {
    1.12 @@ -25,12 +27,24 @@
    1.13  }
    1.14  
    1.15  void
    1.16 -arrange(void *aux)
    1.17 +floating(void *aux)
    1.18 +{
    1.19 +	Client *c;
    1.20 +
    1.21 +	arrange = floating;
    1.22 +	for(c = stack; c; c = c->snext)
    1.23 +		resize(c);
    1.24 +	discard_events(EnterWindowMask);
    1.25 +}
    1.26 +
    1.27 +void
    1.28 +grid(void *aux)
    1.29  {
    1.30  	Client *c;
    1.31  	int n, cols, rows, gw, gh, i, j;
    1.32      float rt, fd;
    1.33  
    1.34 +	arrange = grid;
    1.35  	if(!clients)
    1.36  		return;
    1.37  	for(n = 0, c = clients; c; c = c->next, n++);
    1.38 @@ -95,7 +109,13 @@
    1.39  static void
    1.40  resize_title(Client *c)
    1.41  {
    1.42 -	c->tw = textw(&brush.font, c->name) + bh;
    1.43 +	int i;
    1.44 +
    1.45 +	c->tw = 0;
    1.46 +	for(i = 0; i < TLast; i++)
    1.47 +		if(c->tags[i])
    1.48 +			c->tw += textw(&brush.font, c->tags[i]) + bh;
    1.49 +	c->tw += textw(&brush.font, c->name) + bh;
    1.50  	if(c->tw > c->w)
    1.51  		c->tw = c->w + 2;
    1.52  	c->tx = c->x + c->w - c->tw + 2;
    1.53 @@ -190,8 +210,8 @@
    1.54  
    1.55  	old = stack;
    1.56  	for(l = &stack; *l && *l != c; l = &(*l)->snext);
    1.57 -	eassert(*l == c);
    1.58 -	*l = c->snext;
    1.59 +	if(*l)
    1.60 +		*l = c->snext;
    1.61  	c->snext = stack;
    1.62  	stack = c;
    1.63  	if(old && old != c) {
    1.64 @@ -230,17 +250,16 @@
    1.65  	twa.background_pixmap = ParentRelative;
    1.66  	twa.event_mask = ExposureMask;
    1.67  
    1.68 +	c->tags[tsel] = tags[tsel];
    1.69  	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
    1.70  			0, DefaultDepth(dpy, screen), CopyFromParent,
    1.71  			DefaultVisual(dpy, screen),
    1.72  			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
    1.73 +
    1.74  	update_name(c);
    1.75 -
    1.76  	for(l=&clients; *l; l=&(*l)->next);
    1.77  	c->next = *l; /* *l == nil */
    1.78  	*l = c;
    1.79 -	c->snext = stack;
    1.80 -	stack = c;
    1.81  	XMapRaised(dpy, c->win);
    1.82  	XMapRaised(dpy, c->title);
    1.83  	XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
    1.84 @@ -249,7 +268,7 @@
    1.85  			GrabModeAsync, GrabModeSync, None, None);
    1.86  	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
    1.87  			GrabModeAsync, GrabModeSync, None, None);
    1.88 -	resize(c);
    1.89 +	arrange(NULL);
    1.90  	focus(c);
    1.91  }
    1.92  
    1.93 @@ -308,11 +327,24 @@
    1.94  	c->y += dy;
    1.95  }
    1.96  
    1.97 +
    1.98  void
    1.99  resize(Client *c)
   1.100  {
   1.101  	XConfigureEvent e;
   1.102  
   1.103 +	if(c->incw)
   1.104 +		c->w -= (c->w - c->basew) % c->incw;
   1.105 +	if(c->inch)
   1.106 +		c->h -= (c->h - c->baseh) % c->inch;
   1.107 +	if(c->minw && c->w < c->minw)
   1.108 +		c->w = c->minw;
   1.109 +	if(c->minh && c->h < c->minh)
   1.110 +		c->h = c->minh;
   1.111 +	if(c->maxw && c->w > c->maxw)
   1.112 +		c->w = c->maxw;
   1.113 +	if(c->maxh && c->h > c->maxh)
   1.114 +		c->h = c->maxh;
   1.115  	resize_title(c);
   1.116  	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
   1.117  	e.type = ConfigureNotify;
   1.118 @@ -357,6 +389,7 @@
   1.119  	XFlush(dpy);
   1.120  	XSetErrorHandler(error_handler);
   1.121  	XUngrabServer(dpy);
   1.122 +	arrange(NULL);
   1.123  	if(stack)
   1.124  		focus(stack);
   1.125  }
   1.126 @@ -384,15 +417,25 @@
   1.127  void
   1.128  draw_client(Client *c)
   1.129  {
   1.130 +	int i;
   1.131  	if(c == stack) {
   1.132  		draw_bar();
   1.133  		return;
   1.134  	}
   1.135  
   1.136  	brush.x = brush.y = 0;
   1.137 -	brush.w = c->tw;
   1.138  	brush.h = c->th;
   1.139  
   1.140 +	brush.w = 0;
   1.141 +	for(i = 0; i < TLast; i++) {
   1.142 +		if(c->tags[i]) {
   1.143 +			brush.x += brush.w;
   1.144 +			brush.w = textw(&brush.font, c->tags[i]) + bh;
   1.145 +			draw(dpy, &brush, True, c->tags[i]);
   1.146 +		}
   1.147 +	}
   1.148 +	brush.x += brush.w;
   1.149 +	brush.w = textw(&brush.font, c->name) + bh;
   1.150  	draw(dpy, &brush, True, c->name);
   1.151  	XCopyArea(dpy, brush.drawable, c->title, brush.gc,
   1.152  			0, 0, c->tw, c->th, 0, 0);