[virt-tools-list] [RFC PATCH v2 7/7] virtManager: config: Prevent global default override

Michael Weiser michael.weiser at gmx.de
Fri Dec 6 17:00:51 UTC 2019


Setting a widget's state using set_active() will trigger the "toggled"
signal if the new state is different from the previous. For boolean
per-vm settings which have a global default this can lead to the global
default being written as per-vm settings whenever the global default
changes.

Disconnect the repective signals when setting initial or external state.

Signed-off-by: Michael Weiser <michael.weiser at gmx.de>
---
 ui/vmwindow.ui                 |  5 -----
 virtManager/baseclass.py       | 11 ++++++++++
 virtManager/details/console.py | 37 +++++++++++++++++++++++-----------
 virtManager/vmwindow.py        | 21 +++++++------------
 4 files changed, 43 insertions(+), 31 deletions(-)

diff --git a/ui/vmwindow.ui b/ui/vmwindow.ui
index 4d226835..a9772917 100644
--- a/ui/vmwindow.ui
+++ b/ui/vmwindow.ui
@@ -128,7 +128,6 @@
                         <property name="tooltip_text" translatable="yes">Requires guest agent to work</property>
                         <property name="label" translatable="yes">_Sync guest time on resume</property>
                         <property name="use_underline">True</property>
-                        <signal name="toggled" handler="on_details_menu_sync_guest_time_on_resume_toggled" swapped="no"/>
                       </object>
                     </child>
                   </object>
@@ -218,7 +217,6 @@
                                 <property name="label" translatable="yes">_Always</property>
                                 <property name="use_underline">True</property>
                                 <property name="active">True</property>
-                                <signal name="toggled" handler="on_details_menu_view_scale_always_toggled" swapped="no"/>
                               </object>
                             </child>
                             <child>
@@ -229,7 +227,6 @@
                                 <property name="use_underline">True</property>
                                 <property name="draw_as_radio">True</property>
                                 <property name="group">details-menu-view-scale-always</property>
-                                <signal name="toggled" handler="on_details_menu_view_scale_fullscreen_toggled" swapped="no"/>
                               </object>
                             </child>
                             <child>
@@ -240,7 +237,6 @@
                                 <property name="use_underline">True</property>
                                 <property name="draw_as_radio">True</property>
                                 <property name="group">details-menu-view-scale-always</property>
-                                <signal name="toggled" handler="on_details_menu_view_scale_never_toggled" swapped="no"/>
                               </object>
                             </child>
                             <child>
@@ -255,7 +251,6 @@
                                 <property name="can_focus">False</property>
                                 <property name="label" translatable="yes">Auto _resize VM with window</property>
                                 <property name="use_underline">True</property>
-                                <signal name="toggled" handler="on_details_menu_view_resizeguest_toggled" swapped="no"/>
                               </object>
                             </child>
                           </object>
diff --git a/virtManager/baseclass.py b/virtManager/baseclass.py
index 451e8a8a..42d6470d 100644
--- a/virtManager/baseclass.py
+++ b/virtManager/baseclass.py
@@ -295,6 +295,17 @@ class vmmGObjectUI(vmmGObject):
     def widget(self, name):
         return self.builder.get_object(name)
 
+    def set_active_wo_signal(self, val, sig_id, cb, widget_name=None,
+                             widget=None):
+        if not widget:
+            widget = self.widget(widget_name)
+        if not widget:
+            return
+        if sig_id:
+            widget.disconnect(sig_id)
+        widget.set_active(val)
+        return widget.connect("toggled", cb)
+
     def cleanup(self):
         if self.__cleaned_up:
             return
diff --git a/virtManager/details/console.py b/virtManager/details/console.py
index 193e79eb..82f27c82 100644
--- a/virtManager/details/console.py
+++ b/virtManager/details/console.py
@@ -230,11 +230,16 @@ class vmmConsolePages(vmmGObjectUI):
             self._scroll_size_allocate)
 
         self._refresh_widget_states()
-        self._refresh_scaling_from_settings()
 
+        self.details_menu_view_scale_always_toggled = None
+        self.details_menu_view_scale_fullscreen_toggled = None
+        self.details_menu_view_scale_never_toggled = None
+        self._refresh_scaling_from_settings()
         self.add_gsettings_handle(
             self.vm.on_console_scaling_changed(
                 self._refresh_scaling_from_settings))
+
+        self.details_menu_view_resizeguest_toggled = None
         self._refresh_resizeguest_from_settings()
         self.add_gsettings_handle(
             self.vm.on_console_resizeguest_changed(
@@ -419,10 +424,14 @@ class vmmConsolePages(vmmGObjectUI):
 
         val = self.vm.get_console_resizeguest()
         widget = self.widget("details-menu-view-resizeguest")
+        if self.details_menu_view_resizeguest_toggled:
+            widget.disconnect(self.details_menu_view_resizeguest_toggled)
         widget.set_tooltip_text(tooltip)
         widget.set_sensitive(not bool(tooltip))
         if not tooltip:
             self.widget("details-menu-view-resizeguest").set_active(bool(val))
+        self.details_menu_view_resizeguest_toggled = widget.connect("toggled",
+                self._resizeguest_ui_changed_cb)
 
         self._sync_resizeguest_with_display()
 
@@ -465,13 +474,21 @@ class vmmConsolePages(vmmGObjectUI):
 
     def _refresh_scaling_from_settings(self):
         scale_type = self.vm.get_console_scaling()
-        self.widget("details-menu-view-scale-always").set_active(
-            scale_type == self.config.CONSOLE_SCALE_ALWAYS)
-        self.widget("details-menu-view-scale-never").set_active(
-            scale_type == self.config.CONSOLE_SCALE_NEVER)
-        self.widget("details-menu-view-scale-fullscreen").set_active(
-            scale_type == self.config.CONSOLE_SCALE_FULLSCREEN)
-
+        self.details_menu_view_scale_always_toggled = self.set_active_wo_signal(
+                scale_type == self.config.CONSOLE_SCALE_ALWAYS,
+                self.details_menu_view_scale_always_toggled,
+                self._scaling_ui_changed_cb,
+                "details-menu-view-scale-always")
+        self.details_menu_view_scale_never_toggled = self.set_active_wo_signal(
+                scale_type == self.config.CONSOLE_SCALE_NEVER,
+                self.details_menu_view_scale_never_toggled,
+                self._scaling_ui_changed_cb,
+                "details-menu-view-scale-never")
+        self.details_menu_view_scale_fullscreen_toggled = self.set_active_wo_signal(
+                scale_type == self.config.CONSOLE_SCALE_FULLSCREEN,
+                self.details_menu_view_scale_fullscreen_toggled,
+                self._scaling_ui_changed_cb,
+                "details-menu-view-scale-fullscreen")
         self._sync_scaling_with_display()
 
     def _scaling_ui_changed_cb(self, src):
@@ -1026,13 +1043,9 @@ class vmmConsolePages(vmmGObjectUI):
 
     def details_refresh_can_fullscreen(self):
         return self._refresh_can_fullscreen()
-    def details_resizeguest_ui_changed_cb(self, *args, **kwargs):
-        return self._resizeguest_ui_changed_cb(*args, **kwargs)
 
     def details_page_changed(self, *args, **kwargs):
         return self._page_changed(*args, **kwargs)
-    def details_scaling_ui_changed_cb(self, *args, **kwargs):
-        return self._scaling_ui_changed_cb(*args, **kwargs)
     def details_size_to_vm(self, *args, **kwargs):
         return self._do_size_to_vm(*args, **kwargs)
 
diff --git a/virtManager/vmwindow.py b/virtManager/vmwindow.py
index b4cf20fc..178331b1 100644
--- a/virtManager/vmwindow.py
+++ b/virtManager/vmwindow.py
@@ -90,6 +90,7 @@ class vmmVMWindow(vmmGObjectUI):
         self._vmmenu = None
         self.init_menus()
 
+        self.details_menu_sync_guest_time_on_resume_toggled = None
         self._refresh_sync_guest_time_on_resume_from_settings()
         self.add_gsettings_handle(
             self.vm.on_sync_guest_time_on_resume_changed(
@@ -116,8 +117,6 @@ class vmmVMWindow(vmmGObjectUI):
             "on_details_menu_virtual_manager_activate": self.control_vm_menu,
             "on_details_menu_screenshot_activate": self.control_vm_screenshot,
             "on_details_menu_usb_redirection": self.control_vm_usb_redirection,
-            "on_details_menu_sync_guest_time_on_resume_toggled": (
-                self.details_sync_guest_time_on_resume_changed),
             "on_details_menu_view_toolbar_activate": self.toggle_toolbar,
             "on_details_menu_view_manager_activate": self.view_manager,
             "on_details_menu_view_details_toggled": self.details_console_changed,
@@ -131,14 +130,6 @@ class vmmVMWindow(vmmGObjectUI):
                 self.console.details_toggle_fullscreen),
             "on_details_menu_view_size_to_vm_activate": (
                 self.console.details_size_to_vm),
-            "on_details_menu_view_scale_always_toggled": (
-                self.console.details_scaling_ui_changed_cb),
-            "on_details_menu_view_scale_fullscreen_toggled": (
-                self.console.details_scaling_ui_changed_cb),
-            "on_details_menu_view_scale_never_toggled": (
-                self.console.details_scaling_ui_changed_cb),
-            "on_details_menu_view_resizeguest_toggled": (
-                self.console.details_resizeguest_ui_changed_cb),
 
             "on_console_pages_switch_page": (
                 self.console.details_page_changed),
@@ -512,11 +503,13 @@ class vmmVMWindow(vmmGObjectUI):
                                       buttons=Gtk.ButtonsType.CLOSE)
 
     def _refresh_sync_guest_time_on_resume_from_settings(self):
-        sync_time = self.widget("details-menu-sync-guest-time-on-resume")
-        does_sync_time = self.vm.get_sync_guest_time_on_resume()
-        sync_time.set_active(does_sync_time)
+        self.details_menu_sync_guest_time_on_resume_toggled = self.set_active_wo_signal(
+                self.vm.get_sync_guest_time_on_resume(),
+                self.details_menu_sync_guest_time_on_resume_toggled,
+                self._details_sync_guest_time_on_resume_changed,
+                "details-menu-sync-guest-time-on-resume")
 
-    def details_sync_guest_time_on_resume_changed(self, src):
+    def _details_sync_guest_time_on_resume_changed(self, src):
         if not src.get_sensitive():
             return
         self.vm.set_sync_guest_time_on_resume(src.get_active())
-- 
2.24.0





More information about the virt-tools-list mailing list