[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