summaryrefslogtreecommitdiff
path: root/framebuffer/gui.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2012-08-01 14:47:20 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2012-08-01 14:47:20 +0100
commitb238791002697efbda1ece31985ca15331511fa8 (patch)
tree099a9c336f66ada1daff6642649d1059505ea571 /framebuffer/gui.c
parent46527795dbf69f08d55692fa1ca85b54a6bcc4dc (diff)
downloadnetsurf-b238791002697efbda1ece31985ca15331511fa8.tar.gz
netsurf-b238791002697efbda1ece31985ca15331511fa8.tar.bz2
Use enum instead of magic numbers for tracking key modifier states. Pass special keys to core (e.g. WORD_LEFT, SELECT_ALL, etc).
Diffstat (limited to 'framebuffer/gui.c')
-rw-r--r--framebuffer/gui.c90
1 files changed, 75 insertions, 15 deletions
diff --git a/framebuffer/gui.c b/framebuffer/gui.c
index 286f26357..c451bc8b9 100644
--- a/framebuffer/gui.c
+++ b/framebuffer/gui.c
@@ -688,7 +688,7 @@ static int
fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
{
struct gui_window *gw = cbi->context;
- static uint8_t modifier = 0;
+ static fbtk_modifier_type modifier = FBTK_MOD_CLEAR;
int ucs4 = -1;
LOG(("got value %d", cbi->event->value.keycode));
@@ -698,41 +698,93 @@ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
switch (cbi->event->value.keycode) {
case NSFB_KEY_PAGEUP:
- if (browser_window_key_press(gw->bw, KEY_PAGE_UP) == false)
- widget_scroll_y(gw, -fbtk_get_height(gw->browser), false);
+ if (browser_window_key_press(gw->bw,
+ KEY_PAGE_UP) == false)
+ widget_scroll_y(gw, -fbtk_get_height(
+ gw->browser), false);
break;
case NSFB_KEY_PAGEDOWN:
- if (browser_window_key_press(gw->bw, KEY_PAGE_DOWN) == false)
- widget_scroll_y(gw, fbtk_get_height(gw->browser), false);
+ if (browser_window_key_press(gw->bw,
+ KEY_PAGE_DOWN) == false)
+ widget_scroll_y(gw, fbtk_get_height(
+ gw->browser), false);
break;
case NSFB_KEY_RIGHT:
- if (browser_window_key_press(gw->bw, KEY_RIGHT) == false)
- widget_scroll_x(gw, 100, false);
+ if (modifier & FBTK_MOD_RCTRL ||
+ modifier & FBTK_MOD_LCTRL) {
+ /* CTRL held */
+ if (browser_window_key_press(gw->bw,
+ KEY_LINE_END) == false)
+ widget_scroll_x(gw, INT_MAX, true);
+
+ } else if (modifier & FBTK_MOD_RSHIFT ||
+ modifier & FBTK_MOD_LSHIFT) {
+ /* SHIFT held */
+ if (browser_window_key_press(gw->bw,
+ KEY_WORD_RIGHT) == false)
+ widget_scroll_x(gw, fbtk_get_width(
+ gw->browser), false);
+
+ } else {
+ /* no modifier */
+ if (browser_window_key_press(gw->bw,
+ KEY_RIGHT) == false)
+ widget_scroll_x(gw, 100, false);
+ }
break;
case NSFB_KEY_LEFT:
- if (browser_window_key_press(gw->bw, KEY_LEFT) == false)
- widget_scroll_x(gw, -100, false);
+ if (modifier & FBTK_MOD_RCTRL ||
+ modifier & FBTK_MOD_LCTRL) {
+ /* CTRL held */
+ if (browser_window_key_press(gw->bw,
+ KEY_LINE_START) == false)
+ widget_scroll_x(gw, 0, true);
+
+ } else if (modifier & FBTK_MOD_RSHIFT ||
+ modifier & FBTK_MOD_LSHIFT) {
+ /* SHIFT held */
+ if (browser_window_key_press(gw->bw,
+ KEY_WORD_LEFT) == false)
+ widget_scroll_x(gw, -fbtk_get_width(
+ gw->browser), false);
+
+ } else {
+ /* no modifier */
+ if (browser_window_key_press(gw->bw,
+ KEY_LEFT) == false)
+ widget_scroll_x(gw, -100, false);
+ }
break;
case NSFB_KEY_UP:
- if (browser_window_key_press(gw->bw, KEY_UP) == false)
+ if (browser_window_key_press(gw->bw,
+ KEY_UP) == false)
widget_scroll_y(gw, -100, false);
break;
case NSFB_KEY_DOWN:
- if (browser_window_key_press(gw->bw, KEY_DOWN) == false)
+ if (browser_window_key_press(gw->bw,
+ KEY_DOWN) == false)
widget_scroll_y(gw, 100, false);
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 |= FBTK_MOD_RCTRL;
+ break;
+
+ case NSFB_KEY_LCTRL:
+ modifier |= FBTK_MOD_LCTRL;
break;
default:
@@ -747,11 +799,19 @@ fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi)
case NSFB_EVENT_KEY_UP:
switch (cbi->event->value.keycode) {
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 &= ~FBTK_MOD_RCTRL;
+ break;
+
+ case NSFB_KEY_LCTRL:
+ modifier &= ~FBTK_MOD_LCTRL;
break;
default: