comparison src/gtkblist.c @ 8143:8633dc570442

[gaim-migrate @ 8851] sf cvs fing sucks. This is the rest of the accessibility stuff from that cool Nathan guy. It makes shift+f10 bring up context menus. Please check over stuff and make sure neither of us broke anything. Also, someone think of a good way to phrase that thing about this that's in the ChangeLog. Thank you, and have a nice day. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Mon, 19 Jan 2004 22:40:17 +0000
parents 4971193f761d
children 7c45eb829340
comparison
equal deleted inserted replaced
8142:f2919ca98e78 8143:8633dc570442
871 } 871 }
872 872
873 return FALSE; 873 return FALSE;
874 } 874 }
875 875
876 static gboolean gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer null) 876 static GtkWidget *
877 create_group_menu (GaimBlistNode *node)
878 {
879 GtkWidget *menu;
880
881 menu = gtk_menu_new();
882 gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD,
883 G_CALLBACK(gaim_gtk_blist_add_buddy_cb), node, 0, 0, NULL);
884 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD,
885 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL);
886 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE,
887 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
888 gaim_new_item_from_stock(menu, _("_Rename"), NULL,
889 G_CALLBACK(show_rename_group), node, 0, 0, NULL);
890 return menu;
891 }
892
893 static GtkWidget *
894 create_chat_menu (GaimBlistNode *node)
895 {
896 GtkWidget *menu;
897 gboolean autojoin = gaim_blist_node_get_bool(node,
898 "gtk-autojoin");
899
900 menu = gtk_menu_new();
901 gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT,
902 G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL);
903 gaim_new_check_item(menu, _("Auto-Join"),
904 G_CALLBACK(gtk_blist_menu_autojoin_cb), node,
905 autojoin);
906 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_EDIT,
907 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
908 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE,
909 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
910 return menu;
911 }
912
913 static GtkWidget *
914 create_contact_menu (GaimBlistNode *node)
915 {
916 GtkWidget *menu;
917
918 menu = gtk_menu_new();
919 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_EDIT,
920 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
921 gaim_new_item_from_stock(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT,
922 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb),
923 node, 0, 0, NULL);
924 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE,
925 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
926 return menu;
927 }
928
929 static GtkWidget *
930 create_buddy_menu (GaimBlistNode *node,
931 GaimBuddy *b,
932 GaimPlugin *prpl,
933 GaimPluginProtocolInfo *prpl_info)
934 {
935 struct _gaim_gtk_blist_node *gtknode = (struct _gaim_gtk_blist_node *)node->ui_data;
936 GtkWidget *menu;
937 GtkWidget *menuitem;
938 gboolean show_offline = gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies");
939
940 menu = gtk_menu_new();
941 make_buddy_menu(menu, prpl_info, b);
942
943 if(GAIM_BLIST_NODE_IS_CONTACT(node)) {
944 gaim_separator(menu);
945
946 if(gtknode->contact_expanded) {
947 gaim_new_item_from_stock(menu, _("_Collapse"),
948 GTK_STOCK_ZOOM_OUT,
949 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb),
950 node, 0, 0, NULL);
951 } else {
952 gaim_new_item_from_stock(menu, _("_Expand"),
953 GTK_STOCK_ZOOM_IN,
954 G_CALLBACK(gaim_gtk_blist_expand_contact_cb), node,
955 0, 0, NULL);
956 }
957 if(node->child->next) {
958 GaimBlistNode *bnode;
959
960 for(bnode = node->child; bnode; bnode = bnode->next) {
961 GaimBuddy *buddy = (GaimBuddy*)bnode;
962 GtkWidget *submenu;
963 GtkWidget *image;
964
965 if(buddy == b)
966 continue;
967 if(!buddy->account->gc)
968 continue;
969 if(!show_offline && !GAIM_BUDDY_IS_ONLINE(buddy))
970 continue;
971
972 menuitem = gtk_image_menu_item_new_with_label(buddy->name);
973 image = gtk_image_new_from_pixbuf(
974 gaim_gtk_blist_get_status_icon(bnode,
975 GAIM_STATUS_ICON_SMALL));
976 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem),
977 image);
978 gtk_widget_show(image);
979 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
980 gtk_widget_show(menuitem);
981
982 submenu = gtk_menu_new();
983 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
984 gtk_widget_show(submenu);
985
986 prpl = gaim_find_prpl(gaim_account_get_protocol_id(buddy->account));
987 prpl_info = prpl ? GAIM_PLUGIN_PROTOCOL_INFO(prpl) : NULL;
988
989 make_buddy_menu(submenu, prpl_info, buddy);
990 }
991 }
992 }
993 return menu;
994 }
995
996 static gboolean
997 gaim_gtk_blist_show_context_menu(GaimBlistNode *node,
998 GtkMenuPositionFunc func,
999 GtkWidget *tv,
1000 guint button,
1001 guint32 time)
1002 {
1003 struct _gaim_gtk_blist_node *gtknode;
1004 GtkWidget *menu = NULL;
1005 gboolean handled = FALSE;
1006
1007 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data;
1008
1009 /* Create a menu based on the thing we right-clicked on */
1010 if (GAIM_BLIST_NODE_IS_GROUP(node)) {
1011 menu = create_group_menu(node);
1012 } else if (GAIM_BLIST_NODE_IS_CHAT(node)) {
1013 menu = create_chat_menu(node);
1014 } else if ((GAIM_BLIST_NODE_IS_CONTACT(node)) && (gtknode->contact_expanded)) {
1015 menu = create_contact_menu(node);
1016 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) || GAIM_BLIST_NODE_IS_BUDDY(node)) {
1017 GaimBuddy *b;
1018 GaimPlugin *prpl = NULL;
1019 GaimPluginProtocolInfo *prpl_info = NULL;
1020
1021 if (GAIM_BLIST_NODE_IS_CONTACT(node))
1022 b = gaim_contact_get_priority_buddy((GaimContact*)node);
1023 else
1024 b = (GaimBuddy *)node;
1025
1026 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account));
1027 if (prpl != NULL)
1028 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
1029 menu = create_buddy_menu(node, b, prpl, prpl_info);
1030 }
1031
1032 /* Now display the menu */
1033 if (menu != NULL) {
1034 gtk_widget_show_all(menu);
1035 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, func, tv, button, time);
1036 handled = TRUE;
1037 }
1038
1039 return handled;
1040 }
1041
1042 static gboolean gtk_blist_button_press_cb(GtkWidget *tv, GdkEventButton *event, gpointer user_data)
877 { 1043 {
878 GtkTreePath *path; 1044 GtkTreePath *path;
879 GaimBlistNode *node; 1045 GaimBlistNode *node;
880 GValue val = { 0, }; 1046 GValue val = { 0, };
881 GtkTreeIter iter; 1047 GtkTreeIter iter;
882 GtkWidget *menu, *menuitem;
883 GtkTreeSelection *sel; 1048 GtkTreeSelection *sel;
884 GaimPlugin *prpl = NULL; 1049 GaimPlugin *prpl = NULL;
885 GaimPluginProtocolInfo *prpl_info = NULL; 1050 GaimPluginProtocolInfo *prpl_info = NULL;
886 struct _gaim_gtk_blist_node *gtknode; 1051 struct _gaim_gtk_blist_node *gtknode;
887 gboolean handled = FALSE; 1052 gboolean handled = FALSE;
888 1053
889 /* Here we figure out which node was clicked */ 1054 /* Here we figure out which node was clicked */
890 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL)) 1055 if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL))
891 return FALSE; 1056 return FALSE;
892 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path); 1057 gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
893 gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val); 1058 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
894 node = g_value_get_pointer(&val); 1059 node = g_value_get_pointer(&val);
895 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data; 1060 gtknode = (struct _gaim_gtk_blist_node *)node->ui_data;
896 1061
897 if (GAIM_BLIST_NODE_IS_GROUP(node) && 1062 /* Right click draws a context menu */
898 event->button == 3 && event->type == GDK_BUTTON_PRESS) { 1063 if ((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) {
899 menu = gtk_menu_new(); 1064 handled = gaim_gtk_blist_show_context_menu(node, NULL, tv, 3, event->time);
900 gaim_new_item_from_stock(menu, _("Add a _Buddy"), GTK_STOCK_ADD, 1065
901 G_CALLBACK(gaim_gtk_blist_add_buddy_cb), node, 0, 0, NULL); 1066 /* CTRL+middle click expands or collapse a contact */
902 gaim_new_item_from_stock(menu, _("Add a C_hat"), GTK_STOCK_ADD, 1067 } else if ((event->button == 2) && (event->type == GDK_BUTTON_PRESS) &&
903 G_CALLBACK(gaim_gtk_blist_add_chat_cb), node, 0, 0, NULL); 1068 (event->state & GDK_CONTROL_MASK) && (GAIM_BLIST_NODE_IS_CONTACT(node))) {
904 gaim_new_item_from_stock(menu, _("_Delete Group"), GTK_STOCK_REMOVE, 1069 if (gtknode->contact_expanded)
905 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
906 gaim_new_item_from_stock(menu, _("_Rename"), NULL,
907 G_CALLBACK(show_rename_group), node, 0, 0, NULL);
908 gtk_widget_show_all(menu);
909 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
910
911 handled = TRUE;
912 } else if (GAIM_BLIST_NODE_IS_CHAT(node) &&
913 event->button == 3 && event->type == GDK_BUTTON_PRESS) {
914 GaimChat *chat = (GaimChat *)node;
915 gboolean autojoin = gaim_blist_node_get_bool((GaimBlistNode*)chat,
916 "gtk-autojoin");
917
918 menu = gtk_menu_new();
919 gaim_new_item_from_stock(menu, _("_Join"), GAIM_STOCK_CHAT,
920 G_CALLBACK(gtk_blist_menu_join_cb), node, 0, 0, NULL);
921 gaim_new_check_item(menu, _("Auto-Join"),
922 G_CALLBACK(gtk_blist_menu_autojoin_cb), node,
923 autojoin);
924 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_EDIT,
925 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
926 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE,
927 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
928 gtk_widget_show_all(menu);
929 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
930
931 handled = TRUE;
932 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) &&
933 event->state & GDK_CONTROL_MASK && event->button == 2 &&
934 event->type == GDK_BUTTON_PRESS) {
935 if(gtknode->contact_expanded)
936 gaim_gtk_blist_collapse_contact_cb(NULL, node); 1070 gaim_gtk_blist_collapse_contact_cb(NULL, node);
937 else 1071 else
938 gaim_gtk_blist_expand_contact_cb(NULL, node); 1072 gaim_gtk_blist_expand_contact_cb(NULL, node);
939 handled = TRUE; 1073 handled = TRUE;
940 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) && gtknode->contact_expanded 1074
941 && event->button == 3 && event->type == GDK_BUTTON_PRESS) { 1075 /* Double middle click gets info */
942 menu = gtk_menu_new(); 1076 } else if ((event->button == 2) && (event->type == GDK_2BUTTON_PRESS) &&
943 gaim_new_item_from_stock(menu, _("_Alias..."), GAIM_STOCK_EDIT, 1077 ((GAIM_BLIST_NODE_IS_CONTACT(node)) || (GAIM_BLIST_NODE_IS_BUDDY(node)))) {
944 G_CALLBACK(gtk_blist_menu_alias_cb), node, 0, 0, NULL);
945 gaim_new_item_from_stock(menu, _("_Collapse"), GTK_STOCK_ZOOM_OUT,
946 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb),
947 node, 0, 0, NULL);
948 gaim_new_item_from_stock(menu, _("_Remove"), GTK_STOCK_REMOVE,
949 G_CALLBACK(gaim_gtk_blist_remove_cb), node, 0, 0, NULL);
950 gtk_widget_show_all(menu);
951 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->time);
952 handled = TRUE;
953 } else if (GAIM_BLIST_NODE_IS_CONTACT(node) ||
954 GAIM_BLIST_NODE_IS_BUDDY(node)) {
955 GaimBuddy *b; 1078 GaimBuddy *b;
956 if(GAIM_BLIST_NODE_IS_CONTACT(node)) 1079 if(GAIM_BLIST_NODE_IS_CONTACT(node))
957 b = gaim_contact_get_priority_buddy((GaimContact*)node); 1080 b = gaim_contact_get_priority_buddy((GaimContact*)node);
958 else 1081 else
959 b = (GaimBuddy *)node; 1082 b = (GaimBuddy *)node;
960 1083
961 /* Protocol specific options */
962 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account)); 1084 prpl = gaim_find_prpl(gaim_account_get_protocol_id(b->account));
963
964 if (prpl != NULL) 1085 if (prpl != NULL)
965 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); 1086 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl);
966 1087
967 if(event->button == 2 && event->type == GDK_2BUTTON_PRESS) { 1088 if (prpl && prpl_info->get_info)
968 if (prpl && prpl_info->get_info) 1089 serv_get_info(b->account->gc, b->name);
969 serv_get_info(b->account->gc, b->name); 1090 handled = TRUE;
970 handled = TRUE; 1091 }
971 } else if(event->button == 3 && event->type == GDK_BUTTON_PRESS) { 1092
972 gboolean show_offline = gaim_prefs_get_bool("/gaim/gtk/blist/show_offline_buddies"); 1093 #if (1)
973 menu = gtk_menu_new(); 1094 /*
974 make_buddy_menu(menu, prpl_info, b); 1095 * This code only exists because GTK doesn't work. If we return
975 1096 * FALSE here, as would be normal the event propoagates down and
976 if(GAIM_BLIST_NODE_IS_CONTACT(node)) { 1097 * somehow gets interpreted as the start of a drag event.
977 gaim_separator(menu); 1098 *
978 1099 * Um, isn't it _normal_ to return TRUE here? Since the event
979 if(gtknode->contact_expanded) { 1100 * was handled? --Mark
980 gaim_new_item_from_stock(menu, _("_Collapse"), 1101 */
981 GTK_STOCK_ZOOM_OUT,
982 G_CALLBACK(gaim_gtk_blist_collapse_contact_cb),
983 node, 0, 0, NULL);
984 } else {
985 gaim_new_item_from_stock(menu, _("_Expand"),
986 GTK_STOCK_ZOOM_IN,
987 G_CALLBACK(gaim_gtk_blist_expand_contact_cb), node,
988 0, 0, NULL);
989 }
990 if(node->child->next) {
991 GaimBlistNode *bnode;
992
993 for(bnode = node->child; bnode; bnode = bnode->next) {
994 GaimBuddy *buddy = (GaimBuddy*)bnode;
995 GtkWidget *submenu;
996 GtkWidget *image;
997
998 if(buddy == b)
999 continue;
1000 if(!buddy->account->gc)
1001 continue;
1002 if(!show_offline && !GAIM_BUDDY_IS_ONLINE(buddy))
1003 continue;
1004
1005
1006 menuitem = gtk_image_menu_item_new_with_label(buddy->name);
1007 image = gtk_image_new_from_pixbuf(
1008 gaim_gtk_blist_get_status_icon(bnode,
1009 GAIM_STATUS_ICON_SMALL));
1010 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem),
1011 image);
1012 gtk_widget_show(image);
1013 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
1014 gtk_widget_show(menuitem);
1015
1016 submenu = gtk_menu_new();
1017 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
1018 gtk_widget_show(submenu);
1019
1020 prpl = gaim_find_prpl(gaim_account_get_protocol_id(buddy->account));
1021 prpl_info = prpl ? GAIM_PLUGIN_PROTOCOL_INFO(prpl) : NULL;
1022
1023 make_buddy_menu(submenu, prpl_info, buddy);
1024 }
1025 }
1026 }
1027
1028 gtk_widget_show_all(menu);
1029
1030 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3,
1031 event->time);
1032
1033 handled = TRUE;
1034 }
1035 }
1036
1037 #if (1) /* This code only exists because GTK doesn't work. If we return FALSE here, as would be normal
1038 * the event propoagates down and somehow gets interpreted as the start of a drag event. */
1039 if(handled) { 1102 if(handled) {
1040 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)); 1103 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
1041 gtk_tree_selection_select_path(sel, path); 1104 gtk_tree_selection_select_path(sel, path);
1042 gtk_tree_path_free(path); 1105 gtk_tree_path_free(path);
1043 return TRUE; 1106 return TRUE;
1044 } 1107 }
1045 #endif 1108 #endif
1046 gtk_tree_path_free(path); 1109 gtk_tree_path_free(path);
1110
1047 return FALSE; 1111 return FALSE;
1112 }
1113
1114 static gboolean
1115 gaim_gtk_blist_popup_menu_cb(GtkWidget *tv, void *user_data)
1116 {
1117 GaimBlistNode *node;
1118 GValue val = { 0, };
1119 GtkTreeIter iter;
1120 GtkTreeSelection *sel;
1121 gboolean handled = FALSE;
1122
1123 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
1124 if (!gtk_tree_selection_get_selected(sel, NULL, &iter))
1125 return FALSE;
1126
1127 gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel),
1128 &iter, NODE_COLUMN, &val);
1129 node = g_value_get_pointer(&val);
1130
1131 /* Shift+F10 draws a context menu */
1132 handled = gaim_gtk_blist_show_context_menu(node, gaim_gtk_treeview_popup_menu_position_func, tv, 0, GDK_CURRENT_TIME);
1133
1134 return handled;
1048 } 1135 }
1049 1136
1050 static void gaim_gtk_blist_show_empty_groups_cb(gpointer data, guint action, GtkWidget *item) 1137 static void gaim_gtk_blist_show_empty_groups_cb(gpointer data, guint action, GtkWidget *item)
1051 { 1138 {
1052 gaim_prefs_set_bool("/gaim/gtk/blist/show_empty_groups", 1139 gaim_prefs_set_bool("/gaim/gtk/blist/show_empty_groups",
1862 { 1949 {
1863 /* Buddies menu */ 1950 /* Buddies menu */
1864 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" }, 1951 { N_("/_Buddies"), NULL, NULL, 0, "<Branch>" },
1865 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM }, 1952 { N_("/Buddies/New Instant _Message..."), "<CTL>M", show_im_dialog, 0, "<StockItem>", GAIM_STOCK_IM },
1866 { N_("/Buddies/Join a _Chat..."), "<CTL>C", join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT }, 1953 { N_("/Buddies/Join a _Chat..."), "<CTL>C", join_chat, 0, "<StockItem>", GAIM_STOCK_CHAT },
1867 { N_("/Buddies/Get _User Info..."), "<CTL>J", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO }, 1954 { N_("/Buddies/Get User _Info..."), "<CTL>I", show_info_dialog, 0, "<StockItem>", GAIM_STOCK_INFO },
1868 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" }, 1955 { "/Buddies/sep1", NULL, NULL, 0, "<Separator>" },
1869 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"}, 1956 { N_("/Buddies/Show _Offline Buddies"), NULL, gaim_gtk_blist_edit_mode_cb, 1, "<CheckItem>"},
1870 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"}, 1957 { N_("/Buddies/Show _Empty Groups"), NULL, gaim_gtk_blist_show_empty_groups_cb, 1, "<CheckItem>"},
1871 { N_("/Buddies/_Add Buddy..."), "<CTL>B", gaim_gtk_blist_add_buddy_cb, 0, "<StockItem>", GTK_STOCK_ADD }, 1958 { N_("/Buddies/_Add Buddy..."), "<CTL>B", gaim_gtk_blist_add_buddy_cb, 0, "<StockItem>", GTK_STOCK_ADD },
1872 { N_("/Buddies/Add C_hat..."), NULL, gaim_gtk_blist_add_chat_cb, 0, "<StockItem>", GTK_STOCK_ADD }, 1959 { N_("/Buddies/Add C_hat..."), NULL, gaim_gtk_blist_add_chat_cb, 0, "<StockItem>", GTK_STOCK_ADD },
2666 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL); 2753 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-activated", G_CALLBACK(gtk_blist_row_activated_cb), NULL);
2667 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL); 2754 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-expanded", G_CALLBACK(gtk_blist_row_expanded_cb), NULL);
2668 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL); 2755 g_signal_connect(G_OBJECT(gtkblist->treeview), "row-collapsed", G_CALLBACK(gtk_blist_row_collapsed_cb), NULL);
2669 g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL); 2756 g_signal_connect(G_OBJECT(gtkblist->treeview), "button-press-event", G_CALLBACK(gtk_blist_button_press_cb), NULL);
2670 g_signal_connect(G_OBJECT(gtkblist->treeview), "key-press-event", G_CALLBACK(gtk_blist_key_press_cb), NULL); 2757 g_signal_connect(G_OBJECT(gtkblist->treeview), "key-press-event", G_CALLBACK(gtk_blist_key_press_cb), NULL);
2758 g_signal_connect(G_OBJECT(gtkblist->treeview), "popup-menu", G_CALLBACK(gaim_gtk_blist_popup_menu_cb), NULL);
2671 2759
2672 /* Enable CTRL+F searching */ 2760 /* Enable CTRL+F searching */
2673 gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN); 2761 gtk_tree_view_set_search_column(GTK_TREE_VIEW(gtkblist->treeview), NAME_COLUMN);
2674 2762
2675 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0); 2763 gtk_box_pack_start(GTK_BOX(gtkblist->vbox), sw, TRUE, TRUE, 0);