diff options
-rw-r--r-- | src/Makefile.am | 39 | ||||
-rw-r--r-- | src/config.c | 319 | ||||
-rw-r--r-- | src/default.ui | 605 | ||||
-rw-r--r-- | src/experiment-player.h | 260 | ||||
-rw-r--r-- | src/experiment-player.ico | bin | 161862 -> 0 bytes | |||
-rw-r--r-- | src/format-selection.c | 271 | ||||
-rw-r--r-- | src/icon.rc | 1 | ||||
-rw-r--r-- | src/main.c | 685 | ||||
-rw-r--r-- | src/quick-open.c | 264 |
9 files changed, 0 insertions, 2444 deletions
diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 6f8fef5..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -AM_CFLAGS = -Wall - -bin_PROGRAMS = experiment-player -experiment_player_SOURCES = main.c config.c \ - quick-open.c format-selection.c \ - experiment-player.h - -experiment_player_CFLAGS = $(AM_CFLAGS) -experiment_player_CPPFLAGS = -DDEFAULT_UI='"@DEFAULT_UI@"' \ - -DHELP_URI='"@HELP_URI@"' -experiment_player_LDFLAGS = -export-dynamic -experiment_player_LDADD = - -if USE_W32_RES -experiment_player_LDADD += icon.$(OBJEXT) -endif - -experiment_player_CFLAGS += @LIBGLIB_CFLAGS@ @LIBGTK_CFLAGS@ -experiment_player_LDADD += @LIBGLIB_LIBS@ @LIBGTK_LIBS@ - -experiment_player_CPPFLAGS += -I@top_srcdir@/lib/gtk-vlc-player -experiment_player_LDADD += @top_srcdir@/lib/gtk-vlc-player/libgtk-vlc-player.la - -experiment_player_CPPFLAGS += -I@top_srcdir@/lib/gtk-experiment-widgets -experiment_player_LDADD += @top_srcdir@/lib/gtk-experiment-widgets/libgtk-experiment-widgets.la - -experiment_player_CPPFLAGS += -I@top_srcdir@/lib/experiment-reader -experiment_player_LDADD += @top_srcdir@/lib/experiment-reader/libexperiment-reader.la - -experiment_player_CFLAGS += @GTKAPP_CFLAGS@ -experiment_player_LDFLAGS += @GTKAPP_LDFLAGS@ - -dist_player_data_DATA = default.ui \ - experiment-player.ico - -EXTRA_DIST = icon.rc - -icon.$(OBJEXT) : icon.rc experiment-player.ico - @RC@ $< $@ diff --git a/src/config.c b/src/config.c deleted file mode 100644 index 680cbdf..0000000 --- a/src/config.c +++ /dev/null @@ -1,319 +0,0 @@ -/** - * @file - * Configuration file handling functions - */ - -/* - * Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> - -#include <glib.h> -#include <glib/gprintf.h> -#include <glib/gstdio.h> - -#include <gdk/gdk.h> - -#include "experiment-player.h" - -static inline void set_default_string(const gchar *group_name, const gchar *key, - const gchar *string); -static inline void set_default_boolean(const gchar *group_name, const gchar *key, - gboolean boolean); - -static const gchar *get_group_by_actor(const gchar *actor); -static const gchar *get_group_by_window(const gchar *window); - -static GKeyFile *keyfile; -static gchar *filename = NULL; - -void -config_init_key_file(void) -{ - keyfile = g_key_file_new(); - - /* 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); - - /* initialize defaults */ - set_default_boolean("Global", "Save-Window-Properties", TRUE); - - set_default_string("Directories", "Quick-Open", DEFAULT_QUICKOPEN_DIR); - set_default_string("Directories", "Formats", DEFAULT_FORMATS_DIR); - -#ifdef DEFAULT_INTERACTIVE_FORMAT_FONT - set_default_string("Wizard Transcript", "Default-Format-Font", - DEFAULT_INTERACTIVE_FORMAT_FONT); - set_default_string("Proband Transcript", "Default-Format-Font", - DEFAULT_INTERACTIVE_FORMAT_FONT); -#endif -#ifdef DEFAULT_INTERACTIVE_FORMAT_FGCOLOR - set_default_string("Wizard Transcript", "Default-Format-Text-Color", - DEFAULT_INTERACTIVE_FORMAT_FGCOLOR); - set_default_string("Proband Transcript", "Default-Format-Text-Color", - DEFAULT_INTERACTIVE_FORMAT_FGCOLOR); -#endif -#ifdef DEFAULT_INTERACTIVE_FORMAT_BGCOLOR - set_default_string("Wizard Transcript", "Default-Format-BG-Color", - DEFAULT_INTERACTIVE_FORMAT_BGCOLOR); - set_default_string("Proband Transcript", "Default-Format-BG-Color", - DEFAULT_INTERACTIVE_FORMAT_BGCOLOR); -#endif -} - -static inline void -set_default_string(const gchar *group_name, const gchar *key, - const gchar *string) -{ - if (!g_key_file_has_key(keyfile, group_name, key, NULL)) - g_key_file_set_string(keyfile, group_name, key, string); -} - -static inline void -set_default_boolean(const gchar *group_name, const gchar *key, - gboolean boolean) -{ - if (!g_key_file_has_key(keyfile, group_name, key, NULL)) - g_key_file_set_boolean(keyfile, group_name, key, boolean); -} - -void -config_set_save_window_properties(gboolean enabled) -{ - g_key_file_set_boolean(keyfile, "Global", - "Save-Window-Properties", enabled); -} - -gboolean -config_get_save_window_properties(void) -{ - return g_key_file_get_boolean(keyfile, "Global", - "Save-Window-Properties", NULL); -} - -static const gchar * -get_group_by_window(const gchar *window) -{ - static gchar group[255]; - - g_snprintf(group, sizeof(group), "%s Window", window); - return group; -} - -void -config_set_window_geometry(const gchar *window, const gchar *geometry) -{ - g_key_file_set_string(keyfile, get_group_by_window(window), - "Geometry", geometry); -} - -gchar * -config_get_window_geometry(const gchar *window) -{ - return g_key_file_get_string(keyfile, get_group_by_window(window), - "Geometry", NULL); -} - -void -config_set_window_state(const gchar *window, GdkWindowState state) -{ - g_key_file_set_integer(keyfile, get_group_by_window(window), - "State", state); -} - -GdkWindowState -config_get_window_state(const gchar *window) -{ - return g_key_file_get_integer(keyfile, get_group_by_window(window), - "State", 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); -} - -static const gchar * -get_group_by_actor(const gchar *actor) -{ - static gchar group[255]; - - g_snprintf(group, sizeof(group), "%s Transcript", actor); - return group; -} - -/** @private */ -void -config_generic_set_transcript_font(const gchar *actor, const gchar *key, - const PangoFontDescription *font) -{ - const gchar *group = get_group_by_actor(actor); - - if (font == NULL) { - g_key_file_remove_key(keyfile, group, key, NULL); - } else { - gchar *font_name = pango_font_description_to_string(font); - g_key_file_set_string(keyfile, group, key, font_name); - g_free(font_name); - } -} - -/** @private */ -PangoFontDescription * -config_generic_get_transcript_font(const gchar *actor, const gchar *key) -{ - gchar *font_name; - PangoFontDescription *font_desc = NULL; - - font_name = g_key_file_get_string(keyfile, get_group_by_actor(actor), - key, NULL); - if (font_name != NULL) { - font_desc = pango_font_description_from_string(font_name); - g_free(font_name); - } - - return font_desc; -} - -/** @private */ -void -config_generic_set_transcript_color(const gchar *actor, const gchar *key, - const GdkColor *color) -{ - const gchar *group = get_group_by_actor(actor); - - if (color == NULL) { - g_key_file_remove_key(keyfile, group, key, NULL); - } else { - gchar *color_name = gdk_color_to_string(color); - g_key_file_set_string(keyfile, group, key, color_name); - g_free(color_name); - } -} - -/** @private */ -gboolean -config_generic_get_transcript_color(const gchar *actor, const gchar *key, - GdkColor *color) -{ - gchar *color_name; - - color_name = g_key_file_get_string(keyfile, get_group_by_actor(actor), - key, NULL); - if (color_name == NULL) - return FALSE; - - gdk_color_parse(color_name, color); - g_free(color_name); - - return TRUE; -} - -void -config_set_transcript_reverse_mode(const gchar *actor, gboolean reverse) -{ - g_key_file_set_boolean(keyfile, get_group_by_actor(actor), - "Widget-Reverse-Mode", reverse); -} - -gboolean -config_get_transcript_reverse_mode(const gchar *actor) -{ - return g_key_file_get_boolean(keyfile, get_group_by_actor(actor), - "Widget-Reverse-Mode", NULL); -} - -void -config_set_transcript_alignment(const gchar *actor, PangoAlignment alignment) -{ - static gchar **values = NULL; - - if (values == NULL) { - gchar *possible_values; - - pango_parse_enum(PANGO_TYPE_ALIGNMENT, "", NULL, - FALSE, &possible_values); - values = g_strsplit(possible_values, "/", 0); - g_free(possible_values); - } - - g_key_file_set_string(keyfile, get_group_by_actor(actor), - "Widget-Alignment", values[alignment]); -} - -PangoAlignment -config_get_transcript_alignment(const gchar *actor) -{ - gchar *value; - gint alignment = (gint)PANGO_ALIGN_LEFT; - - value = g_key_file_get_string(keyfile, get_group_by_actor(actor), - "Widget-Alignment", NULL); - if (value == NULL) - return PANGO_ALIGN_LEFT; - - pango_parse_enum(PANGO_TYPE_ALIGNMENT, value, &alignment, FALSE, NULL); - g_free(value); - - return (PangoAlignment)alignment; -} - -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/default.ui b/src/default.ui deleted file mode 100644 index acb3b4b..0000000 --- a/src/default.ui +++ /dev/null @@ -1,605 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-requires gtk-vlc-player 0.0 --> - <!-- interface-requires gtk-experiment-widgets 0.0 --> - <!-- interface-naming-policy project-wide --> - <object class="GtkWindow" id="player_window"> - <property name="title" translatable="yes">Experiment Player</property> - <property name="default_width">400</property> - <property name="default_height">300</property> - <signal name="delete_event" handler="player_window_delete_event_cb"/> - <child> - <object class="GtkVBox" id="player_window_vbox"> - <property name="visible">True</property> - <child> - <object class="GtkMenuBar" id="player_window_menubar"> - <property name="visible">True</property> - <child> - <object class="GtkMenuItem" id="file_item"> - <property name="visible">True</property> - <property name="label" translatable="yes">_File</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="file_menu"> - <property name="visible">True</property> - <child> - <object class="GtkImageMenuItem" id="file_menu_openmovie_item"> - <property name="label" translatable="yes">Open _Video...</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="image">image1</property> - <property name="use_stock">False</property> - <signal name="activate" handler="file_menu_openmovie_item_activate_cb" object="player_window"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="file_menu_opentranscript_item"> - <property name="label" translatable="yes">Open _Transcript...</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="image">image2</property> - <property name="use_stock">False</property> - <signal name="activate" handler="file_menu_opentranscript_item_activate_cb" object="player_window"/> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="file_menu_separator_item"> - <property name="visible">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="file_menu_quit_item"> - <property name="label">gtk-quit</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <accelerator key="q" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="generic_quit_cb"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="quickopen_item"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Quick Open</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="quickopen_menu"> - <property name="visible">True</property> - <child> - <object class="GtkMenuItem" id="quickopen_menu_empty_item"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="label" translatable="yes">No experiments found</property> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="quickopen_menu_separator_item"> - <property name="visible">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="quickopen_menu_choosedir_item"> - <property name="label" translatable="yes">Choose _Directory...</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="image">image3</property> - <property name="use_stock">False</property> - <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="quickopen_menu_choosedir_item_activate_cb" object="player_window"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="quickopen_menu_refresh_item"> - <property name="label">gtk-refresh</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <accelerator key="r" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="quickopen_menu_refresh_item_activate_cb" object="quickopen_menu"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="help_item"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Help</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="help_menu"> - <property name="visible">True</property> - <child> - <object class="GtkImageMenuItem" id="help_menu_manual_item"> - <property name="label" translatable="yes">_Help</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="image">image4</property> - <property name="use_stock">False</property> - <accelerator key="F1" signal="activate"/> - <signal name="activate" handler="help_menu_manual_item_activate_cb"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="help_menu_about_item"> - <property name="label">gtk-about</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <signal name="activate" handler="help_menu_about_item_activate_cb" object="about_dialog"/> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVlcPlayer" id="player_widget"> - <property name="visible">True</property> - <signal name="time_changed" handler="player_widget_time_changed_cb" object="player_window_statusbar_time"/> - <signal name="length_changed" handler="player_widget_length_changed_cb" object="player_window_statusbar_length"/> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="controls_hbox"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <child> - <object class="GtkButton" id="playpause_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Start video playback</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <signal name="clicked" handler="playpause_button_clicked_cb" object="player_widget"/> - <child> - <object class="GtkImage" id="playpause_image"> - <property name="visible">True</property> - <property name="stock">gtk-media-play</property> - <property name="icon-size">2</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="stop_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Stop video playback</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <signal name="clicked" handler="stop_button_clicked_cb" object="player_widget"/> - <child> - <object class="GtkImage" id="stop_image"> - <property name="visible">True</property> - <property name="stock">gtk-media-stop</property> - <property name="icon-size">2</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHScale" id="scale_widget"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Current playback position</property> - <property name="restrict_to_fill_level">False</property> - <property name="draw_value">False</property> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkVolumeButton" id="volume_button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="has_tooltip">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <property name="orientation">vertical</property> - <property name="value">1</property> - <property name="icons">audio-volume-muted -audio-volume-high -audio-volume-low -audio-volume-medium</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkStatusbar" id="player_window_statusbar"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkLabel" id="player_window_statusbar_time"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Time: 0:00</property> - <property name="width_chars">15</property> - <property name="single_line_mode">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="player_window_statusbar_length"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Length: 0:00</property> - <property name="width_chars">15</property> - <property name="single_line_mode">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">3</property> - </packing> - </child> - </object> - </child> - </object> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="stock">gtk-directory</property> - </object> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="stock">gtk-help</property> - </object> - <object class="GtkWindow" id="info_window"> - <property name="title" translatable="yes">Experiment Data</property> - <property name="default_width">680</property> - <property name="default_height">700</property> - <property name="deletable">False</property> - <child> - <object class="GtkVBox" id="info_window_vbox"> - <property name="visible">True</property> - <child> - <object class="GtkMenuBar" id="info_window_menubar"> - <property name="visible">True</property> - <child> - <object class="GtkMenuItem" id="formats_item"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Formats</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="formats_menu"> - <property name="visible">True</property> - <child> - <object class="GtkImageMenuItem" id="formats_menu_choosedir_item"> - <property name="label" translatable="yes">Choose _Directory...</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="image">image5</property> - <property name="use_stock">False</property> - <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="formats_menu_choosedir_item_activate_cb" object="info_window"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="formats_menu_refresh_item"> - <property name="label">gtk-refresh</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <accelerator key="r" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="formats_menu_refresh_item_activate_cb" object="transcript_wizard_combo"/> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkHPaned" id="info_window_hpane"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="position">339</property> - <child> - <object class="GtkTable" id="transcript_table"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="n_rows">3</property> - <property name="n_columns">3</property> - <child> - <object class="GtkExperimentTranscript" id="transcript_wizard_widget"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - </child> - <child> - <object class="GtkExperimentTranscript" id="transcript_proband_widget"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkVScrollbar" id="transcript_scroll_widget"> - <property name="visible">True</property> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="transcript_proband_combo"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Currently applied format file</property> - <signal name="changed" handler="generic_transcript_combo_changed_cb" object="transcript_proband_widget"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="transcript_wizard_combo"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Currently applied format file</property> - <signal name="changed" handler="generic_transcript_combo_changed_cb" object="transcript_wizard_widget"/> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="transcript_wizard_entry_hbox"> - <property name="visible">True</property> - <child> - <object class="GtkEntry" id="transcript_wizard_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Format expression</property> - <property name="invisible_char">●</property> - <property name="primary_icon_stock">gtk-apply</property> - <signal name="changed" handler="generic_transcript_entry_changed_cb" object="transcript_wizard_widget"/> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVSeparator" id="transcript_wizard_entry_separator"> - <property name="visible">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="padding">5</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="transcript_wizard_entry_check"> - <property name="label" translatable="yes">Markup</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Allow Pango markup in format expression</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="generic_transcript_entry_check_toggled_cb" object="transcript_wizard_entry"/> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="transcript_proband_entry_hbox"> - <property name="visible">True</property> - <child> - <object class="GtkEntry" id="transcript_proband_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Format expression</property> - <property name="invisible_char">●</property> - <property name="primary_icon_stock">gtk-apply</property> - <signal name="changed" handler="generic_transcript_entry_changed_cb" object="transcript_proband_widget"/> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkVSeparator" id="transcript_proband_entry_separator"> - <property name="visible">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="padding">5</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="transcript_proband_entry_check"> - <property name="label" translatable="yes">Markup</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Allow Pango markup in format expression</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="generic_transcript_entry_check_toggled_cb" object="transcript_proband_entry"/> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options">GTK_FILL</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="resize">False</property> - <property name="shrink">False</property> - </packing> - </child> - <child> - <object class="GtkScrolledWindow" id="navigator_scrolledwindow"> - <property name="width_request">300</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <object class="GtkExperimentNavigator" id="navigator_widget"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_clickable">False</property> - <property name="search_column">0</property> - <signal name="time_selected" handler="navigator_widget_time_selected_cb" object="player_widget"/> - <signal name="section_activated" handler="navigator_widget_section_activated_cb"/> - <signal name="focus_in_event" handler="navigator_widget_generic_focus_event_cb"/> - <signal name="focus_out_event" handler="navigator_widget_generic_focus_event_cb"/> - </object> - </child> - </object> - <packing> - <property name="resize">True</property> - <property name="shrink">True</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - <object class="GtkImage" id="image5"> - <property name="visible">True</property> - <property name="stock">gtk-directory</property> - </object> - <object class="GtkAboutDialog" id="about_dialog"> - <property name="border_width">5</property> - <property name="resizable">False</property> - <property name="window_position">center-on-parent</property> - <property name="destroy_with_parent">True</property> - <property name="type_hint">dialog</property> - <property name="skip_taskbar_hint">True</property> - <property name="skip_pager_hint">True</property> - <property name="transient_for">player_window</property> - <property name="copyright">Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg</property> - <property name="license">This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.</property> - <property name="authors">Jens Lammert <jens.lammert@st.ovgu.de> -Robin Haberkorn <robin.haberkorn@st.ovgu.de></property> - <property name="documenters">Jens Lammert <jens.lammert@st.ovgu.de> -Robin Haberkorn <robin.haberkorn@st.ovgu.de></property> - <property name="wrap_license">True</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <placeholder/> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - </object> -</interface> diff --git a/src/experiment-player.h b/src/experiment-player.h deleted file mode 100644 index 35e6251..0000000 --- a/src/experiment-player.h +++ /dev/null @@ -1,260 +0,0 @@ -/** - * @file - * Main program header - */ - -/* - * Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __EXPERIMENT_PLAYER_H -#define __EXPERIMENT_PLAYER_H - -#include <glib.h> -#include <glib/gprintf.h> - -#include <gdk/gdk.h> - -#include <gtk/gtk.h> - -/** Main program error domain */ -#define EXPERIMENT_PLAYER_ERROR \ - (experiment_player_error_quark()) - -/** Main program error codes */ -typedef enum { - EXPERIMENT_PLAYER_ERROR_OPEN /**< Error opening file/URI */ -} ExperimentPlayerError; - -/* - * main.c - */ -/** @private */ -GQuark experiment_player_error_quark(void); - -gboolean load_media_file(const gchar *file); -gboolean load_transcript_file(const gchar *file); - -void show_message_dialog_gerror(GError *err); - -const gchar *window_get_geometry(GtkWindow *window); -void window_set_state(GtkWindow *window, GdkWindowState state); - -extern GtkWidget *player_window, - *info_window, - *about_dialog; - -extern GtkWidget *player_widget, - *controls_hbox, - *scale_widget, - *playpause_button, - *volume_button; - -extern GtkWidget *player_window_statusbar; - -extern GtkWidget *transcript_table, - *transcript_wizard_widget, - *transcript_proband_widget, - *transcript_scroll_widget; - -extern GtkWidget *navigator_scrolledwindow, - *navigator_widget; - -extern gchar *current_filename; - -/* - * config.c - */ -void config_init_key_file(void); - -void config_set_save_window_properties(gboolean enabled); -gboolean config_get_save_window_properties(void); -void config_set_window_geometry(const gchar *window, const gchar *geometry); -gchar *config_get_window_geometry(const gchar *window); -void config_set_window_state(const gchar *window, GdkWindowState state); -GdkWindowState config_get_window_state(const gchar *window); - -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); - -/** @private */ -void config_generic_set_transcript_font(const gchar *actor, const gchar *key, - const PangoFontDescription *font); -/** @private */ -PangoFontDescription *config_generic_get_transcript_font(const gchar *actor, - const gchar *key); - -/** @private */ -void config_generic_set_transcript_color(const gchar *actor, const gchar *key, - const GdkColor *color); -/** @private */ -gboolean config_generic_get_transcript_color(const gchar *actor, const gchar *key, - GdkColor *color); - -/** @public */ -static inline void -config_set_transcript_font(const gchar *actor, const PangoFontDescription *font) -{ - config_generic_set_transcript_font(actor, "Widget-Font", font); -} -/** @public */ -static inline PangoFontDescription * -config_get_transcript_font(const gchar *actor) -{ - return config_generic_get_transcript_font(actor, "Widget-Font"); -} - -/** @public */ -static inline void -config_set_transcript_text_color(const gchar *actor, const GdkColor *color) -{ - config_generic_set_transcript_color(actor, "Widget-Text-Color", color); -} -/** @public */ -static inline gboolean -config_get_transcript_text_color(const gchar *actor, GdkColor *color) -{ - return config_generic_get_transcript_color(actor, "Widget-Text-Color", - color); -} - -/** @public */ -static inline void -config_set_transcript_bg_color(const gchar *actor, const GdkColor *color) -{ - config_generic_set_transcript_color(actor, "Widget-BG-Color", color); -} -/** @public */ -static inline gboolean -config_get_transcript_bg_color(const gchar *actor, GdkColor *color) -{ - return config_generic_get_transcript_color(actor, "Widget-BG-Color", - color); -} - -/** @public */ -static inline void -config_set_transcript_default_format_font(const gchar *actor, - const PangoFontDescription *font) -{ - config_generic_set_transcript_font(actor, "Default-Format-Font", font); -} -/** @public */ -static inline PangoFontDescription * -config_get_transcript_default_format_font(const gchar *actor) -{ - return config_generic_get_transcript_font(actor, "Default-Format-Font"); -} - -/** @public */ -static inline void -config_set_transcript_default_format_text_color(const gchar *actor, - const GdkColor *color) -{ - config_generic_set_transcript_color(actor, "Default-Format-Text-Color", - color); -} -/** @public */ -static inline gboolean -config_get_transcript_default_format_text_color(const gchar *actor, - GdkColor *color) -{ - return config_generic_get_transcript_color(actor, "Default-Format-Text-Color", - color); -} - -/** @public */ -static inline void -config_set_transcript_default_format_bg_color(const gchar *actor, - const GdkColor *color) -{ - config_generic_set_transcript_color(actor, "Default-Format-BG-Color", - color); -} -/** @public */ -static inline gboolean -config_get_transcript_default_format_bg_color(const gchar *actor, - GdkColor *color) -{ - return config_generic_get_transcript_color(actor, "Default-Format-BG-Color", - color); -} - -void config_set_transcript_reverse_mode(const gchar *actor, gboolean reverse); -gboolean config_get_transcript_reverse_mode(const gchar *actor); - -void config_set_transcript_alignment(const gchar *actor, - PangoAlignment alignment); -PangoAlignment config_get_transcript_alignment(const gchar *actor); - -void config_save_key_file(void); - -/* - * quick-open.c - */ -void refresh_quickopen_menu(GtkMenu *menu); - -extern GtkWidget *quickopen_menu, - *quickopen_menu_empty_item; - -/* - * 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 - */ -/** @private */ -#define BUILDER_INIT(BUILDER, VAR) G_STMT_START { \ - VAR = GTK_WIDGET(gtk_builder_get_object(BUILDER, #VAR)); \ -} G_STMT_END - -/** @public */ -static inline gchar * -path_strip_extension(const gchar *filename) -{ - gchar *ret = g_strdup(filename); - gchar *p; - - if ((p = g_strrstr(ret, ".")) != NULL) - *p = '\0'; - - return ret; -} - -/** @public */ -static inline const gchar * -format_timepoint(const gchar *prefix, gint64 timept) -{ - static gchar buf[255]; - - g_snprintf(buf, sizeof(buf), - "%s%" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT, - prefix != NULL ? prefix : "", - timept / (1000*60), (timept/1000) % 60); - - return buf; -} - -#endif
\ No newline at end of file diff --git a/src/experiment-player.ico b/src/experiment-player.ico Binary files differdeleted file mode 100644 index 9b71b6e..0000000 --- a/src/experiment-player.ico +++ /dev/null diff --git a/src/format-selection.c b/src/format-selection.c deleted file mode 100644 index c53ad0b..0000000 --- a/src/format-selection.c +++ /dev/null @@ -1,271 +0,0 @@ -/** - * @file - * Functions for handling the transcripts' format file selection and - * interactive format entry. - */ - -/* - * Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <assert.h> - -#include <glib.h> -#include <glib/gprintf.h> -#include <glib/gstdio.h> - -#include <gtk/gtk.h> - -#include <gtk-experiment-transcript.h> - -#include "experiment-player.h" - -static void refresh_formats_store(GtkListStore *store); - -GtkWidget *transcript_wizard_combo, - *transcript_proband_combo, - *transcript_wizard_entry_check, - *transcript_proband_entry_check; - -enum { - COL_NAME, - COL_FILENAME, - NUM_COLS -}; - -/* - * GtkBuilder signal callbacks - * NOTE: for some strange reason the parameters are switched - */ - -/** @private */ -void -formats_menu_choosedir_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - GtkTreeModel *model = - 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) { - 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)); - } - - gtk_widget_destroy(dialog); -} - -/** @private */ -void -formats_menu_refresh_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); - - refresh_formats_store(GTK_LIST_STORE(model)); -} - -/** @private */ -void -generic_transcript_combo_changed_cb(gpointer user_data, GtkComboBox *combo) -{ - GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(user_data); - - GtkTreeModel *model = gtk_combo_box_get_model(combo); - GtkTreeIter iter; - gchar *filename = NULL; - - GError *error = NULL; - - if (gtk_combo_box_get_active_iter(combo, &iter)) - gtk_tree_model_get(model, &iter, COL_FILENAME, &filename, -1); - - /* - * filename may be empty (null-entry) in which case any active format - * will be reset - */ - if (!gtk_experiment_transcript_load_formats(trans, filename, &error)) { - show_message_dialog_gerror(error); - g_error_free(error); - - gtk_combo_box_set_active_iter(combo, NULL); - } - g_free(filename); - -#if 0 - refresh_formats_store(GTK_LIST_STORE(model)); -#endif -} - -/** @private */ -void -generic_transcript_entry_changed_cb(gpointer user_data, GtkEditable *editable) -{ - GtkExperimentTranscript *trans = GTK_EXPERIMENT_TRANSCRIPT(user_data); - const gchar *text = gtk_entry_get_text(GTK_ENTRY(editable)); - - GtkToggleButton *toggle; - gboolean isMarkup; - - gboolean res; - - toggle = trans == GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget) - ? GTK_TOGGLE_BUTTON(transcript_wizard_entry_check) - : GTK_TOGGLE_BUTTON(transcript_proband_entry_check); - isMarkup = gtk_toggle_button_get_active(toggle); - - res = gtk_experiment_transcript_set_interactive_format(trans, text, - isMarkup, NULL); - - gtk_entry_set_icon_from_stock(GTK_ENTRY(editable), - GTK_ENTRY_ICON_PRIMARY, - res ? GTK_STOCK_APPLY - : GTK_STOCK_DIALOG_ERROR); - gtk_entry_set_icon_sensitive(GTK_ENTRY(editable), - GTK_ENTRY_ICON_PRIMARY, - text != NULL && *text); -} - -/** @private */ -void -generic_transcript_entry_check_toggled_cb(gpointer user_data, - GtkToggleButton *widget __attribute__((unused))) -{ - gint position = 0; - - /* - * Hack to update the transcript's interactive format - */ - gtk_editable_insert_text(GTK_EDITABLE(user_data), "", 0, &position); -} - -static void -refresh_formats_store(GtkListStore *store) -{ - static GPatternSpec *pattern = NULL; - - GtkTreeModel *model = GTK_TREE_MODEL(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_FORMATS_FILTER); - - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(transcript_wizard_combo), - &iter)) - gtk_tree_model_get(model, &iter, - COL_FILENAME, &wizard_filename, -1); - if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(transcript_proband_combo), - &iter)) - gtk_tree_model_get(model, &iter, - COL_FILENAME, &proband_filename, -1); - - gtk_list_store_clear(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) { - gchar *itemname, *fullname; - - if (!g_pattern_match_string(pattern, name)) - continue; - - itemname = path_strip_extension(name); - fullname = g_build_filename(formats_directory, name, NULL); - - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - COL_NAME, itemname, - COL_FILENAME, fullname, - -1); - - if (!g_strcmp0(fullname, wizard_filename)) - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(transcript_wizard_combo), - &iter); - if (!g_strcmp0(fullname, proband_filename)) - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(transcript_proband_combo), - &iter); - - g_free(fullname); - g_free(itemname); - } - - g_dir_close(dir); - g_free(formats_directory); - - g_free(proband_filename); - g_free(wizard_filename); -} - -void -format_selection_init(void) -{ - GtkListStore *formats_store; - GtkCellRenderer *renderer; - - 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), - COL_NAME, GTK_SORT_ASCENDING); - - gtk_combo_box_set_model(GTK_COMBO_BOX(transcript_wizard_combo), - GTK_TREE_MODEL(formats_store)); - gtk_combo_box_set_model(GTK_COMBO_BOX(transcript_proband_combo), - GTK_TREE_MODEL(formats_store)); - - renderer = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(transcript_wizard_combo), - renderer, TRUE); - gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(transcript_wizard_combo), - renderer, "text", COL_NAME); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(transcript_proband_combo), - renderer, TRUE); - gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(transcript_proband_combo), - renderer, "text", COL_NAME); - - refresh_formats_store(formats_store); - - g_object_unref(formats_store); -} diff --git a/src/icon.rc b/src/icon.rc deleted file mode 100644 index b473860..0000000 --- a/src/icon.rc +++ /dev/null @@ -1 +0,0 @@ -DEFAULT ICON "experiment-player.ico" diff --git a/src/main.c b/src/main.c deleted file mode 100644 index 6bfe1c2..0000000 --- a/src/main.c +++ /dev/null @@ -1,685 +0,0 @@ -/** - * @file - * Program entry point, UI initialization, widget connections and GTK event - * loop. - */ - -/* - * Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <locale.h> - -#ifdef HAVE_WINDOWS_H -#include <windows.h> -#include <shellapi.h> -#endif - -#include <glib.h> -#include <glib/gprintf.h> - -#include <gdk/gdk.h> - -#include <gtk/gtk.h> - -#include <gtk-vlc-player.h> -#include <gtk-experiment-navigator.h> -#include <gtk-experiment-transcript.h> -#include <experiment-reader.h> - -#include "experiment-player.h" - -static inline void button_image_set_from_stock(GtkButton *widget, - const gchar *name); - -GtkWidget *player_window, - *info_window, - *about_dialog; - -GtkWidget *player_widget, - *controls_hbox, - *scale_widget, - *playpause_button, - *volume_button; - -GtkWidget *player_window_statusbar; - -GtkWidget *transcript_table, - *transcript_wizard_widget, - *transcript_proband_widget, - *transcript_scroll_widget; - -GtkWidget *navigator_scrolledwindow, - *navigator_widget; - -gchar *current_filename = NULL; - -#define TOOLTIP_PLAY "Start video playback" -#define TOOLTIP_PAUSE "Pause video playback" - -#define SPEAKER_WIZARD "Wizard" -#define SPEAKER_PROBAND "Proband" - -/** @private */ -GQuark -experiment_player_error_quark(void) -{ - return g_quark_from_static_string("experiment-player-error-quark"); -} - -/* - * GtkBuilder signal callbacks - * NOTE: for some strange reason the parameters are switched - */ - -/** @private */ -void -help_menu_about_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - gtk_dialog_run(GTK_DIALOG(widget)); - gtk_widget_hide(widget); -} - -/** @private */ -void -player_widget_length_changed_cb(GtkWidget *widget, gint64 new_length, - gpointer data __attribute__((unused))) -{ - gtk_label_set_text(GTK_LABEL(widget), - format_timepoint("Length: ", new_length)); -} - -/** @private */ -void -player_widget_time_changed_cb(GtkWidget *widget, gint64 new_time, - gpointer data __attribute__((unused))) -{ - gtk_label_set_text(GTK_LABEL(widget), - format_timepoint("Time: ", new_time)); -} - -/** @private */ -void -playpause_button_clicked_cb(GtkWidget *widget, gpointer data) -{ - gboolean is_playing = gtk_vlc_player_toggle(GTK_VLC_PLAYER(widget)); - - button_image_set_from_stock(GTK_BUTTON(data), - is_playing ? GTK_STOCK_MEDIA_PLAY - : GTK_STOCK_MEDIA_PAUSE); - gtk_widget_set_tooltip_text(GTK_WIDGET(data), - is_playing ? TOOLTIP_PLAY - : TOOLTIP_PAUSE); -} - -/** @private */ -void -stop_button_clicked_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - gtk_vlc_player_stop(GTK_VLC_PLAYER(widget)); - button_image_set_from_stock(GTK_BUTTON(playpause_button), - GTK_STOCK_MEDIA_PLAY); - gtk_widget_set_tooltip_text(playpause_button, TOOLTIP_PLAY); -} - -/** @private */ -void -file_menu_openmovie_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - GtkWidget *dialog; - - dialog = gtk_file_chooser_dialog_new("Open Video...", GTK_WINDOW(widget), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - gchar *file; - - file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - if (!load_media_file(file)) { - /* TODO */ - } - refresh_quickopen_menu(GTK_MENU(quickopen_menu)); - - g_free(file); - } - - gtk_widget_destroy(dialog); -} - -/** @private */ -void -file_menu_opentranscript_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - GtkWidget *dialog; - - dialog = gtk_file_chooser_dialog_new("Open Transcript...", GTK_WINDOW(widget), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - gchar *file; - - file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - - if (!load_transcript_file(file)) { - /* TODO */ - } - refresh_quickopen_menu(GTK_MENU(quickopen_menu)); - - g_free(file); - } - - gtk_widget_destroy(dialog); -} - -/** @private */ -void -help_menu_manual_item_activate_cb(GtkWidget *widget __attribute__((unused)), - gpointer data __attribute__((unused))) -{ - GError *error = NULL; - gboolean res; - -#ifdef HAVE_WINDOWS_H - res = (int)ShellExecute(NULL, "open", HELP_URI, - NULL, NULL, SW_SHOWNORMAL) > 32; - if (!res) - error = g_error_new(EXPERIMENT_PLAYER_ERROR, - EXPERIMENT_PLAYER_ERROR_OPEN, - "Cannot open \"%s\"!", HELP_URI); -#else - res = gtk_show_uri(NULL, HELP_URI, GDK_CURRENT_TIME, &error); -#endif - - if (!res) { - show_message_dialog_gerror(error); - g_error_free(error); - } -} - -/** @private */ -gboolean -player_window_delete_event_cb(GtkWidget *widget __attribute__((unused)), - GdkEvent *event __attribute__((unused)), - gpointer user_data __attribute__((unused))) -{ - gtk_main_quit(); - - /* do not destroy window (yet) */ - return TRUE; -} - -/** @private */ -void -navigator_widget_time_selected_cb(GtkWidget *widget, gint64 selected_time, - gpointer user_data __attribute__((unused))) -{ - gtk_vlc_player_seek(GTK_VLC_PLAYER(widget), selected_time); -} - -/** @private */ -void -navigator_widget_section_activated_cb(GtkWidget *widget __attribute__((unused)), - gint64 start, gint64 end, - gpointer user_data __attribute__((unused))) -{ - GtkExperimentTranscript *transcript_wizard = - GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget); - GtkExperimentTranscript *transcript_proband = - GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget); - - gtk_experiment_transcript_set_backdrop_area(transcript_wizard, - start, end); - gtk_experiment_transcript_set_backdrop_area(transcript_proband, - start, end); -} - -/** @private */ -gboolean -navigator_widget_generic_focus_event_cb(GtkWidget *widget __attribute__((unused)), - GdkEventFocus *event, - gpointer user_data __attribute__((unused))) -{ - GtkExperimentTranscript *transcript_wizard = - GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget); - GtkExperimentTranscript *transcript_proband = - GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget); - - gtk_experiment_transcript_set_use_backdrop_area(transcript_wizard, - event->in == TRUE); - gtk_experiment_transcript_set_use_backdrop_area(transcript_proband, - event->in == TRUE); - - return TRUE; -} - -/** @private */ -void -generic_quit_cb(GtkWidget *widget __attribute__((unused)), - gpointer data __attribute__((unused))) -{ - gtk_main_quit(); -} - -static inline void -button_image_set_from_stock(GtkButton *widget, const gchar *name) -{ - GtkWidget *image = gtk_bin_get_child(GTK_BIN(widget)); - - gtk_image_set_from_stock(GTK_IMAGE(image), name, - GTK_ICON_SIZE_SMALL_TOOLBAR); -} - -gboolean -load_media_file(const gchar *file) -{ - if (!gtk_vlc_player_load_filename(GTK_VLC_PLAYER(player_widget), file)) - return FALSE; - - g_free(current_filename); - current_filename = g_strdup(file); - - gtk_widget_set_sensitive(controls_hbox, TRUE); - - button_image_set_from_stock(GTK_BUTTON(playpause_button), - GTK_STOCK_MEDIA_PLAY); - gtk_widget_set_tooltip_text(playpause_button, TOOLTIP_PLAY); - - return TRUE; -} - -gboolean -load_transcript_file(const gchar *file) -{ - ExperimentReader *reader; - gboolean res; - - reader = experiment_reader_new(file); - if (reader == NULL) - return FALSE; - - res = gtk_experiment_transcript_load(GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget), - reader); - if (!res) { - g_object_unref(G_OBJECT(reader)); - return FALSE; - } - - res = gtk_experiment_transcript_load(GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget), - reader); - if (!res) { - g_object_unref(G_OBJECT(reader)); - return FALSE; - } - - res = gtk_experiment_navigator_load(GTK_EXPERIMENT_NAVIGATOR(navigator_widget), - reader); - if (!res) { - g_object_unref(G_OBJECT(reader)); - return FALSE; - } - - g_object_unref(reader); - - gtk_widget_set_sensitive(transcript_table, TRUE); - gtk_widget_set_sensitive(navigator_scrolledwindow, TRUE); - - return TRUE; -} - -void -show_message_dialog_gerror(GError *err) -{ - GtkWidget *dialog; - - if (err == NULL) - return; - - dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, - "%s", err->message); - gtk_window_set_title(GTK_WINDOW(dialog), "Error"); - - gtk_dialog_run(GTK_DIALOG(dialog)); - - gtk_widget_destroy(dialog); -} - -const gchar * -window_get_geometry(GtkWindow *window) -{ - static gchar geometry[255]; - gint width, height, x, y; - - gtk_window_get_size(window, &width, &height); - gtk_window_get_position(window, &x, &y); - g_snprintf(geometry, sizeof(geometry), "%dx%d+%d+%d", - width, height, x, y); - - return geometry; -} - -void -window_set_state(GtkWindow *window, GdkWindowState state) -{ - /* the GDK_WINDOW_STATE_WITHDRAWN flag is ignored */ - - if (state & GDK_WINDOW_STATE_ICONIFIED) - gtk_window_iconify(window); - else - gtk_window_deiconify(window); - - if (state & GDK_WINDOW_STATE_MAXIMIZED) - gtk_window_maximize(window); - else - gtk_window_unmaximize(window); - - if (state & GDK_WINDOW_STATE_STICKY) - gtk_window_stick(window); - else - gtk_window_unstick(window); - - if (state & GDK_WINDOW_STATE_FULLSCREEN) - gtk_window_fullscreen(window); - else - gtk_window_unfullscreen(window); - - if (state & GDK_WINDOW_STATE_ICONIFIED) - gtk_window_iconify(window); - else - gtk_window_deiconify(window); - - gtk_window_set_keep_above(window, state & GDK_WINDOW_STATE_ABOVE); - gtk_window_set_keep_below(window, state & GDK_WINDOW_STATE_BELOW); -} - -/** @private */ -int -main(int argc, char *argv[]) -{ - GtkBuilder *builder; - GtkExperimentTranscript *transcript_wizard, *transcript_proband; - - GtkAdjustment *adj; - PangoFontDescription *font_desc; - gboolean reverse; - PangoAlignment alignment; - GdkColor color; - GtkRcStyle *modified_style; - - /* FIXME: support internationalization instead of enforcing English */ -#ifdef G_OS_WIN32 - g_setenv("LC_ALL", "English", TRUE); -#else - g_setenv("LC_ALL", "en", TRUE); -#endif - setlocale(LC_ALL, ""); - - /* init threads */ - g_thread_init(NULL); - gdk_threads_init(); - - gtk_init(&argc, &argv); - g_set_prgname(PACKAGE_NAME); - - config_init_key_file(); - - builder = gtk_builder_new(); - - gtk_builder_add_from_file(builder, DEFAULT_UI, NULL); - gtk_builder_connect_signals(builder, NULL); - - BUILDER_INIT(builder, player_window); - BUILDER_INIT(builder, info_window); - BUILDER_INIT(builder, about_dialog); - - BUILDER_INIT(builder, player_widget); - BUILDER_INIT(builder, controls_hbox); - BUILDER_INIT(builder, scale_widget); - BUILDER_INIT(builder, playpause_button); - BUILDER_INIT(builder, volume_button); - - BUILDER_INIT(builder, player_window_statusbar); - - BUILDER_INIT(builder, quickopen_menu); - BUILDER_INIT(builder, quickopen_menu_empty_item); - - BUILDER_INIT(builder, transcript_table); - BUILDER_INIT(builder, transcript_wizard_widget); - transcript_wizard = GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget); - BUILDER_INIT(builder, transcript_proband_widget); - transcript_proband = GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget); - BUILDER_INIT(builder, transcript_scroll_widget); - - BUILDER_INIT(builder, transcript_wizard_combo); - BUILDER_INIT(builder, transcript_proband_combo); - BUILDER_INIT(builder, transcript_wizard_entry_check); - BUILDER_INIT(builder, transcript_proband_entry_check); - - BUILDER_INIT(builder, navigator_scrolledwindow); - BUILDER_INIT(builder, navigator_widget); - - g_object_unref(G_OBJECT(builder)); - - /* configure about dialog */ - gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(about_dialog), - PACKAGE_NAME); - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog), - PACKAGE_VERSION); - gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog), - PACKAGE_URL); - - /** @todo most of this could be done in Glade with proper catalog files */ - /* connect timeline, volume button and other widgets with player widget */ - adj = gtk_vlc_player_get_time_adjustment(GTK_VLC_PLAYER(player_widget)); - gtk_range_set_adjustment(GTK_RANGE(scale_widget), adj); - gtk_experiment_transcript_set_time_adjustment(GTK_EXPERIMENT_TRANSCRIPT(transcript_wizard_widget), - adj); - gtk_experiment_transcript_set_time_adjustment(GTK_EXPERIMENT_TRANSCRIPT(transcript_proband_widget), - adj); - gtk_range_set_adjustment(GTK_RANGE(transcript_scroll_widget), adj); - - adj = gtk_vlc_player_get_volume_adjustment(GTK_VLC_PLAYER(player_widget)); - gtk_scale_button_set_adjustment(GTK_SCALE_BUTTON(volume_button), adj); - - /* - * configure transcript widgets - */ - transcript_wizard->speaker = g_strdup(SPEAKER_WIZARD); - font_desc = config_get_transcript_font(SPEAKER_WIZARD); - if (font_desc != NULL) { - gtk_widget_modify_font(transcript_wizard_widget, font_desc); - pango_font_description_free(font_desc); - } - if (config_get_transcript_text_color(SPEAKER_WIZARD, &color)) - gtk_widget_modify_text(transcript_wizard_widget, - GTK_STATE_NORMAL, &color); - if (config_get_transcript_bg_color(SPEAKER_WIZARD, &color)) - gtk_widget_modify_bg(transcript_wizard_widget, - GTK_STATE_NORMAL, &color); - - reverse = config_get_transcript_reverse_mode(SPEAKER_WIZARD); - gtk_experiment_transcript_set_reverse_mode(transcript_wizard, reverse); - - alignment = config_get_transcript_alignment(SPEAKER_WIZARD); - gtk_experiment_transcript_set_alignment(transcript_wizard, alignment); - - transcript_wizard->interactive_format.default_font = - config_get_transcript_default_format_font(SPEAKER_WIZARD); - if (config_get_transcript_default_format_text_color(SPEAKER_WIZARD, &color)) - transcript_wizard->interactive_format.default_text_color = gdk_color_copy(&color); - if (config_get_transcript_default_format_bg_color(SPEAKER_WIZARD, &color)) - transcript_wizard->interactive_format.default_bg_color = gdk_color_copy(&color); - - transcript_proband->speaker = g_strdup(SPEAKER_PROBAND); - font_desc = config_get_transcript_font(SPEAKER_PROBAND); - if (font_desc != NULL) { - gtk_widget_modify_font(transcript_proband_widget, font_desc); - pango_font_description_free(font_desc); - } - if (config_get_transcript_text_color(SPEAKER_PROBAND, &color)) - gtk_widget_modify_text(transcript_proband_widget, - GTK_STATE_NORMAL, &color); - if (config_get_transcript_bg_color(SPEAKER_PROBAND, &color)) - gtk_widget_modify_bg(transcript_proband_widget, - GTK_STATE_NORMAL, &color); - - reverse = config_get_transcript_reverse_mode(SPEAKER_PROBAND); - gtk_experiment_transcript_set_reverse_mode(transcript_proband, reverse); - - alignment = config_get_transcript_alignment(SPEAKER_PROBAND); - gtk_experiment_transcript_set_alignment(transcript_proband, alignment); - - transcript_proband->interactive_format.default_font = - config_get_transcript_default_format_font(SPEAKER_PROBAND); - if (config_get_transcript_default_format_text_color(SPEAKER_PROBAND, &color)) - transcript_proband->interactive_format.default_text_color = gdk_color_copy(&color); - if (config_get_transcript_default_format_bg_color(SPEAKER_PROBAND, &color)) - transcript_proband->interactive_format.default_bg_color = gdk_color_copy(&color); - - format_selection_init(); - - refresh_quickopen_menu(GTK_MENU(quickopen_menu)); - - /* configure windows */ - gtk_window_set_gravity(GTK_WINDOW(player_window), GDK_GRAVITY_STATIC); - gtk_window_set_gravity(GTK_WINDOW(info_window), GDK_GRAVITY_STATIC); - - if (config_get_save_window_properties()) { - gchar *geometry; - - geometry = config_get_window_geometry("Player"); - if (geometry != NULL) - gtk_window_parse_geometry(GTK_WINDOW(player_window), - geometry); - g_free(geometry); - - window_set_state(GTK_WINDOW(player_window), - config_get_window_state("Player")); - - geometry = config_get_window_geometry("Info"); - if (geometry != NULL) - gtk_window_parse_geometry(GTK_WINDOW(info_window), - geometry); - g_free(geometry); - - window_set_state(GTK_WINDOW(info_window), - config_get_window_state("Info")); - } - - gtk_widget_show(player_window); - gtk_widget_show(info_window); - - gdk_threads_enter(); - gtk_main(); - gdk_threads_leave(); - - /* - * update config file - */ - if (config_get_save_window_properties()) { - const gchar *geometry; - GdkWindowState state; - - geometry = window_get_geometry(GTK_WINDOW(player_window)); - config_set_window_geometry("Player", geometry); - - state = gdk_window_get_state(gtk_widget_get_window(player_window)); - config_set_window_state("Player", state); - - geometry = window_get_geometry(GTK_WINDOW(info_window)); - config_set_window_geometry("Info", geometry); - - state = gdk_window_get_state(gtk_widget_get_window(info_window)); - config_set_window_state("Info", state); - } - - modified_style = gtk_widget_get_modifier_style(transcript_wizard_widget); - config_set_transcript_font(SPEAKER_WIZARD, modified_style->font_desc); - config_set_transcript_text_color(SPEAKER_WIZARD, - modified_style->color_flags[GTK_STATE_NORMAL] & GTK_RC_TEXT - ? &modified_style->text[GTK_STATE_NORMAL] - : NULL); - config_set_transcript_bg_color(SPEAKER_WIZARD, - modified_style->color_flags[GTK_STATE_NORMAL] & GTK_RC_BG - ? &modified_style->bg[GTK_STATE_NORMAL] - : NULL); - g_object_unref(modified_style); - - reverse = gtk_experiment_transcript_get_reverse_mode(transcript_wizard); - config_set_transcript_reverse_mode(SPEAKER_WIZARD, reverse); - - alignment = gtk_experiment_transcript_get_alignment(transcript_wizard); - config_set_transcript_alignment(SPEAKER_WIZARD, alignment); - - config_set_transcript_default_format_font(SPEAKER_WIZARD, - transcript_wizard->interactive_format.default_font); - config_set_transcript_default_format_text_color(SPEAKER_WIZARD, - transcript_wizard->interactive_format.default_text_color); - config_set_transcript_default_format_bg_color(SPEAKER_WIZARD, - transcript_wizard->interactive_format.default_bg_color); - - modified_style = gtk_widget_get_modifier_style(transcript_proband_widget); - config_set_transcript_font(SPEAKER_PROBAND, modified_style->font_desc); - config_set_transcript_text_color(SPEAKER_PROBAND, - modified_style->color_flags[GTK_STATE_NORMAL] & GTK_RC_TEXT - ? &modified_style->text[GTK_STATE_NORMAL] - : NULL); - config_set_transcript_bg_color(SPEAKER_PROBAND, - modified_style->color_flags[GTK_STATE_NORMAL] & GTK_RC_BG - ? &modified_style->bg[GTK_STATE_NORMAL] - : NULL); - g_object_unref(modified_style); - - reverse = gtk_experiment_transcript_get_reverse_mode(transcript_proband); - config_set_transcript_reverse_mode(SPEAKER_PROBAND, reverse); - - alignment = gtk_experiment_transcript_get_alignment(transcript_proband); - config_set_transcript_alignment(SPEAKER_PROBAND, alignment); - - config_set_transcript_default_format_font(SPEAKER_PROBAND, - transcript_proband->interactive_format.default_font); - config_set_transcript_default_format_text_color(SPEAKER_PROBAND, - transcript_proband->interactive_format.default_text_color); - config_set_transcript_default_format_bg_color(SPEAKER_PROBAND, - transcript_proband->interactive_format.default_bg_color); - - config_save_key_file(); - - /* destroy all widgets (clean up) */ - gtk_widget_destroy(player_window); - /** - * @bug some g_object_unref during transcript widget destruction - * results in assertions - */ - gtk_widget_destroy(info_window); - - return 0; -}
\ No newline at end of file diff --git a/src/quick-open.c b/src/quick-open.c deleted file mode 100644 index b978dac..0000000 --- a/src/quick-open.c +++ /dev/null @@ -1,264 +0,0 @@ -/** - * @file - * Functions for handling the "Quick Open" menu - */ - -/* - * Copyright (C) 2012-2013 Otto-von-Guericke-Universität Magdeburg - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <assert.h> -#include <string.h> -#include <unistd.h> - -#include <glib.h> -#include <glib/gprintf.h> -#include <glib/gstdio.h> - -#include <gtk/gtk.h> - -#include "experiment-player.h" - -static inline gboolean quickopen_filter(const gchar *name); -static gint quickopen_item_cmp(gconstpointer a, gconstpointer b); - -static void reconfigure_all_check_menu_items_cb(GtkWidget *widget, gpointer user_data); -static void quickopen_item_on_activate(GtkWidget *widget, gpointer user_data); - -GtkWidget *quickopen_menu, - *quickopen_menu_empty_item; - -/* - * GtkBuilder signal callbacks - * NOTE: for some strange reason the parameters are switched - */ - -/** @private */ -void -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) { - 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)); - } - - gtk_widget_destroy(dialog); -} - -/** @todo refresh item unnecessary, rebuild menu when it is opened */ -/** @private */ -void -quickopen_menu_refresh_item_activate_cb(GtkWidget *widget, - gpointer data __attribute__((unused))) -{ - refresh_quickopen_menu(GTK_MENU(widget)); -} - -static inline gboolean -quickopen_filter(const gchar *name) -{ - static GPatternSpec **patterns = NULL; - - guint name_length = strlen(name); - gchar *name_reversed = g_strreverse(g_strdup(name)); - - gchar *quickopen_directory; - gchar *trans_name, *p; - gboolean res = FALSE; - - if (patterns == NULL) { - patterns = (GPatternSpec **) - g_strsplit(EXPERIMENT_MOVIE_FILTER, ";", 0); - - for (GPatternSpec **filter = patterns; *filter != NULL; filter++) { - GPatternSpec *pattern; - - pattern = g_pattern_spec_new((gchar *)*filter); - g_free(*filter); - *filter = pattern; - } - } - - for (GPatternSpec **pattern = patterns; *pattern != NULL; pattern++) { - res = g_pattern_match(*pattern, name_length, - name, name_reversed); - if (res) - break; - } - g_free(name_reversed); - 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) { - g_free(trans_name); - return FALSE; - } - g_stpcpy(++p, EXPERIMENT_TRANSCRIPT_EXT); - - res = !g_access(trans_name, F_OK | R_OK); - g_free(trans_name); - - return res; -} - -static gint -quickopen_item_cmp(gconstpointer a, gconstpointer b) -{ - return -g_strcmp0(gtk_menu_item_get_label(*(GtkMenuItem **)a), - gtk_menu_item_get_label(*(GtkMenuItem **)b)); -} - -void -refresh_quickopen_menu(GtkMenu *menu) -{ - static gchar **fullnames = NULL; - static GPtrArray *items = NULL; - - int fullnames_n; - - gchar *quickopen_directory; - GDir *dir; - const gchar *name; - - if (items != NULL) - g_ptr_array_free(items, TRUE); - items = g_ptr_array_new_with_free_func((GDestroyNotify)gtk_widget_destroy); - - g_strfreev(fullnames); - 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) { - if (!quickopen_filter(name)) - continue; - - gchar *itemname; - GtkWidget *item; - - fullnames = g_realloc(fullnames, (fullnames_n+2) * sizeof(gchar *)); - fullnames[fullnames_n] = g_build_filename(quickopen_directory, - name, NULL); - - itemname = path_strip_extension(name); - item = gtk_check_menu_item_new_with_label(itemname); - g_ptr_array_add(items, item); - g_free(itemname); - - gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), - TRUE); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), - !g_strcmp0(current_filename, - fullnames[fullnames_n])); - - g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(quickopen_item_on_activate), - fullnames[fullnames_n]); - - fullnames_n++; - } - if (fullnames != NULL) - fullnames[fullnames_n] = NULL; - 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)); - - gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - } - - gtk_widget_set_visible(quickopen_menu_empty_item, !fullnames_n); -} - -static void -reconfigure_all_check_menu_items_cb(GtkWidget *widget, gpointer user_data) -{ - if (!GTK_IS_CHECK_MENU_ITEM(widget)) - return; - - g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, - quickopen_item_on_activate, NULL); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget), - widget == GTK_WIDGET(user_data)); - g_signal_handlers_unblock_matched(widget, G_SIGNAL_MATCH_FUNC, - 0, 0, NULL, - quickopen_item_on_activate, NULL); -} - -static void -quickopen_item_on_activate(GtkWidget *widget, gpointer user_data) -{ - const gchar *filename = (const gchar *)user_data; - gchar *trans_name, *p; - - gtk_container_foreach(GTK_CONTAINER(quickopen_menu), - reconfigure_all_check_menu_items_cb, widget); - - if (!load_media_file(filename)) { - /* FIXME */ - } - - trans_name = g_strdup(filename); - trans_name = g_realloc(trans_name, strlen(trans_name) + - sizeof(EXPERIMENT_TRANSCRIPT_EXT)); - if ((p = g_strrstr(trans_name, ".")) == NULL) { - g_free(trans_name); - /* FIXME */ - return; - } - g_stpcpy(++p, EXPERIMENT_TRANSCRIPT_EXT); - - if (!load_transcript_file(trans_name)) { - /* FIXME */ - } - - g_free(trans_name); -} |