diff options
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | gui/simple-chooser/Makefile.am | 4 | ||||
-rw-r--r-- | gui/simple-chooser/gdm-chooser-client.c | 403 | ||||
-rw-r--r-- | gui/simple-chooser/gdm-chooser-client.h | 69 | ||||
-rw-r--r-- | gui/simple-chooser/gdm-chooser-session.c | 68 |
5 files changed, 50 insertions, 495 deletions
diff --git a/configure.ac b/configure.ac index af2e2956..a6360fb9 100644 --- a/configure.ac +++ b/configure.ac @@ -162,7 +162,6 @@ AC_SUBST(LIBXKLAVIER_CFLAGS) AC_SUBST(LIBXKLAVIER_LIBS) PKG_CHECK_MODULES(SIMPLE_CHOOSER, - dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION gtk+-3.0 >= $GTK_REQUIRED_VERSION ) AC_SUBST(SIMPLE_CHOOSER_CFLAGS) diff --git a/gui/simple-chooser/Makefile.am b/gui/simple-chooser/Makefile.am index eacf0c90..8b9c003c 100644 --- a/gui/simple-chooser/Makefile.am +++ b/gui/simple-chooser/Makefile.am @@ -2,6 +2,7 @@ NULL = AM_CPPFLAGS = \ -I$(top_srcdir)/common \ + -I$(top_srcdir)/gui/libgdm \ -DAUTHDIR=\""$(authdir)"\" \ -DDATADIR=\""$(datadir)"\" \ -DGDMCONFDIR=\"$(gdmconfdir)\" \ @@ -32,14 +33,13 @@ gdm_simple_chooser_SOURCES = \ gdm-host-chooser-widget.h \ gdm-host-chooser-dialog.c \ gdm-host-chooser-dialog.h \ - gdm-chooser-client.c \ - gdm-chooser-client.h \ gdm-chooser-session.c \ gdm-chooser-session.h \ $(NULL) gdm_simple_chooser_LDADD = \ $(top_builddir)/common/libgdmcommon.la \ + $(top_builddir)/gui/libgdm/libgdm.la \ $(GTK_LIBS) \ $(EXTRA_CHOOSER_LIBS) \ $(SIMPLE_CHOOSER_LIBS) \ diff --git a/gui/simple-chooser/gdm-chooser-client.c b/gui/simple-chooser/gdm-chooser-client.c deleted file mode 100644 index 4316929b..00000000 --- a/gui/simple-chooser/gdm-chooser-client.c +++ /dev/null @@ -1,403 +0,0 @@ -/* -*- 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 <stdio.h> -#include <unistd.h> -#include <string.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <glib-object.h> -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - -#include "gdm-chooser-client.h" - -#define GDM_CHOOSER_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientPrivate)) - -#define CHOOSER_SERVER_DBUS_PATH "/org/gnome/DisplayManager/ChooserServer" -#define CHOOSER_SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.ChooserServer" - -#define GDM_DBUS_NAME "org.gnome.DisplayManager" -#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display" - -struct GdmChooserClientPrivate -{ - DBusConnection *connection; - char *address; -}; - -enum { - PROP_0, -}; - -static void gdm_chooser_client_class_init (GdmChooserClientClass *klass); -static void gdm_chooser_client_init (GdmChooserClient *chooser_client); -static void gdm_chooser_client_finalize (GObject *object); - -G_DEFINE_TYPE (GdmChooserClient, gdm_chooser_client, G_TYPE_OBJECT) - -static gpointer client_object = NULL; - -GQuark -gdm_chooser_client_error_quark (void) -{ - static GQuark error_quark = 0; - - if (error_quark == 0) - error_quark = g_quark_from_static_string ("gdm-chooser-client"); - - return error_quark; -} - -static gboolean -send_dbus_string_method (DBusConnection *connection, - const char *method, - const char *payload) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - const char *str; - - if (payload != NULL) { - str = payload; - } else { - str = ""; - } - - g_debug ("GdmChooserClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - CHOOSER_SERVER_DBUS_PATH, - CHOOSER_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_message_iter_init_append (message, &iter); - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_STRING, - &str); - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - - dbus_message_unref (message); - - if (dbus_error_is_set (&error)) { - g_warning ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - return TRUE; -} - - -static gboolean -send_dbus_void_method (DBusConnection *connection, - const char *method) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - - g_debug ("GdmChooserClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - CHOOSER_SERVER_DBUS_PATH, - CHOOSER_SERVER_DBUS_INTERFACE, - method); - if (message == NULL) { - g_warning ("Couldn't allocate the D-Bus message"); - return FALSE; - } - - dbus_error_init (&error); - reply = dbus_connection_send_with_reply_and_block (connection, - message, - -1, - &error); - - dbus_message_unref (message); - - if (dbus_error_is_set (&error)) { - g_warning ("%s %s raised: %s\n", - method, - error.name, - error.message); - return FALSE; - } - if (reply != NULL) { - dbus_message_unref (reply); - } - dbus_connection_flush (connection); - - return TRUE; -} - -void -gdm_chooser_client_call_select_hostname (GdmChooserClient *client, - const char *text) -{ - send_dbus_string_method (client->priv->connection, - "SelectHostname", - text); -} - -void -gdm_chooser_client_call_disconnect (GdmChooserClient *client) -{ - send_dbus_void_method (client->priv->connection, - "Disconnect"); -} - -static DBusHandlerResult -client_dbus_handle_message (DBusConnection *connection, - DBusMessage *message, - void *user_data, - dbus_bool_t local_interface) -{ - -#if 0 - g_message ("obj_path=%s interface=%s method=%s destination=%s", - dbus_message_get_path (message), - dbus_message_get_interface (message), - dbus_message_get_member (message), - dbus_message_get_destination (message)); -#endif - - g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -client_dbus_filter_function (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - GdmChooserClient *client = GDM_CHOOSER_CLIENT (user_data); - const char *path; - - path = dbus_message_get_path (message); - - g_debug ("GdmChooserClient: obj_path=%s interface=%s method=%s", - dbus_message_get_path (message), - dbus_message_get_interface (message), - dbus_message_get_member (message)); - - if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected") - && strcmp (path, DBUS_PATH_LOCAL) == 0) { - - g_message ("Got disconnected from the session message bus"); - - dbus_connection_unref (connection); - client->priv->connection = NULL; - - } else if (dbus_message_is_signal (message, - DBUS_INTERFACE_DBUS, - "NameOwnerChanged")) { - g_debug ("GdmChooserClient: Name owner changed?"); - } else { - return client_dbus_handle_message (connection, message, user_data, FALSE); - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -gboolean -gdm_chooser_client_start (GdmChooserClient *client, - GError **error) -{ - gboolean ret; - DBusError local_error; - - g_return_val_if_fail (GDM_IS_CHOOSER_CLIENT (client), FALSE); - - ret = FALSE; - - if (client->priv->address == NULL) { - g_warning ("GDM_CHOOSER_DBUS_ADDRESS not set"); - g_set_error (error, - GDM_CHOOSER_CLIENT_ERROR, - GDM_CHOOSER_CLIENT_ERROR_GENERIC, - "GDM_CHOOSER_DBUS_ADDRESS not set"); - goto out; - } - - g_debug ("GdmChooserClient: connecting to address: %s", client->priv->address); - - dbus_error_init (&local_error); - client->priv->connection = dbus_connection_open (client->priv->address, &local_error); - if (client->priv->connection == NULL) { - if (dbus_error_is_set (&local_error)) { - g_warning ("error opening connection: %s", local_error.message); - g_set_error (error, - GDM_CHOOSER_CLIENT_ERROR, - GDM_CHOOSER_CLIENT_ERROR_GENERIC, - "%s", local_error.message); - dbus_error_free (&local_error); - } else { - g_warning ("Unable to open connection"); - } - goto out; - } - - dbus_connection_setup_with_g_main (client->priv->connection, NULL); - dbus_connection_set_exit_on_disconnect (client->priv->connection, TRUE); - - dbus_connection_add_filter (client->priv->connection, - client_dbus_filter_function, - client, - NULL); - - ret = TRUE; - - out: - return ret; -} - -void -gdm_chooser_client_stop (GdmChooserClient *client) -{ - g_return_if_fail (GDM_IS_CHOOSER_CLIENT (client)); - -} - -static void -gdm_chooser_client_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gdm_chooser_client_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static GObject * -gdm_chooser_client_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GdmChooserClient *chooser_client; - - chooser_client = GDM_CHOOSER_CLIENT (G_OBJECT_CLASS (gdm_chooser_client_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - - return G_OBJECT (chooser_client); -} - -static void -gdm_chooser_client_dispose (GObject *object) -{ - g_debug ("GdmChooserClient: Disposing chooser_client"); - - G_OBJECT_CLASS (gdm_chooser_client_parent_class)->dispose (object); -} - -static void -gdm_chooser_client_class_init (GdmChooserClientClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->get_property = gdm_chooser_client_get_property; - object_class->set_property = gdm_chooser_client_set_property; - object_class->constructor = gdm_chooser_client_constructor; - object_class->dispose = gdm_chooser_client_dispose; - object_class->finalize = gdm_chooser_client_finalize; - - g_type_class_add_private (klass, sizeof (GdmChooserClientPrivate)); -} - -static void -gdm_chooser_client_init (GdmChooserClient *client) -{ - - client->priv = GDM_CHOOSER_CLIENT_GET_PRIVATE (client); - - client->priv->address = g_strdup (g_getenv ("GDM_CHOOSER_DBUS_ADDRESS")); -} - -static void -gdm_chooser_client_finalize (GObject *object) -{ - GdmChooserClient *client; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_CHOOSER_CLIENT (object)); - - client = GDM_CHOOSER_CLIENT (object); - - g_return_if_fail (client->priv != NULL); - - g_free (client->priv->address); - - G_OBJECT_CLASS (gdm_chooser_client_parent_class)->finalize (object); -} - -GdmChooserClient * -gdm_chooser_client_new (void) -{ - if (client_object != NULL) { - g_object_ref (client_object); - } else { - client_object = g_object_new (GDM_TYPE_CHOOSER_CLIENT, NULL); - g_object_add_weak_pointer (client_object, - (gpointer *) &client_object); - } - - return GDM_CHOOSER_CLIENT (client_object); -} diff --git a/gui/simple-chooser/gdm-chooser-client.h b/gui/simple-chooser/gdm-chooser-client.h deleted file mode 100644 index 540040d1..00000000 --- a/gui/simple-chooser/gdm-chooser-client.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- 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. - * - */ - -#ifndef __GDM_CHOOSER_CLIENT_H -#define __GDM_CHOOSER_CLIENT_H - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GDM_TYPE_CHOOSER_CLIENT (gdm_chooser_client_get_type ()) -#define GDM_CHOOSER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClient)) -#define GDM_CHOOSER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientClass)) -#define GDM_IS_CHOOSER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_CHOOSER_CLIENT)) -#define GDM_IS_CHOOSER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_CHOOSER_CLIENT)) -#define GDM_CHOOSER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientClass)) - -typedef struct GdmChooserClientPrivate GdmChooserClientPrivate; - -typedef struct -{ - GObject parent; - GdmChooserClientPrivate *priv; -} GdmChooserClient; - -typedef struct -{ - GObjectClass parent_class; -} GdmChooserClientClass; - -#define GDM_CHOOSER_CLIENT_ERROR (gdm_chooser_client_error_quark ()) - -typedef enum _GdmChooserClientError { - GDM_CHOOSER_CLIENT_ERROR_GENERIC = 0, -} GdmChooserClientError; - -GType gdm_chooser_client_get_type (void); -GQuark gdm_chooser_client_error_quark (void); - -GdmChooserClient * gdm_chooser_client_new (void); - -gboolean gdm_chooser_client_start (GdmChooserClient *client, - GError **error); -void gdm_chooser_client_stop (GdmChooserClient *client); - -void gdm_chooser_client_call_disconnect (GdmChooserClient *client); -void gdm_chooser_client_call_select_hostname (GdmChooserClient *client, - const char *text); - -G_END_DECLS - -#endif /* __GDM_CHOOSER_CLIENT_H */ diff --git a/gui/simple-chooser/gdm-chooser-session.c b/gui/simple-chooser/gdm-chooser-session.c index da1e8963..3a69aa71 100644 --- a/gui/simple-chooser/gdm-chooser-session.c +++ b/gui/simple-chooser/gdm-chooser-session.c @@ -30,7 +30,7 @@ #include <glib-object.h> #include "gdm-chooser-session.h" -#include "gdm-chooser-client.h" +#include "gdm-client.h" #include "gdm-host-chooser-dialog.h" @@ -38,7 +38,9 @@ struct GdmChooserSessionPrivate { - GdmChooserClient *client; + GdmClient *client; + GdmRemoteGreeter *remote_greeter; + GdmChooser *chooser; GtkWidget *chooser_dialog; }; @@ -150,6 +152,7 @@ on_dialog_response (GtkDialog *dialog, GdmChooserSession *session) { GdmChooserHost *host; + GError *error = NULL; host = NULL; switch (response_id) { @@ -172,38 +175,59 @@ on_dialog_response (GtkDialog *dialog, /* 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); + gdm_chooser_call_select_hostname_sync (session->priv->chooser, + hostname, + NULL, + &error); + + if (error != NULL) { + g_debug ("GdmChooserSession: %s", error->message); + g_clear_error (&error); + } g_free (hostname); } } - gdm_chooser_client_call_disconnect (session->priv->client); + gdm_remote_greeter_call_disconnect_sync (session->priv->remote_greeter, + NULL, + &error); + if (error != NULL) { + g_debug ("GdmChooserSession: disconnect failed: %s", error->message); + } } gboolean gdm_chooser_session_start (GdmChooserSession *session, GError **error) { - gboolean res; - g_return_val_if_fail (GDM_IS_CHOOSER_SESSION (session), FALSE); - res = gdm_chooser_client_start (session->priv->client, error); - - if (res) { - start_settings_daemon (session); - start_window_manager (session); + session->priv->remote_greeter = gdm_client_get_remote_greeter_sync (session->priv->client, + NULL, + error); + if (session->priv->remote_greeter == NULL) { + return FALSE; + } - /* 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), - session); - gtk_widget_show (session->priv->chooser_dialog); + session->priv->chooser = gdm_client_get_chooser_sync (session->priv->client, + NULL, + error); + if (session->priv->chooser == NULL) { + return FALSE; } - return res; + start_settings_daemon (session); + start_window_manager (session); + + /* 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), + session); + gtk_widget_show (session->priv->chooser_dialog); + + return TRUE; } void @@ -281,7 +305,7 @@ gdm_chooser_session_init (GdmChooserSession *session) session->priv = GDM_CHOOSER_SESSION_GET_PRIVATE (session); - session->priv->client = gdm_chooser_client_new (); + session->priv->client = gdm_client_new (); } static void @@ -296,6 +320,10 @@ gdm_chooser_session_finalize (GObject *object) g_return_if_fail (chooser_session->priv != NULL); + g_clear_object (&chooser_session->priv->chooser); + g_clear_object (&chooser_session->priv->remote_greeter); + g_clear_object (&chooser_session->priv->client); + G_OBJECT_CLASS (gdm_chooser_session_parent_class)->finalize (object); } |