Module: wine Branch: master Commit: fc767fd589c8544b59ad0508089636bde23b2059 URL: https://gitlab.winehq.org/wine/wine/-/commit/fc767fd589c8544b59ad0508089636b...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Sep 26 13:07:12 2022 +0200
comctl32: Create page if PROPSHEETPAGE was passed as HPROPSHEETPAGE to PropertySheetAW or PSM_INSERTPAGE.
---
dlls/comctl32/propsheet.c | 39 +++++++++++++++++++++++++++++++++++++-- dlls/comctl32/tests/propsheet.c | 4 ++-- 2 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index e043e34a6cd..95b464934dc 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -66,6 +66,8 @@
#include "wine/debug.h"
+#define HPROPSHEETPAGE_MAGIC 0x5A9234E3 + /****************************************************************************** * Data structures */ @@ -95,6 +97,7 @@ typedef struct
struct _PSP { + ULONG_PTR magic; PROPSHEETPAGEW psp; PROPSHEETPAGEW callback_psp; }; @@ -2302,6 +2305,14 @@ static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, if (!ppi) return FALSE;
+ if (hpage && hpage->magic != HPROPSHEETPAGE_MAGIC) + { + if (psInfo->unicode) + hpage = CreatePropertySheetPageW((const PROPSHEETPAGEW *)hpage); + else + hpage = CreatePropertySheetPageA((const PROPSHEETPAGEA *)hpage); + } + /* * Fill in a new PropPageInfo entry. */ @@ -2855,7 +2866,18 @@ INT_PTR WINAPI PropertySheetA(LPCPROPSHEETHEADERA lppsh) for (n = i = 0; i < lppsh->nPages; i++, n++) { if (!psInfo->usePropPage) - psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i]; + { + if (psInfo->ppshheader.u3.phpage[i] && + psInfo->ppshheader.u3.phpage[i]->magic == HPROPSHEETPAGE_MAGIC) + { + psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i]; + } + else + { + psInfo->proppage[n].hpage = CreatePropertySheetPageA( + (const PROPSHEETPAGEA *)psInfo->ppshheader.u3.phpage[i]); + } + } else { psInfo->proppage[n].hpage = CreatePropertySheetPageA((LPCPROPSHEETPAGEA)pByte); @@ -2895,7 +2917,18 @@ INT_PTR WINAPI PropertySheetW(LPCPROPSHEETHEADERW lppsh) for (n = i = 0; i < lppsh->nPages; i++, n++) { if (!psInfo->usePropPage) - psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i]; + { + if (psInfo->ppshheader.u3.phpage[i] && + psInfo->ppshheader.u3.phpage[i]->magic == HPROPSHEETPAGE_MAGIC) + { + psInfo->proppage[n].hpage = psInfo->ppshheader.u3.phpage[i]; + } + else + { + psInfo->proppage[n].hpage = CreatePropertySheetPageW( + (const PROPSHEETPAGEW *)psInfo->ppshheader.u3.phpage[i]); + } + } else { psInfo->proppage[n].hpage = CreatePropertySheetPageW((LPCPROPSHEETPAGEW)pByte); @@ -2974,6 +3007,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA( return NULL;
ret = Alloc(sizeof(*ret)); + ret->magic = HPROPSHEETPAGE_MAGIC; ppsp = &ret->psp; memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA))); /* original data is used for callback notifications */ @@ -3053,6 +3087,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage return NULL;
ret = Alloc(sizeof(*ret)); + ret->magic = HPROPSHEETPAGE_MAGIC; ppsp = &ret->psp; memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW))); /* original data is used for callback notifications */ diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c index 7e0e7087f67..cf435703d1e 100644 --- a/dlls/comctl32/tests/propsheet.c +++ b/dlls/comctl32/tests/propsheet.c @@ -1343,7 +1343,7 @@ static void test_invalid_hpropsheetpage(void)
ret = SendMessageA(hdlg, PSM_INDEXTOPAGE, 0, 0); ok(ret, "page was not created\n"); - todo_wine ok((HPROPSHEETPAGE)ret != hpsp[0], "invalid HPROPSHEETPAGE was preserved\n"); + ok((HPROPSHEETPAGE)ret != hpsp[0], "invalid HPROPSHEETPAGE was preserved\n"); DestroyWindow(hdlg);
memset(pspW, 0, sizeof(*pspW)); @@ -1383,7 +1383,7 @@ static void test_invalid_hpropsheetpage(void) ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle value %p\n", hdlg);
ret = SendMessageA(hdlg, PSM_INDEXTOPAGE, 0, 0); - todo_wine ok(ret, "page was not created\n"); + ok(ret, "page was not created\n"); ok((HPROPSHEETPAGE)ret != hpsp[0], "invalid HPROPSHEETPAGE was preserved\n"); DestroyWindow(hdlg); }