--- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -134,6 +134,7 @@ gboolean authretry; gboolean started; gboolean fullscreen; + gboolean hide_toolbar; gboolean attach; gboolean shared; gboolean quitting; @@ -951,6 +952,13 @@ { gchar *subtitle = NULL; const gchar *title = virt_viewer_app_get_title(app); + + /* Hidden fullscreen windows use the requested title as stable identity. */ + if (title != NULL && virt_viewer_app_get_hide_toolbar(app) && + virt_viewer_app_get_fullscreen(app)) { + g_object_set(window, "subtitle", title, NULL); + return; + } if (title != NULL) { VirtViewerDisplay *display = virt_viewer_window_get_display(window); @@ -2134,6 +2142,7 @@ static gboolean opt_verbose = FALSE; static gboolean opt_debug = FALSE; static gboolean opt_fullscreen = FALSE; +static gboolean opt_hide_toolbar = FALSE; static gboolean opt_kiosk = FALSE; static gboolean opt_kiosk_quit = FALSE; static gchar *opt_cursor = NULL; @@ -2437,6 +2446,7 @@ { "smartcard-remove", "app.smartcard-remove", {"F9", NULL, NULL} }, { "secure-attention", "win.secure-attention", {"End", NULL, NULL} }, { "usb-device-reset", "win.usb-device-reset", {"r", NULL, NULL} }, + { "usb-device-select", "win.usb-device-select", {NULL, NULL, NULL} }, }; static gchar **hotkey_names; @@ -2484,6 +2494,7 @@ priv->resource = virt_viewer_get_resource(); virt_viewer_app_set_debug(opt_debug); + priv->hide_toolbar = opt_hide_toolbar; virt_viewer_app_set_fullscreen(self, opt_fullscreen); virt_viewer_app_set_keymap(self, opt_keymap); @@ -3098,6 +3109,14 @@ } gboolean +virt_viewer_app_get_hide_toolbar(VirtViewerApp *self) +{ + VirtViewerAppPrivate *priv = virt_viewer_app_get_instance_private(self); + + return priv->hide_toolbar; +} + +gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *self) { g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE); @@ -3557,6 +3576,8 @@ N_("Zoom level of window, in percentage"), "ZOOM" }, { "full-screen", 'f', 0, G_OPTION_ARG_NONE, &opt_fullscreen, N_("Open in full screen mode (adjusts guest resolution to fit the client)"), NULL }, + { "hide-toolbar", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_toolbar, + N_("Hide the toolbar in full screen mode"), NULL }, { "hotkeys", 'H', 0, G_OPTION_ARG_STRING, &opt_hotkeys, N_("Customise hotkeys"), NULL }, { "auto-resize", '\0', 0, G_OPTION_ARG_STRING, &opt_resize, --- a/src/virt-viewer-app.h +++ b/src/virt-viewer-app.h @@ -100,6 +100,7 @@ GList* virt_viewer_app_get_windows(VirtViewerApp *self); VirtViewerSession* virt_viewer_app_get_session(VirtViewerApp *self); gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *app); +gboolean virt_viewer_app_get_hide_toolbar(VirtViewerApp *app); void virt_viewer_app_clear_hotkeys(VirtViewerApp *app); GList* virt_viewer_app_get_initial_displays(VirtViewerApp* self); gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display); --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -740,9 +740,10 @@ return; } - if (!self->kiosk) { - virt_viewer_timed_revealer_force_reveal(self->revealer, TRUE); - } + gboolean hide_toolbar = virt_viewer_app_get_hide_toolbar(self->app); + gtk_widget_set_visible(GTK_WIDGET(self->revealer), !hide_toolbar); + virt_viewer_timed_revealer_force_reveal(self->revealer, + !self->kiosk && !hide_toolbar); if (self->display) { virt_viewer_display_set_monitor(self->display, monitor); @@ -1354,6 +1355,13 @@ title = g_strdup(g_get_application_name()); } + /* Keep exact workspace identity across pointer/keyboard grab changes. */ + if (self->app && virt_viewer_app_get_hide_toolbar(self->app) && + virt_viewer_app_get_fullscreen(self->app) && self->subtitle) { + g_free(title); + title = g_strdup(self->subtitle); + } + gtk_window_set_title(GTK_WINDOW(self->window), title); if (self->subtitle) { gtk_header_bar_set_title(GTK_HEADER_BAR(header), self->subtitle);