aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-01 16:21:20 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-06-01 16:21:20 +0200
commit54f75db1b82cc5a81c98ed722b3a60c38645919d (patch)
tree993dfd37880816e663554bb7dac08c5b9e5af145 /src
parent12541e8b3bd3f7296f6289cadd4e550832556a27 (diff)
downloadexperiment-player-54f75db1b82cc5a81c98ed722b3a60c38645919d.tar.gz
support for configuration files
* currently it saves the quick-open and format-selection directories
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/config.c74
-rw-r--r--src/experiment-player.h28
-rw-r--r--src/format-selection.c18
-rw-r--r--src/main.c7
-rw-r--r--src/quick-open.c15
6 files changed, 129 insertions, 16 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 0a0c32a..6f0d771 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,8 @@
AM_CFLAGS = -Wall
bin_PROGRAMS = experiment-player
-experiment_player_SOURCES = main.c quick-open.c format-selection.c \
+experiment_player_SOURCES = main.c config.c \
+ quick-open.c format-selection.c \
experiment-player.h
experiment_player_CFLAGS = $(AM_CFLAGS)
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 0000000..1dedf79
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,74 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+
+#include <glib.h>
+#include <glib/gprintf.h>
+#include <glib/gstdio.h>
+
+#include "experiment-player.h"
+
+static GKeyFile *keyfile;
+static gchar *filename = NULL;
+
+void
+config_init_key_file(void)
+{
+ keyfile = g_key_file_new();
+
+ /* initialize defaults */
+ config_set_quickopen_directory(DEFAULT_QUICKOPEN_DIR);
+ config_set_formats_directory(DEFAULT_FORMATS_DIR);
+
+ /* may fail if no serialized configuration exists */
+ g_key_file_load_from_data_dirs(keyfile, CONFIG_KEY_FILE, &filename,
+ G_KEY_FILE_KEEP_COMMENTS, NULL);
+
+ if (filename == NULL)
+ filename = g_build_filename(g_get_user_data_dir(),
+ CONFIG_KEY_FILE, NULL);
+}
+
+void
+config_set_quickopen_directory(const gchar *dir)
+{
+ g_key_file_set_string(keyfile, "Directories", "Quick-Open", dir);
+}
+
+gchar *
+config_get_quickopen_directory(void)
+{
+ return g_key_file_get_string(keyfile, "Directories", "Quick-Open", NULL);
+}
+
+void
+config_set_formats_directory(const gchar *dir)
+{
+ g_key_file_set_string(keyfile, "Directories", "Formats", dir);
+}
+
+gchar *
+config_get_formats_directory(void)
+{
+ return g_key_file_get_string(keyfile, "Directories", "Formats", NULL);
+}
+
+void
+config_save_key_file(void)
+{
+ gchar *data;
+ gsize length;
+ FILE *file;
+
+ data = g_key_file_to_data(keyfile, &length, NULL);
+
+ file = g_fopen(filename, "w");
+ if (file != NULL) {
+ fwrite(data, (size_t)length, 1, file);
+ fclose(file);
+ }
+
+ g_free(data);
+}
diff --git a/src/experiment-player.h b/src/experiment-player.h
index 018cabd..5750904 100644
--- a/src/experiment-player.h
+++ b/src/experiment-player.h
@@ -6,6 +6,9 @@
#include <gtk/gtk.h>
+/*
+ * main.c
+ */
gboolean load_media_file(const gchar *file);
gboolean load_transcript_file(const gchar *file);
@@ -27,20 +30,39 @@ extern GtkWidget *navigator_scrolledwindow,
extern gchar *current_filename;
+/*
+ * config.c
+ */
+void config_init_key_file(void);
+
+void config_set_quickopen_directory(const gchar *dir);
+gchar *config_get_quickopen_directory(void);
+void config_set_formats_directory(const gchar *dir);
+gchar *config_get_formats_directory(void);
+
+void config_save_key_file(void);
+
+/*
+ * quick-open.c
+ */
void refresh_quickopen_menu(GtkMenu *menu);
extern GtkWidget *quickopen_menu,
*quickopen_menu_empty_item;
-extern gchar *quickopen_directory;
-
-void format_selection_init(const gchar *dir);
+/*
+ * format-selection.c
+ */
+void format_selection_init(void);
extern GtkWidget *transcript_wizard_combo,
*transcript_proband_combo,
*transcript_wizard_entry_check,
*transcript_proband_entry_check;
+/*
+ * macros and inline functions
+ */
#define BUILDER_INIT(BUILDER, VAR) do { \
VAR = GTK_WIDGET(gtk_builder_get_object(BUILDER, #VAR)); \
} while (0)
diff --git a/src/format-selection.c b/src/format-selection.c
index 2e14028..8fb04df 100644
--- a/src/format-selection.c
+++ b/src/format-selection.c
@@ -21,8 +21,6 @@ GtkWidget *transcript_wizard_combo,
*transcript_wizard_entry_check,
*transcript_proband_entry_check;
-static gchar *formats_directory;
-
enum {
COL_NAME,
COL_FILENAME,
@@ -42,19 +40,24 @@ formats_menu_choosedir_item_activate_cb(GtkWidget *widget,
gtk_combo_box_get_model(GTK_COMBO_BOX(transcript_wizard_combo));
GtkWidget *dialog;
+ gchar *formats_directory;
dialog = gtk_file_chooser_dialog_new("Choose Directory...", GTK_WINDOW(widget),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
+
+ formats_directory = config_get_formats_directory();
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
formats_directory);
+ g_free(formats_directory);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
- g_free(formats_directory);
formats_directory =
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+ config_set_formats_directory(formats_directory);
+ g_free(formats_directory);
refresh_formats_store(GTK_LIST_STORE(model));
}
@@ -145,12 +148,13 @@ refresh_formats_store(GtkListStore *store)
gchar *wizard_filename = NULL;
gchar *proband_filename = NULL;
+ gchar *formats_directory;
GDir *dir;
const gchar *name;
GtkTreeIter iter;
if (pattern == NULL)
- pattern = g_pattern_spec_new(EXPERIMENT_FORMAT_FILTER);
+ pattern = g_pattern_spec_new(EXPERIMENT_FORMATS_FILTER);
if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(transcript_wizard_combo),
&iter))
@@ -165,6 +169,7 @@ refresh_formats_store(GtkListStore *store)
/* add null-entry */
gtk_list_store_append(store, &iter);
+ formats_directory = config_get_formats_directory();
dir = g_dir_open(formats_directory, 0, NULL);
while ((name = g_dir_read_name(dir)) != NULL) {
@@ -194,19 +199,18 @@ refresh_formats_store(GtkListStore *store)
}
g_dir_close(dir);
+ g_free(formats_directory);
g_free(proband_filename);
g_free(wizard_filename);
}
void
-format_selection_init(const gchar *dir)
+format_selection_init(void)
{
GtkListStore *formats_store;
GtkCellRenderer *renderer;
- formats_directory = g_strdup(dir);
-
formats_store = gtk_list_store_new(NUM_COLS,
G_TYPE_STRING, G_TYPE_STRING);
gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(formats_store),
diff --git a/src/main.c b/src/main.c
index 00690ab..4197b53 100644
--- a/src/main.c
+++ b/src/main.c
@@ -266,6 +266,8 @@ main(int argc, char *argv[])
gtk_init(&argc, &argv);
+ config_init_key_file();
+
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, DEFAULT_UI, NULL);
@@ -311,14 +313,15 @@ main(int argc, char *argv[])
/* configure transcript widgets */
GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget)->speaker = g_strdup("Wizard");
GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget)->speaker = g_strdup("Proband");
- format_selection_init(DEFAULT_FORMAT_DIR);
+ format_selection_init();
- quickopen_directory = g_strdup(DEFAULT_QUICKOPEN_DIR);
refresh_quickopen_menu(GTK_MENU(quickopen_menu));
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
+ config_save_key_file();
+
return 0;
} \ No newline at end of file
diff --git a/src/quick-open.c b/src/quick-open.c
index 30f089d..8be163f 100644
--- a/src/quick-open.c
+++ b/src/quick-open.c
@@ -23,8 +23,6 @@ static void quickopen_item_on_activate(GtkWidget *widget, gpointer user_data);
GtkWidget *quickopen_menu,
*quickopen_menu_empty_item;
-gchar *quickopen_directory;
-
/*
* GtkBuilder signal callbacks
* NOTE: for some strange reason the parameters are switched
@@ -35,19 +33,24 @@ quickopen_menu_choosedir_item_activate_cb(GtkWidget *widget,
gpointer data __attribute__((unused)))
{
GtkWidget *dialog;
+ gchar *quickopen_directory;
dialog = gtk_file_chooser_dialog_new("Choose Directory...", GTK_WINDOW(widget),
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
+
+ quickopen_directory = config_get_quickopen_directory();
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
quickopen_directory);
+ g_free(quickopen_directory);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
- g_free(quickopen_directory);
quickopen_directory =
gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+ config_set_quickopen_directory(quickopen_directory);
+ g_free(quickopen_directory);
refresh_quickopen_menu(GTK_MENU(quickopen_menu));
}
@@ -70,6 +73,7 @@ quickopen_filter(const gchar *name)
gchar *name_reversed = g_strreverse(g_strdup(name));
gchar **filters, **filter;
+ gchar *quickopen_directory;
gchar *trans_name, *p;
gboolean res;
@@ -89,7 +93,9 @@ quickopen_filter(const gchar *name)
if (res)
return FALSE;
+ quickopen_directory = config_get_quickopen_directory();
trans_name = g_build_filename(quickopen_directory, name, NULL);
+ g_free(quickopen_directory);
trans_name = g_realloc(trans_name, strlen(trans_name) +
sizeof(EXPERIMENT_TRANSCRIPT_EXT));
if ((p = g_strrstr(trans_name, ".")) == NULL) {
@@ -119,6 +125,7 @@ refresh_quickopen_menu(GtkMenu *menu)
int fullnames_n;
+ gchar *quickopen_directory;
GDir *dir;
const gchar *name;
@@ -130,6 +137,7 @@ refresh_quickopen_menu(GtkMenu *menu)
fullnames = NULL;
fullnames_n = 0;
+ quickopen_directory = config_get_quickopen_directory();
dir = g_dir_open(quickopen_directory, 0, NULL);
while ((name = g_dir_read_name(dir)) != NULL) {
@@ -165,6 +173,7 @@ refresh_quickopen_menu(GtkMenu *menu)
g_ptr_array_sort(items, quickopen_item_cmp);
g_dir_close(dir);
+ g_free(quickopen_directory);
for (int i = 0; i < items->len; i++) {
GtkWidget *item = GTK_WIDGET(g_ptr_array_index(items, i));