From b13d4d9d17d80f6acf1e77cc7f26fabb4dd566c9 Mon Sep 17 00:00:00 2001 From: Jehan Date: Sat, 16 Nov 2024 14:08:44 +0900 Subject: [PATCH] app: use the "show all" value of the shell where cursor_image is displayed. This is an attempt to fix #12333 where from the look of the trace, the segfault may happen if it tries to dereference a NULL view->priv->shell whereas we have a view->priv->cursor_image. Even though I couldn't reproduce, I'm wondering if it may possible to have no active image display while the cursor is indeed hovering an image. Furthermore this updated code is more logical anyway, because we should use the "show all" value from the actual display shell the cursor is hovering, not from the active display shell. --- app/display/gimpcursorview.c | 23 +++++++++++++---------- app/display/gimpcursorview.h | 1 + app/display/gimpdisplayshell-cursor.c | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/display/gimpcursorview.c b/app/display/gimpcursorview.c index 2a2960beb9..435297073f 100644 --- a/app/display/gimpcursorview.c +++ b/app/display/gimpcursorview.c @@ -91,6 +91,7 @@ struct _GimpCursorViewPrivate guint cursor_idle_id; GimpImage *cursor_image; GimpUnit *cursor_unit; + gboolean cursor_show_all; gdouble cursor_x; gdouble cursor_y; }; @@ -747,13 +748,13 @@ gimp_cursor_view_update_selection_info (GimpCursorView *view, static gboolean gimp_cursor_view_cursor_idle (GimpCursorView *view) { - if (view->priv->cursor_image) { - GimpImage *image = view->priv->cursor_image; - GimpUnit *unit = view->priv->cursor_unit; - gdouble x = view->priv->cursor_x; - gdouble y = view->priv->cursor_y; + GimpImage *image = view->priv->cursor_image; + GimpUnit *unit = view->priv->cursor_unit; + gboolean show_all = view->priv->cursor_show_all; + gdouble x = view->priv->cursor_x; + gdouble y = view->priv->cursor_y; gboolean in_image; gchar buf[32]; const Babl *sample_format; @@ -794,7 +795,7 @@ gimp_cursor_view_cursor_idle (GimpCursorView *view) color = gegl_color_new ("black"); if (gimp_image_pick_color (image, NULL, int_x, int_y, - view->priv->shell->show_all, + show_all, view->priv->sample_merged, FALSE, 0.0, &sample_format, pixel, &color)) @@ -884,6 +885,7 @@ void gimp_cursor_view_update_cursor (GimpCursorView *view, GimpImage *image, GimpUnit *shell_unit, + gboolean shell_show_all, gdouble x, gdouble y) { @@ -892,10 +894,11 @@ gimp_cursor_view_update_cursor (GimpCursorView *view, g_clear_object (&view->priv->cursor_image); - view->priv->cursor_image = g_object_ref (image); - view->priv->cursor_unit = shell_unit; - view->priv->cursor_x = x; - view->priv->cursor_y = y; + view->priv->cursor_image = g_object_ref (image); + view->priv->cursor_unit = shell_unit; + view->priv->cursor_show_all = shell_show_all; + view->priv->cursor_x = x; + view->priv->cursor_y = y; if (view->priv->cursor_idle_id == 0) { diff --git a/app/display/gimpcursorview.h b/app/display/gimpcursorview.h index e0bf40f433..2cf2ea0bc6 100644 --- a/app/display/gimpcursorview.h +++ b/app/display/gimpcursorview.h @@ -61,6 +61,7 @@ gboolean gimp_cursor_view_get_sample_merged (GimpCursorView *view); void gimp_cursor_view_update_cursor (GimpCursorView *view, GimpImage *image, GimpUnit *shell_unit, + gboolean shell_show_all, gdouble x, gdouble y); void gimp_cursor_view_clear_cursor (GimpCursorView *view); diff --git a/app/display/gimpdisplayshell-cursor.c b/app/display/gimpdisplayshell-cursor.c index 0e01627f6d..014a7ad205 100644 --- a/app/display/gimpdisplayshell-cursor.c +++ b/app/display/gimpdisplayshell-cursor.c @@ -181,7 +181,7 @@ gimp_display_shell_update_software_cursor (GimpDisplayShell *shell, &t_x, &t_y, FALSE); gimp_cursor_view_update_cursor (GIMP_CURSOR_VIEW (cursor_view), - image, shell->unit, + image, shell->unit, shell->show_all, t_x, t_y); } }