Mercurial > pidgin.yaz
annotate src/gtkprivacy.c @ 8481:6d0869404696
[gaim-migrate @ 9214]
" this fixes and should close 9, 10, and 12 on simguys
list... those are...
9 Buttons that are pushed in when text is sent, stay
pushed in. They should reset to the default for the
line based on the B/I/U preferences.
10 Buttons are not properly pushed in if B/I/U are set
in the prefs when the conversation window appears.
12 Buttons don't push in and out when the cursor
enters regions that are differently formatted. For
example, if you move the cursor to a place where the
text is bold, the B button should probably be pushed in.
While working on these i uncovered another bug which
i'll start working on shortly, but thats no reason to
hold this back when someone may find something I missed..." --Gary Kramlich
as per his note, this does not fix moving the cursor with the mouse, but
that doesn't work without this patch either.
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sun, 21 Mar 2004 18:38:30 +0000 |
parents | 3b8387166187 |
children | c1e44e6f9cb1 |
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 |
245 dialog->account->perm_deny = menu_entries[new_type].num; | |
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 { | |
315 } | |
316 | |
317 static void | |
7165 | 318 close_cb(GtkWidget *button, GaimGtkPrivacyDialog *dialog) |
6371 | 319 { |
7165 | 320 gtk_widget_destroy(dialog->win); |
321 | |
6371 | 322 gaim_gtk_privacy_dialog_hide(); |
323 } | |
324 | |
6646
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
325 static gboolean |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
326 check_account_func(GaimAccount *account) |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
327 { |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
328 GaimConnection *gc = gaim_account_get_connection(account); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
329 GaimPluginProtocolInfo *prpl_info = NULL; |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
330 |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
331 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
332 |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
333 return (prpl_info->set_permit_deny != NULL); |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
334 } |
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
335 |
6371 | 336 static GaimGtkPrivacyDialog * |
337 privacy_dialog_new(void) | |
338 { | |
339 GaimGtkPrivacyDialog *dialog; | |
340 GaimConnection *gc; | |
341 GtkWidget *bbox; | |
342 GtkWidget *hbox; | |
343 GtkWidget *vbox; | |
344 GtkWidget *button; | |
345 GtkWidget *dropdown; | |
346 GtkWidget *label; | |
347 GtkWidget *menu; | |
348 GtkWidget *sep; | |
349 int selected = 0; | |
350 int i; | |
351 | |
352 dialog = g_new0(GaimGtkPrivacyDialog, 1); | |
353 | |
354 gc = (GaimConnection *)gaim_connections_get_all()->data; | |
355 dialog->account = gaim_connection_get_account(gc); | |
356 | |
357 dialog->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
358 gtk_window_set_resizable(GTK_WINDOW(dialog->win), FALSE); | |
359 gtk_window_set_role(GTK_WINDOW(dialog->win), "privacy"); | |
360 gtk_window_set_title(GTK_WINDOW(dialog->win), _("Privacy")); | |
361 gtk_container_set_border_width(GTK_CONTAINER(dialog->win), 12); | |
362 | |
363 g_signal_connect(G_OBJECT(dialog->win), "delete_event", | |
364 G_CALLBACK(destroy_cb), dialog); | |
365 | |
366 gtk_widget_realize(dialog->win); | |
367 | |
368 /* Main vbox */ | |
369 vbox = gtk_vbox_new(FALSE, 12); | |
370 gtk_container_add(GTK_CONTAINER(dialog->win), vbox); | |
371 gtk_widget_show(vbox); | |
372 | |
373 /* Description label */ | |
374 label = gtk_label_new( | |
375 _("Changes to privacy settings take effect immediately.")); | |
376 | |
377 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
378 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
379 gtk_widget_show(label); | |
380 | |
381 /* Hbox for the accounts drop-down and label. */ | |
382 hbox = gtk_hbox_new(FALSE, 12); | |
383 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
384 gtk_widget_show(hbox); | |
385 | |
386 /* "Set privacy for:" label */ | |
387 label = gtk_label_new(_("Set privacy for:")); | |
388 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
389 gtk_widget_show(label); | |
390 | |
391 /* Accounts drop-down */ | |
392 dropdown = gaim_gtk_account_option_menu_new(dialog->account, FALSE, | |
393 G_CALLBACK(select_account_cb), | |
6646
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
394 check_account_func, dialog); |
6371 | 395 gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); |
396 gtk_widget_show(dropdown); | |
8137 | 397 gaim_set_accessible_label (dropdown, label); |
6371 | 398 |
399 /* Add the drop-down list with the allow/block types. */ | |
400 dialog->type_menu = gtk_option_menu_new(); | |
401 gtk_box_pack_start(GTK_BOX(vbox), dialog->type_menu, FALSE, FALSE, 0); | |
402 gtk_widget_show(dialog->type_menu); | |
403 | |
404 /* Build the menu for that. */ | |
405 menu = gtk_menu_new(); | |
406 | |
407 for (i = 0; i < menu_entry_count; i++) { | |
408 gaim_new_item(menu, _(menu_entries[i].text)); | |
409 | |
410 if (menu_entries[i].num == dialog->account->perm_deny) | |
411 selected = i; | |
412 } | |
413 | |
414 gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->type_menu), menu); | |
415 gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->type_menu), selected); | |
416 | |
417 g_signal_connect(G_OBJECT(dialog->type_menu), "changed", | |
418 G_CALLBACK(type_changed_cb), dialog); | |
419 | |
420 /* Build the treeview for the allow list. */ | |
421 dialog->allow_widget = build_allow_list(dialog); | |
422 gtk_box_pack_start(GTK_BOX(vbox), dialog->allow_widget, TRUE, TRUE, 0); | |
423 | |
424 /* Build the treeview for the block list. */ | |
425 dialog->block_widget = build_block_list(dialog); | |
426 gtk_box_pack_start(GTK_BOX(vbox), dialog->block_widget, TRUE, TRUE, 0); | |
427 | |
428 /* Add the button box for Add, Remove, Clear */ | |
429 dialog->button_box = bbox = gtk_hbutton_box_new(); | |
430 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); | |
431 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
432 | |
433 /* Add button */ | |
434 button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
435 dialog->add_button = button; | |
436 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
437 gtk_widget_show(button); | |
438 | |
439 g_signal_connect(G_OBJECT(button), "clicked", | |
440 G_CALLBACK(add_cb), dialog); | |
441 | |
442 /* Remove button */ | |
443 button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); | |
444 dialog->remove_button = button; | |
445 gtk_widget_set_sensitive(button, FALSE); | |
446 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
447 gtk_widget_show(button); | |
448 | |
449 g_signal_connect(G_OBJECT(button), "clicked", | |
450 G_CALLBACK(remove_cb), dialog); | |
451 | |
452 /* Clear button */ | |
453 button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); | |
454 dialog->clear_button = button; | |
455 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
456 gtk_widget_show(button); | |
457 | |
458 g_signal_connect(G_OBJECT(button), "clicked", | |
459 G_CALLBACK(clear_cb), dialog); | |
460 | |
461 /* Separator */ | |
462 sep = gtk_hseparator_new(); | |
463 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
464 gtk_widget_show(sep); | |
465 | |
466 /* Another button box. */ | |
467 bbox = gtk_hbutton_box_new(); | |
468 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
469 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
470 gtk_widget_show(bbox); | |
471 | |
472 /* Close button */ | |
473 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
474 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
475 gtk_widget_show(button); | |
476 | |
477 g_signal_connect(G_OBJECT(button), "clicked", | |
478 G_CALLBACK(close_cb), dialog); | |
479 | |
8175 | 480 if (dialog->account->perm_deny == GAIM_PRIVACY_ALLOW_USERS) { |
6371 | 481 gtk_widget_show(dialog->allow_widget); |
482 gtk_widget_show(dialog->button_box); | |
483 dialog->in_allow_list = TRUE; | |
484 } | |
8175 | 485 else if (dialog->account->perm_deny == GAIM_PRIVACY_DENY_USERS) { |
6371 | 486 gtk_widget_show(dialog->block_widget); |
487 gtk_widget_show(dialog->button_box); | |
488 dialog->in_allow_list = FALSE; | |
489 } | |
490 | |
491 return dialog; | |
492 } | |
493 | |
494 void | |
495 gaim_gtk_privacy_dialog_show(void) | |
496 { | |
497 if (privacy_dialog == NULL) | |
498 privacy_dialog = privacy_dialog_new(); | |
499 | |
500 gtk_widget_show(privacy_dialog->win); | |
501 gdk_window_raise(privacy_dialog->win->window); | |
502 } | |
503 | |
504 void | |
505 gaim_gtk_privacy_dialog_hide(void) | |
506 { | |
507 if (privacy_dialog == NULL) | |
508 return; | |
509 | |
7165 | 510 g_free(privacy_dialog); |
6371 | 511 privacy_dialog = NULL; |
512 } | |
513 | |
514 static void | |
515 destroy_request_data(GaimGtkPrivacyRequestData *data) | |
516 { | |
517 if (data->name != NULL) | |
518 g_free(data->name); | |
519 | |
520 g_free(data); | |
521 } | |
522 | |
523 static void | |
524 confirm_permit_block_cb(GaimGtkPrivacyRequestData *data, int option) | |
525 { | |
526 if (data->block) | |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
527 gaim_privacy_deny_add(data->account, data->name, FALSE); |
6371 | 528 else |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
529 gaim_privacy_permit_add(data->account, data->name, FALSE); |
6371 | 530 |
531 destroy_request_data(data); | |
532 } | |
533 | |
534 static void | |
535 add_permit_block_cb(GaimGtkPrivacyRequestData *data, const char *name) | |
536 { | |
537 data->name = g_strdup(name); | |
538 | |
539 confirm_permit_block_cb(data, 0); | |
540 } | |
541 | |
542 void | |
543 gaim_gtk_request_add_permit(GaimAccount *account, const char *name) | |
544 { | |
545 GaimGtkPrivacyRequestData *data; | |
546 | |
547 g_return_if_fail(account != NULL); | |
548 | |
549 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
550 data->account = account; | |
551 data->name = g_strdup(name); | |
552 data->block = FALSE; | |
553 | |
554 if (name == NULL) { | |
555 gaim_request_input(account, _("Permit User"), | |
556 _("Type a user you permit to contact you."), | |
557 _("Please enter the name of the user you wish to be " | |
558 "able to contact you."), | |
559 NULL, FALSE, FALSE, | |
560 _("Permit"), G_CALLBACK(add_permit_block_cb), | |
561 _("Cancel"), G_CALLBACK(destroy_request_data), | |
562 data); | |
563 } | |
564 else { | |
565 char *primary = g_strdup_printf(_("Allow %s to contact you?"), name); | |
566 char *secondary = | |
567 g_strdup_printf(_("Are you sure you wish to allow " | |
568 "%s to contact you?"), name); | |
569 | |
570 | |
571 gaim_request_action(account, _("Permit User"), primary, secondary, | |
572 0, data, 2, | |
573 _("Permit"), G_CALLBACK(confirm_permit_block_cb), | |
574 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
575 | |
576 g_free(primary); | |
577 g_free(secondary); | |
578 } | |
579 } | |
580 | |
581 void | |
582 gaim_gtk_request_add_block(GaimAccount *account, const char *name) | |
583 { | |
584 GaimGtkPrivacyRequestData *data; | |
585 | |
586 g_return_if_fail(account != NULL); | |
587 | |
588 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
589 data->account = account; | |
590 data->name = g_strdup(name); | |
591 data->block = TRUE; | |
592 | |
593 if (name == NULL) { | |
594 gaim_request_input(account, _("Block User"), | |
595 _("Type a user to block."), | |
596 _("Please enter the name of the user you wish to block."), | |
597 NULL, FALSE, FALSE, | |
598 _("Block"), G_CALLBACK(add_permit_block_cb), | |
599 _("Cancel"), G_CALLBACK(destroy_request_data), | |
600 data); | |
601 } | |
602 else { | |
603 char *primary = g_strdup_printf(_("Block %s?"), name); | |
604 char *secondary = | |
605 g_strdup_printf(_("Are you sure you want to block %s?"), name); | |
606 | |
607 gaim_request_action(account, _("Block User"), primary, secondary, | |
608 0, data, 2, | |
609 _("Block"), G_CALLBACK(confirm_permit_block_cb), | |
610 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
611 | |
612 g_free(primary); | |
613 g_free(secondary); | |
614 } | |
615 } | |
616 | |
617 static void | |
618 gaim_gtk_permit_added_removed(GaimAccount *account, const char *name) | |
619 { | |
620 if (privacy_dialog != NULL) | |
621 rebuild_allow_list(privacy_dialog); | |
622 } | |
623 | |
624 static void | |
625 gaim_gtk_deny_added_removed(GaimAccount *account, const char *name) | |
626 { | |
627 if (privacy_dialog != NULL) | |
628 rebuild_block_list(privacy_dialog); | |
629 } | |
630 | |
631 static GaimPrivacyUiOps privacy_ops = | |
632 { | |
633 gaim_gtk_permit_added_removed, | |
634 gaim_gtk_permit_added_removed, | |
635 gaim_gtk_deny_added_removed, | |
636 gaim_gtk_deny_added_removed | |
637 }; | |
638 | |
639 GaimPrivacyUiOps * | |
640 gaim_gtk_privacy_get_ui_ops(void) | |
641 { | |
642 return &privacy_ops; | |
643 } | |
644 | |
645 void | |
646 gaim_gtk_privacy_init(void) | |
647 { | |
648 } |