summaryrefslogtreecommitdiff
path: root/frontends/riscos/iconbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'frontends/riscos/iconbar.c')
-rw-r--r--frontends/riscos/iconbar.c261
1 files changed, 261 insertions, 0 deletions
diff --git a/frontends/riscos/iconbar.c b/frontends/riscos/iconbar.c
new file mode 100644
index 000000000..9cff116a1
--- /dev/null
+++ b/frontends/riscos/iconbar.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2010 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/>.
+ */
+
+/** \file
+ * Iconbar icon and menus (implementation).
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <features.h>
+#include <oslib/os.h>
+#include <oslib/osbyte.h>
+#include <oslib/wimp.h>
+
+#include "utils/nsoption.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "utils/nsurl.h"
+#include "desktop/browser.h"
+
+#include "riscos/gui.h"
+#include "riscos/configure.h"
+#include "riscos/cookies.h"
+#include "riscos/dialog.h"
+#include "riscos/global_history.h"
+#include "riscos/hotlist.h"
+#include "riscos/iconbar.h"
+#include "riscos/wimp_event.h"
+
+static bool ro_gui_iconbar_click(wimp_pointer *pointer);
+
+static bool ro_gui_iconbar_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
+ wimp_selection *selection, menu_action action);
+static void ro_gui_iconbar_menu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
+ wimp_selection *selection, menu_action action);
+
+
+static wimp_menu *ro_gui_iconbar_menu = NULL; /**< Iconbar menu handle */
+
+/**
+ * Initialise the iconbar menus, create an icon and register the necessary
+ * handlers to look after them all.
+ */
+
+void ro_gui_iconbar_initialise(void)
+{
+ os_error *error;
+
+ /* Build the iconbar menu */
+
+ static const struct ns_menu iconbar_definition = {
+ "NetSurf", {
+ { "Info", NO_ACTION, &dialog_info },
+ { "AppHelpNoShortcut", HELP_OPEN_CONTENTS, 0 },
+ { "Open", BROWSER_NAVIGATE_URL, 0 },
+ { "Open.OpenURL", BROWSER_NAVIGATE_URL, &dialog_openurl },
+ { "Open.HotlistShowNoShortcut", HOTLIST_SHOW, 0 },
+ { "Open.HistGlobalNoShortcut", HISTORY_SHOW_GLOBAL, 0 },
+ { "Open.ShowCookies", COOKIES_SHOW, 0 },
+ { "Choices", CHOICES_SHOW, 0 },
+ { "Quit", APPLICATION_QUIT, 0 },
+ {NULL, 0, 0}
+ }
+ };
+ ro_gui_iconbar_menu = ro_gui_menu_define_menu(&iconbar_definition);
+
+ /* Create an iconbar icon. */
+
+ wimp_icon_create icon = {
+ wimp_ICON_BAR_RIGHT,
+ { { 0, 0, 68, 68 },
+ wimp_ICON_SPRITE | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED |
+ (wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT),
+ { "!netsurf" } } };
+ error = xwimp_create_icon(&icon, 0);
+ if (error) {
+ LOG("xwimp_create_icon: 0x%x: %s", error->errnum, error->errmess);
+ die(error->errmess);
+ }
+
+ /* Register handlers to look after clicks and menu actions. */
+
+ ro_gui_wimp_event_register_mouse_click(wimp_ICON_BAR,
+ ro_gui_iconbar_click);
+
+ ro_gui_wimp_event_register_menu(wimp_ICON_BAR, ro_gui_iconbar_menu,
+ true, true);
+ ro_gui_wimp_event_register_menu_selection(wimp_ICON_BAR,
+ ro_gui_iconbar_menu_select);
+ ro_gui_wimp_event_register_menu_warning(wimp_ICON_BAR,
+ ro_gui_iconbar_menu_warning);
+}
+
+
+/**
+ * Handle Mouse_Click events on the iconbar icon.
+ *
+ * \param *pointer The wimp event block to be processed.
+ * \return true if the event was handled; else false.
+ */
+
+bool ro_gui_iconbar_click(wimp_pointer *pointer)
+{
+ int key_down = 0;
+ nsurl *url;
+ nserror error;
+
+ switch (pointer->buttons) {
+ case wimp_CLICK_SELECT:
+ if (nsoption_charp(homepage_url) != NULL) {
+ error = nsurl_create(nsoption_charp(homepage_url), &url);
+ } else {
+ error = nsurl_create(NETSURF_HOMEPAGE, &url);
+ }
+
+ /* create an initial browser window */
+ 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);
+ }
+ break;
+
+ case wimp_CLICK_ADJUST:
+ xosbyte1(osbyte_SCAN_KEYBOARD, 0 ^ 0x80, 0, &key_down);
+ if (key_down == 0)
+ ro_gui_hotlist_open();
+ break;
+ }
+
+ return true;
+}
+
+/**
+ * Handle submenu warnings for the iconbar menu
+ *
+ * \param w The window owning the menu.
+ * \param i The icon owning the menu.
+ * \param *menu The menu to which the warning applies.
+ * \param *selection The wimp menu selection data.
+ * \param action The selected menu action.
+ */
+
+void ro_gui_iconbar_menu_warning(wimp_w w, wimp_i i, wimp_menu *menu,
+ wimp_selection *selection, menu_action action)
+{
+ if (w != wimp_ICON_BAR || i != wimp_ICON_WINDOW)
+ return;
+
+ switch (action) {
+ case BROWSER_NAVIGATE_URL:
+ ro_gui_dialog_prepare_open_url();
+ break;
+ default:
+ break;
+ }
+}
+
+/**
+ * Handle selections from the iconbar menu
+ *
+ * \param w The window owning the menu.
+ * \param i The icon owning the menu.
+ * \param menu The wimp menu
+ * \param selection The wimp menu selection data.
+ * \param action The selected menu action.
+ * \return true if action accepted; else false.
+ */
+
+bool ro_gui_iconbar_menu_select(wimp_w w, wimp_i i, wimp_menu *menu,
+ wimp_selection *selection, menu_action action)
+{
+ nsurl *url;
+ nserror error;
+
+ if (w != wimp_ICON_BAR || i != wimp_ICON_WINDOW)
+ return false;
+
+ switch (action) {
+ case HELP_OPEN_CONTENTS:
+ error = nsurl_create("http://www.netsurf-browser.org/documentation/", &url);
+ 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 true;
+
+ case BROWSER_NAVIGATE_URL:
+ ro_gui_dialog_prepare_open_url();
+ ro_gui_dialog_open_persistent(NULL, dialog_openurl, true);
+ return true;
+ case HOTLIST_SHOW:
+ ro_gui_hotlist_open();
+ return true;
+ case HISTORY_SHOW_GLOBAL:
+ ro_gui_global_history_open();
+ return true;
+ case COOKIES_SHOW:
+ ro_gui_cookies_open();
+ return true;
+ case CHOICES_SHOW:
+ ro_gui_configure_show();
+ return true;
+ case APPLICATION_QUIT:
+ if (ro_gui_prequit()) {
+ LOG("QUIT in response to user request");
+ riscos_done = true;
+ }
+ return true;
+ default:
+ return false;
+ }
+
+ return false;
+}
+
+/**
+ * Check if a particular menu handle is the iconbar menu
+ *
+ * \param *menu The menu in question.
+ * \return true if this menu is the iconbar menu
+ */
+
+bool ro_gui_iconbar_check_menu(wimp_menu *menu)
+{
+ return (ro_gui_iconbar_menu == menu) ? true : false;
+}
+