[project @ 2003-12-21 02:27:22 by bursa]

Improved scrolling by mouse and keyboard.

svn path=/import/netsurf/; revision=437
This commit is contained in:
James Bursa 2003-12-21 02:27:22 +00:00
parent 06d3f56519
commit d6f9f025f2
3 changed files with 102 additions and 7 deletions

View File

@ -308,6 +308,10 @@ void gui_poll(bool active)
ro_gui_menu_selection(&(block.selection));
break;
case wimp_SCROLL_REQUEST:
ro_gui_scroll_request(&(block.scroll));
break;
case wimp_LOSE_CARET :
break;
case wimp_GAIN_CARET :
@ -465,6 +469,12 @@ void gui_multitask(void)
ro_gui_drag_end(&(block.dragged));
break;
case wimp_MENU_SELECTION :
break;
case wimp_SCROLL_REQUEST:
ro_gui_scroll_request(&(block.scroll));
break;
case wimp_USER_MESSAGE :
case wimp_USER_MESSAGE_RECORDED :
case wimp_USER_MESSAGE_ACKNOWLEDGE:

View File

@ -145,6 +145,7 @@ gui_window* ro_lookup_gui_from_w(wimp_w window);
gui_window* ro_lookup_gui_toolbar_from_w(wimp_w window);
gui_window *ro_gui_window_lookup(wimp_w w);
bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar);
void ro_gui_scroll_request(wimp_scroll *scroll);
/* in history.c */
void ro_gui_history_init(void);

View File

@ -61,7 +61,8 @@ gui_window *gui_create_browser_window(struct browser_window *bw)
wimp_WINDOW_MOVEABLE | wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_BACK_ICON |
wimp_WINDOW_CLOSE_ICON | wimp_WINDOW_TITLE_ICON | wimp_WINDOW_VSCROLL |
wimp_WINDOW_HSCROLL | wimp_WINDOW_SIZE_ICON | wimp_WINDOW_TOGGLE_ICON |
wimp_WINDOW_IGNORE_XEXTENT | wimp_WINDOW_IGNORE_YEXTENT;
wimp_WINDOW_IGNORE_XEXTENT | wimp_WINDOW_IGNORE_YEXTENT |
wimp_WINDOW_SCROLL_REPEAT;
window.title_fg = wimp_COLOUR_BLACK;
window.title_bg = wimp_COLOUR_LIGHT_GREY;
window.work_fg = wimp_COLOUR_LIGHT_GREY;
@ -659,6 +660,7 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar)
{
struct content *content = g->data.browser.bw->current_content;
wimp_window_state state;
int y;
assert(g->type == GUI_BROWSER_WINDOW);
@ -716,15 +718,97 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar)
case wimp_KEY_UP:
case wimp_KEY_DOWN:
state.w = g->window;
wimp_get_window_state(&state);
state.yscroll += key == wimp_KEY_UP ? 32 : -32;
wimp_open_window((wimp_open *) &state);
return true;
case wimp_KEY_PAGE_UP:
case wimp_KEY_PAGE_DOWN:
case wimp_KEY_CONTROL | wimp_KEY_UP:
case wimp_KEY_CONTROL | wimp_KEY_DOWN:
break;
default:
return false;
}
state.w = g->window;
wimp_get_window_state(&state);
y = state.visible.y1 - state.visible.y0 - 32;
if (g->data.browser.bw->flags & browser_TOOLBAR)
y -= ro_theme_toolbar_height();
switch (key) {
case wimp_KEY_UP:
state.yscroll += 32;
break;
case wimp_KEY_DOWN:
state.yscroll -= 32;
break;
case wimp_KEY_PAGE_UP:
state.yscroll += y;
break;
case wimp_KEY_PAGE_DOWN:
state.yscroll -= y;
break;
case wimp_KEY_CONTROL | wimp_KEY_UP:
state.yscroll = 1000;
break;
case wimp_KEY_CONTROL | wimp_KEY_DOWN:
state.yscroll = -0x10000000;
break;
}
wimp_open_window((wimp_open *) &state);
return true;
}
/**
* Process Scroll_Request events.
*/
void ro_gui_scroll_request(wimp_scroll *scroll)
{
int x, y;
gui_window *g = ro_gui_window_lookup(scroll->w);
if (!g || g->type != GUI_BROWSER_WINDOW)
return;
x = scroll->visible.x1 - scroll->visible.x0 - 32;
y = scroll->visible.y1 - scroll->visible.y0 - 32;
if (g->data.browser.bw->flags & browser_TOOLBAR)
y -= ro_theme_toolbar_height();
switch (scroll->xmin) {
case wimp_SCROLL_PAGE_LEFT:
scroll->xscroll -= x;
break;
case wimp_SCROLL_COLUMN_LEFT:
scroll->xscroll -= 32;
break;
case wimp_SCROLL_COLUMN_RIGHT:
scroll->xscroll += 32;
break;
case wimp_SCROLL_PAGE_RIGHT:
scroll->xscroll += x;
break;
default:
break;
}
return false;
switch (scroll->ymin) {
case wimp_SCROLL_PAGE_UP:
scroll->yscroll += y;
break;
case wimp_SCROLL_LINE_UP:
scroll->yscroll += 32;
break;
case wimp_SCROLL_LINE_DOWN:
scroll->yscroll -= 32;
break;
case wimp_SCROLL_PAGE_DOWN:
scroll->yscroll -= y;
break;
default:
break;
}
wimp_open_window((wimp_open *) scroll);
}