From ec933cf4857e9f78879cf6c02a86a3f5b463252d Mon Sep 17 00:00:00 2001 From: James Bursa Date: Wed, 28 Jan 2004 18:37:56 +0000 Subject: [project @ 2004-01-28 18:37:56 by bursa] Clean up gui_poll() / gui_multitask() mess, add hourglass. svn path=/import/netsurf/; revision=513 --- riscos/gui.c | 722 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 330 insertions(+), 392 deletions(-) (limited to 'riscos') diff --git a/riscos/gui.c b/riscos/gui.c index 068512fc9..05627a1c2 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -14,6 +14,7 @@ #include #include #include +#include "oslib/hourglass.h" #include "oslib/inetsuite.h" #include "oslib/os.h" #include "oslib/osfile.h" @@ -100,9 +101,16 @@ struct ro_gui_poll_block *ro_gui_poll_queued_blocks = 0; static void ro_gui_icon_bar_create(void); +static void ro_gui_handle_event(wimp_event_no event, wimp_block *block); static void ro_gui_poll_queue(wimp_event_no event, wimp_block* block); +static void ro_gui_null_reason_code(void); +static void ro_gui_redraw_window_request(wimp_draw *redraw); +static void ro_gui_open_window_request(wimp_open *open); +static void ro_gui_close_window_request(wimp_close *close); +static void ro_gui_mouse_click(wimp_pointer *pointer); static void ro_gui_icon_bar_click(wimp_pointer* pointer); static void ro_gui_keypress(wimp_key* key); +static void ro_gui_user_message(wimp_event_no event, wimp_message *message); static void ro_msg_datasave(wimp_message* block); static void ro_msg_dataload(wimp_message* block); static void ro_msg_datasave_ack(wimp_message* message); @@ -120,6 +128,8 @@ void gui_init(int argc, char** argv) char theme_fname[256]; os_error *e; + xhourglass_start(1); + NETSURF_DIR = getenv("NetSurf$Dir"); messages_load(".Resources.en.Messages"); @@ -188,54 +198,48 @@ void gui_quit(void) #endif ro_gui_history_quit(); wimp_close_down(task_handle); + xhourglass_off(); } +/** + * Poll the OS for events (RISC OS). + * + * \param active return as soon as possible + */ + void gui_poll(bool active) { - wimp_event_no event; - wimp_block block; - gui_window* g; - int finished = 0; + wimp_event_no event; + wimp_block block; + const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN; + gui_window *g; + + /* Process queued events. */ + while (ro_gui_poll_queued_blocks) { + struct ro_gui_poll_block *next; + ro_gui_handle_event(ro_gui_poll_queued_blocks->event, + ro_gui_poll_queued_blocks->block); + next = ro_gui_poll_queued_blocks->next; + free(ro_gui_poll_queued_blocks->block); + free(ro_gui_poll_queued_blocks); + ro_gui_poll_queued_blocks = next; + } - do - { - if (ro_gui_poll_queued_blocks == NULL) - { - const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN; - if (active) { - event = wimp_poll(mask, &block, 0); - } else if (over_window || gui_reformat_pending) { - os_t t = os_read_monotonic_time(); - event = wimp_poll_idle(mask, &block, t + 10, 0); - } else { - event = wimp_poll(wimp_MASK_NULL | mask, &block, 0); - } - finished = 1; - } - else - { - struct ro_gui_poll_block* next; - event = ro_gui_poll_queued_blocks->event; - memcpy(&block, ro_gui_poll_queued_blocks->block, sizeof(block)); - next = ro_gui_poll_queued_blocks->next; - xfree(ro_gui_poll_queued_blocks->block); - xfree(ro_gui_poll_queued_blocks); - ro_gui_poll_queued_blocks = next; - finished = 0; - } - switch (event) - { - case wimp_NULL_REASON_CODE : - ro_gui_throb(); - if (over_window != NULL - || current_drag.type == draginfo_BROWSER_TEXT_SELECTION) - { - wimp_pointer pointer; - wimp_get_pointer_info(&pointer); - ro_gui_window_mouse_at(&pointer); - } - if (gui_reformat_pending) { + /* Poll wimp. */ + xhourglass_off(); + if (active) { + event = wimp_poll(mask, &block, 0); + } else if (over_window || gui_reformat_pending) { + os_t t = os_read_monotonic_time(); + event = wimp_poll_idle(mask, &block, t + 10, 0); + } else { + event = wimp_poll(wimp_MASK_NULL | mask, &block, 0); + } + xhourglass_on(); + ro_gui_handle_event(event, &block); + + if (gui_reformat_pending && event == wimp_NULL_REASON_CODE) { for (g = window_list; g; g = g->next) { if (g->type == GUI_BROWSER_WINDOW && g->data.browser.reformat_pending) { content_reformat(g->data.browser.bw->current_content, @@ -245,405 +249,275 @@ void gui_poll(bool active) } gui_reformat_pending = false; } - break; +} - case wimp_REDRAW_WINDOW_REQUEST : - if (block.redraw.w == dialog_config_th) - ro_gui_redraw_config_th(&block.redraw); - else if (block.redraw.w == history_window) - ro_gui_history_redraw(&block.redraw); - else { - g = ro_lookup_gui_from_w(block.redraw.w); - if (g != NULL) - ro_gui_window_redraw(g, &(block.redraw)); - else { - osbool more = wimp_redraw_window(&block.redraw); - while (more) - more = wimp_get_rectangle(&block.redraw); - } - } - break; - case wimp_OPEN_WINDOW_REQUEST : - g = ro_lookup_gui_from_w(block.open.w); - if (g != NULL) - ro_gui_window_open(g, &(block.open)); - else - { - wimp_open_window(&block.open); - } - break; +/** + * Process a Wimp_Poll event. + * + * \param event wimp event number + * \param block parameter block + */ - case wimp_CLOSE_WINDOW_REQUEST : - g = ro_lookup_gui_from_w(block.close.w); - if (g != NULL) { - browser_window_destroy(g->data.browser.bw -#ifdef WITH_FRAMES - , true -#endif - ); -#ifdef WITH_COOKIES - clean_cookiejar(); -#endif - } - else - ro_gui_dialog_close((wimp_w)(&(block.close.w))); - break; - - case wimp_POINTER_LEAVING_WINDOW : - over_window = NULL; - break; - - case wimp_POINTER_ENTERING_WINDOW : - over_window = ro_lookup_gui_from_w(block.entering.w); - break; - - case wimp_MOUSE_CLICK : - if (block.pointer.w == wimp_ICON_BAR) - ro_gui_icon_bar_click(&(block.pointer)); - else if (block.pointer.w == history_window) - ro_gui_history_click(&(block.pointer)); - else - { - g = ro_lookup_gui_from_w(block.pointer.w); - if (g != NULL) - { - ro_gui_window_click(g, &(block.pointer)); - } - else - { - g = ro_lookup_gui_toolbar_from_w(block.pointer.w); - if (g != NULL) - { - ro_gui_toolbar_click(g, &(block.pointer)); - } - else - { - g = ro_lookup_download_window_from_w(block.pointer.w); - if (g != NULL) - { - ro_download_window_click(g, &(block.pointer)); - } - - else ro_gui_dialog_click(&(block.pointer)); - } - } - break; +void ro_gui_handle_event(wimp_event_no event, wimp_block *block) +{ + switch (event) { + case wimp_NULL_REASON_CODE: + ro_gui_null_reason_code(); + break; - case wimp_USER_DRAG_BOX : - ro_gui_drag_end(&(block.dragged)); - break; + case wimp_REDRAW_WINDOW_REQUEST: + ro_gui_redraw_window_request(&block->redraw); + break; - case wimp_KEY_PRESSED : - ro_gui_keypress(&(block.key)); - break; + case wimp_OPEN_WINDOW_REQUEST: + ro_gui_open_window_request(&block->open); + break; - case wimp_MENU_SELECTION : - ro_gui_menu_selection(&(block.selection)); - break; + case wimp_CLOSE_WINDOW_REQUEST: + ro_gui_close_window_request(&block->close); + break; - case wimp_SCROLL_REQUEST: - ro_gui_scroll_request(&(block.scroll)); - break; + case wimp_POINTER_LEAVING_WINDOW: + over_window = 0; + break; - case wimp_LOSE_CARET : - break; - case wimp_GAIN_CARET : - break; + case wimp_POINTER_ENTERING_WINDOW: + over_window = ro_lookup_gui_from_w(block->entering.w); + break; - case wimp_USER_MESSAGE : - case wimp_USER_MESSAGE_RECORDED : - case wimp_USER_MESSAGE_ACKNOWLEDGE: + case wimp_MOUSE_CLICK: + ro_gui_mouse_click(&block->pointer); + break; - fprintf(stderr, "MESSAGE %d (%x) HAS ARRIVED\n", block.message.action, block.message.action); + case wimp_USER_DRAG_BOX: + ro_gui_drag_end(&(block->dragged)); + break; - switch (block.message.action) - { - case message_DATA_SAVE : - ro_msg_datasave(&(block.message)); - break; + case wimp_KEY_PRESSED: + ro_gui_keypress(&(block->key)); + break; - case message_DATA_SAVE_ACK : - ro_msg_datasave_ack(&(block.message)); - break; + case wimp_MENU_SELECTION: + ro_gui_menu_selection(&(block->selection)); + break; - case message_DATA_LOAD : - ro_msg_dataload(&(block.message)); - break; + case wimp_SCROLL_REQUEST: + ro_gui_scroll_request(&(block->scroll)); + break; - case message_DATA_OPEN: - ro_msg_dataopen(&(block.message)); - break; + case wimp_USER_MESSAGE: + case wimp_USER_MESSAGE_RECORDED: + case wimp_USER_MESSAGE_ACKNOWLEDGE: + ro_gui_user_message(event, &(block->message)); + break; + } +} -#ifdef WITH_URI - case message_URI_PROCESS : - ro_uri_message_received(&(block.message)); - break; -#endif -#ifdef WITH_URL - case message_INET_SUITE_OPEN_URL: - ro_url_message_received(&(block.message)); - break; -#endif -#ifdef WITH_PLUGIN - case message_PLUG_IN_OPENING: - case message_PLUG_IN_CLOSED: - case message_PLUG_IN_RESHAPE_REQUEST: - case message_PLUG_IN_FOCUS: - case message_PLUG_IN_URL_ACCESS: - case message_PLUG_IN_STATUS: - case message_PLUG_IN_BUSY: - case message_PLUG_IN_STREAM_NEW: - case message_PLUG_IN_STREAM_WRITE: - case message_PLUG_IN_STREAM_WRITTEN: - case message_PLUG_IN_STREAM_DESTROY: - case message_PLUG_IN_OPEN: - case message_PLUG_IN_CLOSE: - case message_PLUG_IN_RESHAPE: - case message_PLUG_IN_STREAM_AS_FILE: - case message_PLUG_IN_NOTIFY: - case message_PLUG_IN_ABORT: - case message_PLUG_IN_ACTION: - plugin_msg_parse(&(block.message), - (event == wimp_USER_MESSAGE_ACKNOWLEDGE ? 1 : 0)); - break; -#endif - case message_QUIT : - netsurf_quit = true; - break; - } - break; - } - } - } while (finished == 0); +/** + * Check for important events and yield CPU (RISC OS). + * + * Required on RISC OS for cooperative multitasking. + */ + +void gui_multitask(void) +{ + wimp_event_no event; + wimp_block block; + + xhourglass_off(); + event = wimp_poll(wimp_MASK_LOSE | wimp_MASK_GAIN, &block, 0); + xhourglass_on(); + + switch (event) { + case wimp_CLOSE_WINDOW_REQUEST: + case wimp_KEY_PRESSED: + case wimp_MENU_SELECTION: + case wimp_USER_MESSAGE: + case wimp_USER_MESSAGE_RECORDED: + case wimp_USER_MESSAGE_ACKNOWLEDGE: + ro_gui_poll_queue(event, &block); + break; - return; + default: + ro_gui_handle_event(event, &block); + break; + } } -void gui_multitask(void) + +/** + * Add a wimp_block to the queue for later handling. + */ + +void ro_gui_poll_queue(wimp_event_no event, wimp_block *block) { - wimp_event_no event; - wimp_block block; - gui_window* g; + struct ro_gui_poll_block *q = + xcalloc(1, sizeof(struct ro_gui_poll_block)); - event = wimp_poll(wimp_QUEUE_KEY | - wimp_MASK_LOSE | wimp_MASK_GAIN, &block, 0); + q->event = event; + q->block = xcalloc(1, sizeof(*block)); + memcpy(q->block, block, sizeof(*block)); + q->next = NULL; - switch (event) - { - case wimp_NULL_REASON_CODE: - ro_gui_throb(); - if (over_window != NULL) - { - wimp_pointer pointer; - wimp_get_pointer_info(&pointer); - ro_gui_window_mouse_at(&pointer); - } - break; - - case wimp_REDRAW_WINDOW_REQUEST : - if (block.redraw.w == dialog_config_th) - ro_gui_redraw_config_th(&block.redraw); - else if (block.redraw.w == history_window) - ro_gui_history_redraw(&block.redraw); + if (ro_gui_poll_queued_blocks == NULL) { + ro_gui_poll_queued_blocks = q; + return; + } else { + struct ro_gui_poll_block *current = + ro_gui_poll_queued_blocks; + while (current->next != NULL) + current = current->next; + current->next = q; + } + return; +} + + +/** + * Handle Null_Reason_Code events. + */ + +void ro_gui_null_reason_code(void) +{ + ro_gui_throb(); + if (over_window != NULL + || current_drag.type == draginfo_BROWSER_TEXT_SELECTION) + { + wimp_pointer pointer; + wimp_get_pointer_info(&pointer); + ro_gui_window_mouse_at(&pointer); + } +} + + +/** + * Handle Redraw_Window_Request events. + */ + +void ro_gui_redraw_window_request(wimp_draw *redraw) +{ + gui_window *g; + + if (redraw->w == dialog_config_th) + ro_gui_redraw_config_th(redraw); + else if (redraw->w == history_window) + ro_gui_history_redraw(redraw); else { - g = ro_lookup_gui_from_w(block.redraw.w); - if (g) - ro_gui_window_redraw(g, &(block.redraw)); + g = ro_lookup_gui_from_w(redraw->w); + if (g != NULL) + ro_gui_window_redraw(g, redraw); else { - osbool more = wimp_redraw_window(&block.redraw); + osbool more = wimp_redraw_window(redraw); while (more) - more = wimp_get_rectangle(&block.redraw); + more = wimp_get_rectangle(redraw); } } - break; - - case wimp_OPEN_WINDOW_REQUEST : - g = ro_lookup_gui_from_w(block.open.w); - if (g != NULL) - ro_gui_window_open(g, &(block.open)); - else - { - wimp_open_window(&block.open); - } - break; - - case wimp_CLOSE_WINDOW_REQUEST : - ro_gui_poll_queue(event, &block); - break; - - case wimp_MOUSE_CLICK : - if (block.pointer.w == wimp_ICON_BAR) - ro_gui_icon_bar_click(&(block.pointer)); - else - { - g = ro_lookup_gui_from_w(block.pointer.w); - if (g != NULL) - { - if (g->redraw_safety == SAFE) - ro_gui_window_click(g, &(block.pointer)); - else - ro_gui_poll_queue(event, &block); - } - else - { - g = ro_lookup_gui_toolbar_from_w(block.pointer.w); - if (g != NULL) - { - ro_gui_toolbar_click(g, &(block.pointer)); - } - else - { - ro_gui_poll_queue(event, &block); - } - } - } - break; - - case wimp_POINTER_LEAVING_WINDOW : - over_window = NULL; - break; - case wimp_POINTER_ENTERING_WINDOW : - over_window = ro_lookup_gui_from_w(block.leaving.w); - break; - case wimp_USER_DRAG_BOX : - 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: - - fprintf(stderr, "MESSAGE %d (%x) HAS ARRIVED\n", block.message.action, block.message.action); - - switch (block.message.action) - { - case message_DATA_SAVE : - ro_msg_datasave(&(block.message)); - break; - - case message_DATA_SAVE_ACK : - ro_msg_datasave_ack(&(block.message)); - break; - - case message_DATA_LOAD : - ro_msg_dataload(&(block.message)); - break; - - case message_DATA_OPEN: - ro_msg_dataopen(&(block.message)); - break; - -#ifdef WITH_URI - case message_URI_PROCESS : - ro_uri_message_received(&(block.message)); - break; -#endif -#ifdef WITH_URL - case message_INET_SUITE_OPEN_URL: - ro_url_message_received(&(block.message)); - break; -#endif -#ifdef WITH_PLUGIN - case message_PLUG_IN_OPENING: - case message_PLUG_IN_CLOSED: - case message_PLUG_IN_RESHAPE_REQUEST: - case message_PLUG_IN_FOCUS: - case message_PLUG_IN_URL_ACCESS: - case message_PLUG_IN_STATUS: - case message_PLUG_IN_BUSY: - case message_PLUG_IN_STREAM_NEW: - case message_PLUG_IN_STREAM_WRITE: - case message_PLUG_IN_STREAM_WRITTEN: - case message_PLUG_IN_STREAM_DESTROY: - case message_PLUG_IN_OPEN: - case message_PLUG_IN_CLOSE: - case message_PLUG_IN_RESHAPE: - case message_PLUG_IN_STREAM_AS_FILE: - case message_PLUG_IN_NOTIFY: - case message_PLUG_IN_ABORT: - case message_PLUG_IN_ACTION: - plugin_msg_parse(&(block.message), - (event == wimp_USER_MESSAGE_ACKNOWLEDGE ? 1 : 0)); - break; -#endif +} - case message_QUIT : - netsurf_quit = true; - break; - default: - ro_gui_poll_queue(event, &block); - break; +/** + * Handle Open_Window_Request events. + */ - } - break; - default: - break; - } +void ro_gui_open_window_request(wimp_open *open) +{ + gui_window *g; + g = ro_lookup_gui_from_w(open->w); + if (g) + ro_gui_window_open(g, open); + else + wimp_open_window(open); } -void ro_gui_poll_queue(wimp_event_no event, wimp_block* block) + +/** + * Handle Close_Window_Request events. + */ + +void ro_gui_close_window_request(wimp_close *close) { - struct ro_gui_poll_block* q = xcalloc(1, sizeof(struct ro_gui_poll_block)); + gui_window *g; + + g = ro_lookup_gui_from_w(close->w); + if (g) { + browser_window_destroy(g->data.browser.bw +#ifdef WITH_FRAMES + , true +#endif + ); +#ifdef WITH_COOKIES + clean_cookiejar(); +#endif + } else + ro_gui_dialog_close(close->w); +} - q->event = event; - q->block = xcalloc(1, sizeof(*block)); - memcpy(q->block, block, sizeof(*block)); - q->next = NULL; - if (ro_gui_poll_queued_blocks == NULL) - { - ro_gui_poll_queued_blocks = q; - return; - } - else - { - struct ro_gui_poll_block* current = ro_gui_poll_queued_blocks; - while (current->next != NULL) - current = current->next; - current->next = q; - } - return; +/** + * Handle Mouse_Click events. + */ + +void ro_gui_mouse_click(wimp_pointer *pointer) +{ + gui_window *g = ro_gui_window_lookup(pointer->w); + + if (pointer->w == wimp_ICON_BAR) + ro_gui_icon_bar_click(pointer); + else if (pointer->w == history_window) + ro_gui_history_click(pointer); + else if (g && g->type == GUI_BROWSER_WINDOW && + g->window == pointer->w) { + if (g->redraw_safety == SAFE) + ro_gui_window_click(g, pointer); + else + ro_gui_poll_queue(wimp_MOUSE_CLICK, + (wimp_block *) pointer); + } else if (g && g->type == GUI_BROWSER_WINDOW && + g->data.browser.toolbar == pointer->w) + ro_gui_toolbar_click(g, pointer); + else if (g && g->type == GUI_DOWNLOAD_WINDOW) + ro_download_window_click(g, pointer); + else + ro_gui_dialog_click(pointer); } +/** + * Handle Mouse_Click events on the iconbar icon. + */ -void ro_gui_icon_bar_click(wimp_pointer* pointer) +void ro_gui_icon_bar_click(wimp_pointer *pointer) { - if (pointer->buttons == wimp_CLICK_MENU) - { - ro_gui_create_menu(iconbar_menu, pointer->pos.x - 64, 96 + iconbar_menu_height, NULL); - } - else if (pointer->buttons == wimp_CLICK_SELECT) - { - struct browser_window* bw; - bw = create_browser_window(browser_TITLE | browser_TOOLBAR - | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480 + if (pointer->buttons == wimp_CLICK_MENU) { + ro_gui_create_menu(iconbar_menu, pointer->pos.x - 64, + 96 + iconbar_menu_height, NULL); + } else if (pointer->buttons == wimp_CLICK_SELECT) { + struct browser_window *bw; + bw = create_browser_window(browser_TITLE | browser_TOOLBAR + | browser_SCROLL_X_ALWAYS | + browser_SCROLL_Y_ALWAYS, 640, + 480 #ifdef WITH_FRAMES - , NULL + , NULL #endif - ); - gui_window_show(bw->window); - browser_window_open_location(bw, HOME_URL); - wimp_set_caret_position(bw->window->data.browser.toolbar, - ICON_TOOLBAR_URL, - 0,0,-1, (int) strlen(bw->window->url) - 1); - } + ); + gui_window_show(bw->window); + browser_window_open_location(bw, HOME_URL); + wimp_set_caret_position(bw->window->data.browser.toolbar, + ICON_TOOLBAR_URL, + 0, 0, -1, + (int) strlen(bw->window->url) - 1); + } } /** * Handle Key_Pressed events. */ + void ro_gui_keypress(wimp_key *key) { bool handled = false; @@ -671,6 +545,70 @@ void ro_gui_keypress(wimp_key *key) } +/** + * Handle the three User_Message events. + */ + +void ro_gui_user_message(wimp_event_no event, wimp_message *message) +{ + switch (message->action) { + case message_DATA_SAVE: + ro_msg_datasave(message); + break; + + case message_DATA_SAVE_ACK: + ro_msg_datasave_ack(message); + break; + + case message_DATA_LOAD: + ro_msg_dataload(message); + break; + + case message_DATA_OPEN: + ro_msg_dataopen(message); + break; + +#ifdef WITH_URI + case message_URI_PROCESS: + ro_uri_message_received(message); + break; +#endif +#ifdef WITH_URL + case message_INET_SUITE_OPEN_URL: + ro_url_message_received(message); + break; +#endif +#ifdef WITH_PLUGIN + case message_PLUG_IN_OPENING: + case message_PLUG_IN_CLOSED: + case message_PLUG_IN_RESHAPE_REQUEST: + case message_PLUG_IN_FOCUS: + case message_PLUG_IN_URL_ACCESS: + case message_PLUG_IN_STATUS: + case message_PLUG_IN_BUSY: + case message_PLUG_IN_STREAM_NEW: + case message_PLUG_IN_STREAM_WRITE: + case message_PLUG_IN_STREAM_WRITTEN: + case message_PLUG_IN_STREAM_DESTROY: + case message_PLUG_IN_OPEN: + case message_PLUG_IN_CLOSE: + case message_PLUG_IN_RESHAPE: + case message_PLUG_IN_STREAM_AS_FILE: + case message_PLUG_IN_NOTIFY: + case message_PLUG_IN_ABORT: + case message_PLUG_IN_ACTION: + plugin_msg_parse(message, + event == wimp_USER_MESSAGE_ACKNOWLEDGE); + break; +#endif + + case message_QUIT: + netsurf_quit = true; + break; + } +} + + void gui_gadget_combo(struct browser_window* bw, struct form_control* g, unsigned long mx, unsigned long my) { int count = 0; -- cgit v1.2.3