[PATCH] editor: react on Enter, Tab, and Up-Down arrow keys

Bill Spitzak spitzak at gmail.com
Mon Apr 21 12:49:58 PDT 2014


It looks like the text actually has the bytes "Enter" at the newlines, 
rather than, say, a '\n'?

On 04/18/2014 03:52 AM, Manuel Bachmann wrote:
> This fixes :
> https://bugs.freedesktop.org/show_bug.cgi?id=77496
>
> Regards,
> Manuel
>
>
> 2014-04-18 12:50 GMT+02:00 Manuel Bachmann 
> <manuel.bachmann at open.eurogiciel.org 
> <mailto: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
>     <mailto: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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140421/67f82936/attachment.html>


More information about the wayland-devel mailing list