applied Connor's patch, thanks! 37236f88
Anselm R Garbe · 2010-03-07 08:32 1 file(s) · +33 −44
dmenu.c +33 −44
52 52
static void calcoffsetsv(void);
53 53
static char *cistrstr(const char *s, const char *sub);
54 54
static void cleanup(void);
55 +
static void drawmenu(void);
55 56
static void drawmenuh(void);
56 57
static void drawmenuv(void);
57 58
static void drawtext(const char *text, unsigned long col[ColLast]);
95 96
static Bool vlist = False;
96 97
static unsigned int lines = 5;
97 98
static void (*calcoffsets)(void) = calcoffsetsh;
98 -
static void (*drawmenu)(void) = drawmenuh;
99 99
100 100
void
101 101
appenditem(Item *i, Item **list, Item **last) {
200 200
201 201
void
202 202
drawcursor(void) {
203 -
	XRectangle r = { dc.x, dc.y + 2, 1, dc.h - 4 };
203 +
	XRectangle r = { dc.x, dc.y + 2, 1, dc.font.height - 2 };
204 204
205 205
	r.x += textnw(text, cursor) + dc.font.height / 2;
206 206
209 209
}
210 210
211 211
void
212 -
drawmenuh(void) {
213 -
	Item *i;
214 -
212 +
drawmenu(void) {
215 213
	dc.x = 0;
216 214
	dc.y = 0;
217 215
	dc.w = mw;
231 229
	drawcursor();
232 230
	dc.x += cmdw;
233 231
	if(curr) {
234 -
		dc.w = spaceitem;
235 -
		drawtext((curr && curr->left) ? "<" : NULL, dc.norm);
236 -
		dc.x += dc.w;
237 -
		/* determine maximum items */
238 -
		for(i = curr; i != next; i=i->right) {
239 -
			dc.w = textw(i->text);
240 -
			if(dc.w > mw / 3)
241 -
				dc.w = mw / 3;
242 -
			drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
243 -
			dc.x += dc.w;
244 -
		}
245 -
		dc.x = mw - spaceitem;
246 -
		dc.w = spaceitem;
247 -
		drawtext(next ? ">" : NULL, dc.norm);
232 +
		if(vlist)
233 +
			drawmenuv();
234 +
		else
235 +
			drawmenuh();
248 236
	}
249 237
	XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
250 238
	XFlush(dpy);
251 239
}
252 240
253 241
void
242 +
drawmenuh(void) {
243 +
	Item *i;
244 +
245 +
	dc.w = spaceitem;
246 +
	drawtext((curr && curr->left) ? "<" : NULL, dc.norm);
247 +
	dc.x += dc.w;
248 +
	/* determine maximum items */
249 +
	for(i = curr; i != next; i=i->right) {
250 +
		dc.w = textw(i->text);
251 +
		if(dc.w > mw / 3)
252 +
			dc.w = mw / 3;
253 +
		drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
254 +
		dc.x += dc.w;
255 +
	}
256 +
	dc.x = mw - spaceitem;
257 +
	dc.w = spaceitem;
258 +
	drawtext(next ? ">" : NULL, dc.norm);
259 +
}
260 +
261 +
void
254 262
drawmenuv(void) {
255 263
	Item *i;
256 264
257 265
	dc.x = 0;
258 -
	dc.y = 0;
259 266
	dc.w = mw;
260 -
	dc.h = mh;
261 -
	drawtext(NULL, dc.norm);
262 -
	/* print prompt? */
263 -
	if(promptw) {
264 -
		dc.w = promptw;
265 -
		drawtext(prompt, dc.sel);
266 -
	}
267 -
	dc.x += promptw;
268 -
	dc.w = mw - promptw;
269 -
	/* print command */
270 -
	drawtext(text[0] ? text : NULL, dc.norm);
271 -
	if(curr) {
272 -
		dc.x = 0;
273 -
		dc.w = mw;
267 +
	dc.y += dc.font.height + 2;
268 +
	/* determine maximum items */
269 +
	for(i = curr; i != next; i=i->right) {
270 +
		drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
274 271
		dc.y += dc.font.height + 2;
275 -
		/* determine maximum items */
276 -
		for(i = curr; i != next; i=i->right) {
277 -
			drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
278 -
			dc.y += dc.font.height + 2;
279 -
		}
280 -
		drawtext(NULL, dc.norm);
281 272
	}
282 -
	XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
283 -
	XFlush(dpy);
273 +
	drawtext(NULL, dc.norm);
284 274
}
285 275
286 276
void
786 776
		else if(!strcmp(argv[i], "-l")) {
787 777
			vlist = True;
788 778
			calcoffsets = calcoffsetsv;
789 -
			drawmenu = drawmenuv;
790 -
			if(++i < argc) lines += atoi(argv[i]);
779 +
			if(++i < argc) lines = atoi(argv[i]);
791 780
		}
792 781
		else if(!strcmp(argv[i], "-fn")) {
793 782
			if(++i < argc) font = argv[i];