Source code for the settings_t structure and the settings loading and saving functions. More...
#include <gio/gio.h>
#include "application-data.h"
#include "frame-actions.h"
#include "settings-manager.h"
Go to the source code of this file.
Functions | |
settings_t * | settings_load (const gchar *config_dir, const gchar *data_dir) |
Loads the application settings, by trying to read a settings file. | |
gint | settings_save (settings_t *settings) |
Saves the application settings into a file in the user's configuration directory. | |
void | settings_dialog_show (GtkToolButton *addbutton, gpointer user_data) |
Source code for the settings_t structure and the settings loading and saving functions.
This file contains the code for the settings loading and saving functions.
Definition in file settings-manager.c.
void settings_dialog_show | ( | GtkToolButton * | addbutton, | |
gpointer | user_data | |||
) |
Definition at line 261 of file settings-manager.c.
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 // Add a new settings dialog to the builder 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 // Setting the dialog widgets' values accordingly to the current state of the settings 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 // Connect each setting widget to its handler 00323 // Frame automatic saving 00324 g_signal_connect (save_frames, "toggled", G_CALLBACK (settings_autosave_frames_toggled), NULL); 00325 00326 // Refresh frequency 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 // Unhandled machine on frame action 00331 g_signal_connect (am_nothing, "toggled", G_CALLBACK (settings_act_machine_radio_toggled), NULL); 00332 00333 // Unhandled period on frame action - got to connect to all but one radio buttons to get all the toggled signals 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 // Getting the dialog to display 00340 dialog = (GtkWidget *) gtk_builder_get_object (inst->builder, "settings_dialog"); 00341 00342 00343 // We can destroy the dialog after it's been run, any widget handler will change the settings immediately so there is nothing to save 00344 gtk_dialog_run (GTK_DIALOG (dialog)); 00345 gtk_widget_destroy (dialog); 00346 }
settings_t * settings_load | ( | const gchar * | config_dir, | |
const gchar * | data_dir | |||
) |
Loads the application settings, by trying to read a settings file.
This function tries to read settings from a settings file in config_dir (and in data_dir if there is no file in config_dir), and if there is no settings file, it loads default hardcoded settings.
[in] | config_dir | the user's configuration directory where to look for the file |
[in] | data_dir | the application's data directory where to look for a default file |
Definition at line 69 of file settings-manager.c.
00070 { 00071 GError *err = NULL; 00072 GKeyFile *keyfile = g_key_file_new (); 00073 settings_t *settings = NULL; 00074 00075 // Allocate a settings_t struct 00076 settings = g_malloc (sizeof (settings_t)); 00077 00078 // If a configuration file has been found and loaded 00079 if (settings_load_key_file (keyfile, config_dir, data_dir)) { 00080 // Refresh frequency 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 // Frames automatic saving 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 // Tab to set as current when frames saving is enabled 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 // Frame actions: what to do on unhandled machine 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 // Frame actions: what to do on unhandled time period 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 // No conf file loaded, using default settings 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 }
gint settings_save | ( | settings_t * | settings | ) |
Saves the application settings into a file in the user's configuration directory.
This function saves the application settings into a file in the user's configuration directory.
[in] | settings | the settings to save |
Definition at line 142 of file settings-manager.c.
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 // We load the current settings file if there is one so the user comments in the file are saved 00154 settings_load_key_file (keyfile, inst->config_dir, inst->data_dir); 00155 00156 // Save settings into the KeyFile 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 // Turn the KeyFile into raw data 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 // Write the data to a file via an OutputStream 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 }