all repos — dmenu @ 504b797be8ed4535a038974355a301fbf82e2509

my build of dmenu

applied Ramils patch
Anselm R Garbe anselm@garbe.us
Sat, 29 May 2010 12:55:38 +0100
commit

504b797be8ed4535a038974355a301fbf82e2509

parent

503ca75af46d7b2756cad03b546f9570a1b57850

1 files changed, 21 insertions(+), 10 deletions(-)

jump to
M dmenu.cdmenu.c

@@ -19,6 +19,7 @@ #define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))

#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 @@

void kpress(XKeyEvent * e) { char buf[sizeof text]; - int i, num; + int i, num, off; unsigned int len; KeySym ksym;

@@ -475,13 +476,19 @@ }

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 @@ curr = prev;

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 @@ running = False;

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;