# HG changeset patch # User Richard Laager # Date 1134417342 0 # Node ID 011efeb86b8db50c7018a6532e8af23004d40139 # Parent 13f351a0096e97e330c5d7da2b9299e5366be940 [gaim-migrate @ 14781] SF Patch #1368906 from charkins "This patch adds a tooltip to the docklet icon. It is based off of faceprint's code for the blist menutray. Wingaim had some status strings it was displaying in the tooltip, this patch removes those." committer: Tailor Script diff -r 13f351a0096e -r 011efeb86b8d plugins/docklet/docklet-win32.c --- a/plugins/docklet/docklet-win32.c Mon Dec 12 19:30:11 2005 +0000 +++ b/plugins/docklet/docklet-win32.c Mon Dec 12 19:55:42 2005 +0000 @@ -41,9 +41,6 @@ /* * DEFINES, MACROS & DATA TYPES */ -#define GAIM_SYSTRAY_HINT _("Gaim") -#define GAIM_SYSTRAY_DISCONN_HINT _("Gaim - Signed off") -#define GAIM_SYSTRAY_AWAY_HINT _("Gaim - Away") #define WM_TRAYMESSAGE WM_USER /* User defined WM Message */ /* @@ -133,8 +130,6 @@ } static void systray_init_icon(HWND hWnd, HICON icon) { - char* locenc=NULL; - ZeroMemory(&wgaim_nid,sizeof(wgaim_nid)); wgaim_nid.cbSize=sizeof(NOTIFYICONDATA); wgaim_nid.hWnd=hWnd; @@ -142,21 +137,13 @@ wgaim_nid.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP; wgaim_nid.uCallbackMessage=WM_TRAYMESSAGE; wgaim_nid.hIcon=icon; - locenc=g_locale_from_utf8(GAIM_SYSTRAY_DISCONN_HINT, -1, NULL, NULL, NULL); - strcpy(wgaim_nid.szTip, locenc); - g_free(locenc); + lstrcpy(wgaim_nid.szTip, ""); Shell_NotifyIcon(NIM_ADD,&wgaim_nid); docklet_embedded(); } -static void systray_change_icon(HICON icon, char* text) { - char *locenc=NULL; +static void systray_change_icon(HICON icon) { wgaim_nid.hIcon = icon; - if (text) { - locenc = g_locale_from_utf8(text, -1, NULL, NULL, NULL); - lstrcpy(wgaim_nid.szTip, locenc); - g_free(locenc); - } Shell_NotifyIcon(NIM_MODIFY,&wgaim_nid); } @@ -167,27 +154,39 @@ static void wgaim_tray_update_icon(DockletStatus icon) { switch (icon) { case DOCKLET_STATUS_OFFLINE: - systray_change_icon(sysicon_disconn, GAIM_SYSTRAY_DISCONN_HINT); + systray_change_icon(sysicon_disconn); break; case DOCKLET_STATUS_CONNECTING: break; case DOCKLET_STATUS_ONLINE: - systray_change_icon(sysicon_conn, GAIM_SYSTRAY_HINT); + systray_change_icon(sysicon_conn); break; case DOCKLET_STATUS_ONLINE_PENDING: - systray_change_icon(sysicon_pend, GAIM_SYSTRAY_HINT); + systray_change_icon(sysicon_pend); break; case DOCKLET_STATUS_AWAY: - systray_change_icon(sysicon_away, GAIM_SYSTRAY_AWAY_HINT); + systray_change_icon(sysicon_away); break; case DOCKLET_STATUS_AWAY_PENDING: - systray_change_icon(sysicon_awypend, GAIM_SYSTRAY_AWAY_HINT); + systray_change_icon(sysicon_awypend); break; } } static void wgaim_tray_blank_icon() { - systray_change_icon(sysicon_blank, NULL); + systray_change_icon(sysicon_blank); +} + +static void wgaim_tray_set_tooltip(gchar *tooltip) { + if (tooltip) { + char *locenc = NULL; + locenc = g_locale_from_utf8(tooltip, -1, NULL, NULL, NULL); + lstrcpyn(wgaim_nid.szTip, locenc, sizeof(wgaim_nid.szTip)/sizeof(TCHAR)); + g_free(locenc); + } else { + lstrcpy(wgaim_nid.szTip, ""); + } + Shell_NotifyIcon(NIM_MODIFY, &wgaim_nid); } void wgaim_tray_minimize(GaimGtkBuddyList *gtkblist) { @@ -251,6 +250,7 @@ wgaim_tray_destroy, wgaim_tray_update_icon, wgaim_tray_blank_icon, + wgaim_tray_set_tooltip, NULL }; diff -r 13f351a0096e -r 011efeb86b8d plugins/docklet/docklet-x11.c --- a/plugins/docklet/docklet-x11.c Mon Dec 12 19:30:11 2005 +0000 +++ b/plugins/docklet/docklet-x11.c Mon Dec 12 19:55:42 2005 +0000 @@ -38,6 +38,7 @@ /* globals */ static EggTrayIcon *docklet = NULL; static GtkWidget *image = NULL; +static GtkTooltips *tooltips = NULL; static GdkPixbuf *blank_icon = NULL; static int embed_timeout = 0; @@ -157,6 +158,22 @@ gtk_image_set_from_pixbuf(GTK_IMAGE(image), blank_icon); } +static void +docklet_x11_set_tooltip(gchar *tooltip) +{ + if (!tooltips) + tooltips = gtk_tooltips_new(); + + /* image->parent is a GtkEventBox */ + if (tooltip) { + gtk_tooltips_enable(tooltips); + gtk_tooltips_set_tip(tooltips, image->parent, tooltip, NULL); + } else { + gtk_tooltips_set_tip(tooltips, image->parent, "", NULL); + gtk_tooltips_disable(tooltips); + } +} + #if GTK_CHECK_VERSION(2,2,0) static void docklet_x11_position_menu(GtkMenu *menu, int *x, int *y, gboolean *push_in, @@ -238,7 +255,7 @@ gtk_container_add(GTK_CONTAINER(box), image); gtk_container_add(GTK_CONTAINER(docklet), box); - if(!gtk_check_version(2,4,0)) + if (!gtk_check_version(2,4,0)) g_object_set(G_OBJECT(box), "visible-window", FALSE, NULL); gtk_widget_show_all(GTK_WIDGET(docklet)); @@ -257,6 +274,7 @@ docklet_x11_destroy, docklet_x11_update_icon, docklet_x11_blank_icon, + docklet_x11_set_tooltip, #if GTK_CHECK_VERSION(2,2,0) docklet_x11_position_menu #else diff -r 13f351a0096e -r 011efeb86b8d plugins/docklet/docklet.c --- a/plugins/docklet/docklet.c Mon Dec 12 19:30:11 2005 +0000 +++ b/plugins/docklet/docklet.c Mon Dec 12 19:55:42 2005 +0000 @@ -91,15 +91,41 @@ docklet_update_status() { GList *l; + GList *convs; DockletStatus newstatus = DOCKLET_STATUS_OFFLINE; gboolean pending = FALSE; /* determine if any ims have unseen messages */ - l = gaim_gtk_conversations_find_unseen_list(GAIM_CONV_TYPE_IM, + convs = gaim_gtk_conversations_find_unseen_list(GAIM_CONV_TYPE_IM, GAIM_UNSEEN_TEXT, FALSE, 1); - if (l != NULL) { + if (convs != NULL) { pending = TRUE; - g_list_free(l); + + /* set tooltip if messages are pending */ + if (ui_ops->set_tooltip) { + GString *tooltip_text = g_string_new(""); + for (l = convs ; l != NULL ; l = l->next) { + if (GAIM_IS_GTK_CONVERSATION(l->data)) { + GaimGtkConversation *gtkconv = GAIM_GTK_CONVERSATION((GaimConversation *)l->data); + g_string_append_printf(tooltip_text, + ngettext("%d unread message from %s\n", "%d unread messages from %s\n", gtkconv->unseen_count), + gtkconv->unseen_count, + gtk_label_get_text(GTK_LABEL(gtkconv->tab_label))); + } + } + + /* get rid of the last newline */ + if (tooltip_text->len > 0) + tooltip_text = g_string_truncate(tooltip_text, tooltip_text->len - 1); + + ui_ops->set_tooltip(tooltip_text->str); + + g_string_free(tooltip_text, TRUE); + } else { + ui_ops->set_tooltip(NULL); + } + + g_list_free(convs); } /* iterate through all accounts and determine which diff -r 13f351a0096e -r 011efeb86b8d plugins/docklet/docklet.h --- a/plugins/docklet/docklet.h Mon Dec 12 19:30:11 2005 +0000 +++ b/plugins/docklet/docklet.h Mon Dec 12 19:55:42 2005 +0000 @@ -41,6 +41,7 @@ void (*destroy)(void); void (*update_icon)(DockletStatus); void (*blank_icon)(void); + void (*set_tooltip)(gchar *); GtkMenuPositionFunc position_menu; };