implemented draw_client stuff 83d23908
Anselm R. Garbe · 2006-07-11 23:18 3 file(s) · +58 −20
client.c +49 −15
37 37
		}
38 38
	}
39 39
	XFree(name.value);
40 -
	if(c == stack)
41 -
		draw_bar();
42 -
	else
43 -
		draw_client(c);
44 40
}
45 41
46 42
void
51 47
	if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
52 48
		size.flags = PSize;
53 49
	c->flags = size.flags;
54 -
	c->basew = size.base_width;
55 -
	c->baseh = size.base_height;
56 -
	c->incw = size.width_inc;
57 -
	c->inch = size.height_inc;
58 -
	c->maxw = size.max_width;
59 -
	c->maxh = size.max_height;
60 -
	c->minw = size.min_width;
61 -
	c->minh = size.min_height;
50 +
	if(c->flags & PBaseSize) {
51 +
		c->basew = size.base_width;
52 +
		c->baseh = size.base_height;
53 +
	}
54 +
	else
55 +
		c->basew = c->baseh = 0;
56 +
	if(c->flags & PResizeInc) {
57 +
		c->incw = size.width_inc;
58 +
		c->inch = size.height_inc;
59 +
	}
60 +
	else
61 +
		c->incw = c->inch = 0;
62 +
	if(c->flags & PMaxSize) {
63 +
		c->maxw = size.max_width;
64 +
		c->maxh = size.max_height;
65 +
	}
66 +
	else
67 +
		c->maxw = c->maxh = 0;
68 +
	if(c->flags & PMinSize) {
69 +
		c->minw = size.min_width;
70 +
		c->minh = size.min_height;
71 +
	}
72 +
	else
73 +
		c->minw = c->minh = 0;
62 74
}
63 75
64 76
void
65 77
focus(Client *c)
66 78
{
67 -
	Client **l;
79 +
	Client **l, *old;
80 +
81 +
	old = stack;
68 82
	for(l=&stack; *l && *l != c; l=&(*l)->snext);
69 83
	eassert(*l == c);
70 84
	*l = c->snext;
71 85
	c->snext = stack;
72 86
	stack = c;
73 87
	XRaiseWindow(dpy, c->win);
88 +
	XRaiseWindow(dpy, c->title);
74 89
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
90 +
	if(old && old != c) {
91 +
		XMapWindow(dpy, old->title);
92 +
		draw_client(old);
93 +
	}
94 +
	XUnmapWindow(dpy, c->title);
95 +
	draw_bar();
75 96
	XFlush(dpy);
76 97
}
77 98
91 112
	XSetWindowBorderWidth(dpy, c->win, 1);
92 113
	XSelectInput(dpy, c->win, CLIENT_MASK);
93 114
	XGetTransientForHint(dpy, c->win, &c->trans);
94 -
	update_name(c);
95 115
	twa.override_redirect = 1;
96 116
	twa.background_pixmap = ParentRelative;
97 117
	twa.event_mask = ExposureMask;
100 120
			0, DefaultDepth(dpy, screen), CopyFromParent,
101 121
			DefaultVisual(dpy, screen),
102 122
			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
123 +
	update_name(c);
103 124
104 125
	for(l=&clients; *l; l=&(*l)->next);
105 126
	c->next = *l; /* *l == nil */
107 128
	c->snext = stack;
108 129
	stack = c;
109 130
	XMapWindow(dpy, c->win);
131 +
	XMapWindow(dpy, c->title);
110 132
	XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
111 133
			GrabModeAsync, GrabModeSync, None, None);
112 134
	XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
113 135
			GrabModeAsync, GrabModeSync, None, None);
114 136
	XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
115 137
			GrabModeAsync, GrabModeSync, None, None);
138 +
	resize(c);
116 139
	focus(c);
117 140
}
118 141
122 145
	XConfigureEvent e;
123 146
124 147
	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
148 +
	XMoveResizeWindow(dpy, c->title, c->x + c->w / 3, c->y, 2 * c->w / 3, barrect.height);
125 149
	e.type = ConfigureNotify;
126 150
	e.event = c->win;
127 151
	e.window = c->win;
186 210
void
187 211
draw_client(Client *c)
188 212
{
189 -
	
213 +
	if(!c)
214 +
		return;
215 +
	if(c == stack)
216 +
		draw_bar();
190 217
218 +
	brush.rect.x = brush.rect.y = 0;
219 +
	brush.rect.width = 2 * c->w / 3;
220 +
	brush.rect.height = barrect.height;
191 221
222 +
	draw(dpy, &brush, True, c->name);
223 +
	XCopyArea(dpy, brush.drawable, c->title, brush.gc, 0, 0,
224 +
			brush.rect.width, brush.rect.height, 0, 0);
225 +
	XFlush(dpy);
192 226
}
event.c +4 −1
143 143
expose(XEvent *e)
144 144
{
145 145
	XExposeEvent *ev = &e->xexpose;
146 +
	Client *c;
146 147
147 148
	if(ev->count == 0) {
148 -
		if(ev->window == barwin)
149 +
		if((c = getclient(ev->window)))
150 +
			draw_client(c);
151 +
		else if(ev->window == barwin)
149 152
			draw_bar();
150 153
	}
151 154
}
wm.c +5 −4
245 245
246 246
	update_keys();
247 247
248 -
	brush.drawable = XCreatePixmap(dpy, root, rect.width, rect.height,
249 -
			DefaultDepth(dpy, screen));
250 -
	brush.gc = XCreateGC(dpy, root, 0, 0);
251 -
252 248
	/* style */
253 249
	loadcolors(dpy, screen, &brush, BGCOLOR, FGCOLOR, BORDERCOLOR);
254 250
	loadfont(dpy, &brush.font, FONT);
266 262
			CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
267 263
	XDefineCursor(dpy, barwin, cursor[CurNormal]);
268 264
	XMapRaised(dpy, barwin);
265 +
266 +
	brush.drawable = XCreatePixmap(dpy, root, rect.width, barrect.height,
267 +
			DefaultDepth(dpy, screen));
268 +
	brush.gc = XCreateGC(dpy, root, 0, 0);
269 +
269 270
	pipe_spawn(statustext, sizeof(statustext), dpy, (char **)status);
270 271
	draw_bar();
271 272