From e58cc956b560773358a56608d6c755e3ca91f0bc Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Sun, 20 Sep 2020 21:55:27 -0400 Subject: [PATCH] vmwindow: vm state-changed update flow changes * Don't process events when the window isn't showing * Only update console/details if that tab is actually selected. Otherwise in some corner cases we can connect to the VM console while on the details page Signed-off-by: Cole Robinson --- virtManager/details/console.py | 3 ++- virtManager/details/details.py | 40 ++++++++++++++++++-------------- virtManager/details/snapshots.py | 2 +- virtManager/vmwindow.py | 29 ++++++++++++----------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/virtManager/details/console.py b/virtManager/details/console.py index 83fda7b1..c4ed478e 100644 --- a/virtManager/details/console.py +++ b/virtManager/details/console.py @@ -589,6 +589,7 @@ class vmmConsolePages(vmmGObjectUI): self.widget("console-gfx-viewport")) self._viewer.cleanup() self._viewer = None + log.debug("Viewer disconnected") def _refresh_vm_state(self): self._activate_default_console_page() @@ -963,7 +964,7 @@ class vmmConsolePages(vmmGObjectUI): def vmwindow_viewer_get_pixbuf(self): return self._viewer.console_get_pixbuf() - def vmwindow_close_viewer(self): + def vmwindow_close(self): return self._activate_vm_unavailable_page( _("Viewer disconnected.")) def vmwindow_get_title_message(self): diff --git a/virtManager/details/details.py b/virtManager/details/details.py index 796c019d..2de7e810 100644 --- a/virtManager/details/details.py +++ b/virtManager/details/details.py @@ -975,12 +975,31 @@ class vmmDetails(vmmGObjectUI): # vmwindow Public API # ####################### + def _refresh_vm_state(self): + active = self.vm.is_active() + self.widget("overview-name").set_editable(not active) + + reason = self.vm.run_status_reason() + if reason: + status = "%s (%s)" % (self.vm.run_status(), reason) + else: + status = self.vm.run_status() + self.widget("overview-status-text").set_text(status) + self.widget("overview-status-icon").set_from_icon_name( + self.vm.run_status_icon_name(), + Gtk.IconSize.BUTTON) + def vmwindow_resources_refreshed(self): row = self._get_hw_row() if row and row[HW_LIST_COL_TYPE] == HW_LIST_TYPE_STATS: self._refresh_stats_page() - def vmwindow_page_refresh(self): + def vmwindow_refresh_vm_state(self, is_current_page): + if not is_current_page: + self._disable_apply() + return + + self._refresh_vm_state() self._repopulate_hw_list() if self.widget("config-apply").get_sensitive(): @@ -1002,23 +1021,8 @@ class vmmDetails(vmmGObjectUI): def vmwindow_has_unapplied_changes(self): return self._has_unapplied_changes(self._get_hw_row()) - def vmwindow_refresh_vm_state(self): - active = self.vm.is_active() - self.widget("overview-name").set_editable(not active) - - reason = self.vm.run_status_reason() - if reason: - status = "%s (%s)" % (self.vm.run_status(), reason) - else: - status = self.vm.run_status() - self.widget("overview-status-text").set_text(status) - self.widget("overview-status-icon").set_from_icon_name( - self.vm.run_status_icon_name(), - Gtk.IconSize.BUTTON) - - def vmwindow_show_details(self): - # When vmwindow switches to use, refresh the current page - self._refresh_page() + def vmwindow_close(self): + self._disable_apply() ############################## diff --git a/virtManager/details/snapshots.py b/virtManager/details/snapshots.py index 8c7b2346..83c06768 100644 --- a/virtManager/details/snapshots.py +++ b/virtManager/details/snapshots.py @@ -420,7 +420,7 @@ class vmmSnapshotPage(vmmGObjectUI): self.vm.refresh_snapshots() self._populate_snapshot_list(select_name) - def show_page(self): + def vmwindow_refresh_vm_state(self): if not self._initial_populate: self._populate_snapshot_list() diff --git a/virtManager/vmwindow.py b/virtManager/vmwindow.py index 84715abc..7783ead4 100644 --- a/virtManager/vmwindow.py +++ b/virtManager/vmwindow.py @@ -251,10 +251,8 @@ class vmmVMWindow(vmmGObjectUI): return self.topwin.hide() - try: - self._console.vmwindow_close_viewer() - except Exception: # pragma: no cover - log.error("Failure when disconnecting from desktop server") + self._console.vmwindow_close() + self._details.vmwindow_close() self.emit("closed") vmmEngine.get_instance().decrement_window_counter() @@ -336,10 +334,8 @@ class vmmVMWindow(vmmGObjectUI): return if is_details: - self._details.vmwindow_show_details() pages.set_current_page(DETAILS_PAGE_DETAILS) elif is_snapshot: - self._snapshots.show_page() pages.set_current_page(DETAILS_PAGE_SNAPSHOTS) else: pages.set_current_page(DETAILS_PAGE_CONSOLE) @@ -438,8 +434,6 @@ class vmmVMWindow(vmmGObjectUI): self.widget("control-snapshots").set_tooltip_text(tooltip) self._refresh_current_page() - self._details.vmwindow_refresh_vm_state() - self._console.vmwindow_refresh_vm_state() ############################# @@ -584,10 +578,15 @@ class vmmVMWindow(vmmGObjectUI): self._details.vmwindow_resources_refreshed() def _refresh_current_page(self, newpage=None): - if not newpage: - newpage = self.widget("details-pages").get_current_page() - if newpage == DETAILS_PAGE_DETAILS: - self._details.vmwindow_page_refresh() + newpage = newpage or self.widget("details-pages").get_current_page() + + is_details = newpage == DETAILS_PAGE_DETAILS + self._details.vmwindow_refresh_vm_state(is_details) + + if newpage == DETAILS_PAGE_CONSOLE: + self._console.vmwindow_refresh_vm_state() + elif newpage == DETAILS_PAGE_SNAPSHOTS: + self._snapshots.vmwindow_refresh_vm_state() ######################### @@ -698,10 +697,12 @@ class vmmVMWindow(vmmGObjectUI): self._refresh_title() def _vm_state_changed_cb(self, src): - self._refresh_vm_state() + if self.is_visible(): + self._refresh_vm_state() def _resources_sampled_cb(self, src): - self._refresh_resources() + if self.is_visible(): + self._refresh_resources() def _console_page_changed_cb(self, src): self._sync_console_page_menu_state()