client.c
changeset 74 5370ef170cc9
parent 73 c2ddb9dbbd10
child 75 f08271b7cb20
equal deleted inserted replaced
73:c2ddb9dbbd10 74:5370ef170cc9
    15 	/* class			instance	tags						floating */
    15 	/* class			instance	tags						floating */
    16 	{ "Firefox-bin",	"Gecko",	{ [Twww] = "www" },			False },
    16 	{ "Firefox-bin",	"Gecko",	{ [Twww] = "www" },			False },
    17 };
    17 };
    18 
    18 
    19 Client *
    19 Client *
    20 next(Client *c)
    20 getnext(Client *c)
    21 {
    21 {
    22 	for(; c && !c->tags[tsel]; c = c->next);
    22 	for(; c && !c->tags[tsel]; c = c->next);
    23 	return c;
    23 	return c;
    24 }
    24 }
    25 
    25 
    26 void
    26 void
    27 ban_client(Client *c)
    27 ban(Client *c)
    28 {
    28 {
    29 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
    29 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
    30 	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
    30 	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
    31 }
    31 }
    32 
    32 
    46 	c->ty = c->y;
    46 	c->ty = c->y;
    47 	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
    47 	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
    48 }
    48 }
    49 
    49 
    50 void
    50 void
    51 update_name(Client *c)
    51 settitle(Client *c)
    52 {
    52 {
    53 	XTextProperty name;
    53 	XTextProperty name;
    54 	int n;
    54 	int n;
    55 	char **list = NULL;
    55 	char **list = NULL;
    56 
    56 
    74 	XFree(name.value);
    74 	XFree(name.value);
    75 	resize_title(c);
    75 	resize_title(c);
    76 }
    76 }
    77 
    77 
    78 void
    78 void
    79 update_size(Client *c)
    79 setsize(Client *c)
    80 {
    80 {
    81 	XSizeHints size;
    81 	XSizeHints size;
    82 	long msize;
    82 	long msize;
    83 	if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
    83 	if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
    84 		size.flags = PSize;
    84 		size.flags = PSize;
   112 	else
   112 	else
   113 		c->grav = NorthWestGravity;
   113 		c->grav = NorthWestGravity;
   114 }
   114 }
   115 
   115 
   116 void
   116 void
   117 craise(Client *c)
   117 higher(Client *c)
   118 {
   118 {
   119 	XRaiseWindow(dpy, c->win);
   119 	XRaiseWindow(dpy, c->win);
   120 	XRaiseWindow(dpy, c->title);
   120 	XRaiseWindow(dpy, c->title);
   121 }
   121 }
   122 
   122 
   134 	XEvent ev;
   134 	XEvent ev;
   135 
   135 
   136 	XFlush(dpy);
   136 	XFlush(dpy);
   137 	sel = c;
   137 	sel = c;
   138 	if(old && old != c)
   138 	if(old && old != c)
   139 		draw_client(old);
   139 		drawtitle(old);
   140 	draw_client(c);
   140 	drawtitle(c);
   141 	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
   141 	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
   142 	XFlush(dpy);
   142 	XFlush(dpy);
   143 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
   143 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
   144 }
   144 }
   145 
   145 
   194 		c->ty = c->y += bh;
   194 		c->ty = c->y += bh;
   195 	c->tw = c->w = wa->width;
   195 	c->tw = c->w = wa->width;
   196 	c->h = wa->height;
   196 	c->h = wa->height;
   197 	c->th = bh;
   197 	c->th = bh;
   198 	c->border = 1;
   198 	c->border = 1;
   199 	c->proto = win_proto(c->win);
   199 	c->proto = proto(c->win);
   200 	update_size(c);
   200 	setsize(c);
   201 	XSelectInput(dpy, c->win,
   201 	XSelectInput(dpy, c->win,
   202 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   202 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   203 	XGetTransientForHint(dpy, c->win, &trans);
   203 	XGetTransientForHint(dpy, c->win, &trans);
   204 	twa.override_redirect = 1;
   204 	twa.override_redirect = 1;
   205 	twa.background_pixmap = ParentRelative;
   205 	twa.background_pixmap = ParentRelative;
   208 	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
   208 	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
   209 			0, DefaultDepth(dpy, screen), CopyFromParent,
   209 			0, DefaultDepth(dpy, screen), CopyFromParent,
   210 			DefaultVisual(dpy, screen),
   210 			DefaultVisual(dpy, screen),
   211 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   211 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   212 
   212 
   213 	update_name(c);
   213 	settitle(c);
   214 	init_tags(c);
   214 	init_tags(c);
   215 
   215 
   216 	for(l = &clients; *l; l = &(*l)->next);
   216 	for(l = &clients; *l; l = &(*l)->next);
   217 	c->next = *l; /* *l == nil */
   217 	c->next = *l; /* *l == nil */
   218 	*l = c;
   218 	*l = c;
   234 		XMapRaised(dpy, c->win);
   234 		XMapRaised(dpy, c->win);
   235 		XMapRaised(dpy, c->title);
   235 		XMapRaised(dpy, c->title);
   236 		focus(c);
   236 		focus(c);
   237 	}
   237 	}
   238 	else {
   238 	else {
   239 		ban_client(c);
   239 		ban(c);
   240 		XMapRaised(dpy, c->win);
   240 		XMapRaised(dpy, c->win);
   241 		XMapRaised(dpy, c->title);
   241 		XMapRaised(dpy, c->title);
   242 	}
   242 	}
   243 }
   243 }
   244 
   244 
   337 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   337 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   338 	XFlush(dpy);
   338 	XFlush(dpy);
   339 }
   339 }
   340 
   340 
   341 static int
   341 static int
   342 dummy_error_handler(Display *dsply, XErrorEvent *err)
   342 dummy_xerror(Display *dsply, XErrorEvent *err)
   343 {
   343 {
   344 	return 0;
   344 	return 0;
   345 }
   345 }
   346 
   346 
   347 void
   347 void
   348 unmanage(Client *c)
   348 unmanage(Client *c)
   349 {
   349 {
   350 	Client **l;
   350 	Client **l;
   351 
   351 
   352 	XGrabServer(dpy);
   352 	XGrabServer(dpy);
   353 	XSetErrorHandler(dummy_error_handler);
   353 	XSetErrorHandler(dummy_xerror);
   354 
   354 
   355 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
   355 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
   356 	XDestroyWindow(dpy, c->title);
   356 	XDestroyWindow(dpy, c->title);
   357 
   357 
   358 	for(l = &clients; *l && *l != c; l = &(*l)->next);
   358 	for(l = &clients; *l && *l != c; l = &(*l)->next);
   364 		sel = sel->revert ? sel->revert : clients;
   364 		sel = sel->revert ? sel->revert : clients;
   365 
   365 
   366 	free(c);
   366 	free(c);
   367 
   367 
   368 	XFlush(dpy);
   368 	XFlush(dpy);
   369 	XSetErrorHandler(error_handler);
   369 	XSetErrorHandler(xerror);
   370 	XUngrabServer(dpy);
   370 	XUngrabServer(dpy);
   371 	arrange(NULL);
   371 	arrange(NULL);
   372 	if(sel)
   372 	if(sel)
   373 		focus(sel);
   373 		focus(sel);
   374 }
   374 }