991 lines
33 KiB
C
991 lines
33 KiB
C
/*
|
|
* Copyright 2013 Ole Loots <ole@monochrom.net>
|
|
*
|
|
* 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 <assert.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <time.h>
|
|
#include <limits.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
#include <cflib.h>
|
|
#include <gem.h>
|
|
|
|
#include "utils/dirent.h"
|
|
#include "utils/nsoption.h"
|
|
#include "utils/log.h"
|
|
#include "desktop/plot_style.h"
|
|
|
|
#include "atari/gui.h"
|
|
#include "atari/res/netsurf.rsh"
|
|
#include "atari/settings.h"
|
|
#include "atari/deskmenu.h"
|
|
#include "atari/misc.h"
|
|
#include "atari/plot/plot.h"
|
|
#include "atari/bitmap.h"
|
|
#include "atari/findfile.h"
|
|
#include "atari/gemtk/gemtk.h"
|
|
|
|
extern char options[PATH_MAX];
|
|
extern GRECT desk_area;
|
|
|
|
static float tmp_option_minimum_gif_delay;
|
|
static unsigned tmp_option_memory_cache_size;
|
|
static unsigned int tmp_option_disc_cache_size;
|
|
static unsigned int tmp_option_expire_url;
|
|
static unsigned int tmp_option_disc_cache_age;
|
|
static unsigned int tmp_option_font_min_size;
|
|
static unsigned int tmp_option_font_size;
|
|
static unsigned int tmp_option_min_reflow_period;
|
|
static unsigned int tmp_option_max_fetchers;
|
|
static unsigned int tmp_option_max_fetchers_per_host;
|
|
static unsigned int tmp_option_max_cached_fetch_handles;
|
|
|
|
static int num_locales = 0;
|
|
static char **locales = NULL;
|
|
static short h_aes_win = 0;
|
|
static GUIWIN * settings_guiwin = NULL;
|
|
static OBJECT * dlgtree;
|
|
|
|
/* Available font engines for the font engine selection popup: */
|
|
static const char *font_engines[] = {
|
|
|
|
#ifdef WITH_FREETYPE_FONT_DRIVER
|
|
"freetype",
|
|
#endif
|
|
|
|
#ifdef WITH_INTERNAL_FONT_DRIVER
|
|
"internal",
|
|
#endif
|
|
|
|
#ifdef WITH_VDI_FONT_DRIVER
|
|
"vdi",
|
|
#endif
|
|
};
|
|
|
|
/* Available GUI timeouts for the timeout selection popup: */
|
|
static const char *gui_timeouts[] = {
|
|
"0", "5", "10"
|
|
};
|
|
|
|
#define OBJ_SELECTED(idx) ((bool)((dlgtree[idx].ob_state & OS_SELECTED)!=0))
|
|
|
|
#define OBJ_CHECK(idx) (dlgtree[idx].ob_state |= (OS_SELECTED));
|
|
|
|
#define OBJ_UNCHECK(idx) (dlgtree[idx].ob_state &= ~(OS_SELECTED));
|
|
|
|
#define OBJ_REDRAW(idx) gemtk_wm_exec_redraw(settings_guiwin, \
|
|
gemtk_obj_screen_rect(dlgtree, idx));
|
|
|
|
#define DISABLE_OBJ(idx) (dlgtree[idx].ob_state |= OS_DISABLED); \
|
|
gemtk_wm_exec_redraw(settings_guiwin, \
|
|
gemtk_obj_screen_rect(dlgtree, idx));
|
|
|
|
#define ENABLE_OBJ(idx) (dlgtree[idx].ob_state &= ~(OS_DISABLED)); \
|
|
gemtk_wm_exec_redraw(settings_guiwin, \
|
|
gemtk_obj_screen_rect(dlgtree, idx));
|
|
|
|
#define FORMEVENT(idx) form_event(idx, 0);
|
|
|
|
#define INPUT_HOMEPAGE_URL_MAX_LEN 44
|
|
#define INPUT_LOCALE_MAX_LEN 6
|
|
#define INPUT_PROXY_HOST_MAX_LEN 31
|
|
#define INPUT_PROXY_USERNAME_MAX_LEN 36
|
|
#define INPUT_PROXY_PASSWORD_MAX_LEN 36
|
|
#define INPUT_PROXY_PORT_MAX_LEN 5
|
|
#define INPUT_MIN_REFLOW_PERIOD_MAX_LEN 4
|
|
#define LABEL_FONT_RENDERER_MAX_LEN 8
|
|
#define LABEL_PATH_MAX_LEN 40
|
|
#define LABEL_ICONSET_MAX_LEN 8
|
|
#define INPUT_TOOLBAR_COLOR_MAX_LEN 6
|
|
|
|
|
|
static void display_settings(void);
|
|
static void form_event(int index, int external);
|
|
static void apply_settings(void);
|
|
static void save_settings(void);
|
|
|
|
|
|
static void set_text( short idx, char * text, int len )
|
|
{
|
|
char spare[255];
|
|
|
|
if( len > 254 )
|
|
len = 254;
|
|
if( text != NULL ) {
|
|
strncpy(spare, text, 254);
|
|
} else {
|
|
strcpy(spare, "");
|
|
}
|
|
|
|
set_string( dlgtree, idx, spare);
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
* Toogle all objects which are directly influenced by other GUI elements
|
|
* ( like checkbox )
|
|
*/
|
|
static void toggle_objects(void)
|
|
{
|
|
/* enable / disable (refresh) objects depending on radio button values: */
|
|
/* Simulate GUI events which trigger refresh of bound elements: */
|
|
FORMEVENT(SETTINGS_CB_USE_PROXY);
|
|
FORMEVENT(SETTINGS_CB_PROXY_AUTH);
|
|
FORMEVENT(SETTINGS_BT_SEL_FONT_RENDERER);
|
|
}
|
|
|
|
static char **read_locales(void)
|
|
{
|
|
char buf[PATH_MAX];
|
|
char tmp_locale[16];
|
|
char **locales = NULL;
|
|
|
|
FILE * fp_locales = NULL;
|
|
|
|
atari_find_resource(buf, "languages", "./res/languages");
|
|
|
|
fp_locales = fopen(buf, "r");
|
|
|
|
if (fp_locales == NULL) {
|
|
atari_warn_user("Failed to load locales: %s",buf);
|
|
return(NULL);
|
|
} else {
|
|
LOG("Reading locales from: %s...", buf);
|
|
}
|
|
|
|
/* Count items: */
|
|
num_locales = 0;
|
|
while (fgets(tmp_locale, 16, fp_locales) != NULL) {
|
|
num_locales++;
|
|
}
|
|
|
|
locales = malloc(sizeof(char*)*num_locales);
|
|
|
|
rewind(fp_locales);
|
|
int i = 0;
|
|
while (fgets(tmp_locale, 16, fp_locales) != NULL) {
|
|
int len = strlen(tmp_locale);
|
|
tmp_locale[len-1] = 0;
|
|
len--;
|
|
locales[i] = malloc(len+1);
|
|
// do not copy the last \n
|
|
snprintf(locales[i], 16, "%s", tmp_locale);
|
|
i++;
|
|
}
|
|
|
|
fclose(fp_locales);
|
|
|
|
return(locales);
|
|
}
|
|
|
|
|
|
static void save_settings(void)
|
|
{
|
|
apply_settings();
|
|
// Save settings
|
|
nsoption_write( (const char*)&options, NULL, NULL);
|
|
nsoption_read( (const char*)&options , NULL);
|
|
close_settings();
|
|
form_alert(1, "[1][Some options require an netsurf restart!][OK]");
|
|
deskmenu_update();
|
|
}
|
|
|
|
/* this gets called each time the settings dialog is opened: */
|
|
static void display_settings(void)
|
|
{
|
|
char spare[255];
|
|
// read current settings and display them
|
|
|
|
|
|
/* "Browser" tab: */
|
|
set_text( SETTINGS_EDIT_HOMEPAGE, nsoption_charp(homepage_url),
|
|
INPUT_HOMEPAGE_URL_MAX_LEN );
|
|
|
|
if( nsoption_bool(block_advertisements) ) {
|
|
OBJ_CHECK( SETTINGS_CB_HIDE_ADVERTISEMENT );
|
|
} else {
|
|
OBJ_UNCHECK( SETTINGS_CB_HIDE_ADVERTISEMENT );
|
|
}
|
|
if( nsoption_bool(target_blank) ) {
|
|
OBJ_UNCHECK( SETTINGS_CB_DISABLE_POPUP_WINDOWS );
|
|
} else {
|
|
OBJ_CHECK( SETTINGS_CB_DISABLE_POPUP_WINDOWS );
|
|
}
|
|
if( nsoption_bool(send_referer) ) {
|
|
OBJ_CHECK( SETTINGS_CB_SEND_HTTP_REFERRER );
|
|
} else {
|
|
OBJ_UNCHECK( SETTINGS_CB_SEND_HTTP_REFERRER );
|
|
}
|
|
if( nsoption_bool(do_not_track) ) {
|
|
OBJ_CHECK( SETTINGS_CB_SEND_DO_NOT_TRACK );
|
|
} else {
|
|
OBJ_UNCHECK( SETTINGS_CB_SEND_DO_NOT_TRACK );
|
|
}
|
|
|
|
set_text( SETTINGS_BT_SEL_LOCALE,
|
|
nsoption_charp(accept_language) ? nsoption_charp(accept_language) : (char*)"en",
|
|
INPUT_LOCALE_MAX_LEN );
|
|
|
|
sprintf(spare, "%d", nsoption_int(atari_gui_poll_timeout));
|
|
set_text(SETTINGS_BT_GUI_TOUT, spare, 2);
|
|
|
|
tmp_option_expire_url = nsoption_int(expire_url);
|
|
snprintf( spare, 255, "%02d", nsoption_int(expire_url) );
|
|
set_text( SETTINGS_EDIT_HISTORY_AGE, spare, 3);
|
|
|
|
/* "Cache" tab: */
|
|
tmp_option_memory_cache_size = nsoption_int(memory_cache_size) / (1024*1024);
|
|
snprintf( spare, 255, "%d", tmp_option_memory_cache_size );
|
|
set_text( SETTINGS_STR_MAX_MEM_CACHE, spare, 4 );
|
|
|
|
tmp_option_disc_cache_size = nsoption_int(disc_cache_size) / (1024*1024);
|
|
snprintf( spare, 255, "%d", tmp_option_disc_cache_size );
|
|
set_text( SETTINGS_STR_MAX_DISC_CACHE, spare, 4 );
|
|
|
|
tmp_option_disc_cache_age = nsoption_int(disc_cache_age);
|
|
snprintf( spare, 255, "%02d", tmp_option_disc_cache_age );
|
|
set_text( SETTINGS_EDIT_CACHE_AGE, spare, 3 );
|
|
|
|
/* "Paths" tab: */
|
|
set_text( SETTINGS_EDIT_DOWNLOAD_PATH, nsoption_charp(downloads_path),
|
|
LABEL_PATH_MAX_LEN );
|
|
set_text( SETTINGS_EDIT_HOTLIST_FILE, nsoption_charp(hotlist_file),
|
|
LABEL_PATH_MAX_LEN );
|
|
set_text( SETTINGS_EDIT_CA_BUNDLE, nsoption_charp(ca_bundle),
|
|
LABEL_PATH_MAX_LEN );
|
|
set_text( SETTINGS_EDIT_CA_CERTS_PATH, nsoption_charp(ca_path),
|
|
LABEL_PATH_MAX_LEN );
|
|
set_text( SETTINGS_EDIT_EDITOR, nsoption_charp(atari_editor),
|
|
LABEL_PATH_MAX_LEN );
|
|
|
|
/* "Rendering" tab: */
|
|
set_text( SETTINGS_BT_SEL_FONT_RENDERER, nsoption_charp(atari_font_driver),
|
|
LABEL_FONT_RENDERER_MAX_LEN );
|
|
SET_BIT(dlgtree[SETTINGS_CB_TRANSPARENCY].ob_state,
|
|
OS_SELECTED, nsoption_int(atari_transparency) ? 1 : 0 );
|
|
SET_BIT(dlgtree[SETTINGS_CB_ENABLE_ANIMATION].ob_state,
|
|
OS_SELECTED, nsoption_bool(animate_images) ? 1 : 0 );
|
|
SET_BIT(dlgtree[SETTINGS_CB_FG_IMAGES].ob_state,
|
|
OS_SELECTED, nsoption_bool(foreground_images) ? 1 : 0 );
|
|
SET_BIT(dlgtree[SETTINGS_CB_BG_IMAGES].ob_state,
|
|
OS_SELECTED, nsoption_bool(background_images) ? 1 : 0 );
|
|
|
|
|
|
// TODO: enable this option?
|
|
/* SET_BIT(dlgtree[SETTINGS_CB_INCREMENTAL_REFLOW].ob_state,
|
|
OS_SELECTED, nsoption_bool(incremental_reflow) ? 1 : 0 );*/
|
|
|
|
SET_BIT(dlgtree[SETTINGS_CB_ANTI_ALIASING].ob_state,
|
|
OS_SELECTED, nsoption_int(atari_font_monochrom) ? 0 : 1 );
|
|
|
|
|
|
// TODO: activate this option?
|
|
tmp_option_min_reflow_period = nsoption_int(min_reflow_period);
|
|
snprintf( spare, 255, "%04d", tmp_option_min_reflow_period );
|
|
set_text( SETTINGS_EDIT_MIN_REFLOW_PERIOD, spare,
|
|
INPUT_MIN_REFLOW_PERIOD_MAX_LEN );
|
|
|
|
|
|
tmp_option_minimum_gif_delay = (float)nsoption_int(minimum_gif_delay) / (float)100;
|
|
snprintf( spare, 255, "%01.1f", tmp_option_minimum_gif_delay );
|
|
set_text( SETTINGS_EDIT_MIN_GIF_DELAY, spare, 3 );
|
|
|
|
/* "Network" tab: */
|
|
set_text( SETTINGS_EDIT_PROXY_HOST, nsoption_charp(http_proxy_host),
|
|
INPUT_PROXY_HOST_MAX_LEN );
|
|
snprintf( spare, 255, "%5d", nsoption_int(http_proxy_port) );
|
|
set_text( SETTINGS_EDIT_PROXY_PORT, spare,
|
|
INPUT_PROXY_PORT_MAX_LEN );
|
|
|
|
set_text( SETTINGS_EDIT_PROXY_USERNAME, nsoption_charp(http_proxy_auth_user),
|
|
INPUT_PROXY_USERNAME_MAX_LEN );
|
|
set_text( SETTINGS_EDIT_PROXY_PASSWORD, nsoption_charp(http_proxy_auth_pass),
|
|
INPUT_PROXY_PASSWORD_MAX_LEN );
|
|
SET_BIT(dlgtree[SETTINGS_CB_USE_PROXY].ob_state,
|
|
OS_SELECTED, nsoption_bool(http_proxy) ? 1 : 0 );
|
|
SET_BIT(dlgtree[SETTINGS_CB_PROXY_AUTH].ob_state,
|
|
OS_SELECTED, nsoption_int(http_proxy_auth) ? 1 : 0 );
|
|
|
|
tmp_option_max_cached_fetch_handles = nsoption_int(max_cached_fetch_handles);
|
|
snprintf( spare, 255, "%2d", nsoption_int(max_cached_fetch_handles) );
|
|
set_text( SETTINGS_EDIT_MAX_CACHED_CONNECTIONS, spare , 2 );
|
|
|
|
tmp_option_max_fetchers = nsoption_int(max_fetchers);
|
|
snprintf( spare, 255, "%2d", nsoption_int(max_fetchers) );
|
|
set_text( SETTINGS_EDIT_MAX_FETCHERS, spare , 2 );
|
|
|
|
tmp_option_max_fetchers_per_host = nsoption_int(max_fetchers_per_host);
|
|
snprintf( spare, 255, "%2d", nsoption_int(max_fetchers_per_host) );
|
|
set_text( SETTINGS_EDIT_MAX_FETCHERS_PER_HOST, spare , 2 );
|
|
|
|
|
|
/* "Style" tab: */
|
|
tmp_option_font_min_size = nsoption_int(font_min_size);
|
|
snprintf( spare, 255, "%3d", nsoption_int(font_min_size) );
|
|
set_text( SETTINGS_EDIT_MIN_FONT_SIZE, spare , 3 );
|
|
|
|
tmp_option_font_size = nsoption_int(font_size);
|
|
snprintf( spare, 255, "%3d", nsoption_int(font_size) );
|
|
set_text( SETTINGS_EDIT_DEF_FONT_SIZE, spare , 3 );
|
|
|
|
toggle_objects();
|
|
}
|
|
|
|
static void handle_filesystem_select_button(short rsc_bt)
|
|
{
|
|
bool require_path = false;
|
|
bool is_folder = false;
|
|
short rsc_te = 0; // The textarea that is bound to the button
|
|
const char * title = "";
|
|
const char * path = NULL;
|
|
|
|
// TODO: localize String:
|
|
switch (rsc_bt) {
|
|
|
|
|
|
case SETTINGS_BT_SEL_DOWNLOAD_DIR:
|
|
title = "Select Download Directory:";
|
|
rsc_te = SETTINGS_EDIT_DOWNLOAD_PATH;
|
|
require_path = true;
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_HOTLIST:
|
|
title = "Select Hotlist File:";
|
|
rsc_te = SETTINGS_EDIT_HOTLIST_FILE;
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_CA_BUNDLE:
|
|
title = "Select CA Bundle File:";
|
|
rsc_te = SETTINGS_EDIT_CA_BUNDLE;
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_CA_CERTS:
|
|
title = "Select Certs Directory:";
|
|
rsc_te = SETTINGS_EDIT_CA_CERTS_PATH;
|
|
require_path = true;
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_EDITOR:
|
|
title = "Select Editor Application:";
|
|
rsc_te = SETTINGS_EDIT_EDITOR;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
};
|
|
|
|
assert(rsc_te != 0);
|
|
|
|
if (require_path == false) {
|
|
path = file_select(title, "");
|
|
if (path != NULL) {
|
|
gemtk_obj_set_str_safe(dlgtree, rsc_te, path);
|
|
}
|
|
}
|
|
else {
|
|
do {
|
|
/* display file selector: */
|
|
path = file_select(title, "");
|
|
if (path) {
|
|
is_folder = is_dir(path);
|
|
}
|
|
if ((is_folder == false) && (path != NULL)) {
|
|
gemtk_msg_box_show(GEMTK_MSG_BOX_ALERT, "Folder Required!");
|
|
}
|
|
} while ((is_folder == false) && (path != NULL));
|
|
|
|
if ((is_folder == true) && (path != NULL)) {
|
|
gemtk_obj_set_str_safe(dlgtree, rsc_te, path);
|
|
}
|
|
}
|
|
|
|
OBJ_UNCHECK(rsc_bt);
|
|
OBJ_REDRAW(rsc_bt);
|
|
OBJ_REDRAW(rsc_te);
|
|
}
|
|
|
|
static void form_event(int index, int external)
|
|
{
|
|
char spare[255];
|
|
bool is_button = false;
|
|
bool checked = OBJ_SELECTED(index);
|
|
char * tmp;
|
|
MENU pop_menu, me_data;
|
|
|
|
short x, y;
|
|
int choice;
|
|
|
|
switch(index) {
|
|
|
|
case SETTINGS_CB_USE_PROXY:
|
|
if( checked ) {
|
|
ENABLE_OBJ(SETTINGS_EDIT_PROXY_HOST);
|
|
ENABLE_OBJ(SETTINGS_EDIT_PROXY_PORT);
|
|
ENABLE_OBJ(SETTINGS_CB_PROXY_AUTH);
|
|
} else {
|
|
DISABLE_OBJ(SETTINGS_EDIT_PROXY_HOST);
|
|
DISABLE_OBJ(SETTINGS_EDIT_PROXY_PORT);
|
|
DISABLE_OBJ(SETTINGS_CB_PROXY_AUTH);
|
|
}
|
|
FORMEVENT(SETTINGS_CB_PROXY_AUTH);
|
|
OBJ_REDRAW(SETTINGS_CB_USE_PROXY);
|
|
break;
|
|
|
|
case SETTINGS_CB_PROXY_AUTH:
|
|
if( checked && OBJ_SELECTED( SETTINGS_CB_USE_PROXY ) ) {
|
|
ENABLE_OBJ(SETTINGS_EDIT_PROXY_USERNAME);
|
|
ENABLE_OBJ(SETTINGS_EDIT_PROXY_PASSWORD);
|
|
} else {
|
|
DISABLE_OBJ(SETTINGS_EDIT_PROXY_USERNAME);
|
|
DISABLE_OBJ(SETTINGS_EDIT_PROXY_PASSWORD);
|
|
}
|
|
break;
|
|
|
|
case SETTINGS_CB_ENABLE_ANIMATION:
|
|
if( checked ) {
|
|
ENABLE_OBJ( SETTINGS_EDIT_MIN_GIF_DELAY );
|
|
} else {
|
|
DISABLE_OBJ( SETTINGS_EDIT_MIN_GIF_DELAY );
|
|
}
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_FONT_RENDERER:
|
|
if( external ) {
|
|
objc_offset(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER, &x, &y);
|
|
tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER);
|
|
// point mn_tree tree to font renderer popup:
|
|
pop_menu.mn_tree = gemtk_obj_create_popup_tree(font_engines,
|
|
NOF_ELEMENTS(font_engines), tmp, false,
|
|
-1, -1);
|
|
|
|
assert(pop_menu.mn_tree != NULL);
|
|
|
|
pop_menu.mn_menu = 0;
|
|
pop_menu.mn_item = 1;
|
|
pop_menu.mn_scroll = SCROLL_NO;
|
|
pop_menu.mn_keystate = 0;
|
|
|
|
/* Show the popup: */
|
|
menu_popup(&pop_menu, x, y, &me_data);
|
|
choice = me_data.mn_item;
|
|
|
|
/* Process selection: */
|
|
if (choice > 0 && choice <= (short)NOF_ELEMENTS(font_engines)) {
|
|
get_string(pop_menu.mn_tree, choice, spare);
|
|
set_text(SETTINGS_BT_SEL_FONT_RENDERER,
|
|
(char*)&spare[2],
|
|
LABEL_FONT_RENDERER_MAX_LEN);
|
|
OBJ_REDRAW(SETTINGS_BT_SEL_FONT_RENDERER);
|
|
}
|
|
|
|
gemtk_obj_destroy_popup_tree(pop_menu.mn_tree);
|
|
}
|
|
tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER);
|
|
if (strcasecmp(tmp, "freetype") == 0) {
|
|
ENABLE_OBJ(SETTINGS_CB_ANTI_ALIASING);
|
|
} else {
|
|
DISABLE_OBJ(SETTINGS_CB_ANTI_ALIASING);
|
|
}
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_LOCALE:
|
|
objc_offset(dlgtree, SETTINGS_BT_SEL_LOCALE, &x, &y);
|
|
|
|
if(num_locales < 1 || locales == NULL){
|
|
locales = read_locales();
|
|
}
|
|
|
|
if (num_locales < 1 || locales == NULL) {
|
|
// point mn_tree tree to states popup:
|
|
num_locales = 15;
|
|
pop_menu.mn_tree = gemtk_obj_get_tree(POP_LANGUAGE);
|
|
pop_menu.mn_item = POP_LANGUAGE_CS;
|
|
} else {
|
|
// point mn_tree tree to dynamic list:
|
|
tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_LOCALE);
|
|
pop_menu.mn_tree = gemtk_obj_create_popup_tree((const char**)locales,
|
|
num_locales, tmp, false,
|
|
-1, 100);
|
|
|
|
pop_menu.mn_item = 0;
|
|
}
|
|
|
|
pop_menu.mn_menu = 0;
|
|
pop_menu.mn_scroll = SCROLL_YES;
|
|
pop_menu.mn_keystate = 0;
|
|
|
|
/* display popup: */
|
|
menu_popup(&pop_menu, x, y, &me_data);
|
|
|
|
/* Process user selection: */
|
|
choice = me_data.mn_item;
|
|
if( choice > 0 && choice <= num_locales ) {
|
|
get_string(pop_menu.mn_tree, choice, spare);
|
|
set_text(SETTINGS_BT_SEL_LOCALE, (char*)&spare[2], 5);
|
|
}
|
|
|
|
gemtk_obj_destroy_popup_tree(pop_menu.mn_tree);
|
|
|
|
OBJ_REDRAW(SETTINGS_BT_SEL_LOCALE);
|
|
break;
|
|
|
|
case SETTINGS_BT_GUI_TOUT:
|
|
objc_offset(dlgtree, SETTINGS_BT_GUI_TOUT, &x, &y);
|
|
tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_GUI_TOUT);
|
|
pop_menu.mn_tree = gemtk_obj_create_popup_tree(gui_timeouts,
|
|
NOF_ELEMENTS(gui_timeouts), tmp, false, -1,
|
|
100);
|
|
|
|
pop_menu.mn_item = 0;
|
|
pop_menu.mn_menu = 0;
|
|
pop_menu.mn_scroll = SCROLL_NO;
|
|
pop_menu.mn_keystate = 0;
|
|
|
|
/* Display popup: */
|
|
menu_popup(&pop_menu, x, y, &me_data);
|
|
|
|
/* Process user selection: */
|
|
choice = me_data.mn_item;
|
|
if( choice > 0 && choice <= (int)NOF_ELEMENTS(gui_timeouts)) {
|
|
get_string(pop_menu.mn_tree, choice, spare);
|
|
set_text(SETTINGS_BT_GUI_TOUT, (char*)&spare[2], 5);
|
|
}
|
|
|
|
gemtk_obj_destroy_popup_tree(pop_menu.mn_tree);
|
|
|
|
OBJ_REDRAW(SETTINGS_BT_GUI_TOUT);
|
|
break;
|
|
|
|
case SETTINGS_BT_SEL_DOWNLOAD_DIR:
|
|
case SETTINGS_BT_SEL_HOTLIST:
|
|
case SETTINGS_BT_SEL_CA_BUNDLE:
|
|
case SETTINGS_BT_SEL_CA_CERTS:
|
|
case SETTINGS_BT_SEL_EDITOR:
|
|
handle_filesystem_select_button(index);
|
|
break;
|
|
|
|
case SETTINGS_INC_MEM_CACHE:
|
|
case SETTINGS_DEC_MEM_CACHE:
|
|
if( index == SETTINGS_DEC_MEM_CACHE )
|
|
tmp_option_memory_cache_size -= 1;
|
|
else
|
|
tmp_option_memory_cache_size += 1;
|
|
|
|
if( tmp_option_memory_cache_size < 0 )
|
|
tmp_option_memory_cache_size = 1;
|
|
if( tmp_option_memory_cache_size > 999 )
|
|
tmp_option_memory_cache_size = 999;
|
|
snprintf( spare, 255, "%02d", tmp_option_memory_cache_size );
|
|
set_text( SETTINGS_STR_MAX_MEM_CACHE, spare, 5 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_STR_MAX_MEM_CACHE);
|
|
break;
|
|
|
|
case SETTINGS_INC_DISC_CACHE:
|
|
case SETTINGS_DEC_DISC_CACHE:
|
|
if( index == SETTINGS_DEC_DISC_CACHE )
|
|
tmp_option_disc_cache_size -= 1;
|
|
else
|
|
tmp_option_disc_cache_size += 1;
|
|
|
|
if( tmp_option_disc_cache_size < 0 )
|
|
tmp_option_disc_cache_size = 1;
|
|
if( tmp_option_disc_cache_size > 9999 )
|
|
tmp_option_disc_cache_size = 9999;
|
|
snprintf( spare, 255, "%02d", tmp_option_disc_cache_size );
|
|
set_text( SETTINGS_STR_MAX_DISC_CACHE, spare, 5 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_STR_MAX_DISC_CACHE);
|
|
break;
|
|
|
|
case SETTINGS_INC_CACHE_AGE:
|
|
case SETTINGS_DEC_CACHE_AGE:
|
|
if( index == SETTINGS_INC_CACHE_AGE )
|
|
tmp_option_disc_cache_age += 1;
|
|
else
|
|
tmp_option_disc_cache_age -= 1;
|
|
|
|
if( tmp_option_disc_cache_age > 99 )
|
|
tmp_option_disc_cache_age = 0;
|
|
|
|
snprintf( spare, 255, "%02d", tmp_option_disc_cache_age );
|
|
set_text( SETTINGS_EDIT_CACHE_AGE, spare, 2 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_CACHE_AGE);
|
|
break;
|
|
|
|
case SETTINGS_INC_CACHED_CONNECTIONS:
|
|
case SETTINGS_DEC_CACHED_CONNECTIONS:
|
|
if( index == SETTINGS_INC_CACHED_CONNECTIONS )
|
|
tmp_option_max_cached_fetch_handles += 1;
|
|
else
|
|
tmp_option_max_cached_fetch_handles -= 1;
|
|
if( tmp_option_max_cached_fetch_handles > 31 )
|
|
tmp_option_max_cached_fetch_handles = 31;
|
|
|
|
snprintf( spare, 255, "%02d", tmp_option_max_cached_fetch_handles );
|
|
set_text( SETTINGS_EDIT_MAX_CACHED_CONNECTIONS, spare, 2 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MAX_CACHED_CONNECTIONS);
|
|
break;
|
|
|
|
case SETTINGS_INC_MAX_FETCHERS:
|
|
case SETTINGS_DEC_MAX_FETCHERS:
|
|
if( index == SETTINGS_INC_MAX_FETCHERS )
|
|
tmp_option_max_fetchers += 1;
|
|
else
|
|
tmp_option_max_fetchers -= 1;
|
|
if( tmp_option_max_fetchers > 31 )
|
|
tmp_option_max_fetchers = 31;
|
|
|
|
snprintf( spare, 255, "%02d", tmp_option_max_fetchers );
|
|
set_text( SETTINGS_EDIT_MAX_FETCHERS, spare, 2 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MAX_FETCHERS);
|
|
break;
|
|
|
|
case SETTINGS_INC_MAX_FETCHERS_PER_HOST:
|
|
case SETTINGS_DEC_MAX_FETCHERS_PER_HOST:
|
|
if( index == SETTINGS_INC_MAX_FETCHERS_PER_HOST )
|
|
tmp_option_max_fetchers_per_host += 1;
|
|
else
|
|
tmp_option_max_fetchers_per_host -= 1;
|
|
if( tmp_option_max_fetchers_per_host > 31 )
|
|
tmp_option_max_fetchers_per_host = 31;
|
|
|
|
snprintf( spare, 255, "%02d", tmp_option_max_fetchers_per_host );
|
|
set_text( SETTINGS_EDIT_MAX_FETCHERS_PER_HOST, spare, 2 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MAX_FETCHERS_PER_HOST);
|
|
break;
|
|
|
|
case SETTINGS_INC_HISTORY_AGE:
|
|
case SETTINGS_DEC_HISTORY_AGE:
|
|
if( index == SETTINGS_INC_HISTORY_AGE )
|
|
tmp_option_expire_url += 1;
|
|
else
|
|
tmp_option_expire_url -= 1;
|
|
|
|
if( tmp_option_expire_url > 99 )
|
|
tmp_option_expire_url = 0;
|
|
|
|
snprintf( spare, 255, "%02d", tmp_option_expire_url );
|
|
set_text( SETTINGS_EDIT_HISTORY_AGE, spare, 2 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_HISTORY_AGE);
|
|
break;
|
|
|
|
case SETTINGS_INC_GIF_DELAY:
|
|
case SETTINGS_DEC_GIF_DELAY:
|
|
if( index == SETTINGS_INC_GIF_DELAY )
|
|
tmp_option_minimum_gif_delay += 0.1;
|
|
else
|
|
tmp_option_minimum_gif_delay -= 0.1;
|
|
|
|
if( tmp_option_minimum_gif_delay < 0.1 )
|
|
tmp_option_minimum_gif_delay = 0.1;
|
|
if( tmp_option_minimum_gif_delay > 9.0 )
|
|
tmp_option_minimum_gif_delay = 9.0;
|
|
snprintf( spare, 255, "%01.1f", tmp_option_minimum_gif_delay );
|
|
set_text( SETTINGS_EDIT_MIN_GIF_DELAY, spare, 3 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MIN_GIF_DELAY);
|
|
break;
|
|
|
|
case SETTINGS_INC_MIN_FONT_SIZE:
|
|
case SETTINGS_DEC_MIN_FONT_SIZE:
|
|
if( index == SETTINGS_INC_MIN_FONT_SIZE )
|
|
tmp_option_font_min_size += 1;
|
|
else
|
|
tmp_option_font_min_size -= 1;
|
|
|
|
if( tmp_option_font_min_size > 500 )
|
|
tmp_option_font_min_size = 500;
|
|
if( tmp_option_font_min_size < 10 )
|
|
tmp_option_font_min_size = 10;
|
|
|
|
snprintf( spare, 255, "%03d", tmp_option_font_min_size );
|
|
set_text( SETTINGS_EDIT_MIN_FONT_SIZE, spare, 3 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MIN_FONT_SIZE);
|
|
break;
|
|
|
|
case SETTINGS_INC_DEF_FONT_SIZE:
|
|
case SETTINGS_DEC_DEF_FONT_SIZE:
|
|
if( index == SETTINGS_INC_DEF_FONT_SIZE )
|
|
tmp_option_font_size += 1;
|
|
else
|
|
tmp_option_font_size -= 1;
|
|
|
|
if( tmp_option_font_size > 999 )
|
|
tmp_option_font_size = 999;
|
|
if( tmp_option_font_size < 50 )
|
|
tmp_option_font_size = 50;
|
|
|
|
snprintf( spare, 255, "%03d", tmp_option_font_size );
|
|
set_text( SETTINGS_EDIT_DEF_FONT_SIZE, spare, 3 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_DEF_FONT_SIZE);
|
|
break;
|
|
|
|
case SETTINGS_INC_INCREMENTAL_REFLOW:
|
|
case SETTINGS_DEC_INCREMENTAL_REFLOW:
|
|
if( index == SETTINGS_INC_INCREMENTAL_REFLOW )
|
|
tmp_option_min_reflow_period += 1;
|
|
else
|
|
tmp_option_min_reflow_period -= 1;
|
|
|
|
if( tmp_option_min_reflow_period > 9999 )
|
|
tmp_option_min_reflow_period = 10;
|
|
|
|
snprintf( spare, 255, "%04d", tmp_option_min_reflow_period );
|
|
set_text( SETTINGS_EDIT_MIN_REFLOW_PERIOD, spare, 4 );
|
|
is_button = true;
|
|
OBJ_REDRAW(SETTINGS_EDIT_MIN_REFLOW_PERIOD);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if( is_button ) {
|
|
// remove selection indicator from button element:
|
|
OBJ_UNCHECK(index);
|
|
OBJ_REDRAW(index);
|
|
}
|
|
}
|
|
|
|
|
|
static void apply_settings(void)
|
|
{
|
|
/* "Network" tab: */
|
|
nsoption_set_bool(http_proxy, OBJ_SELECTED(SETTINGS_CB_USE_PROXY));
|
|
if ( OBJ_SELECTED(SETTINGS_CB_PROXY_AUTH) ) {
|
|
nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_BASIC);
|
|
} else {
|
|
nsoption_set_int(http_proxy_auth, OPTION_HTTP_PROXY_AUTH_NONE);
|
|
}
|
|
nsoption_set_charp(http_proxy_auth_pass,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_PROXY_PASSWORD));
|
|
nsoption_set_charp(http_proxy_auth_user,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_PROXY_USERNAME));
|
|
nsoption_set_charp(http_proxy_host,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_PROXY_HOST));
|
|
nsoption_set_int(http_proxy_port,
|
|
atoi( gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_PROXY_PORT) ));
|
|
nsoption_set_int(max_fetchers_per_host,
|
|
atoi( gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_MAX_FETCHERS_PER_HOST)));
|
|
nsoption_set_int(max_cached_fetch_handles,
|
|
atoi( gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_MAX_CACHED_CONNECTIONS)));
|
|
nsoption_set_int(max_fetchers,
|
|
atoi( gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_MAX_FETCHERS) ));
|
|
nsoption_set_bool(foreground_images,
|
|
OBJ_SELECTED( SETTINGS_CB_FG_IMAGES ));
|
|
nsoption_set_bool(background_images,
|
|
OBJ_SELECTED( SETTINGS_CB_BG_IMAGES ));
|
|
|
|
/* "Style" tab: */
|
|
nsoption_set_int(font_min_size, tmp_option_font_min_size);
|
|
nsoption_set_int(font_size, tmp_option_font_size);
|
|
|
|
/* "Rendering" tab: */
|
|
nsoption_set_charp(atari_font_driver,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER));
|
|
nsoption_set_int(atari_transparency,
|
|
OBJ_SELECTED(SETTINGS_CB_TRANSPARENCY));
|
|
nsoption_set_bool(animate_images,
|
|
OBJ_SELECTED(SETTINGS_CB_ENABLE_ANIMATION));
|
|
nsoption_set_int(minimum_gif_delay,
|
|
(int)(tmp_option_minimum_gif_delay*100+0.5));
|
|
/* nsoption_set_bool(incremental_reflow,
|
|
OBJ_SELECTED(SETTINGS_CB_INCREMENTAL_REFLOW));*/
|
|
nsoption_set_int(min_reflow_period, tmp_option_min_reflow_period);
|
|
nsoption_set_int(atari_font_monochrom,
|
|
!OBJ_SELECTED( SETTINGS_CB_ANTI_ALIASING ));
|
|
|
|
/* "Paths" tabs: */
|
|
nsoption_set_charp(ca_bundle,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_CA_BUNDLE));
|
|
nsoption_set_charp(ca_path,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_CA_CERTS_PATH));
|
|
nsoption_set_charp(homepage_url,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_CA_CERTS_PATH));
|
|
nsoption_set_charp(hotlist_file,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_HOTLIST_FILE));
|
|
nsoption_set_charp(atari_editor,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_EDITOR));
|
|
nsoption_set_charp(downloads_path,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_DOWNLOAD_PATH));
|
|
|
|
/* "Cache" tab: */
|
|
tmp_option_memory_cache_size = atoi(gemtk_obj_get_text(dlgtree,
|
|
SETTINGS_STR_MAX_MEM_CACHE));
|
|
tmp_option_expire_url = atoi(gemtk_obj_get_text(dlgtree,
|
|
SETTINGS_EDIT_HISTORY_AGE));
|
|
tmp_option_disc_cache_size = atoi(gemtk_obj_get_text(dlgtree,
|
|
SETTINGS_STR_MAX_DISC_CACHE));
|
|
tmp_option_disc_cache_age = atoi(gemtk_obj_get_text(dlgtree,
|
|
SETTINGS_EDIT_CACHE_AGE));
|
|
nsoption_set_int(memory_cache_size,
|
|
tmp_option_memory_cache_size * (1024*1024));
|
|
|
|
nsoption_set_int(expire_url, tmp_option_expire_url);
|
|
|
|
nsoption_set_int(disc_cache_size, tmp_option_disc_cache_size * (1024*1024));
|
|
|
|
nsoption_set_int(disc_cache_age, tmp_option_disc_cache_age);
|
|
|
|
|
|
/* "Browser" tab: */
|
|
nsoption_set_bool(target_blank,
|
|
!OBJ_SELECTED(SETTINGS_CB_DISABLE_POPUP_WINDOWS));
|
|
nsoption_set_bool(block_advertisements,
|
|
OBJ_SELECTED(SETTINGS_CB_HIDE_ADVERTISEMENT));
|
|
nsoption_set_charp(accept_language,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_LOCALE));
|
|
nsoption_set_int(atari_gui_poll_timeout,
|
|
atoi(gemtk_obj_get_text(dlgtree, SETTINGS_BT_GUI_TOUT)));
|
|
nsoption_set_bool(send_referer,
|
|
OBJ_SELECTED(SETTINGS_CB_SEND_HTTP_REFERRER));
|
|
nsoption_set_bool(do_not_track,
|
|
OBJ_SELECTED(SETTINGS_CB_SEND_DO_NOT_TRACK));
|
|
nsoption_set_charp(homepage_url,
|
|
gemtk_obj_get_text(dlgtree, SETTINGS_EDIT_HOMEPAGE));
|
|
}
|
|
|
|
static short on_aes_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
|
|
{
|
|
short retval = 0;
|
|
|
|
if ((ev_out->emo_events & MU_MESAG) != 0) {
|
|
// handle message
|
|
// printf("settings win msg: %d\n", msg[0]);
|
|
switch (msg[0]) {
|
|
|
|
|
|
case WM_CLOSED:
|
|
// TODO: this needs to iterate through all gui windows and
|
|
// check if the rootwin is this window...
|
|
close_settings();
|
|
break;
|
|
|
|
case WM_SIZED:
|
|
gemtk_wm_update_slider(win, GEMTK_WM_VH_SLIDER);
|
|
break;
|
|
|
|
case WM_MOVED:
|
|
break;
|
|
|
|
case WM_TOOLBAR:
|
|
switch(msg[4]) {
|
|
case TOOLBAR_SETTINGS_SAVE:
|
|
save_settings();
|
|
break;
|
|
|
|
case TOOLBAR_SETTINGS_ABORT:
|
|
close_settings();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case GEMTK_WM_WM_FORM_CLICK:
|
|
form_event(msg[4], 1);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ((ev_out->emo_events & MU_KEYBD) != 0) {
|
|
}
|
|
|
|
if ((ev_out->emo_events & MU_BUTTON) != 0) {
|
|
}
|
|
|
|
return(retval);
|
|
}
|
|
|
|
void open_settings(void)
|
|
{
|
|
if (h_aes_win == 0) {
|
|
|
|
GRECT curr, area;
|
|
OBJECT * toolbartree;
|
|
struct gemtk_wm_scroll_info_s *slid;
|
|
uint32_t kind = CLOSER | NAME | MOVER | VSLIDE | HSLIDE | UPARROW
|
|
| DNARROW | LFARROW | RTARROW | SIZER;
|
|
|
|
dlgtree = gemtk_obj_get_tree(SETTINGS);
|
|
toolbartree = gemtk_obj_get_tree(TOOLBAR_SETTINGS);
|
|
area.g_x = area.g_y = 0;
|
|
area.g_w = MIN(dlgtree->ob_width, desk_area.g_w);
|
|
area.g_h = MIN(dlgtree->ob_height, desk_area.g_h);
|
|
wind_calc_grect(WC_BORDER, kind, &area, &area);
|
|
h_aes_win = wind_create_grect(kind, &area);
|
|
wind_set_str(h_aes_win, WF_NAME, "Settings");
|
|
settings_guiwin = gemtk_wm_add(h_aes_win, GEMTK_WM_FLAG_DEFAULTS,
|
|
on_aes_event);
|
|
curr.g_w = MIN(dlgtree->ob_width, desk_area.g_w);
|
|
curr.g_h = MIN(dlgtree->ob_height, desk_area.g_h-64);
|
|
curr.g_x = 1;
|
|
curr.g_y = (desk_area.g_h / 2) - (curr.g_h / 2);
|
|
|
|
wind_calc_grect(WC_BORDER, kind, &curr, &curr);
|
|
|
|
dlgtree->ob_x = curr.g_x;
|
|
dlgtree->ob_y = curr.g_y;
|
|
|
|
/* set current config values: */
|
|
display_settings();
|
|
|
|
wind_open_grect(h_aes_win, &curr);
|
|
|
|
gemtk_wm_set_toolbar(settings_guiwin, toolbartree, 0, 0);
|
|
gemtk_wm_set_form(settings_guiwin, dlgtree, 0);
|
|
gemtk_wm_set_scroll_grid(settings_guiwin, 32, 32);
|
|
gemtk_wm_get_grect(settings_guiwin, GEMTK_WM_AREA_CONTENT, &area);
|
|
|
|
slid = gemtk_wm_get_scroll_info(settings_guiwin);
|
|
gemtk_wm_set_content_units(settings_guiwin,
|
|
(dlgtree->ob_width/slid->x_unit_px),
|
|
(dlgtree->ob_height/slid->y_unit_px));
|
|
gemtk_wm_update_slider(settings_guiwin, GEMTK_WM_VH_SLIDER);
|
|
}
|
|
}
|
|
|
|
void close_settings(void)
|
|
{
|
|
LOG("closing");
|
|
gemtk_wm_remove(settings_guiwin);
|
|
settings_guiwin = NULL;
|
|
wind_close(h_aes_win);
|
|
wind_delete(h_aes_win);
|
|
h_aes_win = 0;
|
|
LOG("Done");
|
|
}
|
|
|