/* 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 #include #include #include #include #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; }