Fix handling of input strings
This commit is contained in:
		
							
								
								
									
										35
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								dmenu.c
									
									
									
									
									
								
							@@ -308,13 +308,21 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
{
 | 
			
		||||
	char buf[32];
 | 
			
		||||
	int len;
 | 
			
		||||
	KeySym ksym = NoSymbol;
 | 
			
		||||
	KeySym ksym;
 | 
			
		||||
	Status status;
 | 
			
		||||
 | 
			
		||||
	len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
 | 
			
		||||
	if (status == XBufferOverflow)
 | 
			
		||||
	switch (status) {
 | 
			
		||||
	default: /* XLookupNone, XBufferOverflow */
 | 
			
		||||
		return;
 | 
			
		||||
	if (ev->state & ControlMask)
 | 
			
		||||
	case XLookupChars:
 | 
			
		||||
		goto insert;
 | 
			
		||||
	case XLookupKeySym:
 | 
			
		||||
	case XLookupBoth:
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (ev->state & ControlMask) {
 | 
			
		||||
		switch(ksym) {
 | 
			
		||||
		case XK_a: ksym = XK_Home;      break;
 | 
			
		||||
		case XK_b: ksym = XK_Left;      break;
 | 
			
		||||
@@ -352,12 +360,10 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
			return;
 | 
			
		||||
		case XK_Left:
 | 
			
		||||
			movewordedge(-1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
			goto draw;
 | 
			
		||||
		case XK_Right:
 | 
			
		||||
			movewordedge(+1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
			goto draw;
 | 
			
		||||
		case XK_Return:
 | 
			
		||||
		case XK_KP_Enter:
 | 
			
		||||
			break;
 | 
			
		||||
@@ -367,16 +373,14 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
		default:
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	else if (ev->state & Mod1Mask)
 | 
			
		||||
	} else if (ev->state & Mod1Mask) {
 | 
			
		||||
		switch(ksym) {
 | 
			
		||||
		case XK_b:
 | 
			
		||||
			movewordedge(-1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
			goto draw;
 | 
			
		||||
		case XK_f:
 | 
			
		||||
			movewordedge(+1);
 | 
			
		||||
			ksym = NoSymbol;
 | 
			
		||||
			break;
 | 
			
		||||
			goto draw;
 | 
			
		||||
		case XK_g: ksym = XK_Home;  break;
 | 
			
		||||
		case XK_G: ksym = XK_End;   break;
 | 
			
		||||
		case XK_h: ksym = XK_Up;    break;
 | 
			
		||||
@@ -386,13 +390,14 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
		default:
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch(ksym) {
 | 
			
		||||
	default:
 | 
			
		||||
insert:
 | 
			
		||||
		if (!iscntrl(*buf))
 | 
			
		||||
			insert(buf, len);
 | 
			
		||||
		break;
 | 
			
		||||
	case NoSymbol:
 | 
			
		||||
		break;
 | 
			
		||||
	case XK_Delete:
 | 
			
		||||
		if (text[cursor] == '\0')
 | 
			
		||||
			return;
 | 
			
		||||
@@ -489,6 +494,8 @@ keypress(XKeyEvent *ev)
 | 
			
		||||
		match();
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
draw:
 | 
			
		||||
	drawmenu();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user