[PATCH] editor: react on Enter, Tab, and Up-Down arrow keys
Kristian Høgsberg
hoegsberg at gmail.com
Mon Apr 21 15:36:53 PDT 2014
On Fri, Apr 18, 2014 at 12:52:03PM +0200, Manuel Bachmann wrote:
> This fixes :
> https://bugs.freedesktop.org/show_bug.cgi?id=77496
>
Yup, the patch looks good, thanks Manuel.
Kristian
> Regards,
> Manuel
>
>
> 2014-04-18 12:50 GMT+02:00 Manuel Bachmann <
> manuel.bachmann at open.eurogiciel.org>:
>
> > The editor will now insert new lines and tabulations when
> > pressing the corresponding keys on the virtual keyboard.
> >
> > The Up and Down arrows can be used to navigate through
> > lines.
> >
> > Signed-off-by: Manuel Bachmann <manuel.bachmann at open.eurogiciel.org>
> > ---
> > clients/editor.c | 97
> > ++++++++++++++++++++++++++++++++++++++++++++++++------
> > 1 file changed, 87 insertions(+), 10 deletions(-)
> >
> > diff --git a/clients/editor.c b/clients/editor.c
> > index 76e2346..4c5c427 100644
> > --- a/clients/editor.c
> > +++ b/clients/editor.c
> > @@ -110,6 +110,47 @@ utf8_next_char(const char *p)
> > return NULL;
> > }
> >
> > +static void
> > +move_up(const char *p, uint32_t *cursor)
> > +{
> > + const char *posr, *posr_i;
> > + char text[16];
> > +
> > + xkb_keysym_to_utf8(XKB_KEY_Return, text, sizeof(text));
> > +
> > + posr = strstr(p, text);
> > + while (posr) {
> > + if (*cursor > (unsigned)(posr-p)) {
> > + posr_i = strstr(posr+1, text);
> > + if (!posr_i || !(*cursor > (unsigned)(posr_i-p))) {
> > + *cursor = posr-p;
> > + break;
> > + }
> > + posr = posr_i;
> > + } else {
> > + break;
> > + }
> > + }
> > +}
> > +
> > +static void
> > +move_down(const char *p, uint32_t *cursor)
> > +{
> > + const char *posr;
> > + char text[16];
> > +
> > + xkb_keysym_to_utf8(XKB_KEY_Return, text, sizeof(text));
> > +
> > + posr = strstr(p, text);
> > + while (posr) {
> > + if (*cursor <= (unsigned)(posr-p)) {
> > + *cursor = posr-p + 1;
> > + break;
> > + }
> > + posr = strstr(posr+1, text);
> > + }
> > +}
> > +
> > static void text_entry_redraw_handler(struct widget *widget, void *data);
> > static void text_entry_button_handler(struct widget *widget,
> > struct input *input, uint32_t time,
> > @@ -374,6 +415,23 @@ text_input_keysym(void *data,
> > return;
> > }
> >
> > + if (key == XKB_KEY_Up ||
> > + key == XKB_KEY_Down) {
> > + if (state != WL_KEYBOARD_KEY_STATE_RELEASED)
> > + return;
> > +
> > + if (key == XKB_KEY_Up)
> > + move_up(entry->text, &entry->cursor);
> > + else
> > + move_down(entry->text, &entry->cursor);
> > +
> > + if (!(modifiers & entry->keysym.shift_mask))
> > + entry->anchor = entry->cursor;
> > + widget_schedule_redraw(entry->widget);
> > +
> > + return;
> > + }
> > +
> > if (key == XKB_KEY_BackSpace) {
> > const char *start, *end;
> >
> > @@ -395,17 +453,20 @@ text_input_keysym(void *data,
> > return;
> > }
> >
> > - switch (key) {
> > - case XKB_KEY_Tab:
> > - key_label = "Tab";
> > - break;
> > - case XKB_KEY_KP_Enter:
> > - case XKB_KEY_Return:
> > - key_label = "Enter";
> > - break;
> > - }
> > + if (key == XKB_KEY_Tab ||
> > + key == XKB_KEY_KP_Enter ||
> > + key == XKB_KEY_Return) {
> > + char text[16];
> > +
> > + if (state != WL_KEYBOARD_KEY_STATE_RELEASED)
> > + return;
> > +
> > + xkb_keysym_to_utf8(key, text, sizeof(text));
> >
> > - fprintf(stderr, "%s key was %s.\n", key_label, state_label);
> > + text_entry_insert_at_cursor(entry, text, 0, 0);
> > +
> > + return;
> > + }
> > }
> >
> > static void
> > @@ -1208,6 +1269,22 @@ key_handler(struct window *window,
> > widget_schedule_redraw(entry->widget);
> > }
> > break;
> > + case XKB_KEY_Up:
> > + text_entry_commit_and_reset(entry);
> > +
> > + move_up(entry->text, &entry->cursor);
> > + if (!(input_get_modifiers(input) & MOD_SHIFT_MASK))
> > + entry->anchor = entry->cursor;
> > + widget_schedule_redraw(entry->widget);
> > + break;
> > + case XKB_KEY_Down:
> > + text_entry_commit_and_reset(entry);
> > +
> > + move_down(entry->text, &entry->cursor);
> > + if (!(input_get_modifiers(input) & MOD_SHIFT_MASK))
> > + entry->anchor = entry->cursor;
> > + widget_schedule_redraw(entry->widget);
> > + break;
> > case XKB_KEY_Escape:
> > break;
> > default:
> > --
> > 1.7.10.4
> >
> >
>
>
> --
> Regards,
>
>
>
> *Manuel BACHMANN Tizen Project VANNES-FR*
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list