diff --git a/ChangeLog b/ChangeLog index 9282bbe676..fba95de23e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-08-06 Hans Breuer + + * gdk/win32/gdkwindow-win32.c (gdk_window_set_icon) : + now it works as intended ;-) + 2003-08-04 Hans Breuer * gdk/win32/gdkwindow-win32.c(gdk_window_set_modal_hint) : diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 9282bbe676..fba95de23e 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +2003-08-06 Hans Breuer + + * gdk/win32/gdkwindow-win32.c (gdk_window_set_icon) : + now it works as intended ;-) + 2003-08-04 Hans Breuer * gdk/win32/gdkwindow-win32.c(gdk_window_set_modal_hint) : diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 9282bbe676..fba95de23e 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +2003-08-06 Hans Breuer + + * gdk/win32/gdkwindow-win32.c (gdk_window_set_icon) : + now it works as intended ;-) + 2003-08-04 Hans Breuer * gdk/win32/gdkwindow-win32.c(gdk_window_set_modal_hint) : diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 9282bbe676..fba95de23e 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +2003-08-06 Hans Breuer + + * gdk/win32/gdkwindow-win32.c (gdk_window_set_icon) : + now it works as intended ;-) + 2003-08-04 Hans Breuer * gdk/win32/gdkwindow-win32.c(gdk_window_set_modal_hint) : diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 9282bbe676..fba95de23e 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +2003-08-06 Hans Breuer + + * gdk/win32/gdkwindow-win32.c (gdk_window_set_icon) : + now it works as intended ;-) + 2003-08-04 Hans Breuer * gdk/win32/gdkwindow-win32.c(gdk_window_set_modal_hint) : diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 1493216c1c..7ae5605563 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -35,6 +35,9 @@ #include "gdkprivate-win32.h" #include "gdkinput-win32.h" +#include +#include /* sprintf */ + static GdkColormap* gdk_window_impl_win32_get_colormap (GdkDrawable *drawable); static void gdk_window_impl_win32_set_colormap (GdkDrawable *drawable, GdkColormap *cmap); @@ -2185,15 +2188,69 @@ gdk_window_set_icon (GdkWindow *window, impl = GDK_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (window)->impl); - if (pixmap && mask) + if (pixmap) { + static int num = 0; + HBITMAP hbmmask = NULL; + gdk_drawable_get_size (GDK_DRAWABLE(pixmap), &w, &h); + /* we need the inverted mask for the XOR op */ + { + HDC hdc1 = CreateCompatibleDC (NULL); + HBITMAP hbmold1; + + hbmmask = CreateCompatibleBitmap (hdc1, w, h); + hbmold1 = SelectObject (hdc1, hbmmask); + if (mask) + { + HDC hdc2 = CreateCompatibleDC (NULL); + HBITMAP hbmold2 = SelectObject (hdc2, GDK_PIXMAP_HBITMAP (mask)); + GDI_CALL (BitBlt, (hdc1, 0,0,w,h, hdc2, 0,0, NOTSRCCOPY)); + GDI_CALL (SelectObject, (hdc2, hbmold2)); + GDI_CALL (DeleteDC, (hdc2)); + } + else + { + RECT rect; + GetClipBox (hdc1, &rect); + GDI_CALL (FillRect, (hdc1, &rect, GetStockObject (WHITE_BRUSH))); + } + GDI_CALL (SelectObject, (hdc1, hbmold1)); + GDI_CALL (DeleteDC, (hdc1)); + } + ii.fIcon = TRUE; ii.xHotspot = ii.yHotspot = 0; /* ignored for icons */ - ii.hbmMask = GDK_PIXMAP_HBITMAP (mask); + ii.hbmMask = hbmmask; ii.hbmColor = GDK_PIXMAP_HBITMAP (pixmap); hIcon = CreateIconIndirect (&ii); + if (!hIcon) + WIN32_API_FAILED ("CreateIconIndirect"); + GDI_CALL (DeleteObject, (hbmmask)); +#if 0 /* to debug pixmap and mask setting */ + { + GdkPixbuf* pixbuf = NULL; + char name[256]; + + pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0, w, h); + if (pixbuf) + { + num = (num + 1) % 999; /* restrict maximim number */ + sprintf (name, "c:\\temp\\ico%03dpixm.png", num); + gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL); + gdk_pixbuf_unref (pixbuf); + } + pixbuf = !mask ? NULL : gdk_pixbuf_get_from_drawable (NULL, mask, NULL, 0, 0, 0, 0, w, h); + if (pixbuf) + { + sprintf (name, "c:\\temp\\ico%03dmask.png", num); + gdk_pixbuf_save (pixbuf, name, "png", NULL, NULL); + gdk_pixbuf_unref (pixbuf); + } + } +#endif + hIcon = (HICON)SendMessage (GDK_WINDOW_HWND (window), WM_SETICON, ICON_BIG, (LPARAM)hIcon); if (impl->hicon) GDI_CALL (DestroyIcon, (impl->hicon));