diff options
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/config.c | 74 | ||||
-rw-r--r-- | src/experiment-player.h | 28 | ||||
-rw-r--r-- | src/format-selection.c | 18 | ||||
-rw-r--r-- | src/main.c | 7 | ||||
-rw-r--r-- | src/quick-open.c | 15 |
7 files changed, 133 insertions, 18 deletions
diff --git a/configure.ac b/configure.ac index 1d2544f..a4a965f 100644 --- a/configure.ac +++ b/configure.ac @@ -212,6 +212,8 @@ AC_SUBST(GTKAPP_CFLAGS) AC_SUBST(GTKAPP_LDFLAGS) # Some constants +AC_DEFINE_UNQUOTED(CONFIG_KEY_FILE, [".$PACKAGE_TARNAME"], [Configuration filename (relative)]) + AC_DEFINE(GTK_VLC_PLAYER_TIME_ADJ_STEP, [1000.], [VLC Player time adjustment step increment]) AC_DEFINE(GTK_VLC_PLAYER_TIME_ADJ_PAGE, [30000.], [VLC Player time adjustment page increment]) @@ -222,8 +224,8 @@ AC_DEFINE(DEFAULT_QUICKOPEN_DIR, ["."], [Default directory for listing experime AC_DEFINE(EXPERIMENT_MOVIE_FILTER, ["*.mp4;*.avi"], [Filters for (quick) opening movies]) AC_DEFINE(EXPERIMENT_TRANSCRIPT_EXT, ["xml"], [File extension of experiment transcripts]) -AC_DEFINE(DEFAULT_FORMAT_DIR, ["."], [Default directory for selecting formats]) -AC_DEFINE(EXPERIMENT_FORMAT_FILTER, ["*.fmt"], [Format file filter]) +AC_DEFINE(DEFAULT_FORMATS_DIR, ["."], [Default directory for selecting formats]) +AC_DEFINE(EXPERIMENT_FORMATS_FILTER, ["*.fmt"], [Format file filter]) AC_DEFINE(DEFAULT_INTERACTIVE_FORMAT_FONT, ["bold"], [Default interactive format font description]) AC_DEFINE(DEFAULT_INTERACTIVE_FORMAT_FGCOLOR, [NULL], [Default interactive format foreground color]) 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), @@ -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)); |