Mercurial > pidgin
diff src/dialogs.c @ 3367:3b00d97d59aa
[gaim-migrate @ 3386]
There'll be more tommorow! Thanks for coming to the party.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Fri, 02 Aug 2002 04:52:48 +0000 |
parents | dd34e0b40fed |
children | 3cd2fbddf95a |
line wrap: on
line diff
--- a/src/dialogs.c Fri Aug 02 04:49:23 2002 +0000 +++ b/src/dialogs.c Fri Aug 02 04:52:48 2002 +0000 @@ -54,6 +54,8 @@ #include "pixmaps/add.xpm" #include "pixmaps/warn.xpm" #include "pixmaps/close.xpm" +#include "pixmaps/gnome_add.xpm" +#include "pixmaps/gnome_remove.xpm" #include "pixmaps/angel.xpm" #include "pixmaps/bigsmile.xpm" @@ -1121,6 +1123,393 @@ } +/*------------------------------------------------------------------------* + * Privacy Settings * + *------------------------------------------------------------------------*/ +static GtkWidget *deny_type = NULL; +static GtkWidget *deny_conn_hbox = NULL; +static GtkWidget *deny_opt_menu = NULL; +static struct gaim_connection *current_deny_gc = NULL; +static gboolean current_is_deny = FALSE; +static GtkWidget *allow_list = NULL; +static GtkWidget *block_list = NULL; + +static void set_deny_mode(GtkWidget *w, int data) +{ + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + return; + debug_printf("setting deny mode %d\n", data); + current_deny_gc->permdeny = data; + serv_set_permit_deny(current_deny_gc); + do_export(current_deny_gc); +} + +static GtkWidget *deny_opt(char *label, int which, GtkWidget *box, GtkWidget *set) +{ + GtkWidget *opt; + + if (!set) + opt = gtk_radio_button_new_with_label(NULL, label); + else + opt = + gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(set)), + label); + gtk_box_pack_start(GTK_BOX(box), opt, FALSE, FALSE, 0); + gtk_signal_connect(GTK_OBJECT(opt), "toggled", GTK_SIGNAL_FUNC(set_deny_mode), (void *)which); + gtk_widget_show(opt); + if (current_deny_gc->permdeny == which) + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(opt), TRUE); + + return opt; +} + +static void des_deny_opt(GtkWidget *d, gpointer e) +{ + gtk_widget_destroy(d); + current_deny_gc = NULL; + deny_conn_hbox = NULL; + deny_type = NULL; + deny_opt_menu = NULL; + current_is_deny = FALSE; + allow_list = NULL; + block_list = NULL; +} + +static void set_deny_type() +{ + GSList *bg = gtk_radio_button_group(GTK_RADIO_BUTTON(deny_type)); + + switch (current_deny_gc->permdeny) { + case 4: + break; + case 3: + bg = bg->next->next; + break; + case 2: + bg = bg->next; + break; + case 1: + bg = bg->next->next->next; + break; + } + + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(bg->data), TRUE); +} + +void build_allow_list() +{ + GtkWidget *label; + GtkWidget *list_item; + GSList *p; + + if (!current_is_deny) + return; + + p = current_deny_gc->permit; + + gtk_list_remove_items(GTK_LIST(allow_list), GTK_LIST(allow_list)->children); + + while (p) { + label = gtk_label_new(p->data); + list_item = gtk_list_item_new(); + gtk_container_add(GTK_CONTAINER(list_item), label); + gtk_object_set_user_data(GTK_OBJECT(list_item), p->data); + gtk_widget_show(label); + gtk_container_add(GTK_CONTAINER(allow_list), list_item); + gtk_widget_show(list_item); + p = p->next; + } +} + +void build_block_list() +{ + GtkWidget *label; + GtkWidget *list_item; + GSList *d; + + if (!current_is_deny) + return; + + d = current_deny_gc->deny; + + gtk_list_remove_items(GTK_LIST(block_list), GTK_LIST(block_list)->children); + + while (d) { + label = gtk_label_new(d->data); + list_item = gtk_list_item_new(); + gtk_container_add(GTK_CONTAINER(list_item), label); + gtk_object_set_user_data(GTK_OBJECT(list_item), d->data); + gtk_widget_show(label); + gtk_container_add(GTK_CONTAINER(block_list), list_item); + gtk_widget_show(list_item); + d = d->next; + } +} + +static void deny_gc_opt(GtkWidget *opt, struct gaim_connection *gc) +{ + current_deny_gc = gc; + set_deny_type(); + build_allow_list(); + build_block_list(); +} + +static void build_deny_menu() +{ + GtkWidget *menu; + GtkWidget *opt; + GSList *c = connections; + struct gaim_connection *gc; + int count = 0; + gboolean found = FALSE; + char buf[2048]; + + if (g_slist_length(connections) == 1) { + gtk_widget_hide(deny_conn_hbox); + return; + } else + gtk_widget_show(deny_conn_hbox); + + menu = gtk_menu_new(); + + while (c) { + gc = (struct gaim_connection *)c->data; + c = c->next; + if (!gc->prpl->set_permit_deny) + continue; + g_snprintf(buf, sizeof buf, "%s (%s)", gc->username, gc->prpl->name()); + opt = gtk_menu_item_new_with_label(buf); + gtk_signal_connect(GTK_OBJECT(opt), "activate", GTK_SIGNAL_FUNC(deny_gc_opt), gc); + gtk_widget_show(opt); + gtk_menu_append(GTK_MENU(menu), opt); + if (gc == current_deny_gc) + found = TRUE; + else if (!found) + count++; + } + + if (!found) { + current_deny_gc = connections->data; + count = 0; + } + + gtk_option_menu_remove_menu(GTK_OPTION_MENU(deny_opt_menu)); + gtk_option_menu_set_menu(GTK_OPTION_MENU(deny_opt_menu), menu); + gtk_option_menu_set_history(GTK_OPTION_MENU(deny_opt_menu), count); + + gtk_widget_show(menu); + gtk_widget_show(deny_opt_menu); +} + +static void pref_deny_add(GtkWidget *button, gboolean permit) +{ + show_add_perm(current_deny_gc, NULL, permit); +} + +static void pref_deny_rem(GtkWidget *button, gboolean permit) +{ + GList *i; + char *who; + + if (permit && !allow_list) + return; + if (!permit && !block_list) + return; + + if (permit) + i = GTK_LIST(allow_list)->selection; + else + i = GTK_LIST(block_list)->selection; + + if (!i) + return; + who = gtk_object_get_user_data(GTK_OBJECT(i->data)); + if (permit) { + current_deny_gc->permit = g_slist_remove(current_deny_gc->permit, who); + serv_rem_permit(current_deny_gc, who); + build_allow_list(); + } else { + current_deny_gc->deny = g_slist_remove(current_deny_gc->deny, who); + serv_rem_deny(current_deny_gc, who); + build_block_list(); + } + + do_export(current_deny_gc); +} + +GtkWidget *privacy_win; +void update_privacy_connections() { /* This is a slightly better name */ + gboolean needdeny = FALSE; + GSList *c = connections; + struct gaim_connection *gc = NULL; + + if (!privacy_win) + return; + + while (c) { + gc = c->data; + if (gc->prpl->set_permit_deny) + break; + gc = NULL; + c = c->next; + } + needdeny = (gc != NULL); + + + if (needdeny) { + gtk_widget_set_sensitive(privacy_win, TRUE); + build_deny_menu(); + build_allow_list(); + build_block_list(); + } else { + gtk_widget_set_sensitive(privacy_win, FALSE); + } +} +static void destroy_privacy() { + current_deny_gc = NULL; + privacy_win = NULL; +} + +void show_privacy_options() +{ + GtkWidget *pwin; + GtkWidget *box; + GtkWidget *hbox; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *sw; + GtkWidget *bbox; + GtkWidget *button; + GtkWidget *sep; + GtkWidget *close_button; + + current_deny_gc = connections->data; /* this is safe because this screen will only be + available when there are connections */ + current_is_deny = TRUE; + + + privacy_win = pwin = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(pwin), FALSE, TRUE, TRUE); + gtk_window_set_wmclass(GTK_WINDOW(pwin), "privacy", "Gaim"); + gtk_window_set_title(GTK_WINDOW(pwin), _("Gaim - Privacy")); + gtk_signal_connect(GTK_OBJECT(pwin), "destroy", GTK_SIGNAL_FUNC(destroy_privacy), NULL); + gtk_widget_realize(pwin); + aol_icon(pwin->window); + + gtk_widget_set_usize(pwin, 0, 400); + + box = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + gtk_container_add(GTK_CONTAINER(pwin), box); + gtk_widget_show(box); + + label = gtk_label_new(_("Privacy settings are affected immediately.")); + gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + deny_conn_hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(box), deny_conn_hbox, FALSE, FALSE, 0); + gtk_widget_show(deny_conn_hbox); + + label = gtk_label_new(_("Set privacy for:")); + gtk_box_pack_start(GTK_BOX(deny_conn_hbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + deny_opt_menu = gtk_option_menu_new(); + gtk_box_pack_start(GTK_BOX(deny_conn_hbox), deny_opt_menu, FALSE, FALSE, 5); + gtk_signal_connect(GTK_OBJECT(deny_opt_menu), "destroy", GTK_SIGNAL_FUNC(des_deny_opt), NULL); + gtk_widget_show(deny_opt_menu); + + build_deny_menu(); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 5); + gtk_widget_show(hbox); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); + gtk_widget_show(vbox); + + deny_type = deny_opt(_("Allow all users to contact me"), 1, vbox, NULL); + deny_type = deny_opt(_("Allow only the users below"), 3, vbox, deny_type); + + label = gtk_label_new(_("Allow List")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 5); + gtk_widget_show(sw); + + allow_list = gtk_list_new(); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), allow_list); + gtk_widget_show(allow_list); + + build_allow_list(); + + bbox = gtk_hbox_new(TRUE, 5); + gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 5); + gtk_widget_show(bbox); + + button = picture_button(pwin, _("Add"), gnome_add_xpm); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(pref_deny_add), (void *)TRUE); + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5); + + button = picture_button(pwin, _("Remove"), gnome_remove_xpm); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(pref_deny_rem), (void *)TRUE); + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 5); + gtk_widget_show(vbox); + + deny_type = deny_opt(_("Deny all users"), 2, vbox, deny_type); + deny_type = deny_opt(_("Block the users below"), 4, vbox, deny_type); + + label = gtk_label_new(_("Block List")); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 5); + gtk_widget_show(sw); + + block_list = gtk_list_new(); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), block_list); + gtk_widget_show(block_list); + + build_block_list(); + + bbox = gtk_hbox_new(TRUE, 5); + gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 5); + gtk_widget_show(bbox); + + button = picture_button(pwin, _("Add"), gnome_add_xpm); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(pref_deny_add), FALSE); + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5); + + button = picture_button(pwin, _("Remove"), gnome_remove_xpm); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(pref_deny_rem), FALSE); + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5); + + sep = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(box), sep, FALSE, FALSE, 5); + gtk_widget_show(sep); + + hbox = gtk_hbox_new(TRUE, 5); + gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 5); + gtk_widget_show(hbox); + close_button = picture_button(pwin, _("Close"), cancel_xpm); + gtk_box_pack_end(GTK_BOX(hbox), close_button, FALSE, FALSE, 5); + gtk_signal_connect_object(GTK_OBJECT(close_button), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), pwin); + + gtk_widget_show(pwin); +} + + + /*------------------------------------------------------------------------*/ /* The dialog for new buddy pounces */ /*------------------------------------------------------------------------*/ @@ -2573,8 +2962,8 @@ /* Color Selection Dialog */ /*------------------------------------------------------*/ -static GtkWidget *fgcseld = NULL; -static GtkWidget *bgcseld = NULL; +GtkWidget *fgcseld = NULL; +GtkWidget *bgcseld = NULL; void cancel_fgcolor(GtkWidget *widget, struct conversation *c) { @@ -2656,43 +3045,6 @@ cancel_bgcolor(NULL, c); } -static void destroy_colorsel(GtkWidget *w, gpointer d) -{ - if (d) { - gtk_widget_destroy(fgcseld); - fgcseld = NULL; - } else { - gtk_widget_destroy(bgcseld); - bgcseld = NULL; - } -} - -static void apply_color_dlg(GtkWidget *w, gpointer d) -{ - gdouble color[3]; - if ((int)d == 1) { - gtk_color_selection_get_color(GTK_COLOR_SELECTION - (GTK_COLOR_SELECTION_DIALOG(fgcseld)->colorsel), color); - destroy_colorsel(NULL, (void *)1); - - fgcolor.red = ((guint16)(color[0] * 65535)) >> 8; - fgcolor.green = ((guint16)(color[1] * 65535)) >> 8; - fgcolor.blue = ((guint16)(color[2] * 65535)) >> 8; - update_color(NULL, pref_fg_picture); - update_convo_color(TRUE); - } else { - gtk_color_selection_get_color(GTK_COLOR_SELECTION - (GTK_COLOR_SELECTION_DIALOG(bgcseld)->colorsel), color); - destroy_colorsel(NULL, (void *)0); - - bgcolor.red = ((guint16)(color[0] * 65535)) >> 8; - bgcolor.green = ((guint16)(color[1] * 65535)) >> 8; - bgcolor.blue = ((guint16)(color[2] * 65535)) >> 8; - update_color(NULL, pref_bg_picture); - update_convo_color(FALSE); - } -} - void show_fgcolor_dialog(struct conversation *c, GtkWidget *color) { GtkWidget *colorsel; @@ -2855,25 +3207,6 @@ fontseld = NULL; } -void apply_font_dlg(GtkWidget *w, GtkWidget *f) -{ - int i, j = 0, k = 0; - char *fontname; - - fontname = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(fontseld)); - destroy_fontsel(0, 0); - for (i = 0; i < strlen(fontname); i++) { - if (fontname[i] == '-') { - if (++j > 2) - break; - } else if (j == 2) - fontface[k++] = fontname[i]; - } - fontface[k] = '\0'; - g_snprintf(fontxfld, sizeof(fontxfld), "%s", fontname); - update_convo_font(); -} - void show_font_dialog(struct conversation *c, GtkWidget *font) { @@ -4226,6 +4559,32 @@ #endif } +#if GTK_CHECK_VERSION(1,3,0) +GtkWidget *pixbuf_button(char *text, char *iconfile) +{ + GtkWidget *button, *image, *label, *bbox; + button = gtk_button_new(); + bbox = gtk_hbox_new(FALSE, 5); + gtk_container_add (GTK_CONTAINER(button), bbox); + if (iconfile) { + char *filename; + filename = g_build_filename (DATADIR, "pixmaps", "gaim", "buttons", iconfile, NULL); + debug_printf("Loading: %s\n", filename); + image = gtk_image_new_from_file(filename); + gtk_box_pack_start(GTK_BOX(bbox), image, FALSE, FALSE, 0); + g_free(filename); + } + if (text) { + label = gtk_label_new(NULL); + gtk_label_set_text_with_mnemonic(GTK_LABEL(label), text); + gtk_label_set_mnemonic_widget(GTK_LABEL(label), button); + gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0); + } + gtk_widget_show_all(bbox); + return button; +} +#endif + GtkWidget *picture_button(GtkWidget *window, char *text, char **xpm) { GtkWidget *button;