From: Mark D. <the...@us...> - 2004-05-23 17:28:22
|
Update of /cvsroot/gaim/gaim/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1398/src Modified Files: blist.c blist.h gtkblist.c multi.h prpl.h roomlist.h Log Message: Siege updated the code for creating right-click menu's for buddies, chats, groups, etc. It uses more stuff from the blist API and less stuff from multi.h. It also combines the code for right-click menus for chats, buddies, etc. (all types of blist nodes). So PRPLs and plugins can easily add right-click menu options to anything in the buddy list in a clean way. Index: blist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/blist.c,v retrieving revision 1.150 retrieving revision 1.151 diff -u -d -p -r1.150 -r1.151 --- blist.c 23 May 2004 01:21:01 -0000 1.150 +++ blist.c 23 May 2004 17:27:42 -0000 1.151 @@ -2720,25 +2720,28 @@ const char *gaim_buddy_get_setting(GaimB /* XXX: end compat crap */ -GList *gaim_buddy_get_extended_menu(GaimBuddy *b) { +GList *gaim_blist_node_get_extended_menu(GaimBlistNode *n) { GList *menu = NULL; - gaim_signal_emit(gaim_blist_get_handle(), "buddy-extended-menu", - b, &menu); - return menu; -} -GList *gaim_chat_get_extended_menu(GaimChat *c) { - GList *menu = NULL; - gaim_signal_emit(gaim_blist_get_handle(), "chat-extended-menu", - c, &menu); + g_return_val_if_fail(n, NULL); + + gaim_signal_emit(gaim_blist_get_handle(), + "blist-node-extended-menu", + n, &menu); return menu; } -GList *gaim_group_get_extended_menu(GaimGroup *g) { - GList *menu = NULL; - gaim_signal_emit(gaim_blist_get_handle(), "group-extended-menu", - g, &menu); - return menu; + +GaimBlistNodeAction * +gaim_blist_node_action_new(char *label, + void (*callback)(GaimBlistNode *, gpointer), + gpointer data) +{ + GaimBlistNodeAction *act = g_new0(GaimBlistNodeAction, 1); + act->label = label; + act->callback = callback; + act->data = data; + return act; } @@ -2812,20 +2815,11 @@ gaim_blist_init(void) GAIM_SUBTYPE_BLIST_BUDDY)); gaim_signal_register(handle, "update-idle", gaim_marshal_VOID, NULL, 0); - gaim_signal_register(handle, "buddy-extended-menu", - gaim_marshal_VOID__POINTER_POINTER, NULL, 2, - gaim_value_new(GAIM_TYPE_SUBTYPE, - GAIM_SUBTYPE_BLIST_BUDDY), - gaim_value_new(GAIM_TYPE_BOXED, "GList **")); - gaim_signal_register(handle, "chat-extended-menu", - gaim_marshal_VOID__POINTER_POINTER, NULL, 2, - gaim_value_new(GAIM_TYPE_SUBTYPE, - GAIM_SUBTYPE_BLIST_CHAT), - gaim_value_new(GAIM_TYPE_BOXED, "GList **")); - gaim_signal_register(handle, "group-extended-menu", + + gaim_signal_register(handle, "blist-node-extended-menu", gaim_marshal_VOID__POINTER_POINTER, NULL, 2, gaim_value_new(GAIM_TYPE_SUBTYPE, - GAIM_SUBTYPE_BLIST_GROUP), + GAIM_SUBTYPE_BLIST_NODE), gaim_value_new(GAIM_TYPE_BOXED, "GList **")); } @@ -2834,3 +2828,4 @@ gaim_blist_uninit(void) { gaim_signals_unregister_by_instance(gaim_blist_get_handle()); } + Index: blist.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/blist.h,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -p -r1.54 -r1.55 --- blist.h 22 May 2004 16:46:07 -0000 1.54 +++ blist.h 23 May 2004 17:27:42 -0000 1.55 @@ -34,6 +34,8 @@ typedef struct _GaimBuddyList GaimBuddyL typedef struct _GaimBlistUiOps GaimBlistUiOps; typedef struct _GaimBlistNode GaimBlistNode; +typedef struct _GaimBlistNodeAction GaimBlistNodeAction; + typedef struct _GaimChat GaimChat; typedef struct _GaimGroup GaimGroup; typedef struct _GaimContact GaimContact; @@ -183,6 +185,14 @@ struct _GaimBlistUiOps void (*request_add_group)(void); }; + +struct _GaimBlistNodeAction { + char *label; + void (*callback)(GaimBlistNode *, gpointer); + gpointer data; +}; + + #ifdef __cplusplus extern "C" { #endif @@ -857,22 +867,23 @@ const char *gaim_buddy_get_setting(GaimB /** - * Retrieves the extended menu items for a buddy. - * @param b The buddy to obtain the extended menu items for -*/ -GList *gaim_buddy_get_extended_menu(GaimBuddy *b); + * Retrieves the extended menu items for a buddy list node. + * @param n The blist node for which to obtain the extended menu items. + * @return list of GaimBlistNodeAction items, as harvested by the + * blist-node-extended-menu signal. + */ +GList *gaim_blist_node_get_extended_menu(GaimBlistNode *n); -/** - * Retrieves the extended menu items for a chat. - * @param c The chat to obtain the extended menu items for -*/ -GList *gaim_chat_get_extended_menu(GaimChat *c); /** - * Retrieves the extended menu items for a group. - * @param g The group to obtain the extended menu items for -*/ -GList *gaim_group_get_extended_menu(GaimGroup *g); + * Creates a new GaimBlistNodeAction. + * @param label The text label to display for this action. + * @param callback The function to be called when the action is used on + * a selected GaimBlistNode. + * @param data Additional data, to be passed to the callback + */ +GaimBlistNodeAction *gaim_blist_node_action_new(char *label, + void (*callback)(GaimBlistNode *, gpointer), gpointer data); /**************************************************************************/ Index: gtkblist.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/gtkblist.c,v retrieving revision 1.115 retrieving revision 1.116 diff -u -d -p -r1.115 -r1.116 --- gtkblist.c 22 May 2004 23:08:27 -0000 1.115 +++ gtkblist.c 23 May 2004 17:27:42 -0000 1.116 @@ -1059,19 +1059,75 @@ gaim_gtk_blist_collapse_contact_cb(GtkWi } } -static void gaim_proto_menu_cb(GtkMenuItem *item, GaimBuddy *b) + +static void +blist_node_menu_cb(GtkMenuItem *item, GaimBlistNode *node) { - struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pbm->callback) - pbm->callback(pbm->gc, b->name); + GaimBlistNodeAction *act; + act = (GaimBlistNodeAction *) g_object_get_data(G_OBJECT(item), + "gaimcallback"); + if(act->callback) + act->callback(node, act->data); } -static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) + +static void +append_blist_node_action (GtkWidget *menu, GaimBlistNodeAction *act, + GaimBlistNode *node, gboolean *dup_separator) { - GList *list = NULL, *l = NULL; + if(act == NULL) { + if(! *dup_separator) { + gaim_separator(menu); + *dup_separator = TRUE; + } + } else { + GtkWidget *menuitem; + + *dup_separator = FALSE; + + menuitem = gtk_menu_item_new_with_mnemonic(act->label); + g_object_set_data(G_OBJECT(menuitem), "gaimcallback", act); + g_signal_connect(G_OBJECT(menuitem), "activate", + G_CALLBACK(blist_node_menu_cb), node); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + } +} + + +static void +append_blist_node_proto_menu (GtkWidget *menu, GaimConnection *gc, GaimBlistNode *node) +{ + GList *l, *ll; gboolean dup_separator = FALSE; - GtkWidget *menuitem; + GaimPluginProtocolInfo *prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); + + if(!prpl_info || !prpl_info->blist_node_menu) + return; + for(l = ll = prpl_info->blist_node_menu(node); l; l = l->next) { + GaimBlistNodeAction *act = (GaimBlistNodeAction *) l->data; + append_blist_node_action(menu, act, node, &dup_separator); + } + g_list_free(ll); +} + + +static void +append_blist_node_extended_menu (GtkWidget *menu, GaimBlistNode *node) +{ + GList *l, *ll; + gboolean dup_separator = FALSE; + + for(l = ll = gaim_blist_node_get_extended_menu(node); l; l = l->next) { + GaimBlistNodeAction *act = (GaimBlistNodeAction *) l->data; + append_blist_node_action(menu, act, node, &dup_separator); + } + g_list_free(ll); +} + + +static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) +{ if (prpl_info && prpl_info->get_info) { gaim_new_item_from_stock(menu, _("Get _Info"), GAIM_STOCK_INFO, G_CALLBACK(gtk_blist_menu_info_cb), b, 0, 0, NULL); @@ -1083,65 +1139,14 @@ static void make_buddy_menu(GtkWidget *m gaim_new_item_from_stock(menu, _("View _Log"), NULL, G_CALLBACK(gtk_blist_menu_showlog_cb), b, 0, 0, NULL); - if (prpl_info && prpl_info->buddy_menu) { - list = prpl_info->buddy_menu(b->account->gc, b->name); - - for(l = list; l; l = l->next) { - struct proto_buddy_menu *pbm = l->data; - - /* draw NULL menu items as a separator. - Also, do some simple checking to prevent - doubled-up separators */ - if(pbm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_menu_cb), b); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); - } - - /* check for additional menu items which may be added by other - plugins. */ - list = gaim_buddy_get_extended_menu(b); - for(l = list; l; l = l->next) { - struct proto_buddy_menu *pbm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. */ - if(pbm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pbm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pbm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_menu_cb), b); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + append_blist_node_proto_menu(menu, b->account->gc, (GaimBlistNode *) b); + append_blist_node_extended_menu(menu, (GaimBlistNode *) b); /* moving on to the old ui-specific plugin menus */ - gaim_signal_emit(gaim_gtk_blist_get_handle(), - "drawing-menu", menu, b); + gaim_signal_emit(gaim_gtk_blist_get_handle(), "drawing-menu", menu, b); gaim_separator(menu); + gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, G_CALLBACK(gtk_blist_menu_alias_cb), b, 0, 0, NULL); gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, @@ -1183,20 +1188,11 @@ static gboolean gtk_blist_key_press_cb(G return FALSE; } -static void gaim_proto_group_menu_cb(GtkMenuItem *item, GaimGroup *g) -{ - struct proto_group_menu *pgm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pgm->callback) - pgm->callback(g); -} static GtkWidget * create_group_menu (GaimBlistNode *node, GaimGroup *g) { GtkWidget *menu; - GList *list = NULL, *l = NULL; - gboolean dup_separator = FALSE; - GtkWidget *menuitem; menu = gtk_menu_new(); gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD, @@ -1208,39 +1204,11 @@ create_group_menu (GaimBlistNode *node, gaim_new_item_from_stock(menu, _("_Rename"), NULL, G_CALLBACK(show_rename_group), node, 0, 0, NULL); - list = gaim_group_get_extended_menu(g); - for(l = list; l; l = l->next) { - struct proto_group_menu *pgm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. (in make_buddy_menu)*/ - if(pgm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pgm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pgm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_group_menu_cb), g); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + append_blist_node_extended_menu(menu, node); return menu; } -static void gaim_proto_chat_menu_cb(GtkMenuItem *item, GaimChat *c) -{ - struct proto_chat_menu *pcm = g_object_get_data(G_OBJECT(item), "gaimcallback"); - if (pcm->callback) - pcm->callback(pcm->gc, c->components); -} static GtkWidget * create_chat_menu (GaimBlistNode *node, @@ -1249,78 +1217,25 @@ create_chat_menu (GaimBlistNode *node, GaimPluginProtocolInfo *prpl_info) { GtkWidget *menu; - GList *list, *l; - GtkWidget *menuitem; - gboolean dup_separator = FALSE; - gboolean autojoin = (gaim_blist_node_get_bool(node, - "gtk-autojoin") || (gaim_blist_node_get_string(node, - "gtk-autojoin") != NULL)); + gboolean autojoin; menu = gtk_menu_new(); + autojoin = (gaim_blist_node_get_bool(node, "gtk-autojoin") || + (gaim_blist_node_get_string(node, "gtk-autojoin") != NULL)); + gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT, - G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); + G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL); gaim_new_check_item(menu, _("Auto-Join"), - G_CALLBACK(gtk_blist_menu_autojoin_cb), node, - autojoin); - - if (prpl_info && prpl_info->chat_menu) { - list = prpl_info->chat_menu(c->account->gc, c->components); - while (list) { - struct proto_chat_menu *pcm = list->data; - - /* draw NULL menu items as a separator. - Also, do some simple checking to prevent - doubled-up separators */ - if(pcm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } - - menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_chat_menu_cb), c); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - list = list->next; - } - } - - /* check for additional menu items which may be added by other - plugins. */ - list = gaim_chat_get_extended_menu(c); - for(l = list; l; l = l->next) { - struct proto_chat_menu *pcm = l->data; - - /* draw NULL menu items as a separator. see previous, - identical-looking code. */ - if(pcm == NULL) { - if(! dup_separator) { - gaim_separator(menu); - dup_separator = TRUE; - } - continue; - } else { - dup_separator = FALSE; - } + G_CALLBACK(gtk_blist_menu_autojoin_cb), node, autojoin); - menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); - g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); - g_signal_connect(G_OBJECT(menuitem), "activate", - G_CALLBACK(gaim_proto_chat_menu_cb), c); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); - } - g_list_free(list); + append_blist_node_proto_menu(menu, c->account->gc, node); + append_blist_node_extended_menu(menu, node); /* moving on to the old ui-specific plugin menus */ - gaim_signal_emit(gaim_gtk_blist_get_handle(), - "drawing-menu", menu, c); + gaim_signal_emit(gaim_gtk_blist_get_handle(), "drawing-menu", menu, c); gaim_separator(menu); + gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL); gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE, Index: multi.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/multi.h,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -p -r1.65 -r1.66 --- multi.h 22 May 2004 17:33:32 -0000 1.65 +++ multi.h 23 May 2004 17:27:42 -0000 1.66 @@ -24,25 +24,6 @@ #ifndef _MULTI_H_ #define _MULTI_H_ -#include "account.h" - -struct proto_buddy_menu { - char *label; - void (*callback)(GaimConnection *, const char *); - GaimConnection *gc; -}; - -struct proto_chat_menu { - char *label; - void (*callback)(GaimConnection *, GHashTable *); - GaimConnection *gc; -}; - -struct proto_group_menu { - char *label; - void (*callback)(GaimGroup *); -}; - struct proto_chat_entry { char *label; char *identifier; Index: prpl.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/prpl.h,v retrieving revision 1.162 retrieving revision 1.163 diff -u -d -p -r1.162 -r1.163 --- prpl.h 22 May 2004 17:33:32 -0000 1.162 +++ prpl.h 23 May 2004 17:27:42 -0000 1.163 @@ -239,7 +239,7 @@ struct _GaimPluginProtocolInfo GList *(*away_states)(GaimConnection *gc); - GList *(*buddy_menu)(GaimConnection *, const char *); + GList *(*blist_node_menu)(GaimBlistNode *node); GList *(*chat_info)(GaimConnection *); /* All the server-related functions */ @@ -316,9 +316,6 @@ struct _GaimPluginProtocolInfo struct _GaimRoomlist *(*roomlist_get_list)(GaimConnection *gc); void (*roomlist_cancel)(struct _GaimRoomlist *list); void (*roomlist_expand_category)(struct _GaimRoomlist *list, struct _GaimRoomlistRoom *category); - - /* Chat specific menu in the buddy list */ - GList *(*chat_menu)(GaimConnection *, GHashTable *); }; #define GAIM_IS_PROTOCOL_PLUGIN(plugin) \ @@ -327,6 +324,9 @@ struct _GaimPluginProtocolInfo #define GAIM_PLUGIN_PROTOCOL_INFO(plugin) \ ((GaimPluginProtocolInfo *)(plugin)->info->extra_info) +/* It's not like we're going to run out of integers for this version + number, but we only want to really change it once per release. */ +/* GAIM_PRPL_API_VERSION last changed for version: 0.78 */ #define GAIM_PRPL_API_VERSION 4 #ifdef __cplusplus Index: roomlist.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/roomlist.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -p -r1.10 -r1.11 --- roomlist.h 21 May 2004 19:09:38 -0000 1.10 +++ roomlist.h 23 May 2004 17:27:42 -0000 1.11 @@ -26,6 +26,11 @@ #ifndef _GAIM_ROOMLIST_H_ #define _GAIM_ROOMLIST_H_ + +#include <glib/glist.h> +#include "account.h" + + /**************************************************************************/ /** Data Structures */ /**************************************************************************/ |