efficiency tweaks 2b92c952
Connor Lane Smith · 2011-07-14 20:03 2 file(s) · +44 −60
dmenu.c +41 −57
25 25
26 26
static void appenditem(Item *item, Item **list, Item **last);
27 27
static void calcoffsets(void);
28 +
static char *cistrstr(const char *s, const char *sub);
28 29
static void drawmenu(void);
29 -
static char *fstrstr(const char *s, const char *sub);
30 30
static void grabkeyboard(void);
31 31
static void insert(const char *str, ssize_t n);
32 32
static void keypress(XKeyEvent *ev);
60 60
static Window win;
61 61
62 62
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
63 +
static char *(*fstrstr)(const char *, const char *) = strstr;
63 64
64 65
int
65 66
main(int argc, char *argv[]) {
76 77
			topbar = False;
77 78
		else if(!strcmp(argv[i], "-f"))
78 79
			fast = True;
79 -
		else if(!strcmp(argv[i], "-i"))
80 +
		else if(!strcmp(argv[i], "-i")) {
80 81
			fstrncmp = strncasecmp;
82 +
			fstrstr = cistrstr;
83 +
		}
81 84
		else if(i+1 == argc)
82 85
			usage();
83 86
		/* double flags */
112 115
	setup();
113 116
	run();
114 117
115 -
	return EXIT_FAILURE;  /* should not reach */
118 +
	return EXIT_FAILURE; /* unreachable */
116 119
}
117 120
118 121
void
121 124
		*list = item;
122 125
	else
123 126
		(*last)->right = item;
127 +
124 128
	item->left = *last;
125 129
	item->right = NULL;
126 130
	*last = item;
143 147
			break;
144 148
}
145 149
150 +
char *
151 +
cistrstr(const char *s, const char *sub) {
152 +
	size_t len;
153 +
154 +
	for(len = strlen(sub); *s; s++)
155 +
		if(!strncasecmp(s, sub, len))
156 +
			return (char *)s;
157 +
	return NULL;
158 +
}
159 +
146 160
void
147 161
drawmenu(void) {
148 162
	int curpos;
188 202
	mapdc(dc, win, mw, mh);
189 203
}
190 204
191 -
char *
192 -
fstrstr(const char *s, const char *sub) {
193 -
	size_t len;
194 -
195 -
	for(len = strlen(sub); *s; s++)
196 -
		if(!fstrncmp(s, sub, len))
197 -
			return (char *)s;
198 -
	return NULL;
199 -
}
200 -
201 205
void
202 206
grabkeyboard(void) {
203 207
	int i;
233 237
234 238
		XConvertCase(ksym, &lower, &upper);
235 239
		switch(lower) {
236 -
		default:
237 -
			return;
238 -
		case XK_a:
239 -
			ksym = XK_Home;
240 -
			break;
241 -
		case XK_b:
242 -
			ksym = XK_Left;
243 -
			break;
244 -
		case XK_c:
245 -
			ksym = XK_Escape;
246 -
			break;
247 -
		case XK_d:
248 -
			ksym = XK_Delete;
249 -
			break;
250 -
		case XK_e:
251 -
			ksym = XK_End;
252 -
			break;
253 -
		case XK_f:
254 -
			ksym = XK_Right;
255 -
			break;
256 -
		case XK_h:
257 -
			ksym = XK_BackSpace;
258 -
			break;
259 -
		case XK_i:
260 -
			ksym = XK_Tab;
261 -
			break;
262 -
		case XK_j:
263 -
		case XK_m:
264 -
			ksym = XK_Return;
265 -
			break;
266 -
		case XK_k:  /* delete right */
240 +
		case XK_a: ksym = XK_Home;      break;
241 +
		case XK_b: ksym = XK_Left;      break;
242 +
		case XK_c: ksym = XK_Escape;    break;
243 +
		case XK_d: ksym = XK_Delete;    break;
244 +
		case XK_e: ksym = XK_End;       break;
245 +
		case XK_f: ksym = XK_Right;     break;
246 +
		case XK_h: ksym = XK_BackSpace; break;
247 +
		case XK_i: ksym = XK_Tab;       break;
248 +
		case XK_j: ksym = XK_Return;    break;
249 +
		case XK_m: ksym = XK_Return;    break;
250 +
		case XK_n: ksym = XK_Up;        break;
251 +
		case XK_p: ksym = XK_Down;      break;
252 +
253 +
		case XK_k: /* delete right */
267 254
			text[cursor] = '\0';
268 255
			match(False);
269 256
			break;
270 -
		case XK_n:
271 -
			ksym = XK_Next;
272 -
			break;
273 -
		case XK_p:
274 -
			ksym = XK_Prior;
275 -
			break;
276 -
		case XK_u:  /* delete left */
257 +
		case XK_u: /* delete left */
277 258
			insert(NULL, 0 - cursor);
278 259
			break;
279 -
		case XK_w:  /* delete word */
260 +
		case XK_w: /* delete word */
280 261
			while(cursor > 0 && text[nextrune(-1)] == ' ')
281 262
				insert(NULL, nextrune(-1) - cursor);
282 263
			while(cursor > 0 && text[nextrune(-1)] != ' ')
283 264
				insert(NULL, nextrune(-1) - cursor);
284 265
			break;
285 -
		case XK_y:  /* paste selection */
266 +
		case XK_y: /* paste selection */
286 267
			XConvertSelection(dc->dpy, XA_PRIMARY, utf8, utf8, win, CurrentTime);
268 +
			return;
269 +
		default:
287 270
			return;
288 271
		}
289 272
	}
297 280
			return;
298 281
		cursor = nextrune(+1);
299 282
	case XK_BackSpace:
300 -
		if(cursor > 0)
301 -
			insert(NULL, nextrune(-1) - cursor);
283 +
		if(cursor == 0)
284 +
			return;
285 +
		insert(NULL, nextrune(-1) - cursor);
302 286
		break;
303 287
	case XK_End:
304 288
		if(text[cursor] != '\0') {
351 335
		break;
352 336
	case XK_Return:
353 337
	case XK_KP_Enter:
354 -
		fputs((sel && !(ev->state & ShiftMask)) ? sel->text : text, stdout);
338 +
		puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
355 339
		exit(EXIT_SUCCESS);
356 340
	case XK_Right:
357 341
		if(text[cursor] != '\0') {
468 452
		switch(ev.type) {
469 453
		case Expose:
470 454
			if(ev.xexpose.count == 0)
471 -
				drawmenu();
455 +
				mapdc(dc, win, mw, mh);
472 456
			break;
473 457
		case KeyPress:
474 458
			keypress(&ev.xkey);
draw.c +3 −3
96 96
	DC *dc;
97 97
98 98
	if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
99 -
		fprintf(stderr, "no locale support\n");
99 +
		fputs("no locale support\n", stderr);
100 100
	if(!(dc = calloc(1, sizeof *dc)))
101 101
		eprintf("cannot malloc %u bytes:", sizeof *dc);
102 102
	if(!(dc->dpy = XOpenDisplay(NULL)))
153 153
	if(dc->canvas)
154 154
		XFreePixmap(dc->dpy, dc->canvas);
155 155
156 +
	dc->w = w;
157 +
	dc->h = h;
156 158
	dc->canvas = XCreatePixmap(dc->dpy, DefaultRootWindow(dc->dpy), w, h,
157 159
	                           DefaultDepth(dc->dpy, DefaultScreen(dc->dpy)));
158 -
	dc->w = w;
159 -
	dc->h = h;
160 160
}
161 161
162 162
int