[gnome-builder/gnome-builder-43] plugins/git: emit monitor changed when index changes



commit bbb17c2eed173e66b99b0d854d6970122f7ab897
Author: Christian Hergert <chergert redhat com>
Date:   Mon Sep 26 16:52:10 2022 -0700

    plugins/git: emit monitor changed when index changes
    
    When we discover the IdeVcs::changed signal is emitted, the buffer change
    monitor (for git) also needs to emit IdeBufferChangeMonitor::changed so
    that the gutter is re-rendered with the updated state.
    
    This matters more now in GTK 4 since the widgets are more likely to retain
    state and not render anything new until forced.
    
    Fixes #1820

 src/plugins/git/gbp-git-buffer-change-monitor.c | 81 +++++++++++++++++--------
 1 file changed, 56 insertions(+), 25 deletions(-)
---
diff --git a/src/plugins/git/gbp-git-buffer-change-monitor.c b/src/plugins/git/gbp-git-buffer-change-monitor.c
index e12606e03..2ab5bf76a 100644
--- a/src/plugins/git/gbp-git-buffer-change-monitor.c
+++ b/src/plugins/git/gbp-git-buffer-change-monitor.c
@@ -29,12 +29,14 @@
 #include "daemon/line-cache.h"
 
 #include "gbp-git-buffer-change-monitor.h"
+#include "gbp-git-vcs.h"
 
 struct _GbpGitBufferChangeMonitor
 {
   IdeBufferChangeMonitor  parent;
   IpcGitChangeMonitor    *proxy;
-  IdeSignalGroup         *buffer_signals;
+  GSignalGroup           *buffer_signals;
+  GSignalGroup           *vcs_signals;
   LineCache              *cache;
   guint                   last_change_count;
   guint                   queued_source;
@@ -93,10 +95,16 @@ gbp_git_buffer_change_monitor_destroy (IdeObject *object)
 
   if (self->buffer_signals)
     {
-      ide_signal_group_set_target (self->buffer_signals, NULL);
+      g_signal_group_set_target (self->buffer_signals, NULL);
       g_clear_object (&self->buffer_signals);
     }
 
+  if (self->vcs_signals)
+    {
+      g_signal_group_set_target (self->vcs_signals, NULL);
+      g_clear_object (&self->vcs_signals);
+    }
+
   if (self->proxy != NULL)
     {
       ipc_git_change_monitor_call_close (self->proxy, NULL, NULL, NULL);
@@ -114,12 +122,19 @@ gbp_git_buffer_change_monitor_load (IdeBufferChangeMonitor *monitor,
                                     IdeBuffer              *buffer)
 {
   GbpGitBufferChangeMonitor *self = (GbpGitBufferChangeMonitor *)monitor;
+  g_autoptr(IdeContext) context = NULL;
+  IdeVcs *vcs;
 
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_GIT_BUFFER_CHANGE_MONITOR (self));
   g_assert (IDE_IS_BUFFER (buffer));
 
-  ide_signal_group_set_target (self->buffer_signals, buffer);
+  context = ide_buffer_ref_context (buffer);
+  vcs = ide_vcs_from_context (context);
+
+  g_signal_group_set_target (self->vcs_signals, vcs);
+  g_signal_group_set_target (self->buffer_signals, buffer);
+
   gbp_git_buffer_change_monitor_queue_update (self, FAST);
 }
 
@@ -330,6 +345,16 @@ gbp_git_buffer_change_monitor_get_change (IdeBufferChangeMonitor *monitor,
     return IDE_BUFFER_LINE_CHANGE_NONE;
 }
 
+static void
+vcs_changed_cb (GbpGitBufferChangeMonitor *self,
+                IdeVcs                    *vcs)
+{
+  g_assert (IDE_IS_BUFFER_CHANGE_MONITOR (self));
+  g_assert (IDE_IS_VCS (vcs));
+
+  gbp_git_buffer_change_monitor_queue_update (self, FAST);
+}
+
 static void
 gbp_git_buffer_change_monitor_class_init (GbpGitBufferChangeMonitorClass *klass)
 {
@@ -347,28 +372,34 @@ gbp_git_buffer_change_monitor_class_init (GbpGitBufferChangeMonitorClass *klass)
 static void
 gbp_git_buffer_change_monitor_init (GbpGitBufferChangeMonitor *self)
 {
-  self->buffer_signals = ide_signal_group_new (IDE_TYPE_BUFFER);
-
-  ide_signal_group_connect_object (self->buffer_signals,
-                                   "insert-text",
-                                   G_CALLBACK (buffer_insert_text_after_cb),
-                                   self,
-                                   G_CONNECT_SWAPPED | G_CONNECT_AFTER);
-  ide_signal_group_connect_object (self->buffer_signals,
-                                   "delete-range",
-                                   G_CALLBACK (buffer_delete_range_cb),
-                                   self,
-                                   G_CONNECT_SWAPPED);
-  ide_signal_group_connect_object (self->buffer_signals,
-                                   "delete-range",
-                                   G_CALLBACK (buffer_delete_range_after_cb),
-                                   self,
-                                   G_CONNECT_SWAPPED | G_CONNECT_AFTER);
-  ide_signal_group_connect_object (self->buffer_signals,
-                                   "changed",
-                                   G_CALLBACK (buffer_changed_after_cb),
-                                   self,
-                                   G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+  self->buffer_signals = g_signal_group_new (IDE_TYPE_BUFFER);
+  g_signal_group_connect_object (self->buffer_signals,
+                                 "insert-text",
+                                 G_CALLBACK (buffer_insert_text_after_cb),
+                                 self,
+                                 G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+  g_signal_group_connect_object (self->buffer_signals,
+                                 "delete-range",
+                                 G_CALLBACK (buffer_delete_range_cb),
+                                 self,
+                                 G_CONNECT_SWAPPED);
+  g_signal_group_connect_object (self->buffer_signals,
+                                 "delete-range",
+                                 G_CALLBACK (buffer_delete_range_after_cb),
+                                 self,
+                                 G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+  g_signal_group_connect_object (self->buffer_signals,
+                                 "changed",
+                                 G_CALLBACK (buffer_changed_after_cb),
+                                 self,
+                                 G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+
+  self->vcs_signals = g_signal_group_new (IDE_TYPE_VCS);
+  g_signal_group_connect_object (self->vcs_signals,
+                                 "changed",
+                                 G_CALLBACK (vcs_changed_cb),
+                                 self,
+                                 G_CONNECT_SWAPPED | G_CONNECT_AFTER);
 }
 
 IdeBufferChangeMonitor *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]