--- dml-0.1.6/src/pi.h.old 2007-10-05 09:37:17.000000000 +0200 +++ dml-0.1.6/src/pi.h 2007-10-05 10:12:18.000000000 +0200 @@ -139,7 +139,7 @@ PI_COMMON_DATA(pi_input); char *buf; - int top, cur, blen; + int top, cur, cur_utf8, blen; int deadly, pass, res; }; @@ -230,6 +230,9 @@ void pi_frame(int x, int y, int w, int h); void pi_putch(int c); unsigned char *pi_putch_utf8(unsigned char *c); +int pi_strlen(char *c); +char *pi_bskip_char(char *begin, char *c); +char *pi_skip_char(char *c, char *end); void pi_addstr(const char *c); void pi_addstrn(const char *c, int n); void pi_addstrn_fill(const char *c, int n); --- dml-0.1.6/src/input.c.old 2007-10-05 09:26:45.000000000 +0200 +++ dml-0.1.6/src/input.c 2007-10-05 11:36:12.000000000 +0200 @@ -11,8 +11,8 @@ void pi_input_draw(struct pi_input *self) { - int i, n, w, a = 0, x, y; - + int i, n, n2, w, a = 0, x, y; + pi_locate((struct pi_object*)self, &x, &y); if ((self->buf[0] == 0) || (self->pass==1)) { @@ -20,7 +20,7 @@ pi_is_active((struct pi_object*)self) ? pi_color_input_hl : pi_color_input); if (self->buf[0] == 0) - self->top = self->cur = 0; + self->top = self->cur = self->cur_utf8 = 0; n = self->pos.w; @@ -35,20 +35,25 @@ pi_goto(x, y); return; } - + n = strlen(self->buf); + n2 = pi_strlen(self->buf); if (self->top > n) self->top = 0; if (self->cur > n) self->cur = n; + if (self->cur_utf8 > n2) + self->cur_utf8 = n2; + n -= self->top; + n2 -= self->top; w = self->pos.w; if (self->top) { w--; pi_color(pi_color_input_arrow); pi_putch('<'); } - if (n > w) { + if (n2 > w) { w--; /* for '>' */ a = 1; } @@ -58,10 +63,10 @@ self->deadly ? pi_color_input_deadly : pi_color_input_hl : pi_color_input); - if (n >= w) { + if (n2 >= w) { if (self->pass) { - for(n=w;n>0;n--) + for(n2=w;n2>0;n2--) pi_putch('*'); } else @@ -74,7 +79,7 @@ } else { if (self->pass) { - for (i=n;i>0;i--) + for (i=n2;i>0;i--) pi_putch('*'); } else @@ -83,11 +88,11 @@ pi_color(self->ghosted ? pi_color_input_ghosted : pi_is_active((struct pi_object*)self) ? pi_color_input_hl : pi_color_input); - n = w - n; - while (n--) + n2 = w - n2; + while (n2--) pi_putch(' '); } - pi_goto(x + self->cur - self->top + (self->top != 0), y); + pi_goto(x + self->cur_utf8 - self->top + (self->top != 0), y); } void pi_input_kill(struct pi_input *self) @@ -105,36 +110,48 @@ void pi_input_key(struct pi_input *self, int key) { - char *p; + char *p, *p2; int n; - + /* p is char under cursor */ p = self->buf + self->cur; switch (key) { case pi_key_left: - if (self->cur) - self->cur--; + if (self->cur_utf8 > 0) { + self->cur_utf8--; + p = pi_bskip_char(self->buf, p); + self->cur = p - self->buf; + } break; case pi_key_right: - if (*p) - self->cur++; + if (*p) { + self->cur_utf8++; + p = pi_skip_char(p, p + 7); + self->cur = p - self->buf; + } break; case '\b': if (self->cur == 0) break; - self->cur--; - p--; + p2 = pi_bskip_char(self->buf, p); + self->cur = p2 - self->buf; + self->cur_utf8--; + memmove(p2, p, strlen(p2)); + break; case pi_key_del: - if (p && *p) - memmove(p, p + 1, strlen(p)); + if (p && *p) { + p2 = pi_skip_char(p, p + 7); + memmove(p, p2, strlen(p)); + } dead(self); break; case pi_key_home: - self->cur = 0; + self->cur = self->cur_utf8 = 0; break; case pi_key_end: self->cur = strlen(self->buf); + self->cur_utf8 = pi_strlen(self->buf); break; default: if ((key == '\n') && (self->res != 0)) @@ -152,24 +169,31 @@ p = self->buf + self->cur; memmove(p + 1, p, strlen(p) + 1); *p = key; + self->cur++; + self->cur_utf8++; } else { pi_object_key((struct pi_object*)self, key); return; } } - if (self->cur > (int)strlen(self->buf)) - self->cur = strlen(self->buf); - + self->cur = strlen(self->buf); + if (self->cur_utf8 > (int)pi_strlen(self->buf)) + self->cur_utf8 = pi_strlen(self->buf); if (self->cur < 0) self->cur = 0; if (self->top > self->cur) self->top = self->cur; - - if (self->cur - self->top > self->pos.w - 2) - self->top = self->cur - self->pos.w + 2; - else if (self->cur - self->top == self->pos.w - 2 && + + if (self->cur_utf8 < 0) + self->cur_utf8 = 0; + if (self->top > self->cur_utf8) + self->top = self->cur_utf8; + + if (self->cur_utf8 - self->top > self->pos.w - 2) + self->top = self->cur_utf8 - self->pos.w + 2; + else if (self->cur_utf8 - self->top == self->pos.w - 2 && self->buf[self->cur]) self->top++; self->deadly = 0; --- dml-0.1.6/src/slang.c.old 2007-10-05 09:38:02.000000000 +0200 +++ dml-0.1.6/src/slang.c 2007-10-05 11:35:38.000000000 +0200 @@ -263,6 +263,21 @@ } } +int pi_strlen(char *c) +{ + return pi_utf8 ? SLutf8_strlen(c, 0) : strlen(c); +} + +char *pi_bskip_char(char *begin, char *c) +{ + return pi_utf8 ? SLutf8_bskip_char(begin, c) : --c; +} + +char *pi_skip_char(char *c, char *end) +{ + return pi_utf8 ? SLutf8_skip_char(c, end) : ++c; +} + void pi_addstr(const char *c) { SLsmg_write_string((char*)c);