20081227
[gdash.git] / src / settings.c
blob254b03cd4cbb3cc54733b70880f67ce98a05336e
1 /*
2 * Copyright (c) 2007, 2008 Czirkos Zoltan <cirix@fw.hu>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 #include <glib.h>
17 #include <glib/gi18n.h>
18 #include <stdlib.h>
19 #include "config.h"
20 #include "settings.h"
22 #ifdef USE_SDL
23 #include <SDL.h>
24 #endif
26 #ifdef USE_GTK
27 #include <gdk/gdkkeysyms.h>
28 #endif
31 #define SETTINGS_INI_FILE "gdash.ini"
32 #define SETTINGS_GDASH_GROUP "GDash"
34 /* names of scaling types supported. */
35 /* scale2x and scale3x are not translated: the license says that we should call it in its original name. */
36 const gchar *gd_scaling_name[]={N_("Original"), N_("2x nearest"), N_("2x bilinear"), "Scale2x", N_("3x nearest"), N_("3x bilinear"), "Scale3x", N_("4x nearest"), N_("4x bilinear"), "Scale4x", NULL};
37 /* scaling factors of scaling types supported. */
38 const int gd_scaling_scale[]={1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
40 #ifdef USE_GTK
41 /* possible languages. */
42 const gchar *gd_languages_names[]={N_("System default"), "English", "Deutsch", "Magyar", NULL};
43 /* this should correspond to the above one. */
44 #ifdef G_OS_WIN32
45 /* locale names used in windows. */
46 static const gchar *language_locale[][7]={
47 { "", NULL, },
48 { "English", NULL, },
49 { "German", NULL, },
50 { "Hungarian", NULL, },
52 /* these will be used on windows for a putenv to trick gtk. */
53 /* on linux, the setlocale call works correctly, and this is not needed. */
54 static const gchar *languages_for_env[]={
55 NULL, "en", "de", "hu"
57 #else
58 /* locale names used in unix. */
59 /* anyone, a better solution for this? */
60 static const gchar *language_locale_default[]=
61 { "", NULL, };
62 static const gchar *language_locale_en[]=
63 { "en_US.UTF-8", "en_US.UTF8", "en_US.ISO8859-15", "en_US.ISO8859-1", "en_US.US-ASCII", "en_US", "en", NULL, };
64 static const gchar *language_locale_de[]=
65 { "de_DE.UTF-8", "de_DE.UTF8", "de_DE.ISO8859-15", "de_DE.ISO8859-1", "de_DE",
66 "de_AT.UTF-8", "de_AT.UTF8", "de_AT.ISO8859-15", "de_AT.ISO8859-1", "de_AT",
67 "de_CH.UTF-8", "de_CH.UTF8", "de_CH.ISO8859-15", "de_CH.ISO8859-1", "de_CH",
68 "de", NULL, };
69 static const gchar *language_locale_hu[]=
70 { "hu_HU.UTF-8", "hu_HU.ISO8859-2", "hu_HU", "hu", NULL, };
71 static const gchar **language_locale[]={
72 language_locale_default,
73 language_locale_en,
74 language_locale_de,
75 language_locale_hu,
77 #endif /* ifdef g_os_win32 else */
79 #endif /* ifdef use_gtk */
86 /* GTK settings */
87 #ifdef USE_GTK /* only if having gtk */
89 /* editor settings */
90 #define SETTING_GAME_VIEW "game_view"
91 gboolean gd_game_view=TRUE; /* show animated cells instead of arrows & ... */
92 #define SETTING_COLORED_OBJECTS "colored_objects"
93 gboolean gd_colored_objects=TRUE; /* show objects with different color */
94 #define SETTING_SHOW_OBJECT_LIST "show_object_list"
95 gboolean gd_show_object_list=TRUE; /* show object list */
96 #define SETTING_SHOW_TEST_LABEL "show_test_label"
97 gboolean gd_show_test_label=TRUE; /* show a label with some variables, for testing */
98 #define SETTING_EDITOR_WINDOW_WIDTH "editor_window_width"
99 int gd_editor_window_width=800; /* window size */
100 #define SETTING_EDITOR_WINDOW_HEIGHT "editor_window_height"
101 int gd_editor_window_height=520; /* window size */
103 /* preferences */
104 #define SETTING_LANGUAGE "language"
105 int gd_language=0;
106 #define SETTING_TIME_MIN_SEC "time_min_sec"
107 gboolean gd_time_min_sec=TRUE;
108 #define SETTING_MOUSE_PLAY "mouse_play"
109 gboolean gd_mouse_play=FALSE;
110 #define SETTING_SHOW_PREVIEW "show_preview"
111 gboolean gd_show_preview=TRUE;
113 /* graphics */
114 #define SETTING_THEME "theme"
115 char *gd_theme=NULL;
116 #define SETTING_CELL_SCALE_GAME "cell_scale_game"
117 GdScalingType gd_cell_scale_game=GD_SCALING_ORIGINAL;
118 #define SETTING_PAL_EMULATION_GAME "pal_emulation_game"
119 gboolean gd_pal_emulation_game=FALSE;
120 #define SETTING_CELL_SCALE_EDITOR "cell_scale_editor"
121 GdScalingType gd_cell_scale_editor=GD_SCALING_ORIGINAL;
122 #define SETTING_PAL_EMULATION_EDITOR "pal_emulation_editor"
123 gboolean gd_pal_emulation_editor=FALSE;
125 /* keyboard */
126 #define SETTING_GTK_KEY_LEFT "gtk_key_left"
127 guint gd_gtk_key_left=GDK_Left;
128 #define SETTING_GTK_KEY_RIGHT "gtk_key_right"
129 guint gd_gtk_key_right=GDK_Right;
130 #define SETTING_GTK_KEY_UP "gtk_key_up"
131 guint gd_gtk_key_up=GDK_Up;
132 #define SETTING_GTK_KEY_DOWN "gtk_key_down"
133 guint gd_gtk_key_down=GDK_Down;
134 #define SETTING_GTK_KEY_FIRE_1 "gtk_key_fire_1"
135 guint gd_gtk_key_fire_1=GDK_Control_L;
136 #define SETTING_GTK_KEY_FIRE_2 "gtk_key_fire_2"
137 guint gd_gtk_key_fire_2=GDK_Control_R;
138 #define SETTING_GTK_KEY_SUICIDE "gtk_key_suicide"
139 guint gd_gtk_key_suicide=GDK_F2;
141 #endif /* only if having gtk */
145 /* universal settings */
146 #define SETTING_NO_INVISIBLE_OUTBOX "no_invisible_outbox"
147 gboolean gd_no_invisible_outbox=FALSE;
148 #define SETTING_ALL_CAVES_SELECTABLE "all_caves_selectable"
149 gboolean gd_all_caves_selectable=FALSE;
150 #define SETTING_IMPORT_AS_ALL_CAVES_SELECTABLE "import_as_all_caves_selectable"
151 gboolean gd_import_as_all_caves_selectable=TRUE;
152 #define SETTING_RANDOM_COLORS "random_colors"
153 gboolean gd_random_colors=FALSE;
154 #define SETTING_USE_BDCFF_HIGHSCORE "use_bdcff_highscore"
155 gboolean gd_use_bdcff_highscore=FALSE;
156 #define SETTING_PAL_EMU_SCANLINE_SHADE "pal_emu_scanline_shade"
157 int gd_pal_emu_scanline_shade=85;
158 #define SETTING_FINE_SCROLL "fine_scroll"
159 gboolean gd_fine_scroll=FALSE;
161 /* palette settings */
162 #define SETTING_C64_PALETTE "c64_palette"
163 int gd_c64_palette=0;
164 #define SETTING_C64DTV_PALETTE "c64dtv_palette"
165 int gd_c64dtv_palette=0;
166 #define SETTING_ATARI_PALETTE "atari_palette"
167 int gd_atari_palette=0;
168 #define SETTING_PREFERRED_PALETTE "preferred_palette"
169 GdColorType gd_preferred_palette=GD_COLOR_TYPE_RGB;
173 #ifdef USE_SDL /* only if having sdl */
174 #define SETTING_SDL_KEY_LEFT "sdl_key_left"
175 guint gd_sdl_key_left=SDLK_LEFT;
176 #define SETTING_SDL_KEY_RIGHT "sdl_key_right"
177 guint gd_sdl_key_right=SDLK_RIGHT;
178 #define SETTING_SDL_KEY_UP "sdl_key_up"
179 guint gd_sdl_key_up=SDLK_UP;
180 #define SETTING_SDL_KEY_DOWN "sdl_key_down"
181 guint gd_sdl_key_down=SDLK_DOWN;
182 #define SETTING_SDL_KEY_FIRE_1 "sdl_key_fire_1"
183 guint gd_sdl_key_fire_1=SDLK_LCTRL;
184 #define SETTING_SDL_KEY_FIRE_2 "sdl_key_fire_2"
185 guint gd_sdl_key_fire_2=SDLK_RCTRL;
186 #define SETTING_SDL_KEY_SUICIDE "sdl_key_suicide"
187 guint gd_sdl_key_suicide=SDLK_F2;
188 #define SETTING_EVEN_LINE_PAL_EMU_VERTICAL_SCROLL "even_line_pal_emu_vertical_scroll"
189 gboolean gd_even_line_pal_emu_vertical_scroll=FALSE;
190 #define SETTING_SDL_FULLSCREEN "sdl_fullscreen"
191 gboolean gd_sdl_fullscreen=FALSE;
192 #define SETTING_SDL_SCALE "sdl_scale"
193 GdScalingType gd_sdl_scale=GD_SCALING_ORIGINAL;
194 #define SETTING_SDL_THEME "sdl_theme"
195 char *gd_sdl_theme=NULL;
196 #define SETTING_SDL_PAL_EMULATION "sdl_pal_emulation"
197 gboolean gd_sdl_pal_emulation=FALSE;
198 #define SETTING_SHOW_NAME_OF_GAME "show_name_of_game"
199 gboolean gd_show_name_of_game=TRUE;
200 #endif /* use_sdl */
205 /* sound settings */
206 #ifdef GD_SOUND
207 #define SETTING_SDL_SOUND "sdl_sound"
208 gboolean gd_sdl_sound=TRUE;
209 #define SETTING_SDL_16BIT_MIXING "sdl_16bit_mixing"
210 gboolean gd_sdl_16bit_mixing=FALSE;
211 #define SETTING_SDL_44KHZ_MIXING "sdl_44khz_mixing"
212 gboolean gd_sdl_44khz_mixing=TRUE;
213 #define SETTING_CLASSIC_SOUND "classic_sound"
214 gboolean gd_classic_sound=FALSE;
215 #endif /* if gd_sound */
220 /* some directories the game uses */
221 char *gd_user_config_dir;
222 char *gd_system_data_dir;
223 char *gd_system_caves_dir;
224 char *gd_system_sound_dir;
225 char *gd_system_music_dir;
227 /* command line parameters */
228 int gd_param_cave=0, gd_param_level=1, gd_param_internal=0;
229 int gd_param_license=0;
230 char **gd_param_cavenames=NULL;
234 /* gets boolean value from key file; returns def if not found or unreadable */
235 static gboolean
236 keyfile_get_boolean_with_default(GKeyFile *keyfile, const char *group, const char *key, gboolean def)
238 GError *error=NULL;
239 gboolean result;
241 result=g_key_file_get_boolean(keyfile, group, key, &error);
242 if (!error)
243 return result;
244 g_warning("%s", error->message);
245 g_error_free(error);
246 return def;
249 /* gets integer value from key file; returns def if not found or unreadable */
250 static int
251 keyfile_get_integer_with_default(GKeyFile *keyfile, const char *group, const char *key, int def)
253 GError *error=NULL;
254 int result;
256 result=g_key_file_get_integer(keyfile, group, key, &error);
257 if (!error)
258 return result;
259 g_warning("%s", error->message);
260 g_error_free(error);
261 return def;
264 /* sets up directiories and loads translations */
265 void gd_settings_init_dirs()
267 g_assert(G_N_ELEMENTS(gd_scaling_name)==GD_SCALING_MAX+1); /* +1 is the terminating NULL */
268 g_assert(G_N_ELEMENTS(gd_scaling_scale)==GD_SCALING_MAX);
269 #ifdef G_OS_WIN32
270 /* on win32, use the glib function. */
271 gd_system_data_dir=g_win32_get_package_installation_directory (NULL, NULL);
272 #else
273 /* on linux, this is a defined, built-in string, $perfix/share/locale */
274 gd_system_data_dir=PKGDATADIR;
275 #endif
276 gd_system_caves_dir=g_build_path(G_DIR_SEPARATOR_S, gd_system_data_dir, "caves", NULL);
277 gd_system_sound_dir=g_build_path(G_DIR_SEPARATOR_S, gd_system_data_dir, "sound", NULL);
278 gd_system_music_dir=g_build_path(G_DIR_SEPARATOR_S, gd_system_data_dir, "music", NULL);
279 gd_user_config_dir=g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), PACKAGE, NULL);
282 /* set locale from the gdash setting variable. */
283 /* only bother setting the locale cleverly when we are in the gtk version. */
284 /* for sdl version, not really matters. */
285 /* if no gtk, just set the system default locale. */
286 void
287 gd_settings_set_locale()
289 #ifdef USE_GTK
290 int i;
291 char *result;
293 if (gd_language<0 || gd_language>=G_N_ELEMENTS(language_locale))
294 gd_language=0; /* switch to default, if out of bounds. */
296 /* on windows, we put the LANGUAGE variable into the environment. that seems to be the only
297 thing gtk+ reacts upon. we also set the locale below. */
298 #ifdef G_OS_WIN32
299 g_assert(G_N_ELEMENTS(language_locale)==G_N_ELEMENTS(languages_for_env));
300 if (languages_for_env[gd_language]) {
301 char *env;
303 env=g_strdup_printf("LANGUAGE=%s", languages_for_env[gd_language]);
304 putenv(env);
305 g_free(env);
307 #endif
309 /* try to set the locale. */
310 i=0;
311 result=NULL;
312 while(result==NULL && language_locale[gd_language][i]!=NULL) {
313 result=setlocale(LC_ALL, language_locale[gd_language][i]);
314 i++;
316 if (result==NULL) {
317 /* failed to set */
318 g_warning("Failed to set language to '%s'. Switching to system default locale.", gd_languages_names[gd_language]);
319 setlocale(LC_ALL, "");
321 #else
322 setlocale(LC_ALL, "");
323 #endif
326 /* sets up directiories and loads translations */
327 /* also instructs gettext to give all strings as utf8, as gtk uses that */
328 void gd_settings_init_translation()
330 #ifdef G_OS_WIN32
331 /* these would not be needed for the sdl version, but they do not hurt */
332 bindtextdomain("gtk20-properties", gd_system_data_dir);
333 bindtextdomain("gtk20", gd_system_data_dir);
334 bindtextdomain("glib20", gd_system_data_dir);
335 bind_textdomain_codeset("gtk20-properties", "UTF-8");
336 bind_textdomain_codeset("gtk20", "UTF-8");
337 bind_textdomain_codeset("glib20", "UTF-8");
338 /* gdash strings */
339 bindtextdomain (PACKAGE, gd_system_data_dir);
340 /* gtk always uses utf8, so convert translated strings to utf8 if needed */
341 bind_textdomain_codeset(PACKAGE, "UTF-8");
342 #else
343 /* and translated strings here. */
344 bindtextdomain(PACKAGE, LOCALEDIR);
345 bind_textdomain_codeset(PACKAGE, "UTF-8");
346 #endif
347 textdomain(PACKAGE); /* set default textdomain to gdash */
353 /* load settings from .config/gdash/gdash.ini */
354 void
355 gd_load_settings()
357 GKeyFile *ini;
358 GError *error=NULL;
359 gchar *data;
360 gsize length;
361 char *filename;
362 gboolean success;
364 filename=g_build_path(G_DIR_SEPARATOR_S, gd_user_config_dir, SETTINGS_INI_FILE, NULL);
366 if (!g_file_get_contents(filename, &data, &length, &error)) {
367 /* no ini file found */
368 g_warning("%s: %s", filename, error->message);
369 g_error_free(error);
370 error=NULL;
371 return;
373 g_free(filename);
375 /* if zero length file, also return */
376 if (length==0)
377 return;
379 ini=g_key_file_new();
380 success=g_key_file_load_from_data(ini, data, length, 0, &error);
381 g_free(data);
382 if (!success) {
383 g_warning("INI file contents error: %s", error->message);
384 g_error_free(error);
385 error=NULL;
386 return;
389 #ifdef USE_GTK /* only if having gtk */
390 /* editor settings */
391 gd_game_view=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GAME_VIEW, gd_game_view);
392 gd_colored_objects=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_COLORED_OBJECTS, gd_colored_objects);
393 gd_show_object_list=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_OBJECT_LIST, gd_show_object_list);
394 gd_show_test_label=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_TEST_LABEL, gd_show_test_label);
395 gd_editor_window_width=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_EDITOR_WINDOW_WIDTH, gd_editor_window_width);
396 gd_editor_window_height=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_EDITOR_WINDOW_HEIGHT, gd_editor_window_height);
398 /* preferences */
399 gd_language=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_LANGUAGE, gd_language);
400 gd_time_min_sec=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_TIME_MIN_SEC, gd_time_min_sec);
401 gd_mouse_play=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_MOUSE_PLAY, gd_mouse_play);
402 gd_show_preview=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_PREVIEW, gd_show_preview);
404 /* graphics */
405 gd_theme=g_key_file_get_string(ini, SETTINGS_GDASH_GROUP, SETTING_THEME, NULL);
406 gd_cell_scale_game=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_CELL_SCALE_GAME, gd_cell_scale_game);
407 if (gd_cell_scale_game<0 || gd_cell_scale_game>=GD_SCALING_MAX)
408 gd_cell_scale_game=0;
409 gd_pal_emulation_game=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMULATION_GAME, gd_pal_emulation_game);
410 gd_cell_scale_editor=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_CELL_SCALE_EDITOR, gd_cell_scale_editor);
411 if (gd_cell_scale_editor<0 || gd_cell_scale_editor>=GD_SCALING_MAX)
412 gd_cell_scale_editor=0;
413 gd_pal_emulation_editor=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMULATION_EDITOR, gd_pal_emulation_editor);
415 /* keyboard */
416 gd_gtk_key_left=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_LEFT, gd_gtk_key_left);
417 gd_gtk_key_right=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_RIGHT, gd_gtk_key_right);
418 gd_gtk_key_up=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_UP, gd_gtk_key_up);
419 gd_gtk_key_down=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_DOWN, gd_gtk_key_down);
420 gd_gtk_key_fire_1=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_FIRE_1, gd_gtk_key_fire_1);
421 gd_gtk_key_fire_2=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_FIRE_2, gd_gtk_key_fire_2);
422 gd_gtk_key_suicide=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_SUICIDE, gd_gtk_key_suicide);
423 #endif /* only if having gtk */
425 /* universal settings */
426 gd_no_invisible_outbox=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_NO_INVISIBLE_OUTBOX, gd_no_invisible_outbox);
427 gd_all_caves_selectable=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_ALL_CAVES_SELECTABLE, gd_all_caves_selectable);
428 gd_import_as_all_caves_selectable=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_IMPORT_AS_ALL_CAVES_SELECTABLE, gd_import_as_all_caves_selectable);
429 gd_random_colors=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_RANDOM_COLORS, gd_random_colors);
430 gd_use_bdcff_highscore=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_USE_BDCFF_HIGHSCORE, gd_use_bdcff_highscore);
431 gd_pal_emu_scanline_shade=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMU_SCANLINE_SHADE, gd_pal_emu_scanline_shade);
432 gd_fine_scroll=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_FINE_SCROLL, gd_fine_scroll);
434 /* palette settings */
435 gd_c64_palette=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_C64_PALETTE, gd_c64_palette);
436 gd_c64dtv_palette=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_C64DTV_PALETTE, gd_c64dtv_palette);
437 gd_atari_palette=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_ATARI_PALETTE, gd_atari_palette);
438 gd_preferred_palette=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_PREFERRED_PALETTE, gd_preferred_palette);
439 if (gd_preferred_palette<0 || gd_preferred_palette>=GD_COLOR_TYPE_UNKNOWN)
440 gd_preferred_palette=GD_COLOR_TYPE_RGB;
442 #ifdef USE_SDL /* only if having sdl */
443 gd_sdl_key_left=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_LEFT, gd_sdl_key_left);
444 gd_sdl_key_right=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_RIGHT, gd_sdl_key_right);
445 gd_sdl_key_up=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_UP, gd_sdl_key_up);
446 gd_sdl_key_down=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_DOWN, gd_sdl_key_down);
447 gd_sdl_key_fire_1=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_FIRE_1, gd_sdl_key_fire_1);
448 gd_sdl_key_fire_2=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_FIRE_2, gd_sdl_key_fire_2);
449 gd_sdl_key_suicide=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_SUICIDE, gd_sdl_key_suicide);
451 gd_even_line_pal_emu_vertical_scroll=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_EVEN_LINE_PAL_EMU_VERTICAL_SCROLL, gd_even_line_pal_emu_vertical_scroll);
452 gd_sdl_fullscreen=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_FULLSCREEN, gd_sdl_fullscreen);
453 gd_sdl_scale=keyfile_get_integer_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_SCALE, gd_sdl_scale);
454 if (gd_sdl_scale<0 || gd_sdl_scale>=GD_SCALING_MAX)
455 gd_sdl_scale=0;
456 gd_sdl_theme=g_key_file_get_string(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_THEME, NULL);
457 gd_sdl_pal_emulation=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_PAL_EMULATION, gd_sdl_pal_emulation);
458 gd_show_name_of_game=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_NAME_OF_GAME, gd_show_name_of_game);
459 #endif /* use_sdl */
461 #ifdef GD_SOUND /* sound settings */
462 gd_sdl_sound=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_SOUND, gd_sdl_sound);
463 gd_sdl_16bit_mixing=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_16BIT_MIXING, gd_sdl_16bit_mixing);
464 gd_sdl_44khz_mixing=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_44KHZ_MIXING, gd_sdl_44khz_mixing);
465 gd_classic_sound=keyfile_get_boolean_with_default(ini, SETTINGS_GDASH_GROUP, SETTING_CLASSIC_SOUND, gd_classic_sound);
466 #endif /* if gd_sound */
468 g_key_file_free(ini);
472 /* save settings to .config/gdash.ini */
473 void
474 gd_save_settings()
476 GKeyFile *ini;
477 GError *error=NULL;
478 gchar *data;
479 char *filename;
481 ini=g_key_file_new();
483 /* GTK settings */
484 #ifdef USE_GTK /* only if having gtk */
485 /* editor settings */
486 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_GAME_VIEW, gd_game_view);
487 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_COLORED_OBJECTS, gd_colored_objects);
488 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_OBJECT_LIST, gd_show_object_list);
489 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_TEST_LABEL, gd_show_test_label);
490 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_EDITOR_WINDOW_WIDTH, gd_editor_window_width);
491 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_EDITOR_WINDOW_HEIGHT, gd_editor_window_height);
493 /* preferences */
494 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_LANGUAGE, gd_language);
495 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_TIME_MIN_SEC, gd_time_min_sec);
496 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_MOUSE_PLAY, gd_mouse_play);
497 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_PREVIEW, gd_show_preview);
499 /* graphics */
500 if (gd_theme)
501 g_key_file_set_string(ini, SETTINGS_GDASH_GROUP, SETTING_THEME, gd_theme);
502 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_CELL_SCALE_GAME, gd_cell_scale_game);
503 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMULATION_GAME, gd_pal_emulation_game);
504 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_CELL_SCALE_EDITOR, gd_cell_scale_editor);
505 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMULATION_EDITOR, gd_pal_emulation_editor);
507 /* keyboard */
508 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_LEFT, gd_gtk_key_left);
509 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_RIGHT, gd_gtk_key_right);
510 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_UP, gd_gtk_key_up);
511 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_DOWN, gd_gtk_key_down);
512 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_FIRE_1, gd_gtk_key_fire_1);
513 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_FIRE_2, gd_gtk_key_fire_2);
514 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_GTK_KEY_SUICIDE, gd_gtk_key_suicide);
515 #endif /* only if having gtk */
517 /* universal settings */
518 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_NO_INVISIBLE_OUTBOX, gd_no_invisible_outbox);
519 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_ALL_CAVES_SELECTABLE, gd_all_caves_selectable);
520 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_IMPORT_AS_ALL_CAVES_SELECTABLE, gd_import_as_all_caves_selectable);
521 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_RANDOM_COLORS, gd_random_colors);
522 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_USE_BDCFF_HIGHSCORE, gd_use_bdcff_highscore);
523 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_PAL_EMU_SCANLINE_SHADE, gd_pal_emu_scanline_shade);
524 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_FINE_SCROLL, gd_fine_scroll);
526 /* palette settings */
527 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_C64_PALETTE, gd_c64_palette);
528 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_C64DTV_PALETTE, gd_c64dtv_palette);
529 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_ATARI_PALETTE, gd_atari_palette);
530 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_PREFERRED_PALETTE, gd_preferred_palette);
532 #ifdef USE_SDL /* only if having sdl */
533 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_LEFT, gd_sdl_key_left);
534 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_RIGHT, gd_sdl_key_right);
535 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_UP, gd_sdl_key_up);
536 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_DOWN, gd_sdl_key_down);
537 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_FIRE_1, gd_sdl_key_fire_1);
538 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_FIRE_2, gd_sdl_key_fire_2);
539 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_KEY_SUICIDE, gd_sdl_key_suicide);
541 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_EVEN_LINE_PAL_EMU_VERTICAL_SCROLL, gd_even_line_pal_emu_vertical_scroll);
542 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_FULLSCREEN, gd_sdl_fullscreen);
543 g_key_file_set_integer(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_SCALE, gd_sdl_scale);
544 if (gd_sdl_theme)
545 g_key_file_set_string(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_THEME, gd_sdl_theme);
546 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_PAL_EMULATION, gd_sdl_pal_emulation);
547 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SHOW_NAME_OF_GAME, gd_show_name_of_game);
548 #endif /* use_sdl */
550 #ifdef GD_SOUND /* sound settings */
551 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_SOUND, gd_sdl_sound);
552 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_16BIT_MIXING, gd_sdl_16bit_mixing);
553 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_SDL_44KHZ_MIXING, gd_sdl_44khz_mixing);
554 g_key_file_set_boolean(ini, SETTINGS_GDASH_GROUP, SETTING_CLASSIC_SOUND, gd_classic_sound);
555 #endif /* if gd_sound */
557 /* convert to string and free */
558 data=g_key_file_to_data(ini, NULL, &error);
559 g_key_file_free(ini);
560 if (error) {
561 /* this is highly unlikely - why would g_key_file_to_data report error? docs do not mention. */
562 g_warning("Unable to save settings: %s", error->message);
563 g_error_free(error);
564 g_free(data);
565 return;
568 filename=g_build_path(G_DIR_SEPARATOR_S, gd_user_config_dir, SETTINGS_INI_FILE, NULL);
569 g_mkdir_with_parents(gd_user_config_dir, 0700);
570 g_file_set_contents(filename, data, -1, &error);
571 g_free(filename);
572 if (error) {
573 /* error saving the file */
574 g_warning("Unable to save settings: %s", error->message);
575 g_error_free(error);
576 g_free(data);
577 return;
579 g_free(data);
585 GOptionContext *
586 gd_option_context_new()
588 GOptionEntry entries[]={
589 {"cave", 'c', 0, G_OPTION_ARG_INT, &gd_param_cave, N_("Select cave number C"), "C"},
590 {"level", 'l', 0, G_OPTION_ARG_INT, &gd_param_level, N_("Select level number L"), "L"},
591 {"internal", 'i', 0, G_OPTION_ARG_INT, &gd_param_internal, N_("Load internal caveset number I"), "I"},
592 {"license", 'L', 0, G_OPTION_ARG_NONE, &gd_param_license, N_("Show license and quit")},
593 {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &gd_param_cavenames, N_("Cave names")},
594 {NULL}
596 GOptionContext *context;
598 context=g_option_context_new (_("[FILE NAME]"));
599 g_option_context_set_help_enabled (context, TRUE);
600 g_option_context_add_main_entries (context, entries, PACKAGE); /* gdash parameters */
602 return context;