Mercurial > pidgin
annotate src/main.c @ 5545:7a64114641c3
[gaim-migrate @ 5946]
I've been rewriting the prefs to move from gaimrc to prefs.xml. This will
NOT compile! I don't want to see complaints about this, as it's CVS, and
you should only be using it if you can put up with things like this. Also,
don't ask how long it'll take until it compiles again. It may be several
days. This is a big migration. Even when it works, it may not run right.
However, it's made a lot of progress, and I plan to actively work on it
today and tomorrow.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Thu, 29 May 2003 19:10:24 +0000 |
parents | 933739f789f9 |
children | 7e4de9699da9 |
rev | line source |
---|---|
4489 | 1 /* |
2 * gaim | |
3 * | |
4 * Copyright (C) 1998-1999, Mark Spencer <markster@marko.net> | |
5 * | |
6 * This program is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * This program is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License | |
17 * along with this program; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
22 #ifdef HAVE_CONFIG_H | |
23 #include <config.h> | |
24 #endif | |
25 #ifdef GAIM_PLUGINS | |
26 #ifndef _WIN32 | |
27 #include <dlfcn.h> | |
28 #endif | |
29 #endif /* GAIM_PLUGINS */ | |
30 #include <gtk/gtk.h> | |
31 #ifndef _WIN32 | |
32 #include <gdk/gdkx.h> | |
33 #include <unistd.h> | |
34 #include <sys/socket.h> | |
35 #include <netinet/in.h> | |
36 #include <arpa/inet.h> | |
37 #include <sys/un.h> | |
38 #include <sys/wait.h> | |
39 #endif /* !_WIN32 */ | |
40 #include <gdk/gdk.h> | |
41 #include <sys/types.h> | |
42 #include <sys/stat.h> | |
43 #include <errno.h> | |
44 #include <stdio.h> | |
45 #include <string.h> | |
46 #include <stdarg.h> | |
47 #include <stdlib.h> | |
48 #include <ctype.h> | |
49 #include "prpl.h" | |
4561 | 50 #include "sound.h" |
4489 | 51 #include "gaim.h" |
52 #include "gaim-socket.h" | |
5440 | 53 #include "prefs.h" |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
54 #include "notify.h" |
5228
1a53330dfd34
[gaim-migrate @ 5598]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
55 #include "gtkblist.h" |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
56 #include "gtkdebug.h" |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
57 #include "gtknotify.h" |
5492
a75a952d78db
[gaim-migrate @ 5888]
Christian Hammond <chipx86@chipx86.com>
parents:
5480
diff
changeset
|
58 #include "gtkrequest.h" |
4489 | 59 #if HAVE_SIGNAL_H |
60 #include <signal.h> | |
61 #endif | |
62 #include "locale.h" | |
63 #include <getopt.h> | |
64 | |
65 #ifdef _WIN32 | |
66 #include "win32dep.h" | |
67 #endif | |
68 | |
69 static GtkWidget *name; | |
70 static GtkWidget *pass; | |
71 | |
72 GList *log_conversations = NULL; | |
73 GSList *away_messages = NULL; | |
74 GSList *message_queue = NULL; | |
75 GSList *unread_message_queue = NULL; | |
76 GSList *away_time_queue = NULL; | |
77 | |
78 GtkWidget *mainwindow = NULL; | |
79 | |
4561 | 80 |
4489 | 81 int opt_away = 0; |
4687 | 82 int docklet_count = 0; |
4489 | 83 char *opt_away_arg = NULL; |
84 char *opt_rcfile_arg = NULL; | |
85 int opt_debug = 0; | |
86 #ifdef _WIN32 | |
87 int opt_gdebug = 0; | |
88 #endif | |
89 | |
90 #if HAVE_SIGNAL_H | |
91 /* | |
92 * Lists of signals we wish to catch and those we wish to ignore. | |
93 * Each list terminated with -1 | |
94 */ | |
95 static int catch_sig_list[] = { | |
96 SIGSEGV, | |
97 SIGHUP, | |
98 SIGINT, | |
99 SIGTERM, | |
100 SIGQUIT, | |
101 SIGCHLD, | |
102 -1 | |
103 }; | |
104 | |
105 static int ignore_sig_list[] = { | |
106 SIGPIPE, | |
107 -1 | |
108 }; | |
109 #endif | |
110 | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
111 STATIC_PROTO_INIT |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
112 |
4489 | 113 void do_quit() |
114 { | |
115 /* captain's log, stardate... */ | |
116 system_log(log_quit, NULL, NULL, OPT_LOG_BUDDY_SIGNON | OPT_LOG_MY_SIGNON); | |
117 | |
118 /* the self destruct sequence has been initiated */ | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
119 gaim_event_broadcast(event_quit); |
4489 | 120 |
121 /* transmission ends */ | |
122 signoff_all(); | |
123 | |
124 /* record what we have before we blow it away... */ | |
125 save_prefs(); | |
5534 | 126 gaim_prefs_sync(); |
4489 | 127 |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
128 gaim_debug(GAIM_DEBUG_INFO, "main", "Unloading all plugins\n"); |
5242
fd81a00480ac
[gaim-migrate @ 5613]
Christian Hammond <chipx86@chipx86.com>
parents:
5228
diff
changeset
|
129 gaim_plugins_destroy_all(); |
4489 | 130 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
131 /* XXX */ |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
132 #if 0 |
4489 | 133 #ifdef USE_PERL |
134 /* yup, perl too */ | |
135 perl_end(); | |
136 #endif | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
137 #endif |
4489 | 138 |
139 #ifdef USE_SM | |
140 /* unplug */ | |
141 session_end(); | |
142 #endif | |
143 | |
144 /* and end it all... */ | |
145 gtk_main_quit(); | |
146 } | |
147 | |
4561 | 148 static guint snd_tmout = 0; |
4489 | 149 static gboolean sound_timeout(gpointer data) |
150 { | |
4561 | 151 gaim_sound_set_login_mute(FALSE); |
152 snd_tmout = 0; | |
4489 | 153 return FALSE; |
154 } | |
155 | |
156 /* we need to do this for Oscar because serv_login only starts the login | |
157 * process, it doesn't end there. gaim_setup will be called later from | |
158 * oscar.c, after the buddy list is made and serv_finish_login is called */ | |
159 void gaim_setup(struct gaim_connection *gc) | |
160 { | |
161 if ((sound_options & OPT_SOUND_LOGIN) && (sound_options & OPT_SOUND_SILENT_SIGNON)) { | |
4561 | 162 if(snd_tmout) { |
163 g_source_remove(snd_tmout); | |
164 } | |
165 gaim_sound_set_login_mute(TRUE); | |
4489 | 166 snd_tmout = g_timeout_add(10000, sound_timeout, NULL); |
167 } | |
168 } | |
169 | |
170 static gboolean domiddleclick(GtkWidget *w, GdkEventButton *event, gpointer null) | |
171 { | |
172 if (event->button != 2) | |
173 return FALSE; | |
174 | |
175 auto_login(); | |
176 return TRUE; | |
177 } | |
178 | |
179 static void dologin(GtkWidget *widget, GtkWidget *w) | |
180 { | |
4491 | 181 struct gaim_account *account; |
4489 | 182 const char *username = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(name)->entry)); |
183 const char *password = gtk_entry_get_text(GTK_ENTRY(pass)); | |
184 | |
185 if (!strlen(username)) { | |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
186 gaim_notify_error(NULL, NULL, _("Please enter your login."), NULL); |
4489 | 187 return; |
188 } | |
189 | |
190 /* if there is more than one user of the same name, then fuck | |
191 * them, they just have to use the account editor to sign in | |
192 * the second one */ | |
193 | |
4491 | 194 account = gaim_account_find(username, -1); |
195 if (!account) | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
196 account = gaim_account_new(username, GAIM_PROTO_DEFAULT, |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
197 OPT_ACCT_REM_PASS); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
198 |
4491 | 199 g_snprintf(account->password, sizeof account->password, "%s", password); |
4489 | 200 save_prefs(); |
4491 | 201 serv_login(account); |
4489 | 202 } |
203 | |
204 /* <name> is a comma-separated list of names, or NULL | |
205 if NULL and there is at least one user defined in .gaimrc, try to login. | |
206 if not NULL, parse <name> into separate strings, look up each one in | |
207 .gaimrc and, if it's there, try to login. | |
208 returns: 0 if successful | |
209 -1 if no user was found that had a saved password | |
210 */ | |
211 static int dologin_named(char *name) | |
212 { | |
4491 | 213 struct gaim_account *account; |
4489 | 214 char **names, **n; |
215 int retval = -1; | |
216 | |
217 if (name !=NULL) { /* list of names given */ | |
218 names = g_strsplit(name, ",", 32); | |
219 for (n = names; *n != NULL; n++) { | |
4491 | 220 account = gaim_account_find(*n, -1); |
221 if (account) { /* found a user */ | |
222 if (account->options & OPT_ACCT_REM_PASS) { | |
4489 | 223 retval = 0; |
4491 | 224 serv_login(account); |
4489 | 225 } |
226 } | |
227 } | |
228 g_strfreev(names); | |
229 } else { /* no name given, use default */ | |
4491 | 230 account = (struct gaim_account *)gaim_accounts->data; |
231 if (account->options & OPT_ACCT_REM_PASS) { | |
4489 | 232 retval = 0; |
4491 | 233 serv_login(account); |
4489 | 234 } |
235 } | |
236 | |
237 return retval; | |
238 } | |
239 | |
240 | |
241 static void doenter(GtkWidget *widget, GtkWidget *w) | |
242 { | |
243 if (widget == name) { | |
244 gtk_entry_set_text(GTK_ENTRY(pass), ""); | |
4635 | 245 gtk_editable_select_region(GTK_EDITABLE(GTK_COMBO(name)->entry), 0, 0); |
4489 | 246 gtk_widget_grab_focus(pass); |
247 } else if (widget == pass) { | |
248 dologin(widget, w); | |
249 } | |
250 } | |
251 | |
252 | |
253 static void combo_changed(GtkWidget *w, GtkWidget *combo) | |
254 { | |
255 const char *txt = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry)); | |
4491 | 256 struct gaim_account *account; |
4489 | 257 |
4491 | 258 account = gaim_account_find(txt, -1); |
4489 | 259 |
4491 | 260 if (account && account->options & OPT_ACCT_REM_PASS) { |
261 gtk_entry_set_text(GTK_ENTRY(pass), account->password); | |
4489 | 262 } else { |
263 gtk_entry_set_text(GTK_ENTRY(pass), ""); | |
264 } | |
265 } | |
266 | |
267 | |
268 static GList *combo_user_names() | |
269 { | |
4491 | 270 GSList *accts = gaim_accounts; |
4489 | 271 GList *tmp = NULL; |
4491 | 272 struct gaim_account *account; |
4489 | 273 |
4491 | 274 if (!accts) |
4489 | 275 return g_list_append(NULL, _("<New User>")); |
276 | |
4491 | 277 while (accts) { |
278 account = (struct gaim_account *)accts->data; | |
279 tmp = g_list_append(tmp, account->username); | |
280 accts = accts->next; | |
4489 | 281 } |
282 | |
283 return tmp; | |
284 } | |
285 | |
286 static void login_window_closed(GtkWidget *w, GdkEvent *ev, gpointer d) | |
287 { | |
288 if(docklet_count) { | |
4880
9b51c090236a
[gaim-migrate @ 5210]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4800
diff
changeset
|
289 #ifdef _WIN32 |
4489 | 290 wgaim_systray_minimize(mainwindow); |
291 #endif | |
292 gtk_widget_hide(mainwindow); | |
293 } else | |
294 do_quit(); | |
295 } | |
296 | |
297 void show_login() | |
298 { | |
299 GtkWidget *image; | |
300 GtkWidget *vbox; | |
301 GtkWidget *button; | |
302 GtkWidget *hbox; | |
303 GtkWidget *label; | |
304 GtkWidget *vbox2; | |
305 GList *tmp; | |
306 | |
307 /* Do we already have a main window opened? If so, bring it back, baby... ribs... yeah */ | |
308 if (mainwindow) { | |
309 gtk_window_present(GTK_WINDOW(mainwindow)); | |
310 return; | |
311 } | |
312 | |
313 mainwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
314 | |
315 gtk_window_set_role(GTK_WINDOW(mainwindow), "login"); | |
4635 | 316 gtk_window_set_resizable(GTK_WINDOW(mainwindow), FALSE); |
4703 | 317 gtk_window_set_title(GTK_WINDOW(mainwindow), _("Login")); |
4489 | 318 gtk_widget_realize(mainwindow); |
319 gdk_window_set_group(mainwindow->window, mainwindow->window); | |
320 gtk_container_set_border_width(GTK_CONTAINER(mainwindow), 5); | |
321 g_signal_connect(G_OBJECT(mainwindow), "delete_event", | |
322 G_CALLBACK(login_window_closed), mainwindow); | |
323 | |
324 vbox = gtk_vbox_new(FALSE, 0); | |
325 gtk_container_add(GTK_CONTAINER(mainwindow), vbox); | |
326 | |
5024 | 327 image = gtk_image_new_from_stock(GAIM_STOCK_LOGO, gtk_icon_size_from_name(GAIM_ICON_SIZE_LOGO)); |
4489 | 328 gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, FALSE, 0); |
329 | |
330 vbox2 = gtk_vbox_new(FALSE, 0); | |
331 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5); | |
332 | |
333 label = gtk_label_new(_("Screen Name:")); | |
334 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
335 gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0); | |
336 | |
337 name = gtk_combo_new(); | |
338 tmp = combo_user_names(); | |
339 gtk_combo_set_popdown_strings(GTK_COMBO(name), tmp); | |
340 g_list_free(tmp); | |
341 g_signal_connect(G_OBJECT(GTK_COMBO(name)->entry), "activate", | |
342 G_CALLBACK(doenter), mainwindow); | |
343 g_signal_connect(G_OBJECT(GTK_COMBO(name)->entry), "changed", | |
344 G_CALLBACK(combo_changed), name); | |
345 gtk_box_pack_start(GTK_BOX(vbox2), name, FALSE, TRUE, 0); | |
346 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, TRUE, 0); | |
347 | |
348 vbox2 = gtk_vbox_new(FALSE, 0); | |
349 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 5); | |
350 | |
351 label = gtk_label_new(_("Password:")); | |
352 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
353 gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0); | |
354 | |
355 pass = gtk_entry_new(); | |
356 gtk_entry_set_visibility(GTK_ENTRY(pass), FALSE); | |
357 g_signal_connect(G_OBJECT(pass), "activate", | |
358 G_CALLBACK(doenter), mainwindow); | |
359 gtk_box_pack_start(GTK_BOX(vbox2), pass, FALSE, TRUE, 0); | |
360 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, TRUE, 0); | |
361 | |
362 /* Now for the button box */ | |
363 hbox = gtk_hbox_new(TRUE, 0); | |
364 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 5); | |
365 | |
366 /* And now for the buttons */ | |
5024 | 367 button = gaim_pixbuf_button_from_stock(_("Accounts"), GAIM_STOCK_ACCOUNTS, GAIM_BUTTON_VERTICAL); |
4489 | 368 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
369 g_signal_connect(G_OBJECT(button), "clicked", | |
370 G_CALLBACK(account_editor), mainwindow); | |
371 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
372 | |
373 #ifdef NO_MULTI | |
374 gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE); | |
375 #endif | |
376 | |
5024 | 377 button = gaim_pixbuf_button_from_stock(_("Preferences"), GTK_STOCK_PREFERENCES, GAIM_BUTTON_VERTICAL); |
4489 | 378 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
379 g_signal_connect(G_OBJECT(button), "clicked", | |
5530
2c4c975620f0
[gaim-migrate @ 5930]
Christian Hammond <chipx86@chipx86.com>
parents:
5492
diff
changeset
|
380 G_CALLBACK(gaim_gtk_prefs_show), mainwindow); |
4489 | 381 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); |
382 | |
5024 | 383 button = gaim_pixbuf_button_from_stock(_("Sign On"), GAIM_STOCK_SIGN_ON, GAIM_BUTTON_VERTICAL); |
4489 | 384 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); |
385 g_signal_connect(G_OBJECT(button), "clicked", | |
386 G_CALLBACK(dologin), mainwindow); | |
387 g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(domiddleclick), NULL); | |
388 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); | |
389 | |
390 /* Now grab the focus that we need */ | |
4491 | 391 if (gaim_accounts) { |
392 struct gaim_account *account = gaim_accounts->data; | |
393 if (account->options & OPT_ACCT_REM_PASS) { | |
4489 | 394 combo_changed(NULL, name); |
395 gtk_widget_grab_focus(button); | |
396 } else { | |
397 gtk_widget_grab_focus(pass); | |
398 } | |
399 } else { | |
400 gtk_widget_grab_focus(name); | |
401 } | |
402 | |
403 /* And raise the curtain! */ | |
404 gtk_widget_show_all(mainwindow); | |
405 | |
406 } | |
407 | |
408 #if HAVE_SIGNAL_H | |
409 void sighandler(int sig) | |
410 { | |
411 switch (sig) { | |
412 case SIGHUP: | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
413 gaim_debug(GAIM_DEBUG_WARNING, "sighandler", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
414 "Caught signal %d\n", sig); |
4489 | 415 signoff_all(NULL, NULL); |
416 break; | |
417 case SIGSEGV: | |
418 core_quit(); | |
419 #ifndef DEBUG | |
420 fprintf(stderr, "Gaim has segfaulted and attempted to dump a core file.\n" | |
421 "This is a bug in the software and has happened through\n" | |
422 "no fault of your own.\n\n" | |
423 "It is possible that this bug is already fixed in CVS.\n" | |
424 "You can get a tarball of CVS from the Gaim website, at\n" | |
425 WEBSITE "gaim-CVS.tar.gz.\n\n" | |
426 "If you are already using CVS, or can reproduce the crash\n" | |
427 "using the CVS version, please notify the gaim maintainers\n" | |
428 "by reporting a bug at\n" | |
429 WEBSITE "bug.php\n\n" | |
430 "Please make sure to specify what you were doing at the time,\n" | |
431 "and post the backtrace from the core file. If you do not know\n" | |
432 "how to get the backtrace, please get instructions at\n" | |
433 WEBSITE "gdb.php. If you need further\n" | |
434 "assistance, please IM either RobFlynn or SeanEgn and\n" | |
435 "they can help you.\n"); | |
436 #else | |
437 fprintf(stderr, "Oh no! Segmentation fault!\n"); | |
4703 | 438 /*g_on_error_query (g_get_prgname());*/ |
4489 | 439 exit(1); |
440 #endif | |
441 abort(); | |
442 break; | |
443 case SIGCHLD: | |
444 clean_pid(); | |
445 #if HAVE_SIGNAL_H | |
446 signal(SIGCHLD, sighandler); /* restore signal catching on this one! */ | |
447 #endif | |
448 break; | |
449 default: | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
450 gaim_debug(GAIM_DEBUG_WARNING, "sighandler", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
451 "Caught signal %d\n", sig); |
4489 | 452 signoff_all(NULL, NULL); |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
453 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
454 gaim_plugins_unload_all(); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
455 |
4489 | 456 if (gtk_main_level()) |
457 gtk_main_quit(); | |
458 core_quit(); | |
459 exit(0); | |
460 } | |
461 } | |
462 #endif | |
463 | |
464 #ifndef _WIN32 | |
465 static gboolean socket_readable(GIOChannel *source, GIOCondition cond, gpointer ud) | |
466 { | |
467 guchar type; | |
468 guchar subtype; | |
469 guint32 len; | |
470 guchar *data; | |
471 guint32 x; | |
4793 | 472 GError *error; |
4489 | 473 |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
474 gaim_debug(GAIM_DEBUG_INFO, "core socket", "Core says: "); |
4793 | 475 g_io_channel_read_chars(source, &type, sizeof(type), &x, &error); |
476 if(error) | |
4800 | 477 g_error_free(error); |
4489 | 478 if (x == 0) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
479 gaim_debug(GAIM_DEBUG_ERROR, NULL, "CORE IS GONE!\n"); |
4793 | 480 g_io_channel_shutdown(source, TRUE, &error); |
481 if(error) | |
482 g_free(error); | |
4489 | 483 return FALSE; |
484 } | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
485 gaim_debug(GAIM_DEBUG_INFO, NULL, "%d ", type); |
4793 | 486 g_io_channel_read_chars(source, &subtype, sizeof(subtype), &x, &error); |
487 if(error) | |
4800 | 488 g_error_free(error); |
4489 | 489 if (x == 0) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
490 gaim_debug(GAIM_DEBUG_ERROR, NULL, "CORE IS GONE!\n"); |
4793 | 491 g_io_channel_shutdown(source, TRUE, &error); |
492 if(error) | |
4800 | 493 g_error_free(error); |
4489 | 494 return FALSE; |
495 } | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
496 |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
497 gaim_debug(GAIM_DEBUG_INFO, NULL, "%d ", subtype); |
4793 | 498 g_io_channel_read_chars(source, (guchar *)&len, sizeof(len), &x, &error); |
499 if(error) | |
4800 | 500 g_error_free(error); |
4489 | 501 if (x == 0) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
502 gaim_debug(GAIM_DEBUG_ERROR, NULL, "CORE IS GONE!\n"); |
4793 | 503 g_io_channel_shutdown(source, TRUE, &error); |
504 if(error) | |
4800 | 505 g_error_free(error); |
4489 | 506 return FALSE; |
507 } | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
508 |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
509 gaim_debug(GAIM_DEBUG_INFO, NULL, "(%d bytes)\n", len); |
4489 | 510 |
511 data = g_malloc(len); | |
4793 | 512 g_io_channel_read_chars(source, data, len, &x, &error); |
513 if(error) | |
4800 | 514 g_error_free(error); |
4489 | 515 if (x != len) { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
516 gaim_debug(GAIM_DEBUG_ERROR, "core socket", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
517 "CORE IS GONE! (read %d/%d bytes)\n", x, len); |
4489 | 518 g_free(data); |
4793 | 519 g_io_channel_shutdown(source, TRUE, &error); |
520 if(error) | |
4800 | 521 g_error_free(error); |
4489 | 522 return FALSE; |
523 } | |
524 | |
525 g_free(data); | |
526 return TRUE; | |
527 } | |
528 #endif /* _WIN32 */ | |
529 | |
530 static int ui_main() | |
531 { | |
532 #ifndef _WIN32 | |
533 GIOChannel *channel; | |
534 int UI_fd; | |
535 char name[256]; | |
536 GList *icons = NULL; | |
537 GdkPixbuf *icon = NULL; | |
538 char *icon_path; | |
539 #endif | |
4978 | 540 |
4489 | 541 if (current_smiley_theme == NULL) { |
542 smiley_theme_probe(); | |
543 if (smiley_themes) { | |
544 struct smiley_theme *smile = smiley_themes->data; | |
545 load_smiley_theme(smile->path, TRUE); | |
546 } | |
547 } | |
548 | |
5422 | 549 gaim_gtk_blist_setup_sort_methods(); |
4489 | 550 setup_stock(); |
551 | |
552 #ifndef _WIN32 | |
553 /* use the nice PNG icon for all the windows */ | |
5024 | 554 icon_path = g_build_filename(DATADIR, "pixmaps", "gaim", "icons", "online.png", NULL); |
4489 | 555 icon = gdk_pixbuf_new_from_file(icon_path, NULL); |
556 g_free(icon_path); | |
557 if (icon) { | |
558 icons = g_list_append(icons,icon); | |
559 gtk_window_set_default_icon_list(icons); | |
560 g_object_unref(G_OBJECT(icon)); | |
4978 | 561 g_list_free(icons); |
4489 | 562 } else { |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
563 gaim_debug(GAIM_DEBUG_ERROR, "ui_main", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
564 "Failed to load the default window icon!\n"); |
4489 | 565 } |
566 | |
567 g_snprintf(name, sizeof(name), "%s" G_DIR_SEPARATOR_S "gaim_%s.%d", g_get_tmp_dir(), g_get_user_name(), gaim_session); | |
568 UI_fd = gaim_connect_to_session(0); | |
569 if (UI_fd < 0) | |
570 return 1; | |
571 | |
572 channel = g_io_channel_unix_new(UI_fd); | |
573 g_io_add_watch(channel, G_IO_IN | G_IO_HUP | G_IO_ERR, socket_readable, NULL); | |
574 #endif | |
4978 | 575 |
4489 | 576 return 0; |
577 } | |
578 | |
579 static void set_first_user(char *name) | |
580 { | |
4491 | 581 struct gaim_account *account; |
4489 | 582 |
4491 | 583 account = gaim_account_find(name, -1); |
4489 | 584 |
4491 | 585 if (!account) { /* new user */ |
586 account = g_new0(struct gaim_account, 1); | |
587 g_snprintf(account->username, sizeof(account->username), "%s", name); | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
588 account->protocol = GAIM_PROTO_DEFAULT; |
4491 | 589 gaim_accounts = g_slist_prepend(gaim_accounts, account); |
4489 | 590 } else { /* user already exists */ |
4491 | 591 gaim_accounts = g_slist_remove(gaim_accounts, account); |
592 gaim_accounts = g_slist_prepend(gaim_accounts, account); | |
4489 | 593 } |
594 save_prefs(); | |
595 } | |
596 | |
597 #ifdef _WIN32 | |
598 /* WIN32 print and log handlers */ | |
599 | |
600 static void gaim_dummy_print( const gchar* string ) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
601 return; |
4489 | 602 } |
603 | |
604 static void gaim_dummy_log_handler (const gchar *domain, | |
605 GLogLevelFlags flags, | |
606 const gchar *msg, | |
607 gpointer user_data) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
608 return; |
4489 | 609 } |
610 | |
611 static void gaim_log_handler (const gchar *domain, | |
612 GLogLevelFlags flags, | |
613 const gchar *msg, | |
614 gpointer user_data) { | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
615 gaim_debug(GAIM_DEBUG_MISC, "log", "%s - %s\n", domain, msg); |
4489 | 616 g_log_default_handler(domain, flags, msg, user_data); |
617 } | |
618 #endif /* _WIN32 */ | |
619 | |
620 /* FUCKING GET ME A TOWEL! */ | |
621 #ifdef _WIN32 | |
622 int gaim_main(int argc, char *argv[]) | |
623 #else | |
624 int main(int argc, char *argv[]) | |
625 #endif | |
626 { | |
627 int opt_acct = 0, opt_help = 0, opt_version = 0, opt_login = 0, opt_nologin = 0, dologin_ret = -1; | |
628 char *opt_user_arg = NULL, *opt_login_arg = NULL; | |
629 char *opt_session_arg = NULL; | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
630 char *plugin_search_paths[3]; |
4489 | 631 #if HAVE_SIGNAL_H |
632 int sig_indx; /* for setting up signal catching */ | |
633 sigset_t sigset; | |
634 void (*prev_sig_disp)(); | |
635 #endif | |
636 int opt, opt_user = 0; | |
637 int i; | |
638 | |
639 struct option long_options[] = { | |
640 {"acct", no_argument, NULL, 'a'}, | |
641 /*{"away", optional_argument, NULL, 'w'}, */ | |
642 {"help", no_argument, NULL, 'h'}, | |
643 /*{"login", optional_argument, NULL, 'l'}, */ | |
644 {"loginwin", no_argument, NULL, 'n'}, | |
645 {"user", required_argument, NULL, 'u'}, | |
646 {"file", required_argument, NULL, 'f'}, | |
647 {"debug", no_argument, NULL, 'd'}, | |
648 {"version", no_argument, NULL, 'v'}, | |
649 {"session", required_argument, NULL, 's'}, | |
650 {0, 0, 0, 0} | |
651 }; | |
652 | |
653 #ifdef DEBUG | |
654 opt_debug = 1; | |
655 #endif | |
656 | |
657 #ifdef ENABLE_NLS | |
658 bindtextdomain(PACKAGE, LOCALEDIR); | |
659 bind_textdomain_codeset(PACKAGE, "UTF-8"); | |
660 textdomain(PACKAGE); | |
661 #endif | |
662 | |
663 #if HAVE_SIGNAL_H | |
664 /* Let's not violate any PLA's!!!! */ | |
665 /* jseymour: whatever the fsck that means */ | |
666 /* Robot101: for some reason things like gdm like to block * | |
667 * useful signals like SIGCHLD, so we unblock all the ones we * | |
668 * declare a handler for. thanks JSeymour and Vann. */ | |
669 if (sigemptyset(&sigset)) { | |
670 char errmsg[BUFSIZ]; | |
5435 | 671 snprintf(errmsg, BUFSIZ, "Warning: couldn't initialise empty signal set"); |
4489 | 672 perror(errmsg); |
673 } | |
674 for(sig_indx = 0; catch_sig_list[sig_indx] != -1; ++sig_indx) { | |
675 if((prev_sig_disp = signal(catch_sig_list[sig_indx], sighandler)) == SIG_ERR) { | |
676 char errmsg[BUFSIZ]; | |
5435 | 677 snprintf(errmsg, BUFSIZ, "Warning: couldn't set signal %d for catching", |
4489 | 678 catch_sig_list[sig_indx]); |
679 perror(errmsg); | |
680 } | |
681 if(sigaddset(&sigset, catch_sig_list[sig_indx])) { | |
682 char errmsg[BUFSIZ]; | |
5435 | 683 snprintf(errmsg, BUFSIZ, "Warning: couldn't include signal %d for unblocking", |
4489 | 684 catch_sig_list[sig_indx]); |
685 perror(errmsg); | |
686 } | |
687 } | |
688 for(sig_indx = 0; ignore_sig_list[sig_indx] != -1; ++sig_indx) { | |
689 if((prev_sig_disp = signal(ignore_sig_list[sig_indx], SIG_IGN)) == SIG_ERR) { | |
690 char errmsg[BUFSIZ]; | |
5435 | 691 snprintf(errmsg, BUFSIZ, "Warning: couldn't set signal %d to ignore", |
4489 | 692 ignore_sig_list[sig_indx]); |
693 perror(errmsg); | |
694 } | |
695 } | |
696 | |
697 if (sigprocmask(SIG_UNBLOCK, &sigset, NULL)) { | |
698 char errmsg[BUFSIZ]; | |
5435 | 699 snprintf(errmsg, BUFSIZ, "Warning: couldn't unblock signals"); |
4489 | 700 perror(errmsg); |
701 } | |
702 #endif | |
703 | |
704 for (i = 0; i < argc; i++) { | |
705 /* --login option */ | |
706 if (strstr(argv[i], "--l") == argv[i]) { | |
707 char *equals; | |
708 opt_login = 1; | |
709 if ((equals = strchr(argv[i], '=')) != NULL) { | |
710 /* --login=NAME */ | |
711 opt_login_arg = g_strdup(equals + 1); | |
712 if (strlen(opt_login_arg) == 0) { | |
713 g_free(opt_login_arg); | |
714 opt_login_arg = NULL; | |
715 } | |
716 } else if (i + 1 < argc && argv[i + 1][0] != '-') { | |
717 /* --login NAME */ | |
718 opt_login_arg = g_strdup(argv[i + 1]); | |
719 strcpy(argv[i + 1], " "); | |
720 } | |
721 strcpy(argv[i], " "); | |
722 } | |
723 /* -l option */ | |
724 else if (strstr(argv[i], "-l") == argv[i]) { | |
725 opt_login = 1; | |
726 if (strlen(argv[i]) > 2) { | |
727 /* -lNAME */ | |
728 opt_login_arg = g_strdup(argv[i] + 2); | |
729 } else if (i + 1 < argc && argv[i + 1][0] != '-') { | |
730 /* -l NAME */ | |
731 opt_login_arg = g_strdup(argv[i + 1]); | |
732 strcpy(argv[i + 1], " "); | |
733 } | |
734 strcpy(argv[i], " "); | |
735 } | |
736 /* --away option */ | |
737 else if (strstr(argv[i], "--aw") == argv[i]) { | |
738 char *equals; | |
739 opt_away = 1; | |
740 if ((equals = strchr(argv[i], '=')) != NULL) { | |
741 /* --away=MESG */ | |
742 opt_away_arg = g_strdup(equals + 1); | |
743 if (strlen(opt_away_arg) == 0) { | |
744 g_free(opt_away_arg); | |
745 opt_away_arg = NULL; | |
746 } | |
747 } else if (i + 1 < argc && argv[i + 1][0] != '-') { | |
748 /* --away MESG */ | |
749 opt_away_arg = g_strdup(argv[i + 1]); | |
750 strcpy(argv[i + 1], " "); | |
751 } | |
752 strcpy(argv[i], " "); | |
753 } | |
754 /* -w option */ | |
755 else if (strstr(argv[i], "-w") == argv[i]) { | |
756 opt_away = 1; | |
757 if (strlen(argv[i]) > 2) { | |
758 /* -wMESG */ | |
759 opt_away_arg = g_strdup(argv[i] + 2); | |
760 } else if (i + 1 < argc && argv[i + 1][0] != '-') { | |
761 /* -w MESG */ | |
762 opt_away_arg = g_strdup(argv[i + 1]); | |
763 strcpy(argv[i + 1], " "); | |
764 } | |
765 strcpy(argv[i], " "); | |
766 } | |
767 } | |
768 /* | |
769 if (opt_login) { | |
770 printf ("--login given with arg %s\n", | |
771 opt_login_arg ? opt_login_arg : "NULL"); | |
772 exit(0); | |
773 } | |
774 */ | |
775 | |
776 gtk_set_locale(); | |
777 gtk_init(&argc, &argv); | |
778 | |
779 /* scan command-line options */ | |
780 opterr = 1; | |
781 while ((opt = getopt_long(argc, argv, | |
782 #ifndef _WIN32 | |
783 "adhu:f:vns:", | |
784 #else | |
785 "adghu:f:vn", | |
786 #endif | |
787 long_options, NULL)) != -1) { | |
788 switch (opt) { | |
789 case 'u': /* set user */ | |
790 opt_user = 1; | |
791 opt_user_arg = g_strdup(optarg); | |
792 break; | |
793 case 'a': /* account editor */ | |
794 opt_acct = 1; | |
795 break; | |
796 case 'd': /* debug */ | |
797 opt_debug = 1; | |
798 break; | |
799 case 'f': | |
800 opt_rcfile_arg = g_strdup(optarg); | |
801 break; | |
802 case 's': /* use existing session ID */ | |
803 opt_session_arg = g_strdup(optarg); | |
804 break; | |
805 case 'v': /* version */ | |
806 opt_version = 1; | |
807 break; | |
808 case 'h': /* help */ | |
809 opt_help = 1; | |
810 break; | |
811 case 'n': /* don't autologin */ | |
812 opt_nologin = 1; | |
813 break; | |
814 #ifdef _WIN32 | |
815 case 'g': /* debug GTK and GLIB */ | |
816 opt_gdebug = 1; | |
817 break; | |
818 #endif | |
819 case '?': | |
820 default: | |
821 show_usage(1, argv[0]); | |
822 return 0; | |
823 break; | |
824 } | |
825 } | |
826 | |
827 #ifdef _WIN32 | |
828 /* We don't want a console window.. */ | |
829 /* | |
830 * Any calls to the glib logging functions, result in a call to AllocConsole(). | |
831 * ME and 98 will in such cases produce a console window (2000 not), despite | |
832 * being built as a windows app rather than a console app. So we should either | |
833 * ignore messages by setting dummy log handlers, or redirect messages. | |
834 * This requires setting handlers for all domains (any lib which uses g_logging). | |
835 */ | |
836 | |
837 g_log_set_handler (NULL, G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
838 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
839 NULL); | |
840 g_log_set_handler ("Gdk", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
841 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
842 NULL); | |
843 g_log_set_handler ("Gtk", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
844 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
845 NULL); | |
846 g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
847 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
848 NULL); | |
849 g_log_set_handler ("GModule", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
850 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
851 NULL); | |
852 g_log_set_handler ("GLib-GObject", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
853 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
854 NULL); | |
855 g_log_set_handler ("GThread", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, | |
856 (opt_gdebug ? gaim_log_handler : gaim_dummy_log_handler), | |
857 NULL); | |
858 | |
859 /* g_print also makes a call to AllocConsole(), therefore a handler needs to be | |
860 set here aswell */ | |
861 if(!opt_debug) | |
862 g_set_print_handler( gaim_dummy_print ); | |
863 | |
864 #endif | |
865 | |
866 /* show help message */ | |
867 if (opt_help) { | |
868 show_usage(0, argv[0]); | |
869 return 0; | |
870 } | |
871 /* show version message */ | |
872 if (opt_version) { | |
873 printf("Gaim %s\n",VERSION); | |
874 return 0; | |
875 } | |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
876 |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
877 /* Set the UI operation structures. */ |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
878 gaim_set_debug_ui_ops(gaim_get_gtk_debug_ui_ops()); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
879 gaim_set_win_ui_ops(gaim_get_gtk_window_ui_ops()); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
880 gaim_set_xfer_ui_ops(gaim_get_gtk_xfer_ui_ops()); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
881 gaim_set_blist_ui_ops(gaim_get_gtk_blist_ui_ops()); |
5436
ad445074d239
[gaim-migrate @ 5818]
Christian Hammond <chipx86@chipx86.com>
parents:
5435
diff
changeset
|
882 gaim_set_notify_ui_ops(gaim_get_gtk_notify_ui_ops()); |
5480
f19620d8694f
[gaim-migrate @ 5876]
Christian Hammond <chipx86@chipx86.com>
parents:
5440
diff
changeset
|
883 gaim_set_request_ui_ops(gaim_get_gtk_request_ui_ops()); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
884 |
5530
2c4c975620f0
[gaim-migrate @ 5930]
Christian Hammond <chipx86@chipx86.com>
parents:
5492
diff
changeset
|
885 gaim_prefs_init(); |
2c4c975620f0
[gaim-migrate @ 5930]
Christian Hammond <chipx86@chipx86.com>
parents:
5492
diff
changeset
|
886 gaim_gtk_prefs_init(); |
5545
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5535
diff
changeset
|
887 |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5535
diff
changeset
|
888 if (!gaim_prefs_load()) |
7a64114641c3
[gaim-migrate @ 5946]
Christian Hammond <chipx86@chipx86.com>
parents:
5535
diff
changeset
|
889 load_prefs(); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
890 |
5205
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
891 plugin_search_paths[0] = LIBDIR; |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
892 plugin_search_paths[1] = gaim_user_dir(); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
893 plugin_search_paths[2] = g_strdup_printf("%s/plugins", gaim_user_dir()); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
894 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
895 gaim_plugins_set_search_paths(sizeof(plugin_search_paths) / |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
896 sizeof(*plugin_search_paths), |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
897 plugin_search_paths); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
898 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
899 g_free(plugin_search_paths[2]); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
900 |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
901 gaim_plugins_probe(NULL); |
fefad67de2c7
[gaim-migrate @ 5573]
Christian Hammond <chipx86@chipx86.com>
parents:
5032
diff
changeset
|
902 |
4489 | 903 #ifdef _WIN32 |
904 /* Various win32 initializations */ | |
905 wgaim_init(); | |
906 #endif | |
907 | |
908 core_main(); | |
5032
cb700c07ee07
[gaim-migrate @ 5375]
Christian Hammond <chipx86@chipx86.com>
parents:
5024
diff
changeset
|
909 load_pounces(); |
4489 | 910 ui_main(); |
911 | |
912 #ifdef USE_SM | |
913 session_init(argv[0], opt_session_arg); | |
914 #endif | |
915 if (opt_session_arg != NULL) { | |
916 g_free(opt_session_arg); | |
917 opt_session_arg = NULL; | |
918 }; | |
919 | |
920 /* set the default username */ | |
921 if (opt_user_arg != NULL) { | |
922 set_first_user(opt_user_arg); | |
923 g_free(opt_user_arg); | |
924 opt_user_arg = NULL; | |
925 } | |
926 | |
5535 | 927 if (gaim_prefs_get_bool("/gaim/gtk/debug/enabled")) |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
5205
diff
changeset
|
928 gaim_gtk_debug_window_show(); |
4489 | 929 |
930 static_proto_init(); | |
931 | |
932 /* deal with --login */ | |
933 if (opt_login) { | |
934 dologin_ret = dologin_named(opt_login_arg); | |
935 if (opt_login_arg != NULL) { | |
936 g_free(opt_login_arg); | |
937 opt_login_arg = NULL; | |
938 } | |
939 } | |
940 | |
941 if (!opt_acct && !opt_nologin && gaim_session == 0) | |
942 auto_login(); | |
943 | |
944 if (opt_acct) { | |
945 account_editor(NULL, NULL); | |
946 } else if ((dologin_ret == -1) && !connections) | |
947 show_login(); | |
948 | |
949 gtk_main(); | |
950 core_quit(); | |
4561 | 951 gaim_sound_quit(); |
4489 | 952 #ifdef _WIN32 |
953 wgaim_cleanup(); | |
954 #endif | |
955 return 0; | |
956 | |
957 } |