diff options
Diffstat (limited to 'frontends')
-rw-r--r-- | frontends/riscos/gui.c | 203 | ||||
-rw-r--r-- | frontends/riscos/scripts/Run | 4 |
2 files changed, 177 insertions, 30 deletions
diff --git a/frontends/riscos/gui.c b/frontends/riscos/gui.c index 1a2b944a8..56296951f 100644 --- a/frontends/riscos/gui.c +++ b/frontends/riscos/gui.c @@ -26,8 +26,10 @@ #include <assert.h> #include <errno.h> #include <signal.h> +#include <unistd.h> #include <unixlib/local.h> #include <fpu_control.h> +#include <swis.h> #include <oslib/help.h> #include <oslib/uri.h> #include <oslib/inetsuite.h> @@ -38,6 +40,7 @@ #include <oslib/osbyte.h> #include <oslib/osmodule.h> #include <oslib/osfscontrol.h> +#include <oslib/socket.h> #include "utils/utils.h" #include "utils/nsoption.h" @@ -57,6 +60,7 @@ #include "desktop/save_complete.h" #include "desktop/hotlist.h" #include "content/backing_store.h" +#include "content/fetch.h" #include "riscos/gui.h" #include "riscos/bitmap.h" @@ -113,11 +117,14 @@ static const char *task_name = "NetSurf"; ro_gui_drag_type gui_current_drag_type; wimp_t task_handle; /**< RISC OS wimp task handle. */ -static clock_t gui_last_poll; /**< Time of last wimp_poll. */ osspriteop_area *gui_sprites; /**< Sprite area containing pointer and hotlist sprites */ #define DIR_SEP ('.') +static void *pollword; +static int *sockets_active; +static size_t sockets_active_size; + /** * Accepted wimp user messages. */ @@ -388,6 +395,19 @@ static void ro_gui_cleanup(void) xhourglass_off(); /* Uninstall NetSurf-specific fonts */ xos_cli("FontRemove NetSurf:Resources.Fonts."); + if (pollword != NULL) { + size_t i; + /* Deregister any remaining sockets from SocketWatch */ + for (i = 0; i < sockets_active_size; i++) { + if (sockets_active[i] != -1) { + /* SocketWatch_Deregister */ + (void) _swix(0x52281, _INR(0,1), + sockets_active[i], pollword); + sockets_active[i] = -1; + } + } + xosmodule_free(pollword); + } } @@ -1113,6 +1133,101 @@ static bool ro_gui__os_alpha_sprites_supported(void) return (var_val == (1 << 15)); } +static int ro_gui_socket_open(int domain, int type, int protocol) +{ + int sock = socket(domain, type, protocol); + if (sock != -1) { + size_t i; + int rosock; + _kernel_oserror *error; + + rosock = __get_ro_socket(sock); + if (rosock == -1) { + close(sock); + errno = ENOMEM; + return -1; + } + + /* SocketWatch_Register */ + error = _swix(0x52280, _INR(0,2), pollword, 0x1, rosock); + if (error != NULL) { + close(sock); + errno = ENOMEM; + return -1; + } + + /* Insert RISC OS socket handle into sockets_active */ + for (i = 0; i < sockets_active_size; i++) { + if (sockets_active[i] == -1) { + sockets_active[i] = rosock; + break; + } + } + if (i == sockets_active_size) { + /* No free slots: expand table */ + int *tmp = realloc(sockets_active, + sockets_active_size * 2 * sizeof(int)); + if (tmp == NULL) { + /* SocketWatch_Deregister */ + (void) _swix(0x52281, _INR(0,1), rosock, pollword); + close(sock); + errno = ENOMEM; + return -1; + } + memset(sockets_active + sockets_active_size, 0xff, + sockets_active_size * sizeof(int)); + sockets_active_size *= 2; + sockets_active[i] = rosock; + } + } + return sock; +} + +static int ro_gui_socket_close(int socket) +{ + int rosock; + + rosock = __get_ro_socket(socket); + if (rosock != -1) { + size_t i; + /* Invalidate active sockets entry */ + for (i = 0; i < sockets_active_size; i++) { + if (sockets_active[i] == rosock) { + sockets_active[i] = -1; + break; + } + } + /* SocketWatch_Deregister */ + (void) _swix(0x52281, _INR(0,1), rosock, pollword); + } + + return close(socket); +} + +/** + * Set up internet event handling + */ +static os_error *ro_gui_init_internet_event(void) +{ + static os_error nomem = { 1, "No memory"}; + os_error *error; + + sockets_active = malloc(32 * sizeof(int)); + if (sockets_active == NULL) { + return &nomem; + } + memset(sockets_active, 0xff, 32 * sizeof(int)); + sockets_active_size = 32; + + error = xosmodule_alloc(4, &pollword); + if (error != NULL) { + return error; + } + + *((uint32_t*) pollword) = 0; + return NULL; +} + /** * Initialise the RISC OS specific GUI. * @@ -1214,6 +1329,14 @@ static nserror gui_init(int argc, char** argv) urldb_load(nsoption_charp(url_path)); urldb_load_cookies(nsoption_charp(cookie_file)); + /* Setup Internet event handling (must be after atexit) */ + error = ro_gui_init_internet_event(); + if (error != NULL) { + NSLOG(netsurf, INFO, "init_internet_event: 0x%x: %s", + error->errnum, error->errmess); + die(error->errmess); + } + /* Initialise with the wimp */ error = xwimp_initialise(wimp_VERSION_RO38, task_name, PTR_WIMP_MESSAGE_LIST(&task_messages), 0, @@ -1837,6 +1960,14 @@ static void ro_gui_handle_event(wimp_event_no event, wimp_block *block) ro_gui_scroll(&(block->scroll)); break; + case wimp_POLLWORD_NON_ZERO: + /* simply reset pollword */ + if (pollword != NULL) { + /* SocketWatch_AtomicReset */ + _swix(0x52282, _INR(0,1), pollword, 0); + } + break; + case wimp_USER_MESSAGE: case wimp_USER_MESSAGE_RECORDED: case wimp_USER_MESSAGE_ACKNOWLEDGE: @@ -1853,44 +1984,54 @@ static void riscos_poll(void) { wimp_event_no event; wimp_block block; - const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN | wimp_SAVE_FP; - os_t track_poll_offset; + const wimp_poll_flags mask = wimp_MASK_LOSE | wimp_MASK_GAIN | + wimp_GIVEN_POLLWORD | wimp_SAVE_FP; + os_t t, track_poll_offset; - /* Poll wimp. */ - xhourglass_off(); - track_poll_offset = ro_mouse_poll_interval(); - if (sched_active || (track_poll_offset > 0)) { - os_t t = os_read_monotonic_time(); + /* Drain pending non-pollword events until the first NULL event */ + do { + xhourglass_off(); + event = wimp_poll(wimp_MASK_POLLWORD | mask, &block, pollword); + xhourglass_on(); - if (track_poll_offset > 0) { - t += track_poll_offset; - } else { - t += 10; - } + ro_gui_handle_event(event, &block); + } while (event != wimp_NULL_REASON_CODE); - if (sched_active && (sched_time - t) < 0) { - t = sched_time; - } + /* Redraw window contents */ + ro_gui_window_update_boxes(); + + /* Run scheduled callbacks, if any */ + schedule_run(); + + /* Drive any active fetches. */ + { + fd_set read_fd_set, write_fd_set, exc_fd_set; + int max_fd; + + fetch_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd); + } - event = wimp_poll_idle(mask, &block, t, 0); + /* Poll wimp in the ordinary way. */ + xhourglass_off(); + t = os_read_monotonic_time(); + track_poll_offset = ro_mouse_poll_interval(); + /* Work out how long we're prepared to wait for an event */ + if (track_poll_offset > 0) { + t += track_poll_offset; + } else if (sched_active) { + t += 10; } else { - event = wimp_poll(wimp_MASK_NULL | mask, &block, 0); + t += 100; + } + /* And then clamp that to min(sched_time, t) */ + if (sched_active && (sched_time - t) < 0) { + t = sched_time; } + event = wimp_poll_idle(mask, &block, t, pollword); + xhourglass_on(); - gui_last_poll = clock(); ro_gui_handle_event(event, &block); - - /* Only run scheduled callbacks on a null poll - * We cannot do this in the null event handler, as that may be called - * from gui_multitask(). Scheduled callbacks must only be run from the - * top-level. - */ - if (event == wimp_NULL_REASON_CODE) { - schedule_run(); - } - - ro_gui_window_update_boxes(); } @@ -2389,6 +2530,8 @@ static struct gui_fetch_table riscos_fetch_table = { .get_resource_url = gui_get_resource_url, .mimetype = fetch_mimetype, + .socket_open = ro_gui_socket_open, + .socket_close = ro_gui_socket_close, }; static struct gui_misc_table riscos_misc_table = { diff --git a/frontends/riscos/scripts/Run b/frontends/riscos/scripts/Run index 3368140d2..233322e39 100644 --- a/frontends/riscos/scripts/Run +++ b/frontends/riscos/scripts/Run @@ -95,6 +95,10 @@ RMEnsure Iconv 0.12 Error NetSurf requires Iconv 0.12 or later. Please use the R RMEnsure CryptRandom 0.13 NetSurfRMLoad System:Modules.CryptRand RMEnsure CryptRandom 0.13 Error NetSurf requires CryptRandom 0.13 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive. +| Ensure SocketWatch +RMEnsure SocketWatch 0.07 NetSurfRMLoad System:Modules.Network.SockWatch +RMEnsure SocketWatch 0.07 Error NetSurf requires SocketWatch 0.07 or later. Please use the RISC OS Configure app to update the computer's !System directory from the NetSurf archive. + | Disable SpecialFX, if present Set NetSurf$SpecialFX 1 RMEnsure SpecialFX 1.00 Set NetSurf$SpecialFX 0 |