summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog22
-rw-r--r--common/gdm-address.c9
-rw-r--r--daemon/gdm-xdmcp-display-factory.c10
-rw-r--r--gui/simple-chooser/chooser-main.c2
-rw-r--r--gui/simple-greeter/Makefile.am13
-rw-r--r--gui/simple-greeter/gdm-remote-login-window.c228
-rw-r--r--gui/simple-greeter/gdm-remote-login-window.h61
-rw-r--r--gui/simple-greeter/test-remote-login-window.c99
8 files changed, 433 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 032d9c30..5046bcdd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2008-01-21 William Jon McCann <mccann@jhu.edu>
+
+ * common/gdm-address.c: (gdm_address_peek_local_list):
+ * daemon/gdm-xdmcp-display-factory.c:
+ (gdm_xdmcp_display_factory_class_init),
+ (gdm_xdmcp_display_factory_finalize):
+ Merge a few changes from the 2.20 branch.
+
+ * gui/simple-chooser/chooser-main.c: (main):
+ * gui/simple-greeter/Makefile.am:
+ * gui/simple-greeter/gdm-remote-login-window.c: (start_xephyr),
+ (gdm_remote_login_window_connect),
+ (gdm_remote_login_window_set_property),
+ (gdm_remote_login_window_get_property),
+ (gdm_remote_login_window_constructor),
+ (gdm_remote_login_window_class_init),
+ (gdm_remote_login_window_init), (gdm_remote_login_window_finalize),
+ (gdm_remote_login_window_new):
+ * gui/simple-greeter/gdm-remote-login-window.h:
+ * gui/simple-greeter/test-remote-login-window.c: (main):
+ Add initial remote login (xdmcp) client window.
+
2008-01-18 William Jon McCann <mccann@jhu.edu>
* configure.ac: Post release version bump
diff --git a/common/gdm-address.c b/common/gdm-address.c
index 75ecad43..490b7fcc 100644
--- a/common/gdm-address.c
+++ b/common/gdm-address.c
@@ -286,7 +286,6 @@ gdm_address_peek_local_list (void)
static GList *the_list = NULL;
static time_t last_time = 0;
char hostbuf[BUFSIZ];
- struct addrinfo hints;
struct addrinfo *result;
struct addrinfo *res;
@@ -307,14 +306,8 @@ gdm_address_peek_local_list (void)
snprintf (hostbuf, BUFSIZ-1, "localhost");
}
- memset (&hints, 0, sizeof (hints));
- hints.ai_family = AF_INET;
-#ifdef ENABLE_IPV6
- hints.ai_family |= AF_INET6;
-#endif
-
result = NULL;
- if (getaddrinfo (hostbuf, NULL, &hints, &result) != 0) {
+ if (getaddrinfo (hostbuf, NULL, NULL, &result) != 0) {
g_debug ("%s: Could not get address from hostname!", "gdm_peek_local_address_list");
return NULL;
diff --git a/daemon/gdm-xdmcp-display-factory.c b/daemon/gdm-xdmcp-display-factory.c
index 26fb250b..b3e4b483 100644
--- a/daemon/gdm-xdmcp-display-factory.c
+++ b/daemon/gdm-xdmcp-display-factory.c
@@ -77,6 +77,7 @@ int deny_severity = LOG_WARNING;
#define DEFAULT_MAX_DISPLAYS 16
#define DEFAULT_MAX_PENDING_DISPLAYS 4
#define DEFAULT_MAX_WAIT 15
+#define DEFAULT_WILLING_SCRIPT GDMCONFDIR "/Xwilling"
#define GDM_MAX_FORWARD_QUERIES 10
#define GDM_FORWARD_QUERY_TIMEOUT 30
@@ -193,7 +194,7 @@ enum {
static void gdm_xdmcp_display_factory_class_init (GdmXdmcpDisplayFactoryClass *klass);
static void gdm_xdmcp_display_factory_init (GdmXdmcpDisplayFactory *manager);
-static void gdm_xdmcp_display_factory_finalize (GObject *object);
+static void gdm_xdmcp_display_factory_finalize (GObject *object);
static gpointer xdmcp_display_factory_object = NULL;
@@ -2947,7 +2948,7 @@ gdm_xdmcp_display_factory_class_init (GdmXdmcpDisplayFactoryClass *klass)
g_param_spec_string ("willing-script",
"willing-script",
"willing-script",
- NULL,
+ DEFAULT_WILLING_SCRIPT,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
g_object_class_install_property (object_class,
PROP_MAX_DISPLAYS_PER_HOST,
@@ -3036,6 +3037,11 @@ gdm_xdmcp_display_factory_finalize (GObject *object)
g_source_remove (factory->priv->socket_watch_id);
}
+ if (factory->priv->socket_fd > 0) {
+ close (factory->priv->socket_fd);
+ factory->priv->socket_fd = -1;
+ }
+
g_slist_free (factory->priv->forward_queries);
g_slist_free (factory->priv->managed_forwards);
diff --git a/gui/simple-chooser/chooser-main.c b/gui/simple-chooser/chooser-main.c
index b042274e..459bc0d2 100644
--- a/gui/simple-chooser/chooser-main.c
+++ b/gui/simple-chooser/chooser-main.c
@@ -69,7 +69,7 @@ main (int argc, char *argv[])
char *hostname;
hostname = gdm_host_chooser_dialog_get_current_hostname (GDM_HOST_CHOOSER_DIALOG (chooser));
- g_message ("Hostname: %s", hostname);
+ g_print ("hostname: %s\n", hostname);
g_free (hostname);
}
diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
index 6fe7c5cf..1106650e 100644
--- a/gui/simple-greeter/Makefile.am
+++ b/gui/simple-greeter/Makefile.am
@@ -29,6 +29,7 @@ schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
noinst_PROGRAMS = \
test-greeter-login-window \
+ test-remote-login-window \
test-greeter-panel \
test-language-chooser \
test-session-chooser \
@@ -70,6 +71,16 @@ test_greeter_panel_LDADD = \
$(top_builddir)/gui/simple-greeter/libnotificationarea/libnotificationarea.la \
$(NULL)
+test_remote_login_window_SOURCES = \
+ test-remote-login-window.c \
+ gdm-remote-login-window.h \
+ gdm-remote-login-window.c \
+ $(NULL)
+
+test_remote_login_window_LDADD = \
+ $(GTK_LIBS) \
+ $(NULL)
+
test_language_chooser_SOURCES = \
test-language-chooser.c \
gdm-language-chooser-widget.h \
@@ -146,6 +157,8 @@ gdm_simple_greeter_SOURCES = \
gdm-session-client.c \
gdm-greeter-login-window.c \
gdm-greeter-login-window.h \
+ gdm-remote-login-window.c \
+ gdm-remote-login-window.h \
gdm-greeter-panel.h \
gdm-greeter-panel.c \
gdm-session-chooser-widget.h \
diff --git a/gui/simple-greeter/gdm-remote-login-window.c b/gui/simple-greeter/gdm-remote-login-window.c
new file mode 100644
index 00000000..28e9fab7
--- /dev/null
+++ b/gui/simple-greeter/gdm-remote-login-window.c
@@ -0,0 +1,228 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <glib-object.h>
+
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+#include "gdm-remote-login-window.h"
+
+#define GDM_REMOTE_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_REMOTE_LOGIN_WINDOW, GdmRemoteLoginWindowPrivate))
+
+struct GdmRemoteLoginWindowPrivate
+{
+ gboolean connected;
+ char *hostname;
+ char *display;
+};
+
+enum {
+ PROP_0,
+};
+
+enum {
+ DISCONNECTED,
+ LAST_SIGNAL
+};
+
+static guint signals [LAST_SIGNAL] = { 0, };
+
+static void gdm_remote_login_window_class_init (GdmRemoteLoginWindowClass *klass);
+static void gdm_remote_login_window_init (GdmRemoteLoginWindow *remote_login_window);
+static void gdm_remote_login_window_finalize (GObject *object);
+
+G_DEFINE_TYPE (GdmRemoteLoginWindow, gdm_remote_login_window, GTK_TYPE_WINDOW)
+
+static gboolean
+start_xephyr (GdmRemoteLoginWindow *login_window)
+{
+ char *cmd;
+ gboolean res;
+ GError *error;
+
+ cmd = g_strdup_printf ("Xephyr -query %s -parent 0x%x %s",
+ login_window->priv->hostname,
+ (unsigned int)GDK_WINDOW_XID (GTK_WIDGET (login_window)->window),
+ login_window->priv->display);
+ g_debug ("Running: %s", cmd);
+
+ error = NULL;
+ res = g_spawn_command_line_async (cmd, &error);
+
+ g_free (cmd);
+
+ if (! res) {
+ g_warning ("Could not start nested X server: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+gboolean
+gdm_remote_login_window_connect (GdmRemoteLoginWindow *login_window,
+ const char *hostname)
+{
+ gboolean res;
+ char *title;
+
+ title = g_strdup_printf (_("Remote Login (Connecting to %s...)"), hostname);
+
+ gtk_window_set_title (GTK_WINDOW (login_window), title);
+
+ login_window->priv->hostname = g_strdup (hostname);
+ login_window->priv->display = g_strdup (":300");
+
+ res = start_xephyr (login_window);
+ if (res) {
+ title = g_strdup_printf (_("Remote Login (Connected to %s)"), hostname);
+ gtk_window_set_title (GTK_WINDOW (login_window), title);
+ g_free (title);
+ }
+
+ return res;
+}
+
+static void
+gdm_remote_login_window_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdmRemoteLoginWindow *self;
+
+ self = GDM_REMOTE_LOGIN_WINDOW (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_remote_login_window_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdmRemoteLoginWindow *self;
+
+ self = GDM_REMOTE_LOGIN_WINDOW (object);
+
+ switch (prop_id) {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static GObject *
+gdm_remote_login_window_constructor (GType type,
+ guint n_construct_properties,
+ GObjectConstructParam *construct_properties)
+{
+ GdmRemoteLoginWindow *login_window;
+ GdmRemoteLoginWindowClass *klass;
+
+ klass = GDM_REMOTE_LOGIN_WINDOW_CLASS (g_type_class_peek (GDM_TYPE_REMOTE_LOGIN_WINDOW));
+
+ login_window = GDM_REMOTE_LOGIN_WINDOW (G_OBJECT_CLASS (gdm_remote_login_window_parent_class)->constructor (type,
+ n_construct_properties,
+ construct_properties));
+
+
+ return G_OBJECT (login_window);
+}
+
+static void
+gdm_remote_login_window_class_init (GdmRemoteLoginWindowClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->get_property = gdm_remote_login_window_get_property;
+ object_class->set_property = gdm_remote_login_window_set_property;
+ object_class->constructor = gdm_remote_login_window_constructor;
+ object_class->finalize = gdm_remote_login_window_finalize;
+
+ signals [DISCONNECTED] =
+ g_signal_new ("disconnected",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmRemoteLoginWindowClass, disconnected),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ g_type_class_add_private (klass, sizeof (GdmRemoteLoginWindowPrivate));
+}
+
+static void
+gdm_remote_login_window_init (GdmRemoteLoginWindow *login_window)
+{
+ login_window->priv = GDM_REMOTE_LOGIN_WINDOW_GET_PRIVATE (login_window);
+
+ gtk_window_set_position (GTK_WINDOW (login_window), GTK_WIN_POS_CENTER_ALWAYS);
+ gtk_window_set_title (GTK_WINDOW (login_window), _("Remote Login"));
+ /*gtk_window_set_decorated (GTK_WINDOW (login_window), FALSE);*/
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (login_window), TRUE);
+ gtk_window_set_skip_pager_hint (GTK_WINDOW (login_window), TRUE);
+ gtk_window_stick (GTK_WINDOW (login_window));
+ gtk_window_maximize (GTK_WINDOW (login_window));
+}
+
+static void
+gdm_remote_login_window_finalize (GObject *object)
+{
+ GdmRemoteLoginWindow *login_window;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_REMOTE_LOGIN_WINDOW (object));
+
+ login_window = GDM_REMOTE_LOGIN_WINDOW (object);
+
+ g_return_if_fail (login_window->priv != NULL);
+
+ G_OBJECT_CLASS (gdm_remote_login_window_parent_class)->finalize (object);
+}
+
+GtkWidget *
+gdm_remote_login_window_new (gboolean is_local)
+{
+ GObject *object;
+
+ object = g_object_new (GDM_TYPE_REMOTE_LOGIN_WINDOW,
+ NULL);
+
+ return GTK_WIDGET (object);
+}
diff --git a/gui/simple-greeter/gdm-remote-login-window.h b/gui/simple-greeter/gdm-remote-login-window.h
new file mode 100644
index 00000000..ad19cc28
--- /dev/null
+++ b/gui/simple-greeter/gdm-remote-login-window.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GDM_REMOTE_LOGIN_WINDOW_H
+#define __GDM_REMOTE_LOGIN_WINDOW_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_REMOTE_LOGIN_WINDOW (gdm_remote_login_window_get_type ())
+#define GDM_REMOTE_LOGIN_WINDOW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_REMOTE_LOGIN_WINDOW, GdmRemoteLoginWindow))
+#define GDM_REMOTE_LOGIN_WINDOW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_REMOTE_LOGIN_WINDOW, GdmRemoteLoginWindowClass))
+#define GDM_IS_REMOTE_LOGIN_WINDOW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_REMOTE_LOGIN_WINDOW))
+#define GDM_IS_REMOTE_LOGIN_WINDOW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_REMOTE_LOGIN_WINDOW))
+#define GDM_REMOTE_LOGIN_WINDOW_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_REMOTE_LOGIN_WINDOW, GdmRemoteLoginWindowClass))
+
+typedef struct GdmRemoteLoginWindowPrivate GdmRemoteLoginWindowPrivate;
+
+typedef struct
+{
+ GtkWindow parent;
+ GdmRemoteLoginWindowPrivate *priv;
+} GdmRemoteLoginWindow;
+
+typedef struct
+{
+ GtkWindowClass parent_class;
+
+ /* signals */
+ void (* disconnected) (GdmRemoteLoginWindow *login_window);
+
+} GdmRemoteLoginWindowClass;
+
+GType gdm_remote_login_window_get_type (void);
+GtkWidget * gdm_remote_login_window_new (gboolean display_is_local);
+
+gboolean gdm_remote_login_window_connect (GdmRemoteLoginWindow *login_window,
+ const char *host);
+gboolean gdm_remote_login_window_discconnect (GdmRemoteLoginWindow *login_window);
+
+G_END_DECLS
+
+#endif /* __GDM_REMOTE_LOGIN_WINDOW_H */
diff --git a/gui/simple-greeter/test-remote-login-window.c b/gui/simple-greeter/test-remote-login-window.c
new file mode 100644
index 00000000..3eb96ae8
--- /dev/null
+++ b/gui/simple-greeter/test-remote-login-window.c
@@ -0,0 +1,99 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <libintl.h>
+#include <locale.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "gdm-remote-login-window.h"
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *login_window;
+ char *std_out;
+ char *hostname;
+ GRegex *re;
+ GMatchInfo *match_info;
+ gboolean res;
+ GError *error;
+
+ bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ std_out = NULL;
+ g_spawn_command_line_sync (LIBEXECDIR "/gdm-simple-chooser",
+ &std_out,
+ NULL, NULL, NULL);
+ if (std_out == NULL) {
+ exit (1);
+ }
+
+ error = NULL;
+ re = g_regex_new ("hostname: (?P<hostname>[a-zA-Z0-9.-]+)", 0, 0, &error);
+ if (re == NULL) {
+ g_warning (error->message);
+ goto out;
+ }
+
+ g_regex_match (re, std_out, 0, &match_info);
+
+ res = g_match_info_matches (match_info);
+ if (! res) {
+ g_warning ("Unable to parse output: %s", std_out);
+ goto out;
+ }
+
+ hostname = g_match_info_fetch_named (match_info, "hostname");
+
+ g_debug ("Got %s", hostname);
+
+ setlocale (LC_ALL, "");
+
+ gtk_init (&argc, &argv);
+
+ login_window = gdm_remote_login_window_new (TRUE);
+ gtk_widget_show (login_window);
+
+ gdm_remote_login_window_connect (GDM_REMOTE_LOGIN_WINDOW (login_window), hostname);
+
+ gtk_main ();
+ out:
+
+ if (match_info != NULL) {
+ g_match_info_free (match_info);
+ }
+ if (re != NULL) {
+ g_regex_unref (re);
+ }
+
+ g_free (std_out);
+
+ return 0;
+}