client.c
changeset 115 329fd7dae530
parent 114 dfa5cd0969a6
child 123 61490330e90a
equal deleted inserted replaced
114:dfa5cd0969a6 115:329fd7dae530
    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->bw = 0;
    19 	c->tw = 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->bw += textw(c->tags[i]);
    22 			c->tw += textw(c->tags[i]);
    23 	c->bw += textw(c->name);
    23 	c->tw += textw(c->name);
    24 	if(c->bw > *c->w)
    24 	if(c->tw > c->w)
    25 		c->bw = *c->w + 2;
    25 		c->tw = c->w + 2;
    26 	c->bx = *c->x + *c->w - c->bw + 2;
    26 	c->tx = c->x + c->w - c->tw + 2;
    27 	c->by = *c->y;
    27 	c->ty = c->y;
    28 	if(c->tags[tsel])
    28 	if(c->tags[tsel])
    29 		XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
    29 		XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
    30 	else
    30 	else
    31 		XMoveResizeWindow(dpy, c->title, c->bx + 2 * sw, c->by, c->bw, c->bh);
    31 		XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th);
    32 
    32 
    33 }
    33 }
    34 
    34 
    35 static int
    35 static int
    36 xerrordummy(Display *dsply, XErrorEvent *ee)
    36 xerrordummy(Display *dsply, XErrorEvent *ee)
    41 /* extern functions */
    41 /* extern functions */
    42 
    42 
    43 void
    43 void
    44 ban(Client *c)
    44 ban(Client *c)
    45 {
    45 {
    46 	XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
    46 	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
    47 	XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
    47 	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
    48 }
    48 }
    49 
    49 
    50 void
    50 void
    51 focus(Client *c)
    51 focus(Client *c)
    52 {
    52 {
   126 		dy = c->border;
   126 		dy = c->border;
   127 		break;
   127 		break;
   128 	case EastGravity:
   128 	case EastGravity:
   129 	case CenterGravity:
   129 	case CenterGravity:
   130 	case WestGravity:
   130 	case WestGravity:
   131 		dy = -(*c->h / 2) + c->border;
   131 		dy = -(c->h / 2) + c->border;
   132 		break;
   132 		break;
   133 	case SouthEastGravity:
   133 	case SouthEastGravity:
   134 	case SouthGravity:
   134 	case SouthGravity:
   135 	case SouthWestGravity:
   135 	case SouthWestGravity:
   136 		dy = -(*c->h);
   136 		dy = -(c->h);
   137 		break;
   137 		break;
   138 	default:
   138 	default:
   139 		break;
   139 		break;
   140 	}
   140 	}
   141 
   141 
   147 		dx = c->border;
   147 		dx = c->border;
   148 		break;
   148 		break;
   149 	case NorthGravity:
   149 	case NorthGravity:
   150 	case CenterGravity:
   150 	case CenterGravity:
   151 	case SouthGravity:
   151 	case SouthGravity:
   152 		dx = -(*c->w / 2) + c->border;
   152 		dx = -(c->w / 2) + c->border;
   153 		break;
   153 		break;
   154 	case NorthEastGravity:
   154 	case NorthEastGravity:
   155 	case EastGravity:
   155 	case EastGravity:
   156 	case SouthEastGravity:
   156 	case SouthEastGravity:
   157 		dx = -(*c->w + c->border);
   157 		dx = -(c->w + c->border);
   158 		break;
   158 		break;
   159 	default:
   159 	default:
   160 		break;
   160 		break;
   161 	}
   161 	}
   162 
   162 
   163 	if(invert) {
   163 	if(invert) {
   164 		dx = -dx;
   164 		dx = -dx;
   165 		dy = -dy;
   165 		dy = -dy;
   166 	}
   166 	}
   167 	*c->x += dx;
   167 	c->x += dx;
   168 	*c->y += dy;
   168 	c->y += dy;
   169 }
   169 }
   170 
   170 
   171 void
   171 void
   172 higher(Client *c)
   172 higher(Client *c)
   173 {
   173 {
   201 	XSetWindowAttributes twa;
   201 	XSetWindowAttributes twa;
   202 	Window trans;
   202 	Window trans;
   203 
   203 
   204 	c = emallocz(sizeof(Client));
   204 	c = emallocz(sizeof(Client));
   205 	c->win = w;
   205 	c->win = w;
   206 	c->bx = c->fx = c->tx = wa->x;
   206 	c->x = c->tx = wa->x;
   207 	c->by = c->fy = c->ty = wa->y;
   207 	c->y = c->ty = wa->y;
   208 	c->bw = c->fw = c->tw = wa->width;
   208 	c->w = c->tw = wa->width;
   209 	c->fh = c->th = wa->height;
   209 	c->h = wa->height;
   210 	c->bh = bh;
   210 	c->th = bh;
   211 
   211 
   212 	diff = sw - c->fw;
   212 	if(c->y < bh)
   213 	c->fx = random() % (diff ? diff : 1);
   213 		c->y = c->ty = bh;
   214 	diff = sh - c->fh - bh;
       
   215 	c->fy = random() % (diff ? diff : 1);
       
   216 
       
   217 	if(c->fy < bh)
       
   218 		c->by = c->fy = c->ty = bh;
       
   219 
   214 
   220 	c->border = 1;
   215 	c->border = 1;
   221 	c->proto = getproto(c->win);
   216 	c->proto = getproto(c->win);
   222 	setsize(c);
   217 	setsize(c);
   223 	XSelectInput(dpy, c->win,
   218 	XSelectInput(dpy, c->win,
   225 	XGetTransientForHint(dpy, c->win, &trans);
   220 	XGetTransientForHint(dpy, c->win, &trans);
   226 	twa.override_redirect = 1;
   221 	twa.override_redirect = 1;
   227 	twa.background_pixmap = ParentRelative;
   222 	twa.background_pixmap = ParentRelative;
   228 	twa.event_mask = ExposureMask;
   223 	twa.event_mask = ExposureMask;
   229 
   224 
   230 	c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
   225 	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
   231 			0, DefaultDepth(dpy, screen), CopyFromParent,
   226 			0, DefaultDepth(dpy, screen), CopyFromParent,
   232 			DefaultVisual(dpy, screen),
   227 			DefaultVisual(dpy, screen),
   233 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   228 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
   234 
   229 
   235 	settags(c);
   230 	settags(c);
   249 	if(!c->isfloat)
   244 	if(!c->isfloat)
   250 		c->isfloat = trans || (c->maxw && c->minw &&
   245 		c->isfloat = trans || (c->maxw && c->minw &&
   251 				(c->maxw == c->minw) && (c->maxh == c->minh));
   246 				(c->maxw == c->minw) && (c->maxh == c->minh));
   252 
   247 
   253 
   248 
   254 	setgeom(c);
       
   255 	settitle(c);
   249 	settitle(c);
   256 
       
   257 	arrange(NULL);
   250 	arrange(NULL);
   258 
   251 
   259 	/* mapping the window now prevents flicker */
   252 	/* mapping the window now prevents flicker */
   260 	if(c->tags[tsel]) {
   253 	if(c->tags[tsel]) {
   261 		XMapRaised(dpy, c->win);
   254 		XMapRaised(dpy, c->win);
   271 void
   264 void
   272 maximize(Arg *arg)
   265 maximize(Arg *arg)
   273 {
   266 {
   274 	if(!sel)
   267 	if(!sel)
   275 		return;
   268 		return;
   276 	*sel->x = sx;
   269 	sel->x = sx;
   277 	*sel->y = sy + bh;
   270 	sel->y = sy + bh;
   278 	*sel->w = sw - 2 * sel->border;
   271 	sel->w = sw - 2 * sel->border;
   279 	*sel->h = sh - 2 * sel->border - bh;
   272 	sel->h = sh - 2 * sel->border - bh;
   280 	higher(sel);
   273 	higher(sel);
   281 	resize(sel, False, TopLeft);
   274 	resize(sel, False, TopLeft);
   282 }
   275 }
   283 
   276 
   284 void
   277 void
   295 
   288 
   296 void
   289 void
   297 resize(Client *c, Bool inc, Corner sticky)
   290 resize(Client *c, Bool inc, Corner sticky)
   298 {
   291 {
   299 	XConfigureEvent e;
   292 	XConfigureEvent e;
   300 	int right = *c->x + *c->w;
   293 	int right = c->x + c->w;
   301 	int bottom = *c->y + *c->h;
   294 	int bottom = c->y + c->h;
   302 
   295 
   303 	if(inc) {
   296 	if(inc) {
   304 		if(c->incw)
   297 		if(c->incw)
   305 			*c->w -= (*c->w - c->basew) % c->incw;
   298 			c->w -= (c->w - c->basew) % c->incw;
   306 		if(c->inch)
   299 		if(c->inch)
   307 			*c->h -= (*c->h - c->baseh) % c->inch;
   300 			c->h -= (c->h - c->baseh) % c->inch;
   308 	}
   301 	}
   309 	if(*c->x > sw) /* might happen on restart */
   302 	if(c->x > sw) /* might happen on restart */
   310 		*c->x = sw - *c->w;
   303 		c->x = sw - c->w;
   311 	if(*c->y > sh)
   304 	if(c->y > sh)
   312 		*c->y = sh - *c->h;
   305 		c->y = sh - c->h;
   313 	if(c->minw && *c->w < c->minw)
   306 	if(c->minw && c->w < c->minw)
   314 		*c->w = c->minw;
   307 		c->w = c->minw;
   315 	if(c->minh && *c->h < c->minh)
   308 	if(c->minh && c->h < c->minh)
   316 		*c->h = c->minh;
   309 		c->h = c->minh;
   317 	if(c->maxw && *c->w > c->maxw)
   310 	if(c->maxw && c->w > c->maxw)
   318 		*c->w = c->maxw;
   311 		c->w = c->maxw;
   319 	if(c->maxh && *c->h > c->maxh)
   312 	if(c->maxh && c->h > c->maxh)
   320 		*c->h = c->maxh;
   313 		c->h = c->maxh;
   321 	if(sticky == TopRight || sticky == BotRight)
   314 	if(sticky == TopRight || sticky == BotRight)
   322 		*c->x = right - *c->w;
   315 		c->x = right - c->w;
   323 	if(sticky == BotLeft || sticky == BotRight)
   316 	if(sticky == BotLeft || sticky == BotRight)
   324 		*c->y = bottom - *c->h;
   317 		c->y = bottom - c->h;
   325 
   318 
   326 	resizetitle(c);
   319 	resizetitle(c);
   327 	XSetWindowBorderWidth(dpy, c->win, 1);
   320 	XSetWindowBorderWidth(dpy, c->win, 1);
   328 	XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
   321 	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
   329 
   322 
   330 	e.type = ConfigureNotify;
   323 	e.type = ConfigureNotify;
   331 	e.event = c->win;
   324 	e.event = c->win;
   332 	e.window = c->win;
   325 	e.window = c->win;
   333 	e.x = *c->x;
   326 	e.x = c->x;
   334 	e.y = *c->y;
   327 	e.y = c->y;
   335 	e.width = *c->w;
   328 	e.width = c->w;
   336 	e.height = *c->h;
   329 	e.height = c->h;
   337 	e.border_width = c->border;
   330 	e.border_width = c->border;
   338 	e.above = None;
   331 	e.above = None;
   339 	e.override_redirect = False;
   332 	e.override_redirect = False;
   340 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   333 	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
   341 	XSync(dpy, False);
   334 	XSync(dpy, False);
   342 }
       
   343 
       
   344 void
       
   345 setgeom(Client *c)
       
   346 {
       
   347 	if((arrange == dotile) && !c->isfloat) {
       
   348 		c->x = &c->tx;
       
   349 		c->y = &c->ty;
       
   350 		c->w = &c->tw;
       
   351 		c->h = &c->th;
       
   352 	}
       
   353 	else {
       
   354 		c->x = &c->fx;
       
   355 		c->y = &c->fy;
       
   356 		c->w = &c->fw;
       
   357 		c->h = &c->fh;
       
   358 	}
       
   359 }
   335 }
   360 
   336 
   361 void
   337 void
   362 setsize(Client *c)
   338 setsize(Client *c)
   363 {
   339 {