| 1063 struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); |
1063 struct proto_buddy_menu *pbm = g_object_get_data(G_OBJECT(item), "gaimcallback"); |
| 1064 if (pbm->callback) |
1064 if (pbm->callback) |
| 1065 pbm->callback(pbm->gc, b->name); |
1065 pbm->callback(pbm->gc, b->name); |
| 1066 } |
1066 } |
| 1067 |
1067 |
| 1068 static void gaim_proto_group_menu_cb(GtkMenuItem *item, GaimGroup *g) |
|
| 1069 { |
|
| 1070 struct proto_group_menu *pgm = g_object_get_data(G_OBJECT(item), "gaimcallback"); |
|
| 1071 if (pgm->callback) |
|
| 1072 pgm->callback(g); |
|
| 1073 } |
|
| 1074 |
|
| 1075 static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) |
1068 static void make_buddy_menu(GtkWidget *menu, GaimPluginProtocolInfo *prpl_info, GaimBuddy *b) |
| 1076 { |
1069 { |
| 1077 GList *list = NULL, *l = NULL; |
1070 GList *list = NULL, *l = NULL; |
| 1078 gboolean dup_separator = FALSE; |
1071 gboolean dup_separator = FALSE; |
| 1079 GtkWidget *menuitem; |
1072 GtkWidget *menuitem; |
| 1093 list = prpl_info->buddy_menu(b->account->gc, b->name); |
1086 list = prpl_info->buddy_menu(b->account->gc, b->name); |
| 1094 |
1087 |
| 1095 for(l = list; l; l = l->next) { |
1088 for(l = list; l; l = l->next) { |
| 1096 struct proto_buddy_menu *pbm = l->data; |
1089 struct proto_buddy_menu *pbm = l->data; |
| 1097 |
1090 |
| 1098 /* draw NULL menu items as a separator. Since the |
1091 /* draw NULL menu items as a separator. |
| 1099 pbm is not being used in a callback, it needs to be |
1092 Also, do some simple checking to prevent |
| 1100 freed. Also, do some simple checking to prevent |
|
| 1101 doubled-up separators */ |
1093 doubled-up separators */ |
| 1102 if(pbm == NULL) { |
1094 if(pbm == NULL) { |
| 1103 if(! dup_separator) { |
1095 if(! dup_separator) { |
| 1104 gaim_separator(menu); |
1096 gaim_separator(menu); |
| 1105 dup_separator = TRUE; |
1097 dup_separator = TRUE; |
| 1248 GaimChat *c, |
1246 GaimChat *c, |
| 1249 GaimPlugin *prpl, |
1247 GaimPlugin *prpl, |
| 1250 GaimPluginProtocolInfo *prpl_info) |
1248 GaimPluginProtocolInfo *prpl_info) |
| 1251 { |
1249 { |
| 1252 GtkWidget *menu; |
1250 GtkWidget *menu; |
| 1253 GList *list; |
1251 GList *list, *l; |
| 1254 GtkWidget *menuitem; |
1252 GtkWidget *menuitem; |
| |
1253 gboolean dup_separator = FALSE; |
| 1255 gboolean autojoin = (gaim_blist_node_get_bool(node, |
1254 gboolean autojoin = (gaim_blist_node_get_bool(node, |
| 1256 "gtk-autojoin") || (gaim_blist_node_get_string(node, |
1255 "gtk-autojoin") || (gaim_blist_node_get_string(node, |
| 1257 "gtk-autojoin") != NULL)); |
1256 "gtk-autojoin") != NULL)); |
| 1258 |
1257 |
| 1259 menu = gtk_menu_new(); |
1258 menu = gtk_menu_new(); |
| 1265 |
1264 |
| 1266 if (prpl_info && prpl_info->chat_menu) { |
1265 if (prpl_info && prpl_info->chat_menu) { |
| 1267 list = prpl_info->chat_menu(c->account->gc, c->components); |
1266 list = prpl_info->chat_menu(c->account->gc, c->components); |
| 1268 while (list) { |
1267 while (list) { |
| 1269 struct proto_chat_menu *pcm = list->data; |
1268 struct proto_chat_menu *pcm = list->data; |
| |
1269 |
| |
1270 /* draw NULL menu items as a separator. |
| |
1271 Also, do some simple checking to prevent |
| |
1272 doubled-up separators */ |
| |
1273 if(pcm == NULL) { |
| |
1274 if(! dup_separator) { |
| |
1275 gaim_separator(menu); |
| |
1276 dup_separator = TRUE; |
| |
1277 } |
| |
1278 continue; |
| |
1279 } else { |
| |
1280 dup_separator = FALSE; |
| |
1281 } |
| |
1282 |
| 1270 menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); |
1283 menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); |
| 1271 g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); |
1284 g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); |
| 1272 g_signal_connect(G_OBJECT(menuitem), "activate", |
1285 g_signal_connect(G_OBJECT(menuitem), "activate", |
| 1273 G_CALLBACK(gaim_proto_chat_menu_cb), c); |
1286 G_CALLBACK(gaim_proto_chat_menu_cb), c); |
| 1274 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
1287 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| 1275 list = list->next; |
1288 list = list->next; |
| 1276 } |
1289 } |
| 1277 } |
1290 } |
| |
1291 |
| |
1292 /* check for additional menu items which may be added by other |
| |
1293 plugins. */ |
| |
1294 list = gaim_chat_get_extended_menu(c); |
| |
1295 for(l = list; l; l = l->next) { |
| |
1296 struct proto_chat_menu *pcm = l->data; |
| |
1297 |
| |
1298 /* draw NULL menu items as a separator. see previous, |
| |
1299 identical-looking code. */ |
| |
1300 if(pcm == NULL) { |
| |
1301 if(! dup_separator) { |
| |
1302 gaim_separator(menu); |
| |
1303 dup_separator = TRUE; |
| |
1304 } |
| |
1305 continue; |
| |
1306 } else { |
| |
1307 dup_separator = FALSE; |
| |
1308 } |
| |
1309 |
| |
1310 menuitem = gtk_menu_item_new_with_mnemonic(pcm->label); |
| |
1311 g_object_set_data(G_OBJECT(menuitem), "gaimcallback", pcm); |
| |
1312 g_signal_connect(G_OBJECT(menuitem), "activate", |
| |
1313 G_CALLBACK(gaim_proto_chat_menu_cb), c); |
| |
1314 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); |
| |
1315 } |
| |
1316 g_list_free(list); |
| |
1317 |
| |
1318 /* moving on to the old ui-specific plugin menus */ |
| 1278 gaim_signal_emit(gaim_gtk_blist_get_handle(), |
1319 gaim_signal_emit(gaim_gtk_blist_get_handle(), |
| 1279 "drawing-menu", menu, c); |
1320 "drawing-menu", menu, c); |
| 1280 |
1321 |
| 1281 gaim_separator(menu); |
1322 gaim_separator(menu); |
| 1282 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |
1323 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_ALIAS, |