Mercurial > pidgin
annotate src/session.c @ 11111:f03dce7ea408
[gaim-migrate @ 13163]
Patch #1234440, from sadrul
"Mark blocked users in the buddy-list"
Patch #1234197, from sadrul
"New API fn gaim_privacy_check"
Plus changes by me. (Read as: blame me if it's busted, thank sadrul if it works)
Basically, all this stuff boils down to the following:
We composite a new blocked.png onto the prpl icon in the buddy list if the user is blocked.
MSN was the only prpl that used the old blocked.png. However, it looks bad to overlay both icons, so I removed the use of blocked.png from the MSN prpl. As an MSN user, I think the result is intuitive.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Sun, 17 Jul 2005 23:36:34 +0000 |
| parents | 50224ac8184d |
| children | bb0d7b719af2 |
| 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 | |
| 168 void session_save_yourself(SmcConn conn, SmPointer data, int save_type, | |
| 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 | |
| 195 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 | |
| 201 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 | |
| 206 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 |
|
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
8601
diff
changeset
|
287 gaim_debug_register_category("Session Management"); |
|
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
8601
diff
changeset
|
288 |
| 4158 | 289 if (session != NULL) { |
| 290 /* session is already established, what the hell is going on? */ | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
291 gaim_debug(GAIM_DEBUG_WARNING, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
292 "Duplicated call to session_init!\n"); |
| 4158 | 293 return; |
| 294 } | |
| 295 | |
| 296 if (g_getenv("SESSION_MANAGER") == NULL) { | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
297 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
298 "No SESSION_MANAGER found, aborting.\n"); |
| 4158 | 299 return; |
| 300 } | |
| 301 | |
| 302 ice_init(); | |
| 303 | |
| 304 callbacks.save_yourself.callback = session_save_yourself; | |
| 305 callbacks.die.callback = session_die; | |
| 306 callbacks.save_complete.callback = session_save_complete; | |
| 307 callbacks.shutdown_cancelled.callback = session_shutdown_cancelled; | |
| 308 | |
| 309 callbacks.save_yourself.client_data = NULL; | |
| 310 callbacks.die.client_data = NULL; | |
| 311 callbacks.save_complete.client_data = NULL; | |
| 312 callbacks.shutdown_cancelled.client_data = NULL; | |
| 313 | |
| 4544 | 314 if (previous_id) { |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
315 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
316 "Connecting with previous ID %s\n", previous_id); |
| 4544 | 317 } else { |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
318 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
319 "Connecting with no previous ID\n"); |
| 4544 | 320 } |
| 4158 | 321 |
| 322 session = SmcOpenConnection(NULL, "session", SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | | |
| 323 SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, | |
| 324 &callbacks, previous_id, &client_id, ERROR_LENGTH, error); | |
| 325 | |
| 326 if (session == NULL) { | |
| 327 if (error[0] != '\0') { | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
328 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
329 "Connection failed with error: %s\n", error); |
| 4158 | 330 } else { |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
331 gaim_debug(GAIM_DEBUG_ERROR, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
332 "Connetion failed with unknown error.\n"); |
| 4158 | 333 } |
| 334 return; | |
| 335 } | |
| 336 | |
| 337 tmp = SmcVendor(session); | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
338 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
339 "Connected to manager (%s) with client ID %s\n", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
340 tmp, client_id); |
| 4158 | 341 g_free(tmp); |
| 342 | |
| 343 session_managed = TRUE; | |
| 344 gdk_set_sm_client_id(client_id); | |
| 345 | |
| 4265 | 346 tmp = g_get_current_dir(); |
| 347 session_set_string(session, SmCurrentDirectory, tmp); | |
| 348 g_free(tmp); | |
| 349 | |
| 4210 | 350 tmp = g_strdup_printf("%d", (int) getpid()); |
| 4158 | 351 session_set_string(session, SmProcessID, tmp); |
| 352 g_free(tmp); | |
| 353 | |
| 4210 | 354 tmp = g_strdup(g_get_user_name()); |
| 4158 | 355 session_set_string(session, SmUserID, tmp); |
| 356 g_free(tmp); | |
| 357 | |
| 358 session_set_gchar(session, SmRestartStyleHint, (gchar) SmRestartIfRunning); | |
| 359 session_set_string(session, SmProgram, g_get_prgname()); | |
| 360 | |
| 361 myself = g_strdup(argv0); | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
362 gaim_debug(GAIM_DEBUG_MISC, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
363 "Using %s as command\n", myself); |
| 4158 | 364 |
| 8601 | 365 cmd = session_make_command(NULL, config_dir); |
| 4158 | 366 session_set_array(session, SmCloneCommand, cmd); |
| 4281 | 367 g_strfreev(cmd); |
| 4158 | 368 |
| 4265 | 369 /* this is currently useless, but gnome-session warns 'the following applications will not |
| 370 save their current status' bla bla if we don't have it and the user checks 'Save Session' | |
| 371 when they log out */ | |
| 4281 | 372 cmd = g_new(gchar *, 2); |
| 373 cmd[0] = g_strdup("/bin/true"); | |
| 374 cmd[1] = NULL; | |
| 4158 | 375 session_set_array(session, SmDiscardCommand, cmd); |
| 4281 | 376 g_strfreev(cmd); |
| 4158 | 377 |
| 8601 | 378 cmd = session_make_command(client_id, config_dir); |
| 4158 | 379 session_set_array(session, SmRestartCommand, cmd); |
| 4281 | 380 g_strfreev(cmd); |
| 381 | |
| 4158 | 382 g_free(client_id); |
| 383 #endif /* USE_SM */ | |
| 384 } | |
| 385 | |
| 386 void session_end() { | |
| 387 #ifdef USE_SM | |
| 388 if (session == NULL) /* no session to close */ | |
| 389 return; | |
| 390 | |
| 391 SmcCloseConnection(session, 0, NULL); | |
| 392 | |
|
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
393 gaim_debug(GAIM_DEBUG_INFO, "Session Management", |
|
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4544
diff
changeset
|
394 "Connection closed.\n"); |
|
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
8601
diff
changeset
|
395 |
|
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
8601
diff
changeset
|
396 gaim_debug_unregister_category("Session Management"); |
| 4158 | 397 #endif /* USE_SM */ |
| 398 } |
