From b238791002697efbda1ece31985ca15331511fa8 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Wed, 1 Aug 2012 14:47:20 +0100 Subject: Use enum instead of magic numbers for tracking key modifier states. Pass special keys to core (e.g. WORD_LEFT, SELECT_ALL, etc). --- framebuffer/fbtk/event.c | 37 ++++++++++++++++++++++++++++++++++--- framebuffer/fbtk/text.c | 24 ++++++++++++------------ 2 files changed, 46 insertions(+), 15 deletions(-) (limited to 'framebuffer/fbtk') diff --git a/framebuffer/fbtk/event.c b/framebuffer/fbtk/event.c index 570c82929..67f930622 100644 --- a/framebuffer/fbtk/event.c +++ b/framebuffer/fbtk/event.c @@ -34,6 +34,7 @@ #include "css/css.h" #include "desktop/browser.h" #include "desktop/plotters.h" +#include "desktop/textinput.h" #include "framebuffer/gui.h" #include "framebuffer/fbtk.h" @@ -292,16 +293,46 @@ static int sh_keymap[] = { /* exported function documented in fbtk.h */ int -fbtk_keycode_to_ucs4(int code, uint8_t mods) +fbtk_keycode_to_ucs4(int code, fbtk_modifier_type mods) { int ucs4 = -1; - if (mods) { + if (mods & FBTK_MOD_LSHIFT || mods & FBTK_MOD_RSHIFT) { if ((code >= 0) && (code < (int) NOF_ELEMENTS(sh_keymap))) ucs4 = sh_keymap[code]; - } else { + + } else if (mods == FBTK_MOD_CLEAR) { if ((code >= 0) && (code < (int) NOF_ELEMENTS(keymap))) ucs4 = keymap[code]; + + } else if (mods & FBTK_MOD_LCTRL || mods & FBTK_MOD_RCTRL) { + switch (code) { + case NSFB_KEY_a: + ucs4 = KEY_SELECT_ALL; + break; + + case NSFB_KEY_c: + ucs4 = KEY_COPY_SELECTION; + break; + + case NSFB_KEY_u: + ucs4 = KEY_CUT_LINE; + break; + + case NSFB_KEY_v: + ucs4 = KEY_PASTE; + break; + + case NSFB_KEY_x: + ucs4 = KEY_CUT_SELECTION; + break; + + case NSFB_KEY_z: + ucs4 = KEY_CLEAR_SELECTION; + break; + default: + break; + } } return ucs4; } diff --git a/framebuffer/fbtk/text.c b/framebuffer/fbtk/text.c index 60a14e596..936f3d213 100644 --- a/framebuffer/fbtk/text.c +++ b/framebuffer/fbtk/text.c @@ -262,7 +262,7 @@ static int text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) { int value; - static uint8_t modifier = 0; + static fbtk_modifier_type modifier = FBTK_MOD_CLEAR; char *temp; plot_font_style_t font_style; int fh; @@ -284,19 +284,19 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) if (cbi->event->type != NSFB_EVENT_KEY_DOWN) { switch (value) { case NSFB_KEY_RSHIFT: - modifier &= ~1; + modifier &= ~FBTK_MOD_RSHIFT; break; case NSFB_KEY_LSHIFT: - modifier &= ~(1<<1); + modifier &= ~FBTK_MOD_LSHIFT; break; case NSFB_KEY_RCTRL: - modifier &= ~(1<<2); + modifier &= ~FBTK_MOD_RCTRL; break; case NSFB_KEY_LCTRL: - modifier &= ~(1<<3); + modifier &= ~FBTK_MOD_LCTRL; break; default: @@ -328,7 +328,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) case NSFB_KEY_RIGHT: if (widget->u.text.idx < widget->u.text.len) { - if (modifier == 0) + if (modifier == FBTK_MOD_CLEAR) widget->u.text.idx++; else widget->u.text.idx = widget->u.text.len; @@ -339,7 +339,7 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) case NSFB_KEY_LEFT: if (widget->u.text.idx > 0) { - if (modifier == 0) + if (modifier == FBTK_MOD_CLEAR) widget->u.text.idx--; else widget->u.text.idx = 0; @@ -357,23 +357,23 @@ text_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) break; case NSFB_KEY_RSHIFT: - modifier |= 1; + modifier |= FBTK_MOD_RSHIFT; break; case NSFB_KEY_LSHIFT: - modifier |= 1<<1; + modifier |= FBTK_MOD_LSHIFT; break; case NSFB_KEY_RCTRL: - modifier |= 1<<2; + modifier |= FBTK_MOD_RCTRL; break; case NSFB_KEY_LCTRL: - modifier |= 1<<3; + modifier |= FBTK_MOD_LCTRL; break; default: - if (modifier & 1<<2 || modifier & 1<<3) { + if (modifier & FBTK_MOD_LCTRL || modifier & FBTK_MOD_RCTRL) { /* CTRL pressed, don't enter any text */ if (value == NSFB_KEY_u) { /* CTRL+U: clear writable */ -- cgit v1.2.3