[meld] Pause reload notifications monitoring during asynchronous save (bgo#759851)



commit bf9fbfa333deb1d8c3e6a11bac8aacbd1742be99
Author: Vasily Galkin <galkin-vv ya ru>
Date:   Wed Aug 3 18:34:02 2016 +0300

    Pause reload notifications monitoring during asynchronous save (bgo#759851)
    
    Notifications are paused before saving and resumed after both
    successful and failed saves.
    This definitely loses reload notifications if another application
    tries saving file in the same time, but such situation is very racy and
    notification can be lost before this change too.

 meld/filediff.py   |    4 +++-
 meld/meldbuffer.py |   10 +++++-----
 2 files changed, 8 insertions(+), 6 deletions(-)
---
diff --git a/meld/filediff.py b/meld/filediff.py
index 00a672d..f1888f8 100644
--- a/meld/filediff.py
+++ b/meld/filediff.py
@@ -1539,6 +1539,7 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
         # handling the GtkSource.FileSaverError.EXTERNALLY_MODIFIED error
         if force_overwrite:
             saver.set_flags(GtkSource.FileSaverFlags.IGNORE_MODIFICATION_TIME)
+        bufdata.disconnect_monitor()
         saver.save_async(
             GLib.PRIORITY_HIGH,
             callback=self.file_saved_cb,
@@ -1549,6 +1550,8 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
     def file_saved_cb(self, saver, result, user_data):
         gfile = saver.get_location()
         pane = user_data[0]
+        buf = saver.get_buffer()
+        buf.data.connect_monitor()
 
         try:
             saver.save_finish(result)
@@ -1565,7 +1568,6 @@ class FileDiff(melddoc.MeldDoc, gnomeglade.Component):
             self.state = melddoc.STATE_SAVING_ERROR
             return
 
-        buf = saver.get_buffer()
         self.emit('file-changed', gfile.get_path())
         self.undosequence.checkpoint(buf)
         buf.data.update_mtime()
diff --git a/meld/meldbuffer.py b/meld/meldbuffer.py
index 5fec841..8c0b763 100644
--- a/meld/meldbuffer.py
+++ b/meld/meldbuffer.py
@@ -123,7 +123,7 @@ class MeldBufferData(GObject.GObject):
         self.savefile = None
 
     def __del__(self):
-        self._disconnect_monitor()
+        self.disconnect_monitor()
 
     @property
     def label(self):
@@ -139,14 +139,14 @@ class MeldBufferData(GObject.GObject):
             return
         self._label = value
 
-    def _connect_monitor(self):
+    def connect_monitor(self):
         if not self._gfile:
             return
         monitor = self._gfile.monitor_file(Gio.FileMonitorFlags.NONE, None)
         handler_id = monitor.connect('changed', self._handle_file_change)
         self._monitor = monitor, handler_id
 
-    def _disconnect_monitor(self):
+    def disconnect_monitor(self):
         if not self._monitor:
             return
         monitor, handler_id = self._monitor
@@ -176,7 +176,7 @@ class MeldBufferData(GObject.GObject):
 
     @gfile.setter
     def gfile(self, value):
-        self._disconnect_monitor()
+        self.disconnect_monitor()
         self._gfile = value
         self._sourcefile = GtkSource.File()
         self._sourcefile.set_location(value)
@@ -186,7 +186,7 @@ class MeldBufferData(GObject.GObject):
         # FIXME: maintaining previous comment above; this is now wrong in different awful ways
         self.filename = value.get_path() if value else None
         self.update_mtime()
-        self._connect_monitor()
+        self.connect_monitor()
 
     @property
     def sourcefile(self):


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