From 6d7bf6bd02aede7b4e076f495ce531330ec76fed Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Fri, 2 Mar 2018 09:42:49 -0600 Subject: [PATCH] user32-WM_MEASUREITEM: Restore. --- patches/patchinstall.sh | 53 ++++++ ...ner-drawn-listbox-without-strings-WM.patch | 18 +- patches/user32-Sorted_Listbox/definition | 2 +- ...-a-test-for-WM_MEASUREITEM-when-inse.patch | 159 ++++++++++++++++++ patches/user32-WM_MEASUREITEM/definition | 2 + 5 files changed, 224 insertions(+), 10 deletions(-) create mode 100644 patches/user32-WM_MEASUREITEM/0001-user32-tests-Add-a-test-for-WM_MEASUREITEM-when-inse.patch create mode 100644 patches/user32-WM_MEASUREITEM/definition diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 00eb8bc7..2eefb31b 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -375,6 +375,8 @@ patch_enable_all () enable_user32_Refresh_MDI_Menus="$1" enable_user32_ScrollWindowEx="$1" enable_user32_ShowWindow="$1" + enable_user32_Sorted_Listbox="$1" + enable_user32_WM_MEASUREITEM="$1" enable_user32_WindowDisplayAffinity="$1" enable_user32_lpCreateParams="$1" enable_uxtheme_CloseThemeClass="$1" @@ -1352,6 +1354,12 @@ patch_enable () user32-ShowWindow) enable_user32_ShowWindow="$2" ;; + user32-Sorted_Listbox) + enable_user32_Sorted_Listbox="$2" + ;; + user32-WM_MEASUREITEM) + enable_user32_WM_MEASUREITEM="$2" + ;; user32-WindowDisplayAffinity) enable_user32_WindowDisplayAffinity="$2" ;; @@ -2173,6 +2181,13 @@ if test "$enable_uxtheme_GTK_Theming" -eq 1; then enable_ntdll_DllRedirects=1 fi +if test "$enable_user32_Sorted_Listbox" -eq 1; then + if test "$enable_user32_WM_MEASUREITEM" -gt 1; then + abort "Patchset user32-WM_MEASUREITEM disabled, but user32-Sorted_Listbox depends on that." + fi + enable_user32_WM_MEASUREITEM=1 +fi + if test "$enable_user32_MessageBox_WS_EX_TOPMOST" -eq 1; then if test "$enable_user32_lpCreateParams" -gt 1; then abort "Patchset user32-lpCreateParams disabled, but user32-MessageBox_WS_EX_TOPMOST depends on that." @@ -8037,6 +8052,44 @@ if test "$enable_user32_ShowWindow" -eq 1; then ) >> "$patchlist" fi +# Patchset user32-WM_MEASUREITEM +# | +# | Modified files: +# | * dlls/user32/tests/msg.c +# | +if test "$enable_user32_WM_MEASUREITEM" -eq 1; then + patch_apply user32-WM_MEASUREITEM/0001-user32-tests-Add-a-test-for-WM_MEASUREITEM-when-inse.patch + ( + printf '%s\n' '+ { "Dmitry Timoshkov", "user32/tests: Add a test for WM_MEASUREITEM when inserting an item to an owner-drawn listbox.", 2 },'; + ) >> "$patchlist" +fi + +# Patchset user32-Sorted_Listbox +# | +# | This patchset has the following (direct or indirect) dependencies: +# | * user32-WM_MEASUREITEM +# | +# | This patchset fixes the following Wine bugs: +# | * [#42602] Multiple fixes for owner-drawn and sorted listbox +# | +# | Modified files: +# | * dlls/user32/listbox.c, dlls/user32/tests/msg.c +# | +if test "$enable_user32_Sorted_Listbox" -eq 1; then + patch_apply user32-Sorted_Listbox/0001-user32-tests-Add-a-message-test-for-an-owner-drawn-s.patch + patch_apply user32-Sorted_Listbox/0002-user32-tests-Add-some-message-tests-for-not-an-owner.patch + patch_apply user32-Sorted_Listbox/0003-user32-Fix-order-of-items-passed-in-WM_COMPAREITEM-d.patch + patch_apply user32-Sorted_Listbox/0004-user32-Fix-the-listbox-sorting-algorithm.patch + patch_apply user32-Sorted_Listbox/0005-user32-For-an-owner-drawn-listbox-without-strings-WM.patch + ( + printf '%s\n' '+ { "Dmitry Timoshkov", "user32/tests: Add a message test for an owner-drawn sorted listbox.", 1 },'; + printf '%s\n' '+ { "Dmitry Timoshkov", "user32/tests: Add some message tests for not an owner-drawn listbox.", 1 },'; + printf '%s\n' '+ { "Dmitry Timoshkov", "user32: Fix order of items passed in WM_COMPAREITEM data.", 2 },'; + printf '%s\n' '+ { "Dmitry Timoshkov", "user32: Fix the listbox sorting algorithm.", 1 },'; + printf '%s\n' '+ { "Dmitry Timoshkov", "user32: For an owner-drawn listbox without strings WM_MEASUREITEM still needs correct itemData.", 1 },'; + ) >> "$patchlist" +fi + # Patchset user32-WindowDisplayAffinity # | # | This patchset fixes the following Wine bugs: diff --git a/patches/user32-Sorted_Listbox/0005-user32-For-an-owner-drawn-listbox-without-strings-WM.patch b/patches/user32-Sorted_Listbox/0005-user32-For-an-owner-drawn-listbox-without-strings-WM.patch index ca164e62..e3f79c3c 100644 --- a/patches/user32-Sorted_Listbox/0005-user32-For-an-owner-drawn-listbox-without-strings-WM.patch +++ b/patches/user32-Sorted_Listbox/0005-user32-For-an-owner-drawn-listbox-without-strings-WM.patch @@ -1,4 +1,4 @@ -From 003b3ed2618590e3e7283735aaa159d3d9cbb592 Mon Sep 17 00:00:00 2001 +From f3f3100efb0b3e702957b89cc0bfc58040b1a1a7 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Wed, 8 Mar 2017 17:52:10 +0800 Subject: user32: For an owner-drawn listbox without strings WM_MEASUREITEM @@ -10,23 +10,23 @@ Subject: user32: For an owner-drawn listbox without strings WM_MEASUREITEM 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c -index 71a01a1d4fe..873e3a20969 100644 +index 9caccf6..af8ee40 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c -@@ -1566,7 +1566,7 @@ static LRESULT LISTBOX_InsertItem( LB_DESCR *descr, INT index, +@@ -1554,7 +1554,7 @@ static LRESULT LISTBOX_InsertItem( LB_DESCR *descr, INT index, mis.CtlType = ODT_LISTBOX; mis.CtlID = id; mis.itemID = index; -- mis.itemData = (ULONG_PTR)str; +- mis.itemData = data; + mis.itemData = str ? (ULONG_PTR)str : data; mis.itemHeight = descr->item_height; - TRACE("owner=%p CtlID=%08x, itemID=%08x, itemData=%08lx\n", - descr->owner, mis.CtlID, mis.itemID, mis.itemData); + SendMessageW( descr->owner, WM_MEASUREITEM, id, (LPARAM)&mis ); + item->height = mis.itemHeight ? mis.itemHeight : 1; diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c -index 88137c45fe2..d7007d57115 100644 +index f532f1c..65712a7 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c -@@ -14684,7 +14684,7 @@ static void test_listbox_messages(void) +@@ -14272,7 +14272,7 @@ static void test_listbox_messages(void) ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2"); ok(ret == 2, "expected 2, got %ld\n", ret); @@ -36,5 +36,5 @@ index 88137c45fe2..d7007d57115 100644 log_all_parent_messages--; -- -2.13.1 +2.7.4 diff --git a/patches/user32-Sorted_Listbox/definition b/patches/user32-Sorted_Listbox/definition index f536a4e1..903389f2 100644 --- a/patches/user32-Sorted_Listbox/definition +++ b/patches/user32-Sorted_Listbox/definition @@ -1,2 +1,2 @@ Fixes: [42602] Multiple fixes for owner-drawn and sorted listbox -Disabled: true \ No newline at end of file +Depends: user32-WM_MEASUREITEM \ No newline at end of file diff --git a/patches/user32-WM_MEASUREITEM/0001-user32-tests-Add-a-test-for-WM_MEASUREITEM-when-inse.patch b/patches/user32-WM_MEASUREITEM/0001-user32-tests-Add-a-test-for-WM_MEASUREITEM-when-inse.patch new file mode 100644 index 00000000..d699d7f7 --- /dev/null +++ b/patches/user32-WM_MEASUREITEM/0001-user32-tests-Add-a-test-for-WM_MEASUREITEM-when-inse.patch @@ -0,0 +1,159 @@ +From 1c43865f5fc1ef1ab71572773e560821d4b4a753 Mon Sep 17 00:00:00 2001 +From: Dmitry Timoshkov +Date: Sun, 12 Jun 2016 16:16:48 +0800 +Subject: user32/tests: Add a test for WM_MEASUREITEM when inserting an item to + an owner-drawn listbox (v2). + +--- + dlls/user32/tests/msg.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 75 insertions(+), 4 deletions(-) + +diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c +index 36d1e33..c46b8e1 100644 +--- a/dlls/user32/tests/msg.c ++++ b/dlls/user32/tests/msg.c +@@ -3,7 +3,7 @@ + * + * Copyright 1999 Ove Kaaven + * Copyright 2003 Dimitrie O. Paun +- * Copyright 2004, 2005 Dmitry Timoshkov ++ * Copyright 2004,2005,2016 Dmitry Timoshkov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -98,6 +98,22 @@ typedef struct + } u; + } DRAW_ITEM_STRUCT; + ++/* encoded MEASUREITEMSTRUCT into a WPARAM */ ++typedef struct ++{ ++ union ++ { ++ struct ++ { ++ UINT CtlType : 4; ++ UINT CtlID : 4; ++ UINT itemID : 4; ++ UINT wParam : 20; ++ } item; ++ WPARAM wp; ++ } u; ++} MEASURE_ITEM_STRUCT; ++ + static BOOL test_DestroyWindow_flag; + static HWINEVENTHOOK hEvent_hook; + static HHOOK hKBD_hook; +@@ -2099,6 +2115,25 @@ static BOOL ignore_message( UINT message ) + message == WM_DWMNCRENDERINGCHANGED); + } + ++static unsigned hash_Ly_W(const WCHAR *str) ++{ ++ unsigned hash = 0; ++ ++ for (; *str; str++) ++ hash = hash * 1664525u + (unsigned char)(*str) + 1013904223u; ++ ++ return hash; ++} ++ ++static unsigned hash_Ly(const char *str) ++{ ++ unsigned hash = 0; ++ ++ for (; *str; str++) ++ hash = hash * 1664525u + (unsigned char)(*str) + 1013904223u; ++ ++ return hash; ++} + + #define add_message(msg) add_message_(__LINE__,msg); + static void add_message_(int line, const struct recvd_message *msg) +@@ -2203,6 +2238,26 @@ static void add_message_(int line, const struct recvd_message *msg) + seq->lParam = di.u.lp; + break; + } ++ ++ case WM_MEASUREITEM: ++ { ++ MEASURE_ITEM_STRUCT mi; ++ MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)msg->lParam; ++ ++ sprintf( seq->output, "%s: %p WM_MEASUREITEM: CtlType %#x, CtlID %#x, itemID %#x, itemData %#lx", ++ msg->descr, msg->hwnd, mis->CtlType, mis->CtlID, ++ mis->itemID, mis->itemData); ++ ++ mi.u.wp = 0; ++ mi.u.item.CtlType = mis->CtlType; ++ mi.u.item.CtlID = mis->CtlID; ++ mi.u.item.itemID = mis->itemID; ++ mi.u.item.wParam = msg->wParam; ++ seq->wParam = mi.u.wp; ++ seq->lParam = mis->itemData ? hash_Ly_W((const WCHAR *)mis->itemData) : 0; ++ break; ++ } ++ + default: + if (msg->message >= 0xc000) return; /* ignore registered messages */ + sprintf( seq->output, "%s: %p %04x wp %08lx lp %08lx", +@@ -8874,8 +8929,8 @@ static LRESULT WINAPI ParentMsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam + message == WM_PARENTNOTIFY || message == WM_CANCELMODE || + message == WM_SETFOCUS || message == WM_KILLFOCUS || + message == WM_ENABLE || message == WM_ENTERIDLE || +- message == WM_DRAWITEM || message == WM_COMMAND || +- message == WM_IME_SETCONTEXT) ++ message == WM_DRAWITEM || message == WM_MEASUREITEM || ++ message == WM_COMMAND || message == WM_IME_SETCONTEXT) + { + switch (message) + { +@@ -13979,6 +14034,16 @@ static const struct message wm_lb_deletestring_reset[] = + { WM_DRAWITEM, sent|wparam|parent|optional, ID_LISTBOX }, + { 0 } + }; ++static const struct message wm_lb_addstring[] = ++{ ++ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ed }, ++ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf0f2, 0xf30604ed }, ++ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ee }, ++ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf1f2, 0xf30604ee }, ++ { LB_ADDSTRING, sent|wparam|lparam, 0, 0xf30604ef }, ++ { WM_MEASUREITEM, sent|wparam|lparam|parent, 0xf2f2, 0xf30604ef }, ++ { 0 } ++}; + + #define check_lb_state(a1, a2, a3, a4, a5) check_lb_state_dbg(a1, a2, a3, a4, a5, __LINE__) + +@@ -14004,7 +14069,10 @@ static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPAR + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wp; +- msg.lParam = lp; ++ if (message == LB_ADDSTRING) ++ msg.lParam = lp ? hash_Ly((const char *)lp) : 0; ++ else ++ msg.lParam = lp; + msg.descr = "listbox"; + add_message(&msg); + } +@@ -14048,6 +14116,8 @@ static void test_listbox_messages(void) + + check_lb_state(listbox, 0, LB_ERR, 0, 0); + ++ flush_sequence(); ++ + ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 0"); + ok(ret == 0, "expected 0, got %ld\n", ret); + ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 1"); +@@ -14055,6 +14125,7 @@ static void test_listbox_messages(void) + ret = SendMessageA(listbox, LB_ADDSTRING, 0, (LPARAM)"item 2"); + ok(ret == 2, "expected 2, got %ld\n", ret); + ++ ok_sequence(wm_lb_addstring, "LB_ADDSTRING", FALSE); + check_lb_state(listbox, 3, LB_ERR, 0, 0); + + flush_sequence(); +-- +2.7.4 + diff --git a/patches/user32-WM_MEASUREITEM/definition b/patches/user32-WM_MEASUREITEM/definition new file mode 100644 index 00000000..6ca5e54f --- /dev/null +++ b/patches/user32-WM_MEASUREITEM/definition @@ -0,0 +1,2 @@ +Fixes: Pass correct itemData to WM_MEASUREITEM when inserting an item to an owner-drawn listbox +# Originally fixed 37025, now only tests left. \ No newline at end of file