summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
Diffstat (limited to 'gui')
-rw-r--r--gui/gdmcomm.c6
-rw-r--r--gui/gdmlogin.c60
-rw-r--r--gui/greeter/greeter.c61
3 files changed, 127 insertions, 0 deletions
diff --git a/gui/gdmcomm.c b/gui/gdmcomm.c
index 558460c4..49ef0e40 100644
--- a/gui/gdmcomm.c
+++ b/gui/gdmcomm.c
@@ -468,12 +468,18 @@ gdmcomm_get_error_message (const char *ret, gboolean use_xnest)
return _("The X server is not available, "
"it is likely that gdm is badly "
"configured.");
+ } else if (strncmp (ret, "ERROR 7 ", strlen ("ERROR 7 ")) == 0) {
+ return _("Trying to set an unknown logout action, or trying "
+ "to set a logout action which is not available.");
} else if (strncmp (ret, "ERROR 50 ", strlen ("ERROR 50 ")) == 0) {
return _("Trying to update an unsupported configuration key.");
} else if (strncmp (ret, "ERROR 100 ", strlen ("ERROR 100 ")) == 0) {
return _("You do not seem to have authentication needed "
"be for this operation. Perhaps your .Xauthority "
"file is not set up correctly.");
+ } else if (strncmp (ret, "ERROR 200 ", strlen ("ERROR 200 ")) == 0) {
+ return _("Too many messages were sent to gdm and it hung up"
+ "on us.");
} else {
return _("Unknown error occured.");
}
diff --git a/gui/gdmlogin.c b/gui/gdmlogin.c
index e5ab4b68..196ae820 100644
--- a/gui/gdmlogin.c
+++ b/gui/gdmlogin.c
@@ -129,6 +129,7 @@ static gboolean GdmShowXtermFailsafeSession;
static gboolean GdmShowLastSession;
static gboolean GdmUseCirclesInEntry;
+static gint GdmFlexiReapDelayMinutes;
/* FIXME: Should move everything to externs and move reading to gdmcommon.c */
gchar *GdmInfoMsgFile;
@@ -236,9 +237,34 @@ gdm_timer_up_delay (GSignalInvocationHint *ihint,
if (curdelay < GdmTimedLoginDelay)
curdelay = GdmTimedLoginDelay;
return TRUE;
+}
+
+/* The reaping stuff */
+static time_t last_reap_delay = 0;
+
+static gboolean
+delay_reaping (GSignalInvocationHint *ihint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ last_reap_delay = time (NULL);
+ return TRUE;
}
static gboolean
+reap_flexiserver (gpointer data)
+{
+ if (GdmFlexiReapDelayMinutes > 0 &&
+ ((time (NULL) - last_reap_delay) / 60) > GdmFlexiReapDelayMinutes) {
+ gdm_kill_thingies ();
+ _exit (DISPLAY_REMANAGE);
+ }
+ return TRUE;
+}
+
+
+static gboolean
gdm_event (GSignalInvocationHint *ihint,
guint n_param_values,
const GValue *param_values,
@@ -687,6 +713,7 @@ gdm_login_parse_config (void)
GdmTimedLoginDelay = 5;
}
+ GdmFlexiReapDelayMinutes = ve_config_get_int (config, GDM_KEY_FLEXI_REAP_DELAY_MINUTES);
GdmUse24Clock = ve_config_get_bool (config, GDM_KEY_USE_24_CLOCK);
if (GdmIconMaxWidth < 0) GdmIconMaxWidth = 128;
@@ -3810,6 +3837,39 @@ main (int argc, char *argv[])
NULL /* destroy_notify */);
}
+ /* if a flexiserver, reap self after some time */
+ if (GdmFlexiReapDelayMinutes > 0 &&
+ ! ve_string_empty (g_getenv ("GDM_FLEXI_SERVER")) &&
+ /* but don't reap Xnest flexis */
+ ve_string_empty (g_getenv ("GDM_PARENT_DISPLAY"))) {
+ guint sid = g_signal_lookup ("activate",
+ GTK_TYPE_MENU_ITEM);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ sid = g_signal_lookup ("key_press_event",
+ GTK_TYPE_WIDGET);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ sid = g_signal_lookup ("button_press_event",
+ GTK_TYPE_WIDGET);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ last_reap_delay = time (NULL);
+ g_timeout_add (60*1000, reap_flexiserver, NULL);
+ }
+
if G_LIKELY (g_getenv ("RUNNING_UNDER_GDM") != NULL) {
guint sid = g_signal_lookup ("event",
GTK_TYPE_WIDGET);
diff --git a/gui/greeter/greeter.c b/gui/greeter/greeter.c
index 1ace5779..96222f52 100644
--- a/gui/greeter/greeter.c
+++ b/gui/greeter/greeter.c
@@ -72,6 +72,7 @@ gchar *GdmWelcome;
gchar *GdmServAuthDir;
gchar *GdmInfoMsgFile;
gchar *GdmInfoMsgFont;
+gint GdmFlexiReapDelayMinutes;
gboolean GdmUseCirclesInEntry = FALSE;
@@ -184,6 +185,8 @@ greeter_parse_config (void)
}
greeter_current_delay = GdmTimedLoginDelay;
+ GdmFlexiReapDelayMinutes = ve_config_get_int (config, GDM_KEY_FLEXI_REAP_DELAY_MINUTES);
+
GdmUse24Clock = ve_config_get_bool (config, GDM_KEY_USE_24_CLOCK);
GdmIconMaxWidth = ve_config_get_int (config, GDM_KEY_ICONWIDTH);
@@ -964,6 +967,30 @@ setup_background_color (void)
}
}
+/* The reaping stuff */
+static time_t last_reap_delay = 0;
+
+static gboolean
+delay_reaping (GSignalInvocationHint *ihint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ last_reap_delay = time (NULL);
+ return TRUE;
+}
+
+static gboolean
+reap_flexiserver (gpointer data)
+{
+ if (GdmFlexiReapDelayMinutes > 0 &&
+ ((time (NULL) - last_reap_delay) / 60) > GdmFlexiReapDelayMinutes) {
+ _exit (DISPLAY_REMANAGE);
+ }
+ return TRUE;
+}
+
+
void
gdm_kill_thingies (void)
{
@@ -1344,6 +1371,40 @@ main (int argc, char *argv[])
gdm_wm_no_login_focus_pop ();
}
+ /* if a flexiserver, reap self after some time */
+ if (GdmFlexiReapDelayMinutes > 0 &&
+ ! ve_string_empty (g_getenv ("GDM_FLEXI_SERVER")) &&
+ /* but don't reap Xnest flexis */
+ ve_string_empty (g_getenv ("GDM_PARENT_DISPLAY")))
+ {
+ guint sid = g_signal_lookup ("activate",
+ GTK_TYPE_MENU_ITEM);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ sid = g_signal_lookup ("key_press_event",
+ GTK_TYPE_WIDGET);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ sid = g_signal_lookup ("button_press_event",
+ GTK_TYPE_WIDGET);
+ g_signal_add_emission_hook (sid,
+ 0 /* detail */,
+ delay_reaping,
+ NULL /* data */,
+ NULL /* destroy_notify */);
+
+ last_reap_delay = time (NULL);
+ g_timeout_add (60*1000, reap_flexiserver, NULL);
+ }
+
gdm_wm_restore_wm_order ();
gdm_common_show_info_msg ();