summaryrefslogtreecommitdiff
path: root/riscos
diff options
context:
space:
mode:
authorJohn Mark Bell <jmb@netsurf-browser.org>2009-03-28 19:10:29 +0000
committerJohn Mark Bell <jmb@netsurf-browser.org>2009-03-28 19:10:29 +0000
commit76755556e0d3ac715222061bd6d64a87ce2c2905 (patch)
tree984c1688e8acb04331241a5bef20227f5b29a570 /riscos
parentb180dd1a1198375765b30d0ddc3b773d432c5f99 (diff)
downloadnetsurf-76755556e0d3ac715222061bd6d64a87ce2c2905.tar.gz
netsurf-76755556e0d3ac715222061bd6d64a87ce2c2905.tar.bz2
Aliasing fun. This is ugly.
svn path=/trunk/netsurf/; revision=6971
Diffstat (limited to 'riscos')
-rw-r--r--riscos/gui.c109
-rw-r--r--riscos/wimputils.h29
2 files changed, 85 insertions, 53 deletions
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 <oslib/wimp.h>
-/* 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