summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--framebuffer/fbtk/text.c42
-rw-r--r--framebuffer/fbtk/widget.h2
2 files changed, 33 insertions, 11 deletions
diff --git a/framebuffer/fbtk/text.c b/framebuffer/fbtk/text.c
index 27968148f..f262546e2 100644
--- a/framebuffer/fbtk/text.c
+++ b/framebuffer/fbtk/text.c
@@ -238,7 +238,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
/* gain focus */
if (widget->u.text.text == NULL)
widget->u.text.text = calloc(1,1);
- widget->u.text.idx = strlen(widget->u.text.text);
+ widget->u.text.idx = widget->u.text.len;
fbtk_request_redraw(widget);
@@ -267,18 +267,30 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
case NSFB_KEY_BACKSPACE:
if (widget->u.text.idx <= 0)
break;
+ memmove(widget->u.text.text + widget->u.text.idx - 1,
+ widget->u.text.text + widget->u.text.idx,
+ widget->u.text.len - widget->u.text.idx);
widget->u.text.idx--;
- widget->u.text.text[widget->u.text.idx] = 0;
+ widget->u.text.len--;
+ widget->u.text.text[widget->u.text.len] = 0;
break;
case NSFB_KEY_RETURN:
widget->u.text.enter(widget->u.text.pw, widget->u.text.text);
break;
- case NSFB_KEY_PAGEUP:
- case NSFB_KEY_PAGEDOWN:
case NSFB_KEY_RIGHT:
+ if (widget->u.text.idx < widget->u.text.len)
+ widget->u.text.idx++;
+ break;
+
case NSFB_KEY_LEFT:
+ if (widget->u.text.idx > 0)
+ widget->u.text.idx--;
+ break;
+
+ case NSFB_KEY_PAGEUP:
+ case NSFB_KEY_PAGEDOWN:
case NSFB_KEY_UP:
case NSFB_KEY_DOWN:
/* Not handling any of these correctly yet, but avoid putting
@@ -295,14 +307,21 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
default:
/* allow for new character and null */
- temp = realloc(widget->u.text.text, widget->u.text.idx + 2);
- if (temp != NULL) {
- widget->u.text.text = temp;
- widget->u.text.text[widget->u.text.idx] = fbtk_keycode_to_ucs4(value, modifier);
- widget->u.text.text[widget->u.text.idx + 1] = '\0';
- widget->u.text.idx++;
+ temp = realloc(widget->u.text.text, widget->u.text.len + 2);
+ if (temp == NULL) {
+ break;
}
+ widget->u.text.text = temp;
+ memmove(widget->u.text.text + widget->u.text.idx + 1,
+ widget->u.text.text + widget->u.text.idx,
+ widget->u.text.len - widget->u.text.idx);
+ widget->u.text.text[widget->u.text.idx] =
+ fbtk_keycode_to_ucs4(value, modifier);
+ widget->u.text.idx++;
+ widget->u.text.len++;
+ widget->u.text.text[widget->u.text.len] = '\0';
+
break;
}
@@ -333,7 +352,8 @@ fbtk_set_text(fbtk_widget_t *widget, const char *text)
free(widget->u.text.text);
}
widget->u.text.text = strdup(text);
- widget->u.text.idx = strlen(text);
+ widget->u.text.len = strlen(text);
+ widget->u.text.idx = widget->u.text.len;
fbtk_request_redraw(widget);
}
diff --git a/framebuffer/fbtk/widget.h b/framebuffer/fbtk/widget.h
index e31fa117d..3521cc358 100644
--- a/framebuffer/fbtk/widget.h
+++ b/framebuffer/fbtk/widget.h
@@ -183,6 +183,8 @@ struct fbtk_widget_s {
fbtk_enter_t enter;
void *pw;
int idx;
+ int len;
+ int width;
} text;
/* application driven widget */