comparison pidgin/gtkconv.c @ 18658:1987beefd494

Make the infopane context-menu look more like a buddylist context menu. Screenshot: http://pidgin.im/~sadrul/ss/infopane-menu.png. Any complaints?
author Sadrul Habib Chowdhury <imadil@gmail.com>
date Fri, 27 Jul 2007 16:08:18 +0000
parents 2848d536ac7e
children 30b6f8bc47cf
comparison
equal deleted inserted replaced
18656:2848d536ac7e 18658:1987beefd494
2911 gtk_widget_set_sensitive(win->menu.show_icon, TRUE); 2911 gtk_widget_set_sensitive(win->menu.show_icon, TRUE);
2912 2912
2913 } 2913 }
2914 } 2914 }
2915 2915
2916 static void 2916 /* Returns TRUE if some items were added to the menu, FALSE otherwise */
2917 regenerate_options_items(PidginWindow *win) 2917 static gboolean
2918 { 2918 populate_menu_with_options(GtkWidget *menu, PidginConversation *gtkconv, gboolean all)
2919 GtkWidget *menu; 2919 {
2920 GList *list; 2920 GList *list;
2921 PidginConversation *gtkconv;
2922 PurpleConversation *conv; 2921 PurpleConversation *conv;
2923 PurpleBlistNode *node = NULL; 2922 PurpleBlistNode *node = NULL;
2924 PurpleChat *chat = NULL; 2923 PurpleChat *chat = NULL;
2925 PurpleBuddy *buddy = NULL; 2924 PurpleBuddy *buddy = NULL;
2926 2925 gboolean ret;
2927 gtkconv = pidgin_conv_window_get_active_gtkconv(win); 2926
2928 conv = gtkconv->active_conv; 2927 conv = gtkconv->active_conv;
2929
2930 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More"));
2931 2928
2932 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) { 2929 if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT) {
2933 chat = purple_blist_find_chat(conv->account, conv->name); 2930 chat = purple_blist_find_chat(conv->account, conv->name);
2934 2931
2935 if ((chat == NULL) && (gtkconv->imhtml != NULL)) { 2932 if ((chat == NULL) && (gtkconv->imhtml != NULL)) {
2971 if (chat) 2968 if (chat)
2972 node = (PurpleBlistNode *)chat; 2969 node = (PurpleBlistNode *)chat;
2973 else if (buddy) 2970 else if (buddy)
2974 node = (PurpleBlistNode *)buddy; 2971 node = (PurpleBlistNode *)buddy;
2975 2972
2973 /* Now add the stuff */
2974 if (all && buddy) {
2975 pidgin_blist_make_buddy_menu(menu, buddy, TRUE);
2976 } else if (node) {
2977 if (purple_account_is_connected(conv->account))
2978 pidgin_append_blist_node_proto_menu(menu, conv->account->gc, node);
2979 pidgin_append_blist_node_extended_menu(menu, node);
2980 }
2981
2982 if ((list = gtk_container_get_children(GTK_CONTAINER(menu))) == NULL) {
2983 ret = FALSE;
2984 } else {
2985 g_list_free(list);
2986 ret = TRUE;
2987 }
2988 return ret;
2989 }
2990
2991 static void
2992 regenerate_options_items(PidginWindow *win)
2993 {
2994 GtkWidget *menu;
2995 PidginConversation *gtkconv;
2996 GList *list;
2997
2998 gtkconv = pidgin_conv_window_get_active_gtkconv(win);
2999 menu = gtk_item_factory_get_widget(win->menu.item_factory, N_("/Conversation/More"));
3000
2976 /* Remove the previous entries */ 3001 /* Remove the previous entries */
2977 for (list = gtk_container_get_children(GTK_CONTAINER(menu)); list; ) 3002 for (list = gtk_container_get_children(GTK_CONTAINER(menu)); list; )
2978 { 3003 {
2979 GtkWidget *w = list->data; 3004 GtkWidget *w = list->data;
2980 list = g_list_delete_link(list, list); 3005 list = g_list_delete_link(list, list);
2981 gtk_widget_destroy(w); 3006 gtk_widget_destroy(w);
2982 } 3007 }
2983 3008
2984 /* Now add the stuff */ 3009 if (!populate_menu_with_options(menu, gtkconv, FALSE))
2985 if (node)
2986 {
2987 if (purple_account_is_connected(conv->account))
2988 pidgin_append_blist_node_proto_menu(menu, conv->account->gc, node);
2989 pidgin_append_blist_node_extended_menu(menu, node);
2990 }
2991
2992 if ((list = gtk_container_get_children(GTK_CONTAINER(menu))) == NULL)
2993 { 3010 {
2994 GtkWidget *item = gtk_menu_item_new_with_label(_("No actions available")); 3011 GtkWidget *item = gtk_menu_item_new_with_label(_("No actions available"));
2995 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); 3012 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
2996 gtk_widget_set_sensitive(item, FALSE); 3013 gtk_widget_set_sensitive(item, FALSE);
2997 }
2998 else
2999 {
3000 g_list_free(list);
3001 } 3014 }
3002 3015
3003 gtk_widget_show_all(menu); 3016 gtk_widget_show_all(menu);
3004 } 3017 }
3005 3018
3372 return FALSE; 3385 return FALSE;
3373 3386
3374 3387
3375 gtk_widget_show(win->menu.send_to); 3388 gtk_widget_show(win->menu.send_to);
3376 3389
3377 menu = gtk_menu_item_get_submenu( 3390 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(win->menu.send_to));
3378 GTK_MENU_ITEM(win->menu.send_to));
3379 3391
3380 for (child = gtk_container_get_children(GTK_CONTAINER(menu)); 3392 for (child = gtk_container_get_children(GTK_CONTAINER(menu));
3381 child != NULL; 3393 child != NULL;
3382 child = g_list_delete_link(child, child)) { 3394 child = g_list_delete_link(child, child)) {
3383 3395
7653 if (e->type != GDK_BUTTON_PRESS) 7665 if (e->type != GDK_BUTTON_PRESS)
7654 return FALSE; 7666 return FALSE;
7655 7667
7656 if (e->button == 3) { 7668 if (e->button == 3) {
7657 /* Right click was pressed. Popup the Send To menu. */ 7669 /* Right click was pressed. Popup the Send To menu. */
7658 GtkWidget *menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to)); 7670 GtkWidget *menu = gtk_menu_new(), *sub;
7659 if (menu) 7671 sub = gtk_menu_item_get_submenu(GTK_MENU_ITEM(gtkconv->win->menu.send_to));
7660 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time); 7672
7661 else 7673 if (populate_menu_with_options(menu, gtkconv, TRUE))
7674 pidgin_separator(menu);
7675 else if (!sub ||
7676 !GTK_WIDGET_IS_SENSITIVE(gtkconv->win->menu.send_to)) {
7677 gtk_widget_destroy(menu);
7662 return FALSE; 7678 return FALSE;
7679 } else {
7680 menu = sub;
7681 sub = NULL;
7682 }
7683
7684 if (sub) {
7685 GtkWidget *item = gtk_menu_item_new_with_mnemonic(_("_Send To"));
7686 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
7687 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), sub);
7688 gtk_widget_show(item);
7689 gtk_widget_show_all(sub);
7690 }
7691
7692 gtk_widget_show_all(menu);
7693 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, e->button, e->time);
7663 return TRUE; 7694 return TRUE;
7664 } else if (e->button != 1) { 7695 } else if (e->button != 1) {
7665 return FALSE; 7696 return FALSE;
7666 } 7697 }
7667 7698