1 /*
2  * This file is part of Siril, an astronomy image processor.
3  * Copyright (C) 2005-2011 Francois Meyer (dulle at free.fr)
4  * Copyright (C) 2012-2015 team free-astro (see more in AUTHORS file)
5  * Reference site is https://free-astro.org/index.php/Siril
6  *
7  * Siril is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * Siril is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Siril. If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #include <libconfig.h>
22 #include <string.h>
23 
24 #include "core/siril.h"
25 #include "core/proto.h"
26 #include "core/siril_app_dirs.h"
27 #include "algos/photometry.h"
28 #include "algos/star_finder.h"
29 #include "io/sequence.h"
30 #include "gui/utils.h"
31 #include "gui/progress_and_log.h"
32 #include "stacking/stacking.h"
33 
34 #include "initfile.h"
35 
36 #define CONFIG_FILE "siril.config"
37 
38 static const char *keywords[] = { "working-directory", "libraw-settings",
39 		"debayer-settings", "prepro-settings", "registration-settings",
40 		"stacking-settings", "astrometry-settings", "photometry-settings",
41 		"misc-settings", "compression-settings" };
42 
readinitfile()43 static int readinitfile() {
44 	config_t config;
45 	const char *dir = NULL;
46 	GSList *list = NULL;
47 
48 	if (!com.initfile)
49 		return 1;
50 
51 	config_init(&config);
52 
53 	if (config_read_file(&config, com.initfile) == CONFIG_FALSE) {
54 		return 1;
55 	}
56 	siril_log_message(_("Loading init file: '%s'\n"), com.initfile);
57 
58 	/* Keeping the up-scaled files poses a few problems with sequence
59 	 * filtering changing and user comprehension, so for now it can only be
60 	 * enabled by uncommenting the following line. */
61 	//com.cache_upscaled = TRUE;
62 
63 	/* Working directory */
64 	if (config_lookup_string(&config, keywords[WD], &dir)) {
65 		free(com.wd);
66 		com.wd = g_strdup(dir);
67 	}
68 
69 	/* Libraw setting */
70 	config_setting_t *raw_setting = config_lookup(&config, keywords[RAW]);
71 	if (raw_setting) {
72 		config_setting_lookup_float(raw_setting, "mul_0", &com.pref.raw_set.mul[0]);
73 		config_setting_lookup_float(raw_setting, "mul_2", &com.pref.raw_set.mul[2]);
74 		config_setting_lookup_float(raw_setting, "bright", &com.pref.raw_set.bright);
75 		config_setting_lookup_int(raw_setting, "auto", &com.pref.raw_set.auto_mul);
76 		config_setting_lookup_int(raw_setting, "cam_wb", &com.pref.raw_set.use_camera_wb);
77 		config_setting_lookup_int(raw_setting, "auto_wb", &com.pref.raw_set.use_auto_wb);
78 		config_setting_lookup_int(raw_setting, "user_qual", &com.pref.raw_set.user_qual);
79 		config_setting_lookup_float(raw_setting, "gamm_0", &com.pref.raw_set.gamm[0]);
80 		config_setting_lookup_float(raw_setting, "gamm_1", &com.pref.raw_set.gamm[1]);
81 		config_setting_lookup_int(raw_setting, "user_black", &com.pref.raw_set.user_black);
82 	}
83 
84 	/* Debayer setting */
85 	config_setting_t *debayer_setting = config_lookup(&config, keywords[BAY]);
86 	if (debayer_setting) {
87 		config_setting_lookup_bool(debayer_setting, "use_bayer_header", &com.pref.debayer.use_bayer_header);
88 		config_setting_lookup_int(debayer_setting, "bayer_pattern", &com.pref.debayer.bayer_pattern);
89 		config_setting_lookup_bool(debayer_setting, "roworder_top_down", &com.pref.debayer.top_down);
90 		config_setting_lookup_int(debayer_setting, "debayer_algo", (int*)&com.pref.debayer.bayer_inter);
91 		config_setting_lookup_int(debayer_setting, "x_bayer_offset", &com.pref.debayer.xbayeroff);
92 		config_setting_lookup_int(debayer_setting, "y_bayer_offset", &com.pref.debayer.ybayeroff);
93 	}
94 
95 	/* Preprocessing settings */
96 	config_setting_t *prepro_setting = config_lookup(&config, keywords[PRE]);
97 	if (prepro_setting) {
98 		const char *bias = NULL, *bias_synth = NULL, *dark = NULL, *flat = NULL;
99 
100 		config_setting_lookup_bool(prepro_setting, "cfa", &com.pref.prepro_cfa);
101 		config_setting_lookup_bool(prepro_setting, "equalize_cfa", &com.pref.prepro_equalize_cfa);
102 		config_setting_lookup_bool(prepro_setting, "fix_xtrans", &com.pref.fix_xtrans);
103 
104 		config_setting_lookup_string(prepro_setting, "bias_lib", &bias);
105 		com.pref.prepro_bias_lib = g_strdup(bias);
106 		config_setting_lookup_bool(prepro_setting, "use_bias_lib", &com.pref.use_bias_lib);
107 
108 
109 		config_setting_lookup_string(prepro_setting, "bias_synth", &bias_synth);
110 		com.pref.prepro_bias_synth = g_strdup(bias_synth);
111 		config_setting_lookup_bool(prepro_setting, "use_bias_synth", &com.pref.use_bias_synth);
112 
113 		config_setting_lookup_string(prepro_setting, "dark_lib", &dark);
114 		com.pref.prepro_dark_lib = g_strdup(dark);
115 		config_setting_lookup_bool(prepro_setting, "use_dark_lib", &com.pref.use_dark_lib);
116 
117 		config_setting_lookup_string(prepro_setting, "flat_lib", &flat);
118 		com.pref.prepro_flat_lib = g_strdup(flat);
119 		config_setting_lookup_bool(prepro_setting, "use_flat_lib", &com.pref.use_flat_lib);
120 
121 		prepro_setting = config_lookup(&config, "prepro-settings.xtrans_af");
122 		if (prepro_setting != NULL) {
123 			com.pref.xtrans_af.x = config_setting_get_int_elem(prepro_setting, 0);
124 			com.pref.xtrans_af.y = config_setting_get_int_elem(prepro_setting, 1);
125 			com.pref.xtrans_af.w = config_setting_get_int_elem(prepro_setting, 2);
126 			com.pref.xtrans_af.h = config_setting_get_int_elem(prepro_setting, 3);
127 		}
128 		prepro_setting = config_lookup(&config, "prepro-settings.xtrans_sample");
129 		if (prepro_setting != NULL) {
130 			com.pref.xtrans_sample.x = config_setting_get_int_elem(prepro_setting, 0);
131 			com.pref.xtrans_sample.y = config_setting_get_int_elem(prepro_setting, 1);
132 			com.pref.xtrans_sample.w = config_setting_get_int_elem(prepro_setting, 2);
133 			com.pref.xtrans_sample.h = config_setting_get_int_elem(prepro_setting, 3);
134 		}
135 	}
136 
137 	/* Registration setting */
138 	config_setting_t *reg_setting = config_lookup(&config, keywords[REG]);
139 	if (reg_setting) {
140 		config_setting_lookup_int(reg_setting, "method", &com.reg_settings);
141 	}
142 
143 	/* Stacking setting */
144 	config_setting_t *stack_setting = config_lookup(&config, keywords[STK]);
145 	if (stack_setting) {
146 		config_setting_lookup_int(stack_setting, "method", &com.pref.stack.method);
147 		config_setting_lookup_int(stack_setting, "rejection", &com.pref.stack.rej_method);
148 		config_setting_lookup_int(stack_setting, "normalisation", &com.pref.stack.normalisation_method);
149 		config_setting_lookup_float(stack_setting, "sigma_low", &com.pref.stack.sigma_low);
150 		config_setting_lookup_float(stack_setting, "sigma_high", &com.pref.stack.sigma_high);
151 		config_setting_lookup_float(stack_setting, "linear_low", &com.pref.stack.linear_low);
152 		config_setting_lookup_float(stack_setting, "linear_high", &com.pref.stack.linear_high);
153 		config_setting_lookup_float(stack_setting, "percentile_low", &com.pref.stack.percentile_low);
154 		config_setting_lookup_float(stack_setting, "percentile_high", &com.pref.stack.percentile_high);
155 
156 
157 		config_setting_lookup_int(stack_setting, "mem_mode", (int*)&com.pref.stack.mem_mode);
158 		config_setting_lookup_float(stack_setting, "maxmem", &com.pref.stack.memory_ratio);
159 		config_setting_lookup_float(stack_setting, "maxmem_gb",	&com.pref.stack.memory_amount);
160 	}
161 	if (com.pref.stack.mem_mode < 0 || com.pref.stack.mem_mode > 2)
162 		com.pref.stack.mem_mode = RATIO;
163 	if (com.pref.stack.memory_ratio <= 0.05)
164 		com.pref.stack.memory_ratio = 0.9;
165 
166 	/* FITS compression setting */
167 	config_setting_t *comp_setting = config_lookup(&config, keywords[CMP]);
168 	if (comp_setting) {
169 		config_setting_lookup_bool(comp_setting, "compress_enabled", &com.pref.comp.fits_enabled);
170 		config_setting_lookup_int(comp_setting, "compress_method", &com.pref.comp.fits_method);
171 		config_setting_lookup_float(comp_setting, "compress_quantization", &com.pref.comp.fits_quantization);
172 		config_setting_lookup_float(comp_setting, "compress_hcompress_scale", &com.pref.comp.fits_hcompress_scale);
173 	}
174 
175 	/* Astrometry setting */
176 	config_setting_t *astrometry_setting = config_lookup(&config, keywords[AST]);
177 	if (astrometry_setting) {
178 		config_setting_lookup_bool(astrometry_setting, "messier", &com.pref.catalog[0]);
179 		config_setting_lookup_bool(astrometry_setting, "ngc", &com.pref.catalog[1]);
180 		config_setting_lookup_bool(astrometry_setting, "ic", &com.pref.catalog[2]);
181 		config_setting_lookup_bool(astrometry_setting, "ldn", &com.pref.catalog[3]);
182 		config_setting_lookup_bool(astrometry_setting, "sh2", &com.pref.catalog[4]);
183 		config_setting_lookup_bool(astrometry_setting, "stars", &com.pref.catalog[5]);
184 
185 	} else {
186 		for (int i = 0; i < 6; i ++) {
187 			com.pref.catalog[i] = TRUE;
188 		}
189 	}
190 
191 	/* Photometry setting */
192 	config_setting_t *photometry_setting = config_lookup(&config, keywords[PTM]);
193 	if (photometry_setting) {
194 		config_setting_lookup_float(photometry_setting, "gain", &com.pref.phot_set.gain);
195 		config_setting_lookup_float(photometry_setting, "inner-radius", &com.pref.phot_set.inner);
196 		config_setting_lookup_float(photometry_setting, "outer-radius", &com.pref.phot_set.outer);
197 		config_setting_lookup_int(photometry_setting, "minval", &com.pref.phot_set.minval);
198 		config_setting_lookup_int(photometry_setting, "maxval", &com.pref.phot_set.maxval);
199 	}
200 
201 	/* Misc setting */
202 	config_setting_t *misc_setting = config_lookup(&config, keywords[MISC]);
203 	if (misc_setting) {
204 		int type;
205 		const char *swap_dir = NULL, *extension = NULL, *lang = NULL, *copyright = NULL;
206 
207 		if (config_setting_lookup_bool(misc_setting, "first_start_0_99_8", &com.pref.first_start) == CONFIG_FALSE) {
208 			com.pref.first_start = TRUE;
209 		}
210 		if (config_setting_lookup_bool(misc_setting, "confirm_quit", &com.pref.save.quit) == CONFIG_FALSE) {
211 			com.pref.save.quit = FALSE;
212 		}
213 		if (config_setting_lookup_bool(misc_setting, "scripts_warning", &com.pref.save.warn_script) == CONFIG_FALSE) {
214 			com.pref.save.warn_script = TRUE;
215 		}
216 		if (config_setting_lookup_bool(misc_setting, "check_requires", &com.pref.script_check_requires) == CONFIG_FALSE) {
217 			com.pref.script_check_requires = TRUE;
218 		}
219 		if (config_setting_lookup_bool(misc_setting, "show_thumbnails", &com.pref.show_thumbnails) == CONFIG_FALSE) {
220 			com.pref.show_thumbnails = TRUE;
221 		}
222 		if (config_setting_lookup_bool(misc_setting, "remember_winpos", &com.pref.remember_windows) == CONFIG_FALSE) {
223 			com.pref.remember_windows = TRUE;
224 		}
225 		if (config_setting_lookup_bool(misc_setting, "check_update_at_startup", &com.pref.check_update) == CONFIG_FALSE) {
226 			com.pref.check_update = TRUE;
227 		}
228 		if (config_setting_lookup_float(misc_setting, "font_scale", &com.pref.font_scale) == CONFIG_FALSE) {
229 			com.pref.font_scale = 100.0;
230 		}
231 		if (config_setting_lookup_bool(misc_setting, "icon_symbolic", &com.pref.icon_symbolic) == CONFIG_FALSE) {
232 			com.pref.icon_symbolic = FALSE;
233 		}
234 		if (config_setting_lookup_bool(misc_setting, "rgb_aladin", &com.pref.rgb_aladin) == CONFIG_FALSE) {
235 			com.pref.rgb_aladin = FALSE;
236 		}
237 		if (config_setting_lookup_float(misc_setting, "focal", &com.pref.focal) == CONFIG_FALSE) {
238 			com.pref.focal = 1000.0;
239 		}
240 		if (config_setting_lookup_float(misc_setting, "pitch", &com.pref.pitch) == CONFIG_FALSE) {
241 			com.pref.pitch = 5.0;
242 		}
243 		config_setting_lookup_int(misc_setting, "thumbnail_size", &com.pref.thumbnail_size);
244 		config_setting_lookup_int(misc_setting, "theme", &com.pref.combo_theme);
245 		config_setting_lookup_string(misc_setting, "lang", &lang);
246 		com.pref.combo_lang = g_strdup(lang);
247 		config_setting_lookup_bool(misc_setting, "is_maximized", &com.pref.is_maximized);
248 		config_setting_lookup_string(misc_setting, "swap_directory", &swap_dir);
249 		com.pref.swap_dir = g_strdup(swap_dir);
250 		config_setting_lookup_string(misc_setting, "extension", &extension);
251 		com.pref.ext = g_strdup(extension);
252 		config_setting_lookup_int(misc_setting, "FITS_type", &type);
253 		com.pref.force_to_16bit = (type == 0);
254 		config_setting_lookup_int(misc_setting, "selection_guides", &com.pref.selection_guides);
255 		config_setting_lookup_string(misc_setting, "copyright", &copyright);
256 		com.pref.copyright = g_strdup(copyright);
257 
258 		misc_setting = config_lookup(&config, "misc-settings.scripts_paths");
259 		if (misc_setting != NULL) {
260 			unsigned int count = config_setting_length(misc_setting);
261 			unsigned int i;
262 			const char *tmp = NULL;
263 
264 			for (i = 0; i < count; ++i) {
265 				tmp = config_setting_get_string_elem(misc_setting, i);
266 				list = g_slist_append(list, g_strdup(tmp));
267 			}
268 		}
269 		misc_setting = config_lookup(&config, "misc-settings.main_w_pos");
270 		if (misc_setting != NULL) {
271 			com.pref.main_w_pos.x = config_setting_get_int_elem(misc_setting, 0);
272 			com.pref.main_w_pos.y = config_setting_get_int_elem(misc_setting, 1);
273 			com.pref.main_w_pos.w = config_setting_get_int_elem(misc_setting, 2);
274 			com.pref.main_w_pos.h = config_setting_get_int_elem(misc_setting, 3);
275 		}
276 	}
277 	com.pref.script_path = list;
278 	config_destroy(&config);
279 	return 0;
280 }
281 
_save_wd(config_t * config,config_setting_t * root)282 static void _save_wd(config_t *config, config_setting_t *root) {
283 	config_setting_t *directory;
284 
285 	directory = config_setting_add(root, keywords[WD], CONFIG_TYPE_STRING);
286 	config_setting_set_string(directory, com.wd);
287 }
288 
_save_libraw(config_t * config,config_setting_t * root)289 static void _save_libraw(config_t *config, config_setting_t *root) {
290 	config_setting_t *libraw_group, *raw_setting;
291 
292 	libraw_group = config_setting_add(root, keywords[RAW], CONFIG_TYPE_GROUP);
293 
294 	raw_setting = config_setting_add(libraw_group, "mul_0", CONFIG_TYPE_FLOAT);
295 	config_setting_set_float(raw_setting, com.pref.raw_set.mul[0]);
296 
297 	raw_setting = config_setting_add(libraw_group, "mul_2", CONFIG_TYPE_FLOAT);
298 	config_setting_set_float(raw_setting, com.pref.raw_set.mul[2]);
299 
300 	raw_setting = config_setting_add(libraw_group, "bright", CONFIG_TYPE_FLOAT);
301 	config_setting_set_float(raw_setting, com.pref.raw_set.bright);
302 
303 	raw_setting = config_setting_add(libraw_group, "auto", CONFIG_TYPE_INT);
304 	config_setting_set_int(raw_setting, com.pref.raw_set.auto_mul);
305 
306 	raw_setting = config_setting_add(libraw_group, "cam_wb", CONFIG_TYPE_INT);
307 	config_setting_set_int(raw_setting, com.pref.raw_set.use_camera_wb);
308 
309 	raw_setting = config_setting_add(libraw_group, "auto_wb", CONFIG_TYPE_INT);
310 	config_setting_set_int(raw_setting, com.pref.raw_set.use_auto_wb);
311 
312 	raw_setting = config_setting_add(libraw_group, "user_qual",	CONFIG_TYPE_INT);
313 	config_setting_set_int(raw_setting, com.pref.raw_set.user_qual);
314 
315 	raw_setting = config_setting_add(libraw_group, "gamm_0", CONFIG_TYPE_FLOAT);
316 	config_setting_set_float(raw_setting, com.pref.raw_set.gamm[0]);
317 
318 	raw_setting = config_setting_add(libraw_group, "gamm_1", CONFIG_TYPE_FLOAT);
319 	config_setting_set_float(raw_setting, com.pref.raw_set.gamm[1]);
320 
321 	raw_setting = config_setting_add(libraw_group, "user_black", CONFIG_TYPE_INT);
322 	config_setting_set_int(raw_setting, com.pref.raw_set.user_black);
323 }
324 
_save_debayer(config_t * config,config_setting_t * root)325 static void _save_debayer(config_t *config, config_setting_t *root) {
326 	config_setting_t *debayer_group, *debayer_setting;
327 
328 	debayer_group = config_setting_add(root, keywords[BAY], CONFIG_TYPE_GROUP);
329 
330 	debayer_setting = config_setting_add(debayer_group, "use_bayer_header",	CONFIG_TYPE_BOOL);
331 	config_setting_set_bool(debayer_setting, com.pref.debayer.use_bayer_header);
332 
333 	debayer_setting = config_setting_add(debayer_group, "bayer_pattern", CONFIG_TYPE_INT);
334 	config_setting_set_int(debayer_setting, com.pref.debayer.bayer_pattern);
335 
336 	debayer_setting = config_setting_add(debayer_group, "roworder_top_down", CONFIG_TYPE_BOOL);
337 	config_setting_set_bool(debayer_setting, com.pref.debayer.top_down);
338 
339 	debayer_setting = config_setting_add(debayer_group, "debayer_algo", CONFIG_TYPE_INT);
340 	config_setting_set_int(debayer_setting, com.pref.debayer.bayer_inter);
341 
342 	debayer_setting = config_setting_add(debayer_group, "x_bayer_offset", CONFIG_TYPE_INT);
343 	config_setting_set_int(debayer_setting, com.pref.debayer.xbayeroff);
344 	debayer_setting = config_setting_add(debayer_group, "y_bayer_offset", CONFIG_TYPE_INT);
345 	config_setting_set_int(debayer_setting, com.pref.debayer.ybayeroff);
346 }
347 
_save_preprocessing(config_t * config,config_setting_t * root)348 static void _save_preprocessing(config_t *config, config_setting_t *root) {
349 	config_setting_t *prepro_group, *prepro_setting;
350 
351 	prepro_group = config_setting_add(root, keywords[PRE], CONFIG_TYPE_GROUP);
352 
353 	prepro_setting = config_setting_add(prepro_group, "cfa", CONFIG_TYPE_BOOL);
354 	config_setting_set_bool(prepro_setting, com.pref.prepro_cfa);
355 
356 	prepro_setting = config_setting_add(prepro_group, "equalize_cfa", CONFIG_TYPE_BOOL);
357 	config_setting_set_bool(prepro_setting, com.pref.prepro_equalize_cfa);
358 
359 	prepro_setting = config_setting_add(prepro_group, "fix_xtrans", CONFIG_TYPE_BOOL);
360 	config_setting_set_bool(prepro_setting, com.pref.fix_xtrans);
361 
362 	prepro_setting = config_setting_add(prepro_group, "xtrans_af",	CONFIG_TYPE_LIST);
363 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_af.x);
364 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_af.y);
365 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_af.w);
366 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_af.h);
367 
368 	prepro_setting = config_setting_add(prepro_group, "xtrans_sample",	CONFIG_TYPE_LIST);
369 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_sample.x);
370 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_sample.y);
371 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_sample.w);
372 	config_setting_set_int_elem(prepro_setting, -1, com.pref.xtrans_sample.h);
373 
374 	prepro_setting = config_setting_add(prepro_group, "bias_lib", CONFIG_TYPE_STRING);
375 	config_setting_set_string(prepro_setting, com.pref.prepro_bias_lib);
376 	prepro_setting = config_setting_add(prepro_group, "use_bias_lib", CONFIG_TYPE_BOOL);
377 	config_setting_set_bool(prepro_setting, com.pref.use_bias_lib);
378 
379 	prepro_setting = config_setting_add(prepro_group, "bias_synth", CONFIG_TYPE_STRING);
380 	config_setting_set_string(prepro_setting, com.pref.prepro_bias_synth);
381 	prepro_setting = config_setting_add(prepro_group, "use_bias_synth", CONFIG_TYPE_BOOL);
382 	config_setting_set_bool(prepro_setting, com.pref.use_bias_synth);
383 
384 	prepro_setting = config_setting_add(prepro_group, "dark_lib", CONFIG_TYPE_STRING);
385 	config_setting_set_string(prepro_setting, com.pref.prepro_dark_lib);
386 	prepro_setting = config_setting_add(prepro_group, "use_dark_lib", CONFIG_TYPE_BOOL);
387 	config_setting_set_bool(prepro_setting, com.pref.use_dark_lib);
388 
389 	prepro_setting = config_setting_add(prepro_group, "flat_lib", CONFIG_TYPE_STRING);
390 	config_setting_set_string(prepro_setting, com.pref.prepro_flat_lib);
391 	prepro_setting = config_setting_add(prepro_group, "use_flat_lib", CONFIG_TYPE_BOOL);
392 	config_setting_set_bool(prepro_setting, com.pref.use_flat_lib);
393 }
394 
_save_registration(config_t * config,config_setting_t * root)395 static void _save_registration(config_t *config, config_setting_t *root) {
396 	config_setting_t *reg_group, *reg_setting;
397 
398 	reg_group = config_setting_add(root, keywords[REG], CONFIG_TYPE_GROUP);
399 
400 	reg_setting = config_setting_add(reg_group, "method", CONFIG_TYPE_INT);
401 	config_setting_set_int(reg_setting, com.reg_settings);
402 }
403 
_save_stacking(config_t * config,config_setting_t * root)404 static void _save_stacking(config_t *config, config_setting_t *root) {
405 	config_setting_t *stk_group, *stk_setting;
406 
407 	stk_group = config_setting_add(root, keywords[STK], CONFIG_TYPE_GROUP);
408 
409 	stk_setting = config_setting_add(stk_group, "method", CONFIG_TYPE_INT);
410 	config_setting_set_int(stk_setting, com.pref.stack.method);
411 
412 	stk_setting = config_setting_add(stk_group, "rejection", CONFIG_TYPE_INT);
413 	config_setting_set_int(stk_setting, com.pref.stack.rej_method);
414 
415 	stk_setting = config_setting_add(stk_group, "sigma_low", CONFIG_TYPE_FLOAT);
416 	config_setting_set_float(stk_setting, com.pref.stack.sigma_low);
417 
418 	stk_setting = config_setting_add(stk_group, "sigma_high", CONFIG_TYPE_FLOAT);
419 	config_setting_set_float(stk_setting, com.pref.stack.sigma_high);
420 
421 	stk_setting = config_setting_add(stk_group, "linear_low", CONFIG_TYPE_FLOAT);
422 	config_setting_set_float(stk_setting, com.pref.stack.linear_low);
423 
424 	stk_setting = config_setting_add(stk_group, "linear_high", CONFIG_TYPE_FLOAT);
425 	config_setting_set_float(stk_setting, com.pref.stack.linear_high);
426 
427 	stk_setting = config_setting_add(stk_group, "percentile_low", CONFIG_TYPE_FLOAT);
428 	config_setting_set_float(stk_setting, com.pref.stack.percentile_low);
429 
430 	stk_setting = config_setting_add(stk_group, "percentile_high", CONFIG_TYPE_FLOAT);
431 	config_setting_set_float(stk_setting, com.pref.stack.percentile_high);
432 
433 	stk_setting = config_setting_add(stk_group, "mem_mode", CONFIG_TYPE_INT);
434 	config_setting_set_int(stk_setting, com.pref.stack.mem_mode);
435 
436 	stk_setting = config_setting_add(stk_group, "maxmem", CONFIG_TYPE_FLOAT);
437 	config_setting_set_float(stk_setting, com.pref.stack.memory_ratio);
438 
439 	stk_setting = config_setting_add(stk_group, "maxmem_gb", CONFIG_TYPE_FLOAT);
440 	config_setting_set_float(stk_setting, com.pref.stack.memory_amount);
441 }
442 
_save_comp(config_t * config,config_setting_t * root)443 static void _save_comp(config_t *config, config_setting_t *root) {
444 	config_setting_t *cmp_group, *cmp_setting;
445 
446 	cmp_group = config_setting_add(root, keywords[CMP], CONFIG_TYPE_GROUP);
447 
448 	cmp_setting = config_setting_add(cmp_group, "compress_enabled", CONFIG_TYPE_BOOL);
449 	config_setting_set_bool(cmp_setting, com.pref.comp.fits_enabled);
450 
451 	cmp_setting = config_setting_add(cmp_group, "compress_method", CONFIG_TYPE_INT);
452 	config_setting_set_int(cmp_setting, com.pref.comp.fits_method);
453 
454 	cmp_setting = config_setting_add(cmp_group, "compress_quantization", CONFIG_TYPE_FLOAT);
455 	config_setting_set_float(cmp_setting, com.pref.comp.fits_quantization);
456 
457 	cmp_setting = config_setting_add(cmp_group, "compress_hcompress_scale", CONFIG_TYPE_FLOAT);
458 	config_setting_set_float(cmp_setting, com.pref.comp.fits_hcompress_scale);
459 
460 }
461 
_save_astrometry(config_t * config,config_setting_t * root)462 static void _save_astrometry(config_t *config, config_setting_t *root) {
463 	config_setting_t *astrometry_group, *astrometry_setting;
464 
465 	astrometry_group = config_setting_add(root, keywords[AST], CONFIG_TYPE_GROUP);
466 
467 	astrometry_setting = config_setting_add(astrometry_group, "messier", CONFIG_TYPE_BOOL);
468 	config_setting_set_bool(astrometry_setting, com.pref.catalog[0]);
469 	astrometry_setting = config_setting_add(astrometry_group, "ngc", CONFIG_TYPE_BOOL);
470 	config_setting_set_bool(astrometry_setting, com.pref.catalog[1]);
471 	astrometry_setting = config_setting_add(astrometry_group, "ic", CONFIG_TYPE_BOOL);
472 	config_setting_set_bool(astrometry_setting, com.pref.catalog[2]);
473 	astrometry_setting = config_setting_add(astrometry_group, "ldn", CONFIG_TYPE_BOOL);
474 	config_setting_set_bool(astrometry_setting, com.pref.catalog[3]);
475 	astrometry_setting = config_setting_add(astrometry_group, "sh2", CONFIG_TYPE_BOOL);
476 	config_setting_set_bool(astrometry_setting, com.pref.catalog[4]);
477 	astrometry_setting = config_setting_add(astrometry_group, "stars", CONFIG_TYPE_BOOL);
478 	config_setting_set_bool(astrometry_setting, com.pref.catalog[5]);
479 }
480 
_save_photometry(config_t * config,config_setting_t * root)481 static void _save_photometry(config_t *config, config_setting_t *root) {
482 	config_setting_t *photometry_group, *photometry_setting;
483 
484 	photometry_group = config_setting_add(root, keywords[PTM], CONFIG_TYPE_GROUP);
485 
486 	photometry_setting = config_setting_add(photometry_group, "gain", CONFIG_TYPE_FLOAT);
487 	config_setting_set_float(photometry_setting, com.pref.phot_set.gain);
488 	photometry_setting = config_setting_add(photometry_group, "inner-radius", CONFIG_TYPE_FLOAT);
489 	config_setting_set_float(photometry_setting, com.pref.phot_set.inner);
490 	photometry_setting = config_setting_add(photometry_group, "outer-radius", CONFIG_TYPE_FLOAT);
491 	config_setting_set_float(photometry_setting, com.pref.phot_set.outer);
492 	photometry_setting = config_setting_add(photometry_group, "minval", CONFIG_TYPE_INT);
493 	config_setting_set_int(photometry_setting, com.pref.phot_set.minval);
494 	photometry_setting = config_setting_add(photometry_group, "maxval", CONFIG_TYPE_INT);
495 	config_setting_set_int(photometry_setting, com.pref.phot_set.maxval);
496 }
497 
_save_misc(config_t * config,config_setting_t * root)498 static void _save_misc(config_t *config, config_setting_t *root) {
499 	config_setting_t *misc_group, *misc_setting;
500 	GSList *list = com.pref.script_path;
501 
502 	misc_group = config_setting_add(root, keywords[MISC], CONFIG_TYPE_GROUP);
503 
504 	misc_setting = config_setting_add(misc_group, "swap_directory", CONFIG_TYPE_STRING);
505 	config_setting_set_string(misc_setting, com.pref.swap_dir);
506 
507 	misc_setting = config_setting_add(misc_group, "first_start_0_99_8", CONFIG_TYPE_BOOL);
508 	config_setting_set_bool(misc_setting, com.pref.first_start);
509 
510 	misc_setting = config_setting_add(misc_group, "extension", CONFIG_TYPE_STRING);
511 	config_setting_set_string(misc_setting, com.pref.ext);
512 
513 	misc_setting = config_setting_add(misc_group, "FITS_type", CONFIG_TYPE_INT);
514 	config_setting_set_int(misc_setting, com.pref.force_to_16bit ? 0 : 1);
515 
516 	misc_setting = config_setting_add(misc_group, "selection_guides", CONFIG_TYPE_INT);
517 	config_setting_set_int(misc_setting, com.pref.selection_guides);
518 
519 	misc_setting = config_setting_add(misc_group, "copyright", CONFIG_TYPE_STRING);
520 	config_setting_set_string(misc_setting, com.pref.copyright);
521 
522 	misc_setting = config_setting_add(misc_group, "confirm_quit", CONFIG_TYPE_BOOL);
523 	config_setting_set_bool(misc_setting, com.pref.save.quit);
524 
525 	misc_setting = config_setting_add(misc_group, "scripts_warning", CONFIG_TYPE_BOOL);
526 	config_setting_set_bool(misc_setting, com.pref.save.warn_script);
527 
528 	misc_setting = config_setting_add(misc_group, "check_requires", CONFIG_TYPE_BOOL);
529 	config_setting_set_bool(misc_setting, com.pref.script_check_requires);
530 
531 	misc_setting = config_setting_add(misc_group, "show_thumbnails", CONFIG_TYPE_BOOL);
532 	config_setting_set_bool(misc_setting, com.pref.show_thumbnails);
533 
534 	misc_setting = config_setting_add(misc_group, "thumbnail_size", CONFIG_TYPE_INT);
535 	config_setting_set_int(misc_setting, com.pref.thumbnail_size);
536 
537 	misc_setting = config_setting_add(misc_group, "theme", CONFIG_TYPE_INT);
538 	config_setting_set_int(misc_setting, com.pref.combo_theme);
539 
540 	misc_setting = config_setting_add(misc_group, "font_scale", CONFIG_TYPE_FLOAT);
541 	config_setting_set_float(misc_setting, com.pref.font_scale);
542 
543 	misc_setting = config_setting_add(misc_group, "icon_symbolic", CONFIG_TYPE_BOOL);
544 	config_setting_set_bool(misc_setting, com.pref.icon_symbolic);
545 
546 	misc_setting = config_setting_add(misc_group, "rgb_aladin", CONFIG_TYPE_BOOL);
547 	config_setting_set_bool(misc_setting, com.pref.rgb_aladin);
548 
549 	misc_setting = config_setting_add(misc_group, "lang", CONFIG_TYPE_STRING);
550 	config_setting_set_string(misc_setting, com.pref.combo_lang);
551 
552 	misc_setting = config_setting_add(misc_group, "remember_winpos", CONFIG_TYPE_BOOL);
553 	config_setting_set_bool(misc_setting, com.pref.remember_windows);
554 
555 	misc_setting = config_setting_add(misc_group, "focal", CONFIG_TYPE_FLOAT);
556 	config_setting_set_float(misc_setting, com.pref.focal);
557 
558 	misc_setting = config_setting_add(misc_group, "pitch", CONFIG_TYPE_FLOAT);
559 	config_setting_set_float(misc_setting, com.pref.pitch);
560 
561 
562 	misc_setting = config_setting_add(misc_group, "scripts_paths", CONFIG_TYPE_LIST);
563 	while (list) {
564 		config_setting_set_string_elem(misc_setting, -1, (char *)list->data);
565 		list = list->next;
566 	}
567 	misc_setting = config_setting_add(misc_group, "main_w_pos",	CONFIG_TYPE_LIST);
568 	config_setting_set_int_elem(misc_setting, -1, com.pref.main_w_pos.x);
569 	config_setting_set_int_elem(misc_setting, -1, com.pref.main_w_pos.y);
570 	config_setting_set_int_elem(misc_setting, -1, com.pref.main_w_pos.w);
571 	config_setting_set_int_elem(misc_setting, -1, com.pref.main_w_pos.h);
572 
573 	misc_setting = config_setting_add(misc_group, "is_maximized", CONFIG_TYPE_BOOL);
574 	config_setting_set_bool(misc_setting, com.pref.is_maximized);
575 
576 	misc_setting = config_setting_add(misc_group, "check_update_at_startup", CONFIG_TYPE_BOOL);
577 	config_setting_set_bool(misc_setting, com.pref.check_update);
578 }
579 
siril_config_write_file(config_t * config,const char * filename)580 static int siril_config_write_file(config_t *config, const char *filename) {
581 	gchar *fname = get_locale_filename(filename);
582 	int ret = config_write_file(config, fname);
583 	g_free(fname);
584 	return ret;
585 }
586 
587 /**
588  * Public functions
589  */
590 
writeinitfile()591 int writeinitfile() {
592 	config_t config;
593 	config_setting_t *root;
594 
595 	config_init(&config);
596 	root = config_root_setting(&config);
597 
598 	_save_wd(&config, root);
599 	_save_libraw(&config, root);
600 	_save_debayer(&config, root);
601 	_save_preprocessing(&config, root);
602 	_save_registration(&config, root);
603 	_save_stacking(&config, root);
604 	_save_comp(&config, root);
605 	_save_astrometry(&config, root);
606 	_save_photometry(&config, root);
607 	_save_misc(&config, root);
608 
609 	if (!siril_config_write_file(&config, com.initfile)) {
610 		fprintf(stderr, "Error while writing file.\n");
611 		config_destroy(&config);
612 		return 1;
613 	}
614 	config_destroy(&config);
615 	return 0;
616 }
617 
checkinitfile()618 int checkinitfile() {
619 	/* First we try to read the file given on command line */
620 	if (!readinitfile()) {
621 		return 0;
622 	}
623 	/* no file given on command line, set initfile to default location */
624 	gchar *pathname = g_build_filename(siril_get_config_dir(), PACKAGE, NULL);
625 	gchar *config_file = g_build_filename(pathname, CONFIG_FILE, NULL);
626 	if (!g_file_test(config_file, G_FILE_TEST_EXISTS)) {
627 		if (g_mkdir_with_parents(pathname, 0755) == 0) {
628 			g_fprintf(stderr, "Created config dir %s\n", pathname);
629 		} else {
630 			g_fprintf(stderr, "Failed to create config dir %s!\n", pathname);
631 			g_free(pathname);
632 			return 1;
633 		}
634 	}
635 	g_free(pathname);
636 
637 	com.initfile = config_file;
638 
639 	if (readinitfile()) {
640 		/* init file does not exist, so we create it */
641 		initialize_default_preferences();
642 		com.wd = g_strdup(siril_get_startup_dir());
643 		return writeinitfile();
644 	}
645 	return 0;
646 }
647