diff options
author | Richard Wilson <rjw@netsurf-browser.org> | 2006-01-08 20:02:26 +0000 |
---|---|---|
committer | Richard Wilson <rjw@netsurf-browser.org> | 2006-01-08 20:02:26 +0000 |
commit | dc50e72cc5a11b77a25bf8e525bb8266cc7e79b8 (patch) | |
tree | 00ea24124ee5a5e605db3c0be1f7eef010563780 /riscos/message.c | |
parent | ba5812645df6b79df8f002198117929313cdf3dc (diff) | |
download | netsurf-dc50e72cc5a11b77a25bf8e525bb8266cc7e79b8.tar.gz netsurf-dc50e72cc5a11b77a25bf8e525bb8266cc7e79b8.tar.bz2 |
[project @ 2006-01-08 20:02:25 by rjw]
Only remove references on acknowledgement. Add simple routing functions.
svn path=/import/netsurf/; revision=2016
Diffstat (limited to 'riscos/message.c')
-rw-r--r-- | riscos/message.c | 98 |
1 files changed, 74 insertions, 24 deletions
diff --git a/riscos/message.c b/riscos/message.c index 97518e9dc..7fcc3a93c 100644 --- a/riscos/message.c +++ b/riscos/message.c @@ -28,6 +28,10 @@ struct active_message { }; struct active_message *current_messages = NULL; +static struct active_message *ro_message_add(unsigned int message_code, + void (*callback)(wimp_event_no event, wimp_message *message)); +static void ro_message_free(int ref); + /** * Sends a message and registers a return route for a bounce. @@ -43,6 +47,8 @@ bool ro_message_send_message(wimp_event_no event, wimp_message *message, void (*callback)(wimp_event_no event, wimp_message *message)) { os_error *error; + assert(message); + /* send a message */ error = xwimp_send_message(event, message, task); if (error) { @@ -51,7 +57,7 @@ bool ro_message_send_message(wimp_event_no event, wimp_message *message, warn_user("WimpError", error->errmess); return false; } - + /* register the default bounce handler */ if (callback) { assert(event == wimp_USER_MESSAGE_RECORDED); @@ -62,7 +68,6 @@ bool ro_message_send_message(wimp_event_no event, wimp_message *message, } - /** * Registers a return route for a message. * @@ -70,7 +75,7 @@ bool ro_message_send_message(wimp_event_no event, wimp_message *message, * valid value is present in the my_ref field. * * \param message the message to register a route back for - * \param messge_code the message action code to route + * \param message_code the message action code to route * \param callback the code to call for a matched action * \return true on success, false on memory exhaustion */ @@ -82,16 +87,43 @@ bool ro_message_register_handler(wimp_message *message, assert(message); assert(callback); + add = ro_message_add(message_code, callback); + if (add) + add->id = message->my_ref; + return (add != NULL); +} + + +/** + * Registers a route for a message code. + * + * \param message_code the message action code to route + * \param callback the code to call for a matched action + * \return true on success, false on memory exhaustion + */ +bool ro_message_register_route(unsigned int message_code, + void (*callback)(wimp_event_no event, wimp_message *message)) { + assert(callback); + + return (ro_message_add(message_code, callback) != NULL); +} + +struct active_message *ro_message_add(unsigned int message_code, + void (*callback)(wimp_event_no event, wimp_message *message)) { + struct active_message *add; + + assert(callback); + add = (struct active_message *)malloc(sizeof(*add)); if (!add) - return false; + return NULL; add->message_code = message_code; - add->id = message->my_ref; + add->id = 0; add->callback = callback; add->next = current_messages; add->previous = NULL; current_messages = add; - return true; + return add; } @@ -103,32 +135,51 @@ bool ro_message_register_handler(wimp_message *message, */ bool ro_message_handle_message(wimp_event_no event, wimp_message *message) { struct active_message *test; - struct active_message *next; - bool handled = true; + bool handled = false; int ref; assert(message); - /* we can't work without a reference */ - ref = message->my_ref; - if (ref == 0) - return false; + if (event == wimp_USER_MESSAGE_ACKNOWLEDGE) { + /* handle message acknowledgement */ + ref = message->my_ref; + if (ref == 0) + return false; + + /* handle the message */ + for (test = current_messages; test; test = test->next) { + if ((ref == test->id) && + (message->action == test->message_code)) { + handled = true; + if (test->callback) + test->callback(event, message); + break; + } + } - /* handle the message */ - for (test = current_messages; test; test = test->next) { - if ((ref == test->id) && - (message->action == test->message_code)) { - handled = true; - if (test->callback) + /* remove all handlers for this id */ + ro_message_free(ref); + return handled; + } else { + /* handle simple routing */ + for (test = current_messages; test; test = test->next) { + if ((test->id == 0) && + (message->action == test->message_code)) { test->callback(event, message); - break; + return true; + } } } + return false; +} + + +void ro_message_free(int ref) { + struct active_message *test; + struct active_message *next = current_messages; - /* remove all handlers for this id */ - next = current_messages; while ((test = next)) { - next = test->next; + next = test->next; if (ref == test->id) { if (test->previous) test->previous->next = test->next; @@ -136,8 +187,7 @@ bool ro_message_handle_message(wimp_event_no event, wimp_message *message) { test->next->previous = test->previous; if (current_messages == test) current_messages = test->next; - free(test); + free(test); } } - return handled; } |