comparison client.c @ 115:329fd7dae530

removed c->f{x,y,w,h} and c->t{x,y,w,h} in favor for the new rule handling remembering two kinds of geometries is unnecessary, removed the randomized (x,y) setting on dofloat startup, was kind too random und unpredictable
author arg@10ksloc.org
date Thu, 20 Jul 2006 07:26:23 +0200
parents dfa5cd0969a6
children 61490330e90a
comparison
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 {