235 lines
6.9 KiB
C
235 lines
6.9 KiB
C
/* prefs.c - preferences handling functions
|
|
*
|
|
* This program 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; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <gtk/gtk.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
|
|
#include "game.h"
|
|
#include "gtkballs.h" /* for _() */
|
|
|
|
#define BUFFER_SIZE 1024
|
|
#define CONFIG_FILE_NAME "gtkballs.ini"
|
|
|
|
gint _show_next_colors = TRUE;
|
|
gint _show_path = TRUE;
|
|
gint _show_footprints = TRUE;
|
|
gint _show_destroy = TRUE;
|
|
gint _show_highlight = TRUE;
|
|
gint _hl_dr = 64;
|
|
gint _hl_dg = 64;
|
|
gint _hl_db = 64;
|
|
|
|
/* name of default theme. TODO: make "internal" theme, so, when
|
|
* theme name is NULL we can use it... */
|
|
gchar _default_theme_name[] = "Default";
|
|
|
|
/* This is the name of theme to use */
|
|
gchar *_theme_name = NULL;
|
|
|
|
gint pref_get_show_next_colors(void) {
|
|
return _show_next_colors;
|
|
}
|
|
|
|
void pref_set_show_next_colors(gint val) {
|
|
_show_next_colors = val;
|
|
}
|
|
|
|
gint pref_get_show_path(void) {
|
|
return _show_path;
|
|
}
|
|
|
|
void pref_set_show_path(gint val) {
|
|
_show_path = val;
|
|
}
|
|
|
|
gint pref_get_show_footprints(void) {
|
|
return _show_footprints;
|
|
}
|
|
|
|
void pref_set_show_footprints(gint val) {
|
|
_show_footprints = val;
|
|
}
|
|
|
|
gint pref_get_show_destroy(void) {
|
|
return _show_destroy;
|
|
}
|
|
|
|
void pref_set_show_destroy(gint val) {
|
|
_show_destroy = val;
|
|
}
|
|
|
|
gint pref_get_show_highlight(void) {
|
|
return _show_highlight;
|
|
}
|
|
|
|
void pref_set_show_highlight(gint val) {
|
|
_show_highlight = val;
|
|
}
|
|
|
|
gint prefs_get_hl_dr(void) {
|
|
return _hl_dr;
|
|
}
|
|
|
|
void prefs_set_hl_dr(gint dr) {
|
|
_hl_dr = dr;
|
|
}
|
|
|
|
gint prefs_get_hl_dg(void) {
|
|
return _hl_dg;
|
|
}
|
|
|
|
void prefs_set_hl_dg(gint dg) {
|
|
_hl_dg = dg;
|
|
}
|
|
|
|
gint prefs_get_hl_db(void) {
|
|
return _hl_db;
|
|
}
|
|
|
|
void prefs_set_hl_db(gint db) {
|
|
_hl_db = db;
|
|
}
|
|
|
|
gchar *pref_get_theme_name(void) {
|
|
return _theme_name;
|
|
}
|
|
|
|
gchar *pref_get_default_theme_name(void) {
|
|
return _default_theme_name;
|
|
}
|
|
|
|
void pref_set_theme_name(gchar *name) {
|
|
if (_theme_name) {
|
|
g_free(_theme_name);
|
|
}
|
|
_theme_name = g_strdup(name);
|
|
}
|
|
|
|
|
|
/* converts string to TRUE/FALSE. "true", "yes" or "1" is TRUE, otherwise - FALSE */
|
|
gboolean pref_str_to_bool(gchar *val) {
|
|
if (!g_ascii_strcasecmp(val, "true") ||
|
|
!g_ascii_strcasecmp(val, "yes") ||
|
|
!g_ascii_strcasecmp(val, "1")) {
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* converts boolean to string
|
|
returns _pointer_ to "yes" or "no". returned string should NOT be free()'d! */
|
|
gchar *pref_bool_to_str(gboolean val) {
|
|
return val ? "yes" : "no";
|
|
}
|
|
|
|
/* we use very lame preferences file format: ``property=value\n''.
|
|
so - there must be no whitespaces on begin/end of line =) */
|
|
void load_preferences(void)
|
|
{
|
|
FILE *fp;
|
|
gchar *rc_file;
|
|
gchar buffer[BUFFER_SIZE];
|
|
gchar **prop_val;
|
|
|
|
if (!_theme_name) {
|
|
_theme_name = g_strdup(_default_theme_name);
|
|
}
|
|
rc_file = get_config_dir_file (CONFIG_FILE_NAME);
|
|
if ((fp = fopen(rc_file, "r")))
|
|
{
|
|
while(fgets(buffer, BUFFER_SIZE, fp))
|
|
{
|
|
g_strchomp(buffer);
|
|
prop_val = g_strsplit(buffer, "=", 2);
|
|
if (prop_val[0] && prop_val[0][0] && prop_val[1] && prop_val[1][0])
|
|
{
|
|
if (!g_ascii_strcasecmp(prop_val[0], "show_hints")) {
|
|
_show_next_colors = pref_str_to_bool(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "show_path")) {
|
|
_show_path = pref_str_to_bool(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "show_footprints")) {
|
|
_show_footprints = pref_str_to_bool(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "show_destroy")) {
|
|
_show_destroy = pref_str_to_bool(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "show_highlight")) {
|
|
_show_highlight = pref_str_to_bool(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "theme_name")) {
|
|
if (_theme_name) {
|
|
g_free(_theme_name);
|
|
}
|
|
_theme_name = g_strdup(prop_val[1]);
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "rules_xsize")) {
|
|
rules_set_width(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "rules_ysize")) {
|
|
rules_set_height(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "rules_colors")) {
|
|
rules_set_colors(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "rules_next")) {
|
|
rules_set_next(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "rules_destroy")) {
|
|
rules_set_destroy(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "time_limit")) {
|
|
timer_set_limit(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "highlight_dr")) {
|
|
prefs_set_hl_dr(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "highlight_dg")) {
|
|
prefs_set_hl_dg(atoi(prop_val[1]));
|
|
} else if (!g_ascii_strcasecmp(prop_val[0], "highlight_db")) {
|
|
prefs_set_hl_db(atoi(prop_val[1]));
|
|
}
|
|
}
|
|
g_strfreev(prop_val);
|
|
}
|
|
fclose(fp);
|
|
}
|
|
g_free(rc_file);
|
|
}
|
|
|
|
/* writes ``property=value\n'' to fp.
|
|
why i made it separate function? for "feature purposes" =) */
|
|
void write_pref_string(FILE *fp, gchar *property, gchar *value) {
|
|
fprintf (fp, "%s=%s\n", property, value);
|
|
}
|
|
|
|
void write_pref_int(FILE *fp, gchar *property, gint value) {
|
|
fprintf (fp, "%s=%d\n", property, value);
|
|
}
|
|
|
|
gchar *save_preferences (void)
|
|
{
|
|
FILE *fp;
|
|
gchar *rc_file/*, *err*/;
|
|
gchar *ret = NULL;
|
|
|
|
rc_file = get_config_dir_file (CONFIG_FILE_NAME);
|
|
if ((fp = fopen(rc_file, "w"))) {
|
|
write_pref_string(fp, "show_hints", pref_bool_to_str(_show_next_colors));
|
|
write_pref_string(fp, "show_path", pref_bool_to_str(_show_path));
|
|
write_pref_string(fp, "show_footprints", pref_bool_to_str(_show_footprints));
|
|
write_pref_string(fp, "show_destroy", pref_bool_to_str(_show_destroy));
|
|
write_pref_string(fp, "show_highlight", pref_bool_to_str(_show_highlight));
|
|
write_pref_string(fp, "theme_name", _theme_name);
|
|
write_pref_int(fp, "rules_xsize", rules_get_width());
|
|
write_pref_int(fp, "rules_ysize", rules_get_height());
|
|
write_pref_int(fp, "rules_colors", rules_get_colors());
|
|
write_pref_int(fp, "rules_next", rules_get_next());
|
|
write_pref_int(fp, "rules_destroy", rules_get_destroy());
|
|
write_pref_int(fp, "time_limit", timer_get_limit());
|
|
write_pref_int(fp, "highlight_dr", prefs_get_hl_dr());
|
|
write_pref_int(fp, "highlight_dg", prefs_get_hl_dg());
|
|
write_pref_int(fp, "highlight_db", prefs_get_hl_db());
|
|
fclose(fp);
|
|
} else {
|
|
ret = g_strdup_printf(_("Can't write to %s: %s"), rc_file, strerror(errno));
|
|
}
|
|
g_free(rc_file);
|
|
return ret;
|
|
}
|