readded draw.c again (except getcolor and setfont) a1913a6a
Anselm R. Garbe · 2007-02-20 13:54 5 file(s) · +77 −67
Makefile +1 −1
3 3
4 4
include config.mk
5 5
6 -
SRC = main.c util.c
6 +
SRC = draw.c main.c util.c
7 7
OBJ = ${SRC:.c=.o}
8 8
9 9
all: options dmenu
dmenu.h +5 −0
38 38
extern Display *dpy;
39 39
extern DC dc;			/* global drawing context */
40 40
41 +
/* draw.c */
42 +
extern void drawtext(const char *text, unsigned long col[ColLast]);
43 +
extern unsigned int textw(const char *text);
44 +
extern unsigned int textnw(const char *text, unsigned int len);
45 +
41 46
/* util.c */
42 47
extern void *emalloc(unsigned int size);		/* allocates memory, exits on error */
43 48
extern void eprint(const char *errstr, ...);		/* prints errstr and exits with 1 */
draw.c (added) +71 −0
1 +
/* (C)opyright MMVI-MMVII Anselm R. Garbe <garbeam at gmail dot com>
2 +
 * (C)opyright MMVI-MMVII Sander van Dijk <a dot h dot vandijk at gmail dot com>
3 +
 * See LICENSE file for license details.
4 +
 */
5 +
#include "dmenu.h"
6 +
#include <string.h>
7 +
8 +
/* extern */
9 +
10 +
void
11 +
drawtext(const char *text, unsigned long col[ColLast]) {
12 +
	int x, y, w, h;
13 +
	static char buf[256];
14 +
	unsigned int len, olen;
15 +
	XGCValues gcv;
16 +
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
17 +
18 +
	XSetForeground(dpy, dc.gc, col[ColBG]);
19 +
	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
20 +
	if(!text)
21 +
		return;
22 +
	w = 0;
23 +
	olen = len = strlen(text);
24 +
	if(len >= sizeof buf)
25 +
		len = sizeof buf - 1;
26 +
	memcpy(buf, text, len);
27 +
	buf[len] = 0;
28 +
	h = dc.font.ascent + dc.font.descent;
29 +
	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
30 +
	x = dc.x + (h / 2);
31 +
	/* shorten text if necessary */
32 +
	while(len && (w = textnw(buf, len)) > dc.w - h)
33 +
		buf[--len] = 0;
34 +
	if(len < olen) {
35 +
		if(len > 1)
36 +
			buf[len - 1] = '.';
37 +
		if(len > 2)
38 +
			buf[len - 2] = '.';
39 +
		if(len > 3)
40 +
			buf[len - 3] = '.';
41 +
	}
42 +
	if(w > dc.w)
43 +
		return; /* too long */
44 +
	gcv.foreground = col[ColFG];
45 +
	if(dc.font.set) {
46 +
		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
47 +
		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc,
48 +
				x, y, buf, len);
49 +
	}
50 +
	else {
51 +
		gcv.font = dc.font.xfont->fid;
52 +
		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
53 +
		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
54 +
	}
55 +
}
56 +
57 +
unsigned int
58 +
textw(const char *text) {
59 +
	return textnw(text, strlen(text)) + dc.font.height;
60 +
}
61 +
62 +
unsigned int
63 +
textnw(const char *text, unsigned int len) {
64 +
	XRectangle r;
65 +
66 +
	if(dc.font.set) {
67 +
		XmbTextExtents(dc.font.set, text, len, NULL, &r);
68 +
		return r.width;
69 +
	}
70 +
	return XTextWidth(dc.font.xfont, text, len);
71 +
}
main.c +0 −64
3 3
 * See LICENSE file for license details.
4 4
 */
5 5
#include "dmenu.h"
6 -
7 6
#include <ctype.h>
8 7
#include <locale.h>
9 8
#include <stdlib.h>
42 41
static Window root;
43 42
static Window win;
44 43
45 -
static unsigned int
46 -
textnw(const char *text, unsigned int len) {
47 -
	XRectangle r;
48 -
49 -
	if(dc.font.set) {
50 -
		XmbTextExtents(dc.font.set, text, len, NULL, &r);
51 -
		return r.width;
52 -
	}
53 -
	return XTextWidth(dc.font.xfont, text, len);
54 -
}
55 -
56 -
static unsigned int
57 -
textw(const char *text) {
58 -
	return textnw(text, strlen(text)) + dc.font.height;
59 -
}
60 -
61 44
static void
62 45
calcoffsets(void) {
63 46
	unsigned int tw, w;
81 64
		w += tw;
82 65
		if(w > mw)
83 66
			break;
84 -
	}
85 -
}
86 -
87 -
static void
88 -
drawtext(const char *text, unsigned long col[ColLast]) {
89 -
	int x, y, w, h;
90 -
	static char buf[256];
91 -
	unsigned int len, olen;
92 -
	XGCValues gcv;
93 -
	XRectangle r = { dc.x, dc.y, dc.w, dc.h };
94 -
95 -
	XSetForeground(dpy, dc.gc, col[ColBG]);
96 -
	XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
97 -
	if(!text)
98 -
		return;
99 -
	w = 0;
100 -
	olen = len = strlen(text);
101 -
	if(len >= sizeof buf)
102 -
		len = sizeof buf - 1;
103 -
	memcpy(buf, text, len);
104 -
	buf[len] = 0;
105 -
	h = dc.font.ascent + dc.font.descent;
106 -
	y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
107 -
	x = dc.x + (h / 2);
108 -
	/* shorten text if necessary */
109 -
	while(len && (w = textnw(buf, len)) > dc.w - h)
110 -
		buf[--len] = 0;
111 -
	if(len < olen) {
112 -
		if(len > 1)
113 -
			buf[len - 1] = '.';
114 -
		if(len > 2)
115 -
			buf[len - 2] = '.';
116 -
		if(len > 3)
117 -
			buf[len - 3] = '.';
118 -
	}
119 -
	if(w > dc.w)
120 -
		return; /* too long */
121 -
	gcv.foreground = col[ColFG];
122 -
	if(dc.font.set) {
123 -
		XChangeGC(dpy, dc.gc, GCForeground, &gcv);
124 -
		XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc,
125 -
				x, y, buf, len);
126 -
	}
127 -
	else {
128 -
		gcv.font = dc.font.xfont->fid;
129 -
		XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
130 -
		XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
131 67
	}
132 68
}
133 69
util.c +0 −2
6 6
#include <stdio.h>
7 7
#include <stdlib.h>
8 8
#include <string.h>
9 -
#include <sys/wait.h>
10 -
#include <unistd.h>
11 9
12 10
void *
13 11
emalloc(unsigned int size) {