[gimp/gimp-2-10] app: update image-projection priority rect when switching displays
- From: Ell <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-10] app: update image-projection priority rect when switching displays
- Date: Thu, 5 Sep 2019 10:57:14 +0000 (UTC)
commit 668d8b2ee1b1568955de100921507ecc1063b866
Author: Ell <ell_se yahoo com>
Date: Thu Sep 5 13:51:35 2019 +0300
app: update image-projection priority rect when switching displays
Update the image-projection priority rect to the current display's
viewport when the display becomes active, so that the right region
is rendered first when switching between different displays of the
same image.
(cherry picked from commit 582930aa61eabda5ee9d5ec7c60f5988d5cf26b2)
app/display/gimpdisplayshell-handlers.c | 26 +++++++++++++++++++
app/display/gimpdisplayshell.c | 46 ++++++++++++++++++---------------
app/display/gimpdisplayshell.h | 3 +++
3 files changed, 54 insertions(+), 21 deletions(-)
---
diff --git a/app/display/gimpdisplayshell-handlers.c b/app/display/gimpdisplayshell-handlers.c
index 512c5d1b15..11844de412 100644
--- a/app/display/gimpdisplayshell-handlers.c
+++ b/app/display/gimpdisplayshell-handlers.c
@@ -178,6 +178,9 @@ static void gimp_display_shell_quality_notify_handler (GObject *c
static void gimp_display_shell_color_config_notify_handler (GObject *config,
GParamSpec *param_spec,
GimpDisplayShell *shell);
+static void gimp_display_shell_display_changed_handler (GimpContext *context,
+ GimpDisplay *display,
+ GimpDisplayShell *shell);
/* public functions */
@@ -189,6 +192,7 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
GimpContainer *vectors;
GimpDisplayConfig *config;
GimpColorConfig *color_config;
+ GimpContext *user_context;
GList *list;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@@ -203,6 +207,8 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
config = shell->display->config;
color_config = GIMP_CORE_CONFIG (config)->color_management;
+ user_context = gimp_get_user_context (shell->display->gimp);
+
g_signal_connect (image, "clean",
G_CALLBACK (gimp_display_shell_clean_dirty_handler),
shell);
@@ -383,6 +389,10 @@ gimp_display_shell_connect (GimpDisplayShell *shell)
G_CALLBACK (gimp_display_shell_color_config_notify_handler),
shell);
+ g_signal_connect (user_context, "display-changed",
+ G_CALLBACK (gimp_display_shell_display_changed_handler),
+ shell);
+
gimp_display_shell_active_vectors_handler (image, shell);
gimp_display_shell_invalidate_preview_handler (image, shell);
gimp_display_shell_quick_mask_changed_handler (image, shell);
@@ -413,6 +423,7 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
GimpContainer *vectors;
GimpDisplayConfig *config;
GimpColorConfig *color_config;
+ GimpContext *user_context;
GList *list;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
@@ -427,6 +438,8 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
config = shell->display->config;
color_config = GIMP_CORE_CONFIG (config)->color_management;
+ user_context = gimp_get_user_context (shell->display->gimp);
+
gimp_display_shell_icon_update_stop (shell);
gimp_canvas_layer_boundary_set_layer (GIMP_CANVAS_LAYER_BOUNDARY (shell->layer_boundary),
@@ -435,6 +448,10 @@ gimp_display_shell_disconnect (GimpDisplayShell *shell)
gimp_canvas_canvas_boundary_set_image (GIMP_CANVAS_CANVAS_BOUNDARY (shell->canvas_boundary),
NULL);
+ g_signal_handlers_disconnect_by_func (user_context,
+ gimp_display_shell_display_changed_handler,
+ shell);
+
g_signal_handlers_disconnect_by_func (color_config,
gimp_display_shell_color_config_notify_handler,
shell);
@@ -1211,3 +1228,12 @@ gimp_display_shell_color_config_notify_handler (GObject *config,
shell->color_config_set = FALSE;
}
}
+
+static void
+gimp_display_shell_display_changed_handler (GimpContext *context,
+ GimpDisplay *display,
+ GimpDisplayShell *shell)
+{
+ if (shell->display == display)
+ gimp_display_shell_update_priority_rect (shell);
+}
diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c
index df8bea0be2..c3586df74e 100644
--- a/app/display/gimpdisplayshell.c
+++ b/app/display/gimpdisplayshell.c
@@ -1041,23 +1041,6 @@ gimp_display_shell_popup_menu (GtkWidget *widget)
return TRUE;
}
-static void
-gimp_display_shell_set_priority_viewport (GimpDisplayShell *shell)
-{
- GimpImage *image = gimp_display_get_image (shell->display);
-
- if (image)
- {
- GimpProjection *projection = gimp_image_get_projection (image);
- gint x, y;
- gint width, height;
-
- gimp_display_shell_untransform_viewport (shell, ! shell->show_all,
- &x, &y, &width, &height);
- gimp_projection_set_priority_rect (projection, x, y, width, height);
- }
-}
-
static void
gimp_display_shell_real_scaled (GimpDisplayShell *shell)
{
@@ -1072,7 +1055,7 @@ gimp_display_shell_real_scaled (GimpDisplayShell *shell)
if (shell->display == gimp_context_get_display (user_context))
{
- gimp_display_shell_set_priority_viewport (shell);
+ gimp_display_shell_update_priority_rect (shell);
gimp_ui_manager_update (shell->popup_manager, shell->display);
}
@@ -1092,7 +1075,7 @@ gimp_display_shell_real_scrolled (GimpDisplayShell *shell)
if (shell->display == gimp_context_get_display (user_context))
{
- gimp_display_shell_set_priority_viewport (shell);
+ gimp_display_shell_update_priority_rect (shell);
}
}
@@ -1111,7 +1094,7 @@ gimp_display_shell_real_rotated (GimpDisplayShell *shell)
if (shell->display == gimp_context_get_display (user_context))
{
- gimp_display_shell_set_priority_viewport (shell);
+ gimp_display_shell_update_priority_rect (shell);
gimp_ui_manager_update (shell->popup_manager, shell->display);
}
@@ -1861,7 +1844,7 @@ gimp_display_shell_set_show_all (GimpDisplayShell *shell,
if (shell->display == gimp_context_get_display (user_context))
{
- gimp_display_shell_set_priority_viewport (shell);
+ gimp_display_shell_update_priority_rect (shell);
gimp_ui_manager_update (shell->popup_manager, shell->display);
}
@@ -1919,6 +1902,27 @@ gimp_display_shell_get_bounding_box (GimpDisplayShell *shell)
return bounding_box;
}
+void
+gimp_display_shell_update_priority_rect (GimpDisplayShell *shell)
+{
+ GimpImage *image;
+
+ g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
+
+ image = gimp_display_get_image (shell->display);
+
+ if (image)
+ {
+ GimpProjection *projection = gimp_image_get_projection (image);
+ gint x, y;
+ gint width, height;
+
+ gimp_display_shell_untransform_viewport (shell, ! shell->show_all,
+ &x, &y, &width, &height);
+ gimp_projection_set_priority_rect (projection, x, y, width, height);
+ }
+}
+
void
gimp_display_shell_flush (GimpDisplayShell *shell,
gboolean now)
diff --git a/app/display/gimpdisplayshell.h b/app/display/gimpdisplayshell.h
index e14ec6548f..da0af22031 100644
--- a/app/display/gimpdisplayshell.h
+++ b/app/display/gimpdisplayshell.h
@@ -313,6 +313,9 @@ GimpPickable * gimp_display_shell_get_pickable (GimpDisplayShell *shell);
GeglRectangle gimp_display_shell_get_bounding_box
(GimpDisplayShell *shell);
+void gimp_display_shell_update_priority_rect
+ (GimpDisplayShell *shell);
+
void gimp_display_shell_flush (GimpDisplayShell *shell,
gboolean now);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]