Don't leak HICONs on Win32. (#364868, Hiroyuki Yamamoto)

2006-12-28  Tor Lillqvist  <tml@novell.com>

	* gtk/gtkstatusicon.c (gtk_status_icon_finalize)
	(gtk_status_icon_update_image): Don't leak HICONs on
	Win32. (#364868, Hiroyuki Yamamoto)
This commit is contained in:
Tor Lillqvist
2006-12-28 16:35:01 +00:00
committed by Tor Lillqvist
parent 6d2ffa0435
commit 44db12e7ca
2 changed files with 24 additions and 0 deletions

View File

@@ -1,3 +1,9 @@
2006-12-28 Tor Lillqvist <tml@novell.com>
* gtk/gtkstatusicon.c (gtk_status_icon_finalize)
(gtk_status_icon_update_image): Don't leak HICONs on
Win32. (#364868, Hiroyuki Yamamoto)
2006-12-27 Matthias Clasen <mclasen@redhat.com>
* modules/printbackends/lpr/gtkprintbackendlpr.c

View File

@@ -484,6 +484,8 @@ gtk_status_icon_finalize (GObject *object)
#ifdef GDK_WINDOWING_WIN32
if (priv->nid.hWnd != NULL && priv->visible)
Shell_NotifyIconW (NIM_DELETE, &priv->nid);
if (priv->nid.hIcon)
DestroyIcon (priv->nid.hIcon);
gtk_widget_destroy (priv->dummy_widget);
#endif
@@ -787,6 +789,9 @@ static void
gtk_status_icon_update_image (GtkStatusIcon *status_icon)
{
GtkStatusIconPrivate *priv = status_icon->priv;
#ifdef GDK_WINDOWING_WIN32
HICON prev_hicon;
#endif
if (priv->blink_off)
{
@@ -795,11 +800,14 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
gtk_status_icon_blank_icon (status_icon));
#endif
#ifdef GDK_WINDOWING_WIN32
prev_hicon = priv->nid.hIcon;
priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (gtk_status_icon_blank_icon (status_icon));
priv->nid.uFlags |= NIF_ICON;
if (priv->nid.hWnd != NULL && priv->visible)
if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid))
g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1);
if (prev_hicon)
DestroyIcon (prev_hicon);
#endif
return;
}
@@ -836,11 +844,14 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), scaled);
#endif
#ifdef GDK_WINDOWING_WIN32
prev_hicon = priv->nid.hIcon;
priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (scaled);
priv->nid.uFlags |= NIF_ICON;
if (priv->nid.hWnd != NULL && priv->visible)
if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid))
g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1);
if (prev_hicon)
DestroyIcon (prev_hicon);
#endif
g_object_unref (scaled);
}
@@ -874,11 +885,15 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
priv->image_data.stock_id,
GTK_ICON_SIZE_SMALL_TOOLBAR,
NULL);
prev_hicon = priv->nid.hIcon;
priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (pixbuf);
priv->nid.uFlags |= NIF_ICON;
if (priv->nid.hWnd != NULL && priv->visible)
if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid))
g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1);
if (prev_hicon)
DestroyIcon (prev_hicon);
g_object_unref (pixbuf);
}
#endif
@@ -901,11 +916,14 @@ gtk_status_icon_update_image (GtkStatusIcon *status_icon)
priv->size,
0, NULL);
prev_hicon = priv->nid.hIcon;
priv->nid.hIcon = gdk_win32_pixbuf_to_hicon_libgtk_only (pixbuf);
priv->nid.uFlags |= NIF_ICON;
if (priv->nid.hWnd != NULL && priv->visible)
if (!Shell_NotifyIconW (NIM_MODIFY, &priv->nid))
g_warning ("%s:%d:Shell_NotifyIcon(NIM_MODIFY) failed", __FILE__, __LINE__-1);
if (prev_hicon)
DestroyIcon (prev_hicon);
g_object_unref (pixbuf);
}
#endif