[COMCTL32_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536
authorAmine Khaldi <amine.khaldi@reactos.org>
Tue, 24 Nov 2015 10:38:33 +0000 (10:38 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Tue, 24 Nov 2015 10:38:33 +0000 (10:38 +0000)
svn path=/trunk/; revision=70081

rostests/winetests/comctl32/imagelist.c
rostests/winetests/comctl32/listview.c
rostests/winetests/comctl32/misc.c
rostests/winetests/comctl32/propsheet.c
rostests/winetests/comctl32/status.c
rostests/winetests/comctl32/toolbar.c
rostests/winetests/comctl32/treeview.c
rostests/winetests/comctl32/v6util.h

index 2e81501..c034276 100644 (file)
@@ -1258,7 +1258,7 @@ static void test_imagelist_storage(void)
 
 static void test_shell_imagelist(void)
 {
 
 static void test_shell_imagelist(void)
 {
-    BOOL (WINAPI *pSHGetImageList)(INT, REFIID, void**);
+    HRESULT (WINAPI *pSHGetImageList)(INT, REFIID, void**);
     IImageList *iml = NULL;
     HMODULE hShell32;
     HRESULT hr;
     IImageList *iml = NULL;
     HMODULE hShell32;
     HRESULT hr;
@@ -1278,8 +1278,7 @@ static void test_shell_imagelist(void)
     }
 
     /* Get system image list */
     }
 
     /* Get system image list */
-    hr = (pSHGetImageList)(SHIL_SYSSMALL, &IID_IImageList, (void**)&iml);
-
+    hr = pSHGetImageList(SHIL_SYSSMALL, &IID_IImageList, (void**)&iml);
     ok(SUCCEEDED(hr), "SHGetImageList failed, hr=%x\n", hr);
 
     if (hr != S_OK) {
     ok(SUCCEEDED(hr), "SHGetImageList failed, hr=%x\n", hr);
 
     if (hr != S_OK) {
index 9387fcb..66468bd 100644 (file)
@@ -5345,6 +5345,7 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCHANGINGW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCHANGINGW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_ITEMCHANGINGA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", TRUE);
     parent_header_notify_seq[0].id = HDN_ITEMCHANGINGA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", TRUE);
@@ -5353,6 +5354,7 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCHANGEDW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCHANGEDW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_ITEMCHANGEDA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", TRUE);
     parent_header_notify_seq[0].id = HDN_ITEMCHANGEDA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", TRUE);
@@ -5363,30 +5365,35 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_click_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_ITEMCLICKA, "Expected ANSI notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMDBLCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_click_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_ITEMCLICKA, "Expected ANSI notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMDBLCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_ITEMDBLCLICKW, "Expected Unicode notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_DIVIDERDBLCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_ITEMDBLCLICKW, "Expected Unicode notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_DIVIDERDBLCLICKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_divider_dclick_seq,
                 "header notify, parent", TRUE);
     ok(nmhdr.hdr.code == HDN_DIVIDERDBLCLICKA, "Expected ANSI notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINTRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_divider_dclick_seq,
                 "header notify, parent", TRUE);
     ok(nmhdr.hdr.code == HDN_DIVIDERDBLCLICKA, "Expected ANSI notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINTRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_BEGINTRACKW, "Expected Unicode notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDTRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     ok(nmhdr.hdr.code == HDN_BEGINTRACKW, "Expected Unicode notification code\n");
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDTRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_ENDTRACKA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
     parent_header_notify_seq[0].id = HDN_ENDTRACKA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
@@ -5394,6 +5401,7 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_TRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_TRACKW;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_TRACKA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
     parent_header_notify_seq[0].id = HDN_TRACKA;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
@@ -5401,17 +5409,20 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINDRAG;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINDRAG;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 1, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDDRAG;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDDRAG;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_ENDDRAG;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_FILTERCHANGE;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     parent_header_notify_seq[0].id = HDN_ENDDRAG;
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_FILTERCHANGE;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     parent_header_notify_seq[0].id = HDN_FILTERCHANGE;
     parent_header_notify_seq[0].flags |= optional; /* NT4 does not send this message */
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
     parent_header_notify_seq[0].id = HDN_FILTERCHANGE;
     parent_header_notify_seq[0].flags |= optional; /* NT4 does not send this message */
     ok_sequence(sequences, PARENT_SEQ_INDEX, parent_header_notify_seq,
@@ -5420,21 +5431,25 @@ static void test_header_notification2(void)
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINFILTEREDIT;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_BEGINFILTEREDIT;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDFILTEREDIT;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ENDFILTEREDIT;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMSTATEICONCLICK;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMSTATEICONCLICK;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMKEYDOWN;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
     flush_sequences(sequences, NUM_MSG_SEQUENCES);
     nmhdr.hdr.code = HDN_ITEMKEYDOWN;
     ret = SendMessageW(list, WM_NOTIFY, 0, (LPARAM)&nmhdr);
+    ok(ret == 0, "got %d\n", ret);
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
 
     ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
                 "header notify, parent", FALSE);
 
@@ -5748,6 +5763,76 @@ static void test_header_proc(void)
     DestroyWindow(hwnd);
 }
 
     DestroyWindow(hwnd);
 }
 
+static void flush_events(void)
+{
+    MSG msg;
+    int diff = 200;
+    int min_timeout = 100;
+    DWORD time = GetTickCount() + diff;
+
+    while (diff > 0)
+    {
+        if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break;
+        while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
+        diff = time - GetTickCount();
+    }
+}
+
+static void test_oneclickactivate(void)
+{
+    TRACKMOUSEEVENT track;
+    char item1[] = "item1";
+    LVITEMA item;
+    HWND hwnd, fg;
+    RECT rect;
+    INT r;
+
+    hwnd = CreateWindowExA(0, "SysListView32", "foo", WS_VISIBLE|WS_CHILD|LVS_LIST,
+            10, 10, 100, 200, hwndparent, NULL, NULL, NULL);
+    ok(hwnd != NULL, "failed to create listview window\n");
+    r = SendMessageA(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_ONECLICKACTIVATE);
+    ok(r == 0, "should return zero\n");
+
+    SetForegroundWindow(hwndparent);
+    flush_events();
+    fg = GetForegroundWindow();
+    if (fg != hwndparent)
+    {
+        skip("Window is not in the foreground. Skipping oneclickactivate tests.\n");
+        DestroyWindow(hwnd);
+        return;
+    }
+
+    item.mask = LVIF_TEXT;
+    item.iItem = 0;
+    item.iSubItem = 0;
+    item.iImage = 0;
+    item.pszText = item1;
+    r = SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item);
+    ok(r == 0, "should not fail\n");
+
+    GetWindowRect(hwnd, &rect);
+    SetCursorPos(rect.left+5, rect.top+5);
+    flush_events();
+    r = SendMessageA(hwnd, WM_MOUSEMOVE, MAKELONG(1, 1), 0);
+    expect(0, r);
+
+    track.cbSize = sizeof(track);
+    track.dwFlags = TME_QUERY;
+    _TrackMouseEvent(&track);
+    ok(track.hwndTrack == hwnd, "hwndTrack != hwnd\n");
+    ok(track.dwFlags == TME_LEAVE, "dwFlags = %x\n", track.dwFlags);
+
+    r = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
+    expect(0, r);
+    r = SendMessageA(hwnd, WM_MOUSEHOVER, MAKELONG(1, 1), 0);
+    expect(0, r);
+    r = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0);
+    expect(1, r);
+
+    DestroyWindow(hwnd);
+}
+
 START_TEST(listview)
 {
     HMODULE hComctl32;
 START_TEST(listview)
 {
     HMODULE hComctl32;
@@ -5817,6 +5902,7 @@ START_TEST(listview)
     test_deleteitem();
     test_insertitem();
     test_header_proc();
     test_deleteitem();
     test_insertitem();
     test_header_proc();
+    test_oneclickactivate();
 
     if (!load_v6_module(&ctx_cookie, &hCtx))
     {
 
     if (!load_v6_module(&ctx_cookie, &hCtx))
     {
index dac8e95..95ba188 100644 (file)
@@ -37,10 +37,20 @@ static BOOL (WINAPI * pStr_SetPtrA)(LPSTR, LPCSTR);
 static INT (WINAPI * pStr_GetPtrW)(LPCWSTR, LPWSTR, INT);
 static BOOL (WINAPI * pStr_SetPtrW)(LPWSTR, LPCWSTR);
 
 static INT (WINAPI * pStr_GetPtrW)(LPCWSTR, LPWSTR, INT);
 static BOOL (WINAPI * pStr_SetPtrW)(LPWSTR, LPCWSTR);
 
-static HRESULT (WINAPI * LoadIconMetric)(HINSTANCE, PCWSTR, INT, HICON*);
-
 static HMODULE hComctl32 = 0;
 
 static HMODULE hComctl32 = 0;
 
+static char testicon_data[] =
+{
+    0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x02, 0x00, 0x00, 0x01, 0x00,
+    0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00,
+    0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00,
+    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x0b,
+    0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xde, 0xde, 0xde, 0xff, 0xde, 0xde, 0xde, 0xff, 0xde, 0xde,
+    0xde, 0xff, 0xde, 0xde, 0xde, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00
+};
+
 #define COMCTL32_GET_PROC(ordinal, func) \
     p ## func = (void*)GetProcAddress(hComctl32, (LPSTR)ordinal); \
     if(!p ## func) { \
 #define COMCTL32_GET_PROC(ordinal, func) \
     p ## func = (void*)GetProcAddress(hComctl32, (LPSTR)ordinal); \
     if(!p ## func) { \
@@ -215,91 +225,149 @@ static void test_TaskDialogIndirect(void)
     ok(ptr == ptr2, "got wrong pointer for ordinal 345, %p expected %p\n", ptr2, ptr);
 }
 
     ok(ptr == ptr2, "got wrong pointer for ordinal 345, %p expected %p\n", ptr2, ptr);
 }
 
-static void test_LoadIconMetric(void)
+static void test_LoadIconWithScaleDown(void)
 {
 {
-    static const WCHAR nonExistingFile[] = {'d','o','e','s','n','o','t','e','x','i','s','t','.','i','c','o','\0'};
-    HINSTANCE hinst;
-    void *ptr;
-    HICON icon;
-    HRESULT result;
+    static const WCHAR nonexisting_fileW[] = {'n','o','n','e','x','i','s','t','i','n','g','.','i','c','o',0};
+    static const WCHAR nonexisting_resourceW[] = {'N','o','n','e','x','i','s','t','i','n','g',0};
+    static const WCHAR prefixW[] = {'I','C','O',0};
+    HRESULT (WINAPI *pLoadIconMetric)(HINSTANCE, const WCHAR *, int, HICON *);
+    HRESULT (WINAPI *pLoadIconWithScaleDown)(HINSTANCE, const WCHAR *, int, int, HICON *);
+    WCHAR tmp_path[MAX_PATH], icon_path[MAX_PATH];
     ICONINFO info;
     ICONINFO info;
-    BOOL res;
-    INT bytes;
+    HMODULE hinst;
+    HANDLE handle;
+    DWORD written;
+    HRESULT hr;
     BITMAP bmp;
     BITMAP bmp;
+    HICON icon;
+    void *ptr;
+    int bytes;
+    BOOL res;
 
     hinst = LoadLibraryA("comctl32.dll");
 
     hinst = LoadLibraryA("comctl32.dll");
-
-    LoadIconMetric = (void *)GetProcAddress(hinst, "LoadIconMetric");
-    if (!LoadIconMetric)
+    pLoadIconMetric        = (void *)GetProcAddress(hinst, "LoadIconMetric");
+    pLoadIconWithScaleDown = (void *)GetProcAddress(hinst, "LoadIconWithScaleDown");
+    if (!pLoadIconMetric || !pLoadIconWithScaleDown)
     {
 #ifdef __REACTOS__
     {
 #ifdef __REACTOS__
-        /* Skipped on 2k3 */
-        skip("TaskDialogIndirect not exported by name\n");
+        skip("LoadIconMetric or pLoadIconWithScaleDown not exported by name\n");
 #else
 #else
-        win_skip("LoadIconMetric not exported by name\n");
+        win_skip("LoadIconMetric or pLoadIconWithScaleDown not exported by name\n");
 #endif
 #endif
+        FreeLibrary(hinst);
         return;
     }
 
         return;
     }
 
-    ptr = GetProcAddress(hinst, (const CHAR*)380);
-    ok(ptr == LoadIconMetric, "got wrong pointer for ordinal 380, %p expected %p\n",
-       ptr, LoadIconMetric);
-
-    result = LoadIconMetric(NULL, (PCWSTR)IDI_APPLICATION, LIM_SMALL, &icon);
-    ok(result == S_OK, "Expected S_OK, got %x\n", result);
-    if (result == S_OK)
-    {
-        res = GetIconInfo(icon, &info);
-        ok(res, "Failed to get icon info\n");
-        if (res && info.hbmColor)
-        {
-            bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
-            ok(bytes > 0, "Failed to get bitmap info for icon\n");
-            if (bytes > 0)
-            {
-                ok(bmp.bmWidth  == GetSystemMetrics( SM_CXSMICON ), "Wrong icon width\n");
-                ok(bmp.bmHeight == GetSystemMetrics( SM_CYSMICON ), "Wrong icon height\n");
-            }
-        }
-        DestroyIcon(icon);
-    }
-
-    result = LoadIconMetric(NULL, (PCWSTR)IDI_APPLICATION, LIM_LARGE, &icon);
-    ok(result == S_OK, "Expected S_OK, got %x\n", result);
-    if (result == S_OK)
-    {
-        res = GetIconInfo(icon, &info);
-        ok(res, "Failed to get icon info\n");
-        if (res && info.hbmColor)
-        {
-            bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
-            ok(bytes > 0, "Failed to get bitmap info for icon\n");
-            if (bytes > 0)
-            {
-                ok(bmp.bmWidth  == GetSystemMetrics( SM_CXICON ), "Wrong icon width\n");
-                ok(bmp.bmHeight == GetSystemMetrics( SM_CYICON ), "Wrong icon height\n");
-            }
-        }
-        DestroyIcon(icon);
-    }
+    GetTempPathW(MAX_PATH, tmp_path);
+    GetTempFileNameW(tmp_path, prefixW, 0, icon_path);
+    handle = CreateFileW(icon_path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
+                         FILE_ATTRIBUTE_NORMAL, NULL);
+    ok(handle != INVALID_HANDLE_VALUE, "CreateFileW failed with error %u\n", GetLastError());
+    res = WriteFile(handle, testicon_data, sizeof(testicon_data), &written, NULL);
+    ok(res && written == sizeof(testicon_data), "Failed to write icon file\n");
+    CloseHandle(handle);
+
+    /* test ordinals */
+    ptr = GetProcAddress(hinst, (const char *)380);
+    ok(ptr == pLoadIconMetric,
+       "got wrong pointer for ordinal 380, %p expected %p\n", ptr, pLoadIconMetric);
+
+    ptr = GetProcAddress(hinst, (const char *)381);
+    ok(ptr == pLoadIconWithScaleDown,
+       "got wrong pointer for ordinal 381, %p expected %p\n", ptr, pLoadIconWithScaleDown);
+
+    /* invalid arguments */
+    icon = (HICON)0x1234;
+    hr = pLoadIconMetric(NULL, (LPWSTR)IDI_APPLICATION, 0x100, &icon);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %x\n", hr);
+    ok(icon == NULL, "Expected NULL, got %p\n", icon);
 
 
-    result = LoadIconMetric(NULL, (PCWSTR)IDI_APPLICATION, 0x100, &icon);
-    ok(result == E_INVALIDARG, "Expected E_INVALIDARG, got %x\n", result);
-    if (result == S_OK) DestroyIcon(icon);
+    icon = (HICON)0x1234;
+    hr = pLoadIconMetric(NULL, NULL, LIM_LARGE, &icon);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %x\n", hr);
+    ok(icon == NULL, "Expected NULL, got %p\n", icon);
 
     icon = (HICON)0x1234;
 
     icon = (HICON)0x1234;
-    result = LoadIconMetric(NULL, NULL, LIM_LARGE, &icon);
-    ok(result == E_INVALIDARG, "Expected E_INVALIDARG, got %x\n", result);
-    ok(icon == (HICON)0, "Expected 0x0, got %p\n", icon);
-    if (result == S_OK) DestroyIcon(icon);
-
-    result = LoadIconMetric(NULL, nonExistingFile, LIM_LARGE, &icon);
-    ok(result == HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND),
-       "Expected 80070715, got %x\n", result);
-    if (result == S_OK) DestroyIcon(icon);
+    hr = pLoadIconWithScaleDown(NULL, NULL, 32, 32, &icon);
+    ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %x\n", hr);
+    ok(icon == NULL, "Expected NULL, got %p\n", icon);
+
+    /* non-existing filename */
+    hr = pLoadIconMetric(NULL, nonexisting_fileW, LIM_LARGE, &icon);
+    todo_wine
+    ok(hr == HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND),
+       "Expected HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND), got %x\n", hr);
+
+    hr = pLoadIconWithScaleDown(NULL, nonexisting_fileW, 32, 32, &icon);
+    todo_wine
+    ok(hr == HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND),
+       "Expected HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND), got %x\n", hr);
+
+    /* non-existing resource name */
+    hr = pLoadIconMetric(hinst, nonexisting_resourceW, LIM_LARGE, &icon);
+    ok(hr == HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND),
+       "Expected HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND), got %x\n", hr);
+
+    hr = pLoadIconWithScaleDown(hinst, nonexisting_resourceW, 32, 32, &icon);
+    ok(hr == HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND),
+       "Expected HRESULT_FROM_WIN32(ERROR_RESOURCE_TYPE_NOT_FOUND), got %x\n", hr);
+
+    /* load icon using predefined identifier */
+    hr = pLoadIconMetric(NULL, (LPWSTR)IDI_APPLICATION, LIM_SMALL, &icon);
+    ok(hr == S_OK, "Expected S_OK, got %x\n", hr);
+    res = GetIconInfo(icon, &info);
+    ok(res, "Failed to get icon info, error %u\n", GetLastError());
+    bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
+    ok(bytes > 0, "Failed to get bitmap info for icon\n");
+    ok(bmp.bmWidth  == GetSystemMetrics(SM_CXSMICON), "Wrong icon width %d\n", bmp.bmWidth);
+    ok(bmp.bmHeight == GetSystemMetrics(SM_CYSMICON), "Wrong icon height %d\n", bmp.bmHeight);
+    DestroyIcon(icon);
+
+    hr = pLoadIconMetric(NULL, (LPWSTR)IDI_APPLICATION, LIM_LARGE, &icon);
+    ok(hr == S_OK, "Expected S_OK, got %x\n", hr);
+    res = GetIconInfo(icon, &info);
+    ok(res, "Failed to get icon info, error %u\n", GetLastError());
+    bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
+    ok(bytes > 0, "Failed to get bitmap info for icon\n");
+    ok(bmp.bmWidth  == GetSystemMetrics(SM_CXICON), "Wrong icon width %d\n", bmp.bmWidth);
+    ok(bmp.bmHeight == GetSystemMetrics(SM_CYICON), "Wrong icon height %d\n", bmp.bmHeight);
+    DestroyIcon(icon);
+
+    hr = pLoadIconWithScaleDown(NULL, (LPWSTR)IDI_APPLICATION, 42, 42, &icon);
+    ok(hr == S_OK, "Expected S_OK, got %x\n", hr);
+    res = GetIconInfo(icon, &info);
+    ok(res, "Failed to get icon info, error %u\n", GetLastError());
+    bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
+    ok(bytes > 0, "Failed to get bitmap info for icon\n");
+    ok(bmp.bmWidth  == 42, "Wrong icon width %d\n", bmp.bmWidth);
+    ok(bmp.bmHeight == 42, "Wrong icon height %d\n", bmp.bmHeight);
+    DestroyIcon(icon);
+
+    /* load icon from file */
+    hr = pLoadIconMetric(NULL, icon_path, LIM_SMALL, &icon);
+    ok(hr == S_OK, "Expected S_OK, got %x\n", hr);
+    res = GetIconInfo(icon, &info);
+    ok(res, "Failed to get icon info, error %u\n", GetLastError());
+    bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
+    ok(bytes > 0, "Failed to get bitmap info for icon\n");
+    ok(bmp.bmWidth  == GetSystemMetrics(SM_CXSMICON), "Wrong icon width %d\n", bmp.bmWidth);
+    ok(bmp.bmHeight == GetSystemMetrics(SM_CYSMICON), "Wrong icon height %d\n", bmp.bmHeight);
+    DestroyIcon(icon);
+
+    hr = pLoadIconWithScaleDown(NULL, icon_path, 42, 42, &icon);
+    ok(hr == S_OK, "Expected S_OK, got %x\n", hr);
+    res = GetIconInfo(icon, &info);
+    ok(res, "Failed to get icon info, error %u\n", GetLastError());
+    bytes = GetObjectA(info.hbmColor, sizeof(bmp), &bmp);
+    ok(bytes > 0, "Failed to get bitmap info for icon\n");
+    ok(bmp.bmWidth  == 42, "Wrong icon width %d\n", bmp.bmWidth);
+    ok(bmp.bmHeight == 42, "Wrong icon height %d\n", bmp.bmHeight);
+    DestroyIcon(icon);
+
+    DeleteFileW(icon_path);
+    FreeLibrary(hinst);
 }
 
 }
 
-
 START_TEST(misc)
 {
     ULONG_PTR ctx_cookie;
 START_TEST(misc)
 {
     ULONG_PTR ctx_cookie;
@@ -315,7 +383,7 @@ START_TEST(misc)
         return;
 
     test_TaskDialogIndirect();
         return;
 
     test_TaskDialogIndirect();
-    test_LoadIconMetric();
+    test_LoadIconWithScaleDown();
 
     unload_v6_module(ctx_cookie, hCtx);
 }
 
     unload_v6_module(ctx_cookie, hCtx);
 }
index 0ba78d3..6383890 100644 (file)
@@ -303,7 +303,7 @@ static LRESULT CALLBACK hook_proc( int code, WPARAM wp, LPARAM lp )
         CBT_CREATEWNDW *c = (CBT_CREATEWNDW *)lp;
 
         /* The first dialog created will be the parent dialog */
         CBT_CREATEWNDW *c = (CBT_CREATEWNDW *)lp;
 
         /* The first dialog created will be the parent dialog */
-        if (!done && c->lpcs->lpszClass == MAKEINTRESOURCEW(WC_DIALOG))
+        if (!done && c->lpcs->lpszClass == (LPWSTR)WC_DIALOG)
         {
             old_nav_dialog_proc = (WNDPROC)SetWindowLongPtrW( (HWND)wp, GWLP_WNDPROC, (LONG_PTR)new_nav_dialog_proc );
             done = TRUE;
         {
             old_nav_dialog_proc = (WNDPROC)SetWindowLongPtrW( (HWND)wp, GWLP_WNDPROC, (LONG_PTR)new_nav_dialog_proc );
             done = TRUE;
@@ -809,7 +809,7 @@ static void test_PSM_ADDPAGE(void)
     psp.pfnDlgProc = page_dlg_proc_messages;
     psp.lParam = 0;
 
     psp.pfnDlgProc = page_dlg_proc_messages;
     psp.lParam = 0;
 
-    /* two page with the same data */
+    /* multiple pages with the same data */
     hpsp[0] = CreatePropertySheetPageA(&psp);
     hpsp[1] = CreatePropertySheetPageA(&psp);
     hpsp[2] = CreatePropertySheetPageA(&psp);
     hpsp[0] = CreatePropertySheetPageA(&psp);
     hpsp[1] = CreatePropertySheetPageA(&psp);
     hpsp[2] = CreatePropertySheetPageA(&psp);
@@ -881,6 +881,100 @@ if (0)
     DestroyWindow(hdlg);
 }
 
     DestroyWindow(hdlg);
 }
 
+static void test_PSM_INSERTPAGE(void)
+{
+    HPROPSHEETPAGE hpsp[5];
+    PROPSHEETPAGEA psp;
+    PROPSHEETHEADERA psh;
+    HWND hdlg, tab;
+    BOOL ret;
+    DWORD r;
+
+    memset(&psp, 0, sizeof(psp));
+    psp.dwSize = sizeof(psp);
+    psp.dwFlags = 0;
+    psp.hInstance = GetModuleHandleA(NULL);
+    U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_MESSAGE_TEST);
+    U2(psp).pszIcon = NULL;
+    psp.pfnDlgProc = page_dlg_proc_messages;
+    psp.lParam = 0;
+
+    /* multiple pages with the same data */
+    hpsp[0] = CreatePropertySheetPageA(&psp);
+    hpsp[1] = CreatePropertySheetPageA(&psp);
+    hpsp[2] = CreatePropertySheetPageA(&psp);
+
+    U(psp).pszTemplate = (LPCSTR)MAKEINTRESOURCE(IDD_PROP_PAGE_ERROR);
+    hpsp[3] = CreatePropertySheetPageA(&psp);
+
+    psp.dwFlags = PSP_PREMATURE;
+    hpsp[4] = CreatePropertySheetPageA(&psp);
+
+    memset(&psh, 0, sizeof(psh));
+    psh.dwSize = PROPSHEETHEADERA_V1_SIZE;
+    psh.dwFlags = PSH_MODELESS;
+    psh.pszCaption = "test caption";
+    psh.nPages = 1;
+    psh.hwndParent = GetDesktopWindow();
+    U3(psh).phpage = hpsp;
+
+    hdlg = (HWND)PropertySheetA(&psh);
+    ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg);
+
+    /* add pages one by one */
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, 5, (LPARAM)hpsp[1]);
+    ok(ret == TRUE, "got %d\n", ret);
+
+    /* try with invalid values */
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, 0);
+    ok(ret == FALSE, "got %d\n", ret);
+
+if (0)
+{
+    /* crashes on native */
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, (LPARAM)INVALID_HANDLE_VALUE);
+}
+
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, (LPARAM)INVALID_HANDLE_VALUE, (LPARAM)hpsp[2]);
+    ok(ret == FALSE, "got %d\n", ret);
+
+    /* check item count */
+    tab = (HWND)SendMessageA(hdlg, PSM_GETTABCONTROL, 0, 0);
+
+    r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+    ok(r == 2, "got %d\n", r);
+
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, (WPARAM)hpsp[1], (LPARAM)hpsp[2]);
+    ok(ret == TRUE, "got %d\n", ret);
+
+    r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+    ok(r == 3, "got %d\n", r);
+
+    /* add property sheet page that can't be created */
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, 1, (LPARAM)hpsp[3]);
+    ok(ret == TRUE, "got %d\n", ret);
+
+    r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+    ok(r == 4, "got %d\n", r);
+
+    /* select page that can't be created */
+    ret = SendMessageA(hdlg, PSM_SETCURSEL, 1, 0);
+    ok(ret == TRUE, "got %d\n", ret);
+
+    r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+    ok(r == 3, "got %d\n", r);
+
+    /* test PSP_PREMATURE flag with incorrect property sheet page */
+    ret = SendMessageA(hdlg, PSM_INSERTPAGE, 0, (LPARAM)hpsp[4]);
+    ok(ret == FALSE, "got %d\n", ret);
+
+    r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
+    ok(r == 3, "got %d\n", r);
+
+    DestroyPropertySheetPage(hpsp[4]);
+    DestroyWindow(hdlg);
+}
+
 START_TEST(propsheet)
 {
     test_title();
 START_TEST(propsheet)
 {
     test_title();
@@ -891,4 +985,5 @@ START_TEST(propsheet)
     test_custom_default_button();
     test_messages();
     test_PSM_ADDPAGE();
     test_custom_default_button();
     test_messages();
     test_PSM_ADDPAGE();
+    test_PSM_INSERTPAGE();
 }
 }
index 5605df0..2a6bd25 100644 (file)
@@ -346,6 +346,7 @@ static void test_status_control(void)
         r = SendMessageA(hWndStatus, SB_SETTEXTA, 0, (LPARAM)chstr);
         expect(TRUE,r);
         r = SendMessageA(hWndStatus, SB_GETTEXTA, 0, (LPARAM)charArray);
         r = SendMessageA(hWndStatus, SB_SETTEXTA, 0, (LPARAM)chstr);
         expect(TRUE,r);
         r = SendMessageA(hWndStatus, SB_GETTEXTA, 0, (LPARAM)charArray);
+        ok(r == strlen(charArray), "got %d\n", r);
         /* substitution with single space */
         if (ch > 0x00 && ch < 0x20 && ch != '\t')
             chstr[5] = ' ';
         /* substitution with single space */
         if (ch > 0x00 && ch < 0x20 && ch != '\t')
             chstr[5] = ' ';
index 23eb250..bab746b 100644 (file)
@@ -1536,7 +1536,6 @@ static void test_sizes(void)
     /* Single non-BTNS_AUTOSIZE button with string with TBSTYLE_EX_MIXEDBUTTONS set. */
     rebuild_toolbar(&hToolbar);
     SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
     /* Single non-BTNS_AUTOSIZE button with string with TBSTYLE_EX_MIXEDBUTTONS set. */
     rebuild_toolbar(&hToolbar);
     SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
-    style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
     ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[1]) == 1, "TB_ADDBUTTONSA failed\n");
     ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1, "TB_SETBUTTONSIZE failed\n");
     SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
     ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[1]) == 1, "TB_ADDBUTTONSA failed\n");
     ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1, "TB_SETBUTTONSIZE failed\n");
     SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
@@ -1545,7 +1544,6 @@ static void test_sizes(void)
     /* Single non-BTNS_AUTOSIZE, BTNS_SHOWTEXT button with string with TBSTYLE_EX_MIXEDBUTTONS set. */
     rebuild_toolbar(&hToolbar);
     SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
     /* Single non-BTNS_AUTOSIZE, BTNS_SHOWTEXT button with string with TBSTYLE_EX_MIXEDBUTTONS set. */
     rebuild_toolbar(&hToolbar);
     SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
-    style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
     ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[2]) == 1, "TB_ADDBUTTONSA failed\n");
     ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1, "TB_SETBUTTONSIZE failed\n");
     SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
     ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[2]) == 1, "TB_ADDBUTTONSA failed\n");
     ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1, "TB_SETBUTTONSIZE failed\n");
     SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
index 7068bc9..3d46aa8 100644 (file)
@@ -905,6 +905,13 @@ static void test_get_set_item(void)
     expect(TRUE, ret);
     ok(tviRoot.state == TVIS_FOCUSED, "got state 0x%0x\n", tviRoot.state);
 
     expect(TRUE, ret);
     ok(tviRoot.state == TVIS_FOCUSED, "got state 0x%0x\n", tviRoot.state);
 
+    /* invalid item pointer, nt4 crashes here but later versions just return 0 */
+    tviRoot.hItem = (HTREEITEM)0xdeadbeef;
+    tviRoot.mask = TVIF_STATE;
+    tviRoot.state = 0;
+    ret = SendMessageA(hTree2, TVM_GETITEMA, 0, (LPARAM)&tviRoot);
+    expect(FALSE, ret);
+
     DestroyWindow(hTree);
     DestroyWindow(hTree2);
 }
     DestroyWindow(hTree);
     DestroyWindow(hTree2);
 }
index 1300598..9f5a9c4 100644 (file)
 #define ARCH "x86"
 #elif defined __x86_64__
 #define ARCH "amd64"
 #define ARCH "x86"
 #elif defined __x86_64__
 #define ARCH "amd64"
+#elif defined __arm__
+#define ARCH "arm"
+#elif defined __aarch64__
+#define ARCH "arm64"
 #else
 #define ARCH "none"
 #endif
 #else
 #define ARCH "none"
 #endif