Update of /cvsroot/gaim/gaim/src In directory sc8-pr-cvs1:/tmp/cvs-serv8573/src Modified Files: Makefile.am away.c buddy.c conversation.c core.h dialogs.c gaim.h gtkconv.c gtkft.c gtkutils.c gtkutils.h idle.c list.c log.c main.c multi.c perl.c prefs.c prpl.c prpl.h server.c stock.c stock.h ui.h util.c Added Files: gtklist.h pounce.c pounce.h privacy.h Log Message: This is a new buddy list. Lots of things about it just Don't Work. I probably already know about those things, and you'd just be wasting my time in submitting a bug report about it. I decided that instead of getting it to all work perfectly before committing, that I'd get it in cvs, and slowly fix it with regular commits. That way, it's easier to keep track of things, and other developers can help. Plus, I'm getting pissed off at the buddy list and want it to die. It's kinda boring, and doing nothing but the buddy list for such a long time has just gotten me very bitter. After 0.60 is released later this week, Gaim will resume being fun. This week is going to be very stressful, though, I'm sure. Things you ought to know about this buddy list: - It crashes - It leaks - There's no way to edit the buddy list, or access offline buddies - Most of the menus and buttons and whatnot just plain ol' don't work. - Status icons are only implemented for AIM. That's mostly just because I'm lazy. As such, you may want to be wary of updating this. If you do decide to update this, you may want to learn "cvs update -D yesterday" as well :) All the art there is just placeholder art. You probably won't really have as many problems as it sounds like you will from reading this. This message is extra-negative to stress that I don't want to be bothered with complaints about something not working about it :). I'll repeat: If something doesn't work, I probably already know about it. If you want to actually help with something, I'd be delighted to have it. IM me. -s. --- NEW FILE: gtklist.h --- /** * @file gtklist.h GTK+ Buddy List API * * gaim * * Copyright (C) 2002-2003, Sean Egan <sea...@bi...> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _GAIM_GTK_LIST_H_ #define _GAIM_GTK_LIST_H_ extern GtkWidget *blist; enum { STATUS_ICON_COLUMN, NAME_COLUMN, WARNING_COLUMN, IDLE_COLUMN, BUDDY_ICON_COLUMN, NODE_COLUMN, BLIST_COLUMNS }; /************************************************************************** * @name Structures **************************************************************************/ /** * Like, everything you need to know about the gtk buddy list */ struct gaim_gtk_buddy_list { GtkWidget *window; GtkWidget *vbox; /**< This is the vbox that everything gets packed into. Your plugin might want to pack something in it itself. Go, plugins! */ GtkWidget *treeview; /**< It's a treeview... d'uh. */ GtkTreeStore *treemodel; /**< This is the treemodel. */ GtkWidget *bbox; /**< A Button Box. */ }; struct gaim_gtk_buddy_list *gtkblist; /************************************************************************** * @name GTK+ Conversation API **************************************************************************/ /** * Returns the UI operations structure for the buddy list. * * @return The GTK list operations structure. */ struct gaim_blist_ui_ops *gaim_get_gtk_blist_ui_ops(void); /** * Returns the base image to represent the account, based on the currently selected theme * * @param account The account. * * @return The icon */ GdkPixbuf *create_prpl_icon(struct gaim_account *account); void gaim_gtk_blist_refresh(struct gaim_buddy_list *list); #endif /* _GAIM_GTK_LIST_H_ */ --- NEW FILE: pounce.c --- /* * gaim * * Copyright (C) 1998-2003, Mark Spencer <mar...@ma...> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include "gaim.h" #include "prpl.h" #include "pounce.h" GtkWidget *bpmenu = NULL; void rem_bp(GtkWidget *w, struct buddy_pounce *b) { buddy_pounces = g_list_remove(buddy_pounces, b); //do_bp_menu(); save_prefs(); } void do_pounce(struct gaim_connection *gc, char *name, int when) { char *who; struct buddy_pounce *b; struct gaim_conversation *c; struct gaim_account *account; GList *bp = buddy_pounces; who = g_strdup(normalize (name)); while (bp) { b = (struct buddy_pounce *)bp->data; bp = bp->next; /* increment the list here because rem_bp can make our handle bad */ if (!(b->options & when)) continue; account = gaim_account_find(b->pouncer, b->protocol); /* find our user */ if (account == NULL) continue; /* check and see if we're signed on as the pouncer */ if (account->gc != gc) continue; if (!g_strcasecmp(who, normalize (b->name))) { /* find someone to pounce */ if (b->options & OPT_POUNCE_POPUP) { c = gaim_find_conversation(name); if (c == NULL) c = gaim_conversation_new(GAIM_CONV_IM, account, name); else gaim_conversation_set_account(c, account); } if (b->options & OPT_POUNCE_NOTIFY) { char tmp[1024]; /* I know the line below is really ugly. I only did it this way * because I thought it'd be funny :-) */ g_snprintf(tmp, sizeof(tmp), (when & OPT_POUNCE_TYPING) ? _("%s has started typing to you") : (when & OPT_POUNCE_SIGNON) ? _("%s has signed on") : (when & OPT_POUNCE_UNIDLE) ? _("%s has returned from being idle") : _("%s has returned from being away"), name); do_error_dialog(tmp, NULL, GAIM_INFO); } if (b->options & OPT_POUNCE_SEND_IM) { if (strlen(b->message) > 0) { c = gaim_find_conversation(name); if (c == NULL) c = gaim_conversation_new(GAIM_CONV_IM, account, name); else gaim_conversation_set_account(c, account); gaim_conversation_write(c, NULL, b->message, -1, WFLAG_SEND, time(NULL)); serv_send_im(account->gc, name, b->message, -1, 0); } } if (b->options & OPT_POUNCE_COMMAND) { #ifndef _WIN32 int pid = fork(); if (pid == 0) { char *args[4]; args[0] = "sh"; args[1] = "-c"; args[2] = b->command; args[3] = NULL; execvp(args[0], args); _exit(0); } #else STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); CreateProcess( NULL, b->command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); #endif /*_WIN32*/ } /* if (b->options & OPT_POUNCE_SOUND) { if (strlen(b->sound)) play_file(b->sound); else play_sound(SND_POUNCE_DEFAULT); }*/ if (!(b->options & OPT_POUNCE_SAVE)) rem_bp(NULL, b); } } g_free(who); } static void new_bp_callback(GtkWidget *w, struct buddy *b) { if (b) show_new_bp(b->name, b->account->gc, b->idle, b->uc & UC_UNAVAILABLE, NULL); else show_new_bp(NULL, NULL, 0, 0, NULL); } static void edit_bp_callback(GtkWidget *w, struct buddy_pounce *b) { show_new_bp(NULL, NULL, 0, 0, b); } /*static GtkTooltips *bp_tooltip = NULL; void do_bp_menu() { GtkWidget *menuitem, *mess, *messmenu; static GtkWidget *remmenu; GtkWidget *remitem; GtkWidget *sep; GList *l; struct buddy_pounce *b; GList *bp = buddy_pounces; /* Tooltip for editing bp's if(!bp_tooltip) bp_tooltip = gtk_tooltips_new(); l = gtk_container_children(GTK_CONTAINER(bpmenu)); while (l) { gtk_widget_destroy(GTK_WIDGET(l->data)); l = l->next; } remmenu = gtk_menu_new(); menuitem = gtk_menu_item_new_with_label(_("New Buddy Pounce")); gtk_menu_shell_append(GTK_MENU(bpmenu), menuitem); gtk_widget_show(menuitem); g_signal_connect(GTK_OBJECT(menuitem), "activate", G_CALLBACK(new_bp_callback), NULL); while (bp) { b = (struct buddy_pounce *)bp->data; remitem = gtk_menu_item_new_with_label(b->name); gtk_menu_shell_append(GTK_MENU(remmenu), remitem); gtk_widget_show(remitem); g_signal_connect(GTK_OBJECT(remitem), "activate", G_CALLBACK(rem_bp), b); bp = bp->next; } menuitem = gtk_menu_item_new_with_label(_("Remove Buddy Pounce")); gtk_menu_shell_append(GTK_MENU(bpmenu), menuitem); gtk_widget_show(menuitem); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), remmenu); gtk_widget_show(remmenu); sep = gtk_hseparator_new(); menuitem = gtk_menu_item_new(); gtk_menu_shell_append(GTK_MENU(bpmenu), menuitem); gtk_container_add(GTK_CONTAINER(menuitem), sep); gtk_widget_set_sensitive(menuitem, FALSE); gtk_widget_show(menuitem); gtk_widget_show(sep); bp = buddy_pounces; while (bp) { b = (struct buddy_pounce *)bp->data; menuitem = gtk_menu_item_new_with_label(b->name); gtk_menu_shell_append(GTK_MENU(bpmenu), menuitem); messmenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), messmenu); gtk_widget_show(menuitem); if (strlen(b->message)) mess = gtk_menu_item_new_with_label(b->message); else mess = gtk_menu_item_new_with_label(_("[no message]")); gtk_menu_shell_append(GTK_MENU(messmenu), mess); gtk_tooltips_set_tip(bp_tooltip, GTK_WIDGET(mess), _("[Click to edit]"), NULL); gtk_widget_show(mess); g_signal_connect(GTK_OBJECT(mess), "activate", G_CALLBACK(edit_bp_callback), b); bp = bp->next; } } */ /*------------------------------------------------------------------------*/ /* The dialog for new buddy pounces */ /*------------------------------------------------------------------------*/ void do_new_bp(GtkWidget *w, struct addbp *b) { struct buddy_pounce *bp; if (strlen(gtk_entry_get_text(GTK_ENTRY(b->nameentry))) == 0) { do_error_dialog(_("Please enter a buddy to pounce."), NULL, GAIM_ERROR); return; } if(!b->buddy_pounce) bp = g_new0(struct buddy_pounce, 1); else bp = b->buddy_pounce; g_snprintf(bp->name, 80, "%s", gtk_entry_get_text(GTK_ENTRY(b->nameentry))); g_snprintf(bp->message, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->messentry))); g_snprintf(bp->command, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->commentry))); g_snprintf(bp->sound, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->soundentry))); g_snprintf(bp->pouncer, 80, "%s", b->account->username); bp->protocol = b->account->protocol; bp->options = 0; if (GTK_TOGGLE_BUTTON(b->popupnotify)->active) bp->options |= OPT_POUNCE_NOTIFY; if (GTK_TOGGLE_BUTTON(b->openwindow)->active) bp->options |= OPT_POUNCE_POPUP; if (GTK_TOGGLE_BUTTON(b->sendim)->active) bp->options |= OPT_POUNCE_SEND_IM; if (GTK_TOGGLE_BUTTON(b->command)->active) bp->options |= OPT_POUNCE_COMMAND; if (GTK_TOGGLE_BUTTON(b->sound)->active) bp->options |= OPT_POUNCE_SOUND; if (GTK_TOGGLE_BUTTON(b->p_signon)->active) bp->options |= OPT_POUNCE_SIGNON; if (GTK_TOGGLE_BUTTON(b->p_unaway)->active) bp->options |= OPT_POUNCE_UNAWAY; if (GTK_TOGGLE_BUTTON(b->p_unidle)->active) bp->options |= OPT_POUNCE_UNIDLE; if (GTK_TOGGLE_BUTTON(b->p_typing)->active) bp->options |= OPT_POUNCE_TYPING; if (GTK_TOGGLE_BUTTON(b->save)->active) bp->options |= OPT_POUNCE_SAVE; if(!b->buddy_pounce) buddy_pounces = g_list_append(buddy_pounces, bp); // do_bp_menu(); gtk_widget_destroy(b->window); save_prefs(); g_free(b); } static void pounce_choose(GtkWidget *opt, struct addbp *b) { struct gaim_account *account = gtk_object_get_user_data(GTK_OBJECT(opt)); b->account = account; } static GtkWidget *pounce_user_menu(struct addbp *b, struct gaim_connection *gc) { GtkWidget *optmenu; GtkWidget *menu; GtkWidget *opt; GSList *u = gaim_accounts; struct gaim_account *account; struct prpl *p; int count = 0; int place = 0; char buf[2048]; optmenu = gtk_option_menu_new(); menu = gtk_menu_new(); while (u) { account = (struct gaim_account *)u->data; p = (struct prpl *)find_prpl(account->protocol); g_snprintf(buf, sizeof buf, "%s (%s)", account->username, (p && p->name)?p->name:_("Unknown")); opt = gtk_menu_item_new_with_label(buf); gtk_object_set_user_data(GTK_OBJECT(opt), account); g_signal_connect(GTK_OBJECT(opt), "activate", G_CALLBACK(pounce_choose), b); gtk_menu_shell_append(GTK_MENU(menu), opt); gtk_widget_show(opt); if (b->account == account) { gtk_menu_item_activate(GTK_MENU_ITEM(opt)); place = count; } count++; u = u->next; } gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), place); b->menu = optmenu; return optmenu; } void show_new_bp(char *name, struct gaim_connection *gc, int idle, int away, struct buddy_pounce *edit_bp) { GtkWidget *label; GtkWidget *bbox; GtkWidget *vbox; GtkWidget *button; GtkWidget *frame; GtkWidget *table; GtkWidget *optmenu; GtkWidget *sep; GtkSizeGroup *sg; struct addbp *b = g_new0(struct addbp, 1); if(edit_bp) { b->buddy_pounce = edit_bp; b->account = gaim_account_find(edit_bp->pouncer, edit_bp->protocol); } else { b->account = gc ? gc->account : gaim_accounts->data; b->buddy_pounce = NULL; } GAIM_DIALOG(b->window); gtk_window_set_policy(GTK_WINDOW(b->window), FALSE, TRUE, TRUE); gtk_window_set_role(GTK_WINDOW(b->window), "new_bp"); gtk_window_set_title(GTK_WINDOW(b->window), _("Gaim - New Buddy Pounce")); g_signal_connect(GTK_OBJECT(b->window), "destroy", G_CALLBACK(gtk_widget_destroy), b->window); gtk_widget_realize(b->window); vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); gtk_container_add(GTK_CONTAINER(b->window), vbox); gtk_widget_show(vbox); /* <pounce type="who"> */ frame = gtk_frame_new(_("Pounce Who")); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET(frame)); table = gtk_table_new(2, 2, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 5); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_widget_show(table); label = gtk_label_new(_("Account")); gtk_misc_set_alignment(GTK_MISC(label), 0, .5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); gtk_widget_show(label); optmenu = pounce_user_menu(b, gc); gtk_table_attach(GTK_TABLE(table), optmenu, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0); gtk_widget_show(optmenu); label = gtk_label_new(_("Buddy")); gtk_misc_set_alignment(GTK_MISC(label), 0, .5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); gtk_widget_show(label); b->nameentry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), b->nameentry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); if (name !=NULL) gtk_entry_set_text(GTK_ENTRY(b->nameentry), name); else if(edit_bp) gtk_entry_set_text(GTK_ENTRY(b->nameentry), edit_bp->name); gtk_window_set_focus(GTK_WINDOW(b->window), b->nameentry); gtk_widget_show(b->nameentry); /* </pounce type="who"> */ /* <pounce type="when"> */ frame = gtk_frame_new(_("Pounce When")); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET(frame)); table = gtk_table_new(2, 2, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 5); gtk_widget_show(table); b->p_signon = gtk_check_button_new_with_label(_("Pounce on sign on")); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_signon), (edit_bp->options & OPT_POUNCE_SIGNON) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_signon), TRUE); gtk_table_attach(GTK_TABLE(table), b->p_signon, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); gtk_widget_show(b->p_signon); b->p_unaway = gtk_check_button_new_with_label(_("Pounce on return from away")); if (away) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unaway), TRUE); else if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unaway), (edit_bp->options & OPT_POUNCE_UNAWAY) ? TRUE : FALSE); gtk_table_attach(GTK_TABLE(table), b->p_unaway, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0); gtk_widget_show(b->p_unaway); b->p_unidle = gtk_check_button_new_with_label(_("Pounce on return from idle")); if (idle) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unidle), TRUE); else if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unidle), (edit_bp->options & OPT_POUNCE_UNIDLE) ? TRUE : FALSE); gtk_table_attach(GTK_TABLE(table), b->p_unidle, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); gtk_widget_show(b->p_unidle); b->p_typing = gtk_check_button_new_with_label(_("Pounce when buddy is typing to you")); if (edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_typing), (edit_bp->options & OPT_POUNCE_TYPING) ? TRUE : FALSE); gtk_table_attach(GTK_TABLE(table), b->p_typing,1,2,1,2, GTK_FILL | GTK_EXPAND, 0, 0, 0); gtk_widget_show(b->p_typing); /* </pounce type="when"> */ /* <pounce type="action"> */ frame = gtk_frame_new(_("Pounce Action")); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET(frame)); table = gtk_table_new(4, 2, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 5); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_widget_show(table); b->openwindow = gtk_check_button_new_with_label(_("Open IM Window")); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->openwindow), (edit_bp->options & OPT_POUNCE_POPUP) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->openwindow), FALSE); gtk_table_attach(GTK_TABLE(table), b->openwindow, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); gtk_widget_show(b->openwindow); b->popupnotify = gtk_check_button_new_with_label(_("Popup Notification")); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->popupnotify), (edit_bp->options & OPT_POUNCE_NOTIFY) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->popupnotify), FALSE); gtk_table_attach(GTK_TABLE(table), b->popupnotify, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); gtk_widget_show(b->popupnotify); b->sendim = gtk_check_button_new_with_label(_("Send Message")); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sendim), (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sendim), TRUE); gtk_table_attach(GTK_TABLE(table), b->sendim, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); gtk_widget_show(b->sendim); b->messentry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), b->messentry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); g_signal_connect(GTK_OBJECT(b->messentry), "activate", G_CALLBACK(do_new_bp), b); if(edit_bp) { gtk_widget_set_sensitive(GTK_WIDGET(b->messentry), (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE); gtk_entry_set_text(GTK_ENTRY(b->messentry), edit_bp->message); } gtk_widget_show(b->messentry); g_signal_connect(GTK_OBJECT(b->sendim), "clicked", G_CALLBACK(gaim_gtk_toggle_sensitive), b->messentry); b->command = gtk_check_button_new_with_label(_("Execute command on pounce")); gtk_table_attach(GTK_TABLE(table), b->command, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->command), (edit_bp->options & OPT_POUNCE_COMMAND) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->command), FALSE); gtk_widget_show(b->command); b->commentry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), b->commentry, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, 0, 0, 0); g_signal_connect(GTK_OBJECT(b->commentry), "activate", G_CALLBACK(do_new_bp), b); if(edit_bp) { gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), (edit_bp->options & OPT_POUNCE_COMMAND) ? TRUE : FALSE); gtk_entry_set_text(GTK_ENTRY(b->commentry), edit_bp->command); } else gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), FALSE); gtk_widget_show(b->commentry); g_signal_connect(GTK_OBJECT(b->command), "clicked", G_CALLBACK(gaim_gtk_toggle_sensitive), b->commentry); b->sound = gtk_check_button_new_with_label(_("Play sound on pounce")); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sound), (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sound), FALSE); gtk_table_attach(GTK_TABLE(table), b->sound, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); gtk_widget_show(b->sound); b->soundentry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), b->soundentry, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0); g_signal_connect(GTK_OBJECT(b->soundentry), "activate", G_CALLBACK(do_new_bp), b); if(edit_bp) { gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); gtk_entry_set_text(GTK_ENTRY(b->soundentry), edit_bp->sound); } else gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), FALSE); gtk_widget_show(b->soundentry); g_signal_connect(GTK_OBJECT(b->sound), "clicked", G_CALLBACK(gaim_gtk_toggle_sensitive), b->soundentry); /* </pounce type="action"> */ b->save = gtk_check_button_new_with_label(_("Save this pounce after activation")); gtk_container_set_border_width(GTK_CONTAINER(b->save), 7); if(edit_bp) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->save), (edit_bp->options & OPT_POUNCE_SAVE) ? TRUE : FALSE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->save), FALSE); gtk_box_pack_start(GTK_BOX(vbox), b->save, FALSE, FALSE, 0); gtk_widget_show(b->save); sep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); gtk_widget_show(sep); bbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); gtk_widget_show(bbox); sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); button = gaim_pixbuf_button_from_stock(_("_Save"), "gtk-execute", GAIM_BUTTON_HORIZONTAL); gtk_size_group_add_widget(sg, button); g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(do_new_bp), b); gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, FALSE, 0); gtk_widget_show(button); button = gaim_pixbuf_button_from_stock(_("C_ancel"), "gtk-cancel", GAIM_BUTTON_HORIZONTAL); gtk_size_group_add_widget(sg, button); g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), b->window); gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, FALSE, 0); gtk_widget_show(button); gtk_widget_show(b->window); } --- NEW FILE: pounce.h --- /* * gaim * * Copyright (C) 1998-2003, Mark Spencer <mar...@ma...> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _POUNCE_H_ #define _POUNCE_H_ struct buddy_pounce { char name[80]; char message[2048]; char command[2048]; char sound[2048]; char pouncer[80]; int protocol; int options; }; struct addbp { GtkWidget *window; GtkWidget *nameentry; GtkWidget *messentry; GtkWidget *commentry; GtkWidget *command; GtkWidget *sendim; GtkWidget *openwindow; GtkWidget *popupnotify; GtkWidget *p_signon; GtkWidget *p_unaway; GtkWidget *p_unidle; GtkWidget *p_typing; GtkWidget *save; GtkWidget *menu; GtkWidget *sound; GtkWidget *soundentry; struct gaim_account *account; struct buddy_pounce *buddy_pounce; }; void rem_bp(GtkWidget *w, struct buddy_pounce *b); void do_pounce(struct gaim_connection *gc, char *name, int when); void do_bp_menu(); #endif /* _POUNCE_H_ */ --- NEW FILE: privacy.h --- /* * gaim * * Copyright (C) 2003, Christian Hammond <ch...@gn...> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "gaim.h" gboolean gaim_privacy_permit_add(struct gaim_account *account, const char *name); gboolean gaim_privacy_deny_add(struct gaim_account *account, const char *name); gboolean gaim_privacy_deny_remove(struct gaim_account *account, const char *name); gboolean gaim_privacy_permit_remove(struct gaim_account *account, const char *name); Index: Makefile.am =================================================================== RCS file: /cvsroot/gaim/gaim/src/Makefile.am,v retrieving revision 1.70 retrieving revision 1.71 diff -u -d -r1.70 -r1.71 --- Makefile.am 10 Mar 2003 03:13:01 -0000 1.70 +++ Makefile.am 10 Mar 2003 05:30:16 -0000 1.71 @@ -46,6 +46,8 @@ multi.c \ multi.h \ perl.c \ + pounce.c \ + pounce.h \ prefs.c \ proxy.c \ proxy.h \ Index: away.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/away.c,v retrieving revision 1.89 retrieving revision 1.90 diff -u -d -r1.89 -r1.90 --- away.c 2 Mar 2003 19:21:20 -0000 1.89 +++ away.c 10 Mar 2003 05:30:16 -0000 1.90 @@ -32,6 +32,7 @@ #include "prpl.h" #include "gtkimhtml.h" #include "pixmaps/join.xpm" +#include "gtklist.h" GtkWidget *imaway = NULL; @@ -206,9 +207,6 @@ GtkCellRenderer *renderer; char *buf2; char *buf; - - if (!blist) - return; if (!a) return; Index: buddy.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/buddy.c,v retrieving revision 1.402 retrieving revision 1.403 diff -u -d -r1.402 -r1.403 --- buddy.c 2 Mar 2003 19:21:21 -0000 1.402 +++ buddy.c 10 Mar 2003 05:30:17 -0000 1.403 @@ -19,12 +19,6 @@ * */ -#ifdef GTK_DISABLE_DEPRECATED -#undef GTK_DISABLE_DEPRECATED -#endif - -#define GTK_ENABLE_BROKEN - #ifdef HAVE_CONFIG_H #include <config.h> [...3176 lines suppressed...] - gtk_container_add(GTK_CONTAINER(tbox), edittree); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tbox), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - -#ifdef _WIN32 - /* Register newly created window with systray module */ - wgaim_created_blistwin(GTK_WIDGET(blist)); -#endif - - /* Houston, we are go for launch. */ - unhide_buddy_list(); -} - -void show_buddy_list() -{ - make_buddy_list(); - build_edit_tree(); - update_button_pix(); + return status; } Index: conversation.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/conversation.c,v retrieving revision 1.500 retrieving revision 1.501 diff -u -d -r1.500 -r1.501 --- conversation.c 4 Mar 2003 08:25:50 -0000 1.500 +++ conversation.c 10 Mar 2003 05:30:18 -0000 1.501 @@ -1163,9 +1163,9 @@ name = gaim_conversation_get_name(conv); if (((im_options & OPT_IM_ALIAS_TAB) == OPT_IM_ALIAS_TAB) && - account != NULL && ((b = find_buddy(account, name)) != NULL)) { + account != NULL && ((b = gaim_find_buddy(account, name)) != NULL)) { - text = get_buddy_alias(b); + text = gaim_get_buddy_alias(b); } else text = name; @@ -1416,11 +1416,10 @@ !(account->gc->prpl->options & OPT_PROTO_UNIQUE_CHATNAME)) { if (who == NULL) { - if ((flags & WFLAG_SEND)) { - b = find_buddy(account, account->gc->username); - - if (b != NULL && strcmp(b->name, get_buddy_alias(b))) - who = get_buddy_alias(b); + if (flags & WFLAG_SEND) { + b = gaim_find_buddy(account, account->gc->username); + if (b != NULL && strcmp(b->name, gaim_get_buddy_alias(b))) + who = gaim_get_buddy_alias(b); else if (*account->alias) who = account->alias; else if (*account->gc->displayname) @@ -1429,19 +1428,19 @@ who = account->gc->username; } else { - b = find_buddy(account, gaim_conversation_get_name(conv)); + b = gaim_find_buddy(account, gaim_conversation_get_name(conv)); if (b != NULL) - who = get_buddy_alias(b); + who = gaim_get_buddy_alias(b); else who = gaim_conversation_get_name(conv); } } else { - b = find_buddy(account, who); + b = gaim_find_buddy(account, who); if (b != NULL) - who = get_buddy_alias(b); + who = gaim_get_buddy_alias(b); } } @@ -2116,11 +2115,11 @@ struct group *grp = NULL; GList *wins, *convs; - b = find_buddy(gaim_conversation_get_account(conv), + b = gaim_find_buddy(gaim_conversation_get_account(conv), gaim_conversation_get_name(conv)); if (b != NULL) - grp = find_group_by_buddy(b); + grp = gaim_find_buddys_group(b); /* Go through the list of IMs and find one with this group. */ for (wins = gaim_get_windows(); wins != NULL; wins = wins->next) { @@ -2137,11 +2136,11 @@ conv2 = (struct gaim_conversation *)convs->data; - b2 = find_buddy(gaim_conversation_get_account(conv2), + b2 = gaim_find_buddy(gaim_conversation_get_account(conv2), gaim_conversation_get_name(conv2)); if (b2 != NULL) - g2 = find_group_by_buddy(b2); + g2 = gaim_find_buddys_group(b2); if (grp == g2) { gaim_window_add_conversation(win2, conv); Index: core.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/core.h,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- core.h 2 Mar 2003 18:47:58 -0000 1.37 +++ core.h 10 Mar 2003 05:30:18 -0000 1.38 @@ -50,6 +50,7 @@ #include "multi.h" #include "conversation.h" #include "ft.h" +#include "privacy.h" /* Really user states are controlled by the PRPLs now. We just use this for event_away */ #define UC_UNAVAILABLE 1 @@ -157,30 +158,6 @@ }; #endif -#define BUDDY_ALIAS_MAXLEN 388 /* because MSN names can be 387 characters */ - -struct buddy { - int edittype; /* XXX CUI: this is really a GUI function and we need to put this in ui.h */ - char name[80]; - char alias[BUDDY_ALIAS_MAXLEN]; - char server_alias[BUDDY_ALIAS_MAXLEN]; - int present; - int evil; - time_t signon; - time_t idle; - int uc; - guint caps; /* woohoo! */ - void *proto_data; /* what a hack */ - struct gaim_account *account; /* the connection it belongs to */ - GHashTable *settings; -}; - -struct group { - int edittype; /* XXX CUI: this is really a GUI function and we need to put this in ui.h */ - char name[80]; - GSList *members; -}; - /* Globals in core.c */ extern GSList *uis; extern GSList *groups; @@ -190,32 +167,6 @@ extern GList *plugins; extern GList *probed_plugins; extern GList *callbacks; - -/* Functions in buddy.c */ -extern struct buddy *find_buddy(struct gaim_account *, const char *); -extern struct group *find_group(const char *); -extern struct group *find_group_by_buddy(struct buddy *); -extern struct buddy *add_buddy(struct gaim_account *, const char *, const char *, const char *); -extern void remove_buddy(struct buddy *); -extern struct group *add_group(const char *); -extern void remove_group(struct group *); -extern void toc_build_config(struct gaim_account *, char *, int len, gboolean); -extern void parse_toc_buddy_list(struct gaim_account *, char *); -extern void signoff_blocked(struct gaim_connection *); -extern char* get_buddy_alias_only(struct buddy *); -extern char* get_buddy_alias(struct buddy *); -extern GSList *gaim_group_get_accounts(struct group *); -extern gboolean gaim_group_on_account(struct group *, struct gaim_account *); -extern void do_import(struct gaim_account *, const char *); -extern void gaim_blist_load(); -extern void gaim_blist_save(); -extern gboolean gaim_privacy_permit_add(struct gaim_account *, const char *); -extern gboolean gaim_privacy_permit_remove(struct gaim_account *, const char *); -extern gboolean gaim_privacy_deny_add(struct gaim_account *, const char *); -extern gboolean gaim_privacy_deny_remove(struct gaim_account *, const char *); -extern void gaim_buddy_set_setting(struct buddy *, const char *, const char *); -extern char *gaim_buddy_get_setting(struct buddy *, const char *); - /* Functions in core.c */ extern gint UI_write(struct UI *, guchar *, int); Index: dialogs.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/dialogs.c,v retrieving revision 1.429 retrieving revision 1.430 diff -u -d -r1.429 -r1.430 --- dialogs.c 10 Mar 2003 04:11:18 -0000 1.429 +++ dialogs.c 10 Mar 2003 05:30:18 -0000 1.430 @@ -48,6 +48,7 @@ #include "gaim.h" #include "gtkimhtml.h" #include "prpl.h" +#include "gtklist.h" #ifdef _WIN32 #include "win32dep.h" @@ -116,28 +117,6 @@ gboolean permit; }; -struct addbp { - GtkWidget *window; - GtkWidget *nameentry; - GtkWidget *messentry; - GtkWidget *commentry; - GtkWidget *command; - GtkWidget *sendim; - GtkWidget *openwindow; - GtkWidget *popupnotify; - GtkWidget *p_signon; - GtkWidget *p_unaway; - GtkWidget *p_unidle; - GtkWidget *p_typing; - GtkWidget *save; - GtkWidget *menu; - GtkWidget *sound; - GtkWidget *soundentry; - - struct gaim_account *account; - struct buddy_pounce *buddy_pounce; -}; - struct findbyemail { GtkWidget *window; GtkWidget *emailentry; @@ -440,18 +419,18 @@ void do_remove_buddy(struct buddy *b) { - struct group *g = find_group_by_buddy(b); + struct group *g = gaim_find_buddys_group(b); struct gaim_conversation *c; gchar *name = g_strdup(b->name); /* b->name is null after remove_buddy */ if (!b) return; - g = find_group_by_buddy(b); + g = gaim_find_buddys_group(b); debug_printf(_("Removing '%s' from buddy list.\n"), b->name); serv_remove_buddy(b->account->gc, name, g->name); - remove_buddy(b); + gaim_blist_remove_buddy(b); gaim_blist_save(); c = gaim_find_conversation(name); @@ -464,7 +443,7 @@ void show_confirm_del(struct gaim_connection *gc, gchar *name) { - struct buddy *bd = find_buddy(gc->account, name); + struct buddy *bd = gaim_find_buddy(gc->account, name); char *text; if (!bd) return; @@ -639,7 +618,7 @@ gtk_label_set_markup(GTK_LABEL(label), "<span weight=\"bold\" size=\"large\" foreground=\"gray\">I'm not anything.</span>"); - window = gtk_dialog_new_with_buttons("", GTK_WINDOW(blist), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); + window = gtk_dialog_new_with_buttons("", GTK_WINDOW(gtkblist->window), GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(window), GTK_RESPONSE_OK); g_signal_connect(G_OBJECT(window), "response", G_CALLBACK(gtk_widget_destroy), NULL); @@ -689,7 +668,7 @@ if (!imdialog) { info = g_new0(struct getuserinfo, 1); info->gc = connections->data; - imdialog = gtk_dialog_new_with_buttons(_("Gaim - New Message"), blist ? GTK_WINDOW(blist) : NULL, GTK_DIALOG_MODAL, + imdialog = gtk_dialog_new_with_buttons(_("New Message"), gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(imdialog), GTK_RESPONSE_OK); gtk_container_set_border_width (GTK_CONTAINER(imdialog), 6); @@ -790,7 +769,7 @@ g_free(filename); info->gc = connections->data; - window = gtk_dialog_new_with_buttons(_("Gaim - Get User Info"), blist ? GTK_WINDOW(blist) : NULL, GTK_DIALOG_MODAL, + window = gtk_dialog_new_with_buttons(_("Gaim - Get User Info"), gtkblist->window ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(window), GTK_RESPONSE_OK); gtk_container_set_border_width (GTK_CONTAINER(window), 6); @@ -885,6 +864,8 @@ { const char *grp, *who, *whoalias; struct gaim_conversation *c; + struct buddy *b; + struct group *g; if (resp == GTK_RESPONSE_OK) { @@ -893,8 +874,10 @@ whoalias = gtk_entry_get_text(GTK_ENTRY(a->entry_for_alias)); c = gaim_find_conversation(who); - - add_buddy(a->gc->account, grp, who, whoalias); + if (!(g = gaim_find_group(grp))) + g = gaim_group_new(grp); + b = gaim_buddy_new(a->gc->account, who, whoalias); + gaim_blist_add_buddy(b, g, NULL); serv_add_buddy(a->gc, who); if (c != NULL) @@ -909,6 +892,7 @@ void do_add_group(GtkWidget *w, int resp, struct addbuddy *a) { const char *grp; + struct group *g; if (resp == GTK_RESPONSE_OK) { grp = gtk_entry_get_text(GTK_ENTRY(a->entry)); @@ -916,7 +900,8 @@ if (!a->gc) a->gc = connections->data; - add_group(grp); + g = gaim_group_new(grp); + gaim_blist_add_group (g, NULL); gaim_blist_save(); } @@ -963,7 +948,7 @@ g_free(filename); a->gc = gc; - a->window = gtk_dialog_new_with_buttons(_("Gaim - Add Group"), GTK_WINDOW(blist), GTK_DIALOG_MODAL, + a->window = gtk_dialog_new_with_buttons(_("Gaim - Add Group"), GTK_WINDOW(gtkblist->window), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(a->window), GTK_RESPONSE_OK); gtk_container_set_border_width (GTK_CONTAINER(a->window), 6); @@ -1076,7 +1061,7 @@ g_free(filename); GAIM_DIALOG(a->window); - a->window = gtk_dialog_new_with_buttons(_("Gaim - Add Buddy"), blist ? GTK_WINDOW(blist) : NULL, GTK_DIALOG_MODAL, + a->window = gtk_dialog_new_with_buttons(_("Gaim - Add Buddy"), gtkblist->window ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_ADD, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(a->window), GTK_RESPONSE_OK); @@ -1618,383 +1603,6 @@ } -/*------------------------------------------------------------------------*/ -/* The dialog for new buddy pounces */ -/*------------------------------------------------------------------------*/ - - -void do_new_bp(GtkWidget *w, struct addbp *b) -{ - struct buddy_pounce *bp; - - if (strlen(gtk_entry_get_text(GTK_ENTRY(b->nameentry))) == 0) { - do_error_dialog(_("Please enter a buddy to pounce."), NULL, GAIM_ERROR); - return; - } - - if(!b->buddy_pounce) - bp = g_new0(struct buddy_pounce, 1); - else - bp = b->buddy_pounce; - - - g_snprintf(bp->name, 80, "%s", gtk_entry_get_text(GTK_ENTRY(b->nameentry))); - g_snprintf(bp->message, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->messentry))); - g_snprintf(bp->command, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->commentry))); - g_snprintf(bp->sound, 2048, "%s", gtk_entry_get_text(GTK_ENTRY(b->soundentry))); - g_snprintf(bp->pouncer, 80, "%s", b->account->username); - - bp->protocol = b->account->protocol; - - bp->options = 0; - - if (GTK_TOGGLE_BUTTON(b->popupnotify)->active) - bp->options |= OPT_POUNCE_NOTIFY; - - if (GTK_TOGGLE_BUTTON(b->openwindow)->active) - bp->options |= OPT_POUNCE_POPUP; - - if (GTK_TOGGLE_BUTTON(b->sendim)->active) - bp->options |= OPT_POUNCE_SEND_IM; - - if (GTK_TOGGLE_BUTTON(b->command)->active) - bp->options |= OPT_POUNCE_COMMAND; - - if (GTK_TOGGLE_BUTTON(b->sound)->active) - bp->options |= OPT_POUNCE_SOUND; - - if (GTK_TOGGLE_BUTTON(b->p_signon)->active) - bp->options |= OPT_POUNCE_SIGNON; - - if (GTK_TOGGLE_BUTTON(b->p_unaway)->active) - bp->options |= OPT_POUNCE_UNAWAY; - - if (GTK_TOGGLE_BUTTON(b->p_unidle)->active) - bp->options |= OPT_POUNCE_UNIDLE; - - if (GTK_TOGGLE_BUTTON(b->p_typing)->active) - bp->options |= OPT_POUNCE_TYPING; - - if (GTK_TOGGLE_BUTTON(b->save)->active) - bp->options |= OPT_POUNCE_SAVE; - - if(!b->buddy_pounce) - buddy_pounces = g_list_append(buddy_pounces, bp); - - do_bp_menu(); - - destroy_dialog(NULL, b->window); - - save_prefs(); - g_free(b); -} - -static void pounce_choose(GtkWidget *opt, struct addbp *b) -{ - struct gaim_account *account = g_object_get_data(G_OBJECT(opt), "gaim_account"); - b->account = account; -} - -static GtkWidget *pounce_user_menu(struct addbp *b, struct gaim_connection *gc) -{ - GtkWidget *optmenu; - GtkWidget *menu; - GtkWidget *opt; - GSList *u = gaim_accounts; - struct gaim_account *account; - struct prpl *p; - int count = 0; - int place = 0; - char buf[2048]; - - - optmenu = gtk_option_menu_new(); - - menu = gtk_menu_new(); - - while (u) { - account = (struct gaim_account *)u->data; - p = (struct prpl *)find_prpl(account->protocol); - g_snprintf(buf, sizeof buf, "%s (%s)", account->username, (p && p->name)?p->name:_("Unknown")); - opt = gtk_menu_item_new_with_label(buf); - g_object_set_data(G_OBJECT(opt), "gaim_account", account); - g_signal_connect(GTK_OBJECT(opt), "activate", G_CALLBACK(pounce_choose), b); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt); - gtk_widget_show(opt); - - if (b->account == account) { - gtk_menu_item_activate(GTK_MENU_ITEM(opt)); - place = count; - } - - count++; - - u = u->next; - } - - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), place); - - b->menu = optmenu; - - return optmenu; -} - - -void show_new_bp(char *name, struct gaim_connection *gc, int idle, int away, struct buddy_pounce *edit_bp) -{ - GtkWidget *label; - GtkWidget *bbox; - GtkWidget *vbox; - GtkWidget *button; - GtkWidget *frame; - GtkWidget *table; - GtkWidget *optmenu; - GtkWidget *sep; - GtkSizeGroup *sg; - - struct addbp *b = g_new0(struct addbp, 1); - - if(edit_bp) { - b->buddy_pounce = edit_bp; - b->account = gaim_account_find(edit_bp->pouncer, edit_bp->protocol); - } else { - b->account = gc ? gc->account : gaim_accounts->data; - b->buddy_pounce = NULL; - } - - GAIM_DIALOG(b->window); - dialogwindows = g_list_prepend(dialogwindows, b->window); - gtk_window_set_resizable(GTK_WINDOW(b->window), TRUE); - gtk_window_set_role(GTK_WINDOW(b->window), "new_bp"); - gtk_window_set_title(GTK_WINDOW(b->window), _("Gaim - New Buddy Pounce")); - g_signal_connect(GTK_OBJECT(b->window), "destroy", G_CALLBACK(destroy_dialog), b->window); - gtk_widget_realize(b->window); - - vbox = gtk_vbox_new(FALSE, 5); - gtk_container_set_border_width(GTK_CONTAINER(vbox), 5); - gtk_container_add(GTK_CONTAINER(b->window), vbox); - gtk_widget_show(vbox); - - /* <pounce type="who"> */ - frame = gtk_frame_new(_("Pounce Who")); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - gtk_widget_show(GTK_WIDGET(frame)); - - table = gtk_table_new(2, 2, FALSE); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_widget_show(table); - - label = gtk_label_new(_("Account")); - gtk_misc_set_alignment(GTK_MISC(label), 0, .5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); - gtk_widget_show(label); - - optmenu = pounce_user_menu(b, gc); - gtk_table_attach(GTK_TABLE(table), optmenu, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0); - gtk_widget_show(optmenu); - - label = gtk_label_new(_("Buddy")); - gtk_misc_set_alignment(GTK_MISC(label), 0, .5); - gtk_table_attach(GTK_TABLE(table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); - gtk_widget_show(label); - - b->nameentry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), b->nameentry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); - if (name !=NULL) - gtk_entry_set_text(GTK_ENTRY(b->nameentry), name); - else if(edit_bp) - gtk_entry_set_text(GTK_ENTRY(b->nameentry), edit_bp->name); - gtk_window_set_focus(GTK_WINDOW(b->window), b->nameentry); - gtk_widget_show(b->nameentry); - /* </pounce type="who"> */ - - - /* <pounce type="when"> */ - frame = gtk_frame_new(_("Pounce When")); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - gtk_widget_show(GTK_WIDGET(frame)); - - table = gtk_table_new(2, 2, FALSE); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_widget_show(table); - - b->p_signon = gtk_check_button_new_with_label(_("Pounce on sign on")); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_signon), - (edit_bp->options & OPT_POUNCE_SIGNON) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_signon), TRUE); - gtk_table_attach(GTK_TABLE(table), b->p_signon, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->p_signon); - - b->p_unaway = gtk_check_button_new_with_label(_("Pounce on return from away")); - if (away) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unaway), TRUE); - else if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unaway), - (edit_bp->options & OPT_POUNCE_UNAWAY) ? TRUE : FALSE); - gtk_table_attach(GTK_TABLE(table), b->p_unaway, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0); - gtk_widget_show(b->p_unaway); - - b->p_unidle = gtk_check_button_new_with_label(_("Pounce on return from idle")); - if (idle) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unidle), TRUE); - else if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_unidle), - (edit_bp->options & OPT_POUNCE_UNIDLE) ? TRUE : FALSE); - gtk_table_attach(GTK_TABLE(table), b->p_unidle, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->p_unidle); - - b->p_typing = gtk_check_button_new_with_label(_("Pounce when buddy is typing to you")); - if (edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->p_typing), - (edit_bp->options & OPT_POUNCE_TYPING) ? TRUE : FALSE); - gtk_table_attach(GTK_TABLE(table), b->p_typing,1,2,1,2, GTK_FILL | GTK_EXPAND, 0, 0, 0); - gtk_widget_show(b->p_typing); - - /* </pounce type="when"> */ - - /* <pounce type="action"> */ - frame = gtk_frame_new(_("Pounce Action")); - gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); - gtk_widget_show(GTK_WIDGET(frame)); - - table = gtk_table_new(4, 2, FALSE); - gtk_container_add(GTK_CONTAINER(frame), table); - gtk_container_set_border_width(GTK_CONTAINER(table), 5); - gtk_table_set_col_spacings(GTK_TABLE(table), 5); - gtk_table_set_row_spacings(GTK_TABLE(table), 5); - gtk_widget_show(table); - - b->openwindow = gtk_check_button_new_with_label(_("Open IM Window")); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->openwindow), - (edit_bp->options & OPT_POUNCE_POPUP) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->openwindow), FALSE); - gtk_table_attach(GTK_TABLE(table), b->openwindow, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->openwindow); - - b->popupnotify = gtk_check_button_new_with_label(_("Popup Notification")); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->popupnotify), - (edit_bp->options & OPT_POUNCE_NOTIFY) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->popupnotify), FALSE); - gtk_table_attach(GTK_TABLE(table), b->popupnotify, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->popupnotify); - - b->sendim = gtk_check_button_new_with_label(_("Send Message")); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sendim), - (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sendim), TRUE); - gtk_table_attach(GTK_TABLE(table), b->sendim, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->sendim); - - b->messentry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), b->messentry, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0); - g_signal_connect(GTK_OBJECT(b->messentry), "activate", G_CALLBACK(do_new_bp), b); - if(edit_bp) { - gtk_widget_set_sensitive(GTK_WIDGET(b->messentry), - (edit_bp->options & OPT_POUNCE_SEND_IM) ? TRUE : FALSE); - gtk_entry_set_text(GTK_ENTRY(b->messentry), edit_bp->message); - } - gtk_widget_show(b->messentry); - - g_signal_connect(GTK_OBJECT(b->sendim), "clicked", - G_CALLBACK(gaim_gtk_toggle_sensitive), b->messentry); - - b->command = gtk_check_button_new_with_label(_("Execute command on pounce")); - gtk_table_attach(GTK_TABLE(table), b->command, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->command), - (edit_bp->options & OPT_POUNCE_COMMAND) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->command), FALSE); - gtk_widget_show(b->command); - - b->commentry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), b->commentry, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, 0, 0, 0); - g_signal_connect(GTK_OBJECT(b->commentry), "activate", G_CALLBACK(do_new_bp), b); - if(edit_bp) { - gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), - (edit_bp->options & OPT_POUNCE_COMMAND) ? TRUE : FALSE); - gtk_entry_set_text(GTK_ENTRY(b->commentry), edit_bp->command); - } - else - gtk_widget_set_sensitive(GTK_WIDGET(b->commentry), FALSE); - gtk_widget_show(b->commentry); - g_signal_connect(GTK_OBJECT(b->command), "clicked", - G_CALLBACK(gaim_gtk_toggle_sensitive), b->commentry); - - b->sound = gtk_check_button_new_with_label(_("Play sound on pounce")); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sound), - (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->sound), FALSE); - gtk_table_attach(GTK_TABLE(table), b->sound, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); - gtk_widget_show(b->sound); - - b->soundentry = gtk_entry_new(); - gtk_table_attach(GTK_TABLE(table), b->soundentry, 1, 2, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0); - g_signal_connect(GTK_OBJECT(b->soundentry), "activate", G_CALLBACK(do_new_bp), b); - if(edit_bp) { - gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), - (edit_bp->options & OPT_POUNCE_SOUND) ? TRUE : FALSE); - gtk_entry_set_text(GTK_ENTRY(b->soundentry), edit_bp->sound); - } else - gtk_widget_set_sensitive(GTK_WIDGET(b->soundentry), FALSE); - gtk_widget_show(b->soundentry); - g_signal_connect(GTK_OBJECT(b->sound), "clicked", - G_CALLBACK(gaim_gtk_toggle_sensitive), b->soundentry); - /* </pounce type="action"> */ - - b->save = gtk_check_button_new_with_label(_("Save this pounce after activation")); - gtk_container_set_border_width(GTK_CONTAINER(b->save), 7); - if(edit_bp) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->save), - (edit_bp->options & OPT_POUNCE_SAVE) ? TRUE : FALSE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b->save), FALSE); - gtk_box_pack_start(GTK_BOX(vbox), b->save, FALSE, FALSE, 0); - gtk_widget_show(b->save); - - sep = gtk_hseparator_new(); - gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0); - gtk_widget_show(sep); - - bbox = gtk_hbox_new(FALSE, 5); - gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); - gtk_widget_show(bbox); - - sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - button = gaim_pixbuf_button_from_stock(_("_Save"), "gtk-execute", GAIM_BUTTON_HORIZONTAL); - gtk_size_group_add_widget(sg, button); - g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(do_new_bp), b); - gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - - button = gaim_pixbuf_button_from_stock(_("C_ancel"), "gtk-cancel", GAIM_BUTTON_HORIZONTAL); - gtk_size_group_add_widget(sg, button); - g_signal_connect(GTK_OBJECT(button), "clicked", G_CALLBACK(destroy_dialog), b->window); - gtk_box_pack_end(GTK_BOX(bbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - - - gtk_widget_show(b->window); -} - - /*------------------------------------------------------------------------*/ /* The dialog for SET INFO / SET DIR INFO */ @@ -3379,100 +2987,6 @@ } /*------------------------------------------------------------------------*/ -/* The dialog for import/export */ -/*------------------------------------------------------------------------*/ - -static void do_import_dialog(GtkWidget *w, gpointer data) -{ - const char *file = gtk_file_selection_get_filename(GTK_FILE_SELECTION(importdialog)); - if (file_is_dir(file, importdialog)) { - return; - } - if (g_slist_find(connections, importgc)) { - do_import(importgc->account, file); - gaim_blist_save(); - } - destroy_dialog(NULL, importdialog); -} - -static void set_import_gc(gpointer data, struct gaim_connection *gc) -{ - importgc = gc; -} - -static void create_import_dropdown(GtkFileSelection *fs) -{ - GtkWidget *hbox; - GtkWidget *label; - GSList *g = connections; - struct gaim_connection *c; - GtkWidget *optmenu; - GtkWidget *menu; - char buf[256]; - GtkWidget *opt; - - if (!connections) - return; - importgc = connections->data; - if (!connections->next) - return; - - hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_end(GTK_BOX(fs->action_area), hbox, FALSE, FALSE, 0); - gtk_widget_show(hbox); - - optmenu = gtk_option_menu_new(); - gtk_box_pack_end(GTK_BOX(hbox), optmenu, FALSE, FALSE, 5); - gtk_widget_show(optmenu); - - label = gtk_label_new(_("Import to:")); - gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 5); - gtk_widget_show(label); - - menu = gtk_menu_new(); - - while (g) { - c = (struct gaim_connection *)g->data; - g_snprintf(buf, sizeof buf, "%s (%s)", c->username, c->prpl->name); - opt = gtk_menu_item_new_with_label(buf); - g_signal_connect(GTK_OBJECT(opt), "activate", G_CALLBACK(set_import_gc), c); - gtk_widget_show(opt); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), opt); - g = g->next; - } - - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), 0); -} - -void show_import_dialog() -{ - char *buf = g_malloc(BUF_LEN); - if (!importdialog) { - importdialog = gtk_file_selection_new(_("Gaim - Import Buddy List")); - - gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION(importdialog)); - - g_snprintf(buf, BUF_LEN - 1, "%s" G_DIR_SEPARATOR_S, gaim_home_dir()); - - gtk_file_selection_set_filename(GTK_FILE_SELECTION(importdialog), buf); - g_signal_connect(GTK_OBJECT(importdialog), "destroy", - G_CALLBACK(destroy_dialog), importdialog); - - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(importdialog)->ok_button), - "clicked", G_CALLBACK(do_import_dialog), NULL); - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(importdialog)->cancel_button), - "clicked", G_CALLBACK(destroy_dialog), importdialog); - - create_import_dropdown(GTK_FILE_SELECTION(importdialog)); - } - - g_free(buf); - gtk_widget_show(importdialog); - gdk_window_raise(importdialog->window); -} - -/*------------------------------------------------------------------------*/ /* The dialog for new away messages */ /*------------------------------------------------------------------------*/ @@ -3811,7 +3325,7 @@ g_snprintf(b->alias, sizeof(b->alias), "%s", al); else b->alias[0] = '\0'; - handle_buddy_rename(b, b->name); + gaim_blist_alias_buddy (b, al); serv_alias_buddy(b); gaim_blist_save(); destroy_dialog(aliasdlg, aliasdlg); @@ -4363,11 +3877,10 @@ if (new_name && (strlen(new_name) != 0) && strcmp(new_name, g->name)) { char *prevname; - if ((orig = find_group(new_name)) != NULL && g_strcasecmp(new_name, g->name)) { + if ((orig = gaim_find_group(new_name)) != NULL && g_strcasecmp(new_name, g->name)) { orig->members = g_slist_concat(orig->members, g->members); - handle_group_rename(orig, g->name); + gaim_blist_rename_group(orig, g->name); groups = g_slist_remove(groups, g); - /* FIXME, i don't like calling this. it's sloppy. */ build_edit_tree(); accts = gaim_group_get_accounts(g); while(accts) { struct gaim_account *account = accts->data; @@ -4384,8 +3897,7 @@ accts = g_slist_remove(accts, accts->data); } g_snprintf(g->name, sizeof(g->name), "%s", new_name); - handle_group_rename(g, prevname); - /* FIXME, i don't like calling this. it's sloppy. */ build_edit_tree(); + gaim_blist_rename_group(g, prevname); g_free(prevname); } gaim_blist_save(); @@ -4406,7 +3918,7 @@ g_free(filename); if (!rename_dialog) { - rename_dialog = gtk_dialog_new_with_buttons(_("Gaim - Rename Group"), GTK_WINDOW(blist), GTK_DIALOG_MODAL, + rename_dialog = gtk_dialog_new_with_buttons(_("Rename Group"), GTK_WINDOW(gtkblist->window), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG(rename_dialog), GTK_RESPONSE_OK); gtk_container_set_border_width (GTK_CONTAINER(rename_dialog), 6); @@ -4483,13 +3995,13 @@ } if (new_name && (strlen(new_name) != 0) && strcmp(new_name, b->name)) { - struct group *g = find_group_by_buddy(b); + struct group *g = gaim_find_buddys_group(b); char *prevname = g_strdup(b->name); if (g) serv_remove_buddy(b->account->gc, b->name, g->name); g_snprintf(b->name, sizeof(b->name), "%s", new_name); serv_add_buddy(b->account->gc, b->name); - handle_buddy_rename(b, prevname); + gaim_blist_rename_buddy(b, prevname); gaim_blist_save(); g_free(prevname); } Index: gaim.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/gaim.h,v retrieving revision 1.372 retrieving revision 1.373 diff -u -d -r1.372 -r1.373 --- gaim.h 5 Mar 2003 05:10:46 -0000 1.372 +++ gaim.h 10 Mar 2003 05:30:19 -0000 1.373 @@ -28,6 +28,7 @@ #include "core.h" #include "ui.h" +#include "list.h" #define XPATCH BAD /* Because Kalla Said So */ @@ -236,6 +237,7 @@ #define OPT_BLIST_GREY_IDLERS 0x00000400 #define OPT_BLIST_BOTTOM_TAB 0X00000800 #define OPT_BLIST_POPUP 0x00001000 +#define OPT_BLIST_SHOW_ICONS 0x00002000 extern guint convo_options; #define OPT_CONVO_ENTER_SENDS 0x00000001 @@ -340,9 +342,6 @@ /* Functions in buddy.c */ extern void signoff(struct gaim_connection *); -extern void do_pounce(struct gaim_connection *, char *, int); -void create_prpl_icon(GtkWidget *widget, struct gaim_connection *gc, - GdkPixmap **pixmap, GdkBitmap **mask); /* Functions in buddy_chat.c */ #if 0 Index: gtkconv.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkconv.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- gtkconv.c 10 Mar 2003 04:11:18 -00... [truncated message content] |