void gui_window_set_scroll(struct gui_window *gw, int sx, int sy) { struct browser_widget_s *bwidget = fbtk_get_userpw(gw->browser); assert(bwidget); widget_scroll_x(gw, sx * gw->bw->scale, true); widget_scroll_y(gw, sy * gw->bw->scale, true); }
static int fb_scroll_callback(fbtk_widget_t *widget, fbtk_callback_info *cbi) { struct gui_window *gw = cbi->context; switch (cbi->type) { case FBTK_CBT_SCROLLY: widget_scroll_y(gw, cbi->y, true); break; case FBTK_CBT_SCROLLX: widget_scroll_x(gw, cbi->x, true); break; default: break; } return 0; }
static int fb_browser_window_input(fbtk_widget_t *widget, fbtk_callback_info *cbi) { struct gui_window *gw = cbi->context; static fbtk_modifier_type modifier = FBTK_MOD_CLEAR; int ucs4 = -1; LOG(("got value %d", cbi->event->value.keycode)); switch (cbi->event->type) { case NSFB_EVENT_KEY_DOWN: switch (cbi->event->value.keycode) { case NSFB_KEY_DELETE: browser_window_key_press(gw->bw, KEY_DELETE_RIGHT); break; 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); 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); break; case NSFB_KEY_RIGHT: 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 (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) widget_scroll_y(gw, -100, false); break; case NSFB_KEY_DOWN: if (browser_window_key_press(gw->bw, KEY_DOWN) == false) widget_scroll_y(gw, 100, false); break; case NSFB_KEY_RSHIFT: modifier |= FBTK_MOD_RSHIFT; break; case NSFB_KEY_LSHIFT: modifier |= FBTK_MOD_LSHIFT; break; case NSFB_KEY_RCTRL: modifier |= FBTK_MOD_RCTRL; break; case NSFB_KEY_LCTRL: modifier |= FBTK_MOD_LCTRL; break; case NSFB_KEY_y: case NSFB_KEY_z: if (cbi->event->value.keycode == NSFB_KEY_z && (modifier & FBTK_MOD_RCTRL || modifier & FBTK_MOD_LCTRL) && (modifier & FBTK_MOD_RSHIFT || modifier & FBTK_MOD_LSHIFT)) { /* Z pressed with CTRL and SHIFT held */ browser_window_key_press(gw->bw, KEY_REDO); break; } else if (cbi->event->value.keycode == NSFB_KEY_z && (modifier & FBTK_MOD_RCTRL || modifier & FBTK_MOD_LCTRL)) { /* Z pressed with CTRL held */ browser_window_key_press(gw->bw, KEY_UNDO); break; } else if (cbi->event->value.keycode == NSFB_KEY_y && (modifier & FBTK_MOD_RCTRL || modifier & FBTK_MOD_LCTRL)) { /* Y pressed with CTRL held */ browser_window_key_press(gw->bw, KEY_REDO); break; } /* Z or Y pressed but not undo or redo; * Fall through to default handling */ default: ucs4 = fbtk_keycode_to_ucs4(cbi->event->value.keycode, modifier); if (ucs4 != -1) browser_window_key_press(gw->bw, ucs4); break; } break; case NSFB_EVENT_KEY_UP: switch (cbi->event->value.keycode) { case NSFB_KEY_RSHIFT: modifier &= ~FBTK_MOD_RSHIFT; break; case NSFB_KEY_LSHIFT: modifier &= ~FBTK_MOD_LSHIFT; break; case NSFB_KEY_RCTRL: modifier &= ~FBTK_MOD_RCTRL; break; case NSFB_KEY_LCTRL: modifier &= ~FBTK_MOD_LCTRL; break; default: break; } break; default: break; } return 0; }
/* called back when click in browser window */ static int fb_browser_window_click(fbtk_widget_t *widget, fbtk_callback_info *cbi) { struct gui_window *gw = cbi->context; struct browser_widget_s *bwidget = fbtk_get_userpw(widget); browser_mouse_state mouse; float scale = browser_window_get_scale(gw->bw); int x = (cbi->x + bwidget->scrollx) / scale; int y = (cbi->y + bwidget->scrolly) / scale; unsigned int time_now; static struct { enum { CLICK_SINGLE, CLICK_DOUBLE, CLICK_TRIPLE } type; unsigned int time; } last_click; if (cbi->event->type != NSFB_EVENT_KEY_DOWN && cbi->event->type != NSFB_EVENT_KEY_UP) return 0; LOG(("browser window clicked at %d,%d", cbi->x, cbi->y)); switch (cbi->event->type) { case NSFB_EVENT_KEY_DOWN: switch (cbi->event->value.keycode) { case NSFB_KEY_MOUSE_1: browser_window_mouse_click(gw->bw, BROWSER_MOUSE_PRESS_1, x, y); gui_drag.state = GUI_DRAG_PRESSED; gui_drag.button = 1; gui_drag.x = x; gui_drag.y = y; break; #if 0 case NSFB_KEY_MOUSE_3: browser_window_mouse_click(gw->bw, BROWSER_MOUSE_PRESS_2, x, y); gui_drag.state = GUI_DRAG_PRESSED; gui_drag.button = 2; gui_drag.x = x; gui_drag.y = y; break; #else case NSFB_KEY_MOUSE_2: /* scroll right */ if (browser_window_scroll_at_point(gw->bw, x, y, 100, 0) == false) widget_scroll_x(gw, 100, false); break; case NSFB_KEY_MOUSE_3: /* scroll left */ if (browser_window_scroll_at_point(gw->bw, x, y, -100, 0) == false) widget_scroll_x(gw, -100, false); break; #endif case NSFB_KEY_MOUSE_4: /* scroll up */ if (browser_window_scroll_at_point(gw->bw, x, y, 0, -100) == false) { widget_scroll_y(gw, -100, false); } break; case NSFB_KEY_MOUSE_5: /* scroll down */ if (browser_window_scroll_at_point(gw->bw, x, y, 0, 100) == false) { widget_scroll_y(gw, 100, false); } break; default: break; } break; case NSFB_EVENT_KEY_UP: mouse = 0; time_now = wallclock(); switch (cbi->event->value.keycode) { case NSFB_KEY_MOUSE_1: if (gui_drag.state == GUI_DRAG_DRAG) { /* End of a drag, rather than click */ if (gui_drag.grabbed_pointer) { /* need to ungrab pointer */ fbtk_tgrab_pointer(widget); gui_drag.grabbed_pointer = false; } gui_drag.state = GUI_DRAG_NONE; /* Tell core */ browser_window_mouse_track(gw->bw, 0, x, y); break; } /* This is a click; * clear PRESSED state and pass to core */ gui_drag.state = GUI_DRAG_NONE; mouse = BROWSER_MOUSE_CLICK_1; break; #if 0 case NSFB_KEY_MOUSE_3: if (gui_drag.state == GUI_DRAG_DRAG) { /* End of a drag, rather than click */ gui_drag.state = GUI_DRAG_NONE; if (gui_drag.grabbed_pointer) { /* need to ungrab pointer */ fbtk_tgrab_pointer(widget); gui_drag.grabbed_pointer = false; } /* Tell core */ browser_window_mouse_track(gw->bw, 0, x, y); break; } /* This is a click; * clear PRESSED state and pass to core */ gui_drag.state = GUI_DRAG_NONE; mouse = BROWSER_MOUSE_CLICK_2; break; #endif default: break; } /* Determine if it's a double or triple click, allowing * 0.5 seconds (50cs) between clicks */ if (time_now < last_click.time + 50 && cbi->event->value.keycode != NSFB_KEY_MOUSE_4 && cbi->event->value.keycode != NSFB_KEY_MOUSE_5) { if (last_click.type == CLICK_SINGLE) { /* Set double click */ mouse |= BROWSER_MOUSE_DOUBLE_CLICK; last_click.type = CLICK_DOUBLE; } else if (last_click.type == CLICK_DOUBLE) { /* Set triple click */ mouse |= BROWSER_MOUSE_TRIPLE_CLICK; last_click.type = CLICK_TRIPLE; } else { /* Set normal click */ last_click.type = CLICK_SINGLE; } } else { last_click.type = CLICK_SINGLE; } if (mouse) browser_window_mouse_click(gw->bw, mouse, x, y); last_click.time = time_now; break; default: break; } return 1; }