summaryrefslogtreecommitdiff
path: root/riscos/dialog.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2016-05-05 22:28:51 +0100
committerVincent Sanders <vince@kyllikki.org>2016-05-15 13:44:34 +0100
commitd21447d096a320a08b3efb2b8768fad0dcdcfd64 (patch)
tree1a83814b7c9e94b2f13c473261f23dd3a17dee64 /riscos/dialog.c
parent2cbb337756d9af5bda4d594964d446439f602551 (diff)
downloadnetsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.gz
netsurf-d21447d096a320a08b3efb2b8768fad0dcdcfd64.tar.bz2
move frontends into sub directory
Diffstat (limited to 'riscos/dialog.c')
-rw-r--r--riscos/dialog.c816
1 files changed, 0 insertions, 816 deletions
diff --git a/riscos/dialog.c b/riscos/dialog.c
deleted file mode 100644
index d4356086d..000000000
--- a/riscos/dialog.c
+++ /dev/null
@@ -1,816 +0,0 @@
-/*
- * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net>
- * Copyright 2005 James Bursa <bursa@users.sourceforge.net>
- * Copyright 2003 John M Bell <jmb202@ecs.soton.ac.uk>
- * Copyright 2005 Richard Wilson <info@tinct.net>
- * Copyright 2004 Andrew Timmins <atimmins@blueyonder.co.uk>
- * Copyright 2005 Adrian Lees <adrianl@users.sourceforge.net>
- * Copyright 2014 Stephen Fryatt <stevef@netsurf-browser.org>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "utils/config.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-#include <oslib/colourtrans.h>
-#include <oslib/osfile.h>
-#include <oslib/osgbpb.h>
-#include <oslib/osspriteop.h>
-#include <oslib/wimp.h>
-
-#include "utils/nsoption.h"
-#include "utils/log.h"
-#include "utils/messages.h"
-#include "utils/nsurl.h"
-#include "desktop/version.h"
-#include "desktop/browser.h"
-
-#include "riscos/configure.h"
-#include "riscos/cookies.h"
-#include "riscos/dialog.h"
-#include "riscos/global_history.h"
-#include "riscos/gui.h"
-#include "riscos/hotlist.h"
-#include "riscos/menus.h"
-#include "riscos/save.h"
-#include "riscos/sslcert.h"
-#include "riscos/toolbar.h"
-#include "riscos/url_complete.h"
-#include "riscos/url_suggest.h"
-#include "riscos/wimp.h"
-#include "riscos/wimp_event.h"
-#include "riscos/wimputils.h"
-
-#define ICON_ZOOM_VALUE 1
-#define ICON_ZOOM_DEC 2
-#define ICON_ZOOM_INC 3
-#define ICON_ZOOM_FRAMES 5
-#define ICON_ZOOM_CANCEL 7
-#define ICON_ZOOM_OK 8
-
-/* The maximum number of persistent dialogues
-*/
-#define MAX_PERSISTENT 64
-
-
-wimp_w dialog_info, dialog_saveas,
- dialog_401li,
- dialog_zoom, dialog_pageinfo, dialog_objinfo, dialog_tooltip,
- dialog_warning,
- dialog_folder, dialog_entry, dialog_search, dialog_print,
- dialog_url_complete, dialog_openurl;
-
-struct gui_window *ro_gui_current_zoom_gui;
-
-
-/* A simple mapping of parent and child
-*/
-static struct {
- wimp_w dialog;
- wimp_w parent;
-} persistent_dialog[MAX_PERSISTENT];
-
-
-static bool ro_gui_dialog_open_url_init(void);
-static bool ro_gui_dialog_openurl_apply(wimp_w w);
-static bool ro_gui_dialog_open_url_menu_prepare(wimp_w w, wimp_i i,
- wimp_menu *menu, wimp_pointer *pointer);
-
-static bool ro_gui_dialog_zoom_apply(wimp_w w);
-
-/**
- * Load and create dialogs from template file.
- */
-
-void ro_gui_dialog_init(void)
-{
- /* warning dialog */
- dialog_warning = ro_gui_dialog_create("warning");
- ro_gui_wimp_event_register_ok(dialog_warning, ICON_WARNING_CONTINUE,
- NULL);
- ro_gui_wimp_event_set_help_prefix(dialog_warning, "HelpWarning");
-
- /* tooltip for history */
- dialog_tooltip = ro_gui_dialog_create("tooltip");
-
- /* configure window */
- ro_gui_configure_initialise();
-
- /* 401 login window */
- ro_gui_401login_init();
-
- /* theme installation */
- dialog_theme_install = ro_gui_dialog_create("theme_inst");
- ro_gui_wimp_event_register_cancel(dialog_theme_install,
- ICON_THEME_INSTALL_CANCEL);
- ro_gui_wimp_event_register_ok(dialog_theme_install,
- ICON_THEME_INSTALL_INSTALL,
- ro_gui_theme_install_apply);
- ro_gui_wimp_event_set_help_prefix(dialog_theme_install, "HelpThemeInst");
-
- /* search */
- ro_gui_search_init();
-
- /* print */
- ro_gui_print_init();
-
- /* about us */
- dialog_info = ro_gui_dialog_create("info");
- ro_gui_set_icon_string(dialog_info, 4, netsurf_version, true);
- ro_gui_wimp_event_set_help_prefix(dialog_info, "HelpAppInfo");
-
- /* page info */
- dialog_pageinfo = ro_gui_dialog_create("pageinfo");
- ro_gui_wimp_event_set_help_prefix(dialog_pageinfo, "HelpPageInfo");
-
- /* object info */
- dialog_objinfo = ro_gui_dialog_create("objectinfo");
- ro_gui_wimp_event_set_help_prefix(dialog_objinfo, "HelpObjInfo");
-
- /* save as */
- dialog_saveas = ro_gui_saveas_create("saveas");
- ro_gui_wimp_event_register_button(dialog_saveas, ICON_SAVE_ICON,
- ro_gui_save_start_drag);
- ro_gui_wimp_event_register_text_field(dialog_saveas, ICON_SAVE_PATH);
- ro_gui_wimp_event_register_cancel(dialog_saveas, ICON_SAVE_CANCEL);
- ro_gui_wimp_event_register_ok(dialog_saveas, ICON_SAVE_OK,
- ro_gui_save_ok);
- ro_gui_wimp_event_set_help_prefix(dialog_saveas, "HelpSaveAs");
-
- /* url suggestion */
- dialog_url_complete = ro_gui_dialog_create("url_suggest");
- ro_gui_wimp_event_register_mouse_click(dialog_url_complete,
- ro_gui_url_complete_click);
- ro_gui_wimp_event_register_pointer_entering_window(dialog_url_complete,
- ro_gui_url_complete_entering);
- ro_gui_wimp_event_register_redraw_window(dialog_url_complete,
- ro_gui_url_complete_redraw);
- ro_gui_wimp_event_set_help_prefix(dialog_url_complete, "HelpAutoURL");
-
- /* open URL */
- ro_gui_dialog_open_url_init();
-
- /* scale view */
- dialog_zoom = ro_gui_dialog_create("zoom");
- ro_gui_wimp_event_register_numeric_field(dialog_zoom, ICON_ZOOM_VALUE,
- ICON_ZOOM_INC, ICON_ZOOM_DEC, 10, 1600, 10, 0);
- ro_gui_wimp_event_register_checkbox(dialog_zoom, ICON_ZOOM_FRAMES);
- ro_gui_wimp_event_register_cancel(dialog_zoom, ICON_ZOOM_CANCEL);
- ro_gui_wimp_event_register_ok(dialog_zoom, ICON_ZOOM_OK,
- ro_gui_dialog_zoom_apply);
- ro_gui_wimp_event_set_help_prefix(dialog_zoom, "HelpScaleView");
-
- /* Treeview initialisation has moved to the end, to allow any
- * associated dialogues to be set up first.
- */
-
- /* certificate verification window */
- ro_gui_cert_preinitialise();
-
- /* hotlist window */
- ro_gui_hotlist_preinitialise();
-
- /* global history window */
- ro_gui_global_history_preinitialise();
-
- /* cookies window */
- ro_gui_cookies_preinitialise();
-}
-
-
-/**
- * Create a window from a template.
- *
- * \param template_name name of template to load
- * \return window handle
- *
- * Exits through die() on error.
- */
-
-wimp_w ro_gui_dialog_create(const char *template_name)
-{
- wimp_window *window;
- wimp_w w;
- os_error *error;
-
- window = ro_gui_dialog_load_template(template_name);
-
- /* create window */
- window->sprite_area = gui_sprites;
- error = xwimp_create_window(window, &w);
- if (error) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
- xwimp_close_template();
- die(error->errmess);
- }
-
- /* the window definition is copied by the wimp and may be freed */
- free(window);
-
- return w;
-}
-
-
-/**
- * Load a template without creating a window.
- *
- * \param template_name name of template to load
- * \return window block
- *
- * Exits through die() on error.
- */
-
-wimp_window * ro_gui_dialog_load_template(const char *template_name)
-{
- char name[20];
- int context, window_size, data_size;
- char *data;
- wimp_window *window;
- os_error *error;
-
- /* Template names must be <= 11 chars long */
- assert(strlen(template_name) <= 11);
-
- /* wimp_load_template won't accept a const char * */
- strncpy(name, template_name, sizeof name);
-
- /* find required buffer sizes */
- error = xwimp_load_template(wimp_GET_SIZE, 0, 0, wimp_NO_FONTS,
- name, 0, &window_size, &data_size, &context);
- if (error) {
- LOG("xwimp_load_template: 0x%x: %s", error->errnum, error->errmess);
- xwimp_close_template();
- die(error->errmess);
- }
- if (!context) {
- LOG("template '%s' missing", template_name);
- xwimp_close_template();
- die("Template");
- }
-
- /* allocate space for indirected data and temporary window buffer */
- data = malloc(data_size);
- window = malloc(window_size);
- if (!data || !window) {
- xwimp_close_template();
- die("NoMemory");
- }
-
- /* load template */
- error = xwimp_load_template(window, data, data + data_size,
- wimp_NO_FONTS, name, 0, 0, 0, 0);
- if (error) {
- LOG("xwimp_load_template: 0x%x: %s", error->errnum, error->errmess);
- xwimp_close_template();
- die(error->errmess);
- }
-
- return window;
-}
-
-
-/**
- * Open a dialog box, centred on the screen.
- */
-
-void ro_gui_dialog_open(wimp_w w)
-{
- int screen_x, screen_y, dx, dy;
- wimp_window_state state;
- os_error *error;
-
- /* find screen centre in os units */
- ro_gui_screen_size(&screen_x, &screen_y);
- screen_x /= 2;
- screen_y /= 2;
-
- /* centre and open */
- state.w = w;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
- dx = (state.visible.x1 - state.visible.x0) / 2;
- dy = (state.visible.y1 - state.visible.y0) / 2;
- state.visible.x0 = screen_x - dx;
- state.visible.x1 = screen_x + dx;
- state.visible.y0 = screen_y - dy;
- state.visible.y1 = screen_y + dy;
- state.next = wimp_TOP;
- ro_gui_open_window_request(PTR_WIMP_OPEN(&state));
-
- /* Set the caret position */
- ro_gui_set_caret_first(w);
-}
-
-
-/**
- * Close a dialog box.
- */
-
-void ro_gui_dialog_close(wimp_w close)
-{
- int i;
- wimp_caret caret;
- os_error *error;
-
- /* Check if we're a persistent window */
- for (i = 0; i < MAX_PERSISTENT; i++) {
- if (persistent_dialog[i].dialog == close) {
- /* We are => invalidate record */
- persistent_dialog[i].parent = NULL;
- persistent_dialog[i].dialog = NULL;
- break;
- }
- }
-
- /* Close any child windows */
- ro_gui_dialog_close_persistent(close);
-
- /* Give the caret back to the parent window. This code relies on
- the fact that only tree windows and browser windows open
- persistent dialogues, as the caret gets placed to no icon.
- */
- error = xwimp_get_caret_position(&caret);
- if (error) {
- LOG("xwimp_get_caret_position: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- } else if (caret.w == close) {
- /* Check if we are a persistent window */
- if (i < MAX_PERSISTENT) {
- error = xwimp_set_caret_position(
- persistent_dialog[i].parent,
- wimp_ICON_WINDOW, -100, -100,
- 32, -1);
- /* parent may have been closed first */
- if ((error) && (error->errnum != 0x287)) {
- LOG("xwimp_set_caret_position: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- }
- }
- }
-
- error = xwimp_close_window(close);
- if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- }
-}
-
-
-/**
- * Moves a window to the top of the stack.
- *
- * If the window is currently closed then:
- *
- * * The window is opened in the centre of the screen (at the supplied size)
- * * Any toolbar editing session is stopped
- * * The scroll position is set to the top of the window
- *
- * If the window is currently open then:
- *
- * * The window is brought to the top of the stack
- *
- * \param w the window to show
- * \param toolbar the toolbar to consider
- * \param width the window width if it is currently closed (or 0 to retain)
- * \param height the window height if it is currently closed (or 0 to retain)
- * \return true if the window was previously open
- */
-bool ro_gui_dialog_open_top(wimp_w w, struct toolbar *toolbar,
- int width, int height) {
- os_error *error;
- int screen_width, screen_height;
- wimp_window_state state;
- bool open;
-
- state.w = w;
- error = xwimp_get_window_state(&state);
- if (error) {
- ro_warn_user("WimpError", error->errmess);
- return false;
- }
-
- /* if we're open we jump to the top of the stack, if not then we
- * open in the centre of the screen. */
- open = state.flags & wimp_WINDOW_OPEN;
- if (!open) {
- int dimension;
- int scroll_width;
- /* cancel any editing */
- if (ro_toolbar_get_editing(toolbar))
- ro_toolbar_toggle_edit(toolbar);
-
- /* move to the centre */
- ro_gui_screen_size(&screen_width, &screen_height);
- dimension = ((width == 0) ?
- (state.visible.x1 - state.visible.x0) : width);
- scroll_width = ro_get_vscroll_width(w);
- state.visible.x0 = (screen_width - (dimension + scroll_width)) / 2;
- state.visible.x1 = state.visible.x0 + dimension;
- dimension = ((height == 0) ?
- (state.visible.y1 - state.visible.y0) : height);
- state.visible.y0 = (screen_height - dimension) / 2;
- state.visible.y1 = state.visible.y0 + dimension;
- state.xscroll = 0;
- state.yscroll = 0;
- if (toolbar)
- state.yscroll = ro_toolbar_height(toolbar);
- }
-
- /* open the window at the top of the stack */
- state.next = wimp_TOP;
- ro_gui_open_window_request(PTR_WIMP_OPEN(&state));
- return open;
-}
-
-
-/**
- * Open window at the location of the pointer.
- */
-
-void ro_gui_dialog_open_at_pointer(wimp_w w)
-{
- wimp_pointer ptr;
- os_error *error;
-
- /* get the pointer position */
- error = xwimp_get_pointer_info(&ptr);
- if (error) {
- LOG("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
-
- ro_gui_dialog_open_xy(w, ptr.pos.x - 64, ptr.pos.y);
-}
-
-
-/**
- * Open window at a specified location.
- */
-
-void ro_gui_dialog_open_xy(wimp_w w, int x, int y)
-{
- wimp_window_state state;
- os_error *error;
- int dx, dy;
-
- /* move the window */
- state.w = w;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
- dx = (state.visible.x1 - state.visible.x0);
- dy = (state.visible.y1 - state.visible.y0);
- state.visible.x0 = x;
- state.visible.x1 = x + dx;
- state.visible.y0 = y - dy;
- state.visible.y1 = y;
-
- /* if the window is already open, close it first so that it opens fully
- * on screen */
- error = xwimp_close_window(w);
- if (error) {
- LOG("xwimp_close_window: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
-
- /* open the window at the top of the stack */
- state.next = wimp_TOP;
- ro_gui_open_window_request(PTR_WIMP_OPEN(&state));
-}
-
-
-/**
- * Opens a window at the centre of either another window or the screen
- *
- * /param parent the parent window (NULL for centre of screen)
- * /param child the child window
- */
-void ro_gui_dialog_open_centre_parent(wimp_w parent, wimp_w child) {
- os_error *error;
- wimp_window_state state;
- int mid_x, mid_y;
- int dimension, scroll_width;
-
- /* get the parent window state */
- if (parent) {
- state.w = parent;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
- scroll_width = ro_get_vscroll_width(parent);
- mid_x = (state.visible.x0 + state.visible.x1 + scroll_width);
- mid_y = (state.visible.y0 + state.visible.y1);
- } else {
- ro_gui_screen_size(&mid_x, &mid_y);
- }
- mid_x /= 2;
- mid_y /= 2;
-
- /* get the child window state */
- state.w = child;
- error = xwimp_get_window_state(&state);
- if (error) {
- LOG("xwimp_get_window_state: 0x%x: %s", error->errnum, error->errmess);
- ro_warn_user("WimpError", error->errmess);
- return;
- }
-
- /* move to the centre of the parent at the top of the stack */
- dimension = state.visible.x1 - state.visible.x0;
- scroll_width = ro_get_vscroll_width(history_window);
- state.visible.x0 = mid_x - (dimension + scroll_width) / 2;
- state.visible.x1 = state.visible.x0 + dimension;
- dimension = state.visible.y1 - state.visible.y0;
- state.visible.y0 = mid_y - dimension / 2;
- state.visible.y1 = state.visible.y0 + dimension;
- state.next = wimp_TOP;
- ro_gui_open_window_request(PTR_WIMP_OPEN(&state));
-}
-
-
-/**
- * Open a persistent 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)
- */
-
-void ro_gui_dialog_open_persistent(wimp_w parent, wimp_w w, bool pointer) {
-
- if (pointer)
- ro_gui_dialog_open_at_pointer(w);
- else
- ro_gui_dialog_open_centre_parent(parent, w);
-
- /* todo: use wimp_event definitions rather than special cases */
- if ((w == dialog_pageinfo) || (w == dialog_objinfo))
- ro_gui_wimp_update_window_furniture(w, wimp_WINDOW_CLOSE_ICON,
- wimp_WINDOW_CLOSE_ICON);
- ro_gui_dialog_add_persistent(parent, w);
- ro_gui_set_caret_first(w);
-}
-
-
-void ro_gui_dialog_add_persistent(wimp_w parent, wimp_w w) {
- int i;
-
- /* all persistant windows have a back icon */
- ro_gui_wimp_update_window_furniture(w, wimp_WINDOW_BACK_ICON,
- wimp_WINDOW_BACK_ICON);
-
- /* Add a mapping
- */
- if ((parent == NULL) || (parent == wimp_ICON_BAR))
- return;
- for (i = 0; i < MAX_PERSISTENT; i++) {
- if (persistent_dialog[i].dialog == NULL ||
- persistent_dialog[i].dialog == w) {
- persistent_dialog[i].dialog = w;
- persistent_dialog[i].parent = parent;
- return;
- }
- }
- LOG("Unable to map persistent dialog to parent.");
- return;
-}
-
-
-/**
- * Close persistent dialogs associated with a window.
- *
- * \param parent the window to close children of
- */
-
-void ro_gui_dialog_close_persistent(wimp_w parent) {
- int i;
- wimp_w w;
-
- /* Check our mappings.
- *
- * The window handle is copied into w before proceeding, as
- * ro_gui_dialog_close() will NULL persistent_dialog[i].dialog as
- * part of the closing process. This would mean that the subsequent
- * event dispatch would fail. (These events are logged to allow
- * side effects to be investigated -- this code hasn't worked before).
- */
- for (i = 0; i < MAX_PERSISTENT; i++) {
- if (persistent_dialog[i].parent == parent &&
- persistent_dialog[i].dialog != NULL) {
- w = persistent_dialog[i].dialog;
- ro_gui_dialog_close(w);
- if (ro_gui_wimp_event_close_window(w))
- LOG("Persistent dialog close event: 0x%x", (unsigned)w);
- persistent_dialog[i].parent = NULL;
- persistent_dialog[i].dialog = NULL;
- }
- }
-}
-
-
-/**
- * Save the current options.
- */
-
-void ro_gui_save_options(void)
-{
- nsoption_write("<NetSurf$ChoicesSave>", NULL, NULL);
-}
-
-bool ro_gui_dialog_zoom_apply(wimp_w w) {
- unsigned int scale;
- bool all;
-
- scale = atoi(ro_gui_get_icon_string(w, ICON_ZOOM_VALUE));
- all = ro_gui_get_icon_selected_state(w, ICON_ZOOM_FRAMES);
- ro_gui_window_set_scale(ro_gui_current_zoom_gui, scale * 0.01);
- return true;
-}
-
-
-/**
- * Prepares the Scale view dialog.
- */
-
-void ro_gui_dialog_prepare_zoom(struct gui_window *g)
-{
- char scale_buffer[8];
- sprintf(scale_buffer, "%.0f", browser_window_get_scale(g->bw) * 100);
- ro_gui_set_icon_string(dialog_zoom, ICON_ZOOM_VALUE, scale_buffer, true);
- ro_gui_set_icon_selected_state(dialog_zoom, ICON_ZOOM_FRAMES, true);
- ro_gui_set_icon_shaded_state(dialog_zoom, ICON_ZOOM_FRAMES, true);
- ro_gui_current_zoom_gui = g;
- ro_gui_wimp_event_memorise(dialog_zoom);
-}
-
-/**
- * Update the Scale View dialog to reflect the current window settings
- *
- * \param g the gui_window to update for
- */
-void ro_gui_dialog_update_zoom(struct gui_window *g) {
- if (g == ro_gui_current_zoom_gui)
- ro_gui_dialog_prepare_zoom(g);
-}
-
-
-/**
- * Create the Open URL dialogue, allocating storage for the URL field icon
- * as we go.
- *
- * \return true on success; false on failure (although errors with
- * the templates or memory allocation will exit via die()).
- */
-
-static bool ro_gui_dialog_open_url_init(void)
-{
- wimp_window *definition;
- char *buffer;
- os_error *error;
-
- definition = ro_gui_dialog_load_template("open_url");
-
- /* _load_template() should die on any error, so we trust its data. */
-
- assert(definition != NULL);
-
- /* Create the dialogue, with modifications. */
-
- if ((definition->icons[ICON_OPENURL_URL].flags & wimp_ICON_INDIRECTED)
- == 0) {
- LOG("open_url URL icon not indirected");
- xwimp_close_template();
- die("Template");
- }
-
- buffer = malloc(RO_GUI_MAX_URL_SIZE);
- if (buffer == NULL) {
- xwimp_close_template();
- die("NoMemory");
- }
-
- definition->icons[ICON_OPENURL_URL].data.indirected_text.text = buffer;
- definition->icons[ICON_OPENURL_URL].data.indirected_text.size =
- RO_GUI_MAX_URL_SIZE;
- definition->sprite_area = gui_sprites;
-
- error = xwimp_create_window(definition, &dialog_openurl);
- if (error != NULL) {
- LOG("xwimp_create_window: 0x%x: %s", error->errnum, error->errmess);
- xwimp_close_template();
- die(error->errmess);
- }
-
- free(definition);
-
- ro_gui_wimp_event_register_menu_gright(dialog_openurl, ICON_OPENURL_URL,
- ICON_OPENURL_MENU, ro_gui_url_suggest_menu);
- ro_gui_wimp_event_register_cancel(dialog_openurl, ICON_OPENURL_CANCEL);
- ro_gui_wimp_event_register_ok(dialog_openurl, ICON_OPENURL_OPEN,
- ro_gui_dialog_openurl_apply);
- ro_gui_wimp_event_register_menu_prepare(dialog_openurl,
- ro_gui_dialog_open_url_menu_prepare);
- ro_gui_wimp_event_set_help_prefix(dialog_openurl, "HelpOpenURL");
-
- return true;
-}
-
-
-
-bool ro_gui_dialog_openurl_apply(wimp_w w) {
- const char *urltxt;
- char *url2;
- nsurl *url;
- nserror error;
-
- urltxt = ro_gui_get_icon_string(w, ICON_OPENURL_URL);
- url2 = strdup(urltxt); /** @todo why is this copied */
- if (url2 == NULL) {
- return false;
- }
-
- error = nsurl_create(url2, &url);
- free(url2);
- if (error == NSERROR_OK) {
- error = browser_window_create(BW_CREATE_HISTORY,
- url,
- NULL,
- NULL,
- NULL);
- nsurl_unref(url);
- }
- if (error != NSERROR_OK) {
- ro_warn_user(messages_get_errorcode(error), 0);
- return false;
- }
-
- return true;
-
-}
-
-
-/**
- * Prepares the Open URL dialog.
- */
-
-void ro_gui_dialog_prepare_open_url(void)
-{
- ro_gui_set_icon_string(dialog_openurl, ICON_OPENURL_URL, "", true);
- ro_gui_set_icon_shaded_state(dialog_openurl,
- ICON_OPENURL_MENU, !ro_gui_url_suggest_prepare_menu());
- ro_gui_wimp_event_memorise(dialog_openurl);
-}
-
-
-/**
- * Callback to prepare menus in the Open URL dialog. At present, this
- * only has to handle the URL Suggestion pop-up.
- *
- * \param w The window handle owning the menu.
- * \param i The icon handle owning the menu.
- * \param *menu The menu to be prepared.
- * \param *pointer The associated mouse click event block, or NULL
- * on an Adjust-click re-opening.
- * \return true if the event was handled; false if not.
- */
-
-bool ro_gui_dialog_open_url_menu_prepare(wimp_w w, wimp_i i, wimp_menu *menu,
- wimp_pointer *pointer)
-{
- if (menu != ro_gui_url_suggest_menu || i != ICON_OPENURL_MENU)
- return false;
-
- if (pointer != NULL)
- return ro_gui_url_suggest_prepare_menu();
-
- return true;
-}