| 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); |