00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00026 #include <gio/gio.h>
00027
00028 #include "application-data.h"
00029 #include "frame-actions.h"
00030 #include "settings-manager.h"
00031
00032
00033
00034 static gboolean settings_load_key_file (GKeyFile *keyfile, const gchar *config_dir, const gchar *data_dir)
00035 {
00036 char *path = NULL;
00037 int file_loaded = 0;
00038 GError *err = NULL;
00039
00040
00041 path = g_strdup_printf ("%s/"APP_CONF_FILE, config_dir);
00042 g_key_file_load_from_file (keyfile, path, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &err);
00043 g_free (path);
00044
00045 if (err == NULL) {
00046 file_loaded = 1;
00047 }
00048
00049 else {
00050 g_clear_error (&err);
00051
00052 path = g_strdup_printf ("%s/"APP_CONF_FILE, data_dir);
00053 g_key_file_load_from_file (keyfile, path, G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS, &err);
00054 g_free (path);
00055
00056 if (err == NULL) {
00057 file_loaded = 2;
00058 } else {
00059 g_warning ("settings_load_from_file: %s", err->message);
00060 g_clear_error (&err);
00061 }
00062 }
00063
00064 return file_loaded;
00065 }
00066
00067
00068
00069 settings_t *settings_load (const gchar *config_dir, const gchar *data_dir)
00070 {
00071 GError *err = NULL;
00072 GKeyFile *keyfile = g_key_file_new ();
00073 settings_t *settings = NULL;
00074
00075
00076 settings = g_malloc (sizeof (settings_t));
00077
00078
00079 if (settings_load_key_file (keyfile, config_dir, data_dir)) {
00080
00081 settings->refresh_freq = g_key_file_get_integer (keyfile,
00082 SETTINGS_GROUP_FRAMES, SETTINGS_REFRESH_FREQ_NAME, &err);
00083 if (err) {
00084 g_warning ("settings_load_from_file: Error while getting refresh frequency (%s)", err->message);
00085 settings->refresh_freq = SETTINGS_REFRESH_FREQ_DEFAULT;
00086 g_clear_error (&err);
00087 }
00088
00089
00090 settings->autosave_frames = g_key_file_get_boolean (keyfile,
00091 SETTINGS_GROUP_FRAME_TABLES, SETTINGS_AUTOSAVE_FRAMES_NAME, &err);
00092 if (err) {
00093 g_warning ("settings_load_from_file: Error while checking for frame automatic saving (%s)", err->message);
00094 settings->autosave_frames = SETTINGS_AUTOSAVE_FRAMES_DEFAULT;
00095 g_clear_error (&err);
00096 }
00097
00098
00099 settings->last_current_tab = g_key_file_get_integer (keyfile,
00100 SETTINGS_GROUP_FRAME_TABLES, SETTINGS_LAST_CURRENT_TAB_NAME, &err);
00101 if (err) {
00102 g_warning ("settings_load_from_file: Error while getting the last current tab (%s)", err->message);
00103 settings->last_current_tab = SETTINGS_LAST_CURRENT_TAB_DEFAULT;
00104 g_clear_error (&err);
00105 }
00106
00107
00108 settings->unhandled_action_machine = g_key_file_get_integer (keyfile,
00109 SETTINGS_GROUP_FRAME_ACTIONS, SETTINGS_ACTION_SET_MACHINE_NAME, &err);
00110 if (err) {
00111 g_warning ("settings_load_from_file: Error while checking what to do on unhandled machine in a frame action (%s)", err->message);
00112 settings->unhandled_action_machine = SETTINGS_ACTION_SET_MACHINE_DEFAULT;
00113 g_clear_error (&err);
00114 }
00115
00116
00117 settings->unhandled_action_period = g_key_file_get_integer (keyfile,
00118 SETTINGS_GROUP_FRAME_ACTIONS, SETTINGS_ACTION_SET_PERIOD_NAME, &err);
00119 if (err) {
00120 g_warning ("settings_load_from_file: Error while checking what to do on unhandled period in a frame action (%s)", err->message);
00121 settings->unhandled_action_period = SETTINGS_ACTION_SET_PERIOD_DEFAULT;
00122 g_clear_error (&err);
00123 }
00124
00125 }
00126
00127 else {
00128 g_warning ("settings_load_from_file: No settings file found, returning default hardcoded settings.");
00129 settings->refresh_freq = SETTINGS_REFRESH_FREQ_DEFAULT;
00130 settings->autosave_frames = SETTINGS_AUTOSAVE_FRAMES_DEFAULT;
00131 settings->last_current_tab = SETTINGS_LAST_CURRENT_TAB_DEFAULT;
00132 settings->unhandled_action_machine = SETTINGS_ACTION_SET_MACHINE_DEFAULT;
00133 settings->unhandled_action_period = SETTINGS_ACTION_SET_PERIOD_DEFAULT;
00134 }
00135
00136 g_key_file_free (keyfile);
00137 return settings;
00138 }
00139
00140
00141
00142 gint settings_save (settings_t *settings)
00143 {
00144 synema_instance_t *inst = synema_instance ();
00145 gchar *path = NULL;
00146 gchar *buffer = NULL;
00147 GError *err = NULL;
00148 GFile *file = NULL;
00149 GFileOutputStream *stream = NULL;
00150 GKeyFile *keyfile = g_key_file_new ();
00151 gsize buff_len = 0;
00152
00153
00154 settings_load_key_file (keyfile, inst->config_dir, inst->data_dir);
00155
00156
00157 g_key_file_set_integer (keyfile, SETTINGS_GROUP_FRAMES, SETTINGS_REFRESH_FREQ_NAME, settings->refresh_freq);
00158 g_key_file_set_boolean (keyfile, SETTINGS_GROUP_FRAME_TABLES, SETTINGS_AUTOSAVE_FRAMES_NAME, settings->autosave_frames);
00159 g_key_file_set_integer (keyfile, SETTINGS_GROUP_FRAME_TABLES, SETTINGS_LAST_CURRENT_TAB_NAME, settings->last_current_tab);
00160 g_key_file_set_integer (keyfile, SETTINGS_GROUP_FRAME_ACTIONS, SETTINGS_ACTION_SET_MACHINE_NAME, settings->unhandled_action_machine);
00161 g_key_file_set_integer (keyfile, SETTINGS_GROUP_FRAME_ACTIONS, SETTINGS_ACTION_SET_PERIOD_NAME, settings->unhandled_action_period);
00162
00163
00164 buffer = g_key_file_to_data (keyfile, &buff_len, &err);
00165 g_key_file_free (keyfile);
00166 if (err) {
00167 g_warning ("settings_save: %s", err->message);
00168 g_clear_error (&err);
00169 return -1;
00170 }
00171
00172
00173 path = g_strdup_printf ("%s/"APP_CONF_FILE, inst->config_dir);
00174 file = g_file_new_for_path (path);
00175 g_free (path);
00176
00177 stream = g_file_replace (file, NULL, TRUE, G_FILE_CREATE_NONE, NULL, &err);
00178 if (err) {
00179 g_warning ("settings_save: %s", err->message);
00180 g_clear_error (&err);
00181 g_free (buffer);
00182 g_object_unref (file);
00183 return -1;
00184 }
00185
00186 if (g_output_stream_write (G_OUTPUT_STREAM (stream), buffer, buff_len, NULL, &err) == -1) {
00187 g_warning ("settings_save: %s", err->message);
00188 g_clear_error (&err);
00189 g_free (buffer);
00190 g_object_unref (stream);
00191 g_object_unref (file);
00192 return -1;
00193 }
00194
00195 g_free (buffer);
00196 g_object_unref (stream);
00197 g_object_unref (file);
00198 return 0;
00199 }
00200
00201
00202
00203 static void settings_autosave_frames_toggled (GtkToggleButton *togglebutton, gpointer user_data)
00204 {
00205 synema_instance_t *inst = synema_instance ();
00206 inst->settings->autosave_frames = gtk_toggle_button_get_active (togglebutton);
00207 }
00208
00209
00210
00211 static void settings_act_machine_radio_toggled (GtkToggleButton *togglebutton, gpointer user_data)
00212 {
00213 synema_instance_t *inst = synema_instance ();
00214
00215
00216 if (gtk_toggle_button_get_active (togglebutton)) {
00217 inst->settings->unhandled_action_machine = UA_DO_NOTHING;
00218 } else {
00219 inst->settings->unhandled_action_machine = UA_ERROR_MESSAGE;
00220 }
00221 }
00222
00223
00224
00225 static void settings_act_period_radio_toggled (GtkToggleButton *togglebutton, gpointer user_data)
00226 {
00227 synema_instance_t *inst = synema_instance ();
00228
00229 if (gtk_toggle_button_get_active (togglebutton)) {
00230 inst->settings->unhandled_action_period = UA_DO_NOTHING;
00231 } else if (gtk_toggle_button_get_active (user_data)) {
00232 inst->settings->unhandled_action_period = UA_ERROR_MESSAGE;
00233 } else {
00234 inst->settings->unhandled_action_period = UA_TRY_NEAREST;
00235 }
00236 }
00237
00238
00239
00240 static void settings_auto_freq_radio_toggled (GtkToggleButton *togglebutton, gpointer user_data)
00241 {
00242 synema_instance_t *inst = synema_instance ();
00243 if (gtk_toggle_button_get_active (togglebutton)) {
00244 inst->settings->refresh_freq = REFRESH_FREQ_AUTO;
00245 } else {
00246 inst->settings->refresh_freq = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (user_data));
00247 }
00248 }
00249
00250
00251
00252 static void settings_fixed_freq_spin_changed (GtkSpinButton *spinbutton, gpointer user_data)
00253 {
00254 synema_instance_t *inst = synema_instance ();
00255 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gtk_builder_get_object (inst->builder, "settings_fixed_freq_radio")), TRUE);
00256 inst->settings->refresh_freq = gtk_spin_button_get_value_as_int (spinbutton);
00257 }
00258
00259
00260
00261 void settings_dialog_show (GtkToolButton *addbutton, gpointer user_data)
00262 {
00263 synema_instance_t *inst = synema_instance ();
00264 gchar *dlg_objects[] = {"settings_dialog", "settingsfreqadjustment", NULL};
00265 gchar *path = NULL;
00266 GError *err = NULL;
00267
00268
00269
00270 path = g_strdup_printf ("%s/window.ui", inst->data_dir);
00271 gtk_builder_add_objects_from_file (inst->builder, path, dlg_objects, &err);
00272 g_free (path);
00273 if (err) {
00274 g_warning ("settings_dialog_show: %s", err->message);
00275 g_clear_error (&err);
00276 return;
00277 }
00278
00279
00280 GtkWidget *am_nothing = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_act_machine_nothing");
00281 GtkWidget *am_errmsg = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_act_machine_errmsg");
00282 GtkWidget *ap_nothing = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_act_period_nothing");
00283 GtkWidget *ap_errmsg = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_act_period_errmsg");
00284 GtkWidget *ap_nearest = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_act_period_nearest");
00285 GtkWidget *auto_freq = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_auto_freq_radio");
00286 GtkWidget *dialog = NULL;
00287 GtkWidget *fixed_freq = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_fixed_freq_radio");
00288 GtkWidget *freq_spin = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_fixed_freq_spin");
00289 GtkWidget *save_frames = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_autosave_frames");
00290
00291
00292
00293 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (save_frames),
00294 inst->settings->autosave_frames);
00295
00296 if (inst->settings->refresh_freq == REFRESH_FREQ_AUTO)
00297 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (auto_freq), TRUE);
00298 else
00299 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fixed_freq), TRUE);
00300
00301 gtk_spin_button_set_value (GTK_SPIN_BUTTON (freq_spin),
00302 ((inst->settings->refresh_freq > SETTINGS_REFRESH_FREQ_MIN) &&
00303 (inst->settings->refresh_freq < SETTINGS_REFRESH_FREQ_MAX)) ?
00304 inst->settings->refresh_freq : SETTINGS_REFRESH_FREQ_DEFAULT);
00305 gtk_spin_button_update (GTK_SPIN_BUTTON (freq_spin));
00306
00307 if (inst->settings->unhandled_action_machine == UA_DO_NOTHING)
00308 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (am_nothing), TRUE);
00309 else
00310 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (am_errmsg), TRUE);
00311
00312
00313 if (inst->settings->unhandled_action_period == UA_DO_NOTHING)
00314 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ap_nothing), TRUE);
00315 else if (inst->settings->unhandled_action_period == UA_ERROR_MESSAGE)
00316 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ap_errmsg), TRUE);
00317 else
00318 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ap_nearest), TRUE);
00319
00320
00321
00322
00323
00324 g_signal_connect (save_frames, "toggled", G_CALLBACK (settings_autosave_frames_toggled), NULL);
00325
00326
00327 g_signal_connect (auto_freq, "toggled", G_CALLBACK (settings_auto_freq_radio_toggled), freq_spin);
00328 g_signal_connect (freq_spin, "value-changed", G_CALLBACK (settings_fixed_freq_spin_changed), fixed_freq);
00329
00330
00331 g_signal_connect (am_nothing, "toggled", G_CALLBACK (settings_act_machine_radio_toggled), NULL);
00332
00333
00334 g_signal_connect (ap_nothing, "toggled", G_CALLBACK (settings_act_period_radio_toggled), ap_errmsg);
00335 g_signal_connect_swapped (ap_errmsg, "toggled", G_CALLBACK (settings_act_period_radio_toggled), GTK_TOGGLE_BUTTON (ap_nothing));
00336
00337
00338
00339
00340 dialog = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_dialog");
00341
00342
00343
00344 gtk_dialog_run (GTK_DIALOG (dialog));
00345 gtk_widget_destroy (dialog);
00346 }