Subject: systray: Cleanups and improvements for --show-systray From: Cole Robinson crobinso@redhat.com Sun Mar 3 11:54:37 2024 -0500 Date: Sun Mar 3 14:18:04 2024 -0500: Git: a6b62a20b62ac86e0c40d18f188b312513bafdd9 - Add UI coverage - Drop redundant systray_instance caching - Tweaks help test and docs - Show an error if the systray doesn't embed Signed-off-by: Cole Robinson diff --git a/man/virt-manager.rst b/man/virt-manager.rst index e06a0ecc..44316ab3 100644 --- a/man/virt-manager.rst +++ b/man/virt-manager.rst @@ -88,6 +88,7 @@ URI. ``--show-host-summary`` Display the host/connection details window. + SYSTEM TRAY OPTION ================== @@ -95,7 +96,8 @@ Connection autostart will not be disabled and thus don't require specifying a manual ``--connect`` URI. But it supports ``--connect`` URI as well: ``--show-systray`` - Launch virt-manager in system tray + Launch virt-manager only in system tray + BUGS ==== diff --git a/tests/uitests/test_cli.py b/tests/uitests/test_cli.py index e55ce396..e9f11db8 100644 --- a/tests/uitests/test_cli.py +++ b/tests/uitests/test_cli.py @@ -80,6 +80,19 @@ def testShowDelete(app): app.wait_for_exit() +def testShowSystray(app): + opts = ["--test-options=fake-systray", "--show-systray"] + app.open(use_uri=False, + extra_opts=opts, + window_name="vmm-fake-systray") + app.sleep(1) + app.stop() + + app.open(uri="test:///default", + extra_opts=opts, + window_name="vmm-fake-systray") + + def testShowRemoteDBusConnect(app): """ Test the remote app dbus connection diff --git a/virtManager/engine.py b/virtManager/engine.py index e5aa3eb4..ebc020ab 100644 --- a/virtManager/engine.py +++ b/virtManager/engine.py @@ -64,8 +64,6 @@ class vmmEngine(vmmGObject): self._exiting = False - self.systray_instance = None - self._window_count = 0 self._gtkapplication = None self._init_gtk_application() @@ -98,7 +96,7 @@ class vmmEngine(vmmGObject): """ Actual startup routines if we are running a new instance of the app """ - self.systray_instance = vmmSystray.get_instance() + vmmSystray.get_instance() vmmInspection.get_instance() self.add_gsettings_handle( @@ -335,6 +333,30 @@ class vmmEngine(vmmGObject): """ return vmmSystray.get_instance().is_embedded() + def _show_systray_from_cli(self): + """ + Handler for --show-systray from CLI. + We force show the systray, and wait for a timeout to report if + its embedded. If not we raise an error and exit the app + """ + vmmSystray.get_instance().show_from_cli() + + @_show_startup_error + def check(self, count): + count -= 1 + if self._systray_is_embedded(): + log.debug("systray embedded") + return + if count <= 0: # pragma: no cover + raise RuntimeError("systray did not show up") + self.timeout_add(1000, check, self, count) # pragma: no cover + + startcount = 5 + timeout = 1000 + if self.config.CLITestOptions.fake_systray: + timeout = 1 + self.timeout_add(timeout, check, self, startcount) + def _can_exit(self): return (self._window_count <= 0 and not self._systray_is_embedded()) @@ -445,8 +467,8 @@ class vmmEngine(vmmGObject): self.CLI_SHOW_DOMAIN_DELETE]): self._cli_show_vm_helper(uri, clistr, show_window) elif show_window == self.CLI_SHOW_SYSTEM_TRAY: - log.debug("Showing in the system tray") - self.systray_instance._show_systray() + # Handled elsewhere + pass else: # pragma: no cover raise RuntimeError("Unknown cli window command '%s'" % show_window) @@ -466,12 +488,13 @@ class vmmEngine(vmmGObject): log.debug("processing cli command uri=%s show_window=%s domain=%s", uri, show_window, domain) - if not uri: - if show_window == self.CLI_SHOW_SYSTEM_TRAY: - log.debug("Launching in the system tray without --connect") - self.systray_instance._show_systray() - return + if show_window == self.CLI_SHOW_SYSTEM_TRAY: + log.debug("Launching only in the system tray") + self._show_systray_from_cli() + if not uri: + return + elif not uri: log.debug("No cli action requested, launching default window") self._get_manager().show() return diff --git a/virtManager/systray.py b/virtManager/systray.py index cba06cc1..a3cef04a 100644 --- a/virtManager/systray.py +++ b/virtManager/systray.py @@ -434,6 +434,9 @@ class vmmSystray(vmmGObject): def is_embedded(self): return self._systray and self._systray.is_embedded() + def show_from_cli(self): + self._show_systray() + def _cleanup(self): self._hide_systray() self._systray = None diff --git a/virtManager/virtmanager.py b/virtManager/virtmanager.py index 418fd336..e25c7628 100644 --- a/virtManager/virtmanager.py +++ b/virtManager/virtmanager.py @@ -156,7 +156,7 @@ def parse_commandline(): parser.add_argument("--show-host-summary", action="store_true", help="Show connection details window") parser.add_argument("--show-systray", action="store_true", - help="Launch virt-manager in system tray") + help="Launch virt-manager only in system tray") return parser.parse_known_args()