From 76755556e0d3ac715222061bd6d64a87ce2c2905 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 28 Mar 2009 19:10:29 +0000 Subject: Aliasing fun. This is ugly. svn path=/trunk/netsurf/; revision=6971 --- riscos/gui.c | 109 ++++++++++++++++++++++++++++------------------------- riscos/wimputils.h | 29 +++++++++++++- 2 files changed, 85 insertions(+), 53 deletions(-) (limited to 'riscos') diff --git a/riscos/gui.c b/riscos/gui.c index 7b0f94258..446777f1a 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -87,6 +87,7 @@ #include "riscos/url_complete.h" #include "riscos/wimp.h" #include "riscos/wimp_event.h" +#include "riscos/wimputils.h" #include "utils/filename.h" #include "utils/log.h" #include "utils/messages.h" @@ -183,53 +184,55 @@ static struct { } prev_sigs; /** Accepted wimp user messages. */ -static wimp_MESSAGE_LIST(42) task_messages = { { +static ns_wimp_message_list task_messages = { message_HELP_REQUEST, - message_DATA_SAVE, - message_DATA_SAVE_ACK, - message_DATA_LOAD, - message_DATA_LOAD_ACK, - message_DATA_OPEN, - message_PRE_QUIT, - message_SAVE_DESKTOP, - message_MENU_WARNING, - message_MENUS_DELETED, - message_WINDOW_INFO, - message_CLAIM_ENTITY, - message_DATA_REQUEST, - message_DRAGGING, - message_DRAG_CLAIM, - message_MODE_CHANGE, - message_FONT_CHANGED, - message_URI_PROCESS, - message_URI_RETURN_RESULT, - message_INET_SUITE_OPEN_URL, + { + message_DATA_SAVE, + message_DATA_SAVE_ACK, + message_DATA_LOAD, + message_DATA_LOAD_ACK, + message_DATA_OPEN, + message_PRE_QUIT, + message_SAVE_DESKTOP, + message_MENU_WARNING, + message_MENUS_DELETED, + message_WINDOW_INFO, + message_CLAIM_ENTITY, + message_DATA_REQUEST, + message_DRAGGING, + message_DRAG_CLAIM, + message_MODE_CHANGE, + message_FONT_CHANGED, + message_URI_PROCESS, + message_URI_RETURN_RESULT, + message_INET_SUITE_OPEN_URL, #ifdef WITH_PLUGIN - message_PLUG_IN_OPENING, - message_PLUG_IN_CLOSED, - message_PLUG_IN_RESHAPE_REQUEST, - message_PLUG_IN_FOCUS, - message_PLUG_IN_URL_ACCESS, - message_PLUG_IN_STATUS, - message_PLUG_IN_BUSY, - message_PLUG_IN_STREAM_NEW, - message_PLUG_IN_STREAM_WRITE, - message_PLUG_IN_STREAM_WRITTEN, - message_PLUG_IN_STREAM_DESTROY, - message_PLUG_IN_OPEN, - message_PLUG_IN_CLOSE, - message_PLUG_IN_RESHAPE, - message_PLUG_IN_STREAM_AS_FILE, - message_PLUG_IN_NOTIFY, - message_PLUG_IN_ABORT, - message_PLUG_IN_ACTION, - /* message_PLUG_IN_INFORMED, (not provided by oslib) */ + message_PLUG_IN_OPENING, + message_PLUG_IN_CLOSED, + message_PLUG_IN_RESHAPE_REQUEST, + message_PLUG_IN_FOCUS, + message_PLUG_IN_URL_ACCESS, + message_PLUG_IN_STATUS, + message_PLUG_IN_BUSY, + message_PLUG_IN_STREAM_NEW, + message_PLUG_IN_STREAM_WRITE, + message_PLUG_IN_STREAM_WRITTEN, + message_PLUG_IN_STREAM_DESTROY, + message_PLUG_IN_OPEN, + message_PLUG_IN_CLOSE, + message_PLUG_IN_RESHAPE, + message_PLUG_IN_STREAM_AS_FILE, + message_PLUG_IN_NOTIFY, + message_PLUG_IN_ABORT, + message_PLUG_IN_ACTION, + /* message_PLUG_IN_INFORMED, (not provided by oslib) */ #endif - message_PRINT_SAVE, - message_PRINT_ERROR, - message_PRINT_TYPE_ODD, - 0 -} }; + message_PRINT_SAVE, + message_PRINT_ERROR, + message_PRINT_TYPE_ODD, + 0 + } +}; static struct { @@ -433,7 +436,7 @@ void gui_init(int argc, char** argv) /* Initialise with the wimp */ error = xwimp_initialise(wimp_VERSION_RO38, task_name, - (const wimp_message_list *) &task_messages, 0, + PTR_WIMP_MESSAGE_LIST(&task_messages), 0, &task_handle); if (error) { LOG(("xwimp_initialise: 0x%x: %s", @@ -2119,17 +2122,19 @@ char *url_to_path(const char *url) void ro_gui_get_screen_properties(void) { - const os_VDU_VAR_LIST(5) vars = { - { os_MODEVAR_XWIND_LIMIT, - os_MODEVAR_YWIND_LIMIT, - os_MODEVAR_XEIG_FACTOR, - os_MODEVAR_YEIG_FACTOR, - os_VDUVAR_END_LIST } + static const ns_os_vdu_var_list vars = { + os_MODEVAR_XWIND_LIMIT, + { + os_MODEVAR_YWIND_LIMIT, + os_MODEVAR_XEIG_FACTOR, + os_MODEVAR_YEIG_FACTOR, + os_VDUVAR_END_LIST + } }; os_error *error; int vals[4]; - error = xos_read_vdu_variables((const os_vdu_var_list*)&vars, vals); + error = xos_read_vdu_variables(PTR_OS_VDU_VAR_LIST(&vars), vals); if (error) { LOG(("xos_read_vdu_variables: 0x%x: %s", error->errnum, error->errmess)); diff --git a/riscos/wimputils.h b/riscos/wimputils.h index 5a6349b9f..5225a720e 100644 --- a/riscos/wimputils.h +++ b/riscos/wimputils.h @@ -25,7 +25,7 @@ #include -/* Magical union for working around strict aliasing +/* Magical union to permit aliasing of wimp_window_state and wimp_open * Do not use this directly. Use the macros, instead. */ typedef union window_open_state { wimp_window_state state; @@ -35,4 +35,31 @@ typedef union window_open_state { /* Convert a pointer to a wimp_window_state into a pointer to a wimp_open */ #define PTR_WIMP_OPEN(pstate) ((wimp_open *) (window_open_state *) (pstate)) +/* Similarly for wimp_message_list */ +typedef struct ns_wimp_message_list { + /* Nasty hack to ensure that we have at least one field in the struct */ + int first; + int rest[]; +} ns_wimp_message_list; + +typedef union message_list { + wimp_message_list wimp; + ns_wimp_message_list ns; +} message_list; + +#define PTR_WIMP_MESSAGE_LIST(l) ((wimp_message_list *) (message_list *) (l)) + +/* Also for VDU variable lists */ +typedef struct ns_os_vdu_var_list { + os_vdu_var first; + os_vdu_var rest[]; +} ns_os_vdu_var_list; + +typedef union vdu_var_list { + os_vdu_var_list os; + ns_os_vdu_var_list ns; +} vdu_var_list; + +#define PTR_OS_VDU_VAR_LIST(l) ((os_vdu_var_list *) (vdu_var_list *) (l)) + #endif -- cgit v1.2.3