Mercurial > pidgin
annotate src/gtkprivacy.c @ 8573:7dcd6f26e4a7
[gaim-migrate @ 9321]
" This patch reimplements the system log. It writes
system log to
~/.gaim/logs/<protocol>/<username>/.system/<timestamp>.(txt|html),
where <timestamp> is the time that the account
<username> with <protocol> signs on. Nathan (faceprint)
and LSchiere suggested this logging scheme. No code is
currently written to read the old system logs.
Note that if you change the logging format, you need to
re-login the accounts for the change to take effect."
--Ka-Hing (javabsp) Cheung
who continues:
"Now this one applies, also contains a rider patch that, if
you enable sound for "Someone says your name in chat", it
will not play a sound if the message is a system message,
like if jabber chat tells you that "*** becomes available"
and *** is you, it won't play a sound."
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Sat, 03 Apr 2004 18:34:29 +0000 |
parents | 267050247da9 |
children | 725413cc9fb9 |
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 |
6371 | 350 static GaimGtkPrivacyDialog * |
351 privacy_dialog_new(void) | |
352 { | |
353 GaimGtkPrivacyDialog *dialog; | |
354 GaimConnection *gc; | |
355 GtkWidget *bbox; | |
356 GtkWidget *hbox; | |
357 GtkWidget *vbox; | |
358 GtkWidget *button; | |
359 GtkWidget *dropdown; | |
360 GtkWidget *label; | |
361 GtkWidget *menu; | |
362 GtkWidget *sep; | |
363 int selected = 0; | |
364 int i; | |
365 | |
366 dialog = g_new0(GaimGtkPrivacyDialog, 1); | |
367 | |
368 gc = (GaimConnection *)gaim_connections_get_all()->data; | |
369 dialog->account = gaim_connection_get_account(gc); | |
370 | |
371 dialog->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); | |
372 gtk_window_set_resizable(GTK_WINDOW(dialog->win), FALSE); | |
373 gtk_window_set_role(GTK_WINDOW(dialog->win), "privacy"); | |
374 gtk_window_set_title(GTK_WINDOW(dialog->win), _("Privacy")); | |
375 gtk_container_set_border_width(GTK_CONTAINER(dialog->win), 12); | |
376 | |
377 g_signal_connect(G_OBJECT(dialog->win), "delete_event", | |
378 G_CALLBACK(destroy_cb), dialog); | |
379 | |
380 gtk_widget_realize(dialog->win); | |
381 | |
382 /* Main vbox */ | |
383 vbox = gtk_vbox_new(FALSE, 12); | |
384 gtk_container_add(GTK_CONTAINER(dialog->win), vbox); | |
385 gtk_widget_show(vbox); | |
386 | |
387 /* Description label */ | |
388 label = gtk_label_new( | |
389 _("Changes to privacy settings take effect immediately.")); | |
390 | |
391 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); | |
392 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | |
393 gtk_widget_show(label); | |
394 | |
395 /* Hbox for the accounts drop-down and label. */ | |
396 hbox = gtk_hbox_new(FALSE, 12); | |
397 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); | |
398 gtk_widget_show(hbox); | |
399 | |
400 /* "Set privacy for:" label */ | |
401 label = gtk_label_new(_("Set privacy for:")); | |
402 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | |
403 gtk_widget_show(label); | |
404 | |
405 /* Accounts drop-down */ | |
406 dropdown = gaim_gtk_account_option_menu_new(dialog->account, FALSE, | |
407 G_CALLBACK(select_account_cb), | |
6646
b89d98f0bf79
[gaim-migrate @ 7171]
Christian Hammond <chipx86@chipx86.com>
parents:
6378
diff
changeset
|
408 check_account_func, dialog); |
6371 | 409 gtk_box_pack_start(GTK_BOX(hbox), dropdown, FALSE, FALSE, 0); |
410 gtk_widget_show(dropdown); | |
8137 | 411 gaim_set_accessible_label (dropdown, label); |
6371 | 412 |
413 /* Add the drop-down list with the allow/block types. */ | |
414 dialog->type_menu = gtk_option_menu_new(); | |
415 gtk_box_pack_start(GTK_BOX(vbox), dialog->type_menu, FALSE, FALSE, 0); | |
416 gtk_widget_show(dialog->type_menu); | |
417 | |
418 /* Build the menu for that. */ | |
419 menu = gtk_menu_new(); | |
420 | |
421 for (i = 0; i < menu_entry_count; i++) { | |
422 gaim_new_item(menu, _(menu_entries[i].text)); | |
423 | |
424 if (menu_entries[i].num == dialog->account->perm_deny) | |
425 selected = i; | |
426 } | |
427 | |
428 gtk_option_menu_set_menu(GTK_OPTION_MENU(dialog->type_menu), menu); | |
429 gtk_option_menu_set_history(GTK_OPTION_MENU(dialog->type_menu), selected); | |
430 | |
431 g_signal_connect(G_OBJECT(dialog->type_menu), "changed", | |
432 G_CALLBACK(type_changed_cb), dialog); | |
433 | |
434 /* Build the treeview for the allow list. */ | |
435 dialog->allow_widget = build_allow_list(dialog); | |
436 gtk_box_pack_start(GTK_BOX(vbox), dialog->allow_widget, TRUE, TRUE, 0); | |
437 | |
438 /* Build the treeview for the block list. */ | |
439 dialog->block_widget = build_block_list(dialog); | |
440 gtk_box_pack_start(GTK_BOX(vbox), dialog->block_widget, TRUE, TRUE, 0); | |
441 | |
442 /* Add the button box for Add, Remove, Clear */ | |
443 dialog->button_box = bbox = gtk_hbutton_box_new(); | |
444 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_SPREAD); | |
445 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
446 | |
447 /* Add button */ | |
448 button = gtk_button_new_from_stock(GTK_STOCK_ADD); | |
449 dialog->add_button = button; | |
450 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
451 gtk_widget_show(button); | |
452 | |
453 g_signal_connect(G_OBJECT(button), "clicked", | |
454 G_CALLBACK(add_cb), dialog); | |
455 | |
456 /* Remove button */ | |
457 button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); | |
458 dialog->remove_button = button; | |
459 gtk_widget_set_sensitive(button, FALSE); | |
460 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
461 gtk_widget_show(button); | |
462 | |
463 g_signal_connect(G_OBJECT(button), "clicked", | |
464 G_CALLBACK(remove_cb), dialog); | |
465 | |
466 /* Clear button */ | |
467 button = gtk_button_new_from_stock(GTK_STOCK_CLEAR); | |
468 dialog->clear_button = button; | |
469 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
470 gtk_widget_show(button); | |
471 | |
472 g_signal_connect(G_OBJECT(button), "clicked", | |
473 G_CALLBACK(clear_cb), dialog); | |
474 | |
475 /* Separator */ | |
476 sep = gtk_hseparator_new(); | |
477 gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); | |
478 gtk_widget_show(sep); | |
479 | |
480 /* Another button box. */ | |
481 bbox = gtk_hbutton_box_new(); | |
482 gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); | |
483 gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); | |
484 gtk_widget_show(bbox); | |
485 | |
486 /* Close button */ | |
487 button = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | |
488 gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); | |
489 gtk_widget_show(button); | |
490 | |
491 g_signal_connect(G_OBJECT(button), "clicked", | |
492 G_CALLBACK(close_cb), dialog); | |
493 | |
8175 | 494 if (dialog->account->perm_deny == GAIM_PRIVACY_ALLOW_USERS) { |
6371 | 495 gtk_widget_show(dialog->allow_widget); |
496 gtk_widget_show(dialog->button_box); | |
497 dialog->in_allow_list = TRUE; | |
498 } | |
8175 | 499 else if (dialog->account->perm_deny == GAIM_PRIVACY_DENY_USERS) { |
6371 | 500 gtk_widget_show(dialog->block_widget); |
501 gtk_widget_show(dialog->button_box); | |
502 dialog->in_allow_list = FALSE; | |
503 } | |
504 | |
505 return dialog; | |
506 } | |
507 | |
508 void | |
509 gaim_gtk_privacy_dialog_show(void) | |
510 { | |
511 if (privacy_dialog == NULL) | |
512 privacy_dialog = privacy_dialog_new(); | |
513 | |
514 gtk_widget_show(privacy_dialog->win); | |
515 gdk_window_raise(privacy_dialog->win->window); | |
516 } | |
517 | |
518 void | |
519 gaim_gtk_privacy_dialog_hide(void) | |
520 { | |
521 if (privacy_dialog == NULL) | |
522 return; | |
523 | |
7165 | 524 g_free(privacy_dialog); |
6371 | 525 privacy_dialog = NULL; |
526 } | |
527 | |
528 static void | |
529 destroy_request_data(GaimGtkPrivacyRequestData *data) | |
530 { | |
531 if (data->name != NULL) | |
532 g_free(data->name); | |
533 | |
534 g_free(data); | |
535 } | |
536 | |
537 static void | |
538 confirm_permit_block_cb(GaimGtkPrivacyRequestData *data, int option) | |
539 { | |
540 if (data->block) | |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
541 gaim_privacy_deny_add(data->account, data->name, FALSE); |
6371 | 542 else |
6378
01289157fc37
[gaim-migrate @ 6883]
Christian Hammond <chipx86@chipx86.com>
parents:
6375
diff
changeset
|
543 gaim_privacy_permit_add(data->account, data->name, FALSE); |
6371 | 544 |
545 destroy_request_data(data); | |
546 } | |
547 | |
548 static void | |
549 add_permit_block_cb(GaimGtkPrivacyRequestData *data, const char *name) | |
550 { | |
551 data->name = g_strdup(name); | |
552 | |
553 confirm_permit_block_cb(data, 0); | |
554 } | |
555 | |
556 void | |
557 gaim_gtk_request_add_permit(GaimAccount *account, const char *name) | |
558 { | |
559 GaimGtkPrivacyRequestData *data; | |
560 | |
561 g_return_if_fail(account != NULL); | |
562 | |
563 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
564 data->account = account; | |
565 data->name = g_strdup(name); | |
566 data->block = FALSE; | |
567 | |
568 if (name == NULL) { | |
569 gaim_request_input(account, _("Permit User"), | |
570 _("Type a user you permit to contact you."), | |
571 _("Please enter the name of the user you wish to be " | |
572 "able to contact you."), | |
573 NULL, FALSE, FALSE, | |
574 _("Permit"), G_CALLBACK(add_permit_block_cb), | |
575 _("Cancel"), G_CALLBACK(destroy_request_data), | |
576 data); | |
577 } | |
578 else { | |
579 char *primary = g_strdup_printf(_("Allow %s to contact you?"), name); | |
580 char *secondary = | |
581 g_strdup_printf(_("Are you sure you wish to allow " | |
582 "%s to contact you?"), name); | |
583 | |
584 | |
585 gaim_request_action(account, _("Permit User"), primary, secondary, | |
586 0, data, 2, | |
587 _("Permit"), G_CALLBACK(confirm_permit_block_cb), | |
588 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
589 | |
590 g_free(primary); | |
591 g_free(secondary); | |
592 } | |
593 } | |
594 | |
595 void | |
596 gaim_gtk_request_add_block(GaimAccount *account, const char *name) | |
597 { | |
598 GaimGtkPrivacyRequestData *data; | |
599 | |
600 g_return_if_fail(account != NULL); | |
601 | |
602 data = g_new0(GaimGtkPrivacyRequestData, 1); | |
603 data->account = account; | |
604 data->name = g_strdup(name); | |
605 data->block = TRUE; | |
606 | |
607 if (name == NULL) { | |
608 gaim_request_input(account, _("Block User"), | |
609 _("Type a user to block."), | |
610 _("Please enter the name of the user you wish to block."), | |
611 NULL, FALSE, FALSE, | |
612 _("Block"), G_CALLBACK(add_permit_block_cb), | |
613 _("Cancel"), G_CALLBACK(destroy_request_data), | |
614 data); | |
615 } | |
616 else { | |
617 char *primary = g_strdup_printf(_("Block %s?"), name); | |
618 char *secondary = | |
619 g_strdup_printf(_("Are you sure you want to block %s?"), name); | |
620 | |
621 gaim_request_action(account, _("Block User"), primary, secondary, | |
622 0, data, 2, | |
623 _("Block"), G_CALLBACK(confirm_permit_block_cb), | |
624 _("Cancel"), G_CALLBACK(destroy_request_data)); | |
625 | |
626 g_free(primary); | |
627 g_free(secondary); | |
628 } | |
629 } | |
630 | |
631 static void | |
632 gaim_gtk_permit_added_removed(GaimAccount *account, const char *name) | |
633 { | |
634 if (privacy_dialog != NULL) | |
635 rebuild_allow_list(privacy_dialog); | |
636 } | |
637 | |
638 static void | |
639 gaim_gtk_deny_added_removed(GaimAccount *account, const char *name) | |
640 { | |
641 if (privacy_dialog != NULL) | |
642 rebuild_block_list(privacy_dialog); | |
643 } | |
644 | |
645 static GaimPrivacyUiOps privacy_ops = | |
646 { | |
647 gaim_gtk_permit_added_removed, | |
648 gaim_gtk_permit_added_removed, | |
649 gaim_gtk_deny_added_removed, | |
650 gaim_gtk_deny_added_removed | |
651 }; | |
652 | |
653 GaimPrivacyUiOps * | |
654 gaim_gtk_privacy_get_ui_ops(void) | |
655 { | |
656 return &privacy_ops; | |
657 } | |
658 | |
659 void | |
660 gaim_gtk_privacy_init(void) | |
661 { | |
662 } |