client.c
changeset 34 cd30cce52b78
parent 33 e90449e03167
child 43 989178822938
equal deleted inserted replaced
33:e90449e03167 34:cd30cce52b78
     9 #include <X11/Xatom.h>
     9 #include <X11/Xatom.h>
    10 #include <X11/Xutil.h>
    10 #include <X11/Xutil.h>
    11 
    11 
    12 #include "wm.h"
    12 #include "wm.h"
    13 
    13 
    14 void (*arrange)(void *aux);
    14 static void floating(void);
       
    15 static void tiling(void);
       
    16 static void (*arrange)(void) = tiling;
    15 
    17 
    16 void
    18 void
    17 max(void *aux)
    19 max(void *aux)
    18 {
    20 {
    19 	if(!stack)
    21 	if(!stack)
    24 	stack->h = sh - 2 * stack->border;
    26 	stack->h = sh - 2 * stack->border;
    25 	resize(stack);
    27 	resize(stack);
    26 	discard_events(EnterWindowMask);
    28 	discard_events(EnterWindowMask);
    27 }
    29 }
    28 
    30 
    29 void
    31 static void
    30 floating(void *aux)
    32 floating(void)
    31 {
    33 {
    32 	Client *c;
    34 	Client *c;
    33 
    35 
    34 	arrange = floating;
       
    35 	for(c = stack; c; c = c->snext)
    36 	for(c = stack; c; c = c->snext)
    36 		resize(c);
    37 		resize(c);
    37 	discard_events(EnterWindowMask);
    38 	discard_events(EnterWindowMask);
    38 }
    39 }
    39 
    40 
    40 void
    41 static void
    41 grid(void *aux)
    42 tiling(void)
    42 {
    43 {
    43 	Client *c;
    44 	Client *c;
    44 	int n, cols, rows, gw, gh, i, j;
    45 	int n, cols, rows, gw, gh, i, j;
    45     float rt, fd;
    46     float rt, fd;
    46 
    47 
    47 	arrange = grid;
       
    48 	if(!clients)
    48 	if(!clients)
    49 		return;
    49 		return;
    50 	for(n = 0, c = clients; c; c = c->next, n++);
    50 	for(n = 0, c = clients; c; c = c->next, n++);
    51 	rt = sqrt(n);
    51 	rt = sqrt(n);
    52 	if(modff(rt, &fd) < 0.5)
    52 	if(modff(rt, &fd) < 0.5)
    74 	}
    74 	}
    75 	discard_events(EnterWindowMask);
    75 	discard_events(EnterWindowMask);
    76 }
    76 }
    77 
    77 
    78 void
    78 void
       
    79 toggle(void *aux)
       
    80 {
       
    81 	if(arrange == floating)
       
    82 		arrange = tiling;
       
    83 	else
       
    84 		arrange = floating;
       
    85 	arrange();
       
    86 }
       
    87 
       
    88 
       
    89 void
    79 sel(void *aux)
    90 sel(void *aux)
    80 {
    91 {
    81 	const char *arg = aux;
    92 	const char *arg = aux;
    82 	Client *c = NULL;
    93 	Client *c = NULL;
    83 
    94 
   112 	int i;
   123 	int i;
   113 
   124 
   114 	c->tw = 0;
   125 	c->tw = 0;
   115 	for(i = 0; i < TLast; i++)
   126 	for(i = 0; i < TLast; i++)
   116 		if(c->tags[i])
   127 		if(c->tags[i])
   117 			c->tw += textw(&brush.font, c->tags[i]) + brush.font.height;
   128 			c->tw += textw(&dc.font, c->tags[i]) + dc.font.height;
   118 	c->tw += textw(&brush.font, c->name) + brush.font.height;
   129 	c->tw += textw(&dc.font, c->name) + dc.font.height;
   119 	if(c->tw > c->w)
   130 	if(c->tw > c->w)
   120 		c->tw = c->w + 2;
   131 		c->tw = c->w + 2;
   121 	c->tx = c->x + c->w - c->tw + 2;
   132 	c->tx = c->x + c->w - c->tw + 2;
   122 	c->ty = c->y;
   133 	c->ty = c->y;
   123 	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
   134 	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
   238 	c->h = wa->height;
   249 	c->h = wa->height;
   239 	c->th = th;
   250 	c->th = th;
   240 	c->border = 1;
   251 	c->border = 1;
   241 	update_size(c);
   252 	update_size(c);
   242 	XSetWindowBorderWidth(dpy, c->win, 1);
   253 	XSetWindowBorderWidth(dpy, c->win, 1);
   243 	XSetWindowBorder(dpy, c->win, brush.border);
   254 	XSetWindowBorder(dpy, c->win, dc.border);
   244 	XSelectInput(dpy, c->win,
   255 	XSelectInput(dpy, c->win,
   245 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   256 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   246 	XGetTransientForHint(dpy, c->win, &c->trans);
   257 	XGetTransientForHint(dpy, c->win, &c->trans);
   247 	twa.override_redirect = 1;
   258 	twa.override_redirect = 1;
   248 	twa.background_pixmap = ParentRelative;
   259 	twa.background_pixmap = ParentRelative;
   264 			GrabModeAsync, GrabModeSync, None, None);
   275 			GrabModeAsync, GrabModeSync, None, None);
   265 	XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
   276 	XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
   266 			GrabModeAsync, GrabModeSync, None, None);
   277 			GrabModeAsync, GrabModeSync, None, None);
   267 	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
   278 	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
   268 			GrabModeAsync, GrabModeSync, None, None);
   279 			GrabModeAsync, GrabModeSync, None, None);
   269 	arrange(NULL);
   280 	arrange();
   270 	focus(c);
   281 	focus(c);
   271 }
   282 }
   272 
   283 
   273 void
   284 void
   274 gravitate(Client *c, Bool invert)
   285 gravitate(Client *c, Bool invert)
   383 	free(c);
   394 	free(c);
   384 
   395 
   385 	XFlush(dpy);
   396 	XFlush(dpy);
   386 	XSetErrorHandler(error_handler);
   397 	XSetErrorHandler(error_handler);
   387 	XUngrabServer(dpy);
   398 	XUngrabServer(dpy);
   388 	arrange(NULL);
   399 	arrange();
   389 	if(stack)
   400 	if(stack)
   390 		focus(stack);
   401 		focus(stack);
   391 }
   402 }
   392 
   403 
   393 Client *
   404 Client *
   415 {
   426 {
   416 	int i;
   427 	int i;
   417 	if(c == stack)
   428 	if(c == stack)
   418 		return;
   429 		return;
   419 
   430 
   420 	brush.x = brush.y = 0;
   431 	dc.x = dc.y = 0;
   421 	brush.h = c->th;
   432 	dc.h = c->th;
   422 
   433 
   423 	brush.w = 0;
   434 	dc.w = 0;
   424 	for(i = 0; i < TLast; i++) {
   435 	for(i = 0; i < TLast; i++) {
   425 		if(c->tags[i]) {
   436 		if(c->tags[i]) {
   426 			brush.x += brush.w;
   437 			dc.x += dc.w;
   427 			brush.w = textw(&brush.font, c->tags[i]) + brush.font.height;
   438 			dc.w = textw(&dc.font, c->tags[i]) + dc.font.height;
   428 			draw(&brush, True, c->tags[i]);
   439 			draw(True, c->tags[i]);
   429 		}
   440 		}
   430 	}
   441 	}
   431 	brush.x += brush.w;
   442 	dc.x += dc.w;
   432 	brush.w = textw(&brush.font, c->name) + brush.font.height;
   443 	dc.w = textw(&dc.font, c->name) + dc.font.height;
   433 	draw(&brush, True, c->name);
   444 	draw(True, c->name);
   434 	XCopyArea(dpy, brush.drawable, c->title, brush.gc,
   445 	XCopyArea(dpy, dc.drawable, c->title, dc.gc,
   435 			0, 0, c->tw, c->th, 0, 0);
   446 			0, 0, c->tw, c->th, 0, 0);
   436 	XFlush(dpy);
   447 	XFlush(dpy);
   437 }
   448 }