From 9f81422aeaca41d8c93e2b69c3c525d84a9c633b Mon Sep 17 00:00:00 2001 From: Phil Mellor Date: Sun, 1 Jun 2003 23:02:56 +0000 Subject: [project @ 2003-06-01 23:02:56 by monkeyson] Configuration windows added. HTTP Proxy support (untested). svn path=/import/netsurf/; revision=145 --- !NetSurf/Choices,fff | 16 + !NetSurf/Resources/IconNames | 33 ++ !NetSurf/Resources/Messages | 4 +- !NetSurf/Resources/Templates,fec | Bin 954 -> 3309 bytes !NetSurf/Resources/gestures,faf | 31 ++ !NetSurf/Themes/Default/Preview,ff9 | Bin 0 -> 29240 bytes content/fetch.c | 13 +- desktop/gui.h | 5 +- desktop/netsurf.c | 5 +- desktop/options.h | 27 ++ makefile | 4 +- riscos/gui.c | 582 +++++++++++++++++++++++++++++++++++- riscos/options.c | 170 +++++++++++ riscos/options.h | 51 ++++ 14 files changed, 920 insertions(+), 21 deletions(-) create mode 100644 !NetSurf/Choices,fff create mode 100644 !NetSurf/Resources/gestures,faf create mode 100644 !NetSurf/Themes/Default/Preview,ff9 create mode 100644 desktop/options.h create mode 100644 riscos/options.c create mode 100644 riscos/options.h diff --git a/!NetSurf/Choices,fff b/!NetSurf/Choices,fff new file mode 100644 index 000000000..cd08c7ff4 --- /dev/null +++ b/!NetSurf/Choices,fff @@ -0,0 +1,16 @@ +# General options - for any platform +# Proxy +USE_HTTP:N +HTTP_PROXY:http://www-cache.freeserve.co.uk +HTTP_PORT:8080 + +# RISC OS specific options +# Browser +RO_MOUSE_GESTURES:N +RO_TEXT_SELECTION:Y +RO_FORM_ELEMENTS:Y +RO_SHOW_TOOLBAR:Y +RO_SHOW_PRINT:N + +# Theme +RO_THEME:Clear diff --git a/!NetSurf/Resources/IconNames b/!NetSurf/Resources/IconNames index ae9e3c015..482463e3a 100644 --- a/!NetSurf/Resources/IconNames +++ b/!NetSurf/Resources/IconNames @@ -1,3 +1,36 @@ # icon numbers INFO_VERSION:6 INFO_URL:8 +SAVEAS_FILEICON:0 +SAVEAS_PATH:1 +SAVEAS_SAVE:2 +SAVEAS_CANCEL:3 +CONFIG_OK:0 +CONFIG_CANCEL:1 +CONFIG_BROWSER:2 +CONFIG_PROXY:3 +CONFIG_THEME:4 +CONFIG_SAVE:5 +CONFIG_BR_OK:0 +CONFIG_BR_CANCEL:1 +CONFIG_BR_DEFAULT:2 +CONFIG_BR_FORM:3 +CONFIG_BR_GESTURES:4 +CONFIG_BR_EXPLAIN:5 +CONFIG_BR_TEXT:6 +CONFIG_BR_TOOLBAR:7 +CONFIG_BR_PREVIEW:8 +CONFIG_PROX_OK:0 +CONFIG_PROX_CANCEL:1 +CONFIG_PROX_DEFAULT:2 +CONFIG_PROX_HTTP:3 +CONFIG_PROX_HTTPHOST:4 +CONFIG_PROX_HTTPPORT:5 +CONFIG_TH_OK:0 +CONFIG_TH_CANCEL:1 +CONFIG_TH_DEFAULT:2 +CONFIG_TH_NAME:4 +CONFIG_TH_PICK:5 +CONFIG_TH_PREVIEW:7 +CONFIG_TH_GET:8 +CONFIG_TH_MANAGE:9 diff --git a/!NetSurf/Resources/Messages b/!NetSurf/Resources/Messages index 40cd075f4..da8589a6d 100644 --- a/!NetSurf/Resources/Messages +++ b/!NetSurf/Resources/Messages @@ -23,4 +23,6 @@ MBROWSE3:Selection MBROWSE4:Navigate # Iconbar MICONBAR1:Info -MICONBAR2:Quit +MICONBAR2:Choices... +MICONBAR3:Quit + diff --git a/!NetSurf/Resources/Templates,fec b/!NetSurf/Resources/Templates,fec index 5260cd87e..ee060f089 100644 Binary files a/!NetSurf/Resources/Templates,fec and b/!NetSurf/Resources/Templates,fec differ diff --git a/!NetSurf/Resources/gestures,faf b/!NetSurf/Resources/gestures,faf new file mode 100644 index 000000000..9fa5476cb --- /dev/null +++ b/!NetSurf/Resources/gestures,faf @@ -0,0 +1,31 @@ + + +NetSurf mouse gestures + + +

Mouse gestures

+ +

This page will explain the mouse gesture commands.

+ +

Mouse gestures are performed by holding down the Menu mouse button and moving the mouse.

+ + + + + + + + + + + + + + +Move down then up + + +
GestureResult
Move leftGo backwards in the history list
Move rightGo forwards in the history list
Reload the current page
+ + + diff --git a/!NetSurf/Themes/Default/Preview,ff9 b/!NetSurf/Themes/Default/Preview,ff9 new file mode 100644 index 000000000..cd640a7a3 Binary files /dev/null and b/!NetSurf/Themes/Default/Preview,ff9 differ diff --git a/content/fetch.c b/content/fetch.c index bbf6b2916..6838951b2 100644 --- a/content/fetch.c +++ b/content/fetch.c @@ -1,5 +1,5 @@ /** - * $Id: fetch.c,v 1.7 2003/04/25 08:03:15 bursa Exp $ + * $Id: fetch.c,v 1.8 2003/06/01 23:02:56 monkeyson Exp $ * * This module handles fetching of data from any url. * @@ -20,6 +20,7 @@ #include "netsurf/content/fetch.h" #include "netsurf/utils/utils.h" #include "netsurf/utils/log.h" +#include "netsurf/desktop/options.h" struct fetch { @@ -178,6 +179,16 @@ struct fetch * fetch_start(char *url, char *referer, code = curl_easy_setopt(fetch->curl_handle, CURLOPT_HTTPHEADER, fetch->headers); assert(code == CURLE_OK); + /* use proxy if options dictate this */ + if (OPTIONS.http) + { + code = curl_easy_setopt(fetch->curl_handle, CURLOPT_PROXY, OPTIONS.http_proxy); + assert(code == CURLE_OK); + code = curl_easy_setopt(fetch->curl_handle, CURLOPT_PROXYPORT, (long)OPTIONS.http_proxy); + assert(code == CURLE_OK); + } + + /* add to the global curl multi handle */ codem = curl_multi_add_handle(curl_multi, fetch->curl_handle); assert(codem == CURLM_OK || codem == CURLM_CALL_MULTI_PERFORM); diff --git a/desktop/gui.h b/desktop/gui.h index c80c56b4e..fcff4f382 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -1,5 +1,5 @@ /** - * $Id: gui.h,v 1.6 2003/03/04 11:59:35 bursa Exp $ + * $Id: gui.h,v 1.7 2003/06/01 23:02:56 monkeyson Exp $ */ #ifndef _NETSURF_DESKTOP_GUI_H_ @@ -51,4 +51,7 @@ void gui_window_stop_throbber(gui_window* g); void gui_gadget_combo(struct browser_window* bw, struct gui_gadget* g, unsigned long mx, unsigned long my); void gui_edit_textarea(struct browser_window* bw, struct gui_gadget* g); void gui_edit_textbox(struct browser_window* bw, struct gui_gadget* g); + +void gui_show_choices(); + #endif diff --git a/desktop/netsurf.c b/desktop/netsurf.c index c28d96ad3..bc62c0de0 100644 --- a/desktop/netsurf.c +++ b/desktop/netsurf.c @@ -1,7 +1,8 @@ /** - * $Id: netsurf.c,v 1.8 2003/05/10 11:13:34 bursa Exp $ + * $Id: netsurf.c,v 1.9 2003/06/01 23:02:56 monkeyson Exp $ */ +#include "netsurf/desktop/options.h" #include "netsurf/desktop/netsurf.h" #include "netsurf/desktop/browser.h" #include "netsurf/desktop/gui.h" @@ -27,6 +28,8 @@ void netsurf_poll(void) void netsurf_init(int argc, char** argv) { stdout = stderr; + options_init(&OPTIONS); + options_read(&OPTIONS, NULL); gui_init(argc, argv); fetch_init(); cache_init(); diff --git a/desktop/options.h b/desktop/options.h new file mode 100644 index 000000000..c3ca7031c --- /dev/null +++ b/desktop/options.h @@ -0,0 +1,27 @@ + +#ifndef _NETSURF_DESKTOP_OPTIONS_H_ +#define _NETSURF_DESKTOP_OPTIONS_H_ + +struct options; + +#include "netsurf/riscos/options.h" + +struct options +{ + /* global options */ + int http; + char* http_proxy; + int http_port; + + /* platform specific options */ + PLATFORM_OPTIONS +}; + +extern struct options OPTIONS; + +void options_init(struct options* opt); +void options_write(struct options*, char* filename); +void options_read(struct options*, char* filename); + +#endif + diff --git a/makefile b/makefile index 28206efed..b8f25d8a3 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.24 2003/05/31 21:19:12 bursa Exp $ +# $Id: makefile,v 1.25 2003/06/01 23:02:56 monkeyson Exp $ CC = riscos-gcc OBJECTS = cache.o content.o fetch.o fetchcache.o \ @@ -6,7 +6,7 @@ OBJECTS = cache.o content.o fetch.o fetchcache.o \ browser.o netsurf.o \ box.o html.o layout.o textplain.o \ filetype.o font.o gui.o jpeg.o png.o theme.o \ - utils.o plugin.o + utils.o plugin.o choices.o VPATH = content:css:desktop:render:riscos:utils WARNFLAGS = -W -Wall -Wundef -Wpointer-arith -Wbad-function-cast -Wcast-qual \ -Wcast-align -Wwrite-strings -Wconversion -Wstrict-prototypes \ diff --git a/riscos/gui.c b/riscos/gui.c index 31b6d215c..3f90d651b 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -1,7 +1,8 @@ /** - * $Id: gui.c,v 1.28 2003/05/10 11:13:34 bursa Exp $ + * $Id: gui.c,v 1.29 2003/06/01 23:02:56 monkeyson Exp $ */ +#include "netsurf/desktop/options.h" #include "netsurf/riscos/font.h" #include "netsurf/desktop/gui.h" #include "netsurf/utils/utils.h" @@ -11,6 +12,7 @@ #include "oslib/wimp.h" #include "oslib/colourtrans.h" #include "oslib/wimpspriteop.h" +#include "oslib/osgbpb.h" #include "netsurf/riscos/theme.h" #include "netsurf/utils/log.h" #include @@ -25,16 +27,19 @@ int gadget_subtract_x; int gadget_subtract_y; #define browser_menu_flags (wimp_ICON_TEXT | wimp_ICON_FILLED | (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT)) const char* HOME_URL = "file:///%3CNetSurf$Dir%3E/Resources/intro"; +const char* GESTURES_URL = "file:///%3CNetSurf$Dir%3E/Resources/gestures"; +const char* THEMES_URL = "http://netsurf.sf.net/themes"; -wimp_MENU(2) netsurf_iconbar_menu = +wimp_MENU(3) netsurf_iconbar_menu = { { "NetSurf" }, 7,2,7,0, 0, 44, 0, { { 0, wimp_NO_SUB_MENU, browser_menu_flags, { "MICONBAR1" } }, - { wimp_MENU_LAST, wimp_NO_SUB_MENU, browser_menu_flags, { "MICONBAR2" } } + { 0, wimp_NO_SUB_MENU, browser_menu_flags, { "MICONBAR2" } }, + { wimp_MENU_LAST, wimp_NO_SUB_MENU, browser_menu_flags, { "MICONBAR3" } } } }; -#define ICONBAR_MENU_ENTRIES 2 +#define ICONBAR_MENU_ENTRIES 3 wimp_MENU(3) browser_save_menu = { @@ -79,6 +84,10 @@ wimp_MENU(4) browser_menu = } }; +wimp_menu* theme_menu = NULL; + +const char* THEME_DIR = ".Themes"; + const char* netsurf_messages_filename = ".Resources.Messages"; messagetrans_control_block netsurf_messages_cb; char* netsurf_messages_data; @@ -89,6 +98,37 @@ char* templates_messages_data; wimp_w netsurf_info; wimp_w netsurf_saveas; +wimp_w config; +wimp_w config_br; +wimp_w config_prox; +wimp_w config_th; + +struct ro_choices choices; +struct browser_choices browser_choices; +struct proxy_choices proxy_choices; +struct theme_choices theme_choices; + +int config_open = 0; +int config_br_open = 0; +int config_prox_open = 0; +int config_th_open = 0; + +void wimp_close_window_CHECK(wimp_w close); +void wimp_close_window_CHECK(wimp_w close) +{ + if (close == config) + config_open = 0; + else if (close == config_br) + config_br_open = 0; + else if (close == config_prox) + config_prox_open = 0; + else if (close == config_th) + { + config_th_open = 0; + ro_gui_destroy_theme_menu(); + } + wimp_close_window(close); +} struct ro_gui_drag_info; typedef enum { @@ -179,6 +219,10 @@ void ro_gui_load_templates(void) wimp_open_template(".Resources.Templates"); netsurf_info = ro_gui_load_template("info"); netsurf_saveas = ro_gui_load_template("saveas"); + config = ro_gui_load_template("config"); + config_br = ro_gui_load_template("config_br"); + config_prox = ro_gui_load_template("config_prox"); + config_th = ro_gui_load_template("config_th"); wimp_close_template(); } @@ -222,7 +266,7 @@ void ro_gui_transform_menus(void) { int i; - for (i = 0; i < 2; i++) + for (i = 0; i < 3; i++) ro_gui_transform_menu_entry(&netsurf_iconbar_menu.entries[i]); for (i = 0; i < 3; i++) @@ -535,8 +579,8 @@ int select_on = 0; /* validation strings can't be const */ static char validation_textarea[] = "R7;L"; static char validation_textbox[] = ""; -static char validation_actionbutton[] = "R1"; -static char validation_actionbutton_pressed[] = "R2"; +static char validation_actionbutton[] = "R5"; +static char validation_actionbutton_pressed[] = "R5,3"; static char validation_select[] = "R2"; static char validation_checkbox_selected[] = "Sopton"; static char validation_checkbox_unselected[] = "Soptoff"; @@ -640,7 +684,7 @@ void ro_gui_window_redraw_box(gui_window* g, struct box * box, signed long x, if (box->gadget->data.actionbutt.pressed) { icon.data.indirected_text.validation = validation_actionbutton_pressed; - icon.flags |= (wimp_COLOUR_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT); + icon.flags |= (wimp_COLOUR_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT) | wimp_ICON_SELECTED; } else { @@ -1059,6 +1103,7 @@ void gui_init(int argc, char** argv) { wimp_icon_create iconbar; wimp_version_no version; + char theme_fname[256]; /* __riscosify_control = __RISCOSIFY_NO_PROCESS; */ @@ -1074,7 +1119,12 @@ void gui_init(int argc, char** argv) strcpy(iconbar.icon.data.sprite, "!netsurf"); ro_gui_iconbar_i = wimp_create_icon(&iconbar); - current_theme = ro_theme_create(".Themes.Default"); + if (OPTIONS.theme != NULL) + sprintf(theme_fname, ".Themes.%s", OPTIONS.theme); + else + sprintf(theme_fname, ".Themes.Default"); + LOG(("Using theme '%s' - from '%s'",theme_fname, OPTIONS.theme)); + current_theme = ro_theme_create(theme_fname); ro_gui_load_templates(); ro_gui_load_messages(); @@ -1307,7 +1357,7 @@ void ro_gui_w_click(wimp_pointer* pointer) if (pointer->i == ro_gui_icon("INFO_URL")) { struct browser_window* bw; - bw = create_browser_window(browser_TITLE | browser_TOOLBAR + bw = create_browser_window(browser_TITLE | browser_TOOLBAR | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); gui_window_show(bw->window); browser_window_open_location(bw, "http://sourceforge.net/projects/netsurf/"); @@ -1315,6 +1365,126 @@ void ro_gui_w_click(wimp_pointer* pointer) 0,0,-1, strlen(bw->window->url) - 1); } } + else if (pointer->w == config && (pointer->buttons == 4 || pointer->buttons == 1)) + { + if (pointer->i == ro_gui_icon("CONFIG_BROWSER")) + ro_gui_show_browser_choices(); + else if (pointer->i == ro_gui_icon("CONFIG_PROXY")) + ro_gui_show_proxy_choices(); + else if (pointer->i == ro_gui_icon("CONFIG_THEME")) + ro_gui_show_theme_choices(); + else if (pointer->i == ro_gui_icon("CONFIG_OK") || pointer->i == ro_gui_icon("CONFIG_SAVE")) + { + LOG(("converting optons")); + ro_to_options(&choices, &OPTIONS); + LOG(("testing save")); + if (pointer->i == ro_gui_icon("CONFIG_SAVE")) + options_write(&OPTIONS, NULL); + LOG(("closing windows")); + if (pointer->buttons != 1) + { + wimp_close_window_CHECK(config_br); + wimp_close_window_CHECK(config_prox); + wimp_close_window_CHECK(config_th); + wimp_close_window_CHECK(config); + } + } + else if (pointer->i == ro_gui_icon("CONFIG_CANCEL")) + { + wimp_close_window_CHECK(config_br); + wimp_close_window_CHECK(config_prox); + wimp_close_window_CHECK(config_th); + if (pointer->buttons != 1) + wimp_close_window_CHECK(config); + else + options_to_ro(&OPTIONS, &choices); + } + } + else if (pointer->w == config_br && (pointer->buttons == 4 || pointer->buttons == 1)) + { + if (pointer->i == ro_gui_icon("CONFIG_BR_OK")) + { + get_browser_choices(&choices.browser); + get_browser_choices(&browser_choices); + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_br); + } + else if (pointer->i == ro_gui_icon("CONFIG_BR_CANCEL")) + { + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_br); + else + set_browser_choices(&choices.browser); + } + else if (pointer->i == ro_gui_icon("CONFIG_BR_DEFAULT")) + { + } + else if (pointer->i == ro_gui_icon("CONFIG_BR_EXPLAIN")) + { + struct browser_window* bw; + bw = create_browser_window(browser_TITLE | browser_TOOLBAR | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 320, 256); + gui_window_show(bw->window); + browser_window_open_location(bw, GESTURES_URL); + } + } + else if (pointer->w == config_prox && (pointer->buttons == 4 || pointer->buttons == 1)) + { + if (pointer->i == ro_gui_icon("CONFIG_PROX_OK")) + { + get_proxy_choices(&choices.proxy); + get_proxy_choices(&proxy_choices); + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_prox); + } + else if (pointer->i == ro_gui_icon("CONFIG_PROX_CANCEL")) + { + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_prox); + else + set_proxy_choices(&choices.proxy); + } + else if (pointer->i == ro_gui_icon("CONFIG_PROX_DEFAULT")) + { + } + } + else if (pointer->w == config_th && (pointer->buttons == 4 || pointer->buttons == 1)) + { + if (pointer->i == ro_gui_icon("CONFIG_TH_OK")) + { + get_theme_choices(&choices.theme); + get_theme_choices(&theme_choices); + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_th); + } + else if (pointer->i == ro_gui_icon("CONFIG_TH_CANCEL")) + { + if (pointer->buttons != 1) + wimp_close_window_CHECK(config_th); + else + set_theme_choices(&choices.theme); + } + else if (pointer->i == ro_gui_icon("CONFIG_TH_DEFAULT")) + { + } + else if (pointer->i == ro_gui_icon("CONFIG_TH_PICK")) + { + ro_gui_build_theme_menu(); + ro_gui_create_menu(theme_menu, pointer->pos.x - 64, pointer->pos.y, NULL); + } + else if (pointer->i == ro_gui_icon("CONFIG_TH_MANAGE")) + { + char buffer[256]; + sprintf(buffer, "*filer_opendir %s", THEME_DIR); + os_cli(buffer); + } + else if (pointer->i == ro_gui_icon("CONFIG_TH_GET")) + { +struct browser_window* bw; + bw = create_browser_window(browser_TITLE | browser_TOOLBAR | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 480, 320); + gui_window_show(bw->window); + browser_window_open_location(bw, THEMES_URL); + } + } } double calculate_angle(double x, double y) @@ -1537,15 +1707,18 @@ void ro_gui_window_click(gui_window* g, wimp_pointer* pointer) if (pointer->buttons == wimp_CLICK_MENU) { /* check for mouse gestures */ -/* mouseaction ma = ro_gui_try_mouse_action(); + mouseaction ma = mouseaction_NONE; + if (OPTIONS.use_mouse_gestures) + ma = ro_gui_try_mouse_action(); + if (ma == mouseaction_NONE) - {*/ + { os_t now; int z; os_mouse(&x, &y, &z, &now); ro_gui_create_menu((wimp_menu*) &browser_menu, x - 64, y, g); -/* } + } else { fprintf(stderr, "MOUSE GESTURE %d\n", ma); @@ -1563,7 +1736,7 @@ void ro_gui_window_click(gui_window* g, wimp_pointer* pointer) browser_window_open_location_historical(g->data.browser.bw, g->data.browser.bw->url); break; } - }*/ + } } else if (g->data.browser.bw->current_content != NULL) { @@ -1688,6 +1861,10 @@ void gui_multitask(void) break; case wimp_REDRAW_WINDOW_REQUEST : + if (block.redraw.w == config_th) + ro_gui_redraw_config_th(&block.redraw); + else + { g = ro_lookup_gui_from_w(block.redraw.w); if (g != NULL) ro_gui_window_redraw(g, &(block.redraw)); @@ -1697,6 +1874,7 @@ void gui_multitask(void) if (g != NULL) ro_gui_toolbar_redraw(g, &(block.redraw)); } + } break; case wimp_OPEN_WINDOW_REQUEST : @@ -1704,7 +1882,9 @@ void gui_multitask(void) if (g != NULL) ro_gui_window_open(g, &(block.open)); else + { wimp_open_window(&block.open); + } break; case wimp_CLOSE_WINDOW_REQUEST : @@ -1850,6 +2030,8 @@ void ro_gui_menu_selection(wimp_selection* selection) else if (current_menu == (wimp_menu*) &netsurf_iconbar_menu) { if (selection->items[0] == 1) + gui_show_choices(); + if (selection->items[0] == 2) netsurf_quit = 1; } else if (current_menu == (wimp_menu*) &browser_menu) @@ -1893,6 +2075,14 @@ void ro_gui_menu_selection(wimp_selection* selection) } } + else if (current_menu == theme_menu && theme_menu != NULL) + { + strcpy(theme_choices.name, theme_menu->entries[selection->items[0]].data.indirected_text.text); + set_icon_string(config_th, ro_gui_icon("CONFIG_TH_NAME"), theme_choices.name); + load_theme_preview(theme_choices.name); + wimp_set_icon_state(config_th, ro_gui_icon("CONFIG_TH_NAME"), 0, 0); + wimp_set_icon_state(config_th, ro_gui_icon("CONFIG_TH_PREVIEW"), 0, 0); + } if (pointer.buttons == wimp_CLICK_ADJUST) { @@ -1942,6 +2132,10 @@ void gui_poll(void) break; case wimp_REDRAW_WINDOW_REQUEST : + if (block.redraw.w == config_th) + ro_gui_redraw_config_th(&block.redraw); + else + { g = ro_lookup_gui_from_w(block.redraw.w); if (g != NULL) ro_gui_window_redraw(g, &(block.redraw)); @@ -1951,6 +2145,7 @@ void gui_poll(void) if (g != NULL) ro_gui_toolbar_redraw(g, &(block.redraw)); } + } break; case wimp_OPEN_WINDOW_REQUEST : @@ -1958,7 +2153,9 @@ void gui_poll(void) if (g != NULL) ro_gui_window_open(g, &(block.open)); else + { wimp_open_window(&block.open); + } break; case wimp_CLOSE_WINDOW_REQUEST : @@ -1966,7 +2163,7 @@ void gui_poll(void) if (g != NULL) gui_window_hide(g); else - wimp_close_window(block.close.w); + wimp_close_window_CHECK(block.close.w); break; case wimp_POINTER_LEAVING_WINDOW : @@ -2361,3 +2558,358 @@ void gui_remove_gadget(struct gui_gadget* g) current_textbox = 0; } } + + +void gui_show_choices() +{ + wimp_window_state open; + + if (!config_open) + options_to_ro(&OPTIONS, &choices); + + open.w = config; + wimp_get_window_state(&open); + open.next = wimp_TOP; + wimp_open_window(&open); + config_open = 1; + return; +} + +void set_icon_state(wimp_w w, wimp_i i, int state) +{ + if (state) + wimp_set_icon_state(w,i, wimp_ICON_SELECTED, wimp_ICON_SELECTED); + else + wimp_set_icon_state(w,i, 0, wimp_ICON_SELECTED); +} + +int get_icon_state(wimp_w w, wimp_i i) +{ + wimp_icon_state ic; + ic.w = w; + ic.i = i; + wimp_get_icon_state(&ic); + return (ic.icon.flags & wimp_ICON_SELECTED) != 0; +} + +void set_icon_string(wimp_w w, wimp_i i, char* text) +{ + wimp_icon_state ic; + ic.w = w; + ic.i = i; + wimp_get_icon_state(&ic); + strncpy(ic.icon.data.indirected_text.text, text, ic.icon.data.indirected_text.size); +} + +char* get_icon_string(wimp_w w, wimp_i i) +{ + wimp_icon_state ic; + ic.w = w; + ic.i = i; + wimp_get_icon_state(&ic); + return ic.icon.data.indirected_text.text; +} + +void set_icon_string_i(wimp_w w, wimp_i i, int num) +{ + char buffer[255]; + sprintf(buffer, "%d", num); + set_icon_string(w, i, buffer); +} + +void set_browser_choices(struct browser_choices* newchoices) +{ + memcpy(&browser_choices, newchoices, sizeof(struct browser_choices)); + set_icon_state(config_br, ro_gui_icon("CONFIG_BR_GESTURES"), browser_choices.use_mouse_gestures); + set_icon_state(config_br, ro_gui_icon("CONFIG_BR_FORM"), browser_choices.use_riscos_elements); + set_icon_state(config_br, ro_gui_icon("CONFIG_BR_TEXT"), browser_choices.allow_text_selection); + set_icon_state(config_br, ro_gui_icon("CONFIG_BR_TOOLBAR"), browser_choices.show_toolbar); + set_icon_state(config_br, ro_gui_icon("CONFIG_BR_PREVIEW"), browser_choices.show_print_preview); +} + +void get_browser_choices(struct browser_choices* newchoices) +{ + newchoices->use_mouse_gestures = get_icon_state(config_br, ro_gui_icon("CONFIG_BR_GESTURES")); + newchoices->use_riscos_elements = get_icon_state(config_br, ro_gui_icon("CONFIG_BR_FORM")); + newchoices->allow_text_selection = get_icon_state(config_br, ro_gui_icon("CONFIG_BR_TEXT")); + newchoices->show_toolbar = get_icon_state(config_br, ro_gui_icon("CONFIG_BR_TOOLBAR")); + newchoices->show_print_preview = get_icon_state(config_br, ro_gui_icon("CONFIG_BR_PREVIEW")); +} + +void set_proxy_choices(struct proxy_choices* newchoices) +{ + memcpy(&proxy_choices, newchoices, sizeof(struct proxy_choices)); + set_icon_state(config_prox, ro_gui_icon("CONFIG_PROX_HTTP"), proxy_choices.http); + set_icon_string(config_prox, ro_gui_icon("CONFIG_PROX_HTTPHOST"), proxy_choices.http_proxy); + set_icon_string_i(config_prox, ro_gui_icon("CONFIG_PROX_HTTPPORT"), proxy_choices.http_port); +} + +void get_proxy_choices(struct proxy_choices* newchoices) +{ + newchoices->http = get_icon_state(config_prox, ro_gui_icon("CONFIG_PROX_HTTP")); + strncpy(newchoices->http_proxy, get_icon_string(config_prox, ro_gui_icon("CONFIG_PROX_HTTPHOST")), 255); + newchoices->http_port = atoi(get_icon_string(config_prox, ro_gui_icon("CONFIG_PROX_HTTPPORT"))); +} + +osspriteop_area* theme_preview = NULL; + +void load_theme_preview(char* thname) +{ +if (theme_preview != NULL) + xfree(theme_preview); + +theme_preview = NULL; + + if (file_exists(THEME_DIR, thname, "Preview", 0xff9)) + { +char filename[256]; +FILE* fp; +int size; + + + sprintf(filename, "%s.%s.Preview", THEME_DIR, thname); + fp = fopen(filename, "rb"); + if (fp == 0) return; + if (fseek(fp, 0, SEEK_END) != 0) die("fseek() failed"); + if ((size = (int) ftell(fp)) == -1) die("ftell() failed"); + fclose(fp); + + theme_preview = xcalloc(size + 16, 1); + if (theme_preview == NULL) + return; + + theme_preview->size = size + 16; + theme_preview->sprite_count = 0; + theme_preview->first = 16; + theme_preview->used = 16; + osspriteop_clear_sprites(osspriteop_USER_AREA, theme_preview); + osspriteop_load_sprite_file(osspriteop_USER_AREA, theme_preview, filename); + + + } +} + +void set_theme_choices(struct theme_choices* newchoices) +{ + memcpy(&theme_choices, newchoices, sizeof(struct theme_choices)); + set_icon_string(config_th, ro_gui_icon("CONFIG_TH_NAME"), theme_choices.name); + load_theme_preview(theme_choices.name); +} + +void get_theme_choices(struct theme_choices* newchoices) +{ + strncpy(newchoices->name, get_icon_string(config_th, ro_gui_icon("CONFIG_TH_NAME")), 255); +} + +void ro_gui_show_browser_choices() +{ + wimp_window_state open; + + if (!config_br_open) + set_browser_choices(&choices.browser); + + open.w = config_br; + wimp_get_window_state(&open); + open.next = wimp_TOP; + wimp_open_window(&open); + config_br_open = 1; +} + +void ro_gui_show_proxy_choices() +{ + wimp_window_state open; + + if (!config_prox_open) + set_proxy_choices(&choices.proxy); + + open.w = config_prox; + wimp_get_window_state(&open); + open.next = wimp_TOP; + wimp_open_window(&open); + config_prox_open = 1; +} + +void ro_gui_show_theme_choices() +{ + wimp_window_state open; + + if (!config_th_open) + { + set_theme_choices(&choices.theme); + } + + open.w = config_th; + wimp_get_window_state(&open); + open.next = wimp_TOP; + wimp_open_window(&open); + config_th_open = 1; +} + + +void ro_gui_destroy_theme_menu() +{ + int i = 0; + LOG(("destroy?")); + + if (theme_menu == NULL) + return; + + LOG(("enumerating")); + while ((theme_menu->entries[i].menu_flags & wimp_MENU_LAST) == 0) + { + xfree(theme_menu->entries[i].data.indirected_text.text); + LOG(("freed")); + i++; + } + + LOG(("freeing menu")); + xfree(theme_menu); + theme_menu = NULL; + LOG(("destroyed")); +} + +int file_exists(char* base, char* dir, char* leaf, bits ftype) +{ + char buffer[256]; + fileswitch_object_type type; + bits load, exec; + int size; + fileswitch_attr attr; + bits file_type; + + snprintf(buffer, 255, "%s.%s.%s", base, dir, leaf); + LOG(("checking %s", buffer)); + if (xosfile_read_stamped_no_path(buffer, &type, &load, &exec, &size, &attr, &file_type) == NULL) + { + return (type == 1 && ftype == file_type); + } + + return 0; +} + +void ro_gui_build_theme_menu() +{ + wimp_menu* m; + int num = 0; + int i; + char* name[256]; + char buffer[256]; + osgbpb_system_info* info; + int context = 0, count = 1; + + LOG(("check for destroy")); + if (theme_menu != NULL) + ro_gui_destroy_theme_menu(); + + LOG(("enumerate themes")); + context = osgbpb_dir_entries_system_info(THEME_DIR, buffer, 1, context, 256, 0, &count); + while (context != -1) + { + LOG(("called")); + info = (osgbpb_system_info*) buffer; + if (info->obj_type == 2 /* directory */) + { + if (file_exists(THEME_DIR, info->name, "Templates", 0xfec) && + file_exists(THEME_DIR, info->name, "Sprites", 0xff9) && + file_exists(THEME_DIR, info->name, "IconNames", 0xfff) && + file_exists(THEME_DIR, info->name, "IconSizes", 0xfff)) + { + LOG(("found")); + name[num] = malloc(strlen(info->name) + 2); + strcpy(name[num], info->name); + num++; + } + } + context = osgbpb_dir_entries_system_info(THEME_DIR, buffer, 1, context, 256, 0, &count); + } + LOG(("mallocing")); + + m = malloc(sizeof(wimp_menu_base) + (num*2) * sizeof(wimp_menu_entry)); + strcpy(m->title_data.text, "Themes"); + m->title_fg = wimp_COLOUR_BLACK; + m->title_bg = wimp_COLOUR_LIGHT_GREY; + m->work_fg = wimp_COLOUR_BLACK; + m->work_bg = wimp_COLOUR_WHITE; + m->width = 256; + m->height = 44; + m->gap = 0; + + LOG(("building entries")); + for (i = 0; i < num; i++) + { + if (i < num - 1) + m->entries[i].menu_flags = 0; + else + { + LOG(("last one")); + m->entries[i].menu_flags = wimp_MENU_LAST; + } + + if (strcmp(name[i], theme_choices.name) == 0) + m->entries[i].menu_flags |= wimp_MENU_TICKED; + + m->entries[i].sub_menu = wimp_NO_SUB_MENU; + m->entries[i].icon_flags = (wimp_ICON_TEXT | wimp_ICON_FILLED | wimp_ICON_INDIRECTED | (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | (wimp_COLOUR_WHITE << wimp_ICON_BG_COLOUR_SHIFT)); + m->entries[i].data.indirected_text.text = name[i]; + m->entries[i].data.indirected_text.validation = BROWSER_VALIDATION; + m->entries[i].data.indirected_text.size = strlen(name[i]) + 1; + LOG(("entry %d", i)); + } + + LOG(("done")); + + theme_menu = m; +} + +void ro_gui_redraw_config_th(wimp_draw* redraw) +{ + int x, y, size; + osbool more; + wimp_icon_state preview; + wimp_window_state win; + osspriteop_trans_tab* trans_tab; + + win.w = config_th; + wimp_get_window_state(&win); + + preview.w = config_th; + preview.i = ro_gui_icon("CONFIG_TH_PREVIEW"); + wimp_get_icon_state(&preview); + + if (theme_preview != NULL) + { + x = preview.icon.extent.x0 + win.visible.x0 + 4; + y = preview.icon.extent.y0 + win.visible.y1 + 4; + + xcolourtrans_generate_table_for_sprite(theme_preview, "preview", -1, -1, 0, 0, 0, 0, &size); + trans_tab = malloc(size + 32); + xcolourtrans_generate_table_for_sprite(theme_preview, "preview", -1, -1, trans_tab, 0, 0, 0, &size); + + more = wimp_redraw_window(redraw); + while (more) + { + xosspriteop_put_sprite_scaled(osspriteop_NAME, theme_preview, "preview", x, y, 0, 0, trans_tab); + more = wimp_get_rectangle(redraw); + } + + xfree(trans_tab); + } + else + { + preview.icon.flags = wimp_ICON_TEXT | wimp_ICON_INDIRECTED | wimp_ICON_HCENTRED | wimp_ICON_VCENTRED | (wimp_COLOUR_BLACK << wimp_ICON_FG_COLOUR_SHIFT) | (wimp_COLOUR_VERY_LIGHT_GREY << wimp_ICON_BG_COLOUR_SHIFT); + preview.icon.data.indirected_text.text = "No preview available"; + preview.icon.data.indirected_text.size = 21; + + more = wimp_redraw_window(redraw); + while (more) + { + wimp_plot_icon(&preview.icon); + more = wimp_get_rectangle(redraw); + } + + } + return; + +} + + diff --git a/riscos/options.c b/riscos/options.c new file mode 100644 index 000000000..26ae0f6bc --- /dev/null +++ b/riscos/options.c @@ -0,0 +1,170 @@ +#include "netsurf/desktop/options.h" +#include +#include "oslib/messagetrans.h" +#include "netsurf/utils/log.h" + +struct options OPTIONS; + +char* lookup(messagetrans_control_block* cb, const char* token, const char* deflt) +{ + int used; + char buffer[256]; + + LOG(("Looking up token '%s'",token)); + + messagetrans_lookup(cb, token, buffer, 256, 0,0,0,0, &used); + if (used > 0) + { + return strdup(buffer); + } + else + return strdup(deflt); +} + +int lookup_yesno(messagetrans_control_block* cb, const char* token, const char* deflt) +{ + char* find; + LOG(("yesno token '%s' (default '%s')", token, deflt)); + find = lookup(cb, token, deflt); + if (strcmp(find, "Y") == 0) + { + xfree(find); + return -1; + } + xfree(find); + return 0; +} + +int lookup_i(messagetrans_control_block* cb, const char* token, const char* deflt) +{ + char* find = lookup(cb, token, deflt); + int ret = atoi(find); + xfree(find); + return ret; +} + +const char* yesno(int q) +{ + if (q) + return "Y"; + else + return "N"; +} + +void options_write(struct options* opt, char* filename) +{ + char* fn; + FILE* f; + + if (filename == NULL) + fn = (char*) ".Choices"; + else + fn = filename; + + f = fopen(fn, "w"); + if (f != NULL) + { + fprintf(f, "# General options - for any platform\n# Proxy\n"); + fprintf(f, "USE_HTTP:%s\n", yesno(opt->http)); + fprintf(f, "HTTP_PROXY:%s\n", opt->http_proxy); + fprintf(f, "HTTP_PORT:%d\n", opt->http_port); + + fprintf(f, "\n# RISC OS specific options\n# Browser\n"); + fprintf(f, "RO_MOUSE_GESTURES:%s\n", yesno(opt->use_mouse_gestures)); + fprintf(f, "RO_TEXT_SELECTION:%s\n", yesno(opt->allow_text_selection)); + fprintf(f, "RO_FORM_ELEMENTS:%s\n", yesno(opt->use_riscos_elements)); + fprintf(f, "RO_SHOW_TOOLBAR:%s\n", yesno(opt->show_toolbar)); + fprintf(f, "RO_SHOW_PRINT:%s\n", yesno(opt->show_print_preview)); + fprintf(f, "\n# Theme\n"); + fprintf(f, "RO_THEME:%s\n", opt->theme); + } +} + +void options_init(struct options* opt) +{ + opt->http = 0; + opt->http_proxy = NULL; + opt->http_port = 8080; + opt->use_mouse_gestures = 0; + opt->allow_text_selection = 1; + opt->use_riscos_elements = 1; + opt->show_toolbar = 1; + opt->show_print_preview = 0; + opt->theme = strdup("Default"); +} + +void options_read(struct options* opt, char* filename) +{ + messagetrans_control_block cb; + messagetrans_file_flags flags; + char* data; + char* fn; + int size; + + LOG(("Testing filename")); + if (filename == NULL) + fn = ".Choices"; + else + fn = filename; + + LOG(("Getting file info")); + if (xmessagetrans_file_info(fn, &flags, &size) != NULL) + return; + + LOG(("Allocating %d bytes", size)); + data = xcalloc(size, sizeof(char)); + messagetrans_open_file(&cb, fn, data); + + opt->http = lookup_yesno(&cb, "USE_HTTP", "N"); + xfree(opt->http_proxy); + opt->http_proxy = lookup(&cb, "HTTP_PROXY", ""); + opt->http_port = lookup_i(&cb, "HTTP_PORT", "8080"); + + opt->use_mouse_gestures = lookup_yesno(&cb, "RO_MOUSE_GESTURES", "N"); + opt->allow_text_selection = lookup_yesno(&cb, "RO_TEXT_SELECTION", "Y"); + opt->use_riscos_elements = lookup_yesno(&cb, "RO_FORM_ELEMENTS", "Y"); + opt->show_toolbar = lookup_yesno(&cb, "RO_SHOW_TOOLBAR", "Y"); + opt->show_print_preview = lookup_yesno(&cb, "RO_SHOW_PRINT", "N"); + + xfree(opt->theme); + opt->theme = lookup(&cb, "RO_THEME", "Default"); +} + +void options_to_ro(struct options* opt, struct ro_choices* ro) +{ + ro->browser.use_mouse_gestures = opt->use_mouse_gestures; + ro->browser.allow_text_selection = opt->allow_text_selection; + ro->browser.use_riscos_elements = opt->use_riscos_elements; + ro->browser.show_toolbar = opt->show_toolbar; + ro->browser.show_print_preview = opt->show_print_preview; + + ro->proxy.http = opt->http; + if (opt->http_proxy != NULL) + strcpy(ro->proxy.http_proxy, opt->http_proxy); + else + strcpy(ro->proxy.http_proxy, ""); + ro->proxy.http_port = opt->http_port; + + if (opt->theme != NULL) + strcpy(ro->theme.name, opt->theme); + else + strcpy(ro->theme.name, "Default"); +} + +void ro_to_options(struct ro_choices* ro, struct options* opt) +{ + opt->use_mouse_gestures = ro->browser.use_mouse_gestures; + opt->allow_text_selection = ro->browser.allow_text_selection; + opt->use_riscos_elements = ro->browser.use_riscos_elements; + opt->show_toolbar = ro->browser.show_toolbar; + opt->show_print_preview = ro->browser.show_print_preview; + + opt->http = ro->proxy.http; + xfree(opt->http_proxy); + opt->http_proxy = strdup(ro->proxy.http_proxy); + opt->http_port = ro->proxy.http_port; + + xfree(opt->theme); + opt->theme = strdup(ro->theme.name); +} + diff --git a/riscos/options.h b/riscos/options.h new file mode 100644 index 000000000..5ee3d2d91 --- /dev/null +++ b/riscos/options.h @@ -0,0 +1,51 @@ + +#ifndef _NETSURF_RISCOS_OPTIONS_H_ +#define _NETSURF_RISCOS_OPTIONS_H_ + +#include "netsurf/desktop/options.h" + +#define PLATFORM_OPTIONS \ + int use_mouse_gestures;\ + int allow_text_selection;\ + int use_riscos_elements;\ + int show_toolbar;\ + int show_print_preview;\ + \ + char* theme; + +/* choices made easier for the dialogue boxes. only used by the interface */ + +struct browser_choices +{ + int use_mouse_gestures; + int allow_text_selection; + int use_riscos_elements; + int show_toolbar; + int show_print_preview; +} ; + +struct proxy_choices +{ + int http; + char http_proxy[256]; + int http_port; +} ; + +struct theme_choices +{ + char name[256]; +}; + +struct ro_choices +{ + struct browser_choices browser; + struct proxy_choices proxy; + struct theme_choices theme; +}; + +void options_to_ro(struct options* opt, struct ro_choices* ro); +void ro_to_options(struct ro_choices* ro, struct options* opt); + +#endif + + -- cgit v1.2.3