mirror of
https://gitlab.com/virt-viewer/virt-viewer.git
synced 2025-03-09 08:58:17 +03:00
Exit virt-viewer when trying to close any window
Currently, in multi-screen scenarios, when closing one remote-viewer window, the corresponding screen gets disabled in the guest OS. This can be confusing as this behaves very differently from File/Quit. This commit will exit the whole application when the user tries to close one of virt-viewer window.
This commit is contained in:
parent
284aecf0ce
commit
20eb200ca5
@ -260,44 +260,11 @@ virt_viewer_app_quit(VirtViewerApp *self)
|
||||
gtk_main_quit();
|
||||
}
|
||||
|
||||
static void count_window_visible(gpointer key G_GNUC_UNUSED,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *win = virt_viewer_window_get_window(VIRT_VIEWER_WINDOW(value));
|
||||
guint *n = (guint*)user_data;
|
||||
|
||||
if (gtk_widget_get_visible(GTK_WIDGET(win)))
|
||||
*n += 1;
|
||||
}
|
||||
|
||||
static guint
|
||||
virt_viewer_app_get_n_windows_visible(VirtViewerApp *self)
|
||||
{
|
||||
guint n = 0;
|
||||
g_hash_table_foreach(self->priv->windows, count_window_visible, &n);
|
||||
return n;
|
||||
}
|
||||
|
||||
gboolean
|
||||
virt_viewer_app_window_set_visible(VirtViewerApp *self,
|
||||
VirtViewerWindow *window,
|
||||
gboolean visible)
|
||||
void
|
||||
virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window)
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(window), FALSE);
|
||||
|
||||
if (visible) {
|
||||
virt_viewer_window_show(window);
|
||||
return TRUE;
|
||||
} else {
|
||||
if (virt_viewer_app_get_n_windows_visible(self) > 1) {
|
||||
virt_viewer_window_hide(window);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean ask = g_key_file_get_boolean(self->priv->config,
|
||||
"virt-viewer", "ask-quit", &error);
|
||||
if (error) {
|
||||
@ -333,11 +300,49 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
} else {
|
||||
virt_viewer_app_quit(self);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void count_window_visible(gpointer key G_GNUC_UNUSED,
|
||||
gpointer value,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *win = virt_viewer_window_get_window(VIRT_VIEWER_WINDOW(value));
|
||||
guint *n = (guint*)user_data;
|
||||
|
||||
if (gtk_widget_get_visible(GTK_WIDGET(win)))
|
||||
*n += 1;
|
||||
}
|
||||
|
||||
static guint
|
||||
virt_viewer_app_get_n_windows_visible(VirtViewerApp *self)
|
||||
{
|
||||
guint n = 0;
|
||||
g_hash_table_foreach(self->priv->windows, count_window_visible, &n);
|
||||
return n;
|
||||
}
|
||||
|
||||
gboolean
|
||||
virt_viewer_app_window_set_visible(VirtViewerApp *self,
|
||||
VirtViewerWindow *window,
|
||||
gboolean visible)
|
||||
{
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
||||
g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(window), FALSE);
|
||||
|
||||
if (visible) {
|
||||
virt_viewer_window_show(window);
|
||||
return TRUE;
|
||||
} else {
|
||||
if (virt_viewer_app_get_n_windows_visible(self) > 1) {
|
||||
virt_viewer_window_hide(window);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
virt_viewer_app_maybe_quit(self, window);
|
||||
}
|
||||
|
||||
g_warn_if_reached();
|
||||
|
@ -65,6 +65,7 @@ void virt_viewer_app_set_title(VirtViewerApp *app, const char *title);
|
||||
void virt_viewer_app_set_debug(gboolean debug);
|
||||
gboolean virt_viewer_app_start(VirtViewerApp *app);
|
||||
void virt_viewer_app_quit(VirtViewerApp *self);
|
||||
void virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window);
|
||||
VirtViewerWindow* virt_viewer_app_get_main_window(VirtViewerApp *self);
|
||||
void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...);
|
||||
void virt_viewer_app_simple_message_dialog(VirtViewerApp *self, const char *fmt, ...);
|
||||
|
@ -701,7 +701,7 @@ virt_viewer_window_delete(GtkWidget *src G_GNUC_UNUSED,
|
||||
VirtViewerWindow *self)
|
||||
{
|
||||
DEBUG_LOG("Window closed");
|
||||
virt_viewer_app_window_set_visible(self->priv->app, self, FALSE);
|
||||
virt_viewer_app_maybe_quit(self->priv->app, self);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user