annotate src/libeggsmclient/eggsmclient-xsmp.c @ 4419:35444232ac7e

Note about code duplication.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 31 Mar 2008 17:31:38 +0300
parents 80feba8e9034
children 171e3b90d718
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1 /*
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
2 * Copyright (C) 2007 Novell, Inc.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
3 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
4 * Inspired by various other pieces of code including GsmClient (C)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
5 * 2001 Havoc Pennington, GnomeClient (C) 1998 Carsten Schaar, and twm
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
6 * session code (C) 1998 The Open Group.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
7 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
8 * This library is free software; you can redistribute it and/or
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
9 * modify it under the terms of the GNU Library General Public
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
11 * version 2 of the License, or (at your option) any later version.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
12 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
13 * This library is distributed in the hope that it will be useful,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
16 * Library General Public License for more details.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
17 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
18 * You should have received a copy of the GNU Library General Public
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
19 * License along with this library; if not, write to the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
21 * Boston, MA 02111-1307, USA.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
22 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
23
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
24 #include "../../config.h"
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
25
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
26 #include "eggsmclient.h"
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
27 #include "eggsmclient-private.h"
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
28
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
29 #include "eggdesktopfile.h"
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
30
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
31 #include <errno.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
32 #include <fcntl.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
33 #include <stdlib.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
34 #include <string.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
35 #include <unistd.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
36 #include <X11/SM/SMlib.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
37
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
38 #include <gdk/gdk.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
39
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
40 #define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ())
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
41 #define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
42 #define EGG_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
43 #define EGG_IS_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_XSMP))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
44 #define EGG_IS_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_XSMP))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
45 #define EGG_SM_CLIENT_XSMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
46
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
47 typedef struct _EggSMClientXSMP EggSMClientXSMP;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
48 typedef struct _EggSMClientXSMPClass EggSMClientXSMPClass;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
49
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
50 /* These mostly correspond to the similarly-named states in section
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
51 * 9.1 of the XSMP spec. Some of the states there aren't represented
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
52 * here, because we don't need them. SHUTDOWN_CANCELLED is slightly
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
53 * different from the spec; we use it when the client is IDLE after a
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
54 * ShutdownCancelled message, but the application is still interacting
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
55 * and doesn't know the shutdown has been cancelled yet.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
56 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
57 typedef enum
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
58 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
59 XSMP_STATE_IDLE,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
60 XSMP_STATE_SAVE_YOURSELF,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
61 XSMP_STATE_INTERACT_REQUEST,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
62 XSMP_STATE_INTERACT,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
63 XSMP_STATE_SAVE_YOURSELF_DONE,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
64 XSMP_STATE_SHUTDOWN_CANCELLED,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
65 XSMP_STATE_CONNECTION_CLOSED,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
66 } EggSMClientXSMPState;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
67
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
68 static const char *state_names[] = {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
69 "start",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
70 "idle",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
71 "save-yourself",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
72 "interact-request",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
73 "interact",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
74 "save-yourself-done",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
75 "shutdown-cancelled",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
76 "connection-closed"
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
77 };
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
78
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
79 #define EGG_SM_CLIENT_XSMP_STATE(xsmp) (state_names[(xsmp)->state])
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
80
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
81 struct _EggSMClientXSMP
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
82 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
83 EggSMClient parent;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
84
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
85 SmcConn connection;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
86 char *client_id;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
87
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
88 EggSMClientXSMPState state;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
89 char **restart_command;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
90 gboolean set_restart_command;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
91 int restart_style;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
92
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
93 guint idle;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
94
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
95 /* Current SaveYourself state */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
96 guint expecting_initial_save_yourself : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
97 guint need_save_state : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
98 guint need_quit_requested : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
99 guint interact_errors : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
100 guint shutting_down : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
101
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
102 /* Todo list */
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
103 guint waiting_to_set_initial_properties : 1;
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
104 guint waiting_to_emit_quit : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
105 guint waiting_to_emit_quit_cancelled : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
106 guint waiting_to_save_myself : 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
107
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
108 };
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
109
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
110 struct _EggSMClientXSMPClass
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
111 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
112 EggSMClientClass parent_class;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
113
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
114 };
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
115
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
116 static void sm_client_xsmp_startup (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
117 const char *client_id);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
118 static void sm_client_xsmp_set_restart_command (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
119 int argc,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
120 const char **argv);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
121 static void sm_client_xsmp_will_quit (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
122 gboolean will_quit);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
123 static gboolean sm_client_xsmp_end_session (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
124 EggSMClientEndStyle style,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
125 gboolean request_confirmation);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
126
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
127 static void xsmp_save_yourself (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
128 SmPointer client_data,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
129 int save_style,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
130 Bool shutdown,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
131 int interact_style,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
132 Bool fast);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
133 static void xsmp_die (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
134 SmPointer client_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
135 static void xsmp_save_complete (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
136 SmPointer client_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
137 static void xsmp_shutdown_cancelled (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
138 SmPointer client_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
139 static void xsmp_interact (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
140 SmPointer client_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
141
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
142 static SmProp *array_prop (const char *name,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
143 ...);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
144 static SmProp *ptrarray_prop (const char *name,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
145 GPtrArray *values);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
146 static SmProp *string_prop (const char *name,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
147 const char *value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
148 static SmProp *card8_prop (const char *name,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
149 unsigned char value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
150
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
151 static void set_properties (EggSMClientXSMP *xsmp, ...);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
152 static void delete_properties (EggSMClientXSMP *xsmp, ...);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
153
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
154 static GPtrArray *generate_command (char **restart_command,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
155 const char *client_id,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
156 const char *state_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
157
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
158 static void save_state (EggSMClientXSMP *xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
159 static void do_save_yourself (EggSMClientXSMP *xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
160 static void update_pending_events (EggSMClientXSMP *xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
161
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
162 static void ice_init (void);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
163 static gboolean process_ice_messages (IceConn ice_conn);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
164 static void smc_error_handler (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
165 Bool swap,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
166 int offending_minor_opcode,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
167 unsigned long offending_sequence,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
168 int error_class,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
169 int severity,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
170 SmPointer values);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
171
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
172 G_DEFINE_TYPE (EggSMClientXSMP, egg_sm_client_xsmp, EGG_TYPE_SM_CLIENT)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
173
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
174 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
175 egg_sm_client_xsmp_init (EggSMClientXSMP *xsmp)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
176 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
177 xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
178 xsmp->connection = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
179 xsmp->restart_style = SmRestartIfRunning;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
180 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
181
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
182 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
183 egg_sm_client_xsmp_class_init (EggSMClientXSMPClass *klass)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
184 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
185 EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
186
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
187 sm_client_class->startup = sm_client_xsmp_startup;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
188 sm_client_class->set_restart_command = sm_client_xsmp_set_restart_command;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
189 sm_client_class->will_quit = sm_client_xsmp_will_quit;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
190 sm_client_class->end_session = sm_client_xsmp_end_session;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
191 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
192
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
193 EggSMClient *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
194 egg_sm_client_xsmp_new (void)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
195 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
196 if (!g_getenv ("SESSION_MANAGER"))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
197 return NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
198
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
199 return g_object_new (EGG_TYPE_SM_CLIENT_XSMP, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
200 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
201
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
202 static gboolean
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
203 sm_client_xsmp_set_initial_properties (gpointer user_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
204 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
205 EggSMClientXSMP *xsmp = user_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
206 EggDesktopFile *desktop_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
207 GPtrArray *clone, *restart;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
208 char pid_str[64];
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
209
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
210 if (xsmp->idle)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
211 {
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
212 g_source_remove (xsmp->idle);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
213 xsmp->idle = 0;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
214 }
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
215 xsmp->waiting_to_set_initial_properties = FALSE;
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
216
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
217 if (egg_sm_client_get_mode () == EGG_SM_CLIENT_MODE_NO_RESTART)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
218 xsmp->restart_style = SmRestartNever;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
219
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
220 /* Parse info out of desktop file */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
221 desktop_file = egg_get_desktop_file ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
222 if (desktop_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
223 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
224 GKeyFile *key_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
225 GError *err = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
226 char *cmdline, **argv;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
227 int argc;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
228
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
229 key_file = egg_desktop_file_get_key_file (desktop_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
230
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
231 if (xsmp->restart_style == SmRestartIfRunning)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
232 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
233 if (g_key_file_has_key (key_file, EGG_DESKTOP_FILE_GROUP,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
234 "X-GNOME-AutoRestart", NULL) &&
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
235 g_key_file_get_boolean (key_file, EGG_DESKTOP_FILE_GROUP,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
236 "X-GNOME-AutoRestart", NULL))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
237 xsmp->restart_style = SmRestartImmediately;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
238 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
239
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
240 if (!xsmp->set_restart_command)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
241 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
242 cmdline = egg_desktop_file_parse_exec (desktop_file, NULL, &err);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
243 if (cmdline && g_shell_parse_argv (cmdline, &argc, &argv, &err))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
244 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
245 egg_sm_client_set_restart_command (EGG_SM_CLIENT (xsmp),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
246 argc, (const char **)argv);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
247 g_strfreev (argv);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
248 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
249 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
250 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
251 g_warning ("Could not parse Exec line in desktop file: %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
252 err->message);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
253 g_error_free (err);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
254 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
255 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
256 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
257
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
258 if (!xsmp->set_restart_command)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
259 xsmp->restart_command = g_strsplit (g_get_prgname (), " ", -1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
260
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
261 clone = generate_command (xsmp->restart_command, NULL, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
262 restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
263
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
264 g_debug ("Setting initial properties");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
265
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
266 /* Program, CloneCommand, RestartCommand, and UserID are required.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
267 * ProcessID isn't required, but the SM may be able to do something
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
268 * useful with it.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
269 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
270 g_snprintf (pid_str, sizeof (pid_str), "%lu", (gulong) getpid ());
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
271 set_properties (xsmp,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
272 string_prop (SmProgram, g_get_prgname ()),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
273 ptrarray_prop (SmCloneCommand, clone),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
274 ptrarray_prop (SmRestartCommand, restart),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
275 string_prop (SmUserID, g_get_user_name ()),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
276 string_prop (SmProcessID, pid_str),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
277 card8_prop (SmRestartStyleHint, xsmp->restart_style),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
278 NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
279 g_ptr_array_free (clone, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
280 g_ptr_array_free (restart, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
281
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
282 if (desktop_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
283 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
284 set_properties (xsmp,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
285 string_prop ("_GSM_DesktopFile", egg_desktop_file_get_source (desktop_file)),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
286 NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
287 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
288
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
289 update_pending_events (xsmp);
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
290 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
291 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
292
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
293 /* This gets called from two different places: xsmp_die() (when the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
294 * server asks us to disconnect) and process_ice_messages() (when the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
295 * server disconnects unexpectedly).
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
296 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
297 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
298 sm_client_xsmp_disconnect (EggSMClientXSMP *xsmp)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
299 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
300 SmcConn connection;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
301
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
302 if (!xsmp->connection)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
303 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
304
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
305 g_debug ("Disconnecting");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
306
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
307 connection = xsmp->connection;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
308 xsmp->connection = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
309 SmcCloseConnection (connection, 0, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
310 xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
311
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
312 xsmp->waiting_to_save_myself = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
313 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
314 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
316 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
317 sm_client_xsmp_startup (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
318 const char *client_id)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
319 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
320 EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
321 SmcCallbacks callbacks;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
322 char *ret_client_id;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
323 char error_string_ret[256];
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
324
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
325 xsmp->client_id = g_strdup (client_id);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
326
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
327 ice_init ();
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
328 SmcSetErrorHandler (smc_error_handler);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
329
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
330 callbacks.save_yourself.callback = xsmp_save_yourself;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
331 callbacks.die.callback = xsmp_die;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
332 callbacks.save_complete.callback = xsmp_save_complete;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
333 callbacks.shutdown_cancelled.callback = xsmp_shutdown_cancelled;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
334
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
335 callbacks.save_yourself.client_data = xsmp;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
336 callbacks.die.client_data = xsmp;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
337 callbacks.save_complete.client_data = xsmp;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
338 callbacks.shutdown_cancelled.client_data = xsmp;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
339
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
340 client_id = NULL;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
341 error_string_ret[0] = '\0';
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
342 xsmp->connection =
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
343 SmcOpenConnection (NULL, xsmp, SmProtoMajor, SmProtoMinor,
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
344 SmcSaveYourselfProcMask | SmcDieProcMask |
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
345 SmcSaveCompleteProcMask |
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
346 SmcShutdownCancelledProcMask,
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
347 &callbacks,
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
348 xsmp->client_id, &ret_client_id,
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
349 sizeof (error_string_ret), error_string_ret);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
350
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
351 if (!xsmp->connection)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
352 {
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
353 g_warning ("Failed to connect to the session manager: %s\n",
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
354 error_string_ret[0] ?
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
355 error_string_ret : "no error message given");
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
356 xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
357 return;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
358 }
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
359
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
360 /* We expect a pointless initial SaveYourself if either (a) we
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
361 * didn't have an initial client ID, or (b) we DID have an initial
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
362 * client ID, but the server rejected it and gave us a new one.
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
363 */
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
364 if (!xsmp->client_id ||
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
365 (ret_client_id && strcmp (xsmp->client_id, ret_client_id) != 0))
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
366 xsmp->expecting_initial_save_yourself = TRUE;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
367
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
368 if (ret_client_id)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
369 {
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
370 g_free (xsmp->client_id);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
371 xsmp->client_id = g_strdup (ret_client_id);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
372 free (ret_client_id);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
373
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
374 gdk_threads_enter ();
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
375 gdk_set_sm_client_id (xsmp->client_id);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
376 gdk_threads_leave ();
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
377
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
378 g_debug ("Got client ID \"%s\"", xsmp->client_id);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
379 }
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
380
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
381 xsmp->state = XSMP_STATE_IDLE;
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
382
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
383 /* Do not set the initial properties until we reach the main loop,
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
384 * so that the application has a chance to call
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
385 * egg_set_desktop_file(). (This may also help the session manager
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
386 * have a better idea of when the application is fully up and
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
387 * running.)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
388 */
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
389 xsmp->waiting_to_set_initial_properties = TRUE;
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
390 xsmp->idle = g_idle_add (sm_client_xsmp_set_initial_properties, client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
391 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
392
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
393 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
394 sm_client_xsmp_set_restart_command (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
395 int argc,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
396 const char **argv)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
397 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
398 EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
399 int i;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
400
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
401 g_strfreev (xsmp->restart_command);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
402
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
403 xsmp->restart_command = g_new (char *, argc + 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
404 for (i = 0; i < argc; i++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
405 xsmp->restart_command[i] = g_strdup (argv[i]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
406 xsmp->restart_command[i] = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
407
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
408 xsmp->set_restart_command = TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
409 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
410
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
411 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
412 sm_client_xsmp_will_quit (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
413 gboolean will_quit)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
414 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
415 EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
416
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
417 if (xsmp->state == XSMP_STATE_CONNECTION_CLOSED)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
418 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
419 /* The session manager has already exited! Schedule a quit
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
420 * signal.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
421 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
422 xsmp->waiting_to_emit_quit = TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
423 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
424 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
425 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
426 else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
427 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
428 /* We received a ShutdownCancelled message while the application
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
429 * was interacting; Schedule a quit_cancelled signal.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
430 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
431 xsmp->waiting_to_emit_quit_cancelled = TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
432 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
433 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
434 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
435
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
436 g_return_if_fail (xsmp->state == XSMP_STATE_INTERACT);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
437
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
438 g_debug ("Sending InteractDone(%s)", will_quit ? "False" : "True");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
439 SmcInteractDone (xsmp->connection, !will_quit);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
440
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
441 if (will_quit && xsmp->need_save_state)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
442 save_state (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
443
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
444 g_debug ("Sending SaveYourselfDone(%s)", will_quit ? "True" : "False");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
445 SmcSaveYourselfDone (xsmp->connection, will_quit);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
446 xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
447 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
448
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
449 static gboolean
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
450 sm_client_xsmp_end_session (EggSMClient *client,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
451 EggSMClientEndStyle style,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
452 gboolean request_confirmation)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
453 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
454 EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
455 int save_type;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
456
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
457 /* To end the session via XSMP, we have to send a
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
458 * SaveYourselfRequest. We aren't allowed to do that if anything
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
459 * else is going on, but we don't want to expose this fact to the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
460 * application. So we do our best to patch things up here...
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
461 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
462 * In the worst case, this method might block for some length of
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
463 * time in process_ice_messages, but the only time that code path is
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
464 * honestly likely to get hit is if the application tries to end the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
465 * session as the very first thing it does, in which case it
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
466 * probably won't actually block anyway. It's not worth gunking up
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
467 * the API to try to deal nicely with the other 0.01% of cases where
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
468 * this happens.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
469 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
470
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
471 while (xsmp->state != XSMP_STATE_IDLE ||
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
472 xsmp->expecting_initial_save_yourself)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
473 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
474 /* If we're already shutting down, we don't need to do anything. */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
475 if (xsmp->shutting_down)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
476 return TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
477
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
478 switch (xsmp->state)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
479 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
480 case XSMP_STATE_CONNECTION_CLOSED:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
481 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
482
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
483 case XSMP_STATE_SAVE_YOURSELF:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
484 /* Trying to log out from the save_state callback? Whatever.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
485 * Abort the save_state.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
486 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
487 SmcSaveYourselfDone (xsmp->connection, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
488 xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
489 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
490
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
491 case XSMP_STATE_INTERACT_REQUEST:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
492 case XSMP_STATE_INTERACT:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
493 case XSMP_STATE_SHUTDOWN_CANCELLED:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
494 /* Already in a shutdown-related state, just ignore
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
495 * the new shutdown request...
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
496 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
497 return TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
498
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
499 case XSMP_STATE_IDLE:
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
500 if (xsmp->waiting_to_set_initial_properties)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
501 sm_client_xsmp_set_initial_properties (xsmp);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
502
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
503 if (!xsmp->expecting_initial_save_yourself)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
504 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
505 /* else fall through */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
506
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
507 case XSMP_STATE_SAVE_YOURSELF_DONE:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
508 /* We need to wait for some response from the server.*/
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
509 process_ice_messages (SmcGetIceConnection (xsmp->connection));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
510 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
511
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
512 default:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
513 /* Hm... shouldn't happen */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
514 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
515 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
516 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
517
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
518 /* xfce4-session will do the wrong thing if we pass SmSaveGlobal and
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
519 * the user chooses to save the session. But gnome-session will do
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
520 * the wrong thing if we pass SmSaveBoth and the user chooses NOT to
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
521 * save the session... Sigh.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
522 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
523 if (!strcmp (SmcVendor (xsmp->connection), "xfce4-session"))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
524 save_type = SmSaveBoth;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
525 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
526 save_type = SmSaveGlobal;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
527
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
528 g_debug ("Sending SaveYourselfRequest(SmSaveGlobal, Shutdown, SmInteractStyleAny, %sFast)", request_confirmation ? "!" : "");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
529 SmcRequestSaveYourself (xsmp->connection,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
530 save_type,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
531 True, /* shutdown */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
532 SmInteractStyleAny,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
533 !request_confirmation, /* fast */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
534 True /* global */);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
535 return TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
536 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
537
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
538 static gboolean
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
539 idle_do_pending_events (gpointer data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
540 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
541 EggSMClientXSMP *xsmp = data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
542 EggSMClient *client = data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
543
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
544 gdk_threads_enter ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
545
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
546 xsmp->idle = 0;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
547
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
548 if (xsmp->waiting_to_emit_quit)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
549 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
550 xsmp->waiting_to_emit_quit = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
551 egg_sm_client_quit (client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
552 goto out;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
553 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
554
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
555 if (xsmp->waiting_to_emit_quit_cancelled)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
556 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
557 xsmp->waiting_to_emit_quit_cancelled = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
558 egg_sm_client_quit_cancelled (client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
559 xsmp->state = XSMP_STATE_IDLE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
560 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
561
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
562 if (xsmp->waiting_to_save_myself)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
563 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
564 xsmp->waiting_to_save_myself = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
565 do_save_yourself (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
566 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
567
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
568 out:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
569 gdk_threads_leave ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
570 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
571 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
572
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
573 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
574 update_pending_events (EggSMClientXSMP *xsmp)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
575 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
576 gboolean want_idle =
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
577 xsmp->waiting_to_emit_quit ||
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
578 xsmp->waiting_to_emit_quit_cancelled ||
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
579 xsmp->waiting_to_save_myself;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
580
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
581 if (want_idle)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
582 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
583 if (xsmp->idle == 0)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
584 xsmp->idle = g_idle_add (idle_do_pending_events, xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
585 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
586 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
587 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
588 if (xsmp->idle != 0)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
589 g_source_remove (xsmp->idle);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
590 xsmp->idle = 0;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
591 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
592 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
593
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
594 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
595 fix_broken_state (EggSMClientXSMP *xsmp, const char *message,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
596 gboolean send_interact_done,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
597 gboolean send_save_yourself_done)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
598 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
599 g_warning ("Received XSMP %s message in state %s: client or server error",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
600 message, EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
601
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
602 /* Forget any pending SaveYourself plans we had */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
603 xsmp->waiting_to_save_myself = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
604 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
605
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
606 if (send_interact_done)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
607 SmcInteractDone (xsmp->connection, False);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
608 if (send_save_yourself_done)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
609 SmcSaveYourselfDone (xsmp->connection, True);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
610
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
611 xsmp->state = send_save_yourself_done ? XSMP_STATE_SAVE_YOURSELF_DONE : XSMP_STATE_IDLE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
612 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
613
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
614 /* SM callbacks */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
615
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
616 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
617 xsmp_save_yourself (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
618 SmPointer client_data,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
619 int save_type,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
620 Bool shutdown,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
621 int interact_style,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
622 Bool fast)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
623 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
624 EggSMClientXSMP *xsmp = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
625 gboolean wants_quit_requested;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
626
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
627 g_debug ("Received SaveYourself(%s, %s, %s, %s) in state %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
628 save_type == SmSaveLocal ? "SmSaveLocal" :
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
629 save_type == SmSaveGlobal ? "SmSaveGlobal" : "SmSaveBoth",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
630 shutdown ? "Shutdown" : "!Shutdown",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
631 interact_style == SmInteractStyleAny ? "SmInteractStyleAny" :
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
632 interact_style == SmInteractStyleErrors ? "SmInteractStyleErrors" :
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
633 "SmInteractStyleNone", fast ? "Fast" : "!Fast",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
634 EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
635
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
636 if (xsmp->state != XSMP_STATE_IDLE &&
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
637 xsmp->state != XSMP_STATE_SHUTDOWN_CANCELLED)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
638 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
639 fix_broken_state (xsmp, "SaveYourself", FALSE, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
640 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
641 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
642
4363
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
643 if (xsmp->waiting_to_set_initial_properties)
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
644 sm_client_xsmp_set_initial_properties (xsmp);
80feba8e9034 Merge libeggsmclient from upstream
Ivan N. Zlatev <contact@i-nz.net>
parents: 4315
diff changeset
645
4315
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
646 /* If this is the initial SaveYourself, ignore it; we've already set
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
647 * properties and there's no reason to actually save state too.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
648 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
649 if (xsmp->expecting_initial_save_yourself)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
650 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
651 xsmp->expecting_initial_save_yourself = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
652
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
653 if (save_type == SmSaveLocal &&
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
654 interact_style == SmInteractStyleNone &&
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
655 !shutdown && !fast)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
656 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
657 g_debug ("Sending SaveYourselfDone(True) for initial SaveYourself");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
658 SmcSaveYourselfDone (xsmp->connection, True);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
659 /* As explained in the comment at the end of
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
660 * do_save_yourself(), SAVE_YOURSELF_DONE is the correct
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
661 * state here, not IDLE.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
662 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
663 xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
664 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
665 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
666 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
667 g_warning ("First SaveYourself was not the expected one!");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
668 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
669
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
670 /* Even ignoring the "fast" flag completely, there are still 18
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
671 * different combinations of save_type, shutdown and interact_style.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
672 * We interpret them as follows:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
673 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
674 * Type Shutdown Interact Interpretation
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
675 * G F A/E/N do nothing (1)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
676 * G T N do nothing (1)*
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
677 * G T A/E quit_requested (2)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
678 * L/B F A/E/N save_state (3)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
679 * L/B T N save_state (3)*
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
680 * L/B T A/E quit_requested, then save_state (4)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
681 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
682 * 1. Do nothing, because the SM asked us to do something
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
683 * uninteresting (save open files, but then don't quit
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
684 * afterward) or rude (save open files without asking the user
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
685 * for confirmation).
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
686 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
687 * 2. Request interaction and then emit ::quit_requested. This
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
688 * perhaps isn't quite correct for the SmInteractStyleErrors
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
689 * case, but we don't care.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
690 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
691 * 3. Emit ::save_state. The SmSaveBoth SaveYourselfs in these
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
692 * rows essentially get demoted to SmSaveLocal, because their
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
693 * Global halves correspond to "do nothing".
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
694 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
695 * 4. Request interaction, emit ::quit_requested, and then emit
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
696 * ::save_state after interacting. This is the SmSaveBoth
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
697 * equivalent of #2, but we also promote SmSaveLocal shutdown
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
698 * SaveYourselfs to SmSaveBoth here, because we want to give
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
699 * the user a chance to save open files before quitting.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
700 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
701 * (* It would be nice if we could do something useful when the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
702 * session manager sends a SaveYourself with shutdown True and
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
703 * SmInteractStyleNone. But we can't, so we just pretend it didn't
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
704 * even tell us it was shutting down. The docs for ::quit mention
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
705 * that it might not always be preceded by ::quit_requested.)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
706 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
707
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
708 /* As an optimization, we don't actually request interaction and
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
709 * emit ::quit_requested if the application isn't listening to the
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
710 * signal.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
711 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
712 wants_quit_requested = g_signal_has_handler_pending (xsmp, g_signal_lookup ("quit_requested", EGG_TYPE_SM_CLIENT), 0, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
713
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
714 xsmp->need_save_state = (save_type != SmSaveGlobal);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
715 xsmp->need_quit_requested = (shutdown && wants_quit_requested &&
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
716 interact_style != SmInteractStyleNone);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
717 xsmp->interact_errors = (interact_style == SmInteractStyleErrors);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
718
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
719 xsmp->shutting_down = shutdown;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
720
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
721 do_save_yourself (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
722 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
723
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
724 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
725 do_save_yourself (EggSMClientXSMP *xsmp)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
726 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
727 if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
728 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
729 /* The SM cancelled a previous SaveYourself, but we haven't yet
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
730 * had a chance to tell the application, so we can't start
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
731 * processing this SaveYourself yet.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
732 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
733 xsmp->waiting_to_save_myself = TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
734 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
735 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
736 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
737
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
738 if (xsmp->need_quit_requested)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
739 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
740 xsmp->state = XSMP_STATE_INTERACT_REQUEST;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
741
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
742 g_debug ("Sending InteractRequest(%s)",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
743 xsmp->interact_errors ? "Error" : "Normal");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
744 SmcInteractRequest (xsmp->connection,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
745 xsmp->interact_errors ? SmDialogError : SmDialogNormal,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
746 xsmp_interact,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
747 xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
748 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
749 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
750
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
751 if (xsmp->need_save_state)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
752 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
753 save_state (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
754
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
755 /* Though unlikely, the client could have been disconnected
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
756 * while the application was saving its state.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
757 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
758 if (!xsmp->connection)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
759 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
760 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
761
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
762 g_debug ("Sending SaveYourselfDone(True)");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
763 SmcSaveYourselfDone (xsmp->connection, True);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
764
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
765 /* The client state diagram in the XSMP spec says that after a
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
766 * non-shutdown SaveYourself, we go directly back to "idle". But
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
767 * everything else in both the XSMP spec and the libSM docs
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
768 * disagrees.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
769 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
770 xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
771 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
772
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
773 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
774 merge_keyfiles (GKeyFile *dest, GKeyFile *source)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
775 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
776 int g, k;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
777 char **groups, **keys, *value;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
778
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
779 groups = g_key_file_get_groups (source, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
780 for (g = 0; groups[g]; g++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
781 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
782 keys = g_key_file_get_keys (source, groups[g], NULL, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
783 for (k = 0; keys[k]; k++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
784 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
785 value = g_key_file_get_value (source, groups[g], keys[k], NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
786 if (value)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
787 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
788 g_key_file_set_value (dest, groups[g], keys[k], value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
789 g_free (value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
790 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
791 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
792 g_strfreev (keys);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
793 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
794 g_strfreev (groups);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
795 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
796
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
797 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
798 save_state (EggSMClientXSMP *xsmp)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
799 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
800 GKeyFile *state_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
801 char *state_file_path, *data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
802 EggDesktopFile *desktop_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
803 GPtrArray *restart;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
804 int offset, fd;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
805
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
806 /* We set xsmp->state before emitting save_state, but our caller is
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
807 * responsible for setting it back afterward.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
808 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
809 xsmp->state = XSMP_STATE_SAVE_YOURSELF;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
810
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
811 state_file = egg_sm_client_save_state ((EggSMClient *)xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
812 if (!state_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
813 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
814 restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
815 set_properties (xsmp,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
816 ptrarray_prop (SmRestartCommand, restart),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
817 NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
818 g_ptr_array_free (restart, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
819 delete_properties (xsmp, SmDiscardCommand, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
820 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
821 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
822
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
823 desktop_file = egg_get_desktop_file ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
824 if (desktop_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
825 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
826 GKeyFile *merged_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
827 char *exec;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
828 int i;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
829
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
830 merged_file = g_key_file_new ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
831 merge_keyfiles (merged_file, egg_desktop_file_get_key_file (desktop_file));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
832 merge_keyfiles (merged_file, state_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
833
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
834 g_key_file_free (state_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
835 state_file = merged_file;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
836
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
837 /* Update Exec key using "--sm-client-state-file %k" */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
838 restart = generate_command (xsmp->restart_command,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
839 NULL, "%k");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
840 for (i = 0; i < restart->len; i++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
841 restart->pdata[i] = g_shell_quote (restart->pdata[i]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
842 g_ptr_array_add (restart, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
843 exec = g_strjoinv (" ", (char **)restart->pdata);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
844 g_strfreev ((char **)restart->pdata);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
845 g_ptr_array_free (restart, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
846
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
847 g_key_file_set_string (state_file, EGG_DESKTOP_FILE_GROUP,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
848 EGG_DESKTOP_FILE_KEY_EXEC,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
849 exec);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
850 g_free (exec);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
851 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
852
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
853 /* Now write state_file to disk. (We can't use mktemp(), because
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
854 * that requires the filename to end with "XXXXXX", and we want
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
855 * it to end with ".desktop".)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
856 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
857
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
858 data = g_key_file_to_data (state_file, NULL, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
859 g_key_file_free (state_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
860
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
861 offset = 0;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
862 while (1)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
863 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
864 state_file_path = g_strdup_printf ("%s%csession-state%c%s-%ld.%s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
865 g_get_user_config_dir (),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
866 G_DIR_SEPARATOR, G_DIR_SEPARATOR,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
867 g_get_prgname (),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
868 (long)time (NULL) + offset,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
869 desktop_file ? "desktop" : "state");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
870
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
871 fd = open (state_file_path, O_WRONLY | O_CREAT | O_EXCL, 0644);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
872 if (fd == -1)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
873 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
874 if (errno == EEXIST)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
875 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
876 offset++;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
877 g_free (state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
878 continue;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
879 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
880 else if (errno == ENOTDIR || errno == ENOENT)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
881 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
882 char *sep = strrchr (state_file_path, G_DIR_SEPARATOR);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
883
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
884 *sep = '\0';
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
885 if (g_mkdir_with_parents (state_file_path, 0755) != 0)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
886 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
887 g_warning ("Could not create directory '%s'",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
888 state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
889 g_free (state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
890 state_file_path = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
891 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
892 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
893
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
894 continue;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
895 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
896
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
897 g_warning ("Could not create file '%s': %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
898 state_file_path, g_strerror (errno));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
899 g_free (state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
900 state_file_path = NULL;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
901 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
902 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
903
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
904 close (fd);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
905 g_file_set_contents (state_file_path, data, -1, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
906 break;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
907 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
908 g_free (data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
909
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
910 restart = generate_command (xsmp->restart_command, xsmp->client_id,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
911 state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
912 set_properties (xsmp,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
913 ptrarray_prop (SmRestartCommand, restart),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
914 NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
915 g_ptr_array_free (restart, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
916
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
917 if (state_file_path)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
918 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
919 set_properties (xsmp,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
920 array_prop (SmDiscardCommand,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
921 "/bin/rm", "-rf", state_file_path,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
922 NULL),
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
923 NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
924 g_free (state_file_path);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
925 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
926 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
927
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
928 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
929 xsmp_interact (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
930 SmPointer client_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
931 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
932 EggSMClientXSMP *xsmp = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
933 EggSMClient *client = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
934
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
935 g_debug ("Received Interact message in state %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
936 EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
937
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
938 if (xsmp->state != XSMP_STATE_INTERACT_REQUEST)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
939 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
940 fix_broken_state (xsmp, "Interact", TRUE, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
941 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
942 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
943
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
944 xsmp->state = XSMP_STATE_INTERACT;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
945 egg_sm_client_quit_requested (client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
946 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
947
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
948 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
949 xsmp_die (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
950 SmPointer client_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
951 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
952 EggSMClientXSMP *xsmp = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
953 EggSMClient *client = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
954
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
955 g_debug ("Received Die message in state %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
956 EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
957
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
958 sm_client_xsmp_disconnect (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
959 egg_sm_client_quit (client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
960 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
961
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
962 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
963 xsmp_save_complete (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
964 SmPointer client_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
965 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
966 EggSMClientXSMP *xsmp = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
967
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
968 g_debug ("Received SaveComplete message in state %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
969 EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
970
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
971 if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
972 xsmp->state = XSMP_STATE_IDLE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
973 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
974 fix_broken_state (xsmp, "SaveComplete", FALSE, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
975 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
976
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
977 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
978 xsmp_shutdown_cancelled (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
979 SmPointer client_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
980 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
981 EggSMClientXSMP *xsmp = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
982 EggSMClient *client = client_data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
983
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
984 g_debug ("Received ShutdownCancelled message in state %s",
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
985 EGG_SM_CLIENT_XSMP_STATE (xsmp));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
986
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
987 xsmp->shutting_down = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
988
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
989 if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
990 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
991 /* We've finished interacting and now the SM has agreed to
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
992 * cancel the shutdown.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
993 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
994 xsmp->state = XSMP_STATE_IDLE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
995 egg_sm_client_quit_cancelled (client);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
996 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
997 else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
998 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
999 /* Hm... ok, so we got a shutdown SaveYourself, which got
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1000 * cancelled, but the application was still interacting, so we
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1001 * didn't tell it yet, and then *another* SaveYourself arrived,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1002 * which we must still be waiting to tell the app about, except
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1003 * that now that SaveYourself has been cancelled too! Dizzy yet?
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1004 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1005 xsmp->waiting_to_save_myself = FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1006 update_pending_events (xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1007 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1008 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1009 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1010 g_debug ("Sending SaveYourselfDone(False)");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1011 SmcSaveYourselfDone (xsmp->connection, False);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1012
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1013 if (xsmp->state == XSMP_STATE_INTERACT)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1014 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1015 /* The application is currently interacting, so we can't
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1016 * tell it about the cancellation yet; we will wait until
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1017 * after it calls egg_sm_client_will_quit().
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1018 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1019 xsmp->state = XSMP_STATE_SHUTDOWN_CANCELLED;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1020 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1021 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1022 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1023 /* The shutdown was cancelled before the application got a
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1024 * chance to interact.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1025 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1026 xsmp->state = XSMP_STATE_IDLE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1027 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1028 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1029 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1030
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1031 /* Utilities */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1032
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1033 /* Create a restart/clone/Exec command based on @restart_command.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1034 * If @client_id is non-%NULL, add "--sm-client-id @client_id".
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1035 * If @state_file is non-%NULL, add "--sm-client-state-file @state_file".
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1036 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1037 * None of the input strings are g_strdup()ed; the caller must keep
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1038 * them around until it is done with the returned GPtrArray, and must
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1039 * then free the array, but not its contents.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1040 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1041 static GPtrArray *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1042 generate_command (char **restart_command, const char *client_id,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1043 const char *state_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1044 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1045 GPtrArray *cmd;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1046 int i;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1047
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1048 cmd = g_ptr_array_new ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1049 g_ptr_array_add (cmd, restart_command[0]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1050
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1051 if (client_id)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1052 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1053 g_ptr_array_add (cmd, "--sm-client-id");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1054 g_ptr_array_add (cmd, (char *)client_id);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1055 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1056
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1057 if (state_file)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1058 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1059 g_ptr_array_add (cmd, "--sm-client-state-file");
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1060 g_ptr_array_add (cmd, (char *)state_file);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1061 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1062
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1063 for (i = 1; restart_command[i]; i++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1064 g_ptr_array_add (cmd, restart_command[i]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1065
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1066 return cmd;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1067 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1068
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1069 /* Takes a NULL-terminated list of SmProp * values, created by
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1070 * array_prop, ptrarray_prop, string_prop, card8_prop, sets them, and
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1071 * frees them.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1072 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1073 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1074 set_properties (EggSMClientXSMP *xsmp, ...)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1075 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1076 GPtrArray *props;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1077 SmProp *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1078 va_list ap;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1079 int i;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1080
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1081 props = g_ptr_array_new ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1082
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1083 va_start (ap, xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1084 while ((prop = va_arg (ap, SmProp *)))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1085 g_ptr_array_add (props, prop);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1086 va_end (ap);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1087
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1088 if (xsmp->connection)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1089 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1090 SmcSetProperties (xsmp->connection, props->len,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1091 (SmProp **)props->pdata);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1092 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1093
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1094 for (i = 0; i < props->len; i++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1095 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1096 prop = props->pdata[i];
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1097 g_free (prop->vals);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1098 g_free (prop);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1099 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1100 g_ptr_array_free (props, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1101 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1102
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1103 /* Takes a NULL-terminated list of property names and deletes them. */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1104 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1105 delete_properties (EggSMClientXSMP *xsmp, ...)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1106 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1107 GPtrArray *props;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1108 char *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1109 va_list ap;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1110
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1111 if (!xsmp->connection)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1112 return;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1113
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1114 props = g_ptr_array_new ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1115
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1116 va_start (ap, xsmp);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1117 while ((prop = va_arg (ap, char *)))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1118 g_ptr_array_add (props, prop);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1119 va_end (ap);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1120
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1121 SmcDeleteProperties (xsmp->connection, props->len,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1122 (char **)props->pdata);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1123
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1124 g_ptr_array_free (props, TRUE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1125 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1126
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1127 /* Takes an array of strings and creates a LISTofARRAY8 property. The
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1128 * strings are neither dupped nor freed; they need to remain valid
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1129 * until you're done with the SmProp.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1130 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1131 static SmProp *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1132 array_prop (const char *name, ...)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1133 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1134 SmProp *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1135 SmPropValue pv;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1136 GArray *vals;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1137 char *value;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1138 va_list ap;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1139
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1140 prop = g_new (SmProp, 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1141 prop->name = (char *)name;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1142 prop->type = SmLISTofARRAY8;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1143
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1144 vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1145
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1146 va_start (ap, name);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1147 while ((value = va_arg (ap, char *)))
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1148 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1149 pv.length = strlen (value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1150 pv.value = value;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1151 g_array_append_val (vals, pv);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1152 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1153
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1154 prop->num_vals = vals->len;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1155 prop->vals = (SmPropValue *)vals->data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1156
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1157 g_array_free (vals, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1158
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1159 return prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1160 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1161
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1162 /* Takes a GPtrArray of strings and creates a LISTofARRAY8 property.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1163 * The array contents are neither dupped nor freed; they need to
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1164 * remain valid until you're done with the SmProp.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1165 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1166 static SmProp *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1167 ptrarray_prop (const char *name, GPtrArray *values)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1168 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1169 SmProp *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1170 SmPropValue pv;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1171 GArray *vals;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1172 int i;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1173
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1174 prop = g_new (SmProp, 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1175 prop->name = (char *)name;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1176 prop->type = SmLISTofARRAY8;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1177
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1178 vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1179
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1180 for (i = 0; i < values->len; i++)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1181 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1182 pv.length = strlen (values->pdata[i]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1183 pv.value = values->pdata[i];
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1184 g_array_append_val (vals, pv);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1185 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1186
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1187 prop->num_vals = vals->len;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1188 prop->vals = (SmPropValue *)vals->data;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1189
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1190 g_array_free (vals, FALSE);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1191
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1192 return prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1193 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1194
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1195 /* Takes a string and creates an ARRAY8 property. The string is
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1196 * neither dupped nor freed; it needs to remain valid until you're
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1197 * done with the SmProp.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1198 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1199 static SmProp *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1200 string_prop (const char *name, const char *value)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1201 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1202 SmProp *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1203
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1204 prop = g_new (SmProp, 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1205 prop->name = (char *)name;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1206 prop->type = SmARRAY8;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1207
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1208 prop->num_vals = 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1209 prop->vals = g_new (SmPropValue, 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1210
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1211 prop->vals[0].length = strlen (value);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1212 prop->vals[0].value = (char *)value;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1213
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1214 return prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1215 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1216
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1217 /* Takes a char and creates a CARD8 property. */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1218 static SmProp *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1219 card8_prop (const char *name, unsigned char value)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1220 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1221 SmProp *prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1222 char *card8val;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1223
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1224 /* To avoid having to allocate and free prop->vals[0], we cheat and
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1225 * make vals a 2-element-long array and then use the second element
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1226 * to store value.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1227 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1228
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1229 prop = g_new (SmProp, 1);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1230 prop->name = (char *)name;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1231 prop->type = SmCARD8;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1232
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1233 prop->num_vals = 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1234 prop->vals = g_new (SmPropValue, 2);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1235 card8val = (char *)(&prop->vals[1]);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1236 card8val[0] = value;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1237
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1238 prop->vals[0].length = 1;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1239 prop->vals[0].value = card8val;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1240
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1241 return prop;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1242 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1243
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1244 /* ICE code. This makes no effort to play nice with anyone else trying
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1245 * to use libICE. Fortunately, no one uses libICE for anything other
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1246 * than SM. (DCOP uses ICE, but it has its own private copy of
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1247 * libICE.)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1248 *
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1249 * When this moves to gtk, it will need to be cleverer, to avoid
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1250 * tripping over old apps that use GnomeClient or that use libSM
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1251 * directly.
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1252 */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1253
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1254 #include <X11/ICE/ICElib.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1255 #include <fcntl.h>
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1256
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1257 static void ice_error_handler (IceConn ice_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1258 Bool swap,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1259 int offending_minor_opcode,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1260 unsigned long offending_sequence,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1261 int error_class,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1262 int severity,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1263 IcePointer values);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1264 static void ice_io_error_handler (IceConn ice_conn);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1265 static void ice_connection_watch (IceConn ice_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1266 IcePointer client_data,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1267 Bool opening,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1268 IcePointer *watch_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1269
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1270 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1271 ice_init (void)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1272 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1273 IceSetIOErrorHandler (ice_io_error_handler);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1274 IceSetErrorHandler (ice_error_handler);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1275 IceAddConnectionWatch (ice_connection_watch, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1276 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1277
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1278 static gboolean
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1279 process_ice_messages (IceConn ice_conn)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1280 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1281 IceProcessMessagesStatus status;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1282
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1283 gdk_threads_enter ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1284 status = IceProcessMessages (ice_conn, NULL, NULL);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1285 gdk_threads_leave ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1286
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1287 switch (status)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1288 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1289 case IceProcessMessagesSuccess:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1290 return TRUE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1291
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1292 case IceProcessMessagesIOError:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1293 sm_client_xsmp_disconnect (IceGetConnectionContext (ice_conn));
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1294 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1295
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1296 case IceProcessMessagesConnectionClosed:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1297 return FALSE;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1298
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1299 default:
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1300 g_assert_not_reached ();
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1301 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1302 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1303
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1304 static gboolean
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1305 ice_iochannel_watch (GIOChannel *channel,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1306 GIOCondition condition,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1307 gpointer client_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1308 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1309 return process_ice_messages (client_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1310 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1311
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1312 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1313 ice_connection_watch (IceConn ice_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1314 IcePointer client_data,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1315 Bool opening,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1316 IcePointer *watch_data)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1317 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1318 guint watch_id;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1319
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1320 if (opening)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1321 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1322 GIOChannel *channel;
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1323 int fd = IceConnectionNumber (ice_conn);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1324
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1325 fcntl (fd, F_SETFD, fcntl (fd, F_GETFD, 0) | FD_CLOEXEC);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1326 channel = g_io_channel_unix_new (fd);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1327 watch_id = g_io_add_watch (channel, G_IO_IN | G_IO_ERR,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1328 ice_iochannel_watch, ice_conn);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1329 g_io_channel_unref (channel);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1330
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1331 *watch_data = GUINT_TO_POINTER (watch_id);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1332 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1333 else
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1334 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1335 watch_id = GPOINTER_TO_UINT (*watch_data);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1336 g_source_remove (watch_id);
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1337 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1338 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1339
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1340 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1341 ice_error_handler (IceConn ice_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1342 Bool swap,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1343 int offending_minor_opcode,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1344 unsigned long offending_sequence,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1345 int error_class,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1346 int severity,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1347 IcePointer values)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1348 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1349 /* Do nothing */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1350 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1351
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1352 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1353 ice_io_error_handler (IceConn ice_conn)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1354 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1355 /* Do nothing */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1356 }
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1357
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1358 static void
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1359 smc_error_handler (SmcConn smc_conn,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1360 Bool swap,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1361 int offending_minor_opcode,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1362 unsigned long offending_sequence,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1363 int error_class,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1364 int severity,
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1365 SmPointer values)
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1366 {
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1367 /* Do nothing */
c942eaef7bc6 Implement session management.
Ivan N. Zlatev <contact@i-nz.net>
parents:
diff changeset
1368 }