SHA256
1
0
forked from pool/gdm
gdm/gdm-xdmcp-disconnect.patch

190 lines
8.0 KiB
Diff

From 650465cb691a0eb52a84b0ff3eea64ac82168a43 Mon Sep 17 00:00:00 2001
From: Vincent Untz <vuntz@gnome.org>
Date: Thu, 03 Feb 2011 20:52:49 +0000
Subject: greeter: inform daemon when user disconnects
This is so the daemon knows the user is intentionally
disconnecting and it's not just the greeter tanking.
---
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-login-window.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.c
@@ -143,7 +143,6 @@ enum {
QUERY_ANSWER,
START_SESSION,
USER_SELECTED,
- DISCONNECTED,
CANCELLED,
LAST_SIGNAL
};
@@ -1519,16 +1518,6 @@ gdm_greeter_login_window_class_init (Gdm
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
- signals [DISCONNECTED] =
- g_signal_new ("disconnected",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, disconnected),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
signals [START_SESSION] =
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.h
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-login-window.h
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-login-window.h
@@ -56,7 +56,6 @@ typedef struct
void (* user_selected) (GdmGreeterLoginWindow *login_window,
const char *text);
void (* cancelled) (GdmGreeterLoginWindow *login_window);
- void (* disconnected) (GdmGreeterLoginWindow *login_window);
void (* start_session) (GdmGreeterLoginWindow *login_window);
} GdmGreeterLoginWindowClass;
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-panel.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.c
@@ -105,6 +105,7 @@ enum {
LANGUAGE_SELECTED,
LAYOUT_SELECTED,
SESSION_SELECTED,
+ DISCONNECTED,
NUMBER_OF_SIGNALS
};
@@ -633,9 +634,10 @@ do_system_stop (void)
}
static void
-do_disconnect (void)
+do_disconnect (GtkWidget *widget,
+ GdmGreeterPanel *panel)
{
- gtk_main_quit ();
+ g_signal_emit (panel, signals[DISCONNECTED], 0);
}
static gboolean
@@ -818,7 +820,7 @@ setup_panel (GdmGreeterPanel *panel)
if (! panel->priv->display_is_local) {
menu_item = gtk_menu_item_new_with_label ("Disconnect");
- g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_disconnect), NULL);
+ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_disconnect), panel);
gtk_menu_shell_append (GTK_MENU_SHELL (panel->priv->shutdown_menu), menu_item);
} else if (get_show_restart_buttons (panel)) {
if (can_suspend ()) {
@@ -982,6 +984,17 @@ gdm_greeter_panel_class_init (GdmGreeter
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ signals [DISCONNECTED] =
+ g_signal_new ("disconnected",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmGreeterPanelClass, disconnected),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
g_type_class_add_private (klass, sizeof (GdmGreeterPanelPrivate));
}
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.h
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-panel.h
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-panel.h
@@ -53,6 +53,7 @@ typedef struct
void (* session_selected) (GdmGreeterPanel *panel,
const char *text);
+ void (* disconnected) (GdmGreeterPanel *panel);
} GdmGreeterPanelClass;
GType gdm_greeter_panel_get_type (void);
Index: gdm-2.32.0/gui/simple-greeter/gdm-greeter-session.c
===================================================================
--- gdm-2.32.0.orig/gui/simple-greeter/gdm-greeter-session.c
+++ gdm-2.32.0/gui/simple-greeter/gdm-greeter-session.c
@@ -296,8 +296,7 @@ on_cancelled (GdmGreeterLoginWindow *log
}
static void
-on_disconnected (GdmGreeterLoginWindow *login_window,
- GdmGreeterSession *session)
+on_disconnected (GdmGreeterSession *session)
{
gdm_greeter_client_call_disconnect (session->priv->client);
}
@@ -380,6 +379,11 @@ toggle_panel (GdmGreeterSession *session
G_CALLBACK (on_select_session),
session);
+ g_signal_connect_swapped (session->priv->panel,
+ "disconnected",
+ G_CALLBACK (on_disconnected),
+ session);
+
gtk_widget_show (session->priv->panel);
} else {
gtk_widget_destroy (session->priv->panel);
@@ -427,10 +431,6 @@ toggle_login_window (GdmGreeterSession *
G_CALLBACK (on_cancelled),
session);
g_signal_connect (session->priv->login_window,
- "disconnected",
- G_CALLBACK (on_disconnected),
- session);
- g_signal_connect (session->priv->login_window,
"start-session",
G_CALLBACK (on_start_session),
session);
Index: gdm-2.32.0/daemon/gdm-simple-slave.c
===================================================================
--- gdm-2.32.0.orig/daemon/gdm-simple-slave.c
+++ gdm-2.32.0/daemon/gdm-simple-slave.c
@@ -921,6 +921,23 @@ on_greeter_connected (GdmGreeterServer *
}
static void
+on_greeter_disconnected (GdmGreeterServer *greeter_server,
+ GdmSimpleSlave *slave)
+{
+ gboolean display_is_local;
+
+ g_debug ("GdmSimpleSlave: Greeter disconnected");
+
+ g_object_get (slave,
+ "display-is-local", &display_is_local,
+ NULL);
+
+ if ( ! display_is_local) {
+ gdm_slave_stopped (GDM_SLAVE (slave));
+ }
+}
+
+static void
on_start_session_when_ready (GdmGreeterServer *session,
GdmSimpleSlave *slave)
{
@@ -1116,6 +1133,10 @@ start_greeter (GdmSimpleSlave *slave)
G_CALLBACK (on_greeter_connected),
slave);
g_signal_connect (slave->priv->greeter_server,
+ "disconnected",
+ G_CALLBACK (on_greeter_disconnected),
+ slave);
+ g_signal_connect (slave->priv->greeter_server,
"cancelled",
G_CALLBACK (on_greeter_cancel),
slave);