Mercurial > pidgin.yaz
annotate src/gtkprivacy.c @ 8995:9caf796e74aa
[gaim-migrate @ 9770]
"Luke, if you get a chance, could you commit this? It should improve the
HTML escaping situation between Gaim and other AIM and ICQ clients. I haven't
actually applied it locally or tested it, but it looks ok to me. I would do
it myself, but there are other changes in my oscar.c that aren't ready to
commit, and I want to go to sleep so I can wake up tomorrow...
I'll probably be out of town climbing until Sunday night... "--Mark Doliner
"Below is an email I nearly sent you, before deciding to test & document the
failure cases I knew of.
http://www.nosnilmot.com/gaim/oscar-html.txt shows how current CVS behaves
sending the string "<foo>" between GaimICQ/GaimAIM/ICQLite/WinAIM in various
combinations After that testing I couldn't help trying to fix it :)
The attached patch, from my testing, resolves all those marked with "XX" so
that what is received matches what the user sent. The code might not be the
most efficient and may contain redundant bits but I've had enough of this
for now, 2 Windows crashes which caused VMWare to be weird and half break
my keyboard and require restarting X.
The patch might want a bit more testing, especially with iChat (I'm unable
to test with that). Maybe committing it to CVS might get it some more
testing though ;-)" --Stu Tomlinson
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 21 May 2004 11:55:08 +0000 |
parents | b875f5d57b81 |
children | 7a8aa87164ae |
rev | line source |
---|---|
6371 | 1 /** |
2 * @file gtkprivacy.c GTK+ Privacy UI | |
3 * @ingroup gtkui | |
4 * | |
5 * gaim | |
6 * | |
8046 | 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. | |
6371 | 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 */ | |
25 #include "gtkinternal.h" | |
26 | |
27 #include "connection.h" | |
28 #include "debug.h" | |
29 #include "privacy.h" | |
30 #include "request.h" | |
31 #include "util.h" | |
32 | |
33 #include "gtkprivacy.h" | |
34 #include "gtkutils.h" | |
35 | |
36 typedef struct | |
37 { | |
38 GtkWidget *win; | |
39 | |
40 GtkWidget *type_menu; | |
41 | |
42 GtkWidget *add_button; | |
43 GtkWidget *remove_button; | |
44 GtkWidget *clear_button; | |
45 | |
46 GtkWidget *button_box; | |
47 GtkWidget *allow_widget; | |
48 GtkWidget *block_widget; | |
49 | |
50 GtkListStore *allow_store; | |
51 GtkListStore *block_store; | |
52 | |
53 GtkWidget *allow_list; | |
54 GtkWidget *block_list; | |
55 | |
56 gboolean in_allow_list; | |
57 | |
58 GaimAccount *account; | |
59 | |
60 } GaimGtkPrivacyDialog; | |
61 | |
62 typedef struct | |
63 { | |
64 GaimAccount *account; | |
65 char *name; | |
66 gboolean block; | |
67 | |
68 } GaimGtkPrivacyRequestData; | |
69 | |
70 static struct | |
71 { | |
72 const char *text; | |
73 int num; | |
74 | |
75 } menu_entries[] = | |
76 { | |
8175 | 77 { N_("Allow all users to contact me"), GAIM_PRIVACY_ALLOW_ALL }, |
78 { N_("Allow only the users on my buddy list"), GAIM_PRIVACY_ALLOW_BUDDYLIST }, | |
79 { N_("Allow only the users below"), GAIM_PRIVACY_ALLOW_USERS }, | |
80 { N_("Block all users"), GAIM_PRIVACY_DENY_ALL }, | |
81 { N_("Block only the users below"), GAIM_PRIVACY_DENY_USERS } | |
6371 | 82 }; |
83 | |
84 static size_t menu_entry_count = sizeof(menu_entries) / sizeof(*menu_entries); | |
85 | |
86 static GaimGtkPrivacyDialog *privacy_dialog = NULL; | |
87 | |
88 static void | |
89 rebuild_allow_list(GaimGtkPrivacyDialog *dialog) | |
90 { | |
91 GSList *l; | |
92 GtkTreeIter iter; | |
93 | |
94 gtk_list_store_clear(dialog->allow_store); | |
95 | |
96 for (l = dialog->account->permit; l != NULL; l = l->next) { | |
97 gtk_list_store_append(dialog->allow_store, &iter); | |
98 gtk_list_store_set(dialog->allow_store, &iter, 0, l->data, -1); | |
99 } | |
100 } | |
101 | |
102 static void | |
103 rebuild_block_list(GaimGtkPrivacyDialog *dialog) | |
104 { | |
105 GSList *l; | |
106 GtkTreeIter iter; | |
107 | |
108 gtk_list_store_clear(dialog->block_store); | |
109 | |
110 for (l = dialog->account->deny; l != NULL; l = l->next) { | |
111 gtk_list_store_append(dialog->block_store, &iter); | |
112 gtk_list_store_set(dialog->block_store, &iter, 0, l->data, -1); | |
113 } | |
114 } | |
115 | |
116 static const char * | |
117 find_permit_block_by_name(GSList *list, const char *name) | |
118 { | |
119 const char *temp_name; | |
120 GSList *l; | |
121 | |
122 for (l = list; l != NULL; l = l->next) { | |
123 temp_name = (const char *)l->data; | |
124 | |
125 if (!gaim_utf8_strcasecmp(name, temp_name)) | |
126 return temp_name; | |
127 } | |
128 | |
129 return NULL; | |
130 } | |
131 | |
132 static void | |
133 user_selected_cb(GtkTreeSelection *sel, GaimGtkPrivacyDialog *dialog) | |
134 { | |
135 gtk_widget_set_sensitive(dialog->remove_button, TRUE); | |
136 } | |
137 | |
138 static GtkWidget * | |
139 build_list(GaimGtkPrivacyDialog *dialog, GtkListStore *model, | |
140 GtkWidget **ret_treeview) | |
141 { | |
142 GtkWidget *sw; | |
143 GtkWidget *treeview; | |
144 GtkCellRenderer *rend; | |
145 GtkTreeViewColumn *column; | |
146 GtkTreeSelection *sel; | |
147 | |
148 sw = gtk_scrolled_window_new(NULL, NULL); | |
149 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), | |
7931 | 150 GTK_POLICY_AUTOMATIC, |
151 GTK_POLICY_ALWAYS); | |
152 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); | |
6371 | 153 |
154 treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); | |
155 *ret_treeview = treeview; | |
156 | |
157 rend = gtk_cell_renderer_text_new(); | |
158 | |
159 column = gtk_tree_view_column_new_with_attributes(NULL, rend, | |
160 "text", 0, | |
161 NULL); | |
162 gtk_tree_view_column_set_clickable(GTK_TREE_VIEW_COLUMN(column), TRUE); | |
163 gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); | |
164 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); | |
7931 | 165 gtk_container_add(GTK_CONTAINER(sw), treeview); |
6374
ca73fdf3eb38
[gaim-migrate @ 6879]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
166 |
6371 | 167 gtk_widget_show(treeview); |
168 | |
169 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); | |
170 | |
171 g_signal_connect(G_OBJECT(sel), "changed", | |
172 G_CALLBACK(user_selected_cb), dialog); | |
173 | |
6374
ca73fdf3eb38
[gaim-migrate @ 6879]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
174 gtk_widget_set_size_request(sw, -1, 200); |
ca73fdf3eb38
[gaim-migrate @ 6879]
Christian Hammond <chipx86@chipx86.com>
parents:
6371
diff
changeset
|
175 |
6371 | 176 return sw; |
177 } | |
178 | |
179 static GtkWidget * | |
180 build_allow_list(GaimGtkPrivacyDialog *dialog) | |
181 { | |
182 GtkWidget *widget; | |
183 GtkWidget *list; | |
184 | |
185 dialog->allow_store = gtk_list_store_new(1, G_TYPE_STRING); | |
186 | |
187 widget = build_list(dialog, dialog->allow_store, &list); | |
188 | |
189 dialog->allow_list = list; | |
190 | |
191 rebuild_allow_list(dialog); | |
192 | |
193 return widget; | |
194 } | |
195 | |
196 static GtkWidget * | |
197 build_block_list(GaimGtkPrivacyDialog *dialog) | |
198 { | |
199 GtkWidget *widget; | |
200 GtkWidget *list; | |
201 | |
202 dialog->block_store = gtk_list_store_new(1, G_TYPE_STRING); | |
203 | |
204 widget = build_list(dialog, dialog->block_store, &list); | |
205 | |
206 dialog->block_list = list; | |
207 | |
208 rebuild_block_list(dialog); | |
209 | |
210 return widget; | |
211 } | |
212 | |
213 static gint | |
214 destroy_cb(GtkWidget *w, GdkEvent *event, GaimGtkPrivacyDialog *dialog) | |
215 { | |
7165 | 216 gaim_gtk_privacy_dialog_hide(); |
6371 | 217 |
218 return 0; | |
219 } | |
220 | |
221 static void | |
222 select_account_cb(GtkWidget *dropdown, GaimAccount *account, | |
223 GaimGtkPrivacyDialog *dialog) | |
224 { | |
225 int i; | |
226 | |
227 dialog->account = account; | |
228 | |
229 for (i = 0; i < menu_entry_count; i++) { | |
230 if (menu_entries[i].num == account->perm_deny) { | |
231 gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->type_menu), i); | |
232 break; | |
233 } | |
234 } | |
235 | |
236 rebuild_allow_list(dialog); | |
237 rebuild_block_list(dialog); | |
238 } | |
239 | |
240 static void | |
241 type_changed_cb(GtkOptionMenu *optmenu, GaimGtkPrivacyDialog *dialog) | |
242 { | |
8275 | 243 int new_type = menu_entries[gtk_option_menu_get_history(optmenu)].num; |
6371 | 244 |
8520 | 245 dialog->account->perm_deny = new_type; |
6371 | 246 serv_set_permit_deny(gaim_account_get_connection(dialog->account)); |
247 gaim_blist_save(); | |
248 | |
249 gtk_widget_hide(dialog->allow_widget); | |
250 gtk_widget_hide(dialog->block_widget); | |
251 gtk_widget_hide(dialog->button_box); | |
252 | |
8175 | 253 if (new_type == GAIM_PRIVACY_ALLOW_USERS) { |
6371 | 254 gtk_widget_show(dialog->allow_widget); |
255 gtk_widget_show(dialog->button_box); | |
256 dialog->in_allow_list = TRUE; | |
257 } | |
8175 | 258 else if (new_type == GAIM_PRIVACY_DENY_USERS) { |
6371 | 259 gtk_widget_show(dialog->block_widget); |
260 gtk_widget_show(dialog->button_box); | |
261 dialog->in_allow_list = FALSE; | |
262 } | |
263 } | |
264 | |
265 static void | |
266 add_cb(GtkWidget *button, GaimGtkPrivacyDialog *dialog) | |
267 { | |
268 if (dialog->in_allow_list) | |
269 gaim_gtk_request_add_permit(dialog->account, NULL); | |
270 else | |
271 gaim_gtk_request_add_block(dialog->account, NULL); | |
272 } | |
273 | |
274 static void | |
275 remove_cb(GtkWidget *button, GaimGtkPrivacyDialog *dialog) | |
276 { | |
277 GtkTreeIter iter; | |
278 GtkTreeModel *model; | |
279 GtkTreeSelection *sel; | |
280 char *name; | |
281 | |
282 if (dialog->in_allow_list && dialog->allow_store == NULL) | |
283 return; | |
284 | |
285 if (!dialog->in_allow_list && dialog->block_store == NULL) | |
286 return; | |
287 | |
288 if (dialog->in_allow_list) { | |
289 model = GTK_TREE_MODEL(dialog->allow_store); | |
290 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->allow_list)); | |
291 } | |
292 else { | |
293 model = GTK_TREE_MODEL(dialog->block_store); | |
294 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->block_list)); | |
295 } | |
296 | |
297 if (gtk_tree_selection_get_selected(sel, NULL, &iter)) | |
298 gtk_tree_model_get(model, &iter, 0, &name, -1); | |
299 else | |
300 return; | |
301 | |
302 if (dialog->in_allow_list) { | |
6375
72023626d5b8
[gaim-migrate @ 6880]
Christian Hammond <chipx86@chipx86.com>
parents:
6374
diff
changeset
|
303 if (find_permit_block_by_name(dialog->account->permit, name)) |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
304 gaim_privacy_permit_remove(dialog->account, name, FALSE); |
6371 | 305 } |
306 else { | |
6375
72023626d5b8
[gaim-migrate @ 6880]
Christian Hammond <chipx86@chipx86.com>
parents:
6374
diff
changeset
|
307 if (find_permit_block_by_name(dialog->account->deny, name)) |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
308 gaim_privacy_deny_remove(dialog->account, name, FALSE); |
6371 | 309 } |
310 } | |
311 | |
312 static void | |
313 clear_cb(GtkWidget *button, GaimGtkPrivacyDialog *dialog) | |
314 { | |
8556 | 315 GSList *l; |
316 if (dialog->in_allow_list) | |
317 l = dialog->account->permit; | |
318 else | |
319 l = dialog->account->deny; | |
320 while (l) { | |
321 char *user; | |
322 user = l->data; | |
323 l = l->next; | |
324 if (dialog->in_allow_list) | |
325 gaim_privacy_permit_remove(dialog->account, user, FALSE); | |
326 else | |
327 gaim_privacy_deny_remove(dialog->account, user, FALSE); | |
328 } | |
6371 | 329 } |
330 | |
331 static void | |
7165 | 332 close_cb(GtkWidget *button, GaimGtkPrivacyDialog *dialog) |
6371 | 333 { |
7165 | 334 gtk_widget_destroy(dialog->win); |
335 | |
6371 | 336 gaim_gtk_privacy_dialog_hide(); |
337 } | |
338 | |
6646
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
339 static gboolean |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
340 check_account_func(GaimAccount *account) |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
341 { |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
342 GaimConnection *gc = gaim_account_get_connection(account); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
343 GaimPluginProtocolInfo *prpl_info = NULL; |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
344 |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
345 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
346 |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
347 return (prpl_info->set_permit_deny != NULL); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
348 } |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
349 |
8938 | 350 gboolean |
351 gaim_gtk_privacy_is_showable() | |
352 { | |
353 GList *c; | |
354 GaimConnection *gc; | |
355 | |
356 for (c = gaim_connections_get_all(); c != NULL; c = c->next) { | |
357 gc = c->data; | |
358 | |
359 if (check_account_func(gaim_connection_get_account(gc))) | |
360 return TRUE; | |
361 } | |
362 | |
363 return FALSE; | |
364 } | |
365 | |
6371 | 366 static GaimGtkPrivacyDialog * |
367 privacy_dialog_new(void) | |
368 { | |
369 GaimGtkPrivacyDialog *dialog; | |
370 GtkWidget *bbox; | |
371 GtkWidget *hbox; | |
372 GtkWidget *vbox; | |
373 GtkWidget *button; | |
374 GtkWidget *dropdown; | |
375 GtkWidget *label; | |
376 GtkWidget *menu; | |
377 GtkWidget *sep; | |
378 int selected = 0; | |
379 int i; | |
380 | |
381 dialog = g_new0(GaimGtkPrivacyDialog, 1); | |
382 | |
383 dialog->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
384 gtk_window_set_resizable(GTK_WINDOW(dialog->win), FALSE); | |
385 gtk_window_set_role(GTK_WINDOW(dialog->win), "privacy"); | |
386 gtk_window_set_title(GTK_WINDOW(dialog->win), _("Privacy")); | |
387 gtk_container_set_border_width(GTK_CONTAINER(dialog->win), 12); | |
388 | |
389 g_signal_connect(G_OBJECT(dialog->win), "delete_event", | |
390 G_CALLBACK(destroy_cb), dialog); | |
391 | |
392 gtk_widget_realize(dialog->win); | |
393 | |
394 /* Main vbox */ | |
395 vbox = gtk_vbox_new(FALSE, 12); | |
396 gtk_container_add(GTK_CONTAINER(dialog->win), vbox); | |
397 gtk_widget_show(vbox); | |
398 | |
399 /* Description label */ | |
400 label = gtk_label_new( | |
401 _("Changes to privacy settings take effect immediately.")); | |
402 | |
403 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
404 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
405 gtk_widget_show(label); | |
406 | |
407 /* Hbox for the accounts drop-down and label. */ | |
408 hbox = gtk_hbox_new(FALSE, 12); | |
409 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
410 gtk_widget_show(hbox); | |
411 | |
412 /* "Set privacy for:" label */ | |
413 label = gtk_label_new(_("Set privacy for:")); | |
414 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
415 gtk_widget_show(label); | |
416 | |
417 /* Accounts drop-down */ | |
8940 | 418 dropdown = gaim_gtk_account_option_menu_new(NULL, FALSE, |
6371 | 419 G_CALLBACK(select_account_cb), |
6646
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
420 check_account_func, dialog); |
6371 | 421 gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); |
422 gtk_widget_show(dropdown); | |
8137 | 423 gaim_set_accessible_label (dropdown, label); |
8940 | 424 dialog->account = gaim_gtk_account_option_menu_get_selected(dropdown); |
6371 | 425 |
426 /* Add the drop-down list with the allow/block types. */ | |
427 dialog->type_menu = gtk_option_menu_new(); | |
428 gtk_box_pack_start(GTK_BOX(vbox), dialog->type_menu, FALSE, FALSE, 0); | |
429 gtk_widget_show(dialog->type_menu); | |
430 | |
431 /* Build the menu for that. */ | |
432 menu = gtk_menu_new(); | |
433 | |
434 for (i = 0; i < menu_entry_count; i++) { | |
435 gaim_new_item(menu, _(menu_entries[i].text)); | |
436 | |
437 if (menu_entries[i].num == dialog->account->perm_deny) | |
438 selected = i; | |
439 } | |
440 | |
441 gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->type_menu), menu); | |
442 gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->type_menu), selected); | |
443 | |
444 g_signal_connect(G_OBJECT(dialog->type_menu), "changed", | |
445 G_CALLBACK(type_changed_cb), dialog); | |
446 | |
447 /* Build the treeview for the allow list. */ | |
448 dialog->allow_widget = build_allow_list(dialog); | |
449 gtk_box_pack_start(GTK_BOX(vbox), dialog->allow_widget, TRUE, TRUE, 0); | |
450 | |
451 /* Build the treeview for the block list. */ | |
452 dialog->block_widget = build_block_list(dialog); | |
453 gtk_box_pack_start(GTK_BOX(vbox), dialog->block_widget, TRUE, TRUE, 0); | |
454 | |
455 /* Add the button box for Add, Remove, Clear */ | |
456 dialog->button_box = bbox = gtk_hbutton_box_new(); | |
457 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); | |
458 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
459 | |
460 /* Add button */ | |
461 button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
462 dialog->add_button = button; | |
463 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
464 gtk_widget_show(button); | |
465 | |
466 g_signal_connect(G_OBJECT(button), "clicked", | |
467 G_CALLBACK(add_cb), dialog); | |
468 | |
469 /* Remove button */ | |
470 button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); | |
471 dialog->remove_button = button; | |
472 gtk_widget_set_sensitive(button, FALSE); | |
473 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
474 gtk_widget_show(button); | |
475 | |
476 g_signal_connect(G_OBJECT(button), "clicked", | |
477 G_CALLBACK(remove_cb), dialog); | |
478 | |
479 /* Clear button */ | |
480 button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); | |
481 dialog->clear_button = button; | |
482 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
483 gtk_widget_show(button); | |
484 | |
485 g_signal_connect(G_OBJECT(button), "clicked", | |
486 G_CALLBACK(clear_cb), dialog); | |
487 | |
488 /* Separator */ | |
489 sep = gtk_hseparator_new(); | |
490 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
491 gtk_widget_show(sep); | |
492 | |
493 /* Another button box. */ | |
494 bbox = gtk_hbutton_box_new(); | |
495 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
496 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
497 gtk_widget_show(bbox); | |
498 | |
499 /* Close button */ | |
500 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
501 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
502 gtk_widget_show(button); | |
503 | |
504 g_signal_connect(G_OBJECT(button), "clicked", | |
505 G_CALLBACK(close_cb), dialog); | |
506 | |
8175 | 507 if (dialog->account->perm_deny == GAIM_PRIVACY_ALLOW_USERS) { |
6371 | 508 gtk_widget_show(dialog->allow_widget); |
509 gtk_widget_show(dialog->button_box); | |
510 dialog->in_allow_list = TRUE; | |
511 } | |
8175 | 512 else if (dialog->account->perm_deny == GAIM_PRIVACY_DENY_USERS) { |
6371 | 513 gtk_widget_show(dialog->block_widget); |
514 gtk_widget_show(dialog->button_box); | |
515 dialog->in_allow_list = FALSE; | |
516 } | |
517 | |
518 return dialog; | |
519 } | |
520 | |
521 void | |
522 gaim_gtk_privacy_dialog_show(void) | |
523 { | |
524 if (privacy_dialog == NULL) | |
525 privacy_dialog = privacy_dialog_new(); | |
526 | |
527 gtk_widget_show(privacy_dialog->win); | |
528 gdk_window_raise(privacy_dialog->win->window); | |
529 } | |
530 | |
531 void | |
532 gaim_gtk_privacy_dialog_hide(void) | |
533 { | |
534 if (privacy_dialog == NULL) | |
535 return; | |
536 | |
7165 | 537 g_free(privacy_dialog); |
6371 | 538 privacy_dialog = NULL; |
539 } | |
540 | |
541 static void | |
542 destroy_request_data(GaimGtkPrivacyRequestData *data) | |
543 { | |
544 if (data->name != NULL) | |
545 g_free(data->name); | |
546 | |
547 g_free(data); | |
548 } | |
549 | |
550 static void | |
551 confirm_permit_block_cb(GaimGtkPrivacyRequestData *data, int option) | |
552 { | |
553 if (data->block) | |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
554 gaim_privacy_deny_add(data->account, data->name, FALSE); |
6371 | 555 else |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
556 gaim_privacy_permit_add(data->account, data->name, FALSE); |
6371 | 557 |
558 destroy_request_data(data); | |
559 } | |
560 | |
561 static void | |
562 add_permit_block_cb(GaimGtkPrivacyRequestData *data, const char *name) | |
563 { | |
564 data->name = g_strdup(name); | |
565 | |
566 confirm_permit_block_cb(data, 0); | |
567 } | |
568 | |
569 void | |
570 gaim_gtk_request_add_permit(GaimAccount *account, const char *name) | |
571 { | |
572 GaimGtkPrivacyRequestData *data; | |
573 | |
574 g_return_if_fail(account != NULL); | |
575 | |
576 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
577 data->account = account; | |
578 data->name = g_strdup(name); | |
579 data->block = FALSE; | |
580 | |
581 if (name == NULL) { | |
582 gaim_request_input(account, _("Permit User"), | |
583 _("Type a user you permit to contact you."), | |
584 _("Please enter the name of the user you wish to be " | |
585 "able to contact you."), | |
8697 | 586 NULL, FALSE, FALSE, NULL, |
6371 | 587 _("Permit"), G_CALLBACK(add_permit_block_cb), |
588 _("Cancel"), G_CALLBACK(destroy_request_data), | |
589 data); | |
590 } | |
591 else { | |
592 char *primary = g_strdup_printf(_("Allow %s to contact you?"), name); | |
593 char *secondary = | |
594 g_strdup_printf(_("Are you sure you wish to allow " | |
595 "%s to contact you?"), name); | |
596 | |
597 | |
598 gaim_request_action(account, _("Permit User"), primary, secondary, | |
599 0, data, 2, | |
600 _("Permit"), G_CALLBACK(confirm_permit_block_cb), | |
601 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
602 | |
603 g_free(primary); | |
604 g_free(secondary); | |
605 } | |
606 } | |
607 | |
608 void | |
609 gaim_gtk_request_add_block(GaimAccount *account, const char *name) | |
610 { | |
611 GaimGtkPrivacyRequestData *data; | |
612 | |
613 g_return_if_fail(account != NULL); | |
614 | |
615 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
616 data->account = account; | |
617 data->name = g_strdup(name); | |
618 data->block = TRUE; | |
619 | |
620 if (name == NULL) { | |
621 gaim_request_input(account, _("Block User"), | |
622 _("Type a user to block."), | |
623 _("Please enter the name of the user you wish to block."), | |
8697 | 624 NULL, FALSE, FALSE, NULL, |
6371 | 625 _("Block"), G_CALLBACK(add_permit_block_cb), |
626 _("Cancel"), G_CALLBACK(destroy_request_data), | |
627 data); | |
628 } | |
629 else { | |
630 char *primary = g_strdup_printf(_("Block %s?"), name); | |
631 char *secondary = | |
632 g_strdup_printf(_("Are you sure you want to block %s?"), name); | |
633 | |
634 gaim_request_action(account, _("Block User"), primary, secondary, | |
635 0, data, 2, | |
636 _("Block"), G_CALLBACK(confirm_permit_block_cb), | |
637 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
638 | |
639 g_free(primary); | |
640 g_free(secondary); | |
641 } | |
642 } | |
643 | |
644 static void | |
645 gaim_gtk_permit_added_removed(GaimAccount *account, const char *name) | |
646 { | |
647 if (privacy_dialog != NULL) | |
648 rebuild_allow_list(privacy_dialog); | |
649 } | |
650 | |
651 static void | |
652 gaim_gtk_deny_added_removed(GaimAccount *account, const char *name) | |
653 { | |
654 if (privacy_dialog != NULL) | |
655 rebuild_block_list(privacy_dialog); | |
656 } | |
657 | |
658 static GaimPrivacyUiOps privacy_ops = | |
659 { | |
660 gaim_gtk_permit_added_removed, | |
661 gaim_gtk_permit_added_removed, | |
662 gaim_gtk_deny_added_removed, | |
663 gaim_gtk_deny_added_removed | |
664 }; | |
665 | |
666 GaimPrivacyUiOps * | |
667 gaim_gtk_privacy_get_ui_ops(void) | |
668 { | |
669 return &privacy_ops; | |
670 } | |
671 | |
672 void | |
673 gaim_gtk_privacy_init(void) | |
674 { | |
675 } |