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.
17 #include <glib/gi18n.h>
27 #include <gdk/gdkkeysyms.h>
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};
41 /* possible languages. */
42 const gchar
*gd_languages_names
[]={N_("System default"), "English", "Deutsch", "Magyar", NULL
};
43 /* this should correspond to the above one. */
45 /* locale names used in windows. */
46 static const gchar
*language_locale
[][7]={
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"
58 /* locale names used in unix. */
59 /* anyone, a better solution for this? */
60 static const gchar
*language_locale_default
[]=
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",
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
,
77 #endif /* ifdef g_os_win32 else */
79 #endif /* ifdef use_gtk */
87 #ifdef USE_GTK /* only if having gtk */
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 */
104 #define SETTING_LANGUAGE "language"
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
;
114 #define SETTING_THEME "theme"
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
;
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
;
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 */
236 keyfile_get_boolean_with_default(GKeyFile
*keyfile
, const char *group
, const char *key
, gboolean def
)
241 result
=g_key_file_get_boolean(keyfile
, group
, key
, &error
);
244 g_warning("%s", error
->message
);
249 /* gets integer value from key file; returns def if not found or unreadable */
251 keyfile_get_integer_with_default(GKeyFile
*keyfile
, const char *group
, const char *key
, int def
)
256 result
=g_key_file_get_integer(keyfile
, group
, key
, &error
);
259 g_warning("%s", error
->message
);
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
);
270 /* on win32, use the glib function. */
271 gd_system_data_dir
=g_win32_get_package_installation_directory (NULL
, NULL
);
273 /* on linux, this is a defined, built-in string, $perfix/share/locale */
274 gd_system_data_dir
=PKGDATADIR
;
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. */
287 gd_settings_set_locale()
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. */
299 g_assert(G_N_ELEMENTS(language_locale
)==G_N_ELEMENTS(languages_for_env
));
300 if (languages_for_env
[gd_language
]) {
303 env
=g_strdup_printf("LANGUAGE=%s", languages_for_env
[gd_language
]);
309 /* try to set the locale. */
312 while(result
==NULL
&& language_locale
[gd_language
][i
]!=NULL
) {
313 result
=setlocale(LC_ALL
, language_locale
[gd_language
][i
]);
318 g_warning("Failed to set language to '%s'. Switching to system default locale.", gd_languages_names
[gd_language
]);
319 setlocale(LC_ALL
, "");
322 setlocale(LC_ALL
, "");
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()
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");
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");
343 /* and translated strings here. */
344 bindtextdomain(PACKAGE
, LOCALEDIR
);
345 bind_textdomain_codeset(PACKAGE
, "UTF-8");
347 textdomain(PACKAGE
); /* set default textdomain to gdash */
353 /* load settings from .config/gdash/gdash.ini */
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
);
375 /* if zero length file, also return */
379 ini
=g_key_file_new();
380 success
=g_key_file_load_from_data(ini
, data
, length
, 0, &error
);
383 g_warning("INI file contents error: %s", error
->message
);
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
);
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
);
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
);
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
)
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
);
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 */
481 ini
=g_key_file_new();
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
573 /* error saving the file */
574 g_warning("Unable to save settings: %s", error
->message
);
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")},
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 */