client.c
changeset 687 a76799907854
parent 647 fd2ea58b0b94
child 690 399f08187c27
equal deleted inserted replaced
686:4fd68b1485eb 687:a76799907854
    57 xerrordummy(Display *dsply, XErrorEvent *ee) {
    57 xerrordummy(Display *dsply, XErrorEvent *ee) {
    58 	return 0;
    58 	return 0;
    59 }
    59 }
    60 
    60 
    61 /* extern functions */
    61 /* extern functions */
    62 
       
    63 void
       
    64 ban(Client *c) {
       
    65 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
       
    66 	XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty);
       
    67 }
       
    68 
    62 
    69 void
    63 void
    70 configure(Client *c) {
    64 configure(Client *c) {
    71 	XEvent synev;
    65 	XEvent synev;
    72 
    66 
   119 		if(c->win == w)
   113 		if(c->win == w)
   120 			return c;
   114 			return c;
   121 	return NULL;
   115 	return NULL;
   122 }
   116 }
   123 
   117 
   124 Client *
       
   125 getctitle(Window w) {
       
   126 	Client *c;
       
   127 
       
   128 	for(c = clients; c; c = c->next)
       
   129 		if(c->twin == w)
       
   130 			return c;
       
   131 	return NULL;
       
   132 }
       
   133 
       
   134 void
   118 void
   135 killclient(Arg *arg) {
   119 killclient(Arg *arg) {
   136 	if(!sel)
   120 	if(!sel)
   137 		return;
   121 		return;
   138 	if(sel->proto & PROTODELWIN)
   122 	if(sel->proto & PROTODELWIN)
   143 
   127 
   144 void
   128 void
   145 manage(Window w, XWindowAttributes *wa) {
   129 manage(Window w, XWindowAttributes *wa) {
   146 	Client *c;
   130 	Client *c;
   147 	Window trans;
   131 	Window trans;
   148 	XSetWindowAttributes twa;
       
   149 
   132 
   150 	c = emallocz(sizeof(Client));
   133 	c = emallocz(sizeof(Client));
   151 	c->tags = emallocz(ntags * sizeof(Bool));
   134 	c->tags = emallocz(ntags * sizeof(Bool));
   152 	c->win = w;
   135 	c->win = w;
   153 	c->border = 0;
   136 	c->border = 0;
   154 	c->x = c->tx = wa->x;
   137 	c->x = wa->x;
   155 	c->y = c->ty = wa->y;
   138 	c->y = wa->y;
   156 	c->w = c->tw = wa->width;
   139 	c->w = wa->width;
   157 	c->h = wa->height;
   140 	c->h = wa->height;
   158 	c->th = bh;
       
   159 	updatesizehints(c);
   141 	updatesizehints(c);
   160 	if(c->x + c->w + 2 * BORDERPX > sw)
   142 	if(c->x + c->w + 2 * BORDERPX > sw)
   161 		c->x = sw - c->w - 2 * BORDERPX;
   143 		c->x = sw - c->w - 2 * BORDERPX;
   162 	if(c->x < sx)
   144 	if(c->x < sx)
   163 		c->x = sx;
   145 		c->x = sx;
   167 		c->y = bh;
   149 		c->y = bh;
   168 	c->proto = getproto(c->win);
   150 	c->proto = getproto(c->win);
   169 	XSelectInput(dpy, c->win,
   151 	XSelectInput(dpy, c->win,
   170 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   152 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   171 	XGetTransientForHint(dpy, c->win, &trans);
   153 	XGetTransientForHint(dpy, c->win, &trans);
   172 	twa.override_redirect = 1;
       
   173 	twa.background_pixmap = ParentRelative;
       
   174 	twa.event_mask = ExposureMask | EnterWindowMask;
       
   175 	c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
       
   176 			0, DefaultDepth(dpy, screen), CopyFromParent,
       
   177 			DefaultVisual(dpy, screen),
       
   178 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
       
   179 	grabbuttons(c, False);
   154 	grabbuttons(c, False);
   180 	updatetitle(c);
   155 	updatetitle(c);
   181 	settags(c, getclient(trans));
   156 	settags(c, getclient(trans));
   182 	if(!c->isfloat)
   157 	if(!c->isfloat)
   183 		c->isfloat = trans || c->isfixed;
   158 		c->isfloat = trans || c->isfixed;
   184 	resizetitle(c);
       
   185 	if(clients)
   159 	if(clients)
   186 		clients->prev = c;
   160 		clients->prev = c;
   187 	c->next = clients;
   161 	c->next = clients;
   188 	c->snext = stack;
   162 	c->snext = stack;
   189 	stack = clients = c;
   163 	stack = clients = c;
   190 	ban(c);
   164 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
   191 	XMapWindow(dpy, c->win);
   165 	XMapWindow(dpy, c->win);
   192 	XMapWindow(dpy, c->twin);
       
   193 	if(isvisible(c))
   166 	if(isvisible(c))
   194 		focus(c);
   167 		focus(c);
   195 	arrange();
   168 	arrange();
   196 }
   169 }
   197 
   170 
   226 		c->y = bh;
   199 		c->y = bh;
   227 	if(c->x > sw)
   200 	if(c->x > sw)
   228 		c->x = sw - c->w;
   201 		c->x = sw - c->w;
   229 	if(c->y > sh)
   202 	if(c->y > sh)
   230 		c->y = sh - c->h;
   203 		c->y = sh - c->h;
   231 	resizetitle(c);
       
   232 	wc.x = c->x;
   204 	wc.x = c->x;
   233 	wc.y = c->y;
   205 	wc.y = c->y;
   234 	wc.width = c->w;
   206 	wc.width = c->w;
   235 	wc.height = c->h;
   207 	wc.height = c->h;
   236 	if(c->w == sw && c->h == sh)
   208 	if(c->w == sw && c->h == sh)
   238 	else
   210 	else
   239 		wc.border_width = BORDERPX;
   211 		wc.border_width = BORDERPX;
   240 	XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
   212 	XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
   241 	configure(c);
   213 	configure(c);
   242 	XSync(dpy, False);
   214 	XSync(dpy, False);
   243 }
       
   244 
       
   245 void
       
   246 resizetitle(Client *c) {
       
   247 	c->tw = textw(c->name);
       
   248 	if(c->tw > c->w)
       
   249 		c->tw = c->w + 2 * BORDERPX;
       
   250 	c->tx = c->x + c->w - c->tw + 2 * BORDERPX;
       
   251 	c->ty = c->y;
       
   252 	if(isvisible(c))
       
   253 		XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th);
       
   254 	else
       
   255 		XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th);
       
   256 }
   215 }
   257 
   216 
   258 void
   217 void
   259 updatesizehints(Client *c) {
   218 updatesizehints(Client *c) {
   260 	long msize;
   219 	long msize;
   329 	if(sel == c) {
   288 	if(sel == c) {
   330 		for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
   289 		for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
   331 		focus(nc);
   290 		focus(nc);
   332 	}
   291 	}
   333 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
   292 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
   334 	XDestroyWindow(dpy, c->twin);
       
   335 	free(c->tags);
   293 	free(c->tags);
   336 	free(c);
   294 	free(c);
   337 	XSync(dpy, False);
   295 	XSync(dpy, False);
   338 	XSetErrorHandler(xerror);
   296 	XSetErrorHandler(xerror);
   339 	XUngrabServer(dpy);
   297 	XUngrabServer(dpy);