Module: wine Branch: master Commit: 425312074593292c5bfe458380324ff5a7eea13d URL: http://source.winehq.org/git/wine.git/?a=commit;h=425312074593292c5bfe458380...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Apr 19 11:13:34 2010 +0200
winex11: Move creation of an ARGB bitmap for icons to a separate function.
---
dlls/winex11.drv/window.c | 91 +++++++++++++++++++++++++++----------------- 1 files changed, 56 insertions(+), 35 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 559f1d8..f8e7fb2 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -812,6 +812,51 @@ static void destroy_icon_window( Display *display, struct x11drv_win_data *data
/*********************************************************************** + * get_bitmap_argb + * + * Return the bitmap bits in ARGB format. Helper for setting icon hints. + */ +static unsigned long *get_bitmap_argb( HDC hdc, HBITMAP color, HBITMAP mask, unsigned int *size ) +{ + BITMAP bm; + BITMAPINFO *info; + unsigned int *bits = NULL; + int i; + + if (!GetObjectW( color, sizeof(bm), &bm )) return NULL; + if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) return NULL; + info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + info->bmiHeader.biWidth = bm.bmWidth; + info->bmiHeader.biHeight = -bm.bmHeight; + info->bmiHeader.biPlanes = 1; + info->bmiHeader.biBitCount = 32; + info->bmiHeader.biCompression = BI_RGB; + info->bmiHeader.biSizeImage = bm.bmWidth * bm.bmHeight * 4; + info->bmiHeader.biXPelsPerMeter = 0; + info->bmiHeader.biYPelsPerMeter = 0; + info->bmiHeader.biClrUsed = 0; + info->bmiHeader.biClrImportant = 0; + *size = bm.bmWidth * bm.bmHeight + 2; + if (!(bits = HeapAlloc( GetProcessHeap(), 0, *size * sizeof(long) ))) goto failed; + if (!GetDIBits( hdc, color, 0, bm.bmHeight, bits + 2, info, DIB_RGB_COLORS )) goto failed; + + bits[0] = bm.bmWidth; + bits[1] = bm.bmHeight; + + /* convert to array of longs */ + if (bits && sizeof(long) > sizeof(int)) + for (i = *size - 1; i >= 0; i--) ((unsigned long *)bits)[i] = bits[i]; + + return (unsigned long *)bits; + +failed: + HeapFree( GetProcessHeap(), 0, info ); + HeapFree( GetProcessHeap(), 0, bits ); + return NULL; +} + + +/*********************************************************************** * set_icon_hints * * Set the icon wm hints @@ -838,6 +883,8 @@ static void set_icon_hints( Display *display, struct x11drv_win_data *data, HICO BITMAP bm; ICONINFO ii; HDC hDC; + unsigned int size; + unsigned long *bits;
GetIconInfo(hIcon, &ii);
@@ -852,41 +899,15 @@ static void set_icon_hints( Display *display, struct x11drv_win_data *data, HICO InvertRect(hDC, &rcMask); SelectObject(hDC, ii.hbmColor); /* force the color bitmap to x11drv mode too */
- GetObjectW(ii.hbmColor, sizeof(bm), &bm); - if (bm.bmBitsPixel == 32) /* FIXME: do this for other depths too */ - { - BITMAPINFO info; - unsigned int size, *bits; - - info.bmiHeader.biSize = sizeof(info); - info.bmiHeader.biWidth = bm.bmWidth; - info.bmiHeader.biHeight = -bm.bmHeight; - info.bmiHeader.biPlanes = 1; - info.bmiHeader.biBitCount = 32; - info.bmiHeader.biCompression = BI_RGB; - info.bmiHeader.biSizeImage = bm.bmWidth * bm.bmHeight * 4; - info.bmiHeader.biXPelsPerMeter = 0; - info.bmiHeader.biYPelsPerMeter = 0; - info.bmiHeader.biClrUsed = 0; - info.bmiHeader.biClrImportant = 0; - size = bm.bmWidth * bm.bmHeight + 2; - bits = HeapAlloc( GetProcessHeap(), 0, size * sizeof(long) ); - if (bits && GetDIBits( hDC, ii.hbmColor, 0, bm.bmHeight, bits + 2, &info, DIB_RGB_COLORS )) - { - bits[0] = bm.bmWidth; - bits[1] = bm.bmHeight; - if (sizeof(long) > sizeof(int)) /* convert to array of longs */ - { - int i = size; - while (--i >= 0) ((unsigned long *)bits)[i] = bits[i]; - } - wine_tsx11_lock(); - XChangeProperty( display, data->whole_window, x11drv_atom(_NET_WM_ICON), - XA_CARDINAL, 32, PropModeReplace, (unsigned char *)bits, size ); - wine_tsx11_unlock(); - } - HeapFree( GetProcessHeap(), 0, bits ); - } + bits = get_bitmap_argb( hDC, ii.hbmColor, ii.hbmMask, &size ); + wine_tsx11_lock(); + if (bits) + XChangeProperty( display, data->whole_window, x11drv_atom(_NET_WM_ICON), + XA_CARDINAL, 32, PropModeReplace, (unsigned char *)bits, size ); + else + XDeleteProperty( display, data->whole_window, x11drv_atom(_NET_WM_ICON) ); + wine_tsx11_unlock(); + HeapFree( GetProcessHeap(), 0, bits ); SelectObject(hDC, hbmOrig); DeleteDC(hDC);