[gimp/gimp-2-10] app: update image-projection priority rect when switching displays



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]