Mercurial > pidgin.yaz
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 |