diff --git a/app/display/gimpdisplayshell-scale.c b/app/display/gimpdisplayshell-scale.c index 62060e6fd3..37f435c3df 100644 --- a/app/display/gimpdisplayshell-scale.c +++ b/app/display/gimpdisplayshell-scale.c @@ -639,6 +639,8 @@ gimp_display_shell_scale_by_values (GimpDisplayShell *shell, void gimp_display_shell_scale_drag (GimpDisplayShell *shell, + gdouble start_x, + gdouble start_y, gdouble delta_x, gdouble delta_y) { @@ -648,19 +650,21 @@ gimp_display_shell_scale_drag (GimpDisplayShell *shell, scale = gimp_zoom_model_get_factor (shell->zoom); + gimp_display_shell_push_zoom_focus_pointer_pos (shell, start_x, start_y); + if (delta_y > 0) { gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale * 1.1, - GIMP_ZOOM_FOCUS_RETAIN_CENTERING_ELSE_BEST_GUESS); + GIMP_ZOOM_FOCUS_POINTER); } else if (delta_y < 0) { gimp_display_shell_scale (shell, GIMP_ZOOM_TO, scale * 0.9, - GIMP_ZOOM_FOCUS_RETAIN_CENTERING_ELSE_BEST_GUESS); + GIMP_ZOOM_FOCUS_POINTER); } } diff --git a/app/display/gimpdisplayshell-scale.h b/app/display/gimpdisplayshell-scale.h index bb1f0ac7b1..530f0e8bef 100644 --- a/app/display/gimpdisplayshell-scale.h +++ b/app/display/gimpdisplayshell-scale.h @@ -61,6 +61,8 @@ void gimp_display_shell_scale_by_values (GimpDisplayShell *shell, gboolean resize_window); void gimp_display_shell_scale_drag (GimpDisplayShell *shell, + gdouble start_x, + gdouble start_y, gdouble delta_x, gdouble delta_y); diff --git a/app/display/gimpdisplayshell-tool-events.c b/app/display/gimpdisplayshell-tool-events.c index dc7c11bddb..2fec64b81a 100644 --- a/app/display/gimpdisplayshell-tool-events.c +++ b/app/display/gimpdisplayshell-tool-events.c @@ -1493,6 +1493,8 @@ gimp_display_shell_start_scrolling (GimpDisplayShell *shell, GDK_BUTTON_RELEASE_MASK); shell->scrolling = TRUE; + shell->scroll_start_x = x; + shell->scroll_start_y = y; shell->scroll_last_x = x; shell->scroll_last_y = y; shell->rotating = (state & gimp_get_extend_selection_mask ()) ? TRUE : FALSE; @@ -1519,6 +1521,8 @@ gimp_display_shell_stop_scrolling (GimpDisplayShell *shell, gimp_display_shell_unset_override_cursor (shell); shell->scrolling = FALSE; + shell->scroll_start_x = 0; + shell->scroll_start_y = 0; shell->scroll_last_x = 0; shell->scroll_last_y = 0; shell->rotating = FALSE; @@ -1554,6 +1558,8 @@ gimp_display_shell_handle_scrolling (GimpDisplayShell *shell, else if (shell->scaling) { gimp_display_shell_scale_drag (shell, + shell->scroll_start_x, + shell->scroll_start_y, shell->scroll_last_x - x, shell->scroll_last_y - y); } diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h index 1fa0b4765b..ef0bdfbeed 100644 --- a/app/display/gimpdisplayshell.h +++ b/app/display/gimpdisplayshell.h @@ -198,6 +198,8 @@ struct _GimpDisplayShell const gchar *space_shaded_tool; gboolean scrolling; + gint scroll_start_x; + gint scroll_start_y; gint scroll_last_x; gint scroll_last_y; gboolean rotating;