diff options
author | Bastien Nocera <hadess@hadess.net> | 2022-02-20 13:07:28 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2022-02-20 13:14:34 +0100 |
commit | a96852c41e5917876a72dd19eb346677c728f96c (patch) | |
tree | 9b604a115939641e33ef0acd03e15661f9557259 /src | |
parent | d81cd9a147834444a943fd0554c207005143eac5 (diff) | |
download | totem-a96852c41e5917876a72dd19eb346677c728f96c.tar.gz |
backend: Simplify cursor setting
Keep track of the state, and update the cursor from a single location.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/bacon-video-widget.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/src/backend/bacon-video-widget.c b/src/backend/bacon-video-widget.c index bd3d16bc8..1a0ba3520 100644 --- a/src/backend/bacon-video-widget.c +++ b/src/backend/bacon-video-widget.c @@ -200,14 +200,16 @@ struct _BaconVideoWidget gboolean got_redirect; - GdkCursor *cursor; + GdkCursor *blank_cursor; + GdkCursor *hand_cursor; + gboolean cursor_shown; + gboolean hovering_menu; /* Visual effects */ GstElement *audio_capsfilter; GstElement *audio_pitchcontrol; /* Other stuff */ - gboolean cursor_shown; gboolean uses_audio_fakesink; gdouble volume; gboolean is_menu; @@ -401,12 +403,34 @@ bvw_show_error_if_video_decoder_is_missing (BaconVideoWidget * bvw) } static void +update_cursor (BaconVideoWidget *bvw) +{ + GdkWindow *window; + + window = gtk_widget_get_window (GTK_WIDGET (bvw)); + + if (bvw->hovering_menu) + gdk_window_set_cursor (window, bvw->hand_cursor); + else if (bvw->cursor_shown) + gdk_window_set_cursor (window, NULL); + else + gdk_window_set_cursor (window, bvw->blank_cursor); +} + +static void bacon_video_widget_realize (GtkWidget * widget) { BaconVideoWidget *bvw = BACON_VIDEO_WIDGET (widget); + GdkWindow *window; + GdkDisplay *display; GTK_WIDGET_CLASS (parent_class)->realize (widget); + window = gtk_widget_get_window (widget); + display = gdk_window_get_display (window); + bvw->hand_cursor = gdk_cursor_new_for_display (display, GDK_HAND2); + bvw->blank_cursor = gdk_cursor_new_for_display (display, GDK_BLANK_CURSOR); + bvw->missing_plugins_cancellable = g_cancellable_new (); g_object_set_data_full (G_OBJECT (bvw), "missing-plugins-cancellable", bvw->missing_plugins_cancellable, g_object_unref); @@ -420,6 +444,9 @@ bacon_video_widget_unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (parent_class)->unrealize (widget); + g_clear_object (&bvw->blank_cursor); + g_clear_object (&bvw->hand_cursor); + g_cancellable_cancel (bvw->missing_plugins_cancellable); bvw->missing_plugins_cancellable = NULL; g_object_set_data (G_OBJECT (bvw), "missing-plugins-cancellable", NULL); @@ -1182,20 +1209,10 @@ bvw_handle_element_message (BaconVideoWidget *bvw, GstMessage *msg) switch (nav_msg_type) { case GST_NAVIGATION_MESSAGE_MOUSE_OVER: { gint active; - GdkWindow *window; - GdkDisplay *display; if (!gst_navigation_message_parse_mouse_over (msg, &active)) break; - window = gtk_widget_get_window (GTK_WIDGET (bvw)); - if (active) { - if (bvw->cursor == NULL) { - display = gdk_window_get_display (window); - bvw->cursor = gdk_cursor_new_for_display (display, GDK_HAND2); - } - } else { - g_clear_object (&bvw->cursor); - } - gdk_window_set_cursor (window, bvw->cursor); + bvw->hovering_menu = active; + update_cursor (bvw); goto done; } case GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED: { @@ -2456,8 +2473,6 @@ bacon_video_widget_finalize (GObject * object) bvw->eos_id = 0; } - g_clear_object (&bvw->cursor); - if (bvw->mount_cancellable) g_cancellable_cancel (bvw->mount_cancellable); g_clear_object (&bvw->mount_cancellable); @@ -4331,28 +4346,12 @@ void bacon_video_widget_set_show_cursor (BaconVideoWidget * bvw, gboolean show_cursor) { - GdkWindow *window; - g_return_if_fail (BACON_IS_VIDEO_WIDGET (bvw)); - - bvw->cursor_shown = show_cursor; - window = gtk_widget_get_window (GTK_WIDGET (bvw)); - - if (!window) + if (bvw->cursor_shown == show_cursor) return; - - if (show_cursor == FALSE) { - GdkCursor *cursor; - GdkDisplay *display; - - display = gdk_window_get_display (window); - cursor = gdk_cursor_new_for_display (display, GDK_BLANK_CURSOR); - gdk_window_set_cursor (window, cursor); - g_object_unref (cursor); - } else { - gdk_window_set_cursor (window, bvw->cursor); - } + bvw->cursor_shown = show_cursor; + update_cursor (bvw); } /** |