Mercurial > pidgin
annotate src/session.c @ 11995:969fd533bd5d
[gaim-migrate @ 14288]
SF Patch #1348790 from Richard Gobeille
"This patch simply doesn't add the separator to the
bottom of the buddy pounce menu if you haven't set any
pounces up. It looked kind of funny having a lone
separator at the bottom that wasn't actually separating
anything."
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 06 Nov 2005 23:02:39 +0000 |
parents | f8cd06753755 |
children |
rev | line source |
---|---|
4158 | 1 /* |
2 * session management for Gaim | |
3 * | |
8046 | 4 * Gaim is the legal property of its developers, whose names are too numerous |
5 * to list here. Please refer to the COPYRIGHT file distributed with this | |
6 * source distribution. | |
4158 | 7 * |
8 * This program is free software; you can redistribute it and/or modify | |
9 * it under the terms of the GNU General Public License as published by | |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
13 * This program is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License | |
19 * along with this program; if not, write to the Free Software | |
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 * | |
22 */ | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5593
diff
changeset
|
23 #include "internal.h" |
4158 | 24 |
6245 | 25 #include "core.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5593
diff
changeset
|
26 #include "debug.h" |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
27 #include "eventloop.h" |
4158 | 28 |
29 #ifdef USE_SM | |
30 | |
31 #include <X11/ICE/ICElib.h> | |
32 #include <X11/SM/SMlib.h> | |
6485
70d5122bc3ff
[gaim-migrate @ 6999]
Christian Hammond <chipx86@chipx86.com>
parents:
6245
diff
changeset
|
33 #include <gdk/gdkx.h> |
4158 | 34 #include <unistd.h> |
35 #include <fcntl.h> | |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5593
diff
changeset
|
36 |
4158 | 37 #define ERROR_LENGTH 512 |
38 | |
39 static IceIOErrorHandler ice_installed_io_error_handler; | |
40 static SmcConn session = NULL; | |
41 static gchar *myself = NULL; | |
42 static gboolean had_first_save = FALSE; | |
43 gboolean session_managed = FALSE; | |
44 | |
45 /* ICE belt'n'braces stuff */ | |
46 | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
47 struct ice_connection_info { |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
48 IceConn connection; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
49 guint input_id; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
50 }; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
51 |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
52 static void ice_process_messages(gpointer data, gint fd, |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
53 GaimInputCondition condition) { |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
54 struct ice_connection_info *conninfo = (struct ice_connection_info*) data; |
4158 | 55 IceProcessMessagesStatus status; |
56 | |
57 /* please don't block... please! */ | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
58 status = IceProcessMessages(conninfo->connection, NULL, NULL); |
4158 | 59 |
60 if (status == IceProcessMessagesIOError) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
61 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
62 "ICE IO error, closing connection... "); |
4158 | 63 |
64 /* IO error, please disconnect */ | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
65 IceSetShutdownNegotiation(conninfo->connection, False); |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
66 IceCloseConnection(conninfo->connection); |
4158 | 67 |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
68 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n"); |
4158 | 69 |
70 /* cancel the handler */ | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
71 gaim_input_remove(conninfo->input_id); |
4158 | 72 } |
73 } | |
74 | |
75 static void ice_connection_watch(IceConn connection, IcePointer client_data, | |
76 Bool opening, IcePointer *watch_data) { | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
77 struct ice_connection_info *conninfo = NULL; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
78 |
4158 | 79 if (opening) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
80 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
81 "Handling new ICE connection... "); |
4158 | 82 |
83 /* ensure ICE connection is not passed to child processes */ | |
84 fcntl(IceConnectionNumber(connection), F_SETFD, FD_CLOEXEC); | |
85 | |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
86 conninfo = g_new(struct ice_connection_info, 1); |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
87 conninfo->connection = connection; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
88 |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8046
diff
changeset
|
89 /* watch the connection */ |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
90 conninfo->input_id = gaim_input_add(IceConnectionNumber(connection), GAIM_INPUT_READ, |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
91 ice_process_messages, conninfo); |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
92 *watch_data = conninfo; |
4158 | 93 } else { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
94 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
95 "Handling closed ICE connection... "); |
4158 | 96 |
8280
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
97 /* get the input ID back and stop watching it */ |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
98 conninfo = (struct ice_connection_info*) *watch_data; |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
99 gaim_input_remove(conninfo->input_id); |
084ed9f7ac19
[gaim-migrate @ 9004]
Christian Hammond <chipx86@chipx86.com>
parents:
8273
diff
changeset
|
100 g_free(conninfo); |
4158 | 101 } |
102 | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
103 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n"); |
4158 | 104 } |
105 | |
106 /* We call any handler installed before (or after) ice_init but | |
107 * avoid calling the default libICE handler which does an exit(). | |
108 * | |
109 * This means we do nothing by default, which is probably correct, | |
110 * the connection will get closed by libICE | |
111 */ | |
112 | |
113 static void ice_io_error_handler(IceConn connection) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
114 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
115 "Handling ICE IO error... "); |
4158 | 116 |
117 if (ice_installed_io_error_handler) | |
118 (*ice_installed_io_error_handler)(connection); | |
119 | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
120 gaim_debug(GAIM_DEBUG_INFO, NULL, "done.\n"); |
4158 | 121 } |
122 | |
123 static void ice_init() { | |
124 IceIOErrorHandler default_handler; | |
125 | |
126 ice_installed_io_error_handler = IceSetIOErrorHandler(NULL); | |
127 default_handler = IceSetIOErrorHandler(ice_io_error_handler); | |
128 | |
129 if (ice_installed_io_error_handler == default_handler) | |
130 ice_installed_io_error_handler = NULL; | |
131 | |
132 IceAddConnectionWatch(ice_connection_watch, NULL); | |
133 | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
134 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
135 "ICE initialized.\n"); |
4158 | 136 } |
137 | |
4281 | 138 /* my magic utility function */ |
139 | |
8601 | 140 static gchar **session_make_command(gchar *client_id, gchar *config_dir) { |
4281 | 141 gint i = 2; |
142 gint j = 0; | |
143 gchar **ret; | |
144 | |
145 if (client_id) i += 2; | |
8601 | 146 if (config_dir) i += 2; /* we will specify gaim's user dir */ |
4281 | 147 |
148 ret = g_new(gchar *, i); | |
149 ret[j++] = g_strdup(myself); | |
150 | |
151 if (client_id) { | |
152 ret[j++] = g_strdup("--session"); | |
153 ret[j++] = g_strdup(client_id); | |
154 } | |
155 | |
8601 | 156 if (config_dir) { |
157 ret[j++] = g_strdup("--config"); | |
158 ret[j++] = g_strdup(config_dir); | |
159 } | |
4281 | 160 |
161 ret[j++] = NULL; | |
162 | |
163 return ret; | |
164 } | |
165 | |
4158 | 166 /* SM callback handlers */ |
167 | |
11862 | 168 static void session_save_yourself(SmcConn conn, SmPointer data, int save_type, |
4158 | 169 Bool shutdown, int interact_style, Bool fast) { |
170 if (had_first_save == FALSE && save_type == SmSaveLocal && | |
171 interact_style == SmInteractStyleNone && !shutdown && | |
172 !fast) { | |
173 /* this is just a dry run, spit it back */ | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
174 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
175 "Received first save_yourself\n"); |
4158 | 176 SmcSaveYourselfDone(conn, True); |
177 had_first_save = TRUE; | |
178 return; | |
179 } | |
180 | |
181 /* tum ti tum... don't add anything else here without * | |
182 * reading SMlib.PS from an X.org ftp server near you */ | |
183 | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
184 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
185 "Received save_yourself\n"); |
4158 | 186 |
187 if (save_type == SmSaveGlobal || save_type == SmSaveBoth) { | |
188 /* may as well do something ... */ | |
5593
b07aa997ddd8
[gaim-migrate @ 5997]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
189 /* or not -- save_prefs(); */ |
4158 | 190 } |
191 | |
192 SmcSaveYourselfDone(conn, True); | |
193 } | |
194 | |
11862 | 195 static void session_die(SmcConn conn, SmPointer data) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
196 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
197 "Received die\n"); |
6179
16e384bb7fbf
[gaim-migrate @ 6664]
Christian Hammond <chipx86@chipx86.com>
parents:
5872
diff
changeset
|
198 gaim_core_quit(); |
4158 | 199 } |
200 | |
11862 | 201 static void session_save_complete(SmcConn conn, SmPointer data) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
202 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
203 "Received save_complete\n"); |
4158 | 204 } |
205 | |
11862 | 206 static void session_shutdown_cancelled(SmcConn conn, SmPointer data) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
207 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
208 "Received shutdown_cancelled\n"); |
4158 | 209 } |
210 | |
211 /* utility functions stolen from Gnome-client */ | |
212 | |
213 static void session_set_value(SmcConn conn, gchar *name, char *type, | |
214 int num_vals, SmPropValue *vals) { | |
215 SmProp *proplist[1]; | |
216 SmProp prop; | |
217 | |
218 g_return_if_fail(conn); | |
219 | |
220 prop.name = name; | |
221 prop.type = type; | |
222 prop.num_vals = num_vals; | |
223 prop.vals = vals; | |
224 | |
225 proplist[0] = ∝ | |
226 SmcSetProperties(conn, 1, proplist); | |
227 } | |
228 | |
229 static void session_set_string(SmcConn conn, gchar *name, gchar *value) { | |
230 SmPropValue val; | |
231 | |
232 g_return_if_fail(name); | |
233 | |
234 val.length = strlen (value)+1; | |
235 val.value = value; | |
236 | |
237 session_set_value(conn, name, SmARRAY8, 1, &val); | |
238 } | |
239 | |
240 static void session_set_gchar(SmcConn conn, gchar *name, gchar value) { | |
241 SmPropValue val; | |
242 | |
243 g_return_if_fail(name); | |
244 | |
245 val.length = 1; | |
246 val.value = &value; | |
247 | |
248 session_set_value(conn, name, SmCARD8, 1, &val); | |
249 } | |
250 | |
251 static void session_set_array(SmcConn conn, gchar *name, gchar *array[]) { | |
252 gint argc; | |
253 gchar **ptr; | |
254 gint i; | |
255 | |
256 SmPropValue *vals; | |
257 | |
258 g_return_if_fail (name); | |
259 | |
260 /* We count the number of elements in our array. */ | |
261 for (ptr = array, argc = 0; *ptr ; ptr++, argc++) /* LOOP */; | |
262 | |
263 /* Now initialize the 'vals' array. */ | |
264 vals = g_new (SmPropValue, argc); | |
265 for (ptr = array, i = 0 ; i < argc ; ptr++, i++) { | |
266 vals[i].length = strlen (*ptr); | |
267 vals[i].value = *ptr; | |
268 } | |
269 | |
270 session_set_value(conn, name, SmLISTofARRAY8, argc, vals); | |
271 | |
272 g_free (vals); | |
273 } | |
274 | |
275 #endif /* USE_SM */ | |
276 | |
277 /* setup functions */ | |
278 | |
8601 | 279 void session_init(gchar *argv0, gchar *previous_id, gchar *config_dir) { |
4158 | 280 #ifdef USE_SM |
281 SmcCallbacks callbacks; | |
282 gchar *client_id = NULL; | |
283 gchar error[ERROR_LENGTH] = ""; | |
284 gchar *tmp = NULL; | |
4281 | 285 gchar **cmd = NULL; |
4158 | 286 |
287 if (session != NULL) { | |
288 /* session is already established, what the hell is going on? */ | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
289 gaim_debug(GAIM_DEBUG_WARNING, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
290 "Duplicated call to session_init!\n"); |
4158 | 291 return; |
292 } | |
293 | |
294 if (g_getenv("SESSION_MANAGER") == NULL) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
295 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
296 "No SESSION_MANAGER found, aborting.\n"); |
4158 | 297 return; |
298 } | |
299 | |
300 ice_init(); | |
301 | |
302 callbacks.save_yourself.callback = session_save_yourself; | |
303 callbacks.die.callback = session_die; | |
304 callbacks.save_complete.callback = session_save_complete; | |
305 callbacks.shutdown_cancelled.callback = session_shutdown_cancelled; | |
306 | |
307 callbacks.save_yourself.client_data = NULL; | |
308 callbacks.die.client_data = NULL; | |
309 callbacks.save_complete.client_data = NULL; | |
310 callbacks.shutdown_cancelled.client_data = NULL; | |
311 | |
4544 | 312 if (previous_id) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
313 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
314 "Connecting with previous ID %s\n", previous_id); |
4544 | 315 } else { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
316 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
317 "Connecting with no previous ID\n"); |
4544 | 318 } |
4158 | 319 |
320 session = SmcOpenConnection(NULL, "session", SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | | |
321 SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, | |
322 &callbacks, previous_id, &client_id, ERROR_LENGTH, error); | |
323 | |
324 if (session == NULL) { | |
325 if (error[0] != '\0') { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
326 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
327 "Connection failed with error: %s\n", error); |
4158 | 328 } else { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
329 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
330 "Connetion failed with unknown error.\n"); |
4158 | 331 } |
332 return; | |
333 } | |
334 | |
335 tmp = SmcVendor(session); | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
336 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
337 "Connected to manager (%s) with client ID %s\n", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
338 tmp, client_id); |
4158 | 339 g_free(tmp); |
340 | |
341 session_managed = TRUE; | |
342 gdk_set_sm_client_id(client_id); | |
343 | |
4265 | 344 tmp = g_get_current_dir(); |
345 session_set_string(session, SmCurrentDirectory, tmp); | |
346 g_free(tmp); | |
347 | |
4210 | 348 tmp = g_strdup_printf("%d", (int) getpid()); |
4158 | 349 session_set_string(session, SmProcessID, tmp); |
350 g_free(tmp); | |
351 | |
4210 | 352 tmp = g_strdup(g_get_user_name()); |
4158 | 353 session_set_string(session, SmUserID, tmp); |
354 g_free(tmp); | |
355 | |
356 session_set_gchar(session, SmRestartStyleHint, (gchar) SmRestartIfRunning); | |
357 session_set_string(session, SmProgram, g_get_prgname()); | |
358 | |
359 myself = g_strdup(argv0); | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
360 gaim_debug(GAIM_DEBUG_MISC, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
361 "Using %s as command\n", myself); |
4158 | 362 |
8601 | 363 cmd = session_make_command(NULL, config_dir); |
4158 | 364 session_set_array(session, SmCloneCommand, cmd); |
4281 | 365 g_strfreev(cmd); |
4158 | 366 |
4265 | 367 /* this is currently useless, but gnome-session warns 'the following applications will not |
368 save their current status' bla bla if we don't have it and the user checks 'Save Session' | |
369 when they log out */ | |
4281 | 370 cmd = g_new(gchar *, 2); |
371 cmd[0] = g_strdup("/bin/true"); | |
372 cmd[1] = NULL; | |
4158 | 373 session_set_array(session, SmDiscardCommand, cmd); |
4281 | 374 g_strfreev(cmd); |
4158 | 375 |
8601 | 376 cmd = session_make_command(client_id, config_dir); |
4158 | 377 session_set_array(session, SmRestartCommand, cmd); |
4281 | 378 g_strfreev(cmd); |
379 | |
4158 | 380 g_free(client_id); |
381 #endif /* USE_SM */ | |
382 } | |
383 | |
384 void session_end() { | |
385 #ifdef USE_SM | |
386 if (session == NULL) /* no session to close */ | |
387 return; | |
388 | |
389 SmcCloseConnection(session, 0, NULL); | |
390 | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
391 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
392 "Connection closed.\n"); |
4158 | 393 #endif /* USE_SM */ |
394 } |