client.c
changeset 95 5d88952cbf96
parent 94 6efe82c775c9
child 99 a19556fe83b5
equal deleted inserted replaced
94:6efe82c775c9 95:5d88952cbf96
    14 static void
    14 static void
    15 resizetitle(Client *c)
    15 resizetitle(Client *c)
    16 {
    16 {
    17 	int i;
    17 	int i;
    18 
    18 
    19 	c->tw = 0;
    19 	c->bw = 0;
    20 	for(i = 0; i < TLast; i++)
    20 	for(i = 0; i < TLast; i++)
    21 		if(c->tags[i])
    21 		if(c->tags[i])
    22 			c->tw += textw(c->tags[i]);
    22 			c->bw += textw(c->tags[i]);
    23 	c->tw += textw(c->name);
    23 	c->bw += textw(c->name);
    24 	if(c->tw > c->w)
    24 	if(c->bw > *c->w)
    25 		c->tw = c->w + 2;
    25 		c->bw = *c->w + 2;
    26 	c->tx = c->x + c->w - c->tw + 2;
    26 	c->bx = *c->x + *c->w - c->bw + 2;
    27 	c->ty = c->y;
    27 	c->by = *c->y;
    28 	XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
    28 	XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
    29 }
    29 }
    30 
    30 
    31 static int
    31 static int
    32 xerrordummy(Display *dsply, XErrorEvent *ee)
    32 xerrordummy(Display *dsply, XErrorEvent *ee)
    33 {
    33 {
    37 /* extern functions */
    37 /* extern functions */
    38 
    38 
    39 void
    39 void
    40 ban(Client *c)
    40 ban(Client *c)
    41 {
    41 {
    42 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
    42 	XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
    43 	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
    43 	XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
    44 }
    44 }
    45 
    45 
    46 void
    46 void
    47 focus(Client *c)
    47 focus(Client *c)
    48 {
    48 {
   122 		dy = c->border;
   122 		dy = c->border;
   123 		break;
   123 		break;
   124 	case EastGravity:
   124 	case EastGravity:
   125 	case CenterGravity:
   125 	case CenterGravity:
   126 	case WestGravity:
   126 	case WestGravity:
   127 		dy = -(c->h / 2) + c->border;
   127 		dy = -(*c->h / 2) + c->border;
   128 		break;
   128 		break;
   129 	case SouthEastGravity:
   129 	case SouthEastGravity:
   130 	case SouthGravity:
   130 	case SouthGravity:
   131 	case SouthWestGravity:
   131 	case SouthWestGravity:
   132 		dy = -c->h;
   132 		dy = -(*c->h);
   133 		break;
   133 		break;
   134 	default:
   134 	default:
   135 		break;
   135 		break;
   136 	}
   136 	}
   137 
   137 
   143 		dx = c->border;
   143 		dx = c->border;
   144 		break;
   144 		break;
   145 	case NorthGravity:
   145 	case NorthGravity:
   146 	case CenterGravity:
   146 	case CenterGravity:
   147 	case SouthGravity:
   147 	case SouthGravity:
   148 		dx = -(c->w / 2) + c->border;
   148 		dx = -(*c->w / 2) + c->border;
   149 		break;
   149 		break;
   150 	case NorthEastGravity:
   150 	case NorthEastGravity:
   151 	case EastGravity:
   151 	case EastGravity:
   152 	case SouthEastGravity:
   152 	case SouthEastGravity:
   153 		dx = -(c->w + c->border);
   153 		dx = -(*c->w + c->border);
   154 		break;
   154 		break;
   155 	default:
   155 	default:
   156 		break;
   156 		break;
   157 	}
   157 	}
   158 
   158 
   159 	if(invert) {
   159 	if(invert) {
   160 		dx = -dx;
   160 		dx = -dx;
   161 		dy = -dy;
   161 		dy = -dy;
   162 	}
   162 	}
   163 	c->x += dx;
   163 	*c->x += dx;
   164 	c->y += dy;
   164 	*c->y += dy;
   165 }
   165 }
   166 
   166 
   167 void
   167 void
   168 higher(Client *c)
   168 higher(Client *c)
   169 {
   169 {
   196 	XSetWindowAttributes twa;
   196 	XSetWindowAttributes twa;
   197 	Window trans;
   197 	Window trans;
   198 
   198 
   199 	c = emallocz(sizeof(Client));
   199 	c = emallocz(sizeof(Client));
   200 	c->win = w;
   200 	c->win = w;
   201 	c->tx = c->x = wa->x;
   201 	c->bx = c->fx = c->tx = wa->x;
   202 	c->ty = c->y = wa->y;
   202 	c->by = c->fy = c->ty = wa->y;
   203 	if(c->y < bh)
   203 	if(c->fy < bh)
   204 		c->ty = c->y += bh;
   204 		c->by = c->fy = c->ty += bh;
   205 	c->tw = c->w = wa->width;
   205 	c->bw = c->fw = c->tw = wa->width;
   206 	c->h = wa->height;
   206 	c->fh = c->th = wa->height;
   207 	c->th = bh;
   207 	c->bh = bh;
   208 	c->border = 1;
   208 	c->border = 1;
   209 	c->proto = getproto(c->win);
   209 	c->proto = getproto(c->win);
   210 	setsize(c);
   210 	setsize(c);
   211 	XSelectInput(dpy, c->win,
   211 	XSelectInput(dpy, c->win,
   212 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   212 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
   213 	XGetTransientForHint(dpy, c->win, &trans);
   213 	XGetTransientForHint(dpy, c->win, &trans);
   214 	twa.override_redirect = 1;
   214 	twa.override_redirect = 1;
   215 	twa.background_pixmap = ParentRelative;
   215 	twa.background_pixmap = ParentRelative;
   216 	twa.event_mask = ExposureMask;
   216 	twa.event_mask = ExposureMask;
   217 
   217 
   218 	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
   218 	c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
   219 			0, DefaultDepth(dpy, screen), CopyFromParent,
   219 			0, DefaultDepth(dpy, screen), CopyFromParent,
   220 			DefaultVisual(dpy, screen),
   220 			DefaultVisual(dpy, screen),
   221 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   221 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   222 
   222 
   223 	settitle(c);
       
   224 	settags(c);
   223 	settags(c);
   225 
   224 
   226 	c->next = clients;
   225 	c->next = clients;
   227 	clients = c;
   226 	clients = c;
   228 
   227 
   237 
   236 
   238 	if(!c->isfloat)
   237 	if(!c->isfloat)
   239 		c->isfloat = trans
   238 		c->isfloat = trans
   240 			|| ((c->maxw == c->minw) && (c->maxh == c->minh));
   239 			|| ((c->maxw == c->minw) && (c->maxh == c->minh));
   241 
   240 
       
   241 	setgeom(c);
       
   242 	settitle(c);
       
   243 
   242 	arrange(NULL);
   244 	arrange(NULL);
       
   245 
   243 	/* mapping the window now prevents flicker */
   246 	/* mapping the window now prevents flicker */
   244 	if(c->tags[tsel]) {
   247 	if(c->tags[tsel]) {
   245 		XMapRaised(dpy, c->win);
   248 		XMapRaised(dpy, c->win);
   246 		XMapRaised(dpy, c->title);
   249 		XMapRaised(dpy, c->title);
   247 		focus(c);
   250 		focus(c);
   257 void
   260 void
   258 maximize(Arg *arg)
   261 maximize(Arg *arg)
   259 {
   262 {
   260 	if(!sel)
   263 	if(!sel)
   261 		return;
   264 		return;
   262 	sel->x = sx;
   265 	*sel->x = sx;
   263 	sel->y = sy + bh;
   266 	*sel->y = sy + bh;
   264 	sel->w = sw - 2 * sel->border;
   267 	*sel->w = sw - 2 * sel->border;
   265 	sel->h = sh - 2 * sel->border - bh;
   268 	*sel->h = sh - 2 * sel->border - bh;
   266 	higher(sel);
   269 	higher(sel);
   267 	resize(sel, False);
   270 	resize(sel, False);
   268 }
   271 }
   269 
   272 
   270 void
   273 void
   284 {
   287 {
   285 	XConfigureEvent e;
   288 	XConfigureEvent e;
   286 
   289 
   287 	if(inc) {
   290 	if(inc) {
   288 		if(c->incw)
   291 		if(c->incw)
   289 			c->w -= (c->w - c->basew) % c->incw;
   292 			*c->w -= (*c->w - c->basew) % c->incw;
   290 		if(c->inch)
   293 		if(c->inch)
   291 			c->h -= (c->h - c->baseh) % c->inch;
   294 			*c->h -= (*c->h - c->baseh) % c->inch;
   292 	}
   295 	}
   293 	if(c->x > sw) /* might happen on restart */
   296 	if(*c->x > sw) /* might happen on restart */
   294 		c->x = sw - c->w;
   297 		*c->x = sw - *c->w;
   295 	if(c->y > sh)
   298 	if(*c->y > sh)
   296 		c->ty = c->y = sh - c->h;
   299 		*c->y = sh - *c->h;
   297 	if(c->minw && c->w < c->minw)
   300 	if(c->minw && *c->w < c->minw)
   298 		c->w = c->minw;
   301 		*c->w = c->minw;
   299 	if(c->minh && c->h < c->minh)
   302 	if(c->minh && *c->h < c->minh)
   300 		c->h = c->minh;
   303 		*c->h = c->minh;
   301 	if(c->maxw && c->w > c->maxw)
   304 	if(c->maxw && *c->w > c->maxw)
   302 		c->w = c->maxw;
   305 		*c->w = c->maxw;
   303 	if(c->maxh && c->h > c->maxh)
   306 	if(c->maxh && *c->h > c->maxh)
   304 		c->h = c->maxh;
   307 		*c->h = c->maxh;
   305 	resizetitle(c);
   308 	resizetitle(c);
   306 	XSetWindowBorderWidth(dpy, c->win, 1);
   309 	XSetWindowBorderWidth(dpy, c->win, 1);
   307 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
   310 	XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
   308 	e.type = ConfigureNotify;
   311 	e.type = ConfigureNotify;
   309 	e.event = c->win;
   312 	e.event = c->win;
   310 	e.window = c->win;
   313 	e.window = c->win;
   311 	e.x = c->x;
   314 	e.x = *c->x;
   312 	e.y = c->y;
   315 	e.y = *c->y;
   313 	e.width = c->w;
   316 	e.width = *c->w;
   314 	e.height = c->h;
   317 	e.height = *c->h;
   315 	e.border_width = c->border;
   318 	e.border_width = c->border;
   316 	e.above = None;
   319 	e.above = None;
   317 	e.override_redirect = False;
   320 	e.override_redirect = False;
   318 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   321 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   319 	XSync(dpy, False);
   322 	XSync(dpy, False);
       
   323 }
       
   324 
       
   325 void
       
   326 setgeom(Client *c)
       
   327 {
       
   328 	if((arrange == dotile) && !c->isfloat) {
       
   329 		c->x = &c->tx;
       
   330 		c->y = &c->ty;
       
   331 		c->w = &c->tw;
       
   332 		c->h = &c->th;
       
   333 	}
       
   334 	else {
       
   335 		c->x = &c->fx;
       
   336 		c->y = &c->fy;
       
   337 		c->w = &c->fw;
       
   338 		c->h = &c->fh;
       
   339 	}
   320 }
   340 }
   321 
   341 
   322 void
   342 void
   323 setsize(Client *c)
   343 setsize(Client *c)
   324 {
   344 {