summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2022-02-20 13:07:28 +0100
committerBastien Nocera <hadess@hadess.net>2022-02-20 13:14:34 +0100
commita96852c41e5917876a72dd19eb346677c728f96c (patch)
tree9b604a115939641e33ef0acd03e15661f9557259 /src
parentd81cd9a147834444a943fd0554c207005143eac5 (diff)
downloadtotem-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.c69
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);
}
/**