diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-05-06 17:30:26 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2012-05-06 17:30:26 +0200 |
commit | f72c61e0a3afc364ab6f60e42f2d7e0ff5574a3c (patch) | |
tree | 8bc2ff56000ff611a23489255e6b16e4eb05b38d /lib | |
parent | 3874830ea6c953fc29ef6286c1808b0e29b552aa (diff) | |
download | gtk-vlc-player-f72c61e0a3afc364ab6f60e42f2d7e0ff5574a3c.tar.gz |
adjustment support for the gtk-vlc-player plugin
gtk-vlc-player may be connected to scale widgets (and later on the transcript widget) using GtkAdjustments
* the main program has been updated accordingly
* the main program also updates the "play" button now
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gtk-vlc-player/gtk-vlc-player.c | 89 | ||||
-rw-r--r-- | lib/gtk-vlc-player/gtk-vlc-player.h | 5 |
2 files changed, 71 insertions, 23 deletions
diff --git a/lib/gtk-vlc-player/gtk-vlc-player.c b/lib/gtk-vlc-player/gtk-vlc-player.c index 81a3859..8686eef 100644 --- a/lib/gtk-vlc-player/gtk-vlc-player.c +++ b/lib/gtk-vlc-player/gtk-vlc-player.c @@ -21,6 +21,11 @@ static void gtk_vlc_player_init(GtkVlcPlayer *klass); 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 inline void update_time(GtkVlcPlayer *player, gint64 new_time); +static inline void update_length(GtkVlcPlayer *player, gint64 new_length); + static void vlc_time_changed(const struct libvlc_event_t *event, void *userdata); static void vlc_length_changed(const struct libvlc_event_t *event, void *userdata); @@ -62,16 +67,6 @@ static guint gtk_vlc_player_signals[LAST_SIGNAL] = {0, 0}; static void gtk_vlc_player_class_init(GtkVlcPlayerClass *klass) { -#if 0 - gtk_vlc_player_signals[CLICKED_SIGNAL] = - g_signal_new("clicked", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET(GtkVlcPlayerClass, clicked), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); -#endif - gtk_vlc_player_signals[TIME_CHANGED_SIGNAL] = g_signal_new("time-changed", G_TYPE_FROM_CLASS(klass), @@ -113,6 +108,13 @@ gtk_vlc_player_init(GtkVlcPlayer *klass) g_signal_connect(G_OBJECT(drawing_area), "button-press-event", G_CALLBACK(widget_on_click), klass); + klass->time_adjustment = gtk_adjustment_new(0., 0., 0., + GTK_VLC_PLAYER_ADJ_STEP, + GTK_VLC_PLAYER_ADJ_PAGE, 0.); + klass->time_adj_on_value_changed_id = + g_signal_connect(G_OBJECT(klass->time_adjustment), "value-changed", + G_CALLBACK(time_adj_on_value_changed), klass); + klass->vlc_inst = libvlc_new(0, NULL); klass->media_player = libvlc_media_player_new(klass->vlc_inst); @@ -170,31 +172,59 @@ widget_on_click(GtkWidget *widget, GdkEventButton *event, gpointer user_data) return TRUE; } +static void +time_adj_on_value_changed(GtkAdjustment *adj, gpointer user_data) +{ + gtk_vlc_player_seek(GTK_VLC_PLAYER(user_data), + (gint64)gtk_adjustment_get_value(adj)); +} + +static inline void +update_time(GtkVlcPlayer *player, gint64 new_time) +{ + g_signal_emit(player, gtk_vlc_player_signals[TIME_CHANGED_SIGNAL], 0, + new_time); + + /* ensure that time_adj_on_value_changed() will not be executed */ + g_signal_handler_block(G_OBJECT(player->time_adjustment), + player->time_adj_on_value_changed_id); + gtk_adjustment_set_value(GTK_ADJUSTMENT(player->time_adjustment), + (gdouble)new_time); + g_signal_handler_unblock(G_OBJECT(player->time_adjustment), + player->time_adj_on_value_changed_id); +} + +static inline void +update_length(GtkVlcPlayer *player, gint64 new_length) +{ + g_signal_emit(player, gtk_vlc_player_signals[LENGTH_CHANGED_SIGNAL], 0, + new_length); + + gtk_adjustment_set_upper(GTK_ADJUSTMENT(player->time_adjustment), + (gdouble)new_length); +} + /* * VLC callbacks are invoked from another thread! */ static void -vlc_time_changed(const struct libvlc_event_t *event, void *userdata) +vlc_time_changed(const struct libvlc_event_t *event, void *user_data) { - GtkVlcPlayer *player = GTK_VLC_PLAYER(userdata); - assert(event->type == libvlc_MediaPlayerTimeChanged); gdk_threads_enter(); - g_signal_emit(player, gtk_vlc_player_signals[TIME_CHANGED_SIGNAL], 0, - (gint64)event->u.media_player_time_changed.new_time); + update_time(GTK_VLC_PLAYER(user_data), + (gint64)event->u.media_player_time_changed.new_time); gdk_threads_leave(); } static void -vlc_length_changed(const struct libvlc_event_t *event, void *userdata) +vlc_length_changed(const struct libvlc_event_t *event, void *user_data) { - GtkVlcPlayer *player = GTK_VLC_PLAYER(userdata); - assert(event->type == libvlc_MediaPlayerLengthChanged); gdk_threads_enter(); - g_signal_emit(player, gtk_vlc_player_signals[LENGTH_CHANGED_SIGNAL], 0, + update_length(GTK_VLC_PLAYER(user_data), (gint64)event->u.media_player_length_changed.new_length); gdk_threads_leave(); } @@ -222,9 +252,8 @@ gtk_vlc_player_load(GtkVlcPlayer *player, const gchar *uri) libvlc_media_player_set_media(player->media_player, media); /* NOTE: media was parsed so get_duration works */ - g_signal_emit(player, gtk_vlc_player_signals[LENGTH_CHANGED_SIGNAL], 0, - (gint64)libvlc_media_get_duration(media)); - g_signal_emit(player, gtk_vlc_player_signals[TIME_CHANGED_SIGNAL], 0, 0); + update_length(player, (gint64)libvlc_media_get_duration(media)); + update_time(player, 0); libvlc_media_release(media); @@ -260,7 +289,7 @@ gtk_vlc_player_stop(GtkVlcPlayer *player) gtk_vlc_player_pause(player); libvlc_media_player_stop(player->media_player); - g_signal_emit(player, gtk_vlc_player_signals[TIME_CHANGED_SIGNAL], 0, 0); + update_time(player, 0); } void @@ -268,3 +297,17 @@ gtk_vlc_player_seek(GtkVlcPlayer *player, gint64 time) { libvlc_media_player_set_time(player->media_player, (libvlc_time_t)time); } + +GtkAdjustment * +gtk_vlc_player_get_time_adjustment(GtkVlcPlayer *player) +{ + return GTK_ADJUSTMENT(player->time_adjustment); +} + +void +gtk_vlc_player_set_time_adjustment(GtkVlcPlayer *player, GtkAdjustment *adj) +{ + gtk_object_unref(player->time_adjustment); + player->time_adjustment = GTK_OBJECT(adj); + gtk_object_ref(player->time_adjustment); +} diff --git a/lib/gtk-vlc-player/gtk-vlc-player.h b/lib/gtk-vlc-player/gtk-vlc-player.h index 1cef88b..54d36a1 100644 --- a/lib/gtk-vlc-player/gtk-vlc-player.h +++ b/lib/gtk-vlc-player/gtk-vlc-player.h @@ -24,6 +24,9 @@ G_BEGIN_DECLS typedef struct _GtkVlcPlayer { GtkAlignment parent_instance; + GtkObject *time_adjustment; + gulong time_adj_on_value_changed_id; + libvlc_instance_t *vlc_inst; libvlc_media_player_t *media_player; @@ -53,6 +56,8 @@ void gtk_vlc_player_stop(GtkVlcPlayer *player); void gtk_vlc_player_seek(GtkVlcPlayer *player, gint64 time); +GtkAdjustment *gtk_vlc_player_get_time_adjustment(GtkVlcPlayer *player); +void gtk_vlc_player_set_time_adjustment(GtkVlcPlayer *player, GtkAdjustment *adj); G_END_DECLS |