[totem/wip/hadess/glsink: 10/13] implement scroll on seek bar and volume button
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [totem/wip/hadess/glsink: 10/13] implement scroll on seek bar and volume button
- Date: Fri, 28 Jan 2022 17:37:43 +0000 (UTC)
commit cfb032648798ea273f65f9d9378b3f1957571c5c
Author: Bastien Nocera <hadess hadess net>
Date: Fri Jan 28 12:21:23 2022 +0100
implement scroll on seek bar and volume button
src/backend/bacon-video-widget.c | 51 +-----------------------
src/totem-object.c | 86 ++++++++++++++++++++++++++++------------
2 files changed, 62 insertions(+), 75 deletions(-)
---
diff --git a/src/backend/bacon-video-widget.c b/src/backend/bacon-video-widget.c
index e7070d25d..0df16ea2a 100644
--- a/src/backend/bacon-video-widget.c
+++ b/src/backend/bacon-video-widget.c
@@ -663,49 +663,6 @@ bail:
return res;
}
-static gboolean
-bacon_video_widget_handle_scroll (GtkWidget *widget,
- GdkEventScroll *event,
- BaconVideoWidget *bvw)
-{
- int x, y;
- gboolean forward;
- gdouble delta_y;
-
- g_return_val_if_fail (bvw->play != NULL, FALSE);
-#if 0
- if (event->direction != GDK_SCROLL_SMOOTH)
- return GDK_EVENT_PROPAGATE;
-
- if (widget == (gpointer) bvw) {
- translate_coords (widget, event->window, event->x, event->y, &x, &y);
- if (ignore_event (bvw, x, y))
- return GDK_EVENT_STOP;
- }
-
- gdk_event_get_scroll_deltas ((GdkEvent *) event, NULL, &delta_y);
- if (delta_y == 0.0)
- return GDK_EVENT_PROPAGATE;
- forward = delta_y >= 0.0 ? FALSE : TRUE;
-
- if (widget == (gpointer) bvw ||
- widget == g_object_get_data (G_OBJECT (bvw->controls), "seek_scale")) {
- if (bvw->seekable > 0)
- g_signal_emit (G_OBJECT (bvw), bvw_signals[SIGNAL_SEEK_REQUESTED], 0, forward);
- } else if (widget == g_object_get_data (G_OBJECT (bvw->controls), "volume_button")) {
- if (bacon_video_widget_can_set_volume (bvw))
- g_signal_emit (G_OBJECT (bvw), bvw_signals[SIGNAL_VOLUME_CHANGE_REQUESTED], 0, forward);
- }
-#endif
- return GDK_EVENT_STOP;
-}
-
-static gboolean
-bacon_video_widget_scroll (GtkWidget *widget, GdkEventScroll *event)
-{
- return bacon_video_widget_handle_scroll (widget, event, BACON_VIDEO_WIDGET (widget));
-}
-
static void
bacon_video_widget_get_preferred_width (GtkWidget *widget,
gint *minimum,
@@ -757,7 +714,6 @@ bacon_video_widget_class_init (BaconVideoWidgetClass * klass)
widget_class->motion_notify_event = bacon_video_widget_motion_notify;
widget_class->button_press_event = bacon_video_widget_button_press_or_release;
widget_class->button_release_event = bacon_video_widget_button_press_or_release;
- widget_class->scroll_event = bacon_video_widget_scroll;
/* GObject */
object_class->set_property = bacon_video_widget_set_property;
@@ -5578,6 +5534,7 @@ bacon_video_widget_initable_init (GInitable *initable,
gtk_widget_set_events (GTK_WIDGET (bvw),
gtk_widget_get_events (GTK_WIDGET (bvw)) |
+ GDK_SCROLL_MASK |
GDK_POINTER_MOTION_MASK |
GDK_BUTTON_MOTION_MASK |
GDK_BUTTON_PRESS_MASK |
@@ -5691,12 +5648,6 @@ bacon_video_widget_initable_init (GInitable *initable,
clutter_actor_set_opacity (bvw->controls, 0);
- item = g_object_get_data (G_OBJECT (bvw->controls), "seek_scale");
- g_signal_connect (item, "scroll-event",
- G_CALLBACK (bacon_video_widget_handle_scroll), bvw);
- item = g_object_get_data (G_OBJECT (bvw->controls), "volume_button");
- g_signal_connect (item, "scroll-event",
- G_CALLBACK (bacon_video_widget_handle_scroll), bvw);
#endif
/* And tell playbin */
g_object_set (bvw->play, "video-sink", glsinkbin, NULL);
diff --git a/src/totem-object.c b/src/totem-object.c
index 217cbc169..77b26f161 100644
--- a/src/totem-object.c
+++ b/src/totem-object.c
@@ -2621,6 +2621,34 @@ volume_button_value_changed_cb (GtkScaleButton *button, gdouble value, TotemObje
bacon_video_widget_set_volume (totem->bvw, value);
}
+static gboolean
+volume_button_scroll_event_cb (GtkWidget *widget,
+ GdkEventScroll *event,
+ gpointer user_data)
+{
+ TotemObject *totem = user_data;
+ gboolean increase;
+
+ if (event->direction == GDK_SCROLL_SMOOTH) {
+ gdouble delta_y;
+
+ gdk_event_get_scroll_deltas ((GdkEvent *) event, NULL, &delta_y);
+ if (delta_y == 0.0)
+ return GDK_EVENT_PROPAGATE;
+
+ increase = delta_y < 0.0;
+ } else if (event->direction == GDK_SCROLL_UP) {
+ increase = TRUE;
+ } else if (event->direction == GDK_SCROLL_DOWN) {
+ increase = SEEK_BACKWARD_OFFSET * 1000;
+ } else {
+ return GDK_EVENT_PROPAGATE;
+ }
+
+ totem_object_set_volume_relative (totem, increase ? VOLUME_UP_OFFSET : VOLUME_DOWN_OFFSET);
+ return GDK_EVENT_STOP;
+}
+
static void
update_volume_sliders (TotemObject *totem)
{
@@ -2706,6 +2734,33 @@ seek_slider_released_cb (GtkWidget *widget, GdkEventButton *event, TotemObject *
return FALSE;
}
+static gboolean
+seek_slider_scroll_event_cb (GtkWidget *widget,
+ GdkEventScroll *event,
+ gpointer user_data)
+{
+ TotemObject *totem = user_data;
+ gint64 offset;
+
+ if (event->direction == GDK_SCROLL_SMOOTH) {
+ gdouble delta_y;
+
+ gdk_event_get_scroll_deltas ((GdkEvent *) event, NULL, &delta_y);
+ if (delta_y == 0.0)
+ return GDK_EVENT_PROPAGATE;
+
+ offset = delta_y >= 0.0 ? SEEK_BACKWARD_OFFSET * 1000 : SEEK_FORWARD_OFFSET * 1000;
+ } else if (event->direction == GDK_SCROLL_UP) {
+ offset = SEEK_FORWARD_OFFSET * 1000;
+ } else if (event->direction == GDK_SCROLL_DOWN) {
+ offset = SEEK_BACKWARD_OFFSET * 1000;
+ } else {
+ return GDK_EVENT_PROPAGATE;
+ }
+ totem_object_seek_relative (totem, offset, FALSE);
+ return GDK_EVENT_STOP;
+}
+
gboolean
totem_object_open_files (TotemObject *totem, char **list)
{
@@ -3561,17 +3616,6 @@ totem_object_handle_key_press (TotemObject *totem, GdkEventKey *event)
return retval;
}
-static void
-on_seek_requested_event (BaconVideoWidget *bvw,
- gboolean forward,
- TotemObject *totem)
-{
- gint64 offset;
-
- offset = forward ? SEEK_FORWARD_OFFSET * 1000 : SEEK_BACKWARD_OFFSET * 1000;
- totem_object_seek_relative (totem, offset, FALSE);
-}
-
static void
on_track_skip_requested_event (BaconVideoWidget *bvw,
gboolean is_forward,
@@ -3580,14 +3624,6 @@ on_track_skip_requested_event (BaconVideoWidget *bvw,
totem_object_direction (totem, is_forward ? TOTEM_PLAYLIST_DIRECTION_NEXT :
TOTEM_PLAYLIST_DIRECTION_PREVIOUS);
}
-static void
-on_volume_change_requested_event (BaconVideoWidget *bvw,
- gboolean increase,
- TotemObject *totem)
-{
- totem_object_set_volume_relative (totem, increase ? VOLUME_UP_OFFSET : VOLUME_DOWN_OFFSET);
-}
-
gboolean
window_key_press_event_cb (GtkWidget *win, GdkEventKey *event, TotemObject *totem)
{
@@ -3909,12 +3945,16 @@ totem_callback_connect (TotemObject *totem)
G_CALLBACK (seek_slider_pressed_cb), totem);
g_signal_connect (totem->seek, "button-release-event",
G_CALLBACK (seek_slider_released_cb), totem);
+ g_signal_connect (totem->seek, "scroll-event",
+ G_CALLBACK (seek_slider_scroll_event_cb), totem);
g_signal_connect (totem->seekadj, "value-changed",
G_CALLBACK (seek_slider_changed_cb), totem);
/* Volume */
g_signal_connect (totem->volume, "value-changed",
G_CALLBACK (volume_button_value_changed_cb), totem);
+ g_signal_connect (totem->volume, "scroll-event",
+ G_CALLBACK (volume_button_scroll_event_cb), totem);
item = gtk_scale_button_get_popup (GTK_SCALE_BUTTON (totem->volume));
g_signal_connect (G_OBJECT (item), "notify::visible",
G_CALLBACK (volume_button_menu_shown_cb), totem);
@@ -4174,17 +4214,13 @@ video_widget_create (TotemObject *totem)
"error",
G_CALLBACK (on_error_event),
totem);
- g_signal_connect (G_OBJECT (totem->bvw),
- "seek-requested",
- G_CALLBACK (on_seek_requested_event),
- totem);
g_signal_connect (G_OBJECT (totem->bvw),
"track-skip-requested",
G_CALLBACK (on_track_skip_requested_event),
totem);
g_signal_connect (G_OBJECT (totem->bvw),
- "volume-change-requested",
- G_CALLBACK (on_volume_change_requested_event),
+ "scroll-event",
+ G_CALLBACK (seek_slider_scroll_event_cb),
totem);
container = GTK_CONTAINER (gtk_builder_get_object (totem->xml, "tmw_bvw_box"));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]