pidgin/gtkblist.c

changeset 40948
2c312f084d84
parent 40938
1c25eac61c19
child 40952
53fa03701534
equal deleted inserted replaced
40947:4169f8090a0e 40948:2c312f084d84
52 #include "pidgin/pidginplugininfo.h" 52 #include "pidgin/pidginplugininfo.h"
53 #include "pidginscrollbook.h" 53 #include "pidginscrollbook.h"
54 #include "pidgin/pidginstylecontext.h" 54 #include "pidgin/pidginstylecontext.h"
55 #include "pidgin/pidgintooltip.h" 55 #include "pidgin/pidgintooltip.h"
56 #include "pidgin/pidginwindow.h" 56 #include "pidgin/pidginwindow.h"
57 #include "pidginmenutray.h"
58 #include "pidginstock.h" 57 #include "pidginstock.h"
59 58
60 #include <gdk/gdkkeysyms.h> 59 #include <gdk/gdkkeysyms.h>
61 #include <gtk/gtk.h> 60 #include <gtk/gtk.h>
62 #include <gdk/gdk.h> 61 #include <gdk/gdk.h>
4012 gtk_tree_row_reference_free(gtknode->row); 4011 gtk_tree_row_reference_free(gtknode->row);
4013 gtknode->row = NULL; 4012 gtknode->row = NULL;
4014 } 4013 }
4015 4014
4016 static void 4015 static void
4017 unseen_conv_menu(GdkEvent *event)
4018 {
4019 static GtkWidget *menu = NULL;
4020 GList *convs = NULL;
4021 GList *chats, *ims;
4022
4023 if (menu) {
4024 gtk_widget_destroy(menu);
4025 menu = NULL;
4026 }
4027
4028 ims = pidgin_conversations_get_unseen_ims(PIDGIN_UNSEEN_TEXT, FALSE, 0);
4029
4030 chats = pidgin_conversations_get_unseen_chats(PIDGIN_UNSEEN_NICK, FALSE, 0);
4031
4032 if(ims && chats)
4033 convs = g_list_concat(ims, chats);
4034 else if(ims && !chats)
4035 convs = ims;
4036 else if(!ims && chats)
4037 convs = chats;
4038
4039 if (!convs)
4040 /* no conversations added, don't show the menu */
4041 return;
4042
4043 menu = gtk_menu_new();
4044
4045 pidgin_conversations_fill_menu(menu, convs);
4046 g_list_free(convs);
4047 gtk_widget_show_all(menu);
4048 gtk_menu_popup_at_pointer(GTK_MENU(menu), event);
4049 }
4050
4051 static gboolean
4052 menutray_press_cb(GtkWidget *widget, GdkEventButton *event)
4053 {
4054 GList *convs;
4055
4056 if (event->button == GDK_BUTTON_PRIMARY) {
4057 convs = pidgin_conversations_get_unseen_ims(PIDGIN_UNSEEN_TEXT, FALSE, 1);
4058 if(!convs)
4059 convs = pidgin_conversations_get_unseen_chats(PIDGIN_UNSEEN_NICK, FALSE, 1);
4060
4061 if (convs) {
4062 pidgin_conv_present_conversation((PurpleConversation*)convs->data);
4063 g_list_free(convs);
4064 }
4065
4066 } else if (gdk_event_triggers_context_menu((GdkEvent *)event)) {
4067 unseen_conv_menu((GdkEvent *)event);
4068 }
4069
4070 return TRUE;
4071 }
4072
4073 static void
4074 conversation_updated_cb(PurpleConversation *conv, PurpleConversationUpdateType type, 4016 conversation_updated_cb(PurpleConversation *conv, PurpleConversationUpdateType type,
4075 PidginBuddyList *gtkblist) 4017 PidginBuddyList *gtkblist)
4076 { 4018 {
4077 PurpleAccount *account = purple_conversation_get_account(conv); 4019 PurpleAccount *account = purple_conversation_get_account(conv);
4078 GList *convs = NULL;
4079 GList *ims, *chats;
4080 GList *l = NULL;
4081 4020
4082 if (type != PURPLE_CONVERSATION_UPDATE_UNSEEN) 4021 if (type != PURPLE_CONVERSATION_UPDATE_UNSEEN)
4083 return; 4022 return;
4084 4023
4085 if(account != NULL && purple_conversation_get_name(conv) != NULL) { 4024 if(account != NULL && purple_conversation_get_name(conv) != NULL) {
4086 PurpleBuddy *buddy = purple_blist_find_buddy(account, purple_conversation_get_name(conv)); 4025 PurpleBuddy *buddy = purple_blist_find_buddy(account, purple_conversation_get_name(conv));
4087 if(buddy != NULL) 4026 if(buddy != NULL)
4088 pidgin_blist_update_buddy(NULL, PURPLE_BLIST_NODE(buddy), TRUE); 4027 pidgin_blist_update_buddy(NULL, PURPLE_BLIST_NODE(buddy), TRUE);
4089 }
4090
4091 if (gtkblist->menutrayicon) {
4092 gtk_widget_destroy(gtkblist->menutrayicon);
4093 gtkblist->menutrayicon = NULL;
4094 }
4095
4096 ims = pidgin_conversations_get_unseen_ims(PIDGIN_UNSEEN_TEXT, FALSE, 0);
4097
4098 chats = pidgin_conversations_get_unseen_chats(PIDGIN_UNSEEN_NICK, FALSE, 0);
4099
4100 if(ims && chats)
4101 convs = g_list_concat(ims, chats);
4102 else if(ims && !chats)
4103 convs = ims;
4104 else if(!ims && chats)
4105 convs = chats;
4106
4107 if (convs) {
4108 GtkWidget *img = NULL;
4109 GString *tooltip_text = NULL;
4110
4111 tooltip_text = g_string_new("");
4112 l = convs;
4113 while (l != NULL) {
4114 int count = 0;
4115 PidginConversation *gtkconv = PIDGIN_CONVERSATION((PurpleConversation *)l->data);
4116
4117 if(gtkconv)
4118 count = gtkconv->unseen_count;
4119 else if(g_object_get_data(G_OBJECT(l->data), "unseen-count"))
4120 count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(l->data), "unseen-count"));
4121
4122 g_string_append_printf(tooltip_text,
4123 ngettext("%d unread message from %s\n", "%d unread messages from %s\n", count),
4124 count, purple_conversation_get_title(l->data));
4125 l = l->next;
4126 }
4127 if(tooltip_text->len > 0) {
4128 /* get rid of the last newline */
4129 g_string_truncate(tooltip_text, tooltip_text->len -1);
4130 img = gtk_image_new_from_stock(PIDGIN_STOCK_TOOLBAR_PENDING,
4131 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL));
4132
4133 gtkblist->menutrayicon = gtk_event_box_new();
4134 gtk_container_add(GTK_CONTAINER(gtkblist->menutrayicon), img);
4135 gtk_widget_show(img);
4136 gtk_widget_show(gtkblist->menutrayicon);
4137 g_signal_connect(G_OBJECT(gtkblist->menutrayicon), "button-press-event", G_CALLBACK(menutray_press_cb), NULL);
4138
4139 pidgin_menu_tray_append(PIDGIN_MENU_TRAY(gtkblist->menutray), gtkblist->menutrayicon, tooltip_text->str);
4140 }
4141 g_string_free(tooltip_text, TRUE);
4142 g_list_free(convs);
4143 } 4028 }
4144 } 4029 }
4145 4030
4146 static void 4031 static void
4147 conversation_deleting_cb(PurpleConversation *conv, PidginBuddyList *gtkblist) 4032 conversation_deleting_cb(PurpleConversation *conv, PidginBuddyList *gtkblist)
5158 g_signal_connect(G_OBJECT(gtkblist->window), "visibility_notify_event", G_CALLBACK(gtk_blist_visibility_cb), NULL); 5043 g_signal_connect(G_OBJECT(gtkblist->window), "visibility_notify_event", G_CALLBACK(gtk_blist_visibility_cb), NULL);
5159 g_signal_connect(G_OBJECT(gtkblist->window), "window_state_event", G_CALLBACK(gtk_blist_window_state_cb), NULL); 5044 g_signal_connect(G_OBJECT(gtkblist->window), "window_state_event", G_CALLBACK(gtk_blist_window_state_cb), NULL);
5160 g_signal_connect(G_OBJECT(gtkblist->window), "key_press_event", G_CALLBACK(gtk_blist_window_key_press_cb), gtkblist); 5045 g_signal_connect(G_OBJECT(gtkblist->window), "key_press_event", G_CALLBACK(gtk_blist_window_key_press_cb), gtkblist);
5161 gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK); 5046 gtk_widget_add_events(gtkblist->window, GDK_VISIBILITY_NOTIFY_MASK);
5162 5047
5163 /******************************* Menu bar *************************************/
5164 gtkblist->menutray = pidgin_contact_list_get_menu_tray(PIDGIN_CONTACT_LIST(gtkblist->window));
5165
5166 /****************************** Notebook *************************************/ 5048 /****************************** Notebook *************************************/
5167 gtkblist->notebook = gtk_notebook_new(); 5049 gtkblist->notebook = gtk_notebook_new();
5168 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkblist->notebook), FALSE); 5050 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gtkblist->notebook), FALSE);
5169 gtk_notebook_set_show_border(GTK_NOTEBOOK(gtkblist->notebook), FALSE); 5051 gtk_notebook_set_show_border(GTK_NOTEBOOK(gtkblist->notebook), FALSE);
5170 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), gtkblist->notebook, TRUE, TRUE, 0); 5052 gtk_box_pack_start(GTK_BOX(gtkblist->main_vbox), gtkblist->notebook, TRUE, TRUE, 0);

mercurial