aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Haberkorn <robin.haberkorn@googlemail.com>2012-05-18 20:36:12 +0200
committerRobin Haberkorn <robin.haberkorn@googlemail.com>2012-05-30 15:56:14 +0200
commita42d1ef7ae9bf4d4c3c60b7a9de0abe5a1649309 (patch)
tree5f1afd155b19fe8e7e69cb8aee2fd01ebdb9a48d
parent316604edcc9908b5e6acc4dc9835cba08675cd27 (diff)
downloadgtk-vlc-player-a42d1ef7ae9bf4d4c3c60b7a9de0abe5a1649309.tar.gz
fixed adjustment handling in gtk-vlc-player
* reconfigure on set_adjustment() * disconnect signal handlers on dispose()
-rw-r--r--configure.ac14
-rw-r--r--lib/gtk-vlc-player/gtk-vlc-player.c96
-rw-r--r--lib/gtk-vlc-player/gtk-vlc-player.h2
3 files changed, 97 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac
index 81fc409..c8821b1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,7 @@ PKG_CHECK_EXISTS([gladeui-1.0],
if [[ x$glade3_catalogsdir = x ]]; then
AC_MSG_WARN([Glade-3 catalog directory not found, installing Gtk+ widget catalogs into custom directories!])
fi
+# TODO: with-option to overwrite the catalogsdir
gtk_experiment_widgets_catalogsdir=${glade3_catalogsdir:-$player_datadir/catalogs}
AC_SUBST(gtk_experiment_widgets_catalogsdir)
gtk_vlc_player_catalogsdir=${glade3_catalogsdir:-$gtk_vlc_player_datadir/catalogs}
@@ -211,12 +212,15 @@ AC_SUBST(GTKAPP_CFLAGS)
AC_SUBST(GTKAPP_LDFLAGS)
# Some constants
-AC_DEFINE(GTK_VLC_PLAYER_ADJ_STEP, [1000.], [VLC Player time adjustment step increment])
-AC_DEFINE(GTK_VLC_PLAYER_ADJ_PAGE, [30000.], [VLC Player time adjustment page increment])
+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])
-AC_DEFINE(DEFAULT_QUICKOPEN_DIR, ["."], [Default directory for listing experiments])
-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(GTK_VLC_PLAYER_VOL_ADJ_STEP, [0.02], [VLC Player volume adjustment step increment])
+AC_DEFINE(GTK_VLC_PLAYER_VOL_ADJ_PAGE, [0.], [VLC Player volume adjustment page increment])
+
+AC_DEFINE(DEFAULT_QUICKOPEN_DIR, ["."], [Default directory for listing experiments])
+AC_DEFINE(EXPERIMENT_MOVIE_FILTER, ["*.mp4;*.avi"], [Filters for (quick) opening movies])
+AC_DEFINE(EXPERIMENT_TRANSCRIPT_EXT, ["xml"], [File extension of experiment transcripts])
AC_CONFIG_FILES([Makefile lib/Makefile src/Makefile])
AC_CONFIG_FILES([lib/gtk-vlc-player/Makefile])
diff --git a/lib/gtk-vlc-player/gtk-vlc-player.c b/lib/gtk-vlc-player/gtk-vlc-player.c
index ad64569..4f60ec8 100644
--- a/lib/gtk-vlc-player/gtk-vlc-player.c
+++ b/lib/gtk-vlc-player/gtk-vlc-player.c
@@ -34,6 +34,7 @@ static void widget_on_realize(GtkWidget *widget, gpointer data);
static gboolean widget_on_click(GtkWidget *widget, GdkEventButton *event, gpointer data);
static void time_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data);
+static void time_adj_on_changed(GtkAdjustment *adj, gpointer user_data);
static void vol_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data);
static inline void update_time(GtkVlcPlayer *player, gint64 new_time);
@@ -60,6 +61,7 @@ static void vlc_player_load_media(GtkVlcPlayer *player, libvlc_media_t *media);
struct _GtkVlcPlayerPrivate {
GtkObject *time_adjustment;
gulong time_adj_on_value_changed_id;
+ gulong time_adj_on_changed_id;
GtkObject *volume_adjustment;
gulong vol_adj_on_value_changed_id;
@@ -147,16 +149,23 @@ gtk_vlc_player_init(GtkVlcPlayer *klass)
*/
klass->priv->time_adjustment = gtk_adjustment_new(0., 0., 0.,
- GTK_VLC_PLAYER_ADJ_STEP,
- GTK_VLC_PLAYER_ADJ_PAGE, 0.);
+ GTK_VLC_PLAYER_TIME_ADJ_STEP,
+ GTK_VLC_PLAYER_TIME_ADJ_PAGE,
+ 0.);
g_object_ref_sink(klass->priv->time_adjustment);
klass->priv->time_adj_on_value_changed_id =
g_signal_connect(G_OBJECT(klass->priv->time_adjustment),
"value-changed",
G_CALLBACK(time_adj_on_value_changed), klass);
+ klass->priv->time_adj_on_changed_id =
+ g_signal_connect(G_OBJECT(klass->priv->time_adjustment),
+ "changed",
+ G_CALLBACK(time_adj_on_changed), klass);
klass->priv->volume_adjustment = gtk_adjustment_new(1., 0., 1.,
- 0.02, 0., 0.);
+ GTK_VLC_PLAYER_VOL_ADJ_STEP,
+ GTK_VLC_PLAYER_VOL_ADJ_PAGE,
+ 0.);
g_object_ref_sink(klass->priv->volume_adjustment);
klass->priv->vol_adj_on_value_changed_id =
g_signal_connect(G_OBJECT(klass->priv->volume_adjustment),
@@ -188,8 +197,20 @@ gtk_vlc_player_dispose(GObject *gobject)
* destroy might be called more than once, but we have only one
* reference for each object
*/
- GOBJECT_UNREF_SAFE(player->priv->time_adjustment);
- GOBJECT_UNREF_SAFE(player->priv->volume_adjustment);
+ if (player->priv->time_adjustment != NULL) {
+ g_signal_handler_disconnect(G_OBJECT(player->priv->time_adjustment),
+ player->priv->time_adj_on_changed_id);
+ g_signal_handler_disconnect(G_OBJECT(player->priv->time_adjustment),
+ player->priv->time_adj_on_value_changed_id);
+ g_object_unref(player->priv->time_adjustment);
+ player->priv->time_adjustment = NULL;
+ }
+ if (player->priv->volume_adjustment != NULL) {
+ g_signal_handler_disconnect(G_OBJECT(player->priv->volume_adjustment),
+ player->priv->vol_adj_on_value_changed_id);
+ g_object_unref(player->priv->volume_adjustment);
+ player->priv->volume_adjustment = NULL;
+ }
GOBJECT_UNREF_SAFE(player->priv->fullscreen_window);
/* Chain up to the parent class */
@@ -266,6 +287,20 @@ time_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data)
}
static void
+time_adj_on_changed(GtkAdjustment *adj, gpointer user_data)
+{
+ GtkVlcPlayer *player = GTK_VLC_PLAYER(user_data);
+
+ /* avoid signal handler recursion */
+ g_signal_handler_block(G_OBJECT(adj),
+ player->priv->time_adj_on_changed_id);
+ gtk_adjustment_set_upper(adj, (gdouble)gtk_vlc_player_get_length(player) +
+ gtk_adjustment_get_page_size(adj));
+ g_signal_handler_unblock(G_OBJECT(adj),
+ player->priv->time_adj_on_changed_id);
+}
+
+static void
vol_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data)
{
gtk_vlc_player_set_volume(GTK_VLC_PLAYER(user_data),
@@ -295,9 +330,17 @@ update_length(GtkVlcPlayer *player, gint64 new_length)
g_signal_emit(player, gtk_vlc_player_signals[LENGTH_CHANGED_SIGNAL], 0,
new_length);
- if (player->priv->time_adjustment != NULL)
- gtk_adjustment_set_upper(GTK_ADJUSTMENT(player->priv->time_adjustment),
- (gdouble)new_length);
+ if (player->priv->time_adjustment != NULL) {
+ GtkAdjustment *adj = GTK_ADJUSTMENT(player->priv->time_adjustment);
+
+ /* ensure that time_adj_on_changed() will not be executed */
+ g_signal_handler_block(G_OBJECT(adj),
+ player->priv->time_adj_on_changed_id);
+ gtk_adjustment_set_upper(adj, (gdouble)new_length +
+ gtk_adjustment_get_page_size(adj));
+ g_signal_handler_unblock(G_OBJECT(adj),
+ player->priv->time_adj_on_changed_id);
+ }
}
static void
@@ -499,6 +542,18 @@ gtk_vlc_player_set_volume(GtkVlcPlayer *player, gdouble volume)
}
/**
+ * @brief Get media length
+ *
+ * @param player \e GtkVlcPlayer instance
+ * @return Length of media (in milliseconds)
+ */
+gint64
+gtk_vlc_player_get_length(GtkVlcPlayer *player)
+{
+ return (gint64)libvlc_media_player_get_length(player->priv->media_player);
+}
+
+/**
* @brief Get time-adjustment currently used by \e GtkVlcPlayer
* The time-adjustment is an alternative to signal-callbacks and using the API
* for synchronizing the \e GtkVlcPlayer widget's current playback position with
@@ -540,17 +595,33 @@ gtk_vlc_player_set_time_adjustment(GtkVlcPlayer *player, GtkAdjustment *adj)
return;
g_signal_handler_disconnect(G_OBJECT(player->priv->time_adjustment),
+ player->priv->time_adj_on_changed_id);
+ g_signal_handler_disconnect(G_OBJECT(player->priv->time_adjustment),
player->priv->time_adj_on_value_changed_id);
g_object_unref(player->priv->time_adjustment);
player->priv->time_adjustment = GTK_OBJECT(adj);
g_object_ref_sink(player->priv->time_adjustment);
- /** @todo Configure new time-adjustment */
+
+ /*
+ * NOTE: not setting value and upper properly, as well as setting the
+ * page-size might cause problems if adjustment is set after loading/playing
+ * a media or setting it on other widgets
+ */
+ gtk_adjustment_configure(GTK_ADJUSTMENT(player->priv->time_adjustment),
+ 0., 0., 0.,
+ GTK_VLC_PLAYER_TIME_ADJ_STEP,
+ GTK_VLC_PLAYER_TIME_ADJ_PAGE,
+ 0.);
player->priv->time_adj_on_value_changed_id =
g_signal_connect(G_OBJECT(player->priv->time_adjustment),
"value-changed",
G_CALLBACK(time_adj_on_value_changed), player);
+ player->priv->time_adj_on_changed_id =
+ g_signal_connect(G_OBJECT(player->priv->time_adjustment),
+ "changed",
+ G_CALLBACK(time_adj_on_changed), player);
}
/**
@@ -602,7 +673,12 @@ gtk_vlc_player_set_volume_adjustment(GtkVlcPlayer *player, GtkAdjustment *adj)
g_object_unref(player->priv->volume_adjustment);
player->priv->volume_adjustment = GTK_OBJECT(adj);
g_object_ref_sink(player->priv->volume_adjustment);
- /** @todo Configure new volume-adjustment */
+
+ gtk_adjustment_configure(GTK_ADJUSTMENT(player->priv->volume_adjustment),
+ 1., 0., 1.,
+ GTK_VLC_PLAYER_VOL_ADJ_STEP,
+ GTK_VLC_PLAYER_VOL_ADJ_PAGE,
+ 0.);
player->priv->vol_adj_on_value_changed_id =
g_signal_connect(G_OBJECT(player->priv->volume_adjustment),
diff --git a/lib/gtk-vlc-player/gtk-vlc-player.h b/lib/gtk-vlc-player/gtk-vlc-player.h
index b107484..84ef3cc 100644
--- a/lib/gtk-vlc-player/gtk-vlc-player.h
+++ b/lib/gtk-vlc-player/gtk-vlc-player.h
@@ -89,6 +89,8 @@ void gtk_vlc_player_stop(GtkVlcPlayer *player);
void gtk_vlc_player_seek(GtkVlcPlayer *player, gint64 time);
void gtk_vlc_player_set_volume(GtkVlcPlayer *player, gdouble volume);
+gint64 gtk_vlc_player_get_length(GtkVlcPlayer *player);
+
GtkAdjustment *gtk_vlc_player_get_time_adjustment(GtkVlcPlayer *player);
void gtk_vlc_player_set_time_adjustment(GtkVlcPlayer *player, GtkAdjustment *adj);