Mercurial > pidgin
comparison src/gtkconv.c @ 12175:a655bdeb561d
[gaim-migrate @ 14477]
SF Patch #1360582 from Casey Harkins (charkins)
"This patch adds an unseen_count field to gtkconvs which
obviously counts the number of unseen messages. It is
handled entirely within ...set_unseen() in gtkconv.c.
The code for filling the gtkblist menutray context menu
with unseen conversations is moved into gtkconv.c
because it will also be used by the docklet (avoiding
code duplication). I documented it in ChangeLog.API.
The context menu items and the tooltips faceprint added
now will show the message count as well."
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Mon, 21 Nov 2005 00:43:20 +0000 |
parents | ffdd2ccf3a53 |
children | 762bb28154bf |
comparison
equal
deleted
inserted
replaced
12174:c7652a910308 | 12175:a655bdeb561d |
---|---|
2390 l = gaim_get_conversations(); | 2390 l = gaim_get_conversations(); |
2391 } | 2391 } |
2392 | 2392 |
2393 for(; l!=NULL; l=l->next) { | 2393 for(; l!=NULL; l=l->next) { |
2394 GaimConversation *conv = (GaimConversation*)l->data; | 2394 GaimConversation *conv = (GaimConversation*)l->data; |
2395 if(GAIM_IS_GTK_CONVERSATION(conv)) { | 2395 if (GAIM_GTK_CONVERSATION(conv)->unseen_state >= min_state) |
2396 if(GAIM_GTK_CONVERSATION(conv)->unseen_state>=min_state) { | 2396 return conv; |
2397 return conv; | |
2398 } | |
2399 } | |
2400 } | 2397 } |
2401 | 2398 |
2402 return NULL; | 2399 return NULL; |
2400 } | |
2401 | |
2402 static void | |
2403 unseen_conv_menu_cb(GtkMenuItem *item, GaimConversation *conv) | |
2404 { | |
2405 g_return_if_fail(conv != NULL); | |
2406 gaim_gtkconv_present_conversation(conv); | |
2407 } | |
2408 | |
2409 guint | |
2410 gaim_gtk_conversations_fill_unseen_menu(GtkWidget *menu, | |
2411 GaimConversationType type, | |
2412 GaimUnseenState min_state) | |
2413 { | |
2414 GList *l; | |
2415 guint ret = 0; | |
2416 | |
2417 g_return_val_if_fail(menu != NULL, 0); | |
2418 | |
2419 if (type == GAIM_CONV_TYPE_IM) { | |
2420 l = gaim_get_ims(); | |
2421 } else if (type == GAIM_CONV_TYPE_CHAT) { | |
2422 l = gaim_get_chats(); | |
2423 } else { | |
2424 l = gaim_get_conversations(); | |
2425 } | |
2426 | |
2427 for (; l != NULL ; l = l->next) { | |
2428 GaimConversation *conv = (GaimConversation*)l->data; | |
2429 GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION(conv); | |
2430 | |
2431 if (gtkconv->unseen_state >= min_state) { | |
2432 GtkWidget *icon = gtk_image_new(); | |
2433 GdkPixbuf *pbuf = gaim_gtkconv_get_tab_icon(conv, TRUE); | |
2434 GtkWidget *item; | |
2435 gchar *text = g_strdup_printf("%s (%d)", | |
2436 gtk_label_get_text(GTK_LABEL(gtkconv->tab_label)), | |
2437 gtkconv->unseen_count); | |
2438 | |
2439 gtk_image_set_from_pixbuf(GTK_IMAGE(icon), pbuf); | |
2440 g_object_unref(pbuf); | |
2441 | |
2442 item = gtk_image_menu_item_new_with_label(text); | |
2443 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), icon); | |
2444 g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(unseen_conv_menu_cb), conv); | |
2445 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); | |
2446 g_free(text); | |
2447 ret++; | |
2448 } | |
2449 } | |
2450 | |
2451 return ret; | |
2403 } | 2452 } |
2404 | 2453 |
2405 GaimGtkWindow * | 2454 GaimGtkWindow * |
2406 gaim_gtkconv_get_window(GaimGtkConversation *gtkconv) | 2455 gaim_gtkconv_get_window(GaimGtkConversation *gtkconv) |
2407 { | 2456 { |
3905 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); | 3954 gtkconv->convs = g_list_prepend(gtkconv->convs, conv); |
3906 | 3955 |
3907 /* Setup some initial variables. */ | 3956 /* Setup some initial variables. */ |
3908 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | 3957 gtkconv->sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); |
3909 gtkconv->tooltips = gtk_tooltips_new(); | 3958 gtkconv->tooltips = gtk_tooltips_new(); |
3959 gtkconv->unseen_state = GAIM_UNSEEN_NONE; | |
3960 gtkconv->unseen_count = 0; | |
3910 | 3961 |
3911 if (conv_type == GAIM_CONV_TYPE_IM) { | 3962 if (conv_type == GAIM_CONV_TYPE_IM) { |
3912 gtkconv->u.im = g_malloc0(sizeof(GaimGtkImPane)); | 3963 gtkconv->u.im = g_malloc0(sizeof(GaimGtkImPane)); |
3913 | 3964 |
3914 pane = setup_im_pane(gtkconv); | 3965 pane = setup_im_pane(gtkconv); |
5980 for (l = gaim_gtk_conv_window_get_gtkconvs(win); | 6031 for (l = gaim_gtk_conv_window_get_gtkconvs(win); |
5981 l != NULL; l = l->next) | 6032 l != NULL; l = l->next) |
5982 { | 6033 { |
5983 GaimGtkConversation *gtkconv = l->data; | 6034 GaimGtkConversation *gtkconv = l->data; |
5984 if (gaim_conversation_get_type(gtkconv->active_conv) == GAIM_CONV_TYPE_IM && | 6035 if (gaim_conversation_get_type(gtkconv->active_conv) == GAIM_CONV_TYPE_IM && |
5985 gtkconv->unseen_state == GAIM_UNSEEN_TEXT) | 6036 gtkconv->unseen_state >= GAIM_UNSEEN_TEXT) |
5986 { | 6037 { |
5987 build_warn_close_dialog(win); | 6038 build_warn_close_dialog(win); |
5988 gtk_widget_show_all(warn_close_dialog); | 6039 gtk_widget_show_all(warn_close_dialog); |
5989 | 6040 |
5990 return TRUE; | 6041 return TRUE; |
5997 } | 6048 } |
5998 | 6049 |
5999 static void | 6050 static void |
6000 gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state) | 6051 gtkconv_set_unseen(GaimGtkConversation *gtkconv, GaimUnseenState state) |
6001 { | 6052 { |
6002 /* only allow NONE or higher priority unseen state */ | 6053 if (state == GAIM_UNSEEN_NONE) |
6003 if((state==GAIM_UNSEEN_NONE && gtkconv->unseen_state!=GAIM_UNSEEN_NONE) | 6054 { |
6004 || state > gtkconv->unseen_state) { | 6055 gtkconv->unseen_count = 0; |
6005 gtkconv->unseen_state = state; | 6056 gtkconv->unseen_state = GAIM_UNSEEN_NONE; |
6006 gaim_conversation_update(gtkconv->active_conv, GAIM_CONV_UPDATE_UNSEEN); | 6057 } |
6007 } | 6058 else |
6059 { | |
6060 gtkconv->unseen_count++; | |
6061 | |
6062 if (state > gtkconv->unseen_state) | |
6063 gtkconv->unseen_state = state; | |
6064 } | |
6065 | |
6066 /* emit update signal to notify of count and possible unseen state change */ | |
6067 gaim_conversation_update(gtkconv->active_conv, GAIM_CONV_UPDATE_UNSEEN); | |
6008 } | 6068 } |
6009 | 6069 |
6010 /* | 6070 /* |
6011 * When a conversation window is focused, we know the user | 6071 * When a conversation window is focused, we know the user |
6012 * has looked at it so we know there are no longer unseen | 6072 * has looked at it so we know there are no longer unseen |