src/settings-manager.h File Reference

Header for the settings_t structure and the settings loading and saving functions. More...

#include "data-types.h"
Include dependency graph for settings-manager.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  settings_t
 Data structure storing various application settings. More...

Functions

settings_tsettings_load (const gchar *, const gchar *)
 Loads the application settings, by trying to read a settings file.
gint settings_save (settings_t *)
 Saves the application settings into a file in the user's configuration directory.
void settings_dialog_show (GtkToolButton *addbutton, gpointer user_data)

Detailed Description

Header for the settings_t structure and the settings loading and saving functions.

Author:
Steve Dodier <sidnioulz@gmail.com>

This file contains the settings_t structure and the settings loading and saving functions.

Definition in file settings-manager.h.


Function Documentation

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.

Parameters:
[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
Returns:
the application's settings

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.

Parameters:
[in] settings the settings to save
Returns:
0 if the file was actually saved, -1 on error

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 }

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines

Generated on Tue Jan 12 00:48:45 2010 for ENSIBSynema by  doxygen 1.6.1