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", ©right);
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