[totem/wip/hadess/glsink: 10/13] implement scroll on seek bar and volume button




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]