1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
3
* Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28
#include <sys/types.h>
35
#include <glib/gi18n.h>
36
#include <glib/gstdio.h>
37
#include <glib-object.h>
39
#define DBUS_API_SUBJECT_TO_CHANGE
40
#include <dbus/dbus-glib.h>
41
#include <dbus/dbus-glib-lowlevel.h>
43
#include <X11/Xlib.h> /* for Display */
45
#include "gdm-common.h"
47
#include "gdm-factory-slave.h"
48
#include "gdm-factory-slave-glue.h"
50
#include "gdm-server.h"
51
#include "gdm-greeter-session.h"
52
#include "gdm-greeter-server.h"
54
#include "gdm-session-relay.h"
56
extern char **environ;
58
#define GDM_FACTORY_SLAVE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_FACTORY_SLAVE, GdmFactorySlavePrivate))
60
#define GDM_DBUS_NAME "org.gnome.DisplayManager"
61
#define GDM_DBUS_LOCAL_DISPLAY_FACTORY_PATH "/org/gnome/DisplayManager/LocalDisplayFactory"
62
#define GDM_DBUS_LOCAL_DISPLAY_FACTORY_INTERFACE "org.gnome.DisplayManager.LocalDisplayFactory"
64
#define MAX_CONNECT_ATTEMPTS 10
66
struct GdmFactorySlavePrivate
70
guint greeter_reset_id;
73
Display *server_display;
74
guint connection_attempts;
77
GdmSessionRelay *session;
78
GdmGreeterServer *greeter_server;
79
GdmGreeterSession *greeter;
80
DBusGProxy *factory_proxy;
81
DBusGConnection *connection;
88
static void gdm_factory_slave_class_init (GdmFactorySlaveClass *klass);
89
static void gdm_factory_slave_init (GdmFactorySlave *factory_slave);
90
static void gdm_factory_slave_finalize (GObject *object);
92
G_DEFINE_TYPE (GdmFactorySlave, gdm_factory_slave, GDM_TYPE_SLAVE)
95
greeter_reset_timeout (GdmFactorySlave *slave)
97
gdm_greeter_server_reset (slave->priv->greeter_server);
98
slave->priv->greeter_reset_id = 0;
103
queue_greeter_reset (GdmFactorySlave *slave)
105
if (slave->priv->greeter_reset_id > 0) {
109
slave->priv->greeter_reset_id = g_timeout_add_seconds (2, (GSourceFunc)greeter_reset_timeout, slave);
113
on_greeter_session_start (GdmGreeterSession *greeter,
114
GdmFactorySlave *slave)
116
g_debug ("GdmFactorySlave: Greeter started");
120
on_greeter_session_stop (GdmGreeterSession *greeter,
121
GdmFactorySlave *slave)
123
g_debug ("GdmFactorySlave: Greeter stopped");
127
on_greeter_session_exited (GdmGreeterSession *greeter,
129
GdmFactorySlave *slave)
131
g_debug ("GdmSimpleSlave: Greeter exited: %d", code);
132
gdm_slave_stopped (GDM_SLAVE (slave));
136
on_greeter_session_died (GdmGreeterSession *greeter,
138
GdmFactorySlave *slave)
140
g_debug ("GdmSimpleSlave: Greeter died: %d", signal);
141
gdm_slave_stopped (GDM_SLAVE (slave));
146
on_session_info (GdmSession *session,
148
GdmFactorySlave *slave)
150
g_debug ("GdmFactorySlave: Info: %s", text);
151
gdm_greeter_server_info (slave->priv->greeter_server, text);
155
on_session_problem (GdmSession *session,
157
GdmFactorySlave *slave)
159
g_debug ("GdmFactorySlave: Problem: %s", text);
160
gdm_greeter_server_problem (slave->priv->greeter_server, text);
164
on_session_info_query (GdmSession *session,
166
GdmFactorySlave *slave)
169
g_debug ("GdmFactorySlave: Info query: %s", text);
170
gdm_greeter_server_info_query (slave->priv->greeter_server, text);
174
on_session_secret_info_query (GdmSession *session,
176
GdmFactorySlave *slave)
178
g_debug ("GdmFactorySlave: Secret info query: %s", text);
179
gdm_greeter_server_secret_info_query (slave->priv->greeter_server, text);
183
on_session_conversation_started (GdmSession *session,
184
GdmFactorySlave *slave)
186
g_debug ("GdmFactorySlave: session conversation started");
188
gdm_greeter_server_ready (slave->priv->greeter_server);
192
on_session_setup_complete (GdmSession *session,
193
GdmFactorySlave *slave)
195
gdm_session_authenticate (session);
199
on_session_setup_failed (GdmSession *session,
201
GdmFactorySlave *slave)
203
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to initialize login system"));
205
queue_greeter_reset (slave);
209
on_session_reset_complete (GdmSession *session,
210
GdmFactorySlave *slave)
212
g_debug ("GdmFactorySlave: PAM reset");
216
on_session_reset_failed (GdmSession *session,
218
GdmFactorySlave *slave)
220
g_critical ("Unable to reset PAM");
224
on_session_authenticated (GdmSession *session,
225
GdmFactorySlave *slave)
227
gdm_session_authorize (session);
231
on_session_authentication_failed (GdmSession *session,
233
GdmFactorySlave *slave)
235
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authenticate user"));
237
queue_greeter_reset (slave);
241
on_session_authorized (GdmSession *session,
242
GdmFactorySlave *slave)
246
/* FIXME: check for migration? */
247
flag = GDM_SESSION_CRED_ESTABLISH;
249
gdm_session_accredit (session, flag);
253
on_session_authorization_failed (GdmSession *session,
255
GdmFactorySlave *slave)
257
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to authorize user"));
259
queue_greeter_reset (slave);
263
on_session_accredited (GdmSession *session,
264
GdmFactorySlave *slave)
266
g_debug ("GdmFactorySlave: session user verified");
268
gdm_session_open_session (session);
272
on_session_accreditation_failed (GdmSession *session,
274
GdmFactorySlave *slave)
276
g_debug ("GdmFactorySlave: could not successfully authenticate user: %s",
279
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to establish credentials"));
281
queue_greeter_reset (slave);
285
on_session_opened (GdmSession *session,
286
GdmFactorySlave *slave)
288
g_debug ("GdmFactorySlave: session opened");
290
gdm_session_start_session (session);
292
gdm_greeter_server_reset (slave->priv->greeter_server);
296
on_session_open_failed (GdmSession *session,
298
GdmFactorySlave *slave)
300
g_debug ("GdmFactorySlave: could not open session: %s", message);
302
gdm_greeter_server_problem (slave->priv->greeter_server, _("Unable to open session"));
304
queue_greeter_reset (slave);
308
on_session_session_started (GdmSession *session,
309
GdmFactorySlave *slave)
311
g_debug ("GdmFactorySlave: Relay session started");
313
gdm_greeter_server_reset (slave->priv->greeter_server);
317
create_product_display (GdmFactorySlave *slave)
319
char *parent_display_id;
320
char *server_address;
328
g_debug ("GdmFactorySlave: Create product display");
330
g_debug ("GdmFactorySlave: Connecting to local display factory");
331
slave->priv->factory_proxy = dbus_g_proxy_new_for_name (slave->priv->connection,
333
GDM_DBUS_LOCAL_DISPLAY_FACTORY_PATH,
334
GDM_DBUS_LOCAL_DISPLAY_FACTORY_INTERFACE);
335
if (slave->priv->factory_proxy == NULL) {
336
g_warning ("Failed to create local display factory proxy");
340
server_address = gdm_session_relay_get_address (slave->priv->session);
343
"display-id", &parent_display_id,
347
res = dbus_g_proxy_call (slave->priv->factory_proxy,
348
"CreateProductDisplay",
350
DBUS_TYPE_G_OBJECT_PATH, parent_display_id,
351
G_TYPE_STRING, server_address,
353
DBUS_TYPE_G_OBJECT_PATH, &product_id,
355
g_free (server_address);
356
g_free (parent_display_id);
360
g_warning ("Failed to create product display: %s", error->message);
361
g_error_free (error);
363
g_warning ("Failed to create product display");
375
on_session_relay_disconnected (GdmSessionRelay *session,
376
GdmFactorySlave *slave)
378
g_debug ("GdmFactorySlave: Relay disconnected");
380
/* FIXME: do some kind of loop detection */
381
gdm_greeter_server_reset (slave->priv->greeter_server);
382
create_product_display (slave);
386
on_session_relay_connected (GdmSessionRelay *session,
387
GdmFactorySlave *slave)
389
g_debug ("GdmFactorySlave: Relay Connected");
391
gdm_session_start_conversation (GDM_SESSION (slave->priv->session));
395
on_greeter_begin_verification (GdmGreeterServer *greeter_server,
396
GdmFactorySlave *slave)
398
g_debug ("GdmFactorySlave: begin verification");
399
gdm_session_setup (GDM_SESSION (slave->priv->session),
404
on_greeter_begin_verification_for_user (GdmGreeterServer *greeter_server,
405
const char *username,
406
GdmFactorySlave *slave)
408
g_debug ("GdmFactorySlave: begin verification for user");
409
gdm_session_setup_for_user (GDM_SESSION (slave->priv->session),
415
on_greeter_answer (GdmGreeterServer *greeter_server,
417
GdmFactorySlave *slave)
419
g_debug ("GdmFactorySlave: Greeter answer");
420
gdm_session_answer_query (GDM_SESSION (slave->priv->session), text);
424
on_greeter_session_selected (GdmGreeterServer *greeter_server,
426
GdmFactorySlave *slave)
428
gdm_session_select_session (GDM_SESSION (slave->priv->session), text);
432
on_greeter_language_selected (GdmGreeterServer *greeter_server,
434
GdmFactorySlave *slave)
436
gdm_session_select_language (GDM_SESSION (slave->priv->session), text);
440
on_greeter_layout_selected (GdmGreeterServer *greeter_server,
442
GdmFactorySlave *slave)
444
gdm_session_select_layout (GDM_SESSION (slave->priv->session), text);
448
on_greeter_user_selected (GdmGreeterServer *greeter_server,
450
GdmFactorySlave *slave)
452
gdm_session_select_user (GDM_SESSION (slave->priv->session), text);
456
on_greeter_cancel (GdmGreeterServer *greeter_server,
457
GdmFactorySlave *slave)
459
gdm_session_cancel (GDM_SESSION (slave->priv->session));
463
on_greeter_connected (GdmGreeterServer *greeter_server,
464
GdmFactorySlave *slave)
466
g_debug ("GdmFactorySlave: Greeter started");
468
create_product_display (slave);
472
setup_server (GdmFactorySlave *slave)
474
/* Set the busy cursor */
475
gdm_slave_set_busy_cursor (GDM_SLAVE (slave));
479
run_greeter (GdmFactorySlave *slave)
481
gboolean display_is_local;
484
char *display_device;
485
char *display_hostname;
489
g_debug ("GdmFactorySlave: Running greeter");
491
display_is_local = FALSE;
495
display_device = NULL;
496
display_hostname = NULL;
499
"display-is-local", &display_is_local,
500
"display-id", &display_id,
501
"display-name", &display_name,
502
"display-hostname", &display_hostname,
503
"display-x11-authority-file", &auth_file,
506
if (slave->priv->server != NULL) {
507
display_device = gdm_server_get_display_device (slave->priv->server);
510
/* FIXME: send a signal back to the master */
512
/* Run the init script. gdmslave suspends until script has terminated */
513
gdm_slave_run_script (GDM_SLAVE (slave), GDMCONFDIR "/Init", GDM_USERNAME);
515
slave->priv->greeter_server = gdm_greeter_server_new (display_id);
516
g_signal_connect (slave->priv->greeter_server,
517
"begin-verification",
518
G_CALLBACK (on_greeter_begin_verification),
520
g_signal_connect (slave->priv->greeter_server,
521
"begin-verification-for-user",
522
G_CALLBACK (on_greeter_begin_verification_for_user),
524
g_signal_connect (slave->priv->greeter_server,
526
G_CALLBACK (on_greeter_answer),
528
g_signal_connect (slave->priv->greeter_server,
530
G_CALLBACK (on_greeter_session_selected),
532
g_signal_connect (slave->priv->greeter_server,
534
G_CALLBACK (on_greeter_language_selected),
536
g_signal_connect (slave->priv->greeter_server,
538
G_CALLBACK (on_greeter_layout_selected),
540
g_signal_connect (slave->priv->greeter_server,
542
G_CALLBACK (on_greeter_user_selected),
544
g_signal_connect (slave->priv->greeter_server,
546
G_CALLBACK (on_greeter_connected),
548
g_signal_connect (slave->priv->greeter_server,
550
G_CALLBACK (on_greeter_cancel),
552
gdm_greeter_server_start (slave->priv->greeter_server);
554
address = gdm_greeter_server_get_address (slave->priv->greeter_server);
556
g_debug ("GdmFactorySlave: Creating greeter on %s %s", display_name, display_device);
557
slave->priv->greeter = gdm_greeter_session_new (display_name,
561
g_signal_connect (slave->priv->greeter,
563
G_CALLBACK (on_greeter_session_start),
565
g_signal_connect (slave->priv->greeter,
567
G_CALLBACK (on_greeter_session_stop),
569
g_signal_connect (slave->priv->greeter,
571
G_CALLBACK (on_greeter_session_exited),
573
g_signal_connect (slave->priv->greeter,
575
G_CALLBACK (on_greeter_session_died),
577
g_object_set (slave->priv->greeter,
578
"x11-authority-file", auth_file,
580
gdm_welcome_session_set_server_address (GDM_WELCOME_SESSION (slave->priv->greeter), address);
581
gdm_welcome_session_start (GDM_WELCOME_SESSION (slave->priv->greeter));
586
g_free (display_name);
587
g_free (display_device);
588
g_free (display_hostname);
593
idle_connect_to_display (GdmFactorySlave *slave)
597
slave->priv->connection_attempts++;
599
g_debug ("GdmFactorySlave: Connect to display");
601
res = gdm_slave_connect_to_x11_display (GDM_SLAVE (slave));
603
/* FIXME: handle wait-for-go */
605
setup_server (slave);
608
if (slave->priv->connection_attempts >= MAX_CONNECT_ATTEMPTS) {
609
g_warning ("Unable to connect to display after %d tries - bailing out", slave->priv->connection_attempts);
619
on_server_ready (GdmServer *server,
620
GdmFactorySlave *slave)
622
g_debug ("GdmFactorySlave: Server ready");
624
g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
628
on_server_exited (GdmServer *server,
630
GdmFactorySlave *slave)
632
g_debug ("GdmFactorySlave: server exited with code %d\n", exit_code);
634
gdm_slave_stopped (GDM_SLAVE (slave));
638
on_server_died (GdmServer *server,
640
GdmFactorySlave *slave)
642
g_debug ("GdmFactorySlave: server died with signal %d, (%s)",
644
g_strsignal (signal_number));
646
gdm_slave_stopped (GDM_SLAVE (slave));
650
gdm_factory_slave_run (GdmFactorySlave *slave)
654
gboolean display_is_local;
657
"display-is-local", &display_is_local,
658
"display-name", &display_name,
659
"display-x11-authority-file", &auth_file,
662
/* if this is local display start a server if one doesn't
664
if (display_is_local) {
667
slave->priv->server = gdm_server_new (display_name, auth_file);
668
g_signal_connect (slave->priv->server,
670
G_CALLBACK (on_server_exited),
672
g_signal_connect (slave->priv->server,
674
G_CALLBACK (on_server_died),
676
g_signal_connect (slave->priv->server,
678
G_CALLBACK (on_server_ready),
681
res = gdm_server_start (slave->priv->server);
683
g_warning (_("Could not start the X "
684
"server (your graphical environment) "
685
"due to some internal error. "
686
"Please contact your system administrator "
687
"or check your syslog to diagnose. "
688
"In the meantime this display will be "
689
"disabled. Please restart GDM when "
690
"the problem is corrected."));
694
g_debug ("GdmFactorySlave: Started X server");
696
g_timeout_add (500, (GSourceFunc)idle_connect_to_display, slave);
699
g_free (display_name);
706
gdm_factory_slave_start (GdmSlave *slave)
712
g_debug ("GdmFactorySlave: Starting factory slave");
714
GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->start (slave);
716
GDM_FACTORY_SLAVE (slave)->priv->session = gdm_session_relay_new ();
717
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
718
"conversation-started",
719
G_CALLBACK (on_session_conversation_started),
721
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
723
G_CALLBACK (on_session_setup_complete),
725
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
727
G_CALLBACK (on_session_setup_failed),
729
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
731
G_CALLBACK (on_session_reset_complete),
733
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
735
G_CALLBACK (on_session_reset_failed),
737
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
739
G_CALLBACK (on_session_authenticated),
741
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
742
"authentication-failed",
743
G_CALLBACK (on_session_authentication_failed),
745
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
747
G_CALLBACK (on_session_authorized),
749
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
750
"authorization-failed",
751
G_CALLBACK (on_session_authorization_failed),
753
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
755
G_CALLBACK (on_session_accredited),
757
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
758
"accreditation-failed",
759
G_CALLBACK (on_session_accreditation_failed),
761
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
763
G_CALLBACK (on_session_opened),
765
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
766
"session-open-failed",
767
G_CALLBACK (on_session_open_failed),
769
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
771
G_CALLBACK (on_session_info),
773
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
775
G_CALLBACK (on_session_problem),
777
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
779
G_CALLBACK (on_session_info_query),
781
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
783
G_CALLBACK (on_session_secret_info_query),
785
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
787
G_CALLBACK (on_session_session_started),
790
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
792
G_CALLBACK (on_session_relay_connected),
794
g_signal_connect (GDM_FACTORY_SLAVE (slave)->priv->session,
796
G_CALLBACK (on_session_relay_disconnected),
799
gdm_session_relay_start (GDM_FACTORY_SLAVE (slave)->priv->session);
801
gdm_factory_slave_run (GDM_FACTORY_SLAVE (slave));
809
gdm_factory_slave_stop (GdmSlave *slave)
811
g_debug ("GdmFactorySlave: Stopping factory_slave");
813
GDM_SLAVE_CLASS (gdm_factory_slave_parent_class)->stop (slave);
815
if (GDM_FACTORY_SLAVE (slave)->priv->session != NULL) {
816
gdm_session_relay_stop (GDM_FACTORY_SLAVE (slave)->priv->session);
817
g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->session);
818
GDM_FACTORY_SLAVE (slave)->priv->session = NULL;
821
if (GDM_FACTORY_SLAVE (slave)->priv->greeter_server != NULL) {
822
gdm_greeter_server_stop (GDM_FACTORY_SLAVE (slave)->priv->greeter_server);
823
g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->greeter_server);
824
GDM_FACTORY_SLAVE (slave)->priv->greeter_server = NULL;
827
if (GDM_FACTORY_SLAVE (slave)->priv->greeter != NULL) {
828
gdm_welcome_session_stop (GDM_WELCOME_SESSION (GDM_FACTORY_SLAVE (slave)->priv->greeter));
829
g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->greeter);
830
GDM_FACTORY_SLAVE (slave)->priv->greeter = NULL;
833
if (GDM_FACTORY_SLAVE (slave)->priv->server != NULL) {
834
gdm_server_stop (GDM_FACTORY_SLAVE (slave)->priv->server);
835
g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->server);
836
GDM_FACTORY_SLAVE (slave)->priv->server = NULL;
839
if (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy != NULL) {
840
g_object_unref (GDM_FACTORY_SLAVE (slave)->priv->factory_proxy);
847
gdm_factory_slave_set_property (GObject *object,
854
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
860
gdm_factory_slave_get_property (GObject *object,
867
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
873
gdm_factory_slave_constructor (GType type,
874
guint n_construct_properties,
875
GObjectConstructParam *construct_properties)
877
GdmFactorySlave *factory_slave;
879
factory_slave = GDM_FACTORY_SLAVE (G_OBJECT_CLASS (gdm_factory_slave_parent_class)->constructor (type,
880
n_construct_properties,
881
construct_properties));
883
return G_OBJECT (factory_slave);
887
gdm_factory_slave_class_init (GdmFactorySlaveClass *klass)
889
GObjectClass *object_class = G_OBJECT_CLASS (klass);
890
GdmSlaveClass *slave_class = GDM_SLAVE_CLASS (klass);
892
object_class->get_property = gdm_factory_slave_get_property;
893
object_class->set_property = gdm_factory_slave_set_property;
894
object_class->constructor = gdm_factory_slave_constructor;
895
object_class->finalize = gdm_factory_slave_finalize;
897
slave_class->start = gdm_factory_slave_start;
898
slave_class->stop = gdm_factory_slave_stop;
900
g_type_class_add_private (klass, sizeof (GdmFactorySlavePrivate));
902
dbus_g_object_type_install_info (GDM_TYPE_FACTORY_SLAVE, &dbus_glib_gdm_factory_slave_object_info);
906
gdm_factory_slave_init (GdmFactorySlave *slave)
910
slave->priv = GDM_FACTORY_SLAVE_GET_PRIVATE (slave);
912
slave->priv->pid = -1;
915
slave->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
916
if (slave->priv->connection == NULL) {
918
g_critical ("error getting system bus: %s", error->message);
919
g_error_free (error);
926
gdm_factory_slave_finalize (GObject *object)
928
GdmFactorySlave *factory_slave;
930
g_return_if_fail (object != NULL);
931
g_return_if_fail (GDM_IS_FACTORY_SLAVE (object));
933
factory_slave = GDM_FACTORY_SLAVE (object);
935
g_debug ("GdmFactorySlave: Finalizing slave");
937
g_return_if_fail (factory_slave->priv != NULL);
939
gdm_factory_slave_stop (GDM_SLAVE (factory_slave));
941
if (factory_slave->priv->greeter_reset_id > 0) {
942
g_source_remove (factory_slave->priv->greeter_reset_id);
943
factory_slave->priv->greeter_reset_id = 0;
946
G_OBJECT_CLASS (gdm_factory_slave_parent_class)->finalize (object);
950
gdm_factory_slave_new (const char *id)
954
object = g_object_new (GDM_TYPE_FACTORY_SLAVE,
958
return GDM_SLAVE (object);