mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-12-23 20:46:50 +03:00
c105738fa3
This changes the LOG macro to be varadic removing the need for all callsites to have double bracketing and allows for future improvement on how we use the logging macros. The callsites were changed with coccinelle and the changes checked by hand. Compile tested for several frontends but not all. A formatting annotation has also been added which allows the compiler to check the parameters and types passed to the logging.
989 lines
33 KiB
C
989 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 <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <dirent.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/nsoption.h"
|
|
#include "utils/log.h"
|
|
#include "desktop/plot_style.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) {
|
|
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("");
|
|
gemtk_wm_remove(settings_guiwin);
|
|
settings_guiwin = NULL;
|
|
wind_close(h_aes_win);
|
|
wind_delete(h_aes_win);
|
|
h_aes_win = 0;
|
|
LOG("Done");
|
|
}
|
|
|