summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2008-03-04 19:48:22 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2008-03-04 19:48:22 +0000
commitc6e462b746695efdd4d60fd55db517ad2db4a8ce (patch)
treead334aca54defdb463c966b384e54c8f17b449e7
parent78021073fb571a58e3b33c05ab441b70c3f0fa3a (diff)
downloadgdm-c6e462b746695efdd4d60fd55db517ad2db4a8ce.tar.gz
Abstract the host selection to be able to support other kinds in addition
2008-03-04 William Jon McCann <jmccann@redhat.com> * gui/simple-chooser/Makefile.am: * gui/simple-chooser/gdm-chooser-host.c: (gdm_chooser_host_get_address), (gdm_chooser_host_get_description), (gdm_chooser_host_get_kind), (gdm_chooser_host_get_willing), (_gdm_chooser_host_set_address), (_gdm_chooser_host_set_description), (_gdm_chooser_host_set_kind), (_gdm_chooser_host_set_willing), (gdm_chooser_host_set_property), (gdm_chooser_host_get_property), (gdm_chooser_host_class_init), (gdm_chooser_host_init), (gdm_chooser_host_finalize): * gui/simple-chooser/gdm-chooser-host.h: * gui/simple-chooser/gdm-chooser-session.c: (on_dialog_response), (gdm_chooser_session_start): * gui/simple-chooser/gdm-host-chooser-dialog.c: (gdm_host_chooser_dialog_get_host), (_gdm_host_chooser_dialog_set_kind_mask), (gdm_host_chooser_dialog_set_property), (on_response), (gdm_host_chooser_dialog_constructor), (gdm_host_chooser_dialog_class_init), (gdm_host_chooser_dialog_init), (gdm_host_chooser_dialog_new): * gui/simple-chooser/gdm-host-chooser-dialog.h: * gui/simple-chooser/gdm-host-chooser-widget.c: (find_known_host), (browser_add_host), (decode_packet), (xdmcp_init), (gdm_host_chooser_widget_refresh), (gdm_host_chooser_widget_get_host), (_gdm_host_chooser_widget_set_kind_mask), (gdm_host_chooser_widget_set_property), (gdm_host_chooser_widget_constructor), (gdm_host_chooser_widget_dispose), (gdm_host_chooser_widget_class_init), (gdm_host_chooser_widget_init), (gdm_host_chooser_widget_new): * gui/simple-chooser/gdm-host-chooser-widget.h: * gui/simple-chooser/gdm-host-chooser.c: (main): Abstract the host selection to be able to support other kinds in addition to XDMCP. svn path=/trunk/; revision=5922
-rw-r--r--ChangeLog37
-rw-r--r--gui/simple-chooser/Makefile.am4
-rw-r--r--gui/simple-chooser/gdm-chooser-host.c258
-rw-r--r--gui/simple-chooser/gdm-chooser-host.h63
-rw-r--r--gui/simple-chooser/gdm-chooser-session.c27
-rw-r--r--gui/simple-chooser/gdm-host-chooser-dialog.c122
-rw-r--r--gui/simple-chooser/gdm-host-chooser-dialog.h9
-rw-r--r--gui/simple-chooser/gdm-host-chooser-widget.c107
-rw-r--r--gui/simple-chooser/gdm-host-chooser-widget.h12
-rw-r--r--gui/simple-chooser/gdm-host-chooser.c23
10 files changed, 550 insertions, 112 deletions
diff --git a/ChangeLog b/ChangeLog
index 0440a172..4d13e4f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2008-03-04 William Jon McCann <jmccann@redhat.com>
+
+ * gui/simple-chooser/Makefile.am:
+ * gui/simple-chooser/gdm-chooser-host.c:
+ (gdm_chooser_host_get_address), (gdm_chooser_host_get_description),
+ (gdm_chooser_host_get_kind), (gdm_chooser_host_get_willing),
+ (_gdm_chooser_host_set_address),
+ (_gdm_chooser_host_set_description), (_gdm_chooser_host_set_kind),
+ (_gdm_chooser_host_set_willing), (gdm_chooser_host_set_property),
+ (gdm_chooser_host_get_property), (gdm_chooser_host_class_init),
+ (gdm_chooser_host_init), (gdm_chooser_host_finalize):
+ * gui/simple-chooser/gdm-chooser-host.h:
+ * gui/simple-chooser/gdm-chooser-session.c: (on_dialog_response),
+ (gdm_chooser_session_start):
+ * gui/simple-chooser/gdm-host-chooser-dialog.c:
+ (gdm_host_chooser_dialog_get_host),
+ (_gdm_host_chooser_dialog_set_kind_mask),
+ (gdm_host_chooser_dialog_set_property), (on_response),
+ (gdm_host_chooser_dialog_constructor),
+ (gdm_host_chooser_dialog_class_init),
+ (gdm_host_chooser_dialog_init), (gdm_host_chooser_dialog_new):
+ * gui/simple-chooser/gdm-host-chooser-dialog.h:
+ * gui/simple-chooser/gdm-host-chooser-widget.c: (find_known_host),
+ (browser_add_host), (decode_packet), (xdmcp_init),
+ (gdm_host_chooser_widget_refresh),
+ (gdm_host_chooser_widget_get_host),
+ (_gdm_host_chooser_widget_set_kind_mask),
+ (gdm_host_chooser_widget_set_property),
+ (gdm_host_chooser_widget_constructor),
+ (gdm_host_chooser_widget_dispose),
+ (gdm_host_chooser_widget_class_init),
+ (gdm_host_chooser_widget_init), (gdm_host_chooser_widget_new):
+ * gui/simple-chooser/gdm-host-chooser-widget.h:
+ * gui/simple-chooser/gdm-host-chooser.c: (main):
+ Abstract the host selection to be able to support
+ other kinds in addition to XDMCP.
+
2008-03-03 William Jon McCann <jmccann@redhat.com>
* gui/user-switch-applet/applet.c: (maybe_lock_screen),
diff --git a/gui/simple-chooser/Makefile.am b/gui/simple-chooser/Makefile.am
index 44e21a44..04cc1e7d 100644
--- a/gui/simple-chooser/Makefile.am
+++ b/gui/simple-chooser/Makefile.am
@@ -25,6 +25,8 @@ libexec_PROGRAMS = \
gdm_simple_chooser_SOURCES = \
chooser-main.c \
+ gdm-chooser-host.c \
+ gdm-chooser-host.h \
gdm-host-chooser-widget.c \
gdm-host-chooser-widget.h \
gdm-host-chooser-dialog.c \
@@ -45,6 +47,8 @@ gdm_simple_chooser_LDADD = \
gdm_host_chooser_SOURCES = \
gdm-host-chooser.c \
+ gdm-chooser-host.c \
+ gdm-chooser-host.h \
gdm-host-chooser-widget.c \
gdm-host-chooser-widget.h \
gdm-host-chooser-dialog.c \
diff --git a/gui/simple-chooser/gdm-chooser-host.c b/gui/simple-chooser/gdm-chooser-host.c
new file mode 100644
index 00000000..5ffaa6ed
--- /dev/null
+++ b/gui/simple-chooser/gdm-chooser-host.c
@@ -0,0 +1,258 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * 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 <string.h>
+#include <errno.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib-object.h>
+
+#include "gdm-address.h"
+#include "gdm-chooser-host.h"
+
+#define GDM_CHOOSER_HOST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CHOOSER_HOST, GdmChooserHostPrivate))
+
+struct GdmChooserHostPrivate
+{
+ GdmAddress *address;
+ char *description;
+ GdmChooserHostKind kind;
+ gboolean willing;
+};
+
+enum {
+ PROP_0,
+ PROP_ADDRESS,
+ PROP_DESCRIPTION,
+ PROP_KIND,
+ PROP_WILLING,
+};
+
+static void gdm_chooser_host_class_init (GdmChooserHostClass *klass);
+static void gdm_chooser_host_init (GdmChooserHost *chooser_host);
+static void gdm_chooser_host_finalize (GObject *object);
+
+G_DEFINE_TYPE (GdmChooserHost, gdm_chooser_host, G_TYPE_OBJECT)
+
+GdmAddress *
+gdm_chooser_host_get_address (GdmChooserHost *host)
+{
+ g_return_val_if_fail (GDM_IS_CHOOSER_HOST (host), NULL);
+
+ return host->priv->address;
+}
+
+G_CONST_RETURN char *
+gdm_chooser_host_get_description (GdmChooserHost *host)
+{
+ g_return_val_if_fail (GDM_IS_CHOOSER_HOST (host), NULL);
+
+ return host->priv->description;
+}
+
+GdmChooserHostKind
+gdm_chooser_host_get_kind (GdmChooserHost *host)
+{
+ g_return_val_if_fail (GDM_IS_CHOOSER_HOST (host), 0);
+
+ return host->priv->kind;
+}
+
+gboolean
+gdm_chooser_host_get_willing (GdmChooserHost *host)
+{
+ g_return_val_if_fail (GDM_IS_CHOOSER_HOST (host), FALSE);
+
+ return host->priv->willing;
+}
+
+static void
+_gdm_chooser_host_set_address (GdmChooserHost *host,
+ GdmAddress *address)
+{
+ if (host->priv->address != NULL) {
+ gdm_address_free (host->priv->address);
+ }
+
+ g_assert (address != NULL);
+
+ gdm_address_debug (address);
+ host->priv->address = gdm_address_copy (address);
+}
+
+static void
+_gdm_chooser_host_set_description (GdmChooserHost *host,
+ const char *description)
+{
+ g_free (host->priv->description);
+ host->priv->description = g_strdup (description);
+}
+
+static void
+_gdm_chooser_host_set_kind (GdmChooserHost *host,
+ int kind)
+{
+ if (host->priv->kind != kind) {
+ host->priv->kind = kind;
+ }
+}
+
+static void
+_gdm_chooser_host_set_willing (GdmChooserHost *host,
+ gboolean willing)
+{
+ if (host->priv->willing != willing) {
+ host->priv->willing = willing;
+ }
+}
+
+static void
+gdm_chooser_host_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GdmChooserHost *host;
+
+ host = GDM_CHOOSER_HOST (object);
+
+ switch (param_id) {
+ case PROP_ADDRESS:
+ _gdm_chooser_host_set_address (host, g_value_get_boxed (value));
+ break;
+ case PROP_DESCRIPTION:
+ _gdm_chooser_host_set_description (host, g_value_get_string (value));
+ break;
+ case PROP_KIND:
+ _gdm_chooser_host_set_kind (host, g_value_get_int (value));
+ break;
+ case PROP_WILLING:
+ _gdm_chooser_host_set_willing (host, g_value_get_boolean (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_chooser_host_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GdmChooserHost *host;
+
+ host = GDM_CHOOSER_HOST (object);
+
+ switch (param_id) {
+ case PROP_ADDRESS:
+ g_value_set_boxed (value, host->priv->address);
+ break;
+ case PROP_DESCRIPTION:
+ g_value_set_string (value, host->priv->description);
+ break;
+ case PROP_KIND:
+ g_value_set_int (value, host->priv->kind);
+ break;
+ case PROP_WILLING:
+ g_value_set_boolean (value, host->priv->willing);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+}
+
+static void
+gdm_chooser_host_class_init (GdmChooserHostClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = gdm_chooser_host_set_property;
+ object_class->get_property = gdm_chooser_host_get_property;
+ object_class->finalize = gdm_chooser_host_finalize;
+
+
+ g_object_class_install_property (object_class,
+ PROP_ADDRESS,
+ g_param_spec_boxed ("address",
+ "address",
+ "address",
+ GDM_TYPE_ADDRESS,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DESCRIPTION,
+ g_param_spec_string ("description",
+ "description",
+ "description",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (object_class,
+ PROP_KIND,
+ g_param_spec_int ("kind",
+ "kind",
+ "kind",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_WILLING,
+ g_param_spec_boolean ("willing",
+ "willing",
+ "willing",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
+
+ g_type_class_add_private (klass, sizeof (GdmChooserHostPrivate));
+}
+
+static void
+gdm_chooser_host_init (GdmChooserHost *widget)
+{
+ widget->priv = GDM_CHOOSER_HOST_GET_PRIVATE (widget);
+}
+
+static void
+gdm_chooser_host_finalize (GObject *object)
+{
+ GdmChooserHost *host;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GDM_IS_CHOOSER_HOST (object));
+
+ host = GDM_CHOOSER_HOST (object);
+
+ g_return_if_fail (host->priv != NULL);
+
+ g_free (host->priv->description);
+ gdm_address_free (host->priv->address);
+
+ G_OBJECT_CLASS (gdm_chooser_host_parent_class)->finalize (object);
+}
diff --git a/gui/simple-chooser/gdm-chooser-host.h b/gui/simple-chooser/gdm-chooser-host.h
new file mode 100644
index 00000000..1edb86a3
--- /dev/null
+++ b/gui/simple-chooser/gdm-chooser-host.h
@@ -0,0 +1,63 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * 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_CHOOSER_HOST__
+#define __GDM_CHOOSER_HOST__
+
+#include <glib-object.h>
+#include "gdm-address.h"
+
+G_BEGIN_DECLS
+
+#define GDM_TYPE_CHOOSER_HOST (gdm_chooser_host_get_type ())
+#define GDM_CHOOSER_HOST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_CHOOSER_HOST, GdmChooserHost))
+#define GDM_CHOOSER_HOST_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_CHOOSER_HOST, GdmChooserHostClass))
+#define GDM_IS_CHOOSER_HOST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_CHOOSER_HOST))
+#define GDM_IS_CHOOSER_HOST_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_CHOOSER_HOST))
+#define GDM_CHOOSER_HOST_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_CHOOSER_HOST, GdmChooserHostClass))
+
+typedef enum {
+ GDM_CHOOSER_HOST_KIND_XDMCP = 1 << 0,
+} GdmChooserHostKind;
+
+#define GDM_CHOOSER_HOST_KIND_MASK_ALL (GDM_CHOOSER_HOST_KIND_XDMCP)
+
+typedef struct GdmChooserHostPrivate GdmChooserHostPrivate;
+
+typedef struct
+{
+ GObject parent;
+ GdmChooserHostPrivate *priv;
+} GdmChooserHost;
+
+typedef struct
+{
+ GObjectClass parent_class;
+} GdmChooserHostClass;
+
+GType gdm_chooser_host_get_type (void) G_GNUC_CONST;
+
+G_CONST_RETURN char *gdm_chooser_host_get_description (GdmChooserHost *chooser_host);
+GdmAddress * gdm_chooser_host_get_address (GdmChooserHost *chooser_host);
+gboolean gdm_chooser_host_get_willing (GdmChooserHost *chooser_host);
+GdmChooserHostKind gdm_chooser_host_get_kind (GdmChooserHost *chooser_host);
+
+G_END_DECLS
+
+#endif
diff --git a/gui/simple-chooser/gdm-chooser-session.c b/gui/simple-chooser/gdm-chooser-session.c
index c8f2e688..c15f9864 100644
--- a/gui/simple-chooser/gdm-chooser-session.c
+++ b/gui/simple-chooser/gdm-chooser-session.c
@@ -149,22 +149,32 @@ on_dialog_response (GtkDialog *dialog,
int response_id,
GdmChooserSession *session)
{
- char *hostname;
+ GdmChooserHost *host;
- hostname = NULL;
+ host = NULL;
switch (response_id) {
case GTK_RESPONSE_OK:
- hostname = gdm_host_chooser_dialog_get_current_hostname (GDM_HOST_CHOOSER_DIALOG (dialog));
+ host = gdm_host_chooser_dialog_get_host (GDM_HOST_CHOOSER_DIALOG (dialog));
case GTK_RESPONSE_NONE:
/* delete event */
default:
break;
}
- if (hostname != NULL) {
- g_debug ("GdmChooserSession: Selected hostname '%s'", hostname);
- gdm_chooser_client_call_select_hostname (session->priv->client, hostname);
- g_free (hostname);
+ if (host != NULL) {
+ char *hostname;
+
+ /* only support XDMCP hosts in remote chooser */
+ g_assert (gdm_chooser_host_get_kind (host) == GDM_CHOOSER_HOST_KIND_XDMCP);
+
+ hostname = NULL;
+ gdm_address_get_hostname (gdm_chooser_host_get_address (host), &hostname);
+ /* FIXME: fall back to numerical address? */
+ if (hostname != NULL) {
+ g_debug ("GdmChooserSession: Selected hostname '%s'", hostname);
+ gdm_chooser_client_call_select_hostname (session->priv->client, hostname);
+ g_free (hostname);
+ }
}
gdm_chooser_client_call_disconnect (session->priv->client);
@@ -184,7 +194,8 @@ gdm_chooser_session_start (GdmChooserSession *session,
start_settings_daemon (session);
start_window_manager (session);
- session->priv->chooser_dialog = gdm_host_chooser_dialog_new ();
+ /* Only support XDMCP on remote choosers */
+ session->priv->chooser_dialog = gdm_host_chooser_dialog_new (GDM_CHOOSER_HOST_KIND_XDMCP);
g_signal_connect (session->priv->chooser_dialog,
"response",
G_CALLBACK (on_dialog_response),
diff --git a/gui/simple-chooser/gdm-host-chooser-dialog.c b/gui/simple-chooser/gdm-host-chooser-dialog.c
index e63f3de5..d9336e25 100644
--- a/gui/simple-chooser/gdm-host-chooser-dialog.c
+++ b/gui/simple-chooser/gdm-host-chooser-dialog.c
@@ -38,10 +38,12 @@
struct GdmHostChooserDialogPrivate
{
GtkWidget *chooser_widget;
+ int kind_mask;
};
enum {
PROP_0,
+ PROP_KIND_MASK,
};
static void gdm_host_chooser_dialog_class_init (GdmHostChooserDialogClass *klass);
@@ -50,24 +52,41 @@ static void gdm_host_chooser_dialog_finalize (GObject *
G_DEFINE_TYPE (GdmHostChooserDialog, gdm_host_chooser_dialog, GTK_TYPE_DIALOG)
-char *
-gdm_host_chooser_dialog_get_current_hostname (GdmHostChooserDialog *dialog)
+GdmChooserHost *
+gdm_host_chooser_dialog_get_host (GdmHostChooserDialog *dialog)
{
- char *hostname;
+ GdmChooserHost *host;
g_return_val_if_fail (GDM_IS_HOST_CHOOSER_DIALOG (dialog), NULL);
- hostname = gdm_host_chooser_widget_get_current_hostname (GDM_HOST_CHOOSER_WIDGET (dialog->priv->chooser_widget));
+ host = gdm_host_chooser_widget_get_host (GDM_HOST_CHOOSER_WIDGET (dialog->priv->chooser_widget));
- return hostname;
+ return host;
}
+
+static void
+_gdm_host_chooser_dialog_set_kind_mask (GdmHostChooserDialog *dialog,
+ int kind_mask)
+{
+ if (dialog->priv->kind_mask != kind_mask) {
+ dialog->priv->kind_mask = kind_mask;
+ }
+}
+
static void
gdm_host_chooser_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
+ GdmHostChooserDialog *self;
+
+ self = GDM_HOST_CHOOSER_DIALOG (object);
+
switch (prop_id) {
+ case PROP_KIND_MASK:
+ _gdm_host_chooser_dialog_set_kind_mask (self, g_value_get_int (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -87,18 +106,55 @@ gdm_host_chooser_dialog_get_property (GObject *object,
}
}
+static void
+on_response (GdmHostChooserDialog *dialog,
+ gint response_id)
+{
+ switch (response_id) {
+ case GTK_RESPONSE_APPLY:
+ gdm_host_chooser_widget_refresh (GDM_HOST_CHOOSER_WIDGET (dialog->priv->chooser_widget));
+ g_signal_stop_emission_by_name (dialog, "response");
+ break;
+ default:
+ break;
+ }
+}
+
static GObject *
gdm_host_chooser_dialog_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
- GdmHostChooserDialog *host_chooser_dialog;
+ GdmHostChooserDialog *dialog;
- host_chooser_dialog = GDM_HOST_CHOOSER_DIALOG (G_OBJECT_CLASS (gdm_host_chooser_dialog_parent_class)->constructor (type,
+ dialog = GDM_HOST_CHOOSER_DIALOG (G_OBJECT_CLASS (gdm_host_chooser_dialog_parent_class)->constructor (type,
n_construct_properties,
construct_properties));
- return G_OBJECT (host_chooser_dialog);
+
+ dialog->priv->chooser_widget = gdm_host_chooser_widget_new (dialog->priv->kind_mask);
+ gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog->priv->chooser_widget), 5);
+
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_REFRESH, GTK_RESPONSE_APPLY,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+ gtk_window_set_title (GTK_WINDOW (dialog), _("Select System"));
+ gtk_window_set_icon_name (GTK_WINDOW (dialog), "computer");
+
+ g_signal_connect (dialog,
+ "response",
+ G_CALLBACK (on_response),
+ dialog);
+
+ gtk_widget_show_all (GTK_WIDGET (dialog));
+
+ return G_OBJECT (dialog);
}
static void
@@ -120,50 +176,23 @@ gdm_host_chooser_dialog_class_init (GdmHostChooserDialogClass *klass)
object_class->dispose = gdm_host_chooser_dialog_dispose;
object_class->finalize = gdm_host_chooser_dialog_finalize;
- g_type_class_add_private (klass, sizeof (GdmHostChooserDialogPrivate));
-}
+ g_object_class_install_property (object_class,
+ PROP_KIND_MASK,
+ g_param_spec_int ("kind-mask",
+ "kind mask",
+ "kind mask",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-static void
-on_response (GdmHostChooserDialog *dialog,
- gint response_id)
-{
- switch (response_id) {
- case GTK_RESPONSE_APPLY:
- gdm_host_chooser_widget_refresh (GDM_HOST_CHOOSER_WIDGET (dialog->priv->chooser_widget));
- g_signal_stop_emission_by_name (dialog, "response");
- break;
- default:
- break;
- }
+ g_type_class_add_private (klass, sizeof (GdmHostChooserDialogPrivate));
}
static void
gdm_host_chooser_dialog_init (GdmHostChooserDialog *dialog)
{
-
dialog->priv = GDM_HOST_CHOOSER_DIALOG_GET_PRIVATE (dialog);
-
- dialog->priv->chooser_widget = gdm_host_chooser_widget_new ();
- gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), dialog->priv->chooser_widget);
-
- gtk_dialog_add_buttons (GTK_DIALOG (dialog),
- GTK_STOCK_REFRESH, GTK_RESPONSE_APPLY,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
-
- gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
- gtk_container_set_border_width (GTK_CONTAINER (dialog->priv->chooser_widget), 5);
- gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
- gtk_window_set_title (GTK_WINDOW (dialog), _("Select System"));
- gtk_window_set_icon_name (GTK_WINDOW (dialog), "computer");
-
- g_signal_connect (dialog,
- "response",
- G_CALLBACK (on_response),
- dialog);
-
- gtk_widget_show_all (GTK_WIDGET (dialog));
}
static void
@@ -182,11 +211,12 @@ gdm_host_chooser_dialog_finalize (GObject *object)
}
GtkWidget *
-gdm_host_chooser_dialog_new (void)
+gdm_host_chooser_dialog_new (int kind_mask)
{
GObject *object;
object = g_object_new (GDM_TYPE_HOST_CHOOSER_DIALOG,
+ "kind-mask", kind_mask,
NULL);
return GTK_WIDGET (object);
diff --git a/gui/simple-chooser/gdm-host-chooser-dialog.h b/gui/simple-chooser/gdm-host-chooser-dialog.h
index 5ae53fd8..ed2073ea 100644
--- a/gui/simple-chooser/gdm-host-chooser-dialog.h
+++ b/gui/simple-chooser/gdm-host-chooser-dialog.h
@@ -23,6 +23,7 @@
#include <glib-object.h>
#include <gtk/gtkdialog.h>
+#include "gdm-chooser-host.h"
G_BEGIN_DECLS
@@ -46,11 +47,13 @@ typedef struct
GtkDialogClass parent_class;
} GdmHostChooserDialogClass;
-GType gdm_host_chooser_dialog_get_type (void);
+GType gdm_host_chooser_dialog_get_type (void);
-GtkWidget * gdm_host_chooser_dialog_new (void);
+GtkWidget * gdm_host_chooser_dialog_new (int kind_mask);
+void gdm_host_chooser_dialog_set_kind_mask (GdmHostChooserDialog *dialog,
+ int kind_mask);
-char * gdm_host_chooser_dialog_get_current_hostname (GdmHostChooserDialog *dialog);
+GdmChooserHost * gdm_host_chooser_dialog_get_host (GdmHostChooserDialog *dialog);
G_END_DECLS
diff --git a/gui/simple-chooser/gdm-host-chooser-widget.c b/gui/simple-chooser/gdm-host-chooser-widget.c
index 9ae3d4fc..999a9c0e 100644
--- a/gui/simple-chooser/gdm-host-chooser-widget.c
+++ b/gui/simple-chooser/gdm-host-chooser-widget.c
@@ -44,20 +44,17 @@
#include <gtk/gtk.h>
#include "gdm-address.h"
+#include "gdm-chooser-host.h"
#include "gdm-host-chooser-widget.h"
#define GDM_HOST_CHOOSER_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_HOST_CHOOSER_WIDGET, GdmHostChooserWidgetPrivate))
-typedef struct _GdmChooserHost {
- GdmAddress *address;
- char *description;
- gboolean willing;
-} GdmChooserHost;
-
struct GdmHostChooserWidgetPrivate
{
GtkWidget *treeview;
+ int kind_mask;
+
char **hosts;
XdmcpBuffer broadcast_buf;
@@ -79,6 +76,7 @@ struct GdmHostChooserWidgetPrivate
enum {
PROP_0,
+ PROP_KIND_MASK,
};
enum {
@@ -121,18 +119,6 @@ chooser_host_remove (GdmHostChooserWidget *widget,
}
#endif
-static void
-chooser_host_free (GdmChooserHost *host)
-{
- if (host == NULL) {
- return;
- }
-
- g_free (host->description);
- gdm_address_free (host->address);
- g_free (host);
-}
-
static GdmChooserHost *
find_known_host (GdmHostChooserWidget *widget,
GdmAddress *address)
@@ -142,7 +128,7 @@ find_known_host (GdmHostChooserWidget *widget,
for (li = widget->priv->chooser_hosts; li != NULL; li = li->next) {
host = li->data;
- if (gdm_address_equal (host->address, address)) {
+ if (gdm_address_equal (gdm_chooser_host_get_address (host), address)) {
goto out;
}
}
@@ -167,18 +153,18 @@ browser_add_host (GdmHostChooserWidget *widget,
g_assert (host != NULL);
- if (! host->willing) {
+ if (! gdm_chooser_host_get_willing (host)) {
gtk_widget_set_sensitive (GTK_WIDGET (widget), TRUE);
return;
}
- res = gdm_address_get_hostname (host->address, &hostname);
+ res = gdm_address_get_hostname (gdm_chooser_host_get_address (host), &hostname);
if (! res) {
- gdm_address_get_numeric_info (host->address, &hostname, NULL);
+ gdm_address_get_numeric_info (gdm_chooser_host_get_address (host), &hostname, NULL);
}
name = g_markup_escape_text (hostname, -1);
- desc = g_markup_escape_text (host->description, -1);
+ desc = g_markup_escape_text (gdm_chooser_host_get_description (host), -1);
label = g_strdup_printf ("<b>%s</b>\n%s", name, desc);
g_free (name);
g_free (desc);
@@ -274,19 +260,22 @@ decode_packet (GIOChannel *source,
chooser_host = find_known_host (widget, address);
if (chooser_host == NULL) {
-
- chooser_host = g_new0 (GdmChooserHost, 1);
- chooser_host->address = gdm_address_copy (address);
- chooser_host->description = g_strdup (status);
- chooser_host->willing = (header.opcode == WILLING);
+ chooser_host = g_object_new (GDM_TYPE_CHOOSER_HOST,
+ "address", address,
+ "description", status,
+ "willing", (header.opcode == WILLING),
+ "kind", GDM_CHOOSER_HOST_KIND_XDMCP,
+ NULL);
chooser_host_add (widget, chooser_host);
browser_add_host (widget, chooser_host);
} else {
/* server changed it's mind */
- if (header.opcode == WILLING && ! chooser_host->willing) {
- chooser_host->willing = TRUE;
+ if (header.opcode == WILLING
+ && ! gdm_chooser_host_get_willing (chooser_host)) {
+ g_object_set (chooser_host, "willing", TRUE, NULL);
browser_add_host (widget, chooser_host);
}
+ /* FIXME: handle unwilling? */
}
done:
@@ -600,29 +589,38 @@ xdmcp_init (GdmHostChooserWidget *widget)
(GIOFunc)decode_packet,
widget);
g_io_channel_unref (ioc);
-
- xdmcp_discover (widget);
}
void
gdm_host_chooser_widget_refresh (GdmHostChooserWidget *widget)
{
g_return_if_fail (GDM_IS_HOST_CHOOSER_WIDGET (widget));
+
+ xdmcp_discover (widget);
}
-char *
-gdm_host_chooser_widget_get_current_hostname (GdmHostChooserWidget *widget)
+GdmChooserHost *
+gdm_host_chooser_widget_get_host (GdmHostChooserWidget *widget)
{
- char *hostname;
+ GdmChooserHost *host;
g_return_val_if_fail (GDM_IS_HOST_CHOOSER_WIDGET (widget), NULL);
- hostname = NULL;
+ host = NULL;
if (widget->priv->current_host != NULL) {
- gdm_address_get_hostname (widget->priv->current_host->address, &hostname);
+ host = g_object_ref (widget->priv->current_host);
}
- return hostname;
+ return host;
+}
+
+static void
+_gdm_host_chooser_widget_set_kind_mask (GdmHostChooserWidget *widget,
+ int kind_mask)
+{
+ if (widget->priv->kind_mask != kind_mask) {
+ widget->priv->kind_mask = kind_mask;
+ }
}
static void
@@ -631,7 +629,14 @@ gdm_host_chooser_widget_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
+ GdmHostChooserWidget *self;
+
+ self = GDM_HOST_CHOOSER_WIDGET (object);
+
switch (prop_id) {
+ case PROP_KIND_MASK:
+ _gdm_host_chooser_widget_set_kind_mask (self, g_value_get_int (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -656,13 +661,16 @@ gdm_host_chooser_widget_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
- GdmHostChooserWidget *host_chooser_widget;
+ GdmHostChooserWidget *widget;
- host_chooser_widget = GDM_HOST_CHOOSER_WIDGET (G_OBJECT_CLASS (gdm_host_chooser_widget_parent_class)->constructor (type,
+ widget = GDM_HOST_CHOOSER_WIDGET (G_OBJECT_CLASS (gdm_host_chooser_widget_parent_class)->constructor (type,
n_construct_properties,
construct_properties));
- return G_OBJECT (host_chooser_widget);
+ xdmcp_init (widget);
+ xdmcp_discover (widget);
+
+ return G_OBJECT (widget);
}
static void
@@ -690,7 +698,7 @@ gdm_host_chooser_widget_dispose (GObject *object)
}
if (widget->priv->chooser_hosts != NULL) {
g_slist_foreach (widget->priv->chooser_hosts,
- (GFunc)chooser_host_free,
+ (GFunc)g_object_unref,
NULL);
g_slist_free (widget->priv->chooser_hosts);
widget->priv->chooser_hosts = NULL;
@@ -712,6 +720,16 @@ gdm_host_chooser_widget_class_init (GdmHostChooserWidgetClass *klass)
object_class->dispose = gdm_host_chooser_widget_dispose;
object_class->finalize = gdm_host_chooser_widget_finalize;
+ g_object_class_install_property (object_class,
+ PROP_KIND_MASK,
+ g_param_spec_int ("kind-mask",
+ "kind mask",
+ "kind mask",
+ 0,
+ G_MAXINT,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
signals [HOST_ACTIVATED] = g_signal_new ("host-activated",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
@@ -803,8 +821,6 @@ gdm_host_chooser_widget_init (GdmHostChooserWidget *widget)
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model),
CHOOSER_LIST_LABEL_COLUMN,
GTK_SORT_ASCENDING);
-
- xdmcp_init (widget);
}
static void
@@ -823,11 +839,12 @@ gdm_host_chooser_widget_finalize (GObject *object)
}
GtkWidget *
-gdm_host_chooser_widget_new (void)
+gdm_host_chooser_widget_new (int kind_mask)
{
GObject *object;
object = g_object_new (GDM_TYPE_HOST_CHOOSER_WIDGET,
+ "kind-mask", kind_mask,
NULL);
return GTK_WIDGET (object);
diff --git a/gui/simple-chooser/gdm-host-chooser-widget.h b/gui/simple-chooser/gdm-host-chooser-widget.h
index 9aea0374..b15eba06 100644
--- a/gui/simple-chooser/gdm-host-chooser-widget.h
+++ b/gui/simple-chooser/gdm-host-chooser-widget.h
@@ -23,6 +23,7 @@
#include <glib-object.h>
#include <gtk/gtkvbox.h>
+#include "gdm-chooser-host.h"
G_BEGIN_DECLS
@@ -49,12 +50,15 @@ typedef struct
void (* host_activated) (GdmHostChooserWidget *widget);
} GdmHostChooserWidgetClass;
-GType gdm_host_chooser_widget_get_type (void);
-GtkWidget * gdm_host_chooser_widget_new (void);
+GType gdm_host_chooser_widget_get_type (void);
+GtkWidget * gdm_host_chooser_widget_new (int kind_mask);
-void gdm_host_chooser_widget_refresh (GdmHostChooserWidget *widget);
+void gdm_host_chooser_widget_set_kind_mask (GdmHostChooserWidget *widget,
+ int kind_mask);
-char * gdm_host_chooser_widget_get_current_hostname (GdmHostChooserWidget *widget);
+void gdm_host_chooser_widget_refresh (GdmHostChooserWidget *widget);
+
+GdmChooserHost * gdm_host_chooser_widget_get_host (GdmHostChooserWidget *widget);
G_END_DECLS
diff --git a/gui/simple-chooser/gdm-host-chooser.c b/gui/simple-chooser/gdm-host-chooser.c
index 31e94005..d188705c 100644
--- a/gui/simple-chooser/gdm-host-chooser.c
+++ b/gui/simple-chooser/gdm-host-chooser.c
@@ -37,6 +37,7 @@
#include "gdm-settings-client.h"
#include "gdm-settings-keys.h"
+#include "gdm-chooser-host.h"
#include "gdm-host-chooser-dialog.h"
#define ACCESSIBILITY_KEY "/desktop/gnome/interface/accessibility"
@@ -248,13 +249,23 @@ main (int argc, char *argv[])
gtk_init (&argc, &argv);
- chooser = gdm_host_chooser_dialog_new ();
+ chooser = gdm_host_chooser_dialog_new (GDM_CHOOSER_HOST_KIND_MASK_ALL);
if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
- char *hostname;
-
- hostname = gdm_host_chooser_dialog_get_current_hostname (GDM_HOST_CHOOSER_DIALOG (chooser));
- g_print ("hostname: %s\n", hostname);
- g_free (hostname);
+ GdmChooserHost *host;
+
+ host = gdm_host_chooser_dialog_get_host (GDM_HOST_CHOOSER_DIALOG (chooser));
+ if (host != NULL) {
+ char *hostname;
+ /* FIXME: handle different host types here? */
+
+ hostname = NULL;
+ gdm_address_get_hostname (gdm_chooser_host_get_address (host), &hostname);
+ /* FIXME: fall back to numerical address? */
+ if (hostname != NULL) {
+ g_print ("hostname: %s\n", hostname);
+ g_free (hostname);
+ }
+ }
}
gtk_widget_destroy (chooser);