Make scroll event handling module specific.
svn path=/trunk/netsurf/; revision=13285
This commit is contained in:
parent
6cfe625874
commit
80249f5f2a
|
@ -1033,7 +1033,7 @@ void ro_gui_handle_event(wimp_event_no event, wimp_block *block)
|
|||
break;
|
||||
|
||||
case wimp_SCROLL_REQUEST:
|
||||
ro_gui_scroll_request(&(block->scroll));
|
||||
ro_gui_wimp_event_scroll_window(&(block->scroll));
|
||||
break;
|
||||
|
||||
case wimp_USER_MESSAGE:
|
||||
|
|
|
@ -133,7 +133,6 @@ bool ro_gui_download_prequit(void);
|
|||
void ro_gui_401login_init(void);
|
||||
|
||||
/* in window.c */
|
||||
void ro_gui_scroll_request(wimp_scroll *scroll);
|
||||
bool ro_gui_window_dataload(struct gui_window *g, wimp_message *message);
|
||||
void ro_gui_window_mouse_at(struct gui_window *g, wimp_pointer *pointer);
|
||||
void ro_gui_window_iconise(struct gui_window *g,
|
||||
|
|
|
@ -99,6 +99,7 @@ static void ro_treeview_get_window_dimensions(int *width, int *height,
|
|||
void *pw);
|
||||
|
||||
static void ro_treeview_redraw(wimp_draw *redraw);
|
||||
static void ro_treeview_scroll(wimp_scroll *scroll);
|
||||
static void ro_treeview_redraw_loop(wimp_draw *redraw, ro_treeview *tv,
|
||||
osbool more);
|
||||
static void ro_treeview_open(wimp_open *open);
|
||||
|
@ -192,6 +193,7 @@ ro_treeview *ro_treeview_create(wimp_w window, struct toolbar *toolbar,
|
|||
/* Register wimp events to handle the supplied window. */
|
||||
|
||||
ro_gui_wimp_event_register_redraw_window(tv->w, ro_treeview_redraw);
|
||||
ro_gui_wimp_event_register_scroll_window(tv->w, ro_treeview_scroll);
|
||||
ro_gui_wimp_event_register_open_window(tv->w, ro_treeview_open);
|
||||
ro_gui_wimp_event_register_mouse_click(tv->w, ro_treeview_mouse_click);
|
||||
ro_gui_wimp_event_register_keypress(tv->w, ro_treeview_keypress);
|
||||
|
@ -333,6 +335,7 @@ void ro_treeview_redraw_request(int x, int y, int width, int height,
|
|||
ro_treeview_redraw_loop(&update, tv, more);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass RISC OS redraw events on to the treeview widget.
|
||||
*
|
||||
|
@ -366,6 +369,65 @@ void ro_treeview_redraw(wimp_draw *redraw)
|
|||
ro_treeview_redraw_loop(redraw, tv, more);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle scroll events in treeview windows.
|
||||
*
|
||||
* \param *scroll Pointer to Scroll Event block.
|
||||
*/
|
||||
|
||||
void ro_treeview_scroll(wimp_scroll *scroll)
|
||||
{
|
||||
os_error *error;
|
||||
int x = scroll->visible.x1 - scroll->visible.x0 - 32;
|
||||
int y = scroll->visible.y1 - scroll->visible.y0 - 32;
|
||||
struct toolbar *toolbar = ro_toolbar_parent_window_lookup(scroll->w);
|
||||
|
||||
if (toolbar != NULL)
|
||||
y -= ro_toolbar_full_height(toolbar);
|
||||
|
||||
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:
|
||||
scroll->xscroll += (x * (scroll->xmin>>2)) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
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:
|
||||
scroll->yscroll += (y * (scroll->ymin>>2)) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
error = xwimp_open_window((wimp_open *) scroll);
|
||||
if (error) {
|
||||
LOG(("xwimp_open_window: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Redraw a treeview window, once the initial readraw block has been collected.
|
||||
*
|
||||
|
|
|
@ -95,6 +95,7 @@ struct event_window {
|
|||
void (*open_window)(wimp_open *open);
|
||||
void (*close_window)(wimp_w w);
|
||||
void (*redraw_window)(wimp_draw *redraw);
|
||||
void (*scroll_window)(wimp_scroll *scroll);
|
||||
bool (*menu_prepare)(wimp_w w, wimp_i i, wimp_menu *m,
|
||||
wimp_pointer *p);
|
||||
bool (*menu_selection)(wimp_w w, wimp_i i, wimp_menu *m,
|
||||
|
@ -1114,6 +1115,24 @@ bool ro_gui_wimp_event_redraw_window(wimp_draw *redraw)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handle any scroll window requests
|
||||
*
|
||||
* \param scroll the window scroll request
|
||||
*/
|
||||
bool ro_gui_wimp_event_scroll_window(wimp_scroll *scroll)
|
||||
{
|
||||
struct event_window *window;
|
||||
|
||||
window = ro_gui_wimp_event_find_window(scroll->w);
|
||||
if ((window) && (window->scroll_window)) {
|
||||
window->scroll_window(scroll);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process a Menu click in a window, by checking for a registered window
|
||||
* menu and opening it if one is found.
|
||||
|
@ -1455,6 +1474,21 @@ bool ro_gui_wimp_event_register_redraw_window(wimp_w w,
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a function to be called for all window scroll requests.
|
||||
*/
|
||||
|
||||
bool ro_gui_wimp_event_register_scroll_window(wimp_w w,
|
||||
void (*callback)(wimp_scroll *scroll))
|
||||
{
|
||||
struct event_window *window;
|
||||
|
||||
window = ro_gui_wimp_event_get_window(w);
|
||||
if (!window)
|
||||
return false;
|
||||
window->scroll_window = callback;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a function to be called before a menu is (re-)opened.
|
||||
|
|
|
@ -60,6 +60,7 @@ bool ro_gui_wimp_event_keypress(wimp_key *key);
|
|||
bool ro_gui_wimp_event_open_window(wimp_open *open);
|
||||
bool ro_gui_wimp_event_close_window(wimp_w w);
|
||||
bool ro_gui_wimp_event_redraw_window(wimp_draw *redraw);
|
||||
bool ro_gui_wimp_event_scroll_window(wimp_scroll *scroll);
|
||||
|
||||
bool ro_gui_wimp_event_process_window_menu_click(wimp_pointer *pointer);
|
||||
bool ro_gui_wimp_event_prepare_menu(wimp_w w, wimp_i i, wimp_menu *menu);
|
||||
|
@ -90,6 +91,8 @@ bool ro_gui_wimp_event_register_close_window(wimp_w w,
|
|||
void (*callback)(wimp_w w));
|
||||
bool ro_gui_wimp_event_register_redraw_window(wimp_w w,
|
||||
void (*callback)(wimp_draw *redraw));
|
||||
bool ro_gui_wimp_event_register_scroll_window(wimp_w w,
|
||||
void (*callback)(wimp_scroll *scroll));
|
||||
bool ro_gui_wimp_event_register_menu_prepare(wimp_w w,
|
||||
bool (*callback)(wimp_w w, wimp_i i, wimp_menu *m,
|
||||
wimp_pointer *p));
|
||||
|
|
|
@ -91,6 +91,7 @@
|
|||
static void gui_window_set_extent(struct gui_window *g, int width, int height);
|
||||
|
||||
static void ro_gui_window_redraw(wimp_draw *redraw);
|
||||
static void ro_gui_window_scroll(wimp_scroll *scroll);
|
||||
static void ro_gui_window_open(wimp_open *open);
|
||||
static void ro_gui_window_close(wimp_w w);
|
||||
static bool ro_gui_window_click(wimp_pointer *mouse);
|
||||
|
@ -537,6 +538,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
|
|||
ro_gui_wimp_event_register_open_window(g->window, ro_gui_window_open);
|
||||
ro_gui_wimp_event_register_close_window(g->window, ro_gui_window_close);
|
||||
ro_gui_wimp_event_register_redraw_window(g->window, ro_gui_window_redraw);
|
||||
ro_gui_wimp_event_register_scroll_window(g->window, ro_gui_window_scroll);
|
||||
ro_gui_wimp_event_register_keypress(g->window, ro_gui_window_keypress);
|
||||
ro_gui_wimp_event_register_mouse_click(g->window, ro_gui_window_click);
|
||||
ro_gui_wimp_event_register_menu(g->window, ro_gui_browser_window_menu,
|
||||
|
@ -2959,16 +2961,12 @@ void ro_gui_window_menu_close(wimp_w w, wimp_i i, wimp_menu *menu)
|
|||
|
||||
|
||||
/**
|
||||
* Process Scroll_Request events.
|
||||
* Process Scroll_Request events in a browser window.
|
||||
*
|
||||
* \TODO -- This handles Scroll Events for all windows, not just browser
|
||||
* windows. Either it needs to move somewhere else, or the
|
||||
* code needs to be split and Scroll Events dispatched via the
|
||||
* Wimp_Event module. Currently it doesn't properly handle
|
||||
* events affecting treeview windows, anyway.
|
||||
* \param *scroll The wimp scroll event data block.
|
||||
*/
|
||||
|
||||
void ro_gui_scroll_request(wimp_scroll *scroll)
|
||||
void ro_gui_window_scroll(wimp_scroll *scroll)
|
||||
{
|
||||
struct gui_window *g = ro_gui_window_lookup(scroll->w);
|
||||
struct toolbar *toolbar;
|
||||
|
@ -2997,9 +2995,9 @@ void ro_gui_scroll_request(wimp_scroll *scroll)
|
|||
} else {
|
||||
int x = scroll->visible.x1 - scroll->visible.x0 - 32;
|
||||
int y = scroll->visible.y1 - scroll->visible.y0 - 32;
|
||||
int xstep = 0, ystep = 0;
|
||||
os_error *error;
|
||||
|
||||
/* This has to handle all windows, not just browser ones. */
|
||||
toolbar = ro_toolbar_parent_window_lookup(scroll->w);
|
||||
assert(g == NULL || g->toolbar == NULL ||
|
||||
g->toolbar == toolbar);
|
||||
|
@ -3008,44 +3006,49 @@ void ro_gui_scroll_request(wimp_scroll *scroll)
|
|||
|
||||
switch (scroll->xmin) {
|
||||
case wimp_SCROLL_PAGE_LEFT:
|
||||
scroll->xscroll -= x;
|
||||
xstep = -x;
|
||||
break;
|
||||
case wimp_SCROLL_COLUMN_LEFT:
|
||||
scroll->xscroll -= 32;
|
||||
xstep = -32;
|
||||
break;
|
||||
case wimp_SCROLL_COLUMN_RIGHT:
|
||||
scroll->xscroll += 32;
|
||||
xstep = 32;
|
||||
break;
|
||||
case wimp_SCROLL_PAGE_RIGHT:
|
||||
scroll->xscroll += x;
|
||||
xstep = x;
|
||||
break;
|
||||
default:
|
||||
scroll->xscroll += (x * (scroll->xmin>>2)) >> 2;
|
||||
xstep = (x * (scroll->xmin>>2)) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (scroll->ymin) {
|
||||
case wimp_SCROLL_PAGE_UP:
|
||||
scroll->yscroll += y;
|
||||
ystep = y;
|
||||
break;
|
||||
case wimp_SCROLL_LINE_UP:
|
||||
scroll->yscroll += 32;
|
||||
ystep = 32;
|
||||
break;
|
||||
case wimp_SCROLL_LINE_DOWN:
|
||||
scroll->yscroll -= 32;
|
||||
ystep = -32;
|
||||
break;
|
||||
case wimp_SCROLL_PAGE_DOWN:
|
||||
scroll->yscroll -= y;
|
||||
ystep = -y;
|
||||
break;
|
||||
default:
|
||||
scroll->yscroll += (y * (scroll->ymin>>2)) >> 2;
|
||||
ystep = (y * (scroll->ymin>>2)) >> 2;
|
||||
break;
|
||||
}
|
||||
|
||||
error = xwimp_open_window((wimp_open *) scroll);
|
||||
if (error) {
|
||||
LOG(("xwimp_open_window: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
if (xstep != 0 || ystep != 0) {
|
||||
scroll->xscroll += xstep;
|
||||
scroll->yscroll += ystep;
|
||||
|
||||
error = xwimp_open_window((wimp_open *) scroll);
|
||||
if (error) {
|
||||
LOG(("xwimp_open_window: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue