Mercurial > pidgin
annotate src/gtkdialogs.c @ 10475:94fd0bf8c4b1
[gaim-migrate @ 11762]
sf patch #1094341, from Richard Laager
implements sf rfe #1090971
"tracks when a buddy was last seen and displays this value in the
tooltip for offline and "signing on" buddies."
The changes for this feature were pretty small and self-contained,
and it's a neat feature.
Then I started changing other things. I changed the way tooltips are
created to use GStrings. I think it's easier to make changes without
screwing stuff up, and the code is hopefully a bit easier to read through.
I also changed how Add a Chat and Join a Chat work slightly. Now
PRPLs can specify if a field is required or not, and the dialogs
will not allow the user to click on "ok" if the field is not filled
in. For example, when joining an oscar chat, the room name MUST be
specified.
This change and I think something else minor should fix the problem with
adding chats to the buddy list that didn't have names.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 05 Jan 2005 05:52:10 +0000 |
parents | 151fcda069bc |
children | 387d06e21ae3 |
rev | line source |
---|---|
9709 | 1 /* |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10266
diff
changeset
|
2 * @file gtkdialogs.c GTK+ Dialogs |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10266
diff
changeset
|
3 * @ingroup gtkui |
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10266
diff
changeset
|
4 * |
9709 | 5 * gaim |
6 * | |
7 * Gaim is the legal property of its developers, whose names are too numerous | |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
10 * | |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
9791 | 25 #include "internal.h" |
26 #include "gtkgaim.h" | |
9709 | 27 |
28 #include "debug.h" | |
29 #include "notify.h" | |
30 #include "prpl.h" | |
31 #include "request.h" | |
32 #include "util.h" | |
33 | |
34 #include "gtkdialogs.h" | |
35 #include "gtkimhtml.h" | |
36 #include "gtkimhtmltoolbar.h" | |
37 #include "gtklog.h" | |
38 #include "gtkutils.h" | |
10297
ec140184437b
[gaim-migrate @ 11480]
Luke Schierer <lschiere@pidgin.im>
parents:
10266
diff
changeset
|
39 #include "gtkstock.h" |
9709 | 40 |
9753 | 41 static GList *dialogwindows = NULL; |
9709 | 42 |
9753 | 43 static GtkWidget *about = NULL; |
9709 | 44 |
45 struct warning { | |
46 GtkWidget *window; | |
47 GtkWidget *anon; | |
48 char *who; | |
49 GaimConnection *gc; | |
50 }; | |
51 | |
9758 | 52 struct developer { |
53 char *name; | |
54 char *role; | |
55 char *email; | |
56 }; | |
57 | |
58 struct translator { | |
59 char *language; | |
60 char *abbr; | |
61 char *name; | |
62 char *email; | |
63 }; | |
64 | |
65 static struct developer developers[] = { | |
66 {"Rob Flynn", N_("maintainer"), "gaim@robflynn.com"}, | |
67 {"Sean Egan", N_("lead developer"), "sean.egan@binghamton.edu"}, | |
68 {"Christian 'ChipX86' Hammond", N_("developer & webmaster"), NULL}, | |
10095
b28f9be379b3
[gaim-migrate @ 11114]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
9991
diff
changeset
|
69 {"Herman Bloggs", N_("win32 port"), "herman@bluedigits.com"}, |
9758 | 70 {"Nathan 'faceprint' Walp", N_("developer"), NULL}, |
71 {"Mark 'KingAnt' Doliner", N_("developer"), NULL}, | |
72 {"Ethan 'Paco-Paco' Blanton", N_("developer"), NULL}, | |
10370
acd5b7af0409
[gaim-migrate @ 11590]
Luke Schierer <lschiere@pidgin.im>
parents:
10369
diff
changeset
|
73 {"Etan 'deryni' Reisner", N_("developer"), NULL}, |
9758 | 74 {"Tim 'marv' Ringenbach", N_("developer"), NULL}, |
10369
584c792dd15c
[gaim-migrate @ 11588]
Luke Schierer <lschiere@pidgin.im>
parents:
10324
diff
changeset
|
75 {"Luke 'LSchiere' Schierer", N_("support"), "lschiere@users.sf.net"}, |
10116 | 76 {"Stu 'nosnilmot' Tomlinson", N_("developer"), NULL}, |
9758 | 77 {NULL, NULL, NULL} |
78 }; | |
79 | |
10372
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
80 static struct developer patch_writers[] = { |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
81 {"Daniel 'datallah' Atallah", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
82 {"Ka-Hing 'javabsp' Cheung", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
83 {"Felipe 'shx' Contreras", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
84 {"Decklin Foster", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
85 {"Gary 'grim' Kramlich", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
86 {"Robert 'Robot101' McQueen", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
87 {"Benjamin Miller", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
88 {"Kevin 'SimGuy' Stange", NULL, NULL}, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
89 {NULL, NULL, NULL} |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
90 }; |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
91 |
9758 | 92 static struct developer retired_developers[] = { |
93 {"Adam Fritzler", N_("former libfaim maintainer"), NULL}, | |
94 {"Eric Warmenhoven", N_("former lead developer"), "warmenhoven@yahoo.com"}, | |
95 {"Jim Duchek", N_("former maintainer"), NULL}, | |
96 {"Jim Seymour", N_("former Jabber developer"), NULL}, | |
97 {"Mark Spencer", N_("original author"), "markster@marko.net"}, | |
98 {"Syd Logan", N_("hacker and designated driver [lazy bum]"), NULL}, | |
99 {NULL, NULL, NULL} | |
100 }; | |
101 | |
102 static struct translator current_translators[] = { | |
103 {N_("Bulgarian"), "bg", "Alexander Shopov", "al_shopov@users.sf.net"}, | |
10131 | 104 {N_("Catalan"), "ca", "Josep Puigdemont", "tradgnome@softcatala.org"}, |
9758 | 105 {N_("Czech"), "cs", "Miloslav Trmac", "mitr@volny.cz"}, |
106 {N_("Danish"), "da", "Morten Brix Pedersen", "morten@wtf.dk"}, | |
10131 | 107 {N_("Australian English"), "en_AU", "Peter Lawler", "trans@six-by-nine.com.au"}, |
9758 | 108 {N_("British English"), "en_GB", "Luke Ross", "lukeross@sys3175.co.uk"}, |
109 {N_("Canadian English"), "en_CA", "Adam Weinberger", "adamw@gnome.org"}, | |
110 {N_("German"), "de", "Björn Voigt", "bjoern@cs.tu-berlin.de"}, | |
111 {N_("Spanish"), "es", "Javier Fernández-Sanguino Peña", "jfs@debian.org"}, | |
112 {N_("Finnish"), "fi", "Arto Alakulju", "arto@alakulju.net"}, | |
113 {N_("French"), "fr", "Éric Boumaour", "zongo_fr@users.sourceforge.net"}, | |
114 {N_("Hebrew"), "he", "Pavel Bibergal", "cyberkm203@hotmail.com"}, | |
115 {N_("Hindi"), "hi", "Ravishankar Shrivastava", "raviratlami@yahoo.com"}, | |
116 {N_("Hungarian"), "hu", "Zoltan Sutto", "suttozoltan@chello.hu"}, | |
117 {N_("Italian"), "it", "Claudio Satriano", "satriano@na.infn.it"}, | |
118 {N_("Japanese"), "ja", "Takashi Aihana", "aihana@gnome.gr.jp"}, | |
119 {N_("Lithuanian"), "lt", "Gediminas Čičinskas", "gediminas@parok.lt"}, | |
120 {N_("Korean"), "ko", "Kyung-uk Son", "vvs740@chol.com"}, | |
121 {N_("Dutch; Flemish"), "nl", "Vincent van Adrighem", "V.vanAdrighem@dirck.mine.nu"}, | |
122 {N_("Macedonian"), "mk", "Tomislav Markovski", "herrera@users.sf.net"}, | |
123 {N_("Norwegian"), "no", "Petter Johan Olsen", "petter.olsen@cc.uit.no"}, | |
124 {N_("Polish"), "pl", "Krzysztof Foltman, Emil Nowak", "krzysztof@foltman.com;emil5@go2.pl"}, | |
125 {N_("Portuguese"), "pt", "Duarte Henriques", "duarte_henriques@myrealbox.com"}, | |
126 {N_("Portuguese-Brazil"), "pt_BR", "Maurício de Lemos Rodrigues Collares Neto", "mauricioc@gmail.com"}, | |
127 {N_("Romanian"), "ro", "Mişu Moldovan", "dumol@go.ro"}, | |
128 {N_("Russian"), "ru", "Dmitry Beloglazov", "dmaa@users.sf.net"}, | |
129 {N_("Serbian"), "sr", "Danilo Šegan, Aleksandar Urosevic", "dsegan@gmx.net;urke@users.sourceforge.net"}, | |
130 {N_("Slovenian"), "sl", "Matjaz Horvat", "matjaz@owca.info"}, | |
131 {N_("Swedish"), "sv", "Tore Lundqvist", "tlt@mima.x.se"}, | |
132 {N_("Vietnamese"), "vi", N_("T.M.Thanh and the Gnome-Vi Team"), "gnomevi-list@lists.sf.net"}, | |
133 {N_("Simplified Chinese"), "zh_CN", "Funda Wang", "fundawang@linux.net.cn"}, | |
134 {N_("Traditional Chinese"), "zh_TW", "Ambrose C. Li, Paladin R. Liu", "acli@ada.dhs.org;paladin@ms1.hinet.net"}, | |
135 {NULL, NULL, NULL, NULL} | |
136 }; | |
137 | |
138 | |
139 static struct translator past_translators[] = { | |
140 {N_("Amharic"), "am", "Daniel Yacob", NULL}, | |
141 {N_("Bulgarian"), "bg", "Hristo Todorov", NULL}, | |
142 {N_("Catalan"), "ca", "JM Pérez Cáncer", NULL}, | |
10131 | 143 {N_("Catalan"), "ca", "Robert Millan", NULL}, |
9758 | 144 {N_("Czech"), "cs", "Honza Král", NULL}, |
145 {N_("German"), "de", "Daniel Seifert, Karsten Weiss", NULL}, | |
146 {N_("Spanish"), "es", "Amaya Rodrigo, Alejandro G Villar, Nicolás Lichtmaier, JM Pérez Cáncer", NULL}, | |
147 {N_("Finnish"), "fi", "Tero Kuusela", NULL}, | |
148 {N_("French"), "fr", "Sébastien François, Stéphane Pontier, Stéphane Wirtel, Loïc Jeannin", NULL}, | |
149 {N_("Italian"), "it", "Salvatore di Maggio", NULL}, | |
150 {N_("Japanese"), "ja", "Ryosuke Kutsuna, Taku Yasui, Junichi Uekawa", NULL}, | |
151 {N_("Korean"), "ko", "Sang-hyun S, A Ho-seok Lee", NULL}, | |
152 {N_("Polish"), "pl", "Przemysław Sułek", NULL}, | |
153 {N_("Russian"), "ru", "Sergey Volozhanin", NULL}, | |
154 {N_("Russian"), "ru", "Alexandre Prokoudine", NULL}, | |
155 {N_("Slovak"), "sk", "Daniel Režný", NULL}, | |
156 {N_("Swedish"), "sv", "Christian Rose", NULL}, | |
157 {N_("Chinese"), "zh_CN, zh_TW", "Hashao, Rocky S. Lee", NULL}, | |
158 {NULL, NULL, NULL, NULL} | |
159 }; | |
160 | |
9730 | 161 void |
162 gaim_gtkdialogs_destroy_all() | |
9709 | 163 { |
9753 | 164 while (dialogwindows) { |
165 gtk_widget_destroy(dialogwindows->data); | |
166 dialogwindows = g_list_remove(dialogwindows, dialogwindows->data); | |
167 } | |
168 } | |
169 | |
170 static void destroy_about() | |
171 { | |
172 if (about != NULL) | |
173 gtk_widget_destroy(about); | |
174 about = NULL; | |
175 } | |
176 | |
177 void gaim_gtkdialogs_about(GtkWidget *w, void *data) | |
178 { | |
179 GtkWidget *hbox; | |
180 GtkWidget *vbox; | |
181 GtkWidget *logo; | |
10175 | 182 GtkWidget *frame; |
9753 | 183 GtkWidget *text; |
184 GtkWidget *bbox; | |
185 GtkWidget *button; | |
186 GtkTextIter iter; | |
9758 | 187 GString *str; |
188 int i; | |
10266 | 189 AtkObject *obj; |
9753 | 190 |
191 if (about != NULL) { | |
192 gtk_window_present(GTK_WINDOW(about)); | |
193 return; | |
194 } | |
195 | |
196 GAIM_DIALOG(about); | |
197 gtk_window_set_default_size(GTK_WINDOW(about), 450, -1); | |
198 gtk_window_set_title(GTK_WINDOW(about), _("About Gaim")); | |
199 gtk_window_set_role(GTK_WINDOW(about), "about"); | |
200 gtk_window_set_resizable(GTK_WINDOW(about), TRUE); | |
9778 | 201 gtk_window_set_default_size(GTK_WINDOW(about), 340, 550); /* Golden ratio in da hizzy */ |
9753 | 202 |
203 hbox = gtk_hbox_new(FALSE, 12); | |
204 gtk_container_set_border_width(GTK_CONTAINER(hbox), 12); | |
205 gtk_container_add(GTK_CONTAINER(about), hbox); | |
206 | |
207 vbox = gtk_vbox_new(FALSE, 12); | |
208 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
209 | |
210 logo = gtk_image_new_from_stock(GAIM_STOCK_LOGO, gtk_icon_size_from_name(GAIM_ICON_SIZE_LOGO)); | |
10266 | 211 obj = gtk_widget_get_accessible(logo); |
212 atk_object_set_description(obj, "Gaim " VERSION); | |
9753 | 213 gtk_box_pack_start(GTK_BOX(vbox), logo, FALSE, FALSE, 0); |
214 | |
10175 | 215 frame = gaim_gtk_create_imhtml(FALSE, &text, NULL); |
216 gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); | |
9753 | 217 |
9758 | 218 str = g_string_sized_new(4096); |
9753 | 219 |
10153 | 220 g_string_append(str, |
9758 | 221 _("Gaim is a modular messaging client capable of using " |
222 "AIM, MSN, Yahoo!, Jabber, ICQ, IRC, SILC, " | |
223 "Novell GroupWise, Napster, Zephyr, and Gadu-Gadu " | |
224 "all at once. It is written using " | |
225 "Gtk+ and is licensed under the GPL.<BR><BR>")); | |
9753 | 226 |
9758 | 227 g_string_append(str, "<FONT SIZE=\"4\">URL:</FONT> <A HREF=\"" |
228 GAIM_WEBSITE "\">" GAIM_WEBSITE "</A><BR/><BR/>"); | |
229 | |
230 g_string_append_printf(str, _("<FONT SIZE=\"4\">IRC:</FONT> " | |
231 "#gaim on irc.freenode.net<BR><BR>")); | |
9753 | 232 |
233 /* Active Developers */ | |
9758 | 234 g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>", |
235 _("Active Developers")); | |
236 for (i = 0; developers[i].name != NULL; i++) { | |
237 if (developers[i].email != NULL) { | |
10116 | 238 g_string_append_printf(str, " %s (%s) <<a href=\"mailto:%s\">%s</a>><br/>", |
9758 | 239 developers[i].name, _(developers[i].role), |
240 developers[i].email, developers[i].email); | |
241 } else { | |
242 g_string_append_printf(str, " %s (%s)<br/>", | |
243 developers[i].name, _(developers[i].role)); | |
244 } | |
245 } | |
246 g_string_append(str, "<BR/>"); | |
9709 | 247 |
9753 | 248 /* Crazy Patch Writers */ |
9758 | 249 g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>", |
250 _("Crazy Patch Writers")); | |
10372
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
251 for (i = 0; patch_writers[i].name != NULL; i++) { |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
252 if (patch_writers[i].email != NULL) { |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
253 g_string_append_printf(str, " %s <<a href=\"mailto:%s\">%s</a>><br/>", |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
254 patch_writers[i].name, |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
255 patch_writers[i].email, patch_writers[i].email); |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
256 } else { |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
257 g_string_append_printf(str, " %s<br/>", |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
258 patch_writers[i].name); |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
259 } |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
260 } |
618a330c0260
[gaim-migrate @ 11595]
Luke Schierer <lschiere@pidgin.im>
parents:
10371
diff
changeset
|
261 g_string_append(str, "<BR/>"); |
9753 | 262 |
263 /* Retired Developers */ | |
9758 | 264 g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>", |
265 _("Retired Developers")); | |
266 for (i = 0; retired_developers[i].name != NULL; i++) { | |
267 if (retired_developers[i].email != NULL) { | |
10116 | 268 g_string_append_printf(str, " %s (%s) <<a href=\"mailto:%s\">%s</a>><br/>", |
9758 | 269 retired_developers[i].name, _(retired_developers[i].role), |
270 retired_developers[i].email, retired_developers[i].email); | |
271 } else { | |
272 g_string_append_printf(str, " %s (%s)<br/>", | |
273 retired_developers[i].name, _(retired_developers[i].role)); | |
274 } | |
275 } | |
276 g_string_append(str, "<BR/>"); | |
9753 | 277 |
278 /* Current Translators */ | |
9758 | 279 g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>", |
280 _("Current Translators")); | |
281 for (i = 0; current_translators[i].language != NULL; i++) { | |
282 if (current_translators[i].email != NULL) { | |
10116 | 283 g_string_append_printf(str, " <b>%s (%s)</b> - %s <<a href=\"mailto:%s\">%s</a>><br/>", |
9758 | 284 _(current_translators[i].language), |
285 current_translators[i].abbr, | |
286 _(current_translators[i].name), | |
287 current_translators[i].email, | |
288 current_translators[i].email); | |
289 } else { | |
290 g_string_append_printf(str, " <b>%s (%s)</b> - %s<br/>", | |
291 _(current_translators[i].language), | |
292 current_translators[i].abbr, | |
293 _(current_translators[i].name)); | |
294 } | |
295 } | |
296 g_string_append(str, "<BR/>"); | |
9753 | 297 |
298 /* Past Translators */ | |
9758 | 299 g_string_append_printf(str, "<FONT SIZE=\"4\">%s:</FONT><BR/>", |
300 _("Past Translators")); | |
301 for (i = 0; past_translators[i].language != NULL; i++) { | |
302 if (past_translators[i].email != NULL) { | |
10116 | 303 g_string_append_printf(str, " <b>%s (%s)</b> - %s <<a href=\"mailto:%s\">%s</a>><br/>", |
9758 | 304 _(past_translators[i].language), |
305 past_translators[i].abbr, | |
306 _(past_translators[i].name), | |
307 past_translators[i].email, | |
308 past_translators[i].email); | |
309 } else { | |
310 g_string_append_printf(str, " <b>%s (%s)</b> - %s<br/>", | |
311 _(past_translators[i].language), | |
312 past_translators[i].abbr, | |
313 _(past_translators[i].name)); | |
314 } | |
315 } | |
316 g_string_append(str, "<BR/>"); | |
317 | |
10411 | 318 /* The following primarly intented for user/developer interaction and thus |
319 ought not be translated */ | |
320 g_string_append(str, "<b>Gaim was compiled with the following:</b><br/>"); | |
321 #ifdef CONFIG_ARGS /* win32 build doesn't use configure */ | |
322 g_string_append(str, "Arguments to <i>./configure</i>: " CONFIG_ARGS "<br/>"); | |
323 #endif | |
324 #ifdef DEBUG | |
325 g_string_append(str, "Print debugging messages: Yes<br/>"); | |
326 #else | |
327 g_string_append(str, "Print debugging messages: No<br/>"); | |
328 #endif /* DEBUG */ | |
329 #ifdef ENABLE_BINRELOC | |
330 g_string_append(str, "Binary relocation: Enabled<br/>"); | |
331 #else | |
332 g_string_append(str, "Binary relocation: Disabled<br/>"); | |
333 #endif /* ENABLE_BINRELOC */ | |
334 #ifdef GAIM_PLUGINS | |
335 g_string_append(str, "Plugins: Enabled<br/>"); | |
336 #else | |
337 g_string_append(str, "Plugins: Disabled<br/>"); | |
338 #endif /* GAIM_PLUGINS */ | |
339 #ifdef HAVE_SSL | |
340 g_string_append(str, "SSL: Gaim was compiled with SSL support<br/>"); | |
341 #else | |
342 g_string_append(str, "SSL: Gaim was <b><i>NOT</i></b> compiled with any SSL support!<br/>"); | |
343 #endif | |
344 #ifdef HAVE_GNUTLS | |
345 g_string_append(str, "GNUTLS: Enabled<br/>"); | |
346 #else | |
347 g_string_append(str, "GNUTLS: Disabled<br/>"); | |
348 #endif | |
349 #ifdef HAVE_NSS | |
350 g_string_append(str, "NSS: Enabled<br/>"); | |
351 #else | |
352 g_string_append(str, "NSS: Disabled<br/>"); | |
353 #endif | |
354 #ifdef HAVE_TK | |
355 g_string_append(str, "TK: Yes<br/>"); | |
356 #else | |
357 g_string_append(str, "TK: No<br/>"); | |
358 #endif | |
359 #ifdef LIBZEPHYR_EXT | |
360 g_string_append(str, "External libzephyr: Yes<br/>"); | |
361 #else | |
362 g_string_append(str, "External libzephyr: No<br/>"); | |
363 #endif | |
364 #ifdef ZEPHYR_USES_KERBEROS | |
365 g_string_append(str, "Zephyr uses Kerberos: Yes<br/>"); | |
366 #else | |
367 g_string_append(str, "Zephyr uses Kerberos: No<br/>"); | |
368 #endif | |
369 #ifdef USE_AO | |
370 g_string_append(str, "AO: Yes<br/>"); | |
371 #else | |
372 g_string_append(str, "AO: No<br/>"); | |
373 #endif | |
374 #ifdef USE_NAS_AUDIO | |
375 g_string_append(str, "NAS Audio: Yes<br/>"); | |
376 #else | |
377 g_string_append(str, "NAS Audio: No<br/>"); | |
378 #endif | |
379 #ifdef USE_GTKSPELL | |
380 g_string_append(str, "GtkSpell: Enabled<br/>"); | |
381 #else | |
382 g_string_append(str, "GtkSpell: Disabled<br/>"); | |
383 #endif | |
384 #ifdef USE_SCREENSAVER | |
385 g_string_append(str, "XScreenSaver support: Yes<br/>"); | |
386 #else | |
387 g_string_append(str, "XScreenSaver support: No<br/>"); | |
388 #endif | |
389 #ifdef USE_SM | |
390 g_string_append(str, "X SM support: Yes<br/>"); | |
391 #else | |
392 g_string_append(str, "X SM support: No<br/>"); | |
393 #endif | |
394 | |
395 /* End of not to be translated section */ | |
396 | |
9758 | 397 gtk_imhtml_append_text(GTK_IMHTML(text), str->str, GTK_IMHTML_NO_SCROLL); |
398 g_string_free(str, TRUE); | |
9753 | 399 |
400 gtk_text_buffer_get_start_iter(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter); | |
401 gtk_text_buffer_place_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)), &iter); | |
10153 | 402 |
9753 | 403 /* Close Button */ |
404 bbox = gtk_hbutton_box_new(); | |
405 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
406 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
407 | |
408 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
409 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
410 | |
411 g_signal_connect_swapped(G_OBJECT(button), "clicked", | |
412 G_CALLBACK(destroy_about), G_OBJECT(about)); | |
413 g_signal_connect(G_OBJECT(about), "destroy", | |
414 G_CALLBACK(destroy_about), G_OBJECT(about)); | |
415 | |
416 /* this makes the sizes not work? */ | |
417 GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); | |
418 gtk_widget_grab_default(button); | |
419 | |
420 /* Let's give'em something to talk about -- woah woah woah */ | |
421 gtk_widget_show_all(about); | |
422 gtk_window_present(GTK_WINDOW(about)); | |
9709 | 423 } |
424 | |
9730 | 425 static void |
426 gaim_gtkdialogs_im_cb(gpointer data, GaimRequestFields *fields) | |
9709 | 427 { |
9730 | 428 GaimAccount *account; |
429 const char *username; | |
9709 | 430 |
9730 | 431 account = gaim_request_fields_get_account(fields, "account"); |
432 username = gaim_request_fields_get_string(fields, "screenname"); | |
9709 | 433 |
9730 | 434 gaim_gtkdialogs_im_with_user(account, username); |
9709 | 435 } |
436 | |
9730 | 437 void |
438 gaim_gtkdialogs_im(void) | |
9709 | 439 { |
9730 | 440 GaimRequestFields *fields; |
441 GaimRequestFieldGroup *group; | |
442 GaimRequestField *field; | |
9709 | 443 |
9730 | 444 fields = gaim_request_fields_new(); |
9709 | 445 |
9730 | 446 group = gaim_request_field_group_new(NULL); |
447 gaim_request_fields_add_group(fields, group); | |
9709 | 448 |
9730 | 449 field = gaim_request_field_string_new("screenname", _("_Screen name"), |
450 NULL, FALSE); | |
451 gaim_request_field_set_required(field, TRUE); | |
452 gaim_request_field_set_type_hint(field, "screenname"); | |
453 gaim_request_field_group_add_field(group, field); | |
9709 | 454 |
9730 | 455 field = gaim_request_field_account_new("account", _("_Account"), NULL); |
456 gaim_request_field_set_visible(field, | |
457 (gaim_connections_get_all() != NULL && | |
458 gaim_connections_get_all()->next != NULL)); | |
459 gaim_request_field_set_required(field, TRUE); | |
460 gaim_request_field_group_add_field(group, field); | |
461 | |
462 gaim_request_fields(gaim_get_blist(), _("New Instant Message"), | |
463 NULL, | |
464 _("Please enter the screen name of the person you " | |
465 "would like to IM."), | |
466 fields, | |
467 _("OK"), G_CALLBACK(gaim_gtkdialogs_im_cb), | |
468 _("Cancel"), NULL, | |
469 NULL); | |
9709 | 470 } |
471 | |
9730 | 472 void |
473 gaim_gtkdialogs_im_with_user(GaimAccount *account, const char *username) | |
9709 | 474 { |
9730 | 475 GaimConversation *conv; |
476 GaimConvWindow *win; | |
477 GaimGtkWindow *gtkwin; | |
9709 | 478 |
9753 | 479 g_return_if_fail(account != NULL); |
480 g_return_if_fail(username != NULL); | |
481 | |
10246 | 482 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, username, account); |
9709 | 483 |
9730 | 484 if (conv == NULL) |
485 conv = gaim_conversation_new(GAIM_CONV_IM, account, username); | |
9709 | 486 |
9730 | 487 win = gaim_conversation_get_window(conv); |
488 gtkwin = GAIM_GTK_WINDOW(win); | |
9709 | 489 |
9730 | 490 gtk_window_present(GTK_WINDOW(gtkwin->window)); |
491 gaim_conv_window_switch_conversation(win, gaim_conversation_get_index(conv)); | |
9709 | 492 } |
493 | |
9730 | 494 static gboolean |
495 gaim_gtkdialogs_ee(const char *ee) | |
9709 | 496 { |
497 GtkWidget *window; | |
498 GtkWidget *hbox; | |
499 GtkWidget *label; | |
10219 | 500 GtkWidget *img; |
9709 | 501 gchar *norm = gaim_strreplace(ee, "rocksmyworld", ""); |
502 | |
503 label = gtk_label_new(NULL); | |
504 if (!strcmp(norm, "zilding")) | |
505 gtk_label_set_markup(GTK_LABEL(label), | |
506 "<span weight=\"bold\" size=\"large\" foreground=\"purple\">Amazing! Simply Amazing!</span>"); | |
507 else if (!strcmp(norm, "robflynn")) | |
508 gtk_label_set_markup(GTK_LABEL(label), | |
509 "<span weight=\"bold\" size=\"large\" foreground=\"#1f6bad\">Pimpin\' Penguin Style! *Waddle Waddle*</span>"); | |
510 else if (!strcmp(norm, "flynorange")) | |
511 gtk_label_set_markup(GTK_LABEL(label), | |
512 "<span weight=\"bold\" size=\"large\" foreground=\"blue\">You should be me. I'm so cute!</span>"); | |
513 else if (!strcmp(norm, "ewarmenhoven")) | |
514 gtk_label_set_markup(GTK_LABEL(label), | |
515 "<span weight=\"bold\" size=\"large\" foreground=\"orange\">Now that's what I like!</span>"); | |
516 else if (!strcmp(norm, "markster97")) | |
517 gtk_label_set_markup(GTK_LABEL(label), | |
518 "<span weight=\"bold\" size=\"large\" foreground=\"brown\">Ahh, and excellent choice!</span>"); | |
519 else if (!strcmp(norm, "seanegn")) | |
520 gtk_label_set_markup(GTK_LABEL(label), | |
521 "<span weight=\"bold\" size=\"large\" foreground=\"#009900\">Everytime you click my name, an angel gets its wings.</span>"); | |
522 else if (!strcmp(norm, "chipx86")) | |
523 gtk_label_set_markup(GTK_LABEL(label), | |
524 "<span weight=\"bold\" size=\"large\" foreground=\"red\">This sunflower seed taste like pizza.</span>"); | |
525 else if (!strcmp(norm, "markdoliner")) | |
526 gtk_label_set_markup(GTK_LABEL(label), | |
527 "<span weight=\"bold\" size=\"large\" foreground=\"#6364B1\">Hey! I was in that tumbleweed!</span>"); | |
528 else if (!strcmp(norm, "lschiere")) | |
529 gtk_label_set_markup(GTK_LABEL(label), | |
530 "<span weight=\"bold\" size=\"large\" foreground=\"gray\">I'm not anything.</span>"); | |
531 g_free(norm); | |
532 | |
533 if (strlen(gtk_label_get_label(GTK_LABEL(label))) <= 0) | |
534 return FALSE; | |
535 | |
536 window = gtk_dialog_new_with_buttons(GAIM_ALERT_TITLE, NULL, 0, GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL); | |
537 gtk_dialog_set_default_response (GTK_DIALOG(window), GTK_RESPONSE_OK); | |
538 g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(gtk_widget_destroy), NULL); | |
539 | |
540 gtk_container_set_border_width (GTK_CONTAINER(window), 6); | |
541 gtk_window_set_resizable(GTK_WINDOW(window), FALSE); | |
542 gtk_dialog_set_has_separator(GTK_DIALOG(window), FALSE); | |
543 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(window)->vbox), 12); | |
544 gtk_container_set_border_width (GTK_CONTAINER(GTK_DIALOG(window)->vbox), 6); | |
545 | |
546 hbox = gtk_hbox_new(FALSE, 12); | |
547 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), hbox); | |
10219 | 548 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_COOL, gtk_icon_size_from_name(GAIM_ICON_SIZE_DIALOG_COOL)); |
9709 | 549 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
550 | |
551 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
552 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
553 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
554 | |
555 gtk_widget_show_all(window); | |
556 return TRUE; | |
557 } | |
558 | |
559 static void | |
9730 | 560 gaim_gtkdialogs_info_cb(gpointer data, GaimRequestFields *fields) |
9709 | 561 { |
562 char *username; | |
563 gboolean found = FALSE; | |
564 GaimAccount *account; | |
565 | |
566 account = gaim_request_fields_get_account(fields, "account"); | |
567 | |
568 username = g_strdup(gaim_normalize(account, | |
569 gaim_request_fields_get_string(fields, "screenname"))); | |
570 | |
571 if (username != NULL && gaim_str_has_suffix(username, "rocksmyworld")) | |
9730 | 572 found = gaim_gtkdialogs_ee(username); |
9709 | 573 |
574 if (!found && username != NULL && *username != '\0' && account != NULL) | |
575 serv_get_info(gaim_account_get_connection(account), username); | |
576 | |
577 g_free(username); | |
578 } | |
579 | |
580 void | |
9714 | 581 gaim_gtkdialogs_info(void) |
9709 | 582 { |
583 GaimRequestFields *fields; | |
584 GaimRequestFieldGroup *group; | |
585 GaimRequestField *field; | |
586 | |
587 fields = gaim_request_fields_new(); | |
588 | |
589 group = gaim_request_field_group_new(NULL); | |
590 gaim_request_fields_add_group(fields, group); | |
591 | |
592 field = gaim_request_field_string_new("screenname", _("_Screen name"), | |
593 NULL, FALSE); | |
594 gaim_request_field_set_type_hint(field, "screenname"); | |
595 gaim_request_field_set_required(field, TRUE); | |
596 gaim_request_field_group_add_field(group, field); | |
597 | |
598 field = gaim_request_field_account_new("account", _("_Account"), NULL); | |
599 gaim_request_field_set_visible(field, | |
600 (gaim_connections_get_all() != NULL && | |
601 gaim_connections_get_all()->next != NULL)); | |
602 gaim_request_field_set_required(field, TRUE); | |
603 gaim_request_field_group_add_field(group, field); | |
604 | |
605 gaim_request_fields(gaim_get_blist(), _("Get User Info"), | |
606 NULL, | |
607 _("Please enter the screen name of the person whose " | |
608 "info you would like to view."), | |
609 fields, | |
9730 | 610 _("OK"), G_CALLBACK(gaim_gtkdialogs_info_cb), |
9709 | 611 _("Cancel"), NULL, |
612 NULL); | |
613 } | |
614 | |
615 static void | |
9730 | 616 gaim_gtkdialogs_log_cb(gpointer data, GaimRequestFields *fields) |
9709 | 617 { |
618 char *username; | |
619 GaimAccount *account; | |
620 | |
621 account = gaim_request_fields_get_account(fields, "account"); | |
622 | |
623 username = g_strdup(gaim_normalize(account, | |
624 gaim_request_fields_get_string(fields, "screenname"))); | |
625 | |
9917 | 626 if(username != NULL && *username != '\0' && account != NULL ) |
627 gaim_gtk_log_show(GAIM_LOG_IM, username, account); | |
9709 | 628 |
629 g_free(username); | |
630 } | |
631 | |
9991 | 632 /* |
633 * TODO - This needs to deal with logs of all types, not just IM logs. | |
634 */ | |
9709 | 635 void |
9714 | 636 gaim_gtkdialogs_log(void) |
9709 | 637 { |
638 GaimRequestFields *fields; | |
639 GaimRequestFieldGroup *group; | |
640 GaimRequestField *field; | |
641 | |
642 fields = gaim_request_fields_new(); | |
643 | |
644 group = gaim_request_field_group_new(NULL); | |
645 gaim_request_fields_add_group(fields, group); | |
646 | |
647 field = gaim_request_field_string_new("screenname", _("_Screen name"), | |
648 NULL, FALSE); | |
649 gaim_request_field_set_type_hint(field, "screenname"); | |
650 gaim_request_field_set_required(field, TRUE); | |
651 gaim_request_field_group_add_field(group, field); | |
652 | |
653 field = gaim_request_field_account_new("account", _("_Account"), NULL); | |
654 gaim_request_field_account_set_show_all(field, TRUE); | |
655 gaim_request_field_set_visible(field, | |
656 (gaim_accounts_get_all() != NULL && | |
657 gaim_accounts_get_all()->next != NULL)); | |
658 gaim_request_field_set_required(field, TRUE); | |
659 gaim_request_field_group_add_field(group, field); | |
660 | |
661 gaim_request_fields(gaim_get_blist(), _("Get User Log"), | |
662 NULL, | |
663 _("Please enter the screen name of the person whose " | |
664 "log you would like to view."), | |
665 fields, | |
9730 | 666 _("OK"), G_CALLBACK(gaim_gtkdialogs_log_cb), |
9709 | 667 _("Cancel"), NULL, |
668 NULL); | |
669 } | |
670 | |
9730 | 671 static void |
672 gaim_gtkdialogs_warn_cb(GtkWidget *widget, gint resp, struct warning *w) | |
9709 | 673 { |
9730 | 674 if (resp == GTK_RESPONSE_OK) |
9753 | 675 serv_warn(w->gc, w->who, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w->anon))); |
9709 | 676 |
9753 | 677 dialogwindows = g_list_remove(dialogwindows, w->window); |
678 gtk_widget_destroy(w->window); | |
679 | |
9730 | 680 g_free(w->who); |
681 g_free(w); | |
9709 | 682 } |
683 | |
9753 | 684 /* |
9991 | 685 * TODO - Make this use the request API, if possible. |
9753 | 686 */ |
9730 | 687 void |
688 gaim_gtkdialogs_warn(GaimConnection *gc, const char *who) | |
9709 | 689 { |
9753 | 690 gchar *labeltext; |
9730 | 691 GtkWidget *hbox, *vbox; |
9709 | 692 GtkWidget *label; |
9753 | 693 GtkWidget *img; |
694 struct warning *w; | |
9730 | 695 |
9753 | 696 g_return_if_fail(gc != NULL); |
697 g_return_if_fail(who != NULL); | |
698 | |
699 w = g_new0(struct warning, 1); | |
9730 | 700 w->who = g_strdup(who); |
701 w->gc = gc; | |
702 | |
9753 | 703 w->window = gtk_dialog_new_with_buttons(_("Warn User"), NULL, 0, |
9730 | 704 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, |
705 GAIM_STOCK_WARN, GTK_RESPONSE_OK, NULL); | |
706 gtk_dialog_set_default_response (GTK_DIALOG(w->window), GTK_RESPONSE_OK); | |
707 g_signal_connect(G_OBJECT(w->window), "response", G_CALLBACK(gaim_gtkdialogs_warn_cb), w); | |
708 | |
709 gtk_container_set_border_width (GTK_CONTAINER(w->window), 6); | |
710 gtk_window_set_resizable(GTK_WINDOW(w->window), FALSE); | |
711 gtk_dialog_set_has_separator(GTK_DIALOG(w->window), FALSE); | |
712 gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(w->window)->vbox), 12); | |
713 gtk_container_set_border_width (GTK_CONTAINER(GTK_DIALOG(w->window)->vbox), 6); | |
9709 | 714 |
715 hbox = gtk_hbox_new(FALSE, 12); | |
9730 | 716 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(w->window)->vbox), hbox); |
9753 | 717 |
718 img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); | |
719 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); | |
9730 | 720 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); |
9709 | 721 |
9730 | 722 vbox = gtk_vbox_new(FALSE, 0); |
723 gtk_container_add(GTK_CONTAINER(hbox), vbox); | |
724 labeltext = g_strdup_printf(_("<span weight=\"bold\" size=\"larger\">Warn %s?</span>\n\n" | |
725 "This will increase %s's warning level and he or she will be subject to harsher rate limiting.\n"), who, who); | |
726 label = gtk_label_new(NULL); | |
727 gtk_label_set_markup(GTK_LABEL(label), labeltext); | |
728 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
729 gtk_misc_set_alignment(GTK_MISC(label), 0, 0); | |
730 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
731 g_free(labeltext); | |
9709 | 732 |
9730 | 733 w->anon = gtk_check_button_new_with_mnemonic(_("Warn _anonymously?")); |
734 gtk_box_pack_start(GTK_BOX(vbox), w->anon, FALSE, FALSE, 0); | |
735 | |
736 hbox = gtk_hbox_new(FALSE, 6); | |
737 gtk_container_add(GTK_CONTAINER(vbox), hbox); | |
738 img = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_MENU); | |
739 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); | |
740 labeltext = _("<b>Anonymous warnings are less severe.</b>"); | |
741 label = gtk_label_new(NULL); | |
742 gtk_label_set_markup(GTK_LABEL(label), labeltext); | |
743 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | |
9709 | 744 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
745 | |
9730 | 746 dialogwindows = g_list_prepend(dialogwindows, w->window); |
747 gtk_widget_show_all(w->window); | |
9709 | 748 } |
749 | |
750 static void | |
9730 | 751 gaim_gtkdialogs_alias_contact_cb(GaimContact *contact, const char *new_alias) |
752 { | |
753 gaim_contact_set_alias(contact, new_alias); | |
754 } | |
755 | |
756 void | |
757 gaim_gtkdialogs_alias_contact(GaimContact *contact) | |
758 { | |
9753 | 759 g_return_if_fail(contact != NULL); |
760 | |
9730 | 761 gaim_request_input(NULL, _("Alias Contact"), NULL, |
762 _("Enter an alias for this contact."), | |
763 contact->alias, FALSE, FALSE, NULL, | |
764 _("Alias"), G_CALLBACK(gaim_gtkdialogs_alias_contact_cb), | |
765 _("Cancel"), NULL, contact); | |
766 } | |
767 | |
768 static void | |
769 gaim_gtkdialogs_alias_buddy_cb(GaimBuddy *buddy, const char *new_alias) | |
770 { | |
771 gaim_blist_alias_buddy(buddy, new_alias); | |
772 serv_alias_buddy(buddy); | |
773 } | |
774 | |
775 void | |
9753 | 776 gaim_gtkdialogs_alias_buddy(GaimBuddy *buddy) |
9730 | 777 { |
9753 | 778 gchar *secondary; |
779 | |
780 g_return_if_fail(buddy != NULL); | |
781 | |
782 secondary = g_strdup_printf(_("Enter an alias for %s."), buddy->name); | |
9730 | 783 |
784 gaim_request_input(NULL, _("Alias Buddy"), NULL, | |
9753 | 785 secondary, buddy->alias, FALSE, FALSE, NULL, |
9730 | 786 _("Alias"), G_CALLBACK(gaim_gtkdialogs_alias_buddy_cb), |
9753 | 787 _("Cancel"), NULL, buddy); |
9730 | 788 |
789 g_free(secondary); | |
790 } | |
791 | |
792 static void | |
793 gaim_gtkdialogs_alias_chat_cb(GaimChat *chat, const char *new_alias) | |
9709 | 794 { |
795 gaim_blist_alias_chat(chat, new_alias); | |
796 } | |
797 | |
798 void | |
9730 | 799 gaim_gtkdialogs_alias_chat(GaimChat *chat) |
9709 | 800 { |
9753 | 801 g_return_if_fail(chat != NULL); |
802 | |
9709 | 803 gaim_request_input(NULL, _("Alias Chat"), NULL, |
804 _("Enter an alias for this chat."), | |
805 chat->alias, FALSE, FALSE, NULL, | |
9730 | 806 _("Alias"), G_CALLBACK(gaim_gtkdialogs_alias_chat_cb), |
9709 | 807 _("Cancel"), NULL, chat); |
808 } | |
809 | |
810 static void | |
9753 | 811 gaim_gtkdialogs_remove_contact_cb(GaimContact *contact) |
9709 | 812 { |
9730 | 813 GaimBlistNode *bnode, *cnode; |
814 GaimGroup *group; | |
815 | |
816 cnode = (GaimBlistNode *)contact; | |
817 group = (GaimGroup*)cnode->parent; | |
818 for (bnode = cnode->child; bnode; bnode = bnode->next) { | |
819 GaimBuddy *buddy = (GaimBuddy*)bnode; | |
820 if (gaim_account_is_connected(buddy->account)) | |
821 serv_remove_buddy(buddy->account->gc, buddy, group); | |
822 } | |
823 gaim_blist_remove_contact(contact); | |
824 } | |
825 | |
826 void | |
827 gaim_gtkdialogs_remove_contact(GaimContact *contact) | |
828 { | |
829 GaimBuddy *buddy = gaim_contact_get_priority_buddy(contact); | |
830 | |
9753 | 831 g_return_if_fail(contact != NULL); |
832 g_return_if_fail(buddy != NULL); | |
9730 | 833 |
834 if (((GaimBlistNode*)contact)->child == (GaimBlistNode*)buddy && | |
835 !((GaimBlistNode*)buddy)->next) { | |
836 gaim_gtkdialogs_remove_buddy(buddy); | |
837 } else { | |
10324 | 838 gchar *text; |
839 text = g_strdup_printf( | |
840 ngettext( | |
841 "You are about to remove the contact containing %s " | |
842 "and %d other buddy from your buddy list. Do you " | |
843 "want to continue?", | |
844 "You are about to remove the contact containing %s " | |
845 "and %d other buddies from your buddy list. Do you " | |
846 "want to continue?", contact->totalsize - 1), | |
847 buddy->name, contact->totalsize - 1); | |
9730 | 848 |
10222 | 849 gaim_request_action(contact, NULL, _("Remove Contact"), text, 0, contact, 2, |
9753 | 850 _("Remove Contact"), G_CALLBACK(gaim_gtkdialogs_remove_contact_cb), |
9730 | 851 _("Cancel"), NULL); |
852 | |
853 g_free(text); | |
854 } | |
9709 | 855 } |
856 | |
857 void | |
9753 | 858 gaim_gtkdialogs_remove_group_cb(GaimGroup *group) |
9709 | 859 { |
9730 | 860 GaimBlistNode *cnode, *bnode; |
861 | |
862 cnode = ((GaimBlistNode*)group)->child; | |
863 | |
864 while (cnode) { | |
865 if (GAIM_BLIST_NODE_IS_CONTACT(cnode)) { | |
866 bnode = cnode->child; | |
867 cnode = cnode->next; | |
868 while (bnode) { | |
869 GaimBuddy *buddy; | |
870 if (GAIM_BLIST_NODE_IS_BUDDY(bnode)) { | |
871 GaimConversation *conv; | |
872 buddy = (GaimBuddy*)bnode; | |
873 bnode = bnode->next; | |
10246 | 874 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, |
875 buddy->name, | |
876 buddy->account); | |
9730 | 877 if (gaim_account_is_connected(buddy->account)) { |
878 serv_remove_buddy(buddy->account->gc, buddy, group); | |
879 gaim_blist_remove_buddy(buddy); | |
880 if (conv) | |
881 gaim_conversation_update(conv, | |
882 GAIM_CONV_UPDATE_REMOVE); | |
883 } | |
884 } else { | |
885 bnode = bnode->next; | |
886 } | |
887 } | |
888 } else if (GAIM_BLIST_NODE_IS_CHAT(cnode)) { | |
889 GaimChat *chat = (GaimChat *)cnode; | |
890 cnode = cnode->next; | |
891 if (gaim_account_is_connected(chat->account)) | |
892 gaim_blist_remove_chat(chat); | |
893 } else { | |
894 cnode = cnode->next; | |
895 } | |
896 } | |
897 | |
898 gaim_blist_remove_group(group); | |
899 } | |
900 | |
901 void | |
902 gaim_gtkdialogs_remove_group(GaimGroup *group) | |
903 { | |
9753 | 904 gchar *text; |
905 | |
906 g_return_if_fail(group != NULL); | |
907 | |
908 text = g_strdup_printf(_("You are about to remove the group %s and all its members from your buddy list. Do you want to continue?"), | |
909 group->name); | |
9730 | 910 |
10222 | 911 gaim_request_action(group, NULL, _("Remove Group"), text, 0, group, 2, |
9753 | 912 _("Remove Group"), G_CALLBACK(gaim_gtkdialogs_remove_group_cb), |
9730 | 913 _("Cancel"), NULL); |
914 | |
915 g_free(text); | |
9709 | 916 } |
917 | |
10246 | 918 /* XXX - Some of this should be moved into the core, methinks. */ |
9709 | 919 static void |
9753 | 920 gaim_gtkdialogs_remove_buddy_cb(GaimBuddy *buddy) |
9709 | 921 { |
9730 | 922 GaimGroup *group; |
923 GaimConversation *conv; | |
924 gchar *name; | |
925 GaimAccount *account; | |
926 | |
927 group = gaim_find_buddys_group(buddy); | |
928 name = g_strdup(buddy->name); /* b->name is a crasher after remove_buddy */ | |
929 account = buddy->account; | |
930 | |
9753 | 931 gaim_debug_info("blist", "Removing '%s' from buddy list.\n", buddy->name); |
9991 | 932 /* TODO - Should remove from blist first... then call serv_remove_buddy()? */ |
9730 | 933 serv_remove_buddy(buddy->account->gc, buddy, group); |
934 gaim_blist_remove_buddy(buddy); | |
935 | |
10246 | 936 conv = gaim_find_conversation_with_account(GAIM_CONV_IM, name, account); |
9730 | 937 if (conv != NULL) |
938 gaim_conversation_update(conv, GAIM_CONV_UPDATE_REMOVE); | |
939 | |
940 g_free(name); | |
9709 | 941 } |
942 | |
943 void | |
9730 | 944 gaim_gtkdialogs_remove_buddy(GaimBuddy *buddy) |
9709 | 945 { |
9753 | 946 gchar *text; |
9730 | 947 |
9753 | 948 g_return_if_fail(buddy != NULL); |
9730 | 949 |
9753 | 950 text = g_strdup_printf(_("You are about to remove %s from your buddy list. Do you want to continue?"), |
951 buddy->name); | |
9730 | 952 |
10222 | 953 gaim_request_action(buddy, NULL, _("Remove Buddy"), text, 0, buddy, 2, |
9753 | 954 _("Remove Buddy"), G_CALLBACK(gaim_gtkdialogs_remove_buddy_cb), |
9730 | 955 _("Cancel"), NULL); |
956 | |
957 g_free(text); | |
958 } | |
9709 | 959 |
9730 | 960 static void |
9753 | 961 gaim_gtkdialogs_remove_chat_cb(GaimChat *chat) |
9730 | 962 { |
9918 | 963 char *name = NULL; |
10167 | 964 GaimAccount *account; |
9918 | 965 GaimConversation *conv = NULL; |
966 | |
10167 | 967 account = chat->account; |
968 | |
969 if (GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl)->get_chat_name != NULL) | |
970 name = GAIM_PLUGIN_PROTOCOL_INFO(account->gc->prpl)->get_chat_name(chat->components); | |
9918 | 971 |
9730 | 972 gaim_blist_remove_chat(chat); |
9918 | 973 |
974 if (name != NULL) { | |
10246 | 975 conv = gaim_find_conversation_with_account(GAIM_CONV_CHAT, name, account); |
9918 | 976 g_free(name); |
977 } | |
978 | |
979 if (conv != NULL) | |
980 gaim_conversation_update(conv, GAIM_CONV_UPDATE_REMOVE); | |
9730 | 981 } |
9709 | 982 |
9730 | 983 void |
984 gaim_gtkdialogs_remove_chat(GaimChat *chat) | |
985 { | |
9753 | 986 gchar *name = gaim_chat_get_display_name(chat); |
987 gchar *text = g_strdup_printf(_("You are about to remove the chat %s from your buddy list. Do you want to continue?"), name); | |
988 | |
989 g_return_if_fail(chat != NULL); | |
9730 | 990 |
10222 | 991 gaim_request_action(chat, NULL, _("Remove Chat"), text, 0, chat, 2, |
9753 | 992 _("Remove Chat"), G_CALLBACK(gaim_gtkdialogs_remove_chat_cb), |
9730 | 993 _("Cancel"), NULL); |
994 | |
995 g_free(name); | |
996 g_free(text); | |
9709 | 997 } |