Currently shell32 only transfers the plain icon for `Shell_NotifyIcon` calls, ignoring balloon icons. This patch allows transferring both images to explorer.exe tray.
-- v15: shell32: Add support for balloon icon copying. shell32: Introduce a new fill_icon_info helper. shell32: Cleanup some local variable names. shell32: Introduce a new get_bitmap_info helper. shell32: Move icon related fields in notify_data into separate struct.
From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/shell32/systray.c | 37 ++++++++++++++++++++++--------------- programs/explorer/systray.c | 29 ++++++++++++++++++----------- 2 files changed, 40 insertions(+), 26 deletions(-)
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index 78717cfcdca..443bf470b2c 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -34,12 +34,22 @@
WINE_DEFAULT_DEBUG_CHANNEL(systray);
+struct notify_data_icon +{ + /* data for the icon bitmap */ + UINT width; + UINT height; + UINT planes; + UINT bpp; +}; + struct notify_data /* platform-independent format for NOTIFYICONDATA */ { LONG hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; + struct notify_data_icon icon_info; /* systray icon bitmap info */ WCHAR szTip[128]; DWORD dwState; DWORD dwStateMask; @@ -51,13 +61,10 @@ struct notify_data /* platform-independent format for NOTIFYICONDATA */ WCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; - /* data for the icon bitmap */ - UINT width; - UINT height; - UINT planes; - UINT bpp; + BYTE icon_data[]; };
+ /************************************************************************* * Shell_NotifyIcon [SHELL32.296] * Shell_NotifyIconA [SHELL32.297] @@ -164,7 +171,7 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) BITMAP bmColour; LONG cbMaskBits; LONG cbColourBits = 0; - char *buffer; + BYTE *buffer;
if (!GetIconInfo(nid->hIcon, &iconinfo)) goto noicon; @@ -192,21 +199,21 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid)
data = (struct notify_data *)buffer; memset( data, 0, sizeof(*data) ); - buffer += sizeof(*data); + buffer = data->icon_data; GetBitmapBits(iconinfo.hbmMask, cbMaskBits, buffer); if (!iconinfo.hbmColor) { - data->width = bmMask.bmWidth; - data->height = bmMask.bmHeight / 2; - data->planes = 1; - data->bpp = 1; + data->icon_info.width = bmMask.bmWidth; + data->icon_info.height = bmMask.bmHeight / 2; + data->icon_info.planes = 1; + data->icon_info.bpp = 1; } else { - data->width = bmColour.bmWidth; - data->height = bmColour.bmHeight; - data->planes = bmColour.bmPlanes; - data->bpp = bmColour.bmBitsPixel; + data->icon_info.width = bmColour.bmWidth; + data->icon_info.height = bmColour.bmHeight; + data->icon_info.planes = bmColour.bmPlanes; + data->icon_info.bpp = bmColour.bmBitsPixel; buffer += cbMaskBits; GetBitmapBits(iconinfo.hbmColor, cbColourBits, buffer); DeleteObject(iconinfo.hbmColor); diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index b47c2239abd..6337faad633 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -36,12 +36,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(systray); #define TRAY_MINIMIZE_ALL 419 #define TRAY_MINIMIZE_ALL_UNDO 416
+struct notify_data_icon +{ + /* data for the icon bitmap */ + UINT width; + UINT height; + UINT planes; + UINT bpp; +}; + struct notify_data /* platform-independent format for NOTIFYICONDATA */ { LONG hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; + struct notify_data_icon icon_info; /* systray icon bitmap info */ WCHAR szTip[128]; DWORD dwState; DWORD dwStateMask; @@ -53,11 +63,7 @@ struct notify_data /* platform-independent format for NOTIFYICONDATA */ WCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; - /* data for the icon bitmap */ - UINT width; - UINT height; - UINT planes; - UINT bpp; + BYTE icon_data[]; };
#define ICON_DISPLAY_HIDDEN -1 @@ -836,11 +842,13 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds) { struct icon *icon = NULL; const struct notify_data *data; + const BYTE *icon_data; NOTIFYICONDATAW nid; int ret = FALSE;
if (cds->cbData < sizeof(*data)) return FALSE; data = cds->lpData; + icon_data = data->icon_data;
nid.cbSize = sizeof(nid); nid.hWnd = LongToHandle( data->hWnd ); @@ -860,22 +868,21 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds)
/* FIXME: if statement only needed because we don't support interprocess * icon handles */ - if ((nid.uFlags & NIF_ICON) && cds->cbData > sizeof(*data)) + if (nid.uFlags & NIF_ICON) { LONG cbMaskBits; LONG cbColourBits; - const char *buffer = (const char *)(data + 1);
- cbMaskBits = (data->width * data->height + 15) / 16 * 2; - cbColourBits = (data->planes * data->width * data->height * data->bpp + 15) / 16 * 2; + cbMaskBits = (data->icon_info.width * data->icon_info.height + 15) / 16 * 2; + cbColourBits = (data->icon_info.planes * data->icon_info.width * data->icon_info.height * data->icon_info.bpp + 15) / 16 * 2;
if (cds->cbData < sizeof(*data) + cbMaskBits + cbColourBits) { ERR( "buffer underflow\n" ); return FALSE; } - nid.hIcon = CreateIcon(NULL, data->width, data->height, data->planes, data->bpp, - buffer, buffer + cbMaskBits); + nid.hIcon = CreateIcon(NULL, data->icon_info.width, data->icon_info.height, data->icon_info.planes, data->icon_info.bpp, + icon_data, icon_data + cbMaskBits); }
/* try forwarding to the display driver first */
From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/shell32/systray.c | 56 ++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 24 deletions(-)
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index 443bf470b2c..14184ec895f 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -123,6 +123,27 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) return Shell_NotifyIconW(dwMessage, &nidW); }
+ +/************************************************************************* + * get_bitmap_info Helper function for filling BITMAP structs and calculating buffer size in bits + */ +static void get_bitmap_info( ICONINFO *icon_info, BITMAP *mask, BITMAP *color, LONG *mask_bits, LONG *color_bits ) +{ + if ((icon_info->hbmMask && !GetObjectW( icon_info->hbmMask, sizeof(*mask), mask )) || + (icon_info->hbmColor && !GetObjectW( icon_info->hbmColor, sizeof(*color), color ))) + { + if (icon_info->hbmMask) DeleteObject( icon_info->hbmMask ); + if (icon_info->hbmColor) DeleteObject( icon_info->hbmColor ); + memset( icon_info, 0, sizeof(*icon_info) ); + return; + } + + if (icon_info->hbmMask) + *mask_bits = (mask->bmPlanes * mask->bmWidth * mask->bmHeight * mask->bmBitsPixel + 15) / 16 * 2; + if (icon_info->hbmColor) + *color_bits = (color->bmPlanes * color->bmWidth * color->bmHeight * color->bmBitsPixel + 15) / 16 * 2; +} + /************************************************************************* * Shell_NotifyIconW [SHELL32.298] */ @@ -132,6 +153,9 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) COPYDATASTRUCT cds; struct notify_data data_buffer; struct notify_data *data = &data_buffer; + ICONINFO iconinfo = { 0 }; + BITMAP bmMask, bmColour; + LONG cbMaskBits = 0, cbColourBits = 0; BOOL ret;
TRACE("dwMessage = %ld, nid->cbSize=%ld\n", dwMessage, nid->cbSize); @@ -165,34 +189,19 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) /* FIXME: if statement only needed because we don't support interprocess * icon handles */ if (nid->uFlags & NIF_ICON) - { - ICONINFO iconinfo; - BITMAP bmMask; - BITMAP bmColour; - LONG cbMaskBits; - LONG cbColourBits = 0; - BYTE *buffer; - - if (!GetIconInfo(nid->hIcon, &iconinfo)) - goto noicon; + GetIconInfo( nid->hIcon, &iconinfo );
- if (!GetObjectW(iconinfo.hbmMask, sizeof(bmMask), &bmMask) || - (iconinfo.hbmColor && !GetObjectW(iconinfo.hbmColor, sizeof(bmColour), &bmColour))) - { - DeleteObject(iconinfo.hbmMask); - if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor); - goto noicon; - } + get_bitmap_info( &iconinfo, &bmMask, &bmColour, &cbMaskBits, &cbColourBits ); + cds.cbData += cbMaskBits + cbColourBits;
- cbMaskBits = (bmMask.bmPlanes * bmMask.bmWidth * bmMask.bmHeight * bmMask.bmBitsPixel + 15) / 16 * 2; - if (iconinfo.hbmColor) - cbColourBits = (bmColour.bmPlanes * bmColour.bmWidth * bmColour.bmHeight * bmColour.bmBitsPixel + 15) / 16 * 2; - cds.cbData = sizeof(*data) + cbMaskBits + cbColourBits; + if (cds.cbData > sizeof(*data)) + { + BYTE *buffer; buffer = malloc(cds.cbData); if (!buffer) { - DeleteObject(iconinfo.hbmMask); - if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor); + if (iconinfo.hbmMask) DeleteObject( iconinfo.hbmMask ); + if (iconinfo.hbmColor) DeleteObject( iconinfo.hbmColor ); SetLastError(E_OUTOFMEMORY); return FALSE; } @@ -221,7 +230,6 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) DeleteObject(iconinfo.hbmMask); }
-noicon: data->hWnd = HandleToLong( nid->hWnd ); data->uID = nid->uID; data->uFlags = nid->uFlags;
From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/shell32/systray.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index 14184ec895f..7d12ab69194 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -153,9 +153,9 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) COPYDATASTRUCT cds; struct notify_data data_buffer; struct notify_data *data = &data_buffer; - ICONINFO iconinfo = { 0 }; - BITMAP bmMask, bmColour; - LONG cbMaskBits = 0, cbColourBits = 0; + ICONINFO icon_info = { 0 }; + BITMAP mask, color; + LONG mask_size = 0, color_size = 0; BOOL ret;
TRACE("dwMessage = %ld, nid->cbSize=%ld\n", dwMessage, nid->cbSize); @@ -189,10 +189,10 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) /* FIXME: if statement only needed because we don't support interprocess * icon handles */ if (nid->uFlags & NIF_ICON) - GetIconInfo( nid->hIcon, &iconinfo ); + GetIconInfo( nid->hIcon, &icon_info );
- get_bitmap_info( &iconinfo, &bmMask, &bmColour, &cbMaskBits, &cbColourBits ); - cds.cbData += cbMaskBits + cbColourBits; + get_bitmap_info( &icon_info, &mask, &color, &mask_size, &color_size ); + cds.cbData += mask_size + color_size;
if (cds.cbData > sizeof(*data)) { @@ -200,8 +200,8 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) buffer = malloc(cds.cbData); if (!buffer) { - if (iconinfo.hbmMask) DeleteObject( iconinfo.hbmMask ); - if (iconinfo.hbmColor) DeleteObject( iconinfo.hbmColor ); + if (icon_info.hbmMask) DeleteObject( icon_info.hbmMask ); + if (icon_info.hbmColor) DeleteObject( icon_info.hbmColor ); SetLastError(E_OUTOFMEMORY); return FALSE; } @@ -209,25 +209,25 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) data = (struct notify_data *)buffer; memset( data, 0, sizeof(*data) ); buffer = data->icon_data; - GetBitmapBits(iconinfo.hbmMask, cbMaskBits, buffer); - if (!iconinfo.hbmColor) + GetBitmapBits(icon_info.hbmMask, mask_size, buffer); + if (!icon_info.hbmColor) { - data->icon_info.width = bmMask.bmWidth; - data->icon_info.height = bmMask.bmHeight / 2; + data->icon_info.width = mask.bmWidth; + data->icon_info.height = mask.bmHeight / 2; data->icon_info.planes = 1; data->icon_info.bpp = 1; } else { - data->icon_info.width = bmColour.bmWidth; - data->icon_info.height = bmColour.bmHeight; - data->icon_info.planes = bmColour.bmPlanes; - data->icon_info.bpp = bmColour.bmBitsPixel; - buffer += cbMaskBits; - GetBitmapBits(iconinfo.hbmColor, cbColourBits, buffer); - DeleteObject(iconinfo.hbmColor); + data->icon_info.width = color.bmWidth; + data->icon_info.height = color.bmHeight; + data->icon_info.planes = color.bmPlanes; + data->icon_info.bpp = color.bmBitsPixel; + buffer += mask_size; + GetBitmapBits(icon_info.hbmColor, color_size, buffer); + DeleteObject(icon_info.hbmColor); } - DeleteObject(iconinfo.hbmMask); + DeleteObject(icon_info.hbmMask); }
data->hWnd = HandleToLong( nid->hWnd );
From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/shell32/systray.c | 51 +++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 18 deletions(-)
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index 7d12ab69194..9cbecedcfef 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -144,6 +144,34 @@ static void get_bitmap_info( ICONINFO *icon_info, BITMAP *mask, BITMAP *color, L *color_bits = (color->bmPlanes * color->bmWidth * color->bmHeight * color->bmBitsPixel + 15) / 16 * 2; }
+ +/************************************************************************* + * fill_icon_info Helper function for filling struct image metadata and buffer with bitmap data + */ +static void fill_icon_info( const BITMAP *mask, const BITMAP *color, LONG mask_bits, LONG color_bits, + ICONINFO *icon_info, struct notify_data_icon *msg_icon_info, BYTE *image_data_buffer ) +{ + if (icon_info->hbmColor) + { + msg_icon_info->width = color->bmWidth; + msg_icon_info->height = color->bmHeight; + msg_icon_info->planes = color->bmPlanes; + msg_icon_info->bpp = color->bmBitsPixel; + GetBitmapBits( icon_info->hbmColor, color_bits, image_data_buffer + mask_bits ); + DeleteObject( icon_info->hbmColor ); + } + else + { + msg_icon_info->width = mask->bmWidth; + msg_icon_info->height = mask->bmHeight / 2; + msg_icon_info->planes = 1; + msg_icon_info->bpp = 1; + } + + GetBitmapBits( icon_info->hbmMask, mask_bits, image_data_buffer ); + DeleteObject( icon_info->hbmMask ); +} + /************************************************************************* * Shell_NotifyIconW [SHELL32.298] */ @@ -207,27 +235,14 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) }
data = (struct notify_data *)buffer; - memset( data, 0, sizeof(*data) ); buffer = data->icon_data; - GetBitmapBits(icon_info.hbmMask, mask_size, buffer); - if (!icon_info.hbmColor) - { - data->icon_info.width = mask.bmWidth; - data->icon_info.height = mask.bmHeight / 2; - data->icon_info.planes = 1; - data->icon_info.bpp = 1; - } - else + memset( data, 0, sizeof(*data) ); + + if (icon_info.hbmMask) { - data->icon_info.width = color.bmWidth; - data->icon_info.height = color.bmHeight; - data->icon_info.planes = color.bmPlanes; - data->icon_info.bpp = color.bmBitsPixel; - buffer += mask_size; - GetBitmapBits(icon_info.hbmColor, color_size, buffer); - DeleteObject(icon_info.hbmColor); + fill_icon_info( &mask, &color, mask_size, color_size, &icon_info, &data->icon_info, buffer ); + buffer += mask_size + color_size; } - DeleteObject(icon_info.hbmMask); }
data->hWnd = HandleToLong( nid->hWnd );
From: Sergei Chernyadyev serg.cherniadjev@gmail.com
--- dlls/shell32/systray.c | 22 +++++++++++++++++++--- programs/explorer/systray.c | 25 ++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/dlls/shell32/systray.c b/dlls/shell32/systray.c index 9cbecedcfef..c74d0178b10 100644 --- a/dlls/shell32/systray.c +++ b/dlls/shell32/systray.c @@ -61,6 +61,7 @@ struct notify_data /* platform-independent format for NOTIFYICONDATA */ WCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; + struct notify_data_icon balloon_icon_info; /* balloon icon bitmap info */ BYTE icon_data[]; };
@@ -181,9 +182,9 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) COPYDATASTRUCT cds; struct notify_data data_buffer; struct notify_data *data = &data_buffer; - ICONINFO icon_info = { 0 }; - BITMAP mask, color; - LONG mask_size = 0, color_size = 0; + ICONINFO icon_info = { 0 }, balloon_icon_info = { 0 }; + BITMAP mask, color, balloon_mask, balloon_color; + LONG mask_size = 0, color_size = 0, balloon_mask_size = 0, balloon_color_size = 0; BOOL ret;
TRACE("dwMessage = %ld, nid->cbSize=%ld\n", dwMessage, nid->cbSize); @@ -219,9 +220,15 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) if (nid->uFlags & NIF_ICON) GetIconInfo( nid->hIcon, &icon_info );
+ if ((nid->uFlags & NIF_INFO) && (nid->dwInfoFlags & NIIF_ICONMASK) == NIIF_USER) + GetIconInfo( nid->hBalloonIcon, &balloon_icon_info ); + get_bitmap_info( &icon_info, &mask, &color, &mask_size, &color_size ); cds.cbData += mask_size + color_size;
+ get_bitmap_info( &balloon_icon_info, &balloon_mask, &balloon_color, &balloon_mask_size, &balloon_color_size ); + cds.cbData += balloon_mask_size + balloon_color_size; + if (cds.cbData > sizeof(*data)) { BYTE *buffer; @@ -230,6 +237,8 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) { if (icon_info.hbmMask) DeleteObject( icon_info.hbmMask ); if (icon_info.hbmColor) DeleteObject( icon_info.hbmColor ); + if (balloon_icon_info.hbmMask) DeleteObject( balloon_icon_info.hbmMask ); + if (balloon_icon_info.hbmColor) DeleteObject( balloon_icon_info.hbmColor ); SetLastError(E_OUTOFMEMORY); return FALSE; } @@ -243,6 +252,13 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) fill_icon_info( &mask, &color, mask_size, color_size, &icon_info, &data->icon_info, buffer ); buffer += mask_size + color_size; } + + if (balloon_icon_info.hbmMask) + { + fill_icon_info( &balloon_mask, &balloon_color, balloon_mask_size, balloon_color_size, + &balloon_icon_info, &data->balloon_icon_info, buffer ); + buffer += mask_size + color_size; + } }
data->hWnd = HandleToLong( nid->hWnd ); diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 6337faad633..7f4d2002d81 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -63,6 +63,7 @@ struct notify_data /* platform-independent format for NOTIFYICONDATA */ WCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; + struct notify_data_icon balloon_icon_info; /* balloon icon bitmap info */ BYTE icon_data[]; };
@@ -729,7 +730,10 @@ static BOOL modify_icon( struct icon *icon, NOTIFYICONDATAW *nid ) lstrcpynW( icon->info_title, nid->szInfoTitle, ARRAY_SIZE( icon->info_title )); icon->info_flags = nid->dwInfoFlags; icon->info_timeout = max(min(nid->uTimeout, BALLOON_SHOW_MAX_TIMEOUT), BALLOON_SHOW_MIN_TIMEOUT); - icon->info_icon = nid->hBalloonIcon; + + if (icon->info_icon) DestroyIcon( icon->info_icon ); + icon->info_icon = CopyIcon( nid->hBalloonIcon ); + update_balloon( icon ); } if (icon->state & NIS_HIDDEN) hide_icon( icon ); @@ -883,8 +887,26 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds) } nid.hIcon = CreateIcon(NULL, data->icon_info.width, data->icon_info.height, data->icon_info.planes, data->icon_info.bpp, icon_data, icon_data + cbMaskBits); + icon_data += cbMaskBits + cbColourBits; }
+ if ((nid.uFlags & NIF_INFO) && (nid.dwInfoFlags & NIIF_ICONMASK) == NIIF_USER) + { + /* Balloon icon */ + LONG cbMaskBits; + LONG cbColourBits; + + cbMaskBits = (data->balloon_icon_info.width * data->balloon_icon_info.height + 15) / 16 * 2; + cbColourBits = (data->balloon_icon_info.planes * data->balloon_icon_info.width * data->balloon_icon_info.height * data->balloon_icon_info.bpp + 15) / 16 * 2; + + if (cds->cbData < ((char*)icon_data - (char*)data) + cbMaskBits + cbColourBits) + { + ERR( "buffer underflow\n" ); + return FALSE; + } + nid.hBalloonIcon = CreateIcon(NULL, data->balloon_icon_info.width, data->balloon_icon_info.height, data->balloon_icon_info.planes, data->balloon_icon_info.bpp, + icon_data, icon_data + cbMaskBits); + } /* try forwarding to the display driver first */ if (cds->dwData == NIM_ADD || !(icon = get_icon( nid.hWnd, nid.uID ))) { @@ -919,6 +941,7 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds)
done: if (nid.hIcon) DestroyIcon( nid.hIcon ); + if (nid.hBalloonIcon) DestroyIcon( nid.hBalloonIcon ); sync_taskbar_buttons(); return ret; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=148486
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: input.c:4305: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 00000000031500C8, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
I think that if condition isn't correct here, it has to contain `NIF_INFO` in flags as well.
I made these adjustments below:
```diff @@ -124,6 +124,10 @@ BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) return Shell_NotifyIconW(dwMessage, &nidW); }
+ +/************************************************************************* + * get_bitmap_info Helper function for filling BITMAP structs and calculating buffer size in bits + */ static void get_bitmap_info( ICONINFO *icon_info, BITMAP *mask, BITMAP *color, LONG *mask_bits, LONG *color_bits ) { if ((icon_info->hbmMask && !GetObjectW( icon_info->hbmMask, sizeof(*mask), mask )) || @@ -216,7 +220,7 @@ BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) if (nid->uFlags & NIF_ICON) GetIconInfo( nid->hIcon, &icon_info );
- if ((nid->dwInfoFlags & NIIF_ICONMASK) == NIIF_USER) + if ((nid->uFlags & NIF_INFO) && (nid->dwInfoFlags & NIIF_ICONMASK) == NIIF_USER) GetIconInfo( nid->hBalloonIcon, &balloon_icon_info ); ```
changed a same condition in explorer.exe code.
This merge request was approved by Rémi Bernon.