mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/virt-viewer
synced 2025-12-29 17:20:34 +00: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,6 +260,52 @@ virt_viewer_app_quit(VirtViewerApp *self)
|
|||||||
gtk_main_quit();
|
gtk_main_quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
gboolean ask = g_key_file_get_boolean(self->priv->config,
|
||||||
|
"virt-viewer", "ask-quit", &error);
|
||||||
|
if (error) {
|
||||||
|
ask = TRUE;
|
||||||
|
g_clear_error(&error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ask) {
|
||||||
|
GtkWidget *dialog =
|
||||||
|
gtk_message_dialog_new (virt_viewer_window_get_window(window),
|
||||||
|
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||||
|
GTK_MESSAGE_QUESTION,
|
||||||
|
GTK_BUTTONS_OK_CANCEL,
|
||||||
|
_("Do you want to close the session?"));
|
||||||
|
|
||||||
|
GtkWidget *check = gtk_check_button_new_with_label(_("Do not ask me again"));
|
||||||
|
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), check);
|
||||||
|
gtk_widget_show(check);
|
||||||
|
|
||||||
|
gint result = gtk_dialog_run(GTK_DIALOG(dialog));
|
||||||
|
|
||||||
|
gboolean dont_ask = FALSE;
|
||||||
|
g_object_get(check, "active", &dont_ask, NULL);
|
||||||
|
if (dont_ask)
|
||||||
|
g_key_file_set_boolean(self->priv->config,
|
||||||
|
"virt-viewer", "ask-quit", FALSE);
|
||||||
|
|
||||||
|
gtk_widget_destroy(dialog);
|
||||||
|
switch (result) {
|
||||||
|
case GTK_RESPONSE_OK:
|
||||||
|
virt_viewer_app_quit(self);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
virt_viewer_app_quit(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void count_window_visible(gpointer key G_GNUC_UNUSED,
|
static void count_window_visible(gpointer key G_GNUC_UNUSED,
|
||||||
gpointer value,
|
gpointer value,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
@ -284,8 +330,6 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
|
|||||||
VirtViewerWindow *window,
|
VirtViewerWindow *window,
|
||||||
gboolean visible)
|
gboolean visible)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
|
||||||
g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(window), FALSE);
|
g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(window), FALSE);
|
||||||
|
|
||||||
@ -298,46 +342,7 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean ask = g_key_file_get_boolean(self->priv->config,
|
virt_viewer_app_maybe_quit(self, window);
|
||||||
"virt-viewer", "ask-quit", &error);
|
|
||||||
if (error) {
|
|
||||||
ask = TRUE;
|
|
||||||
g_clear_error(&error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ask) {
|
|
||||||
GtkWidget *dialog =
|
|
||||||
gtk_message_dialog_new (virt_viewer_window_get_window(window),
|
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
||||||
GTK_MESSAGE_QUESTION,
|
|
||||||
GTK_BUTTONS_OK_CANCEL,
|
|
||||||
_("Do you want to close the session?"));
|
|
||||||
|
|
||||||
GtkWidget *check = gtk_check_button_new_with_label(_("Do not ask me again"));
|
|
||||||
gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), check);
|
|
||||||
gtk_widget_show(check);
|
|
||||||
|
|
||||||
gint result = gtk_dialog_run(GTK_DIALOG(dialog));
|
|
||||||
|
|
||||||
gboolean dont_ask = FALSE;
|
|
||||||
g_object_get(check, "active", &dont_ask, NULL);
|
|
||||||
if (dont_ask)
|
|
||||||
g_key_file_set_boolean(self->priv->config,
|
|
||||||
"virt-viewer", "ask-quit", FALSE);
|
|
||||||
|
|
||||||
gtk_widget_destroy(dialog);
|
|
||||||
switch (result) {
|
|
||||||
case GTK_RESPONSE_OK:
|
|
||||||
virt_viewer_app_quit(self);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return FALSE;
|
|
||||||
} else {
|
|
||||||
virt_viewer_app_quit(self);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_warn_if_reached();
|
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);
|
void virt_viewer_app_set_debug(gboolean debug);
|
||||||
gboolean virt_viewer_app_start(VirtViewerApp *app);
|
gboolean virt_viewer_app_start(VirtViewerApp *app);
|
||||||
void virt_viewer_app_quit(VirtViewerApp *self);
|
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);
|
VirtViewerWindow* virt_viewer_app_get_main_window(VirtViewerApp *self);
|
||||||
void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...);
|
void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...);
|
||||||
void virt_viewer_app_simple_message_dialog(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)
|
VirtViewerWindow *self)
|
||||||
{
|
{
|
||||||
DEBUG_LOG("Window closed");
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user