Fix handling of input strings b6d2cc9a
Hiltjo Posthuma · 2018-03-16 16:51 1 file(s) · +21 −14
dmenu.c +21 −14
308 308
{
309 309
	char buf[32];
310 310
	int len;
311 -
	KeySym ksym = NoSymbol;
311 +
	KeySym ksym;
312 312
	Status status;
313 313
314 314
	len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
315 -
	if (status == XBufferOverflow)
315 +
	switch (status) {
316 +
	default: /* XLookupNone, XBufferOverflow */
316 317
		return;
317 -
	if (ev->state & ControlMask)
318 +
	case XLookupChars:
319 +
		goto insert;
320 +
	case XLookupKeySym:
321 +
	case XLookupBoth:
322 +
		break;
323 +
	}
324 +
325 +
	if (ev->state & ControlMask) {
318 326
		switch(ksym) {
319 327
		case XK_a: ksym = XK_Home;      break;
320 328
		case XK_b: ksym = XK_Left;      break;
352 360
			return;
353 361
		case XK_Left:
354 362
			movewordedge(-1);
355 -
			ksym = NoSymbol;
356 -
			break;
363 +
			goto draw;
357 364
		case XK_Right:
358 365
			movewordedge(+1);
359 -
			ksym = NoSymbol;
360 -
			break;
366 +
			goto draw;
361 367
		case XK_Return:
362 368
		case XK_KP_Enter:
363 369
			break;
367 373
		default:
368 374
			return;
369 375
		}
370 -
	else if (ev->state & Mod1Mask)
376 +
	} else if (ev->state & Mod1Mask) {
371 377
		switch(ksym) {
372 378
		case XK_b:
373 379
			movewordedge(-1);
374 -
			ksym = NoSymbol;
375 -
			break;
380 +
			goto draw;
376 381
		case XK_f:
377 382
			movewordedge(+1);
378 -
			ksym = NoSymbol;
379 -
			break;
383 +
			goto draw;
380 384
		case XK_g: ksym = XK_Home;  break;
381 385
		case XK_G: ksym = XK_End;   break;
382 386
		case XK_h: ksym = XK_Up;    break;
386 390
		default:
387 391
			return;
388 392
		}
393 +
	}
394 +
389 395
	switch(ksym) {
390 396
	default:
397 +
insert:
391 398
		if (!iscntrl(*buf))
392 399
			insert(buf, len);
393 -
		break;
394 -
	case NoSymbol:
395 400
		break;
396 401
	case XK_Delete:
397 402
		if (text[cursor] == '\0')
489 494
		match();
490 495
		break;
491 496
	}
497 +
498 +
draw:
492 499
	drawmenu();
493 500
}
494 501