diff options
Diffstat (limited to '')
| -rw-r--r-- | dmenu.c | 31 | 
1 files changed, 21 insertions, 10 deletions
@@ -19,6 +19,7 @@  #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))  #define MIN(a, b)               ((a) < (b) ? (a) : (b))  #define MAX(a, b)               ((a) > (b) ? (a) : (b)) +#define IS_UTF8_1ST_CHAR(c)     ((((c) & 0xc0) == 0xc0) || !((c) & 0x80))  /* enums */  enum { ColFG, ColBG, ColLast }; @@ -360,7 +361,7 @@ initfont(const char *fontstr) {  void  kpress(XKeyEvent * e) {  	char buf[sizeof text]; -	int i, num; +	int i, num, off;  	unsigned int len;  	KeySym ksym; @@ -475,13 +476,19 @@ kpress(XKeyEvent * e) {  		break;  	case XK_BackSpace:  		if(cursor > 0) { -			memmove(text + cursor - 1, text + cursor, sizeof text - cursor + 1); -			cursor--; +			off = 1; +			while(cursor > off && !IS_UTF8_1ST_CHAR(text[cursor - off])) +				off++; +			memmove(text + cursor - off, text + cursor, sizeof text - cursor + off); +			cursor -= off;  			match(text);  		}  		break;  	case XK_Delete: -		memmove(text + cursor, text + cursor + 1, sizeof text - cursor); +		off = 1; +		while(cursor + off < sizeof text - 1 && !IS_UTF8_1ST_CHAR(text[cursor + off])) +			off++; +		memmove(text + cursor, text + cursor + off, sizeof text - cursor);  		match(text);  		break;  	case XK_End: @@ -517,9 +524,11 @@ kpress(XKeyEvent * e) {  				calcoffsets();  			}  		} -		else if(cursor > 0) -			cursor--; -		else +		else if(cursor > 0) { +			do { +				cursor--; +			} while(cursor > 0 && !IS_UTF8_1ST_CHAR(text[cursor])); +		} else  			return;  		break;  	case XK_Next: @@ -544,9 +553,11 @@ kpress(XKeyEvent * e) {  		break;  	case XK_Right:  	case XK_Down: -		if(cursor < len) -			cursor++; -		else if(sel && sel->right) { +		if(cursor < len) { +			do { +				cursor++; +			} while(cursor < len && !IS_UTF8_1ST_CHAR(text[cursor])); +		} else if(sel && sel->right) {  			sel=sel->right;  			if(sel == next) {  				curr = next;  | 
