diff options
author | Ray Strode <rstrode@redhat.com> | 2012-07-11 14:38:26 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2012-07-17 03:34:20 -0400 |
commit | 7b1931207544ebc00542eb158dae34a7331629c2 (patch) | |
tree | d2d35f6cee3af0a9aa5bc299ccbab72f40311193 | |
parent | 917c821bd4dbcd564b5f796051b55b122f1e7d7c (diff) | |
download | gdm-7b1931207544ebc00542eb158dae34a7331629c2.tar.gz |
greeter: port to libgdm
The simple-greeter is the fallback greeter shown if
gnome-shell is unavailable.
Right now it uses its own hardcoded D-Bus calls
to interact with the GDM daemon.
The D-Bus APIs have changed, though, and so now it
no longer works.
This commit changes simple-greeter to use libgdm
instead.
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | gui/simple-greeter/Makefile.am | 29 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.c | 1127 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-client.h | 133 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.c | 5 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-panel.c | 155 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-session.c | 270 | ||||
-rw-r--r-- | gui/simple-greeter/greeter-main.c | 109 | ||||
-rw-r--r-- | gui/simple-greeter/org.gnome.SessionManager.ClientPrivate.xml | 123 | ||||
-rw-r--r-- | gui/simple-greeter/org.gnome.SessionManager.xml | 392 |
10 files changed, 849 insertions, 1495 deletions
diff --git a/configure.ac b/configure.ac index df47e46e..af2e2956 100644 --- a/configure.ac +++ b/configure.ac @@ -140,7 +140,6 @@ AC_SUBST(UPOWER_CFLAGS) AC_SUBST(UPOWER_LIBS) PKG_CHECK_MODULES(SIMPLE_GREETER, - dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION gtk+-3.0 >= $GTK_REQUIRED_VERSION fontconfig >= $FONTCONFIG_REQUIRED_VERSION accountsservice >= $ACCOUNTS_SERVICE_REQUIRED_VERSION diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am index f11e6cf4..1cd5fab9 100644 --- a/gui/simple-greeter/Makefile.am +++ b/gui/simple-greeter/Makefile.am @@ -7,6 +7,7 @@ SUBDIRS = \ AM_CPPFLAGS = \ -I$(top_srcdir)/common \ -I$(top_builddir)/common \ + -I$(top_srcdir)/gui/libgdm \ -I$(top_srcdir)/gui/simple-greeter/libgdmsimplegreeter \ -DDMCONFDIR=\""$(dmconfdir)"\" \ -DGDMCONFDIR=\"$(gdmconfdir)\" \ @@ -36,6 +37,22 @@ noinst_PROGRAMS = \ test-user-manager \ $(NULL) +gsm-client-glue.c gsm-client-glue.h : org.gnome.SessionManager.ClientPrivate.xml Makefile.am + $(AM_V_GEN)gdbus-codegen \ + --c-namespace Gsm \ + --interface-prefix=org.gnome.SessionManager \ + --generate-c-code=gsm-client-glue \ + org.gnome.SessionManager.ClientPrivate.xml + +gsm-manager-glue.c gsm-manager-glue.h : org.gnome.SessionManager.xml Makefile.am + $(AM_V_GEN)gdbus-codegen \ + --c-namespace Gsm \ + --interface-prefix=org.gnome.SessionManager \ + --generate-c-code=gsm-manager-glue \ + --annotate "org.gnome.SessionManager" \ + "org.gtk.GDBus.C.Name" Manager \ + org.gnome.SessionManager.xml + test_greeter_login_window_SOURCES = \ test-greeter-login-window.c \ gdm-timer.h \ @@ -64,6 +81,7 @@ test_greeter_login_window_SOURCES = \ test_greeter_login_window_LDADD = \ $(top_builddir)/common/libgdmcommon.la \ + $(top_builddir)/gui/libgdm/libgdm.la \ $(top_builddir)/gui/simple-greeter/libgdmsimplegreeter/libgdmsimplegreeter.la \ $(top_builddir)/gui/simple-greeter/extensions/unified/libunified.la \ $(COMMON_LIBS) \ @@ -176,8 +194,6 @@ gdm_simple_greeter_SOURCES = \ gdm-scrollable-widget.c \ gdm-chooser-widget.h \ gdm-chooser-widget.c \ - gdm-greeter-client.h \ - gdm-greeter-client.c \ gdm-greeter-session.h \ gdm-greeter-session.c \ gdm-greeter-login-window.c \ @@ -202,6 +218,7 @@ gdm_simple_greeter_SOURCES = \ gdm_simple_greeter_LDADD = \ $(top_builddir)/common/libgdmcommon.la \ + $(top_builddir)/gui/libgdm/libgdm.la \ $(top_builddir)/gui/simple-greeter/libgdmsimplegreeter/libgdmsimplegreeter.la \ $(top_builddir)/gui/simple-greeter/extensions/unified/libunified.la \ $(COMMON_LIBS) \ @@ -212,6 +229,14 @@ gdm_simple_greeter_LDADD = \ $(UPOWER_LIBS) \ $(NULL) +nodist_gdm_simple_greeter_SOURCES = \ + gsm-manager-glue.c \ + gsm-manager-glue.h \ + gsm-client-glue.c \ + gsm-client-glue.h + +BUILT_SOURCES = gsm-client-glue.h gsm-manager-glue.h + uidir = $(pkgdatadir) ui_DATA = \ gdm-greeter-login-window.ui \ diff --git a/gui/simple-greeter/gdm-greeter-client.c b/gui/simple-greeter/gdm-greeter-client.c deleted file mode 100644 index ec56f90f..00000000 --- a/gui/simple-greeter/gdm-greeter-client.c +++ /dev/null @@ -1,1127 +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-greeter-client.h" -#include "gdm-profile.h" - -#define GDM_GREETER_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientPrivate)) - -#define GREETER_SERVER_DBUS_PATH "/org/gnome/DisplayManager/GreeterServer" -#define GREETER_SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.GreeterServer" - -#define GDM_DBUS_NAME "org.gnome.DisplayManager" -#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display" - -struct GdmGreeterClientPrivate -{ - DBusConnection *connection; - char *address; - - char *display_id; - gboolean display_is_local; -}; - -enum { - PROP_0, -}; - -enum { - INFO, - PROBLEM, - INFO_QUERY, - SECRET_INFO_QUERY, - SERVICE_UNAVAILABLE, - READY, - CONVERSATION_STOPPED, - RESET, - AUTHENTICATION_FAILED, - SELECTED_USER_CHANGED, - DEFAULT_LANGUAGE_NAME_CHANGED, - DEFAULT_SESSION_NAME_CHANGED, - TIMED_LOGIN_REQUESTED, - SESSION_OPENED, - LAST_SIGNAL -}; - -static guint gdm_greeter_client_signals [LAST_SIGNAL]; - -static void gdm_greeter_client_class_init (GdmGreeterClientClass *klass); -static void gdm_greeter_client_init (GdmGreeterClient *greeter_client); -static void gdm_greeter_client_finalize (GObject *object); - -G_DEFINE_TYPE (GdmGreeterClient, gdm_greeter_client, G_TYPE_OBJECT) - -static gpointer client_object = NULL; - -GQuark -gdm_greeter_client_error_quark (void) -{ - static GQuark error_quark = 0; - - if (error_quark == 0) - error_quark = g_quark_from_static_string ("gdm-greeter-client"); - - return error_quark; -} - -gboolean -gdm_greeter_client_get_display_is_local (GdmGreeterClient *client) -{ - g_return_val_if_fail (GDM_IS_GREETER_CLIENT (client), FALSE); - - return client->priv->display_is_local; -} - -static void -emit_string_and_int_signal_for_message (GdmGreeterClient *client, - const char *name, - DBusMessage *message, - int signal) -{ - DBusError error; - const char *text; - int number; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INT32, &number, - DBUS_TYPE_INVALID); - if (res) { - - g_debug ("GdmGreeterClient: Received %s (%s %d)", name, text, number); - - g_signal_emit (client, - gdm_greeter_client_signals[signal], - 0, text, number); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -emit_string_and_string_signal_for_message (GdmGreeterClient *client, - const char *name, - DBusMessage *message, - int signal) -{ - DBusError error; - char *text1; - char *text2; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text1, - DBUS_TYPE_STRING, &text2, - DBUS_TYPE_INVALID); - if (res) { - - g_debug ("GdmGreeterClient: Received %s (%s, %s)", name, text1, text2); - - g_signal_emit (client, - gdm_greeter_client_signals[signal], - 0, text1, text2); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } - dbus_error_free (&error); -} - -static void -emit_string_signal_for_message (GdmGreeterClient *client, - const char *name, - DBusMessage *message, - int signal) -{ - DBusError error; - const char *text; - dbus_bool_t res; - - dbus_error_init (&error); - res = dbus_message_get_args (message, - &error, - DBUS_TYPE_STRING, &text, - DBUS_TYPE_INVALID); - if (res) { - - g_debug ("GdmGreeterClient: Received %s (%s)", name, text); - - g_signal_emit (client, - gdm_greeter_client_signals[signal], - 0, text); - } else { - g_warning ("Unable to get arguments: %s", error.message); - dbus_error_free (&error); - } -} - -static void -on_selected_user_changed (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "SelectedUserChanged", message, SELECTED_USER_CHANGED); -} - -static void -on_default_language_name_changed (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "DefaultLanguageNameChanged", message, DEFAULT_LANGUAGE_NAME_CHANGED); -} - -static void -on_default_session_name_changed (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "DefaultSessionNameChanged", message, DEFAULT_SESSION_NAME_CHANGED); -} - -static void -on_timed_login_requested (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_and_int_signal_for_message (client, "TimedLoginRequested", message, TIMED_LOGIN_REQUESTED); -} - -static void -on_session_opened (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "SessionOpened", message, SESSION_OPENED); -} - -static void -on_info_query (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_and_string_signal_for_message (client, "InfoQuery", message, INFO_QUERY); -} - -static void -on_secret_info_query (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_and_string_signal_for_message (client, "SecretInfoQuery", message, SECRET_INFO_QUERY); -} - -static void -on_info (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_and_string_signal_for_message (client, "Info", message, INFO); -} - -static void -on_problem (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_and_string_signal_for_message (client, "Problem", message, PROBLEM); -} - -static void -on_service_unavailable (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "ServiceUnavailable", message, SERVICE_UNAVAILABLE); -} - -static void -on_ready (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "Ready", message, READY); -} - -static void -on_conversation_stopped (GdmGreeterClient *client, - DBusMessage *message) -{ - emit_string_signal_for_message (client, "ConversationStopped", message, CONVERSATION_STOPPED); -} - -static void -on_reset (GdmGreeterClient *client, - DBusMessage *message) -{ - g_debug ("GdmGreeterClient: Reset"); - - g_signal_emit (client, - gdm_greeter_client_signals[RESET], - 0); -} - -static void -on_authentication_failed (GdmGreeterClient *client, - DBusMessage *message) -{ - g_debug ("GdmGreeterClient: Authentication failed"); - - g_signal_emit (client, - gdm_greeter_client_signals[AUTHENTICATION_FAILED], - 0); -} - -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 ("GdmGreeterClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - GREETER_SERVER_DBUS_PATH, - GREETER_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_string_and_bool_method (DBusConnection *connection, - const char *method, - const char *string_payload, - gboolean bool_payload) -{ - DBusMessage *message; - DBusMessageIter iter; - const char *str; - - if (string_payload != NULL) { - str = string_payload; - } else { - str = ""; - } - - g_debug ("GdmGreeterClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - GREETER_SERVER_DBUS_PATH, - GREETER_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_message_iter_append_basic (&iter, - DBUS_TYPE_BOOLEAN, - &bool_payload); - dbus_message_set_no_reply (message, TRUE); - - dbus_connection_send (connection, message, NULL); - - dbus_message_unref (message); - - dbus_connection_flush (connection); - - return TRUE; -} - -static gboolean -send_dbus_string_and_string_method (DBusConnection *connection, - const char *method, - const char *payload1, - const char *payload2) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - const char *str; - - g_debug ("GdmGreeterClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - GREETER_SERVER_DBUS_PATH, - GREETER_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); - - if (payload1 != NULL) { - str = payload1; - } else { - str = ""; - } - dbus_message_iter_append_basic (&iter, - DBUS_TYPE_STRING, - &str); - - if (payload2 != NULL) { - str = payload2; - } else { - str = ""; - } - 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 ("GdmGreeterClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - GREETER_SERVER_DBUS_PATH, - GREETER_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_greeter_client_call_start_conversation (GdmGreeterClient *client, - const char *service_name) -{ - send_dbus_string_method (client->priv->connection, - "StartConversation", service_name); -} - -void -gdm_greeter_client_call_begin_auto_login (GdmGreeterClient *client, - const char *username) -{ - send_dbus_string_method (client->priv->connection, - "BeginAutoLogin", username); -} - -void -gdm_greeter_client_call_begin_verification (GdmGreeterClient *client, - const char *service_name) -{ - send_dbus_string_method (client->priv->connection, - "BeginVerification", service_name); -} - -void -gdm_greeter_client_call_begin_verification_for_user (GdmGreeterClient *client, - const char *service_name, - const char *username) -{ - send_dbus_string_and_string_method (client->priv->connection, - "BeginVerificationForUser", - service_name, - username); -} - -void -gdm_greeter_client_call_answer_query (GdmGreeterClient *client, - const char *service_name, - const char *text) -{ - send_dbus_string_and_string_method (client->priv->connection, - "AnswerQuery", - service_name, - text); -} - -void -gdm_greeter_client_call_start_session_when_ready (GdmGreeterClient *client, - const char *service_name, - gboolean should_start_session) -{ - send_dbus_string_and_bool_method (client->priv->connection, - "StartSessionWhenReady", - service_name, - should_start_session); -} - -void -gdm_greeter_client_call_select_session (GdmGreeterClient *client, - const char *text) -{ - send_dbus_string_method (client->priv->connection, - "SelectSession", - text); -} - -void -gdm_greeter_client_call_select_user (GdmGreeterClient *client, - const char *text) -{ - send_dbus_string_method (client->priv->connection, - "SelectUser", - text); -} - -void -gdm_greeter_client_call_select_hostname (GdmGreeterClient *client, - const char *text) -{ - send_dbus_string_method (client->priv->connection, - "SelectHostname", - text); -} - -void -gdm_greeter_client_call_cancel (GdmGreeterClient *client) -{ - send_dbus_void_method (client->priv->connection, - "Cancel"); -} - -void -gdm_greeter_client_call_disconnect (GdmGreeterClient *client) -{ - send_dbus_void_method (client->priv->connection, - "Disconnect"); -} - - -static gboolean -send_get_display_id (GdmGreeterClient *client, - const char *method, - char **answerp) -{ - DBusError error; - DBusMessage *message; - DBusMessage *reply; - DBusMessageIter iter; - gboolean ret; - const char *answer; - - ret = FALSE; - - g_debug ("GdmGreeterClient: Calling %s", method); - message = dbus_message_new_method_call (NULL, - GREETER_SERVER_DBUS_PATH, - GREETER_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 (client->priv->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); - goto out; - } - - dbus_message_iter_init (reply, &iter); - dbus_message_iter_get_basic (&iter, &answer); - if (answerp != NULL) { - *answerp = g_strdup (answer); - } - ret = TRUE; - - dbus_message_unref (reply); - dbus_connection_flush (client->priv->connection); - - out: - - return ret; -} - -char * -gdm_greeter_client_call_get_display_id (GdmGreeterClient *client) -{ - char *display_id; - - display_id = NULL; - send_get_display_id (client, - "GetDisplayId", - &display_id); - - return display_id; -} - -static void -cache_display_values (GdmGreeterClient *client) -{ - DBusGProxy *display_proxy; - DBusGConnection *connection; - GError *error; - gboolean res; - - g_free (client->priv->display_id); - client->priv->display_id = gdm_greeter_client_call_get_display_id (client); - if (client->priv->display_id == NULL) { - return; - } - - error = NULL; - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); - if (connection == NULL) { - if (error != NULL) { - g_critical ("error getting system bus: %s", error->message); - g_error_free (error); - } - return; - } - - g_debug ("GdmGreeterClient: Creating proxy for %s", client->priv->display_id); - display_proxy = dbus_g_proxy_new_for_name (connection, - GDM_DBUS_NAME, - client->priv->display_id, - GDM_DBUS_DISPLAY_INTERFACE); - /* cache some values up front */ - error = NULL; - res = dbus_g_proxy_call (display_proxy, - "IsLocal", - &error, - G_TYPE_INVALID, - G_TYPE_BOOLEAN, &client->priv->display_is_local, - G_TYPE_INVALID); - if (! res) { - if (error != NULL) { - g_warning ("Failed to get value: %s", error->message); - g_error_free (error); - } else { - g_warning ("Failed to get value"); - } - } -} - -static DBusHandlerResult -client_dbus_handle_message (DBusConnection *connection, - DBusMessage *message, - void *user_data, - dbus_bool_t local_interface) -{ - GdmGreeterClient *client = GDM_GREETER_CLIENT (user_data); - -#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); - - if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "InfoQuery")) { - on_info_query (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "SecretInfoQuery")) { - on_secret_info_query (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "Info")) { - on_info (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "Problem")) { - on_problem (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "ServiceUnavailable")) { - on_service_unavailable (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "Ready")) { - on_ready (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "ConversationStopped")) { - on_conversation_stopped (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "Reset")) { - on_reset (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "AuthenticationFailed")) { - on_authentication_failed (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "SelectedUserChanged")) { - on_selected_user_changed (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "DefaultLanguageNameChanged")) { - on_default_language_name_changed (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "DefaultSessionNameChanged")) { - on_default_session_name_changed (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "TimedLoginRequested")) { - on_timed_login_requested (client, message); - } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "SessionOpened")) { - on_session_opened (client, message); - } else { - return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -static DBusHandlerResult -client_dbus_filter_function (DBusConnection *connection, - DBusMessage *message, - void *user_data) -{ - GdmGreeterClient *client = GDM_GREETER_CLIENT (user_data); - const char *path; - - path = dbus_message_get_path (message); - - g_debug ("GdmGreeterClient: 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 ("GdmGreeterClient: Name owner changed?"); - } else { - return client_dbus_handle_message (connection, message, user_data, FALSE); - } - - return DBUS_HANDLER_RESULT_HANDLED; -} - -gboolean -gdm_greeter_client_start (GdmGreeterClient *client, - GError **error) -{ - gboolean ret; - DBusError local_error; - - g_return_val_if_fail (GDM_IS_GREETER_CLIENT (client), FALSE); - - gdm_profile_start (NULL); - - ret = FALSE; - - if (client->priv->address == NULL) { - g_warning ("GDM_GREETER_DBUS_ADDRESS not set"); - g_set_error (error, - GDM_GREETER_CLIENT_ERROR, - GDM_GREETER_CLIENT_ERROR_GENERIC, - "GDM_GREETER_DBUS_ADDRESS not set"); - goto out; - } - - g_debug ("GdmGreeterClient: 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_GREETER_CLIENT_ERROR, - GDM_GREETER_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); - - cache_display_values (client); - - ret = TRUE; - - out: - gdm_profile_end (NULL); - - return ret; -} - -void -gdm_greeter_client_stop (GdmGreeterClient *client) -{ - g_return_if_fail (GDM_IS_GREETER_CLIENT (client)); - -} - -static void -gdm_greeter_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_greeter_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_greeter_client_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GdmGreeterClient *greeter_client; - - greeter_client = GDM_GREETER_CLIENT (G_OBJECT_CLASS (gdm_greeter_client_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - - return G_OBJECT (greeter_client); -} - -static void -gdm_greeter_client_dispose (GObject *object) -{ - g_debug ("GdmGreeterClient: Disposing greeter_client"); - - G_OBJECT_CLASS (gdm_greeter_client_parent_class)->dispose (object); -} - -static void -gdm_greeter_client_class_init (GdmGreeterClientClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->get_property = gdm_greeter_client_get_property; - object_class->set_property = gdm_greeter_client_set_property; - object_class->constructor = gdm_greeter_client_constructor; - object_class->dispose = gdm_greeter_client_dispose; - object_class->finalize = gdm_greeter_client_finalize; - - g_type_class_add_private (klass, sizeof (GdmGreeterClientPrivate)); - - gdm_greeter_client_signals[INFO_QUERY] = - g_signal_new ("info-query", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GdmGreeterClientClass, info_query), - NULL, - NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 2, - G_TYPE_STRING, G_TYPE_STRING); - - gdm_greeter_client_signals[SECRET_INFO_QUERY] = - g_signal_new ("secret-info-query", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GdmGreeterClientClass, secret_info_query), - NULL, - NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 2, - G_TYPE_STRING, G_TYPE_STRING); - - gdm_greeter_client_signals[INFO] = - g_signal_new ("info", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, info), - NULL, - NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 2, - G_TYPE_STRING, G_TYPE_STRING); - - gdm_greeter_client_signals[PROBLEM] = - g_signal_new ("problem", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, problem), - NULL, - NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 2, - G_TYPE_STRING, G_TYPE_STRING); - - gdm_greeter_client_signals[SERVICE_UNAVAILABLE] = - g_signal_new ("service-unavailable", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, service_unavailable), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); - - gdm_greeter_client_signals[READY] = - g_signal_new ("ready", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, ready), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); - - gdm_greeter_client_signals[CONVERSATION_STOPPED] = - g_signal_new ("conversation-stopped", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, conversation_stopped), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); - - gdm_greeter_client_signals[RESET] = - g_signal_new ("reset", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, reset), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - gdm_greeter_client_signals[AUTHENTICATION_FAILED] = - g_signal_new ("authentication-failed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, authentication_failed), - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0); - gdm_greeter_client_signals[SELECTED_USER_CHANGED] = - g_signal_new ("selected-user-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, selected_user_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); - gdm_greeter_client_signals[DEFAULT_LANGUAGE_NAME_CHANGED] = - g_signal_new ("default-language-name-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, default_language_name_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); - gdm_greeter_client_signals[DEFAULT_SESSION_NAME_CHANGED] = - g_signal_new ("default-session-name-changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, default_session_name_changed), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); - - gdm_greeter_client_signals[TIMED_LOGIN_REQUESTED] = - g_signal_new ("timed-login-requested", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, timed_login_requested), - NULL, - NULL, - g_cclosure_marshal_generic, - G_TYPE_NONE, - 2, G_TYPE_STRING, G_TYPE_INT); - - gdm_greeter_client_signals[SESSION_OPENED] = - g_signal_new ("session-opened", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GdmGreeterClientClass, session_opened), - NULL, - NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, - 1, G_TYPE_STRING); -} - -static void -gdm_greeter_client_init (GdmGreeterClient *client) -{ - - client->priv = GDM_GREETER_CLIENT_GET_PRIVATE (client); - - client->priv->address = g_strdup (g_getenv ("GDM_GREETER_DBUS_ADDRESS")); -} - -static void -gdm_greeter_client_finalize (GObject *object) -{ - GdmGreeterClient *client; - - g_return_if_fail (object != NULL); - g_return_if_fail (GDM_IS_GREETER_CLIENT (object)); - - client = GDM_GREETER_CLIENT (object); - - g_return_if_fail (client->priv != NULL); - - g_free (client->priv->address); - - G_OBJECT_CLASS (gdm_greeter_client_parent_class)->finalize (object); -} - -GdmGreeterClient * -gdm_greeter_client_new (void) -{ - if (client_object != NULL) { - g_object_ref (client_object); - } else { - client_object = g_object_new (GDM_TYPE_GREETER_CLIENT, NULL); - g_object_add_weak_pointer (client_object, - (gpointer *) &client_object); - } - - return GDM_GREETER_CLIENT (client_object); -} diff --git a/gui/simple-greeter/gdm-greeter-client.h b/gui/simple-greeter/gdm-greeter-client.h deleted file mode 100644 index 965035d7..00000000 --- a/gui/simple-greeter/gdm-greeter-client.h +++ /dev/null @@ -1,133 +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_GREETER_CLIENT_H -#define __GDM_GREETER_CLIENT_H - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GDM_TYPE_GREETER_CLIENT (gdm_greeter_client_get_type ()) -#define GDM_GREETER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClient)) -#define GDM_GREETER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientClass)) -#define GDM_IS_GREETER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_GREETER_CLIENT)) -#define GDM_IS_GREETER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_GREETER_CLIENT)) -#define GDM_GREETER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_GREETER_CLIENT, GdmGreeterClientClass)) - -typedef struct GdmGreeterClientPrivate GdmGreeterClientPrivate; - -typedef struct -{ - GObject parent; - GdmGreeterClientPrivate *priv; -} GdmGreeterClient; - -typedef struct -{ - GObjectClass parent_class; - - void (* info_query) (GdmGreeterClient *client, - const char *service_name, - const char *query_text); - - void (* secret_info_query) (GdmGreeterClient *client, - const char *service_name, - const char *query_text); - - void (* info) (GdmGreeterClient *client, - const char *service_name, - const char *info); - - void (* problem) (GdmGreeterClient *client, - const char *service_name, - const char *problem); - void (* service_unavailable) (GdmGreeterClient *client, - const char *service_name); - void (* ready) (GdmGreeterClient *client, - const char *service_name); - void (* conversation_stopped) (GdmGreeterClient *client, - const char *service_name); - void (* reset) (GdmGreeterClient *client); - void (* authentication_failed) (GdmGreeterClient *client); - void (* selected_user_changed) (GdmGreeterClient *client, - const char *username); - - void (* default_session_name_changed) (GdmGreeterClient *client, - const char *session_name); - void (* default_language_name_changed) (GdmGreeterClient *client, - const char *language_name); - void (* timed_login_requested) (GdmGreeterClient *client, - const char *username, - int delay); - void (* session_opened) (GdmGreeterClient *client, - const char *service_name); -} GdmGreeterClientClass; - -#define GDM_GREETER_CLIENT_ERROR (gdm_greeter_client_error_quark ()) - -typedef enum _GdmGreeterClientError { - GDM_GREETER_CLIENT_ERROR_GENERIC = 0, -} GdmGreeterClientError; - -GType gdm_greeter_client_get_type (void); -GQuark gdm_greeter_client_error_quark (void); - -GdmGreeterClient * gdm_greeter_client_new (void); - -gboolean gdm_greeter_client_start (GdmGreeterClient *client, - GError **error); -void gdm_greeter_client_stop (GdmGreeterClient *client); - -gboolean gdm_greeter_client_get_display_is_local (GdmGreeterClient *client); - -char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client); - -void gdm_greeter_client_call_start_conversation (GdmGreeterClient *client, - const char *service_name); -void gdm_greeter_client_call_begin_auto_login (GdmGreeterClient *client, - const char *username); -void gdm_greeter_client_call_begin_verification (GdmGreeterClient *client, - const char *service_name); -void gdm_greeter_client_call_begin_verification_for_user (GdmGreeterClient *client, - const char *service_name, - const char *username); -void gdm_greeter_client_call_cancel (GdmGreeterClient *client); -void gdm_greeter_client_call_disconnect (GdmGreeterClient *client); -void gdm_greeter_client_call_select_hostname (GdmGreeterClient *client, - const char *text); -void gdm_greeter_client_call_select_user (GdmGreeterClient *client, - const char *text); -void gdm_greeter_client_call_select_language (GdmGreeterClient *client, - const char *text); -void gdm_greeter_client_call_select_session (GdmGreeterClient *client, - const char *text); -void gdm_greeter_client_call_answer_query (GdmGreeterClient *client, - const char *service_name, - const char *text); - -void gdm_greeter_client_call_start_session_when_ready (GdmGreeterClient *client, - const char *service_name, - gboolean should_start_session); - - -G_END_DECLS - -#endif /* __GDM_GREETER_CLIENT_H */ diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index 4ca83c75..f7b67b7a 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -49,14 +49,11 @@ #include <gtk/gtk.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - #include "gdm-settings-client.h" #include "gdm-settings-keys.h" #include "gdm-profile.h" -#include "gdm-greeter-client.h" +#include "gdm-client.h" #include "gdm-greeter-login-window.h" #include "gdm-user-chooser-widget.h" #include "gdm-session-option-widget.h" diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c index ba6f8102..5c626fef 100644 --- a/gui/simple-greeter/gdm-greeter-panel.c +++ b/gui/simple-greeter/gdm-greeter-panel.c @@ -40,8 +40,6 @@ #include <gdk/gdk.h> #include <gtk/gtk.h> -#include <dbus/dbus-glib.h> - #ifdef HAVE_UPOWER #include <upower.h> #endif @@ -626,89 +624,100 @@ on_animation_tick (GdmGreeterPanel *panel, } static gboolean -try_system_stop (DBusGConnection *connection, +try_system_stop (GDBusConnection *connection, GError **error) { - DBusGProxy *proxy; - gboolean res; + GVariant *reply; + gboolean res; + GError *call_error; g_debug ("GdmGreeterPanel: trying to stop system"); - /* try systemd first */ - proxy = dbus_g_proxy_new_for_name_owner (connection, - LOGIN1_NAME, - LOGIN1_PATH, - LOGIN1_INTERFACE, - error); - if (proxy) { - res = dbus_g_proxy_call_with_timeout (proxy, - "PowerOff", - INT_MAX, - error, - /* parameters: */ - G_TYPE_BOOLEAN, - TRUE, - G_TYPE_INVALID, - /* return values: */ - G_TYPE_INVALID); + call_error = NULL; + reply = g_dbus_connection_call_sync (connection, + LOGIN1_NAME, + LOGIN1_PATH, + LOGIN1_INTERFACE, + "PowerOff", + g_variant_new ("(b)", TRUE), + NULL, + G_DBUS_CALL_FLAGS_NONE, + INT_MAX, + NULL, + &call_error); + + if (reply == NULL && g_error_matches (call_error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER)) { + g_clear_error (&call_error); + reply = g_dbus_connection_call_sync (connection, + CK_NAME, + CK_MANAGER_PATH, + CK_MANAGER_INTERFACE, + "Stop", + NULL, + NULL, + G_DBUS_CALL_FLAGS_NONE, + INT_MAX, + NULL, + &call_error); + } + + if (reply != NULL) { + res = TRUE; + g_variant_unref (reply); } else { - proxy = dbus_g_proxy_new_for_name (connection, - CK_NAME, - CK_MANAGER_PATH, - CK_MANAGER_INTERFACE); - res = dbus_g_proxy_call_with_timeout (proxy, - "Stop", - INT_MAX, - error, - /* parameters: */ - G_TYPE_INVALID, - /* return values: */ - G_TYPE_INVALID); + g_propagate_error (error, call_error); + res = FALSE; } return res; } static gboolean -try_system_restart (DBusGConnection *connection, +try_system_restart (GDBusConnection *connection, GError **error) { - DBusGProxy *proxy; - gboolean res; + GVariant *reply; + gboolean res; + GError *call_error; g_debug ("GdmGreeterPanel: trying to restart system"); - /* try systemd first */ - proxy = dbus_g_proxy_new_for_name_owner (connection, - LOGIN1_NAME, - LOGIN1_PATH, - LOGIN1_INTERFACE, - error); - if (proxy) { - res = dbus_g_proxy_call_with_timeout (proxy, - "Reboot", - INT_MAX, - error, - /* parameters: */ - G_TYPE_BOOLEAN, - TRUE, - G_TYPE_INVALID, - /* return values: */ - G_TYPE_INVALID); + call_error = NULL; + reply = g_dbus_connection_call_sync (connection, + LOGIN1_NAME, + LOGIN1_PATH, + LOGIN1_INTERFACE, + "Reboot", + g_variant_new ("(b)", TRUE), + NULL, + G_DBUS_CALL_FLAGS_NONE, + INT_MAX, + NULL, + &call_error); + + if (reply == NULL && g_error_matches (call_error, G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER)) { + g_clear_error (&call_error); + reply = g_dbus_connection_call_sync (connection, + CK_NAME, + CK_MANAGER_PATH, + CK_MANAGER_INTERFACE, + "Restart", + NULL, + NULL, + G_DBUS_CALL_FLAGS_NONE, + INT_MAX, + NULL, + &call_error); + } + + if (reply != NULL) { + res = TRUE; + g_variant_unref (reply); } else { - proxy = dbus_g_proxy_new_for_name (connection, - CK_NAME, - CK_MANAGER_PATH, - CK_MANAGER_INTERFACE); - res = dbus_g_proxy_call_with_timeout (proxy, - "Restart", - INT_MAX, - error, - /* parameters: */ - G_TYPE_INVALID, - /* return values: */ - G_TYPE_INVALID); + g_propagate_error (error, call_error); + res = FALSE; } + return res; } @@ -754,10 +763,10 @@ do_system_restart (void) { gboolean res; GError *error; - DBusGConnection *connection; + GDBusConnection *connection; error = NULL; - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (connection == NULL) { g_warning ("Unable to get system bus connection: %s", error->message); g_error_free (error); @@ -766,8 +775,7 @@ do_system_restart (void) res = try_system_restart (connection, &error); if (!res) { - g_debug ("GdmGreeterPanel: unable to restart system: %s: %s", - dbus_g_error_get_name (error), + g_debug ("GdmGreeterPanel: unable to restart system: %s", error->message); g_error_free (error); } @@ -778,10 +786,10 @@ do_system_stop (void) { gboolean res; GError *error; - DBusGConnection *connection; + GDBusConnection *connection; error = NULL; - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); if (connection == NULL) { g_warning ("Unable to get system bus connection: %s", error->message); g_error_free (error); @@ -790,8 +798,7 @@ do_system_stop (void) res = try_system_stop (connection, &error); if (!res) { - g_debug ("GdmGreeterPanel: unable to stop system: %s: %s", - dbus_g_error_get_name (error), + g_debug ("GdmGreeterPanel: unable to stop system: %s", error->message); g_error_free (error); } diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c index d0ce274f..ac332c50 100644 --- a/gui/simple-greeter/gdm-greeter-session.c +++ b/gui/simple-greeter/gdm-greeter-session.c @@ -25,15 +25,13 @@ #include <unistd.h> #include <string.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> - #include <glib.h> #include <glib/gi18n.h> #include <glib-object.h> +#include "gdm-client.h" + #include "gdm-greeter-session.h" -#include "gdm-greeter-client.h" #include "gdm-greeter-panel.h" #include "gdm-greeter-login-window.h" #include "gdm-user-chooser-widget.h" @@ -46,7 +44,11 @@ struct GdmGreeterSessionPrivate { - GdmGreeterClient *client; + GdmClient *client; + GdmUserVerifier *user_verifier; + GdmRemoteGreeter *remote_greeter; + GdmGreeter *greeter; + GtkWidget *login_window; GtkWidget *panel; @@ -67,7 +69,7 @@ G_DEFINE_TYPE (GdmGreeterSession, gdm_greeter_session, G_TYPE_OBJECT) static gpointer session_object = NULL; static void -on_info (GdmGreeterClient *client, +on_info (GdmClient *client, const char *service_name, const char *text, GdmGreeterSession *session) @@ -78,7 +80,7 @@ on_info (GdmGreeterClient *client, } static void -on_problem (GdmGreeterClient *client, +on_problem (GdmClient *client, const char *service_name, const char *text, GdmGreeterSession *session) @@ -89,7 +91,7 @@ on_problem (GdmGreeterClient *client, } static void -on_service_unavailable (GdmGreeterClient *client, +on_service_unavailable (GdmClient *client, const char *service_name, GdmGreeterSession *session) { @@ -99,9 +101,9 @@ on_service_unavailable (GdmGreeterClient *client, } static void -on_ready (GdmGreeterClient *client, - const char *service_name, - GdmGreeterSession *session) +on_conversation_started (GdmClient *client, + const char *service_name, + GdmGreeterSession *session) { g_debug ("GdmGreeterSession: Ready"); @@ -110,7 +112,7 @@ on_ready (GdmGreeterClient *client, } static void -on_conversation_stopped (GdmGreeterClient *client, +on_conversation_stopped (GdmClient *client, const char *service_name, GdmGreeterSession *session) { @@ -121,7 +123,7 @@ on_conversation_stopped (GdmGreeterClient *client, } static void -on_reset (GdmGreeterClient *client, +on_reset (GdmClient *client, GdmGreeterSession *session) { g_debug ("GdmGreeterSession: Reset"); @@ -143,7 +145,7 @@ show_or_hide_user_options (GdmGreeterSession *session, } static void -on_selected_user_changed (GdmGreeterClient *client, +on_selected_user_changed (GdmClient *client, const char *text, GdmGreeterSession *session) { @@ -152,7 +154,7 @@ on_selected_user_changed (GdmGreeterClient *client, } static void -on_default_language_name_changed (GdmGreeterClient *client, +on_default_language_name_changed (GdmClient *client, const char *text, GdmGreeterSession *session) { @@ -160,7 +162,7 @@ on_default_language_name_changed (GdmGreeterClient *client, } static void -on_default_session_name_changed (GdmGreeterClient *client, +on_default_session_name_changed (GdmClient *client, const char *text, GdmGreeterSession *session) { @@ -169,7 +171,7 @@ on_default_session_name_changed (GdmGreeterClient *client, } static void -on_timed_login_requested (GdmGreeterClient *client, +on_timed_login_requested (GdmClient *client, const char *text, int delay, GdmGreeterSession *session) @@ -179,7 +181,7 @@ on_timed_login_requested (GdmGreeterClient *client, } static void -on_session_opened (GdmGreeterClient *client, +on_session_opened (GdmClient *client, const char *service_name, GdmGreeterSession *session) { @@ -188,7 +190,7 @@ on_session_opened (GdmGreeterClient *client, } static void -on_info_query (GdmGreeterClient *client, +on_info_query (GdmClient *client, const char *service_name, const char *text, GdmGreeterSession *session) @@ -199,7 +201,7 @@ on_info_query (GdmGreeterClient *client, } static void -on_secret_info_query (GdmGreeterClient *client, +on_secret_info_query (GdmClient *client, const char *service_name, const char *text, GdmGreeterSession *session) @@ -210,20 +212,103 @@ on_secret_info_query (GdmGreeterClient *client, } static void -on_start_conversation (GdmGreeterLoginWindow *login_window, - const char *service_name, - GdmGreeterSession *session) -{ - gdm_greeter_client_call_start_conversation (session->priv->client, - service_name); -} -static void on_begin_auto_login (GdmGreeterLoginWindow *login_window, const char *username, GdmGreeterSession *session) { - gdm_greeter_client_call_begin_auto_login (session->priv->client, - username); + gdm_greeter_call_begin_auto_login_sync (session->priv->greeter, + username, + NULL, + NULL); +} + +static void +get_user_verifier (GdmGreeterSession *session, + const char *username) +{ + GError *error = NULL; + + g_clear_object (&session->priv->user_verifier); + + if (username != NULL) { + session->priv->user_verifier = gdm_client_open_reauthentication_channel_sync (session->priv->client, + username, + NULL, + &error); + + if (error != NULL) { + g_debug ("GdmGreeterSession: could not get reauthentication channel for user %s: %s", username, error->message); + g_clear_error (&error); + } + } + + if (session->priv->user_verifier == NULL) { + session->priv->user_verifier = gdm_client_get_user_verifier_sync (session->priv->client, + NULL, + &error); + + if (error != NULL) { + g_debug ("GdmGreeterSession: could not get user verifier %s", error->message); + g_clear_error (&error); + } + + if (session->priv->user_verifier == NULL) { + + return; + } + } + g_signal_connect (session->priv->user_verifier, + "info-query", + G_CALLBACK (on_info_query), + session); + g_signal_connect (session->priv->user_verifier, + "secret-info-query", + G_CALLBACK (on_secret_info_query), + session); + g_signal_connect (session->priv->user_verifier, + "info", + G_CALLBACK (on_info), + session); + g_signal_connect (session->priv->user_verifier, + "problem", + G_CALLBACK (on_problem), + session); + g_signal_connect (session->priv->user_verifier, + "service-unavailable", + G_CALLBACK (on_service_unavailable), + session); + g_signal_connect (session->priv->user_verifier, + "conversation-started", + G_CALLBACK (on_conversation_started), + session); + g_signal_connect (session->priv->user_verifier, + "conversation-stopped", + G_CALLBACK (on_conversation_stopped), + session); + g_signal_connect (session->priv->user_verifier, + "reset", + G_CALLBACK (on_reset), + session); + g_signal_connect (session->priv->greeter, + "selected-user-changed", + G_CALLBACK (on_selected_user_changed), + session); + g_signal_connect (session->priv->greeter, + "default-language-name-changed", + G_CALLBACK (on_default_language_name_changed), + session); + g_signal_connect (session->priv->greeter, + "default-session-name-changed", + G_CALLBACK (on_default_session_name_changed), + session); + g_signal_connect (session->priv->greeter, + "timed-login-requested", + G_CALLBACK (on_timed_login_requested), + session); + g_signal_connect (session->priv->greeter, + "session-opened", + G_CALLBACK (on_session_opened), + session); } static void @@ -231,8 +316,11 @@ on_begin_verification (GdmGreeterLoginWindow *login_window, const char *service_name, GdmGreeterSession *session) { - gdm_greeter_client_call_begin_verification (session->priv->client, - service_name); + get_user_verifier (session, NULL); + gdm_user_verifier_call_begin_verification_sync (session->priv->user_verifier, + service_name, + NULL, + NULL); } static void @@ -241,9 +329,12 @@ on_begin_verification_for_user (GdmGreeterLoginWindow *login_window, const char *username, GdmGreeterSession *session) { - gdm_greeter_client_call_begin_verification_for_user (session->priv->client, - service_name, - username); + get_user_verifier (session, NULL); + gdm_user_verifier_call_begin_verification_for_user_sync (session->priv->user_verifier, + service_name, + username, + NULL, + NULL); } static void @@ -252,9 +343,11 @@ on_query_answer (GdmGreeterLoginWindow *login_window, const char *text, GdmGreeterSession *session) { - gdm_greeter_client_call_answer_query (session->priv->client, - service_name, - text); + gdm_user_verifier_call_answer_query_sync (session->priv->user_verifier, + service_name, + text, + NULL, + NULL); } static void @@ -262,8 +355,10 @@ on_select_session (GdmGreeterLoginWindow *login_window, const char *text, GdmGreeterSession *session) { - gdm_greeter_client_call_select_session (session->priv->client, - text); + gdm_greeter_call_select_session_sync (session->priv->greeter, + text, + NULL, + NULL); } static void @@ -272,21 +367,25 @@ on_select_user (GdmGreeterLoginWindow *login_window, GdmGreeterSession *session) { show_or_hide_user_options (session, text); - gdm_greeter_client_call_select_user (session->priv->client, - text); + gdm_greeter_call_select_user_sync (session->priv->greeter, + text, + NULL, + NULL); } static void on_cancelled (GdmGreeterLoginWindow *login_window, GdmGreeterSession *session) { - gdm_greeter_client_call_cancel (session->priv->client); + gdm_user_verifier_call_cancel_sync (session->priv->user_verifier, NULL, NULL); } static void on_disconnected (GdmGreeterSession *session) { - gdm_greeter_client_call_disconnect (session->priv->client); + if (session->priv->remote_greeter != NULL) { + gdm_remote_greeter_call_disconnect_sync (session->priv->remote_greeter, NULL, NULL); + } } static void @@ -294,7 +393,7 @@ on_start_session (GdmGreeterLoginWindow *login_window, const char *service_name, GdmGreeterSession *session) { - gdm_greeter_client_call_start_session_when_ready (session->priv->client, service_name, TRUE); + gdm_greeter_call_start_session_when_ready_sync (session->priv->greeter, service_name, TRUE, NULL, NULL); } static int @@ -350,7 +449,7 @@ toggle_panel (GdmGreeterSession *session, monitor = get_tallest_monitor_at_point (screen, x, y); - is_local = gdm_greeter_client_get_display_is_local (session->priv->client); + is_local = session->priv->remote_greeter != NULL; session->priv->panel = gdm_greeter_panel_new (screen, monitor, is_local); g_signal_connect_swapped (session->priv->panel, @@ -376,14 +475,10 @@ toggle_login_window (GdmGreeterSession *session, if (enabled) { gboolean is_local; - is_local = gdm_greeter_client_get_display_is_local (session->priv->client); + is_local = session->priv->remote_greeter != NULL; g_debug ("GdmGreeterSession: Starting a login window local:%d", is_local); session->priv->login_window = gdm_greeter_login_window_new (is_local); g_signal_connect (session->priv->login_window, - "start-conversation", - G_CALLBACK (on_start_conversation), - session); - g_signal_connect (session->priv->login_window, "begin-auto-login", G_CALLBACK (on_begin_auto_login), session); @@ -427,20 +522,30 @@ gboolean gdm_greeter_session_start (GdmGreeterSession *session, GError **error) { - gboolean res; - g_return_val_if_fail (GDM_IS_GREETER_SESSION (session), FALSE); gdm_profile_start (NULL); - res = gdm_greeter_client_start (session->priv->client, error); + + session->priv->greeter = gdm_client_get_greeter_sync (session->priv->client, + NULL, + error); + + if (session->priv->greeter == NULL) { + return FALSE; + } + + session->priv->remote_greeter = gdm_client_get_remote_greeter_sync (session->priv->client, + NULL, + error); + toggle_panel (session, TRUE); toggle_login_window (session, TRUE); gdm_profile_end (NULL); - return res; + return TRUE; } void @@ -553,60 +658,7 @@ gdm_greeter_session_init (GdmGreeterSession *session) session->priv = GDM_GREETER_SESSION_GET_PRIVATE (session); - session->priv->client = gdm_greeter_client_new (); - g_signal_connect (session->priv->client, - "info-query", - G_CALLBACK (on_info_query), - session); - g_signal_connect (session->priv->client, - "secret-info-query", - G_CALLBACK (on_secret_info_query), - session); - g_signal_connect (session->priv->client, - "info", - G_CALLBACK (on_info), - session); - g_signal_connect (session->priv->client, - "problem", - G_CALLBACK (on_problem), - session); - g_signal_connect (session->priv->client, - "service-unavailable", - G_CALLBACK (on_service_unavailable), - session); - g_signal_connect (session->priv->client, - "ready", - G_CALLBACK (on_ready), - session); - g_signal_connect (session->priv->client, - "conversation-stopped", - G_CALLBACK (on_conversation_stopped), - session); - g_signal_connect (session->priv->client, - "reset", - G_CALLBACK (on_reset), - session); - g_signal_connect (session->priv->client, - "selected-user-changed", - G_CALLBACK (on_selected_user_changed), - session); - g_signal_connect (session->priv->client, - "default-language-name-changed", - G_CALLBACK (on_default_language_name_changed), - session); - g_signal_connect (session->priv->client, - "default-session-name-changed", - G_CALLBACK (on_default_session_name_changed), - session); - g_signal_connect (session->priv->client, - "timed-login-requested", - G_CALLBACK (on_timed_login_requested), - session); - g_signal_connect (session->priv->client, - "session-opened", - G_CALLBACK (on_session_opened), - session); - + session->priv->client = gdm_client_new (); /* We want to listen for panel mnemonics even if the * login window is focused, so we intercept them here. */ diff --git a/gui/simple-greeter/greeter-main.c b/gui/simple-greeter/greeter-main.c index ef54a7b2..85d9603e 100644 --- a/gui/simple-greeter/greeter-main.c +++ b/gui/simple-greeter/greeter-main.c @@ -30,8 +30,6 @@ #include <gdk/gdkx.h> #include <gtk/gtk.h> -#include <dbus/dbus-glib.h> - #include "gdm-log.h" #include "gdm-common.h" #include "gdm-signal-handler.h" @@ -41,16 +39,19 @@ #include "gdm-greeter-session.h" +#include "gsm-client-glue.h" +#include "gsm-manager-glue.h" + #define SM_DBUS_NAME "org.gnome.SessionManager" #define SM_DBUS_PATH "/org/gnome/SessionManager" #define SM_DBUS_INTERFACE "org.gnome.SessionManager" #define SM_CLIENT_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate" -static DBusGConnection *bus_connection = NULL; -static DBusGProxy *sm_proxy = NULL; -static char *client_id = NULL; -static DBusGProxy *client_proxy = NULL; +static GDBusConnection *bus_connection = NULL; +static GsmManager *sm_proxy = NULL; +static char *client_id = NULL; +static GsmClientPrivate *client_proxy = NULL; static gboolean is_debug_set (void) @@ -127,12 +128,12 @@ signal_cb (int signo, static gboolean session_manager_connect (void) { + GError *error; - if (bus_connection == NULL) { - GError *error; + error = NULL; - error = NULL; - bus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + if (bus_connection == NULL) { + bus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); if (bus_connection == NULL) { g_message ("Failed to connect to the session bus: %s", error->message); @@ -141,15 +142,25 @@ session_manager_connect (void) } } - sm_proxy = dbus_g_proxy_new_for_name (bus_connection, - SM_DBUS_NAME, - SM_DBUS_PATH, - SM_DBUS_INTERFACE); + sm_proxy = gsm_manager_proxy_new_sync (bus_connection, + G_DBUS_PROXY_FLAGS_NONE, + SM_DBUS_NAME, + SM_DBUS_PATH, + NULL, + &error); + + if (sm_proxy == NULL) { + g_message ("Failed to connect to the session manager: %s", + error->message); + g_error_free (error); + } + return (sm_proxy != NULL); } static void -stop_cb (gpointer data) +stop_cb (GsmClientPrivate *client_private, + gpointer data) { gtk_main_quit (); } @@ -160,12 +171,11 @@ end_session_response (gboolean is_okay, const gchar *reason) gboolean ret; GError *error = NULL; - ret = dbus_g_proxy_call (client_proxy, "EndSessionResponse", - &error, - G_TYPE_BOOLEAN, is_okay, - G_TYPE_STRING, reason, - G_TYPE_INVALID, - G_TYPE_INVALID); + if (reason == NULL) { + reason = ""; + } + + ret = gsm_client_private_call_end_session_response_sync (client_proxy, is_okay, reason, NULL, &error); if (!ret) { g_warning ("Failed to send session response %s", error->message); @@ -176,7 +186,9 @@ end_session_response (gboolean is_okay, const gchar *reason) } static void -query_end_session_cb (guint flags, gpointer data) +query_end_session_cb (GsmClientPrivate *client_private, + guint flags, + gpointer data) { end_session_response (TRUE, NULL); } @@ -200,14 +212,7 @@ register_client (void) app_id = "gdm-simple-greeter.desktop"; error = NULL; - res = dbus_g_proxy_call (sm_proxy, - "RegisterClient", - &error, - G_TYPE_STRING, app_id, - G_TYPE_STRING, startup_id, - G_TYPE_INVALID, - DBUS_TYPE_G_OBJECT_PATH, &client_id, - G_TYPE_INVALID); + res = gsm_manager_call_register_client_sync (sm_proxy, app_id, startup_id, &client_id, NULL, &error); if (! res) { g_warning ("Failed to register client: %s", error->message); g_error_free (error); @@ -215,22 +220,34 @@ register_client (void) } g_debug ("Client registered with session manager: %s", client_id); - client_proxy = dbus_g_proxy_new_for_name (bus_connection, - SM_DBUS_NAME, - client_id, - SM_CLIENT_DBUS_INTERFACE); + client_proxy = gsm_client_private_proxy_new_sync (bus_connection, + G_DBUS_PROXY_FLAGS_NONE, + SM_DBUS_NAME, + client_id, + NULL, + &error); + + if (client_proxy == NULL) { + g_warning ("Failed to track client: %s", error->message); + g_error_free (error); - dbus_g_proxy_add_signal (client_proxy, "Stop", G_TYPE_INVALID); - dbus_g_proxy_connect_signal (client_proxy, "Stop", - G_CALLBACK (stop_cb), NULL, NULL); + return FALSE; + } - dbus_g_proxy_add_signal (client_proxy, "QueryEndSession", G_TYPE_UINT, G_TYPE_INVALID); - dbus_g_proxy_connect_signal (client_proxy, "QueryEndSession", - G_CALLBACK (query_end_session_cb), NULL, NULL); + g_signal_connect (client_proxy, + "stop", + G_CALLBACK (stop_cb), + NULL); - dbus_g_proxy_add_signal (client_proxy, "EndSession", G_TYPE_UINT, G_TYPE_INVALID); - dbus_g_proxy_connect_signal (client_proxy, "EndSession", - G_CALLBACK (end_session_cb), NULL, NULL); + g_signal_connect (client_proxy, + "query-end-session", + G_CALLBACK (query_end_session_cb), + NULL); + + g_signal_connect (client_proxy, + "end-session", + G_CALLBACK (end_session_cb), + NULL); g_unsetenv ("DESKTOP_AUTOSTART_ID"); @@ -292,8 +309,10 @@ main (int argc, char *argv[]) error = NULL; res = gdm_greeter_session_start (session, &error); if (! res) { - g_warning ("Unable to start greeter session: %s", error->message); - g_error_free (error); + if (error != NULL) { + g_warning ("Unable to start greeter session: %s", error->message); + g_error_free (error); + } exit (1); } diff --git a/gui/simple-greeter/org.gnome.SessionManager.ClientPrivate.xml b/gui/simple-greeter/org.gnome.SessionManager.ClientPrivate.xml new file mode 100644 index 00000000..a167065c --- /dev/null +++ b/gui/simple-greeter/org.gnome.SessionManager.ClientPrivate.xml @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> + <interface name="org.gnome.SessionManager.ClientPrivate"> + <method name="EndSessionResponse"> + <arg name="is_ok" type="b" direction="in"> + <doc:doc> + <doc:summary>Whether or not it is OK to preceed</doc:summary> + </doc:doc> + </arg> + <arg name="reason" type="s" direction="in"> + <doc:doc> + <doc:summary>The reason string</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This method should be used by the client in response to + the <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::QueryEndSession">QueryEndSession</doc:ref> + and <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::EndSession">EndSession</doc:ref> signals. + </doc:para> + </doc:description> + </doc:doc> + </method> + + <signal name="Stop"> + <doc:doc> + <doc:summary>Stop client</doc:summary> + <doc:description> + <doc:para> + The client should stop and remove itself from the session in + response to this signal. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="QueryEndSession"> + <arg name="flags" type="u"> + <doc:doc> + <doc:summary>Flags</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This signal is used to inform the client that the + session is about to end. The client must respond by + calling + <doc:ref type="method" to="org.gnome.SessionManager.ClientPrivate.EndSessionResponse">EndSessionResponse</doc:ref> + within one second of the signal emission. + </doc:para> + <doc:para> + The flags may include: + <doc:list> + <doc:item> + <doc:term>1</doc:term> + <doc:definition>Logout is forced. + <doc:ref type="method" to="org.gnome.SessionManager.ClientPrivate.EndSessionResponse">EndSessionResponse</doc:ref> + reason and any inhibit from client will be + ignored.</doc:definition> + </doc:item> + </doc:list> + </doc:para> + <doc:para> + If the client responds with an EndSessionResponse is-ok + argument equal to FALSE and a reason then this reason may + be displayed to the user. + </doc:para> + <doc:para> + The client must not attempt to perform any actions or + interact with the user in response to this signal. Any + actions required for a clean shutdown should take place in + response to the + <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::EndSession">EndSession</doc:ref> signal. + </doc:para> + <doc:para> + The client should limit operations until either a + <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::EndSession">EndSession</doc:ref> + <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::CancelEndSession">CancelEndSession</doc:ref> + signal is received. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="EndSession"> + <arg name="flags" type="u"> + <doc:doc> + <doc:summary>Flags</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This signal is used to inform the client that the + session is about to end. The client must respond by + calling + <doc:ref type="method" to="org.gnome.SessionManager.ClientPrivate.EndSessionResponse">EndSessionResponse</doc:ref> + within ten seconds of the signal emission. + </doc:para> + <doc:para> + The client must not attempt to interact with the user in + response to this signal. The application will be given a + maxium of ten seconds to perform any actions required for + a clean shutdown. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="CancelEndSession"> + <doc:doc> + <doc:description> + <doc:para> + This signal indicates to the client that a previous emission of + <doc:ref type="signal" to="org.gnome.SessionManager.ClientPrivate::QueryEndSession">QueryEndSession</doc:ref> + has been cancelled. The client should resume normal operations. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + </interface> +</node> diff --git a/gui/simple-greeter/org.gnome.SessionManager.xml b/gui/simple-greeter/org.gnome.SessionManager.xml new file mode 100644 index 00000000..eaf1ef53 --- /dev/null +++ b/gui/simple-greeter/org.gnome.SessionManager.xml @@ -0,0 +1,392 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> +<node xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd"> + <interface name="org.gnome.SessionManager"> + + <!-- Initialization phase interfaces --> + + <method name="Setenv"> + <arg name="variable" type="s" direction="in"> + <doc:doc> + <doc:summary>The variable name</doc:summary> + </doc:doc> + </arg> + <arg name="value" type="s" direction="in"> + <doc:doc> + <doc:summary>The value</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Adds the variable name to the application launch environment with the specified value. May only be used during the Session Manager initialization phase.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="InitializationError"> + <arg name="message" type="s" direction="in"> + <doc:doc> + <doc:summary>The error message</doc:summary> + </doc:doc> + </arg> + <arg name="fatal" type="b" direction="in"> + <doc:doc> + <doc:summary>Whether the error should be treated as fatal</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>May be used by applications launched during the Session Manager initialization phase to indicate there was a problem.</doc:para> + </doc:description> + </doc:doc> + </method> + + <!-- Running phase interfaces --> + + <method name="RegisterClient"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg type="s" name="app_id" direction="in"> + <doc:doc> + <doc:summary>The application identifier</doc:summary> + </doc:doc> + </arg> + <arg type="s" name="client_startup_id" direction="in"> + <doc:doc> + <doc:summary>Client startup identifier</doc:summary> + </doc:doc> + </arg> + <arg type="o" name="client_id" direction="out"> + <doc:doc> + <doc:summary>The object path of the newly registered client</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Register the caller as a Session Management client.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="UnregisterClient"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg type="o" name="client_id" direction="in"> + <doc:doc> + <doc:summary>The object path of the client</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Unregister the specified client from Session Management.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="Inhibit"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg type="s" name="app_id" direction="in"> + <doc:doc> + <doc:summary>The application identifier</doc:summary> + </doc:doc> + </arg> + <arg type="u" name="toplevel_xid" direction="in"> + <doc:doc> + <doc:summary>The toplevel X window identifier</doc:summary> + </doc:doc> + </arg> + <arg type="s" name="reason" direction="in"> + <doc:doc> + <doc:summary>The reason for the inhibit</doc:summary> + </doc:doc> + </arg> + <arg type="u" name="flags" direction="in"> + <doc:doc> + <doc:summary>Flags that spefify what should be inhibited</doc:summary> + </doc:doc> + </arg> + <arg type="u" name="inhibit_cookie" direction="out"> + <doc:doc> + <doc:summary>The cookie</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:summary> + Proactively indicates that the calling application is performing an action that should not be interrupted and sets a reason to be displayed to the user when an interruption is about to take placea. + </doc:summary> + <doc:description> + <doc:para>Applications should invoke this method when they begin an operation that + should not be interrupted, such as creating a CD or DVD. The types of actions + that may be blocked are specified by the flags parameter. When the application + completes the operation it should call <doc:ref type="method" to="org.gnome.SessionManager.Uninhibit">Uninhibit()</doc:ref> + or disconnect from the session bus. + </doc:para> + <doc:para> + Applications should not expect that they will always be able to block the + action. In most cases, users will be given the option to force the action + to take place. + </doc:para> + <doc:para> + Reasons should be short and to the point. + </doc:para> + <doc:para> + The flags parameter must include at least one of the following: + <doc:list> + <doc:item> + <doc:term>1</doc:term> + <doc:definition>Inhibit logging out</doc:definition> + </doc:item> + <doc:item> + <doc:term>2</doc:term> + <doc:definition>Inhibit user switching</doc:definition> + </doc:item> + <doc:item> + <doc:term>4</doc:term> + <doc:definition>Inhibit suspending the session or computer</doc:definition> + </doc:item> + <doc:item> + <doc:term>8</doc:term> + <doc:definition>Inhibit the session being marked as idle</doc:definition> + </doc:item> + </doc:list> + Values for flags may be bitwise or'ed together. + </doc:para> + <doc:para> + The returned cookie is used to uniquely identify this request. It should be used + as an argument to <doc:ref type="method" to="org.gnome.SessionManager.Uninhibit">Uninhibit()</doc:ref> in + order to remove the request. + </doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="Uninhibit"> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <arg type="u" name="inhibit_cookie" direction="in"> + <doc:doc> + <doc:summary>The cookie</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Cancel a previous call to <doc:ref type="method" to="org.gnome.SessionManager.Inhibit">Inhibit()</doc:ref> identified by the cookie.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="IsInhibited"> + <arg type="u" name="flags" direction="in"> + <doc:doc> + <doc:summary>Flags that spefify what should be inhibited</doc:summary> + </doc:doc> + </arg> + <arg type="b" name="is_inhibited" direction="out"> + <doc:doc> + <doc:summary>Returns TRUE if any of the operations in the bitfield flags are inhibited</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Determine if operation(s) specified by the flags + are currently inhibited. Flags are same as those accepted + by the + <doc:ref type="method" to="org.gnome.SessionManager.Inhibit">Inhibit()</doc:ref> + method.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="GetClients"> + <arg name="clients" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of client IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="org.gnome.SessionManager.Client">Clients</doc:ref> + that are currently known to the session manager.</doc:para> + <doc:para>Each Client ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="org.gnome.SessionManager.Client">Client</doc:ref> interface.</doc:para> + </doc:description> + <doc:seealso><doc:ref type="interface" to="org.gnome.SessionManager.Client">org.gnome.SessionManager.Client</doc:ref></doc:seealso> + </doc:doc> + </method> + + <method name="GetInhibitors"> + <arg name="inhibitors" direction="out" type="ao"> + <doc:doc> + <doc:summary>an array of inhibitor IDs</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>This gets a list of all the <doc:ref type="interface" to="org.gnome.SessionManager.Inhibitor">Inhibitors</doc:ref> + that are currently known to the session manager.</doc:para> + <doc:para>Each Inhibitor ID is an D-Bus object path for the object that implements the + <doc:ref type="interface" to="org.gnome.SessionManager.Inhibitor">Inhibitor</doc:ref> interface.</doc:para> + </doc:description> + <doc:seealso><doc:ref type="interface" to="org.gnome.SessionManager.Inhibitor">org.gnome.SessionManager.Inhibitor</doc:ref></doc:seealso> + </doc:doc> + </method> + + + <method name="IsAutostartConditionHandled"> + <arg name="condition" direction="in" type="s"> + <doc:doc> + <doc:summary>The autostart condition string</doc:summary> + </doc:doc> + </arg> + <arg name="handled" direction="out" type="b"> + <doc:doc> + <doc:summary>True if condition is handled, false otherwise</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Allows the caller to determine whether the session manager is + handling changes to the specified autostart condition.</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="Shutdown"> + <doc:doc> + <doc:description> + <doc:para>Request a shutdown dialog</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="CanShutdown"> + <arg name="is_available" direction="out" type="b"> + <doc:doc> + <doc:summary>True if shutdown is available to the user, false otherwise</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Allows the caller to determine whether or not it's okay to show + a shutdown option in the UI</doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="Logout"> + <arg name="mode" type="u" direction="in"> + <doc:doc> + <doc:summary>The type of logout that is being requested</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Request a logout dialog</doc:para> + <doc:para> + Allowed values for the mode parameter are: + <doc:list> + <doc:item> + <doc:term>0</doc:term> + <doc:definition>Normal.</doc:definition> + </doc:item> + <doc:item> + <doc:term>1</doc:term> + <doc:definition>No confirmation inferface should be shown.</doc:definition> + </doc:item> + <doc:item> + <doc:term>2</doc:term> + <doc:definition>Forcefully logout. No confirmation will be shown and any inhibitors will be ignored.</doc:definition> + </doc:item> + </doc:list> + Values for flags may be bitwise or'ed together. + </doc:para> + </doc:description> + </doc:doc> + </method> + + <method name="IsSessionRunning"> + <arg name="running" direction="out" type="b"> + <doc:doc> + <doc:summary>True if the session has entered the Running phase, false otherwise</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Allows the caller to determine whether the session manager + has entered the Running phase, in case the client missed the + SessionRunning signal.</doc:para> + </doc:description> + </doc:doc> + </method> + + <!-- Signals --> + + <signal name="ClientAdded"> + <arg name="id" type="o"> + <doc:doc> + <doc:summary>The object path for the added client</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when a client has been added to the session manager. + </doc:para> + </doc:description> + </doc:doc> + </signal> + <signal name="ClientRemoved"> + <arg name="id" type="o"> + <doc:doc> + <doc:summary>The object path for the removed client</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when a client has been removed from the session manager. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="InhibitorAdded"> + <arg name="id" type="o"> + <doc:doc> + <doc:summary>The object path for the added inhibitor</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when an inhibitor has been added to the session manager. + </doc:para> + </doc:description> + </doc:doc> + </signal> + <signal name="InhibitorRemoved"> + <arg name="id" type="o"> + <doc:doc> + <doc:summary>The object path for the removed inhibitor</doc:summary> + </doc:doc> + </arg> + <doc:doc> + <doc:description> + <doc:para>Emitted when an inhibitor has been removed from the session manager. + </doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="SessionRunning"> + <doc:doc> + <doc:description> + <doc:para>Indicates the session has entered the Running phase.</doc:para> + </doc:description> + </doc:doc> + </signal> + + <signal name="SessionOver"> + <doc:doc> + <doc:description> + <doc:para>Indicates the session is about to end.</doc:para> + </doc:description> + </doc:doc> + </signal> + + </interface> +</node> |