diff options
-rw-r--r-- | !NetSurf/Resources/en/Messages | 5 | ||||
-rw-r--r-- | !NetSurf/Resources/en/Templates,fec | bin | 8371 -> 7168 bytes | |||
-rw-r--r-- | !NetSurf/Resources/fr/Messages | 5 | ||||
-rw-r--r-- | !NetSurf/Resources/fr/Templates,fec | bin | 8569 -> 7302 bytes | |||
-rw-r--r-- | content/fetch.c | 12 | ||||
-rw-r--r-- | desktop/options.c | 9 | ||||
-rw-r--r-- | desktop/options.h | 6 | ||||
-rw-r--r-- | riscos/dialog.c | 640 | ||||
-rw-r--r-- | riscos/gui.h | 65 | ||||
-rw-r--r-- | riscos/menus.c | 19 | ||||
-rw-r--r-- | riscos/wimp.c | 57 | ||||
-rw-r--r-- | riscos/wimp.h | 1 |
12 files changed, 435 insertions, 384 deletions
diff --git a/!NetSurf/Resources/en/Messages b/!NetSurf/Resources/en/Messages index e34423b83..4d80fe981 100644 --- a/!NetSurf/Resources/en/Messages +++ b/!NetSurf/Resources/en/Messages @@ -70,7 +70,10 @@ HelpInfo:User information HelpInter:Interactive help HelpAbout:About NetSurf -Themes:Themes +ProxyAuth:Authentication +ProxyNone:None +ProxyBasic:Basic +ProxyNTLM:NTLM # Hotlist menus Hotlist:Hotlist diff --git a/!NetSurf/Resources/en/Templates,fec b/!NetSurf/Resources/en/Templates,fec Binary files differindex 402102193..f3aabcfbe 100644 --- a/!NetSurf/Resources/en/Templates,fec +++ b/!NetSurf/Resources/en/Templates,fec diff --git a/!NetSurf/Resources/fr/Messages b/!NetSurf/Resources/fr/Messages index 1744865e9..82da1bdb9 100644 --- a/!NetSurf/Resources/fr/Messages +++ b/!NetSurf/Resources/fr/Messages @@ -70,7 +70,10 @@ HelpInfo:Information utilisateur HelpInter:Aide interactive HelpAbout:À propos de NetSurf -Themes:Thèmes +ProxyAuth:Authentication +ProxyNone:None +ProxyBasic:Basic +ProxyNTLM:NTLM # Hotlist menus Hotlist:Favoris diff --git a/!NetSurf/Resources/fr/Templates,fec b/!NetSurf/Resources/fr/Templates,fec Binary files differindex f522f27fb..bf7d117e0 100644 --- a/!NetSurf/Resources/fr/Templates,fec +++ b/!NetSurf/Resources/fr/Templates,fec diff --git a/content/fetch.c b/content/fetch.c index aca890cc4..81f5e3a26 100644 --- a/content/fetch.c +++ b/content/fetch.c @@ -351,6 +351,7 @@ CURLcode fetch_set_options(struct fetch *f) { CURLcode code; struct login *li; + char proxy_userpwd[100]; #undef SETOPT #define SETOPT(option, value) \ @@ -388,6 +389,17 @@ CURLcode fetch_set_options(struct fetch *f) if (option_http_proxy && option_http_proxy_host) { SETOPT(CURLOPT_PROXY, option_http_proxy_host); SETOPT(CURLOPT_PROXYPORT, (long) option_http_proxy_port); + if (option_http_proxy_auth != OPTION_HTTP_PROXY_AUTH_NONE) { + SETOPT(CURLOPT_PROXYAUTH, + option_http_proxy_auth == + OPTION_HTTP_PROXY_AUTH_BASIC ? + (long) CURLAUTH_BASIC : + (long) CURLAUTH_NTLM); + snprintf(proxy_userpwd, sizeof proxy_userpwd, "%s:%s", + option_http_proxy_auth_user, + option_http_proxy_auth_pass); + SETOPT(CURLOPT_PROXYUSERPWD, proxy_userpwd); + } } return CURLE_OK; diff --git a/desktop/options.c b/desktop/options.c index 92a3659e9..c999e0ea6 100644 --- a/desktop/options.c +++ b/desktop/options.c @@ -35,6 +35,12 @@ bool option_http_proxy = false; char *option_http_proxy_host = 0; /** Proxy port. */ int option_http_proxy_port = 8080; +/** Proxy authentication method. */ +int option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE; +/** Proxy authentication user name */ +char *option_http_proxy_auth_user = 0; +/** Proxy authentication password */ +char *option_http_proxy_auth_pass = 0; /** Default font size / 0.1pt. */ int option_font_size = 100; /** Minimum font size. */ @@ -57,6 +63,9 @@ struct { { "http_proxy", OPTION_BOOL, &option_http_proxy }, { "http_proxy_host", OPTION_STRING, &option_http_proxy_host }, { "http_proxy_port", OPTION_INTEGER, &option_http_proxy_port }, + { "http_proxy_auth", OPTION_BOOL, &option_http_proxy_auth }, + { "http_proxy_auth_user", OPTION_STRING, &option_http_proxy_auth_user }, + { "http_proxy_auth_pass", OPTION_STRING, &option_http_proxy_auth_pass }, { "font_size", OPTION_INTEGER, &option_font_size }, { "font_min_size", OPTION_INTEGER, &option_font_min_size }, { "accept_language", OPTION_STRING, &option_accept_language }, diff --git a/desktop/options.h b/desktop/options.h index a4f0de038..65fa59fc2 100644 --- a/desktop/options.h +++ b/desktop/options.h @@ -24,9 +24,15 @@ #ifndef _NETSURF_DESKTOP_OPTIONS_H_ #define _NETSURF_DESKTOP_OPTIONS_H_ +enum { OPTION_HTTP_PROXY_AUTH_NONE = 0, OPTION_HTTP_PROXY_AUTH_BASIC = 1, + OPTION_HTTP_PROXY_AUTH_NTLM = 2 }; + extern bool option_http_proxy; extern char *option_http_proxy_host; extern int option_http_proxy_port; +extern int option_http_proxy_auth; +extern char *option_http_proxy_auth_user; +extern char *option_http_proxy_auth_pass; extern int option_font_size; extern int option_font_min_size; extern char *option_accept_language; diff --git a/riscos/dialog.c b/riscos/dialog.c index 7f44ee302..bb46258ca 100644 --- a/riscos/dialog.c +++ b/riscos/dialog.c @@ -40,33 +40,38 @@ wimp_w dialog_info, dialog_saveas, dialog_config, dialog_config_br, dialog_warning, dialog_config_th_pane, dialog_debug, dialog_folder, dialog_entry; -static int font_size; -static int font_min_size; +static int ro_gui_choices_font_size; +static int ro_gui_choices_font_min_size; +static bool ro_gui_choices_http_proxy; +static int ro_gui_choices_http_proxy_auth; static char *theme_choice = 0; static struct theme_entry *theme_list = 0; static unsigned int theme_list_entries = 0; +static const char *ro_gui_proxy_auth_name[] = { + "ProxyNone", "ProxyBasic", "ProxyNTLM" +}; + /* A simple mapping of parent and child */ -static wimp_w persistant_dialog[MAX_PERSISTANT][1]; +static struct { + wimp_w dialog; + wimp_w parent; +} persistant_dialog[MAX_PERSISTANT]; +static void ro_gui_dialog_config_prepare(void); +static void ro_gui_dialog_config_set(void); static void ro_gui_dialog_click_config(wimp_pointer *pointer); static void ro_gui_dialog_click_config_br(wimp_pointer *pointer); static void ro_gui_dialog_update_config_br(void); static void ro_gui_dialog_click_config_prox(wimp_pointer *pointer); -static void ro_gui_dialog_open_config_th(void); +static void ro_gui_dialog_config_proxy_update(void); static void ro_gui_dialog_click_config_th(wimp_pointer *pointer); static void ro_gui_dialog_click_config_th_pane(wimp_pointer *pointer); static void ro_gui_redraw_config_th_pane_plot(wimp_draw *redraw); static void ro_gui_dialog_click_zoom(wimp_pointer *pointer); static void ro_gui_dialog_reset_zoom(void); static void ro_gui_dialog_click_warning(wimp_pointer *pointer); -static void set_browser_choices(void); -static void get_browser_choices(void); -static void set_proxy_choices(void); -static void get_proxy_choices(void); -static void set_theme_choices(void); -static void get_theme_choices(void); static const char *language_name(const char *code); @@ -94,10 +99,6 @@ void ro_gui_dialog_init(void) dialog_debug = ro_gui_dialog_create("debug"); dialog_folder = ro_gui_dialog_create("new_folder"); dialog_entry = ro_gui_dialog_create("new_entry"); - - set_browser_choices(); - set_proxy_choices(); - set_theme_choices(); } @@ -194,10 +195,12 @@ wimp_window * ro_gui_dialog_load_template(const char *template_name) /** * Open a dialog box, centered on the screen. */ + void ro_gui_dialog_open(wimp_w w) { int screen_x, screen_y, dx, dy; wimp_window_state open; + os_error *error; /* find screen centre in os units */ ro_gui_screen_size(&screen_x, &screen_y); @@ -206,7 +209,13 @@ void ro_gui_dialog_open(wimp_w w) /* centre and open */ open.w = w; - wimp_get_window_state(&open); + error = xwimp_get_window_state(&open); + if (error) { + LOG(("xwimp_get_window_state: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } dx = (open.visible.x1 - open.visible.x0) / 2; dy = (open.visible.y1 - open.visible.y0) / 2; open.visible.x0 = screen_x - dx; @@ -214,7 +223,13 @@ void ro_gui_dialog_open(wimp_w w) open.visible.y0 = screen_y - dy; open.visible.y1 = screen_y + dy; open.next = wimp_TOP; - wimp_open_window((wimp_open *) &open); + error = xwimp_open_window((wimp_open *) &open); + if (error) { + LOG(("xwimp_open_window: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } /* Set the caret position */ @@ -225,10 +240,12 @@ void ro_gui_dialog_open(wimp_w w) /** * Open a persistant dialog box relative to the pointer. * - * \param parent the owning window (NULL for no owner) - * \param w the dialog window - * \param pointer open the window at the pointer (centre of the parent otherwise) + * \param parent the owning window (NULL for no owner) + * \param w the dialog window + * \param pointer open the window at the pointer (centre of the parent + * otherwise) */ + void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { int dx, dy, i; wimp_pointer ptr; @@ -239,7 +256,7 @@ void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { */ error = xwimp_get_pointer_info(&ptr); if (error) { - LOG(("xwimp_get_pointer_info: 0x%x: %s\n", + LOG(("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; @@ -249,7 +266,13 @@ void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { */ if (pointer) { open.w = w; - wimp_get_window_state(&open); + error = xwimp_get_window_state(&open); + if (error) { + LOG(("xwimp_get_window_state: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } dx = (open.visible.x1 - open.visible.x0); dy = (open.visible.y1 - open.visible.y0); open.visible.x0 = ptr.pos.x - 64; @@ -257,7 +280,13 @@ void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { open.visible.y0 = ptr.pos.y - dy; open.visible.y1 = ptr.pos.y; open.next = wimp_TOP; - wimp_open_window((wimp_open *) &open); + error = xwimp_open_window((wimp_open *) &open); + if (error) { + LOG(("xwimp_open_window: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } } else { ro_gui_open_window_centre(parent, w); } @@ -268,11 +297,13 @@ void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { /* Add a mapping */ - if (parent == NULL) return; + if (parent == NULL) + return; for (i = 0; i < MAX_PERSISTANT; i++) { - if ((persistant_dialog[i][0] == NULL) || (persistant_dialog[i][0] == w)) { - persistant_dialog[i][0] = w; - persistant_dialog[i][1] = parent; + if (persistant_dialog[i].dialog == NULL || + persistant_dialog[i].dialog == w) { + persistant_dialog[i].dialog = w; + persistant_dialog[i].parent = parent; return; } } @@ -284,20 +315,21 @@ void ro_gui_dialog_open_persistant(wimp_w parent, wimp_w w, bool pointer) { /** - * Open a persistant dialog box relative to the pointer. + * Close persistent dialogs associated with a window. * - * \param parent the window to close children of + * \param parent the window to close children of */ + void ro_gui_dialog_close_persistant(wimp_w parent) { - int i; + int i; /* Check our mappings */ - if (parent == NULL) return; for (i = 0; i < MAX_PERSISTANT; i++) { - if ((persistant_dialog[i][1] == parent) && (persistant_dialog[i][0] != NULL)) { - ro_gui_dialog_close(persistant_dialog[i][0]); - persistant_dialog[i][0] = NULL; + if (persistant_dialog[i].parent == parent && + persistant_dialog[i].dialog != NULL) { + ro_gui_dialog_close(persistant_dialog[i].dialog); + persistant_dialog[i].dialog = NULL; } } } @@ -314,22 +346,24 @@ bool ro_gui_dialog_keypress(wimp_key *key) ro_gui_dialog_close(key->w); return true; } - if (key->c == wimp_KEY_RETURN) { + else if (key->c == wimp_KEY_RETURN) { if ((key->w == dialog_folder) || (key->w == dialog_entry)) { - pointer.w = key->w; - pointer.i = (key->w == dialog_folder) ? 3 : 5; + pointer.w = key->w; + /** \todo replace magic numbers with defines */ + pointer.i = (key->w == dialog_folder) ? 3 : 5; pointer.buttons = wimp_CLICK_SELECT; ro_gui_hotlist_dialog_click(&pointer); return true; } - } + } #ifdef WITH_AUTH if (key->w == dialog_401li) - return ro_gui_401login_keypress(key); + return ro_gui_401login_keypress(key); #endif return false; } + /** * Handle clicks in one of the dialog boxes. */ @@ -363,6 +397,118 @@ void ro_gui_dialog_click(wimp_pointer *pointer) /** + * Prepare and open the Choices dialog. + */ + +void ro_gui_dialog_open_config(void) +{ + ro_gui_dialog_config_prepare(); + ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_BROWSER, + true); + ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_PROXY, + false); + ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_THEME, + false); + ro_gui_dialog_open(dialog_config); + ro_gui_open_pane(dialog_config, dialog_config_br, 0); +} + + +/** + * Set the choices panes with the current options. + */ + +void ro_gui_dialog_config_prepare(void) +{ + /* browser pane */ + ro_gui_choices_font_size = option_font_size; + ro_gui_choices_font_min_size = option_font_min_size; + ro_gui_dialog_update_config_br(); + ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_LANG, + language_name(option_language ? + option_language : "en")); + ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_ALANG, + language_name(option_accept_language ? + option_accept_language : "en")); + ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_HOMEPAGE, + option_homepage_url ? option_homepage_url : ""); + ro_gui_set_icon_selected_state(dialog_config_br, + ICON_CONFIG_BR_OPENBROWSER, + option_open_browser_at_startup); + + /* proxy pane */ + ro_gui_choices_http_proxy = option_http_proxy; + ro_gui_set_icon_selected_state(dialog_config_prox, + ICON_CONFIG_PROX_HTTP, + option_http_proxy); + ro_gui_set_icon_string(dialog_config_prox, ICON_CONFIG_PROX_HTTPHOST, + option_http_proxy_host ? option_http_proxy_host : ""); + ro_gui_set_icon_integer(dialog_config_prox, ICON_CONFIG_PROX_HTTPPORT, + option_http_proxy_port); + ro_gui_choices_http_proxy_auth = option_http_proxy_auth; + ro_gui_set_icon_string(dialog_config_prox, + ICON_CONFIG_PROX_AUTHTYPE, + messages_get(ro_gui_proxy_auth_name[ + ro_gui_choices_http_proxy_auth])); + ro_gui_set_icon_string(dialog_config_prox, ICON_CONFIG_PROX_AUTHUSER, + option_http_proxy_auth_user ? + option_http_proxy_auth_user : ""); + ro_gui_set_icon_string(dialog_config_prox, ICON_CONFIG_PROX_AUTHPASS, + option_http_proxy_auth_pass ? + option_http_proxy_auth_pass : ""); + ro_gui_dialog_config_proxy_update(); + + /* themes pane */ + free(theme_choice); + theme_choice = 0; + if (option_theme) + theme_choice = strdup(option_theme); + if (theme_list) + ro_theme_list_free(theme_list, theme_list_entries); + theme_list = ro_theme_list(&theme_list_entries); +} + + +/** + * Set the current options to the settings in the choices panes. + */ + +void ro_gui_dialog_config_set(void) +{ + /* browser pane */ + option_font_size = ro_gui_choices_font_size; + option_font_min_size = ro_gui_choices_font_min_size; + option_homepage_url = strdup(ro_gui_get_icon_string(dialog_config_br, + ICON_CONFIG_BR_HOMEPAGE)); + option_open_browser_at_startup = ro_gui_get_icon_selected_state( + dialog_config_br, + ICON_CONFIG_BR_OPENBROWSER); + + /* proxy pane */ + option_http_proxy = ro_gui_choices_http_proxy; + free(option_http_proxy_host); + option_http_proxy_host = strdup(ro_gui_get_icon_string( + dialog_config_prox, + ICON_CONFIG_PROX_HTTPHOST)); + option_http_proxy_port = atoi(ro_gui_get_icon_string(dialog_config_prox, + ICON_CONFIG_PROX_HTTPPORT)); + option_http_proxy_auth = ro_gui_choices_http_proxy_auth; + free(option_http_proxy_auth_user); + option_http_proxy_auth_user = strdup(ro_gui_get_icon_string( + dialog_config_prox, + ICON_CONFIG_PROX_AUTHUSER)); + free(option_http_proxy_auth_pass); + option_http_proxy_auth_pass = strdup(ro_gui_get_icon_string( + dialog_config_prox, + ICON_CONFIG_PROX_AUTHPASS)); + + /* theme pane */ + free(option_theme); + option_theme = strdup(theme_choice); +} + + +/** * Handle clicks in the main Choices dialog. */ @@ -370,110 +516,105 @@ void ro_gui_dialog_click_config(wimp_pointer *pointer) { switch (pointer->i) { case ICON_CONFIG_SAVE: - get_browser_choices(); - get_proxy_choices(); - get_theme_choices(); + ro_gui_dialog_config_set(); ro_gui_save_options(); if (pointer->buttons == wimp_CLICK_SELECT) { - ro_gui_dialog_close(dialog_config_br); - ro_gui_dialog_close(dialog_config_prox); - ro_gui_dialog_close(dialog_config_th); ro_gui_dialog_close(dialog_config); + if (theme_list) { + ro_theme_list_free(theme_list, + theme_list_entries); + theme_list = 0; + } } break; case ICON_CONFIG_CANCEL: - if (pointer->buttons == wimp_CLICK_SELECT) { - ro_gui_dialog_close(dialog_config_br); - ro_gui_dialog_close(dialog_config_prox); - ro_gui_dialog_close(dialog_config_th); + if (pointer->buttons == wimp_CLICK_SELECT) ro_gui_dialog_close(dialog_config); - } - set_browser_choices(); - set_proxy_choices(); - set_theme_choices(); + ro_gui_dialog_config_prepare(); break; case ICON_CONFIG_BROWSER: /* set selected state of radio icon to prevent * de-selection of all radio icons */ if (pointer->buttons == wimp_CLICK_ADJUST) - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_BROWSER, true); - ro_gui_dialog_update_config(dialog_config_br); + ro_gui_set_icon_selected_state(dialog_config, + ICON_CONFIG_BROWSER, true); + ro_gui_open_pane(dialog_config, dialog_config_br, 0); break; case ICON_CONFIG_PROXY: if (pointer->buttons == wimp_CLICK_ADJUST) - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_PROXY, true); - ro_gui_dialog_update_config(dialog_config_prox); + ro_gui_set_icon_selected_state(dialog_config, + ICON_CONFIG_PROXY, true); + ro_gui_open_pane(dialog_config, dialog_config_prox, 0); break; case ICON_CONFIG_THEME: if (pointer->buttons == wimp_CLICK_ADJUST) - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_THEME, true); - ro_gui_dialog_open_config_th(); + ro_gui_set_icon_selected_state(dialog_config, + ICON_CONFIG_THEME, true); + ro_gui_open_pane(dialog_config, dialog_config_th, 0); + ro_gui_open_pane(dialog_config_th, + dialog_config_th_pane, 12); break; } } /** - * Save the current options + * Save the current options. */ void ro_gui_save_options(void) { - /* NCOS doesnt have the fancy Universal Boot vars; so select - * the path to the choices file based on the build options */ - #ifndef NCOS + /* NCOS doesnt have the fancy Universal Boot vars; so select + * the path to the choices file based on the build options */ +#ifndef NCOS xosfile_create_dir("<Choices$Write>.WWW", 0); xosfile_create_dir("<Choices$Write>.WWW.NetSurf", 0); options_write("<Choices$Write>.WWW.NetSurf.Choices"); - #else +#else xosfile_create_dir("<User$Path>.Choices.NetSurf", 0); xosfile_create_dir("<User$Path>.Choices.NetSurf.Choices", 0); options_write("<User$Path>.Choices.NetSurf.Choices"); - #endif +#endif } + /** - * Handle clicks in the Browser Choices dialog. + * Handle clicks in the Browser Choices pane. */ void ro_gui_dialog_click_config_br(wimp_pointer *pointer) { switch (pointer->i) { - case ICON_CONFIG_BR_OK: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_br); - break; - case ICON_CONFIG_BR_CANCEL: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_br); - set_browser_choices(); - break; case ICON_CONFIG_BR_FONTSIZE_DEC: - if (font_size == 50) + if (ro_gui_choices_font_size == 50) break; - font_size--; - if (font_size < font_min_size) - font_min_size = font_size; + ro_gui_choices_font_size--; + if (ro_gui_choices_font_size < + ro_gui_choices_font_min_size) + ro_gui_choices_font_min_size = + ro_gui_choices_font_size; ro_gui_dialog_update_config_br(); break; case ICON_CONFIG_BR_FONTSIZE_INC: - if (font_size == 1000) + if (ro_gui_choices_font_size == 1000) break; - font_size++; + ro_gui_choices_font_size++; ro_gui_dialog_update_config_br(); break; case ICON_CONFIG_BR_MINSIZE_DEC: - if (font_min_size == 10) + if (ro_gui_choices_font_min_size == 10) break; - font_min_size--; + ro_gui_choices_font_min_size--; ro_gui_dialog_update_config_br(); break; case ICON_CONFIG_BR_MINSIZE_INC: - if (font_min_size == 500) + if (ro_gui_choices_font_min_size == 500) break; - font_min_size++; - if (font_size < font_min_size) - font_size = font_min_size; + ro_gui_choices_font_min_size++; + if (ro_gui_choices_font_size < + ro_gui_choices_font_min_size) + ro_gui_choices_font_size = + ro_gui_choices_font_min_size; ro_gui_dialog_update_config_br(); break; } @@ -481,171 +622,84 @@ void ro_gui_dialog_click_config_br(wimp_pointer *pointer) /** - * Update font size icons in browser choices dialog. + * Update font size icons in browser choices pane. */ void ro_gui_dialog_update_config_br(void) { char s[10]; - sprintf(s, "%i.%ipt", font_size / 10, font_size % 10); + sprintf(s, "%i.%ipt", ro_gui_choices_font_size / 10, + ro_gui_choices_font_size % 10); ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_FONTSIZE, s); - sprintf(s, "%i.%ipt", font_min_size / 10, font_min_size % 10); + sprintf(s, "%i.%ipt", ro_gui_choices_font_min_size / 10, + ro_gui_choices_font_min_size % 10); ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_MINSIZE, s); } /** - * Handle clicks in the Proxy Choices dialog. + * Handle clicks in the Proxy Choices pane. */ void ro_gui_dialog_click_config_prox(wimp_pointer *pointer) { switch (pointer->i) { - case ICON_CONFIG_PROX_OK: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_prox); + case ICON_CONFIG_PROX_HTTP: + ro_gui_choices_http_proxy = !ro_gui_choices_http_proxy; + ro_gui_dialog_config_proxy_update(); break; - case ICON_CONFIG_PROX_CANCEL: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_prox); - set_proxy_choices(); + case ICON_CONFIG_PROX_AUTHTYPE_PICK: + ro_gui_popup_menu(proxyauth_menu, dialog_config_prox, + ICON_CONFIG_PROX_AUTHTYPE_PICK); break; } } -/** - * Prepare and open the Choices dialog. - */ - -void ro_gui_dialog_open_config(void) -{ - wimp_window_state state; - - ro_gui_dialog_open(dialog_config); - - state.w = dialog_config; - xwimp_get_window_state(&state); - state.w = dialog_config_prox; - state.visible.x0 += 0; - state.visible.y1 -= 0; - state.xscroll = 0; - state.yscroll = 0; - state.next = wimp_TOP; - if (xwimp_open_window_nested((wimp_open *)&state, dialog_config, - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_XORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_YORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_LS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_BS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_RS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_TS_EDGE_SHIFT)) { - LOG(("Unable to open config proxy pane window")); - } - - /* Always reset the selected panes to the default option */ - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_PROXY, - true); - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_BROWSER, - false); - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_THEME, - false); - ro_gui_set_icon_selected_state(dialog_config, ICON_CONFIG_MISC, - false); -} /** - * Update the pane in the Choices dialog. + * Handle a selection from the proxy auth method popup menu. */ -void ro_gui_dialog_update_config(wimp_w w) +void ro_gui_dialog_proxyauth_menu_selection(int item) { - wimp_window_state state; - - state.w = dialog_config; - xwimp_get_window_state(&state); - state.w = w; - state.visible.x0 += 0; - state.visible.y1 -= 0; - state.xscroll = 0; - state.yscroll = 0; - state.next = wimp_TOP; - if (xwimp_open_window_nested((wimp_open *)&state, dialog_config, - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_XORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_YORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_LS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_BS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_RS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_TS_EDGE_SHIFT)) { - LOG(("Unable to update config pane window")); - } + ro_gui_choices_http_proxy_auth = item; + ro_gui_set_icon_string(dialog_config_prox, + ICON_CONFIG_PROX_AUTHTYPE, + messages_get(ro_gui_proxy_auth_name[ + ro_gui_choices_http_proxy_auth])); + ro_gui_dialog_config_proxy_update(); } + /** - * Prepare and open the Theme Choices dialog. + * Update greying of icons in the proxy choices pane. */ -void ro_gui_dialog_open_config_th(void) +void ro_gui_dialog_config_proxy_update(void) { - wimp_window_state state; - if (theme_list) - ro_theme_list_free(theme_list, theme_list_entries); - - theme_list = ro_theme_list(&theme_list_entries); - if (!theme_list) - return; - - ro_gui_dialog_update_config(dialog_config_th); - - state.w = dialog_config_th; - xwimp_get_window_state(&state); - state.w = dialog_config_th_pane; - state.visible.x0 += 12; - state.visible.y1 -= 12; - state.xscroll = 0; - state.yscroll = 0; - state.next = wimp_TOP; - if (xwimp_open_window_nested((wimp_open *)&state, dialog_config_th, - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_XORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_YORIGIN_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT - << wimp_CHILD_LS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_BS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT - << wimp_CHILD_RS_EDGE_SHIFT | - wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT << wimp_CHILD_TS_EDGE_SHIFT)) { - LOG(("Unable to open theme pane window")); - } + int icon; + for (icon = ICON_CONFIG_PROX_HTTPHOST; + icon <= ICON_CONFIG_PROX_AUTHTYPE_PICK; + icon++) + ro_gui_set_icon_shaded_state(dialog_config_prox, + icon, !ro_gui_choices_http_proxy); + for (icon = ICON_CONFIG_PROX_AUTHTYPE_PICK + 1; + icon <= ICON_CONFIG_PROX_AUTHPASS; + icon++) + ro_gui_set_icon_shaded_state(dialog_config_prox, + icon, !ro_gui_choices_http_proxy || + ro_gui_choices_http_proxy_auth == + OPTION_HTTP_PROXY_AUTH_NONE); } /** - * Handle clicks in the Theme Choices dialog. + * Handle clicks in the Theme Choices pane. */ void ro_gui_dialog_click_config_th(wimp_pointer *pointer) { switch (pointer->i) { - case ICON_CONFIG_TH_OK: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_th); - break; - case ICON_CONFIG_TH_CANCEL: - if (pointer->buttons == wimp_CLICK_SELECT) - ro_gui_dialog_close(dialog_config_th); - set_theme_choices(); - break; case ICON_CONFIG_TH_MANAGE: os_cli("Filer_OpenDir " THEMES_DIR); break; @@ -863,9 +917,9 @@ void ro_gui_dialog_click_zoom(wimp_pointer *pointer) gui_reformat_pending = true; } - if ((pointer->buttons == wimp_CLICK_ADJUST) && (pointer->i == ICON_ZOOM_CANCEL)) { - ro_gui_dialog_reset_zoom(); - } + if (pointer->buttons == wimp_CLICK_ADJUST && + pointer->i == ICON_ZOOM_CANCEL) + ro_gui_dialog_reset_zoom(); if (pointer->buttons == wimp_CLICK_SELECT && (pointer->i == ICON_ZOOM_CANCEL || @@ -902,32 +956,43 @@ void ro_gui_dialog_click_warning(wimp_pointer *pointer) void ro_gui_dialog_close(wimp_w close) { - int i; + int i; wimp_caret caret; - os_error *error = NULL; + os_error *error; - /* Give the caret back to the parent window. This code relies on the fact that - only hotlist windows and browser windows open persistant dialogues, as the caret - gets placed to no icon. + /* Give the caret back to the parent window. This code relies on + the fact that only hotlist windows and browser windows open + persistant dialogues, as the caret gets placed to no icon. */ - if (!xwimp_get_caret_position(&caret)) { - if (caret.w == close) { - - /* Check if we are a persistant window - */ - for (i = 0; i < MAX_PERSISTANT; i++) { - if (persistant_dialog[i][0] == close) { - persistant_dialog[i][0] = NULL; - error = xwimp_set_caret_position(persistant_dialog[i][1], - wimp_ICON_WINDOW, -100, -100, 32, -1); + error = xwimp_get_caret_position(&caret); + if (error) { + LOG(("xwimp_get_caret_position: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } + + if (caret.w == close) { + /* Check if we are a persistant window + */ + for (i = 0; i < MAX_PERSISTANT; i++) { + if (persistant_dialog[i].dialog == close) { + persistant_dialog[i].dialog = NULL; + error = xwimp_set_caret_position( + persistant_dialog[i].parent, + wimp_ICON_WINDOW, -100, -100, + 32, -1); + if (error) { + LOG(("xwimp_set_caret_position: " + "0x%x: %s", + error->errnum, + error->errmess)); + warn_user("WimpError", error->errmess); + return; } + break; } } - if (error) { - LOG(("xwimp_set_caret_position: 0x%x: %s", - error->errnum, error->errmess)); - warn_user("WimpError", error->errmess); - } } error = xwimp_close_window(close); @@ -937,115 +1002,6 @@ void ro_gui_dialog_close(wimp_w close) warn_user("WimpError", error->errmess); return; } - - if (close == dialog_config_th) { - error = xwimp_close_window(dialog_config_th_pane); - - if (theme_list) { - ro_theme_list_free(theme_list, theme_list_entries); - theme_list = 0; - } - - if (error) { - LOG(("xwimp_close_window: 0x%x: %s", - error->errnum, error->errmess)); - warn_user("WimpError", error->errmess); - return; - } - } - -} - - -/** - * Update the browser choices dialog with the current options. - */ - -void set_browser_choices(void) { - font_size = option_font_size; - font_min_size = option_font_min_size; - ro_gui_dialog_update_config_br(); - ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_LANG, - language_name(option_language ? - option_language : "en")); - ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_ALANG, - language_name(option_accept_language ? - option_accept_language : "en")); - ro_gui_set_icon_string(dialog_config_br, ICON_CONFIG_BR_HOMEPAGE_URL, - option_homepage_url ? option_homepage_url : ""); - - ro_gui_set_icon_selected_state(dialog_config_br, ICON_CONFIG_BR_OPENBROWSER, - option_open_browser_at_startup); - -} - - -/** - * Set the current options to the settings in the browser choices dialog. - */ - -void get_browser_choices(void) { - option_font_size = font_size; - option_font_min_size = font_min_size; - option_homepage_url = ro_gui_get_icon_string(dialog_config_br, - ICON_CONFIG_BR_HOMEPAGE_URL); - option_open_browser_at_startup = ro_gui_get_icon_selected_state(dialog_config_br, - ICON_CONFIG_BR_OPENBROWSER); -} - - -/** - * Update the proxy choices dialog with the current options. - */ - -void set_proxy_choices(void) -{ - ro_gui_set_icon_selected_state(dialog_config_prox, ICON_CONFIG_PROX_HTTP, - option_http_proxy); - ro_gui_set_icon_string(dialog_config_prox, ICON_CONFIG_PROX_HTTPHOST, - option_http_proxy_host ? option_http_proxy_host : ""); - ro_gui_set_icon_integer(dialog_config_prox, ICON_CONFIG_PROX_HTTPPORT, - option_http_proxy_port); -} - - -/** - * Set the current options to the settings in the proxy choices dialog. - */ - -void get_proxy_choices(void) -{ - option_http_proxy = ro_gui_get_icon_selected_state(dialog_config_prox, - ICON_CONFIG_PROX_HTTP); - free(option_http_proxy_host); - option_http_proxy_host = strdup(ro_gui_get_icon_string(dialog_config_prox, - ICON_CONFIG_PROX_HTTPHOST)); - option_http_proxy_port = atoi(ro_gui_get_icon_string(dialog_config_prox, - ICON_CONFIG_PROX_HTTPPORT)); -} - - -/** - * Update the theme choices dialog with the current options. - */ - -void set_theme_choices(void) -{ - free(theme_choice); - theme_choice = 0; - if (option_theme) - theme_choice = strdup(option_theme); -} - - -/** - * Set the current options to the settings in the theme choices dialog. - */ - -void get_theme_choices(void) -{ - free(option_theme); - option_theme = strdup(theme_choice); } diff --git a/riscos/gui.h b/riscos/gui.h index 0c1248105..54c4215ca 100644 --- a/riscos/gui.h +++ b/riscos/gui.h @@ -29,7 +29,8 @@ extern wimp_w dialog_info, dialog_saveas, dialog_config, dialog_config_br, dialog_debug, dialog_folder, dialog_entry; extern wimp_w history_window; extern wimp_w hotlist_window; -extern wimp_menu *iconbar_menu, *browser_menu, *combo_menu, *hotlist_menu; +extern wimp_menu *iconbar_menu, *browser_menu, *combo_menu, *hotlist_menu, + *proxyauth_menu; extern int iconbar_menu_height; extern struct form_control *current_gadget; extern bool gui_reformat_pending; @@ -131,7 +132,7 @@ void ro_gui_dialog_close(wimp_w close); void ro_gui_redraw_config_th_pane(wimp_draw *redraw); void ro_gui_menu_prepare_hotlist(void); void ro_gui_dialog_open_config(void); -void ro_gui_dialog_update_config(wimp_w w); +void ro_gui_dialog_proxyauth_menu_selection(int item); /* in download.c */ void ro_gui_download_init(void); @@ -270,39 +271,33 @@ void ro_gui_debugwin_redraw(wimp_draw *redraw); #define ICON_CONFIG_SAVE 0 #define ICON_CONFIG_CANCEL 1 -#define ICON_CONFIG_BROWSER 7 -#define ICON_CONFIG_PROXY 6 -#define ICON_CONFIG_THEME 8 -#define ICON_CONFIG_MISC 9 - -#define ICON_CONFIG_BR_OK 0 -#define ICON_CONFIG_BR_CANCEL 1 -#define ICON_CONFIG_BR_FONTSIZE 3 -#define ICON_CONFIG_BR_FONTSIZE_DEC 4 -#define ICON_CONFIG_BR_FONTSIZE_INC 5 -#define ICON_CONFIG_BR_MINSIZE 7 -#define ICON_CONFIG_BR_MINSIZE_DEC 8 -#define ICON_CONFIG_BR_MINSIZE_INC 9 -#define ICON_CONFIG_BR_LANG 11 -#define ICON_CONFIG_BR_LANG_PICK 12 -#define ICON_CONFIG_BR_ALANG 15 -#define ICON_CONFIG_BR_ALANG_PICK 16 -#define ICON_CONFIG_BR_HOMEPAGE_URL 20 -#define ICON_CONFIG_BR_HOMEPAGE_CURRENT 21 -#define ICON_CONFIG_BR_HOMEPAGE_DEFAULT 22 -#define ICON_CONFIG_BR_HOMEPAGE_BLANK 23 -#define ICON_CONFIG_BR_OPENBROWSER 24 - -#define ICON_CONFIG_PROX_OK 0 -#define ICON_CONFIG_PROX_CANCEL 1 -#define ICON_CONFIG_PROX_HTTP 2 -#define ICON_CONFIG_PROX_HTTPHOST 3 -#define ICON_CONFIG_PROX_HTTPPORT 4 - -#define ICON_CONFIG_TH_OK 0 -#define ICON_CONFIG_TH_CANCEL 1 -#define ICON_CONFIG_TH_GET 2 -#define ICON_CONFIG_TH_MANAGE 3 +#define ICON_CONFIG_BROWSER 3 +#define ICON_CONFIG_PROXY 4 +#define ICON_CONFIG_THEME 5 + +#define ICON_CONFIG_BR_FONTSIZE 1 +#define ICON_CONFIG_BR_FONTSIZE_DEC 2 +#define ICON_CONFIG_BR_FONTSIZE_INC 3 +#define ICON_CONFIG_BR_MINSIZE 5 +#define ICON_CONFIG_BR_MINSIZE_DEC 6 +#define ICON_CONFIG_BR_MINSIZE_INC 7 +#define ICON_CONFIG_BR_LANG 9 +#define ICON_CONFIG_BR_LANG_PICK 10 +#define ICON_CONFIG_BR_ALANG 13 +#define ICON_CONFIG_BR_ALANG_PICK 14 +#define ICON_CONFIG_BR_HOMEPAGE 16 +#define ICON_CONFIG_BR_OPENBROWSER 17 + +#define ICON_CONFIG_PROX_HTTP 0 +#define ICON_CONFIG_PROX_HTTPHOST 1 +#define ICON_CONFIG_PROX_HTTPPORT 3 +#define ICON_CONFIG_PROX_AUTHTYPE 5 +#define ICON_CONFIG_PROX_AUTHTYPE_PICK 6 +#define ICON_CONFIG_PROX_AUTHUSER 8 +#define ICON_CONFIG_PROX_AUTHPASS 10 + +#define ICON_CONFIG_TH_GET 0 +#define ICON_CONFIG_TH_MANAGE 1 #define ICON_DOWNLOAD_ICON 0 #define ICON_DOWNLOAD_URL 1 diff --git a/riscos/menus.c b/riscos/menus.c index 3fe6e7a80..ad35df084 100644 --- a/riscos/menus.c +++ b/riscos/menus.c @@ -383,6 +383,18 @@ static wimp_MENU(4) hotlist_root = { wimp_menu *hotlist_menu = (wimp_menu *)&hotlist_root; +/* Proxy auth popup menu (used in proxy Choices dialog +*/ +static wimp_MENU(3) proxy_menu = { + { "ProxyAuth" }, 7,2,7,0, 200, 44, 0, + { + { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ProxyNone" } }, + { 0, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ProxyBasic" } }, + { wimp_MENU_LAST, wimp_NO_SUB_MENU, DEFAULT_FLAGS, { "ProxyNTLM" } }, + } +}; +wimp_menu *proxyauth_menu = (wimp_menu *) &proxy_menu; + static wimp_menu *browser_page_menu = (wimp_menu *)&page_menu; static wimp_menu *browser_export_menu = (wimp_menu *)&export_menu; @@ -441,6 +453,8 @@ void ro_gui_menus_init(void) translate_menu(hotlist_save_menu); translate_menu(hotlist_select_menu); + translate_menu(proxyauth_menu); + iconbar_menu->entries[0].sub_menu = (wimp_menu *) dialog_info; browser_page_menu->entries[0].sub_menu = (wimp_menu*) dialog_pageinfo; browser_object_menu->entries[0].sub_menu = (wimp_menu*) dialog_objinfo; @@ -593,7 +607,7 @@ void ro_gui_menu_selection(wimp_selection *selection) ro_gui_open_help_page("docs"); break; case 2: /* Choices */ - ro_gui_dialog_open_config(); + ro_gui_dialog_open_config(); break; case 3: /* Quit */ netsurf_quit = true; @@ -887,6 +901,9 @@ void ro_gui_menu_selection(wimp_selection *selection) break; } + } else if (current_menu == proxyauth_menu) { + ro_gui_dialog_proxyauth_menu_selection(selection->items[0]); + } if (pointer.buttons == wimp_CLICK_ADJUST) { diff --git a/riscos/wimp.c b/riscos/wimp.c index fcb5bcd9f..8fe3b8b72 100644 --- a/riscos/wimp.c +++ b/riscos/wimp.c @@ -320,14 +320,14 @@ void ro_gui_set_caret_first(wimp_w w) { warn_user("WimpError", error->errmess); return; } - + /* Check if it's writable */ button = (state.icon.flags >> wimp_ICON_BUTTON_TYPE_SHIFT) & 0xf; - if ((button == wimp_BUTTON_WRITE_CLICK_DRAG) || + if ((button == wimp_BUTTON_WRITE_CLICK_DRAG) || (button == wimp_BUTTON_WRITABLE)) { xwimp_set_caret_position(w, icon, 0, 0, -1, strlen(state.icon.data.indirected_text.text)); - return; + return; } } } @@ -355,7 +355,7 @@ void ro_gui_open_window_centre(wimp_w parent, wimp_w child) { return; } scroll_width = ro_get_vscroll_width(parent); - + /* Get the centre of the parent */ mid_x = (state.visible.x0 + state.visible.x1 + scroll_width) / 2; @@ -463,3 +463,52 @@ bool ro_gui_wimp_sprite_exists(const char *sprite) } return true; } + + +/** + * Open a window as a pane in another window. + * + * \param parent parent window + * \param pane pane to open in parent window + * \param offset offset of top-left of pane from top-left of parent + */ + +void ro_gui_open_pane(wimp_w parent, wimp_w pane, int offset) +{ + wimp_window_state state; + os_error *error; + + state.w = parent; + error = xwimp_get_window_state(&state); + if (error) { + LOG(("xwimp_get_window_state: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } + state.w = pane; + state.visible.x0 += offset; + state.visible.y1 -= offset; + state.xscroll = 0; + state.yscroll = 0; + state.next = wimp_TOP; + error = xwimp_open_window_nested((wimp_open *) &state, parent, + wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT + << wimp_CHILD_XORIGIN_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT + << wimp_CHILD_YORIGIN_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT + << wimp_CHILD_LS_EDGE_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT + << wimp_CHILD_BS_EDGE_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT + << wimp_CHILD_RS_EDGE_SHIFT | + wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT + << wimp_CHILD_TS_EDGE_SHIFT); + if (error) { + LOG(("xwimp_open_window_nested: 0x%x: %s", + error->errnum, error->errmess)); + warn_user("WimpError", error->errmess); + return; + } +} diff --git a/riscos/wimp.h b/riscos/wimp.h index daa386e15..d26fccdfe 100644 --- a/riscos/wimp.h +++ b/riscos/wimp.h @@ -47,5 +47,6 @@ void ro_gui_open_window_centre(wimp_w parent, wimp_w child); osspriteop_area *ro_gui_load_sprite_file(const char *pathname); bool ro_gui_wimp_sprite_exists(const char *sprite); +void ro_gui_open_pane(wimp_w parent, wimp_w pane, int offset); #endif |