Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2018
- 70 participants
- 1549 messages
[PATCH vkd3d 3/8] vkd3d-shader: Translate continue instructions.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index d19d89990d5c..b96b69e83934 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4850,6 +4850,20 @@ static void vkd3d_dxbc_compiler_pop_control_flow_level(struct vkd3d_dxbc_compile
memset(cf_info, 0, sizeof(*cf_info));
}
+static struct vkd3d_control_flow_info *vkd3d_dxbc_compiler_find_innermost_loop(
+ struct vkd3d_dxbc_compiler *compiler)
+{
+ int depth;
+
+ for (depth = compiler->control_flow_depth - 1; depth >= 0; --depth)
+ {
+ if (compiler->control_flow_info[depth].current_block == VKD3D_BLOCK_LOOP)
+ return &compiler->control_flow_info[depth];
+ }
+
+ return NULL;
+}
+
static struct vkd3d_control_flow_info *vkd3d_dxbc_compiler_find_innermost_breakable_cf_construct(
struct vkd3d_dxbc_compiler *compiler)
{
@@ -5079,8 +5093,6 @@ static void vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_
return;
}
- assert(compiler->control_flow_depth);
-
if (breakable_cf_info->current_block == VKD3D_BLOCK_LOOP)
{
vkd3d_spirv_build_op_branch(builder, breakable_cf_info->u.loop.merge_block_id);
@@ -5102,6 +5114,22 @@ static void vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_
vkd3d_dxbc_compiler_emit_breakc(compiler, instruction, cf_info->u.loop.merge_block_id);
break;
+ case VKD3DSIH_CONTINUE:
+ {
+ struct vkd3d_control_flow_info *loop_cf_info;
+
+ if (!(loop_cf_info = vkd3d_dxbc_compiler_find_innermost_loop(compiler)))
+ {
+ ERR("Invalid 'continue' instruction outside loop.\n");
+ return;
+ }
+
+ vkd3d_spirv_build_op_branch(builder, loop_cf_info->u.loop.continue_block_id);
+
+ cf_info->inside_block = false;
+ break;
+ }
+
case VKD3DSIH_RET:
vkd3d_dxbc_compiler_emit_return(compiler, instruction);
@@ -6278,6 +6306,7 @@ void vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler
case VKD3DSIH_BREAK:
case VKD3DSIH_BREAKP:
case VKD3DSIH_CASE:
+ case VKD3DSIH_CONTINUE:
case VKD3DSIH_DEFAULT:
case VKD3DSIH_ELSE:
case VKD3DSIH_ENDIF:
--
2.16.4
Sept. 24, 2018
[PATCH vkd3d 2/8] vkd3d-shader: Translate ineg instructions.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 6fabeb240a0e..d19d89990d5c 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -4186,6 +4186,7 @@ static SpvOp vkd3d_dxbc_compiler_map_alu_instruction(const struct vkd3d_shader_i
{VKD3DSIH_FTOI, SpvOpConvertFToS},
{VKD3DSIH_FTOU, SpvOpConvertFToU},
{VKD3DSIH_IADD, SpvOpIAdd},
+ {VKD3DSIH_INEG, SpvOpSNegate},
{VKD3DSIH_ISHL, SpvOpShiftLeftLogical},
{VKD3DSIH_ISHR, SpvOpShiftRightArithmetic},
{VKD3DSIH_ITOF, SpvOpConvertSToF},
@@ -6198,6 +6199,7 @@ void vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler
case VKD3DSIH_FTOI:
case VKD3DSIH_FTOU:
case VKD3DSIH_IADD:
+ case VKD3DSIH_INEG:
case VKD3DSIH_ISHL:
case VKD3DSIH_ISHR:
case VKD3DSIH_ITOF:
--
2.16.4
Sept. 24, 2018
[PATCH vkd3d 1/8] vkd3d-shader: Promote immediate scalar constants to vectors.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/spirv.c | 4 ++--
tests/d3d12.c | 23 +++++++++++++++++++++++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 964bc49b3179..6fabeb240a0e 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2537,8 +2537,8 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_constant(struct vkd3d_dxbc_compile
if (reg->immconst_type == VKD3D_IMMCONST_SCALAR)
{
- assert(component_count == 1);
- values[0] = *reg->u.immconst_uint;
+ for (i = 0; i < component_count; ++i)
+ values[i] = *reg->u.immconst_uint;
}
else
{
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 808562e86127..9bb6861f7757 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -6136,6 +6136,24 @@ static void test_shader_instructions(void)
0x00000001, 0x0100003e,
};
static const D3D12_SHADER_BYTECODE ps_ishl = {ps_ishl_code, sizeof(ps_ishl_code)};
+ static const DWORD ps_ishl_const_code[] =
+ {
+#if 0
+ uint4 src;
+
+ void main(out uint4 dst : SV_Target)
+ {
+ dst = src << 2;
+ }
+#endif
+ 0x43425844, 0x5b749bf4, 0xe24de3dc, 0xbbd75bc9, 0xc6fc9eca, 0x00000001, 0x000000c0, 0x00000003,
+ 0x0000002c, 0x0000003c, 0x00000070, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, 0x4e47534f,
+ 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
+ 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x52444853, 0x00000048, 0x00000040, 0x00000012,
+ 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, 0x00000000, 0x08000029,
+ 0x001020f2, 0x00000000, 0x00208e46, 0x00000000, 0x00000000, 0x00004001, 0x00000002, 0x0100003e,
+ };
+ static const D3D12_SHADER_BYTECODE ps_ishl_const = {ps_ishl_const_code, sizeof(ps_ishl_const_code)};
static const DWORD ps_not_code[] =
{
#if 0
@@ -6956,6 +6974,11 @@ static void test_shader_instructions(void)
{&ps_ishl, {{{0x00000001, 0x00000001, 0x00000001, 0x800feac1}, { 31, 7, 15, 11}}},
{{0x80000000, 0x00000080, 0x00008000, 0x7f560800}}},
+ {&ps_ishl_const, {{{0x00000000, 0x00000000, 0x00000000, 0x00000000}}},
+ {{0x00000000, 0x00000000, 0x00000000, 0x00000000}}},
+ {&ps_ishl_const, {{{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff}}},
+ {{0xfffffffc, 0xfffffffc, 0xfffffffc, 0xfffffffc}}},
+
{&ps_not, {{{0x00000000, 0xffffffff}}}, {{0xffffffff, 0x00000000, 0x00000000, 0xffffffff}}},
{&ps_not, {{{0xf0f0f0f0, 0x0f0f0f0f}}}, {{0x0f0f0f0f, 0xf0f0f0f0, 0xf0f0f0f0, 0x0f0f0f0f}}},
--
2.16.4
Sept. 24, 2018
Re: [PATCH] comctl32: Improve hit testing and invalidation for sub items.
by Nikolay Sivov
On 09/18/2018 10:35 AM, Jim Mussared wrote:
> These fixes are for "Vectric Cut2D" which uses listview to show
> document layers. See referenced bug for more details. The layer list
> uses clickable subitems for:
> - toggling visibility of the layer
> - color swatch (click to edit color)
> - menu (click to show the right-click menu)
> (all of these are activated on mouse up)
>
> At the moment, the sub items are not clickable in Wine. Additionally,
> they do not update when the layer changes state.
>
> This patch fixes three things:
> - When hit testing, the sub items's coordinates are relative to the
> item. So the mouse coordinate (opt) will be outside the bounds of the
> item (rcBounds), and fail the hit test.
> Skip this check when not doing a selection hit test (which applies to
> mouse up).
> - InvalidateItem only invalidates the region of the primary item. Now
> also invalidate all sub-items.
> - InvalidateSubItem calculated the position of the subitem
> incorrectly (it's offset by the left edge of the main item).
Please split it into three separate patches then.
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44794
> Signed-off-by: Jim Mussared <jim.mussared(a)gmail.com>
> ---
> dlls/comctl32/listview.c | 41 ++++++++++++++++++++++++----------------
> 1 file changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
> index 777b40f2fe..1440581f71 100644
> --- a/dlls/comctl32/listview.c
> +++ b/dlls/comctl32/listview.c
> @@ -1725,38 +1725,46 @@ static inline BOOL is_redrawing(const
> LISTVIEW_INFO *infoPtr)
>
> static inline void LISTVIEW_InvalidateRect(const LISTVIEW_INFO
> *infoPtr, const RECT* rect)
> {
> - if(!is_redrawing(infoPtr)) return;
> + if(!is_redrawing(infoPtr)) return;
> TRACE(" invalidating rect=%s\n", wine_dbgstr_rect(rect));
> InvalidateRect(infoPtr->hwndSelf, rect, TRUE);
> }
Please don't include formatting or whitespace only changes.
>
> -static inline void LISTVIEW_InvalidateItem(const LISTVIEW_INFO
> *infoPtr, INT nItem)
> -{
> - RECT rcBox;
> -
> - if (!is_redrawing(infoPtr) || nItem < 0 || nItem >= infoPtr->nItemCount)
> - return;
> -
> - LISTVIEW_GetItemBox(infoPtr, nItem, &rcBox);
> - LISTVIEW_InvalidateRect(infoPtr, &rcBox);
> -}
> -
> static inline void LISTVIEW_InvalidateSubItem(const LISTVIEW_INFO
> *infoPtr, INT nItem, INT nSubItem)
> {
> POINT Origin, Position;
> RECT rcBox;
> -
> - if(!is_redrawing(infoPtr)) return;
> +
> + if(!is_redrawing(infoPtr)) return;
> assert (infoPtr->uView == LV_VIEW_DETAILS);
> LISTVIEW_GetOrigin(infoPtr, &Origin);
> LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
> LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox);
> rcBox.top = 0;
> rcBox.bottom = infoPtr->nItemHeight;
> - OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y);
> + OffsetRect(&rcBox, Origin.x, Origin.y + Position.y);
This one is meant for reordered columns case?
> LISTVIEW_InvalidateRect(infoPtr, &rcBox);
> }
>
> +static inline void LISTVIEW_InvalidateItem(const LISTVIEW_INFO
> *infoPtr, INT nItem)
> +{
> + RECT rcBox;
> +
> + if (!is_redrawing(infoPtr) || nItem < 0 || nItem >= infoPtr->nItemCount)
> + return;
> +
> + LISTVIEW_GetItemBox(infoPtr, nItem, &rcBox);
> + LISTVIEW_InvalidateRect(infoPtr, &rcBox);
> +
> + /* Additionally invalidate all other sub-items.
> + The first sub-item is handled by GetItemBox above. */
> + if (infoPtr->uView == LV_VIEW_DETAILS) {
> + INT nSubItem;
> + for (nSubItem = 1; nSubItem <
> DPA_GetPtrCount(infoPtr->hdpaColumns); nSubItem++)
> + LISTVIEW_InvalidateSubItem(infoPtr, nItem, nSubItem);
> + }
> +}
I don't see why this would be necessary, item box should include whole
row already.
> +
> static inline void LISTVIEW_InvalidateList(const LISTVIEW_INFO *infoPtr)
> {
> LISTVIEW_InvalidateRect(infoPtr, NULL);
> @@ -7741,8 +7749,9 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO
> *infoPtr, LPLVHITTESTINFO lpht,
> UnionRect(&rcBounds, &rcIcon, &rcLabel);
> UnionRect(&rcBounds, &rcBounds, &rcState);
> }
> +
> TRACE("rcBounds=%s\n", wine_dbgstr_rect(&rcBounds));
> - if (!PtInRect(&rcBounds, opt)) return -1;
> + if (select && !PtInRect(&rcBounds, opt)) return -1;
>
> /* That's a special case - row rectangle is used as item rectangle and
> returned flags contain all item parts. */
This looks wrong. Could you describe listview configuration and hittest
messages being sent, that don't work?
> --
> 2.19.0
>
>
Sept. 24, 2018
Re: [PATCH] comctl32/listview: Fix subitem invalidation.
by Jim Mussared
On Mon, 24 Sep 2018 at 17:43, Nikolay Sivov <nsivov(a)codeweavers.com> wrote:
>
> From: Jim Mussared <jim.mussared(a)gmail.com>
>
> It's wrong to offset by item position, columns could be reordered.
Thanks Nikolay and Zhiyi - sorry this patch was no good, I'm new to
Wine and got a bit excited when I saw Cut2D doing the right thing.
I have written some conformance tests to show the underlying issue is
that when columns are reordered, subitem hittesting
(LVM_SUBITEMHITTEST) returns different results on Windows, and
invalidation doesn't calculate the right bounds.
Working on a new patch set, hoping to find some time in the next
couple of days to send it.
>
> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
> ---
> dlls/comctl32/listview.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
> index 777b40f2fe..95d619af75 100644
> --- a/dlls/comctl32/listview.c
> +++ b/dlls/comctl32/listview.c
> @@ -1753,7 +1753,7 @@ static inline void LISTVIEW_InvalidateSubItem(const LISTVIEW_INFO *infoPtr, INT
> LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox);
> rcBox.top = 0;
> rcBox.bottom = infoPtr->nItemHeight;
> - OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y);
> + OffsetRect(&rcBox, Origin.x, Origin.y + Position.y);
> LISTVIEW_InvalidateRect(infoPtr, &rcBox);
> }
>
> --
> 2.19.0
>
Sept. 24, 2018
Re: [PATCH] riched20: Avoid using GCC's typeof extension
by Huw Davies
On Thu, Sep 20, 2018 at 09:34:07PM -0600, Alex Henrie wrote:
> Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
> ---
> dlls/riched20/txthost.c | 86 ++++++++++++++++++++---------------------
> dlls/riched20/txtsrv.c | 4 +-
> 2 files changed, 45 insertions(+), 45 deletions(-)
>
> diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
> index b479bde81b..d929a1a0a3 100644
> --- a/dlls/riched20/txthost.c
> +++ b/dlls/riched20/txthost.c
> @@ -501,9 +501,9 @@ DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *i
>
> #ifdef __i386__ /* thiscall functions are i386-specific */
>
> -#define THISCALL(func) __thiscall_ ## func
> +#define THISCALL(func) (void *) __thiscall_ ## func
> #define DEFINE_THISCALL_WRAPPER(func,args) \
> - extern typeof(func) THISCALL(func); \
> + extern void * __thiscall_ ## func(void); \
> __ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
> "popl %eax\n\t" \
> "pushl %ecx\n\t" \
We lose type-checking when assigning function ptrs to vtbl entries, which is
unfortunate.
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
Sept. 24, 2018
[PATCH] comctl32/listview: Fix subitem invalidation.
by Nikolay Sivov
From: Jim Mussared <jim.mussared(a)gmail.com>
It's wrong to offset by item position, columns could be reordered.
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/comctl32/listview.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 777b40f2fe..95d619af75 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -1753,7 +1753,7 @@ static inline void LISTVIEW_InvalidateSubItem(const LISTVIEW_INFO *infoPtr, INT
LISTVIEW_GetHeaderRect(infoPtr, nSubItem, &rcBox);
rcBox.top = 0;
rcBox.bottom = infoPtr->nItemHeight;
- OffsetRect(&rcBox, Origin.x + Position.x, Origin.y + Position.y);
+ OffsetRect(&rcBox, Origin.x, Origin.y + Position.y);
LISTVIEW_InvalidateRect(infoPtr, &rcBox);
}
--
2.19.0
Sept. 24, 2018
[PATCH 4/4] comctl32/pager: Support tree view notification conversion.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/pager.c | 73 +++++++++++++++++++++++++++++
dlls/comctl32/tests/pager.c | 91 ++++++++++++++++++++++++++++++++++++-
2 files changed, 163 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/pager.c b/dlls/comctl32/pager.c
index 343c330969..4763ed5640 100644
--- a/dlls/comctl32/pager.c
+++ b/dlls/comctl32/pager.c
@@ -1074,6 +1074,19 @@ static UINT PAGER_GetAnsiNtfCode(UINT code)
case TBN_GETINFOTIPW: return TBN_GETINFOTIPA;
/* Tooltip */
case TTN_GETDISPINFOW: return TTN_GETDISPINFOA;
+ /* Tree View */
+ case TVN_BEGINDRAGW: return TVN_BEGINDRAGA;
+ case TVN_BEGINLABELEDITW: return TVN_BEGINLABELEDITA;
+ case TVN_BEGINRDRAGW: return TVN_BEGINRDRAGA;
+ case TVN_DELETEITEMW: return TVN_DELETEITEMA;
+ case TVN_ENDLABELEDITW: return TVN_ENDLABELEDITA;
+ case TVN_GETDISPINFOW: return TVN_GETDISPINFOA;
+ case TVN_GETINFOTIPW: return TVN_GETINFOTIPA;
+ case TVN_ITEMEXPANDEDW: return TVN_ITEMEXPANDEDA;
+ case TVN_ITEMEXPANDINGW: return TVN_ITEMEXPANDINGA;
+ case TVN_SELCHANGEDW: return TVN_SELCHANGEDA;
+ case TVN_SELCHANGINGW: return TVN_SELCHANGINGA;
+ case TVN_SETDISPINFOW: return TVN_SETDISPINFOA;
}
return code;
}
@@ -1375,6 +1388,66 @@ static LRESULT PAGER_Notify(PAGER_INFO *infoPtr, NMHDR *hdr)
return ret;
}
+ /* Tree View */
+ case TVN_BEGINDRAGW:
+ case TVN_BEGINRDRAGW:
+ case TVN_ITEMEXPANDEDW:
+ case TVN_ITEMEXPANDINGW:
+ {
+ NMTREEVIEWW *nmtv = (NMTREEVIEWW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmtv->itemNew.mask, TVIF_TEXT, &nmtv->itemNew.pszText, NULL,
+ CONVERT_SEND);
+ }
+ case TVN_DELETEITEMW:
+ {
+ NMTREEVIEWW *nmtv = (NMTREEVIEWW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmtv->itemOld.mask, TVIF_TEXT, &nmtv->itemOld.pszText, NULL,
+ CONVERT_SEND);
+ }
+ case TVN_BEGINLABELEDITW:
+ case TVN_ENDLABELEDITW:
+ {
+ NMTVDISPINFOW *nmtvdi = (NMTVDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmtvdi->item.mask, TVIF_TEXT, &nmtvdi->item.pszText,
+ &nmtvdi->item.cchTextMax, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE);
+ }
+ case TVN_SELCHANGINGW:
+ case TVN_SELCHANGEDW:
+ {
+ NMTREEVIEWW *nmtv = (NMTREEVIEWW *)hdr;
+ WCHAR *oldItemOldText = NULL;
+ WCHAR *oldItemNewText = NULL;
+
+ hdr->code = PAGER_GetAnsiNtfCode(hdr->code);
+
+ if (!((nmtv->itemNew.mask | nmtv->itemOld.mask) & TVIF_TEXT))
+ return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, hdr->idFrom, (LPARAM)hdr);
+
+ if (nmtv->itemOld.mask & TVIF_TEXT) oldItemOldText = PAGER_ConvertText(&nmtv->itemOld.pszText);
+ if (nmtv->itemNew.mask & TVIF_TEXT) oldItemNewText = PAGER_ConvertText(&nmtv->itemNew.pszText);
+
+ ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, hdr->idFrom, (LPARAM)hdr);
+ PAGER_RestoreText(&nmtv->itemOld.pszText, oldItemOldText);
+ PAGER_RestoreText(&nmtv->itemNew.pszText, oldItemNewText);
+ return ret;
+ }
+ case TVN_GETDISPINFOW:
+ {
+ NMTVDISPINFOW *nmtvdi = (NMTVDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmtvdi->item.mask, TVIF_TEXT, &nmtvdi->item.pszText,
+ &nmtvdi->item.cchTextMax, ZERO_SEND | CONVERT_RECEIVE);
+ }
+ case TVN_SETDISPINFOW:
+ {
+ NMTVDISPINFOW *nmtvdi = (NMTVDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmtvdi->item.mask, TVIF_TEXT, &nmtvdi->item.pszText,
+ &nmtvdi->item.cchTextMax, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE);
+ }
+ case TVN_GETINFOTIPW:
+ {
+ NMTVGETINFOTIPW *nmtvgit = (NMTVGETINFOTIPW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, NULL, 0, &nmtvgit->pszText, &nmtvgit->cchTextMax, CONVERT_RECEIVE);
+ }
}
/* Other notifications, no need to convert */
return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, hdr->idFrom, (LPARAM)hdr);
diff --git a/dlls/comctl32/tests/pager.c b/dlls/comctl32/tests/pager.c
index 05fbc55fa2..17fc4bdf81 100644
--- a/dlls/comctl32/tests/pager.c
+++ b/dlls/comctl32/tests/pager.c
@@ -72,6 +72,12 @@ enum test_conversion_flags
ZERO_SEND = 0x80
};
+enum handler_ids
+{
+ TVITEM_NEW_HANDLER,
+ TVITEM_OLD_HANDLER
+};
+
static struct notify_test_info
{
UINT unicode;
@@ -82,6 +88,7 @@ static struct notify_test_info
BOOL received;
UINT test_id;
UINT sub_test_id;
+ UINT handler_id;
/* Text field conversion test behavior flag */
DWORD flags;
} notify_test_info;
@@ -123,6 +130,7 @@ struct generic_text_helper_para
UINT code_unicode;
UINT code_ansi;
DWORD flags;
+ UINT handler_id;
};
static const struct notify_test_send test_convert_send_data[] =
@@ -850,6 +858,39 @@ static LRESULT WINAPI test_notify_proc(HWND hwnd, UINT message, WPARAM wParam, L
notify_tooltip_handler((NMTTDISPINFOA *)hdr);
break;
}
+ /* Tree View */
+ case TVN_BEGINLABELEDITA:
+ case TVN_ENDLABELEDITA:
+ case TVN_GETDISPINFOA:
+ case TVN_SETDISPINFOA:
+ {
+ NMTVDISPINFOA *nmtvdi = (NMTVDISPINFOA *)hdr;
+ notify_generic_text_handler(&nmtvdi->item.pszText, &nmtvdi->item.cchTextMax);
+ break;
+ }
+ case TVN_GETINFOTIPA:
+ {
+ NMTVGETINFOTIPA *nmtvgit = (NMTVGETINFOTIPA *)hdr;
+ notify_generic_text_handler(&nmtvgit->pszText, &nmtvgit->cchTextMax);
+ break;
+ }
+ case TVN_SINGLEEXPAND:
+ case TVN_BEGINDRAGA:
+ case TVN_BEGINRDRAGA:
+ case TVN_ITEMEXPANDEDA:
+ case TVN_ITEMEXPANDINGA:
+ case TVN_DELETEITEMA:
+ case TVN_SELCHANGINGA:
+ case TVN_SELCHANGEDA:
+ {
+ NMTREEVIEWA *nmtv = (NMTREEVIEWA *)hdr;
+ if (notify_test_info.handler_id == TVITEM_NEW_HANDLER)
+ notify_generic_text_handler((CHAR **)&nmtv->itemNew.pszText, &nmtv->itemNew.cchTextMax);
+ else
+ notify_generic_text_handler((CHAR **)&nmtv->itemOld.pszText, &nmtv->itemOld.cchTextMax);
+ break;
+ }
+
default:
ok(0, "Unexpected message 0x%08x\n", hdr->code);
}
@@ -904,6 +945,7 @@ static void test_notify_generic_text_helper(HWND pager, const struct generic_tex
INT i;
notify_test_info.flags = para->flags;
+ notify_test_info.handler_id = para->handler_id;
if (para->flags & (CONVERT_SEND | DONT_CONVERT_SEND))
{
@@ -1141,6 +1183,10 @@ static void test_wm_notify(void)
static NMTOOLBARW nmtb;
static NMTBDISPINFOW nmtbdi;
static NMTBGETINFOTIPW nmtbgit;
+ /* Tree View */
+ static NMTVDISPINFOW nmtvdi;
+ static NMTVGETINFOTIPW nmtvgit;
+ static NMTREEVIEWW nmtv;
static const struct generic_text_helper_para paras[] =
{
/* Combo Box Ex */
@@ -1185,7 +1231,50 @@ static void test_wm_notify(void)
{&nmtb, sizeof(nmtb), NULL, 0, &nmtb.pszText, &nmtb.cchText, TBN_GETBUTTONINFOW, TBN_GETBUTTONINFOA,
SEND_EMPTY_IF_NULL | CONVERT_SEND | CONVERT_RECEIVE},
{&nmtbgit, sizeof(nmtbgit), NULL, 0, &nmtbgit.pszText, &nmtbgit.cchTextMax, TBN_GETINFOTIPW, TBN_GETINFOTIPA,
- DONT_CONVERT_SEND | CONVERT_RECEIVE}
+ DONT_CONVERT_SEND | CONVERT_RECEIVE},
+ /* Tree View */
+ {&nmtvdi, sizeof(nmtvdi), &nmtvdi.item.mask, TVIF_TEXT, &nmtvdi.item.pszText, &nmtvdi.item.cchTextMax,
+ TVN_BEGINLABELEDITW, TVN_BEGINLABELEDITA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmtvdi, sizeof(nmtvdi), &nmtvdi.item.mask, TVIF_TEXT, &nmtvdi.item.pszText, &nmtvdi.item.cchTextMax,
+ TVN_ENDLABELEDITW, TVN_ENDLABELEDITA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmtvdi, sizeof(nmtvdi), &nmtvdi.item.mask, TVIF_TEXT, &nmtvdi.item.pszText, &nmtvdi.item.cchTextMax,
+ TVN_GETDISPINFOW, TVN_GETDISPINFOA, ZERO_SEND | DONT_CONVERT_SEND| CONVERT_RECEIVE},
+ {&nmtvdi, sizeof(nmtvdi), &nmtvdi.item.mask, TVIF_TEXT, &nmtvdi.item.pszText, &nmtvdi.item.cchTextMax,
+ TVN_SETDISPINFOW, TVN_SETDISPINFOA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmtvgit, sizeof(nmtvgit), NULL, 0, &nmtvgit.pszText, &nmtvgit.cchTextMax, TVN_GETINFOTIPW, TVN_GETINFOTIPA,
+ DONT_CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_SINGLEEXPAND, TVN_SINGLEEXPAND, DONT_CONVERT_SEND | DONT_CONVERT_RECEIVE, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_SINGLEEXPAND, TVN_SINGLEEXPAND, DONT_CONVERT_SEND | DONT_CONVERT_RECEIVE, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_BEGINDRAGW, TVN_BEGINDRAGA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_BEGINDRAGW, TVN_BEGINDRAGA, DONT_CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_BEGINRDRAGW, TVN_BEGINRDRAGA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_BEGINRDRAGW, TVN_BEGINRDRAGA, DONT_CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_ITEMEXPANDEDW, TVN_ITEMEXPANDEDA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_ITEMEXPANDEDW, TVN_ITEMEXPANDEDA, DONT_CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_ITEMEXPANDINGW, TVN_ITEMEXPANDINGA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_ITEMEXPANDINGW, TVN_ITEMEXPANDINGA, DONT_CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_DELETEITEMW, TVN_DELETEITEMA, DONT_CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_DELETEITEMW, TVN_DELETEITEMA, CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_SELCHANGINGW, TVN_SELCHANGINGA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_SELCHANGINGW, TVN_SELCHANGINGA, CONVERT_SEND, TVITEM_OLD_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemNew.mask, TVIF_TEXT, &nmtv.itemNew.pszText, &nmtv.itemNew.cchTextMax,
+ TVN_SELCHANGEDW, TVN_SELCHANGEDA, CONVERT_SEND, TVITEM_NEW_HANDLER},
+ {&nmtv, sizeof(nmtv), &nmtv.itemOld.mask, TVIF_TEXT, &nmtv.itemOld.pszText, &nmtv.itemOld.cchTextMax,
+ TVN_SELCHANGEDW, TVN_SELCHANGEDA, CONVERT_SEND, TVITEM_OLD_HANDLER}
};
INT i;
--
2.18.0
Sept. 24, 2018
[PATCH 3/4] comctl32/pager: Support list view notification conversion.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/pager.c | 36 +++++++++++++++++++++++++++++++
dlls/comctl32/tests/pager.c | 42 +++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+)
diff --git a/dlls/comctl32/pager.c b/dlls/comctl32/pager.c
index 31c8f5efe6..343c330969 100644
--- a/dlls/comctl32/pager.c
+++ b/dlls/comctl32/pager.c
@@ -1061,6 +1061,14 @@ static UINT PAGER_GetAnsiNtfCode(UINT code)
case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
case HDN_ITEMDBLCLICKW: return HDN_ITEMDBLCLICKA;
case HDN_TRACKW: return HDN_TRACKA;
+ /* List View */
+ case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+ case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+ case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+ case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
+ case LVN_INCREMENTALSEARCHW: return LVN_INCREMENTALSEARCHA;
+ case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+ case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
/* Toolbar */
case TBN_GETBUTTONINFOW: return TBN_GETBUTTONINFOA;
case TBN_GETINFOTIPW: return TBN_GETINFOTIPA;
@@ -1275,6 +1283,34 @@ static LRESULT PAGER_Notify(PAGER_INFO *infoPtr, NMHDR *hdr)
return PAGER_SendConvertedNotify(infoPtr, hdr, &nmhddi->mask, HDI_TEXT, &nmhddi->pszText, &nmhddi->cchTextMax,
SEND_EMPTY_IF_NULL | CONVERT_SEND | CONVERT_RECEIVE);
}
+ /* List View */
+ case LVN_BEGINLABELEDITW:
+ case LVN_ENDLABELEDITW:
+ case LVN_SETDISPINFOW:
+ {
+ NMLVDISPINFOW *nmlvdi = (NMLVDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmlvdi->item.mask, LVIF_TEXT, &nmlvdi->item.pszText,
+ &nmlvdi->item.cchTextMax, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE);
+ }
+ case LVN_GETDISPINFOW:
+ {
+ NMLVDISPINFOW *nmlvdi = (NMLVDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmlvdi->item.mask, LVIF_TEXT, &nmlvdi->item.pszText,
+ &nmlvdi->item.cchTextMax, CONVERT_RECEIVE);
+ }
+ case LVN_GETINFOTIPW:
+ {
+ NMLVGETINFOTIPW *nmlvgit = (NMLVGETINFOTIPW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, NULL, 0, &nmlvgit->pszText, &nmlvgit->cchTextMax,
+ CONVERT_SEND | CONVERT_RECEIVE);
+ }
+ case LVN_INCREMENTALSEARCHW:
+ case LVN_ODFINDITEMW:
+ {
+ NMLVFINDITEMW *nmlvfi = (NMLVFINDITEMW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmlvfi->lvfi.flags, LVFI_STRING | LVFI_SUBSTRING,
+ (WCHAR **)&nmlvfi->lvfi.psz, NULL, CONVERT_SEND);
+ }
/* Toolbar */
case TBN_GETBUTTONINFOW:
{
diff --git a/dlls/comctl32/tests/pager.c b/dlls/comctl32/tests/pager.c
index a2a6f9cd37..05fbc55fa2 100644
--- a/dlls/comctl32/tests/pager.c
+++ b/dlls/comctl32/tests/pager.c
@@ -790,6 +790,29 @@ static LRESULT WINAPI test_notify_proc(HWND hwnd, UINT message, WPARAM wParam, L
notify_generic_text_handler(&nmhddi->pszText, &nmhddi->cchTextMax);
break;
}
+ /* List View */
+ case LVN_BEGINLABELEDITA:
+ case LVN_ENDLABELEDITA:
+ case LVN_GETDISPINFOA:
+ case LVN_SETDISPINFOA:
+ {
+ NMLVDISPINFOA *nmlvdi = (NMLVDISPINFOA *)hdr;
+ notify_generic_text_handler(&nmlvdi->item.pszText, &nmlvdi->item.cchTextMax);
+ break;
+ }
+ case LVN_GETINFOTIPA:
+ {
+ NMLVGETINFOTIPA *nmlvgit = (NMLVGETINFOTIPA *)hdr;
+ notify_generic_text_handler(&nmlvgit->pszText, &nmlvgit->cchTextMax);
+ break;
+ }
+ case LVN_INCREMENTALSEARCHA:
+ case LVN_ODFINDITEMA:
+ {
+ NMLVFINDITEMA *nmlvfi = (NMLVFINDITEMA *)hdr;
+ notify_generic_text_handler((CHAR **)&nmlvfi->lvfi.psz, NULL);
+ break;
+ }
/* Toolbar */
case TBN_SAVE:
{
@@ -1108,6 +1131,10 @@ static void test_wm_notify(void)
static NMDATETIMESTRINGW nmdts;
/* Header */
static NMHDDISPINFOW nmhddi;
+ /* List View */
+ static NMLVDISPINFOW nmlvdi;
+ static NMLVGETINFOTIPW nmlvgit;
+ static NMLVFINDITEMW nmlvfi;
/* Tool Bar */
static NMTBRESTORE nmtbr;
static NMTBSAVE nmtbs;
@@ -1133,6 +1160,21 @@ static void test_wm_notify(void)
/* Header */
{&nmhddi, sizeof(nmhddi), &nmhddi.mask, HDI_TEXT, &nmhddi.pszText, &nmhddi.cchTextMax, HDN_GETDISPINFOW,
HDN_GETDISPINFOA, SEND_EMPTY_IF_NULL | CONVERT_SEND | CONVERT_RECEIVE},
+ /* List View */
+ {&nmlvfi, sizeof(nmlvfi), &nmlvfi.lvfi.flags, LVFI_STRING, (WCHAR **)&nmlvfi.lvfi.psz, NULL,
+ LVN_INCREMENTALSEARCHW, LVN_INCREMENTALSEARCHA, CONVERT_SEND},
+ {&nmlvfi, sizeof(nmlvfi), &nmlvfi.lvfi.flags, LVFI_SUBSTRING, (WCHAR **)&nmlvfi.lvfi.psz, NULL, LVN_ODFINDITEMW,
+ LVN_ODFINDITEMA, CONVERT_SEND},
+ {&nmlvdi, sizeof(nmlvdi), &nmlvdi.item.mask, LVIF_TEXT, &nmlvdi.item.pszText, &nmlvdi.item.cchTextMax,
+ LVN_BEGINLABELEDITW, LVN_BEGINLABELEDITA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmlvdi, sizeof(nmlvdi), &nmlvdi.item.mask, LVIF_TEXT, &nmlvdi.item.pszText, &nmlvdi.item.cchTextMax,
+ LVN_ENDLABELEDITW, LVN_ENDLABELEDITA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmlvdi, sizeof(nmlvdi), &nmlvdi.item.mask, LVIF_TEXT, &nmlvdi.item.pszText, &nmlvdi.item.cchTextMax,
+ LVN_GETDISPINFOW, LVN_GETDISPINFOA, DONT_CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmlvdi, sizeof(nmlvdi), &nmlvdi.item.mask, LVIF_TEXT, &nmlvdi.item.pszText, &nmlvdi.item.cchTextMax,
+ LVN_SETDISPINFOW, LVN_SETDISPINFOA, SET_NULL_IF_NO_MASK | CONVERT_SEND | CONVERT_RECEIVE},
+ {&nmlvgit, sizeof(nmlvgit), NULL, 0, &nmlvgit.pszText, &nmlvgit.cchTextMax, LVN_GETINFOTIPW, LVN_GETINFOTIPA,
+ CONVERT_SEND | CONVERT_RECEIVE},
/* Tool Bar */
{&nmtbs, sizeof(nmtbs), NULL, 0, (WCHAR **)&nmtbs.tbButton.iString, NULL, TBN_SAVE, TBN_SAVE,
DONT_CONVERT_SEND | DONT_CONVERT_RECEIVE},
--
2.18.0
Sept. 24, 2018
[PATCH 2/4] comctl32/pager: Support header notification conversion.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/pager.c | 44 ++++++++++++++++++++
dlls/comctl32/tests/pager.c | 83 +++++++++++++++++++++++++++++++++++++
2 files changed, 127 insertions(+)
diff --git a/dlls/comctl32/pager.c b/dlls/comctl32/pager.c
index 605141b9ab..31c8f5efe6 100644
--- a/dlls/comctl32/pager.c
+++ b/dlls/comctl32/pager.c
@@ -1051,6 +1051,16 @@ static UINT PAGER_GetAnsiNtfCode(UINT code)
case DTN_FORMATQUERYW: return DTN_FORMATQUERYA;
case DTN_USERSTRINGW: return DTN_USERSTRINGA;
case DTN_WMKEYDOWNW: return DTN_WMKEYDOWNA;
+ /* Header */
+ case HDN_BEGINTRACKW: return HDN_BEGINTRACKA;
+ case HDN_DIVIDERDBLCLICKW: return HDN_DIVIDERDBLCLICKA;
+ case HDN_ENDTRACKW: return HDN_ENDTRACKA;
+ case HDN_GETDISPINFOW: return HDN_GETDISPINFOA;
+ case HDN_ITEMCHANGEDW: return HDN_ITEMCHANGEDA;
+ case HDN_ITEMCHANGINGW: return HDN_ITEMCHANGINGA;
+ case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
+ case HDN_ITEMDBLCLICKW: return HDN_ITEMDBLCLICKA;
+ case HDN_TRACKW: return HDN_TRACKA;
/* Toolbar */
case TBN_GETBUTTONINFOW: return TBN_GETBUTTONINFOA;
case TBN_GETINFOTIPW: return TBN_GETINFOTIPA;
@@ -1231,6 +1241,40 @@ static LRESULT PAGER_Notify(PAGER_INFO *infoPtr, NMHDR *hdr)
NMDATETIMESTRINGW *nmdts = (NMDATETIMESTRINGW *)hdr;
return PAGER_SendConvertedNotify(infoPtr, hdr, NULL, 0, (WCHAR **)&nmdts->pszUserString, NULL, CONVERT_SEND);
}
+ /* Header */
+ case HDN_BEGINTRACKW:
+ case HDN_DIVIDERDBLCLICKW:
+ case HDN_ENDTRACKW:
+ case HDN_ITEMCHANGEDW:
+ case HDN_ITEMCHANGINGW:
+ case HDN_ITEMCLICKW:
+ case HDN_ITEMDBLCLICKW:
+ case HDN_TRACKW:
+ {
+ NMHEADERW *nmh = (NMHEADERW *)hdr;
+ WCHAR *oldText = NULL, *oldFilterText = NULL;
+ HD_TEXTFILTERW *tf = NULL;
+
+ hdr->code = PAGER_GetAnsiNtfCode(hdr->code);
+
+ if (!nmh->pitem) return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, hdr->idFrom, (LPARAM)hdr);
+ if (nmh->pitem->mask & HDI_TEXT) oldText = PAGER_ConvertText(&nmh->pitem->pszText);
+ if ((nmh->pitem->mask & HDI_FILTER) && (nmh->pitem->type == HDFT_ISSTRING) && nmh->pitem->pvFilter)
+ {
+ tf = (HD_TEXTFILTERW *)nmh->pitem->pvFilter;
+ oldFilterText = PAGER_ConvertText(&tf->pszText);
+ }
+ ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, hdr->idFrom, (LPARAM)hdr);
+ PAGER_RestoreText(&nmh->pitem->pszText, oldText);
+ if (tf) PAGER_RestoreText(&tf->pszText, oldFilterText);
+ return ret;
+ }
+ case HDN_GETDISPINFOW:
+ {
+ NMHDDISPINFOW *nmhddi = (NMHDDISPINFOW *)hdr;
+ return PAGER_SendConvertedNotify(infoPtr, hdr, &nmhddi->mask, HDI_TEXT, &nmhddi->pszText, &nmhddi->cchTextMax,
+ SEND_EMPTY_IF_NULL | CONVERT_SEND | CONVERT_RECEIVE);
+ }
/* Toolbar */
case TBN_GETBUTTONINFOW:
{
diff --git a/dlls/comctl32/tests/pager.c b/dlls/comctl32/tests/pager.c
index 8993118711..a2a6f9cd37 100644
--- a/dlls/comctl32/tests/pager.c
+++ b/dlls/comctl32/tests/pager.c
@@ -751,6 +751,45 @@ static LRESULT WINAPI test_notify_proc(HWND hwnd, UINT message, WPARAM wParam, L
notify_generic_text_handler((CHAR **)&nmdts->pszUserString, NULL);
break;
}
+ /* Header */
+ case HDN_BEGINDRAG:
+ case HDN_ENDDRAG:
+ case HDN_BEGINFILTEREDIT:
+ case HDN_ENDFILTEREDIT:
+ case HDN_DROPDOWN:
+ case HDN_FILTERCHANGE:
+ case HDN_ITEMKEYDOWN:
+ case HDN_ITEMSTATEICONCLICK:
+ case HDN_OVERFLOWCLICK:
+ {
+ NMHEADERW *nmhd = (NMHEADERW *)hdr;
+ ok(!lstrcmpW(nmhd->pitem->pszText, test_w), "Expect %s, got %s\n", wine_dbgstr_w(test_w),
+ wine_dbgstr_w(nmhd->pitem->pszText));
+ ok(!lstrcmpW(((HD_TEXTFILTERW *)nmhd->pitem->pvFilter)->pszText, test_w), "Expect %s, got %s\n",
+ wine_dbgstr_w(test_w), wine_dbgstr_w(((HD_TEXTFILTERW *)nmhd->pitem->pvFilter)->pszText));
+ break;
+ }
+ case HDN_BEGINTRACKA:
+ case HDN_DIVIDERDBLCLICKA:
+ case HDN_ENDTRACKA:
+ case HDN_ITEMCHANGEDA:
+ case HDN_ITEMCHANGINGA:
+ case HDN_ITEMCLICKA:
+ case HDN_ITEMDBLCLICKA:
+ case HDN_TRACKA:
+ {
+ NMHEADERA *nmhd = (NMHEADERA *)hdr;
+ ok(!lstrcmpA(nmhd->pitem->pszText, test_a), "Expect %s, got %s\n", test_a, nmhd->pitem->pszText);
+ ok(!lstrcmpA(((HD_TEXTFILTERA *)nmhd->pitem->pvFilter)->pszText, test_a), "Expect %s, got %s\n", test_a,
+ ((HD_TEXTFILTERA *)nmhd->pitem->pvFilter)->pszText);
+ break;
+ }
+ case HDN_GETDISPINFOA:
+ {
+ NMHDDISPINFOA *nmhddi = (NMHDDISPINFOA *)hdr;
+ notify_generic_text_handler(&nmhddi->pszText, &nmhddi->cchTextMax);
+ break;
+ }
/* Toolbar */
case TBN_SAVE:
{
@@ -875,6 +914,14 @@ static void test_notify_generic_text_helper(HWND pager, const struct generic_tex
}
}
+#ifdef _WIN64
+ if (para->code_unicode == HDN_GETDISPINFOW && !strcmp(winetest_platform, "windows"))
+ {
+ skip("Replace text pointer test for HDN_GETDISPINFOW crashes with 64bit cross test on 64bit Windows\n");
+ return;
+ }
+#endif
+
if (para->flags & (CONVERT_RECEIVE | DONT_CONVERT_RECEIVE))
{
if (para->flags & CONVERT_RECEIVE)
@@ -981,6 +1028,36 @@ static void test_wm_notify_datetime(HWND pager)
}
}
+static void test_wm_notify_header(HWND pager)
+{
+ NMHEADERW nmh = {0};
+ HDITEMW hdi = {0};
+ HD_TEXTFILTERW hdtf = {0};
+
+ hdi.mask = HDI_TEXT | HDI_FILTER;
+ hdi.pszText = test_w;
+ hdtf.pszText = test_w;
+ nmh.pitem = &hdi;
+ nmh.pitem->pvFilter = &hdtf;
+ send_notify(pager, HDN_BEGINDRAG, HDN_BEGINDRAG, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ENDDRAG, HDN_ENDDRAG, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_BEGINFILTEREDIT, HDN_BEGINFILTEREDIT, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ENDFILTEREDIT, HDN_ENDFILTEREDIT, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_DROPDOWN, HDN_DROPDOWN, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_FILTERCHANGE, HDN_FILTERCHANGE, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMKEYDOWN, HDN_ITEMKEYDOWN, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMSTATEICONCLICK, HDN_ITEMSTATEICONCLICK, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_OVERFLOWCLICK, HDN_OVERFLOWCLICK, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_BEGINTRACKW, HDN_BEGINTRACKA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_DIVIDERDBLCLICKW, HDN_DIVIDERDBLCLICKA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ENDTRACKW, HDN_ENDTRACKA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMCHANGEDW, HDN_ITEMCHANGEDA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMCHANGINGW, HDN_ITEMCHANGINGA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMCLICKW, HDN_ITEMCLICKA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_ITEMDBLCLICKW, HDN_ITEMDBLCLICKA, (LPARAM)&nmh, TRUE);
+ send_notify(pager, HDN_TRACKW, HDN_TRACKA, (LPARAM)&nmh, TRUE);
+}
+
static void test_wm_notify_tooltip(HWND pager)
{
NMTTDISPINFOW nmttdi;
@@ -1029,6 +1106,8 @@ static void test_wm_notify(void)
static NMDATETIMEFORMATQUERYW nmdtfq;
static NMDATETIMEWMKEYDOWNW nmdtkd;
static NMDATETIMESTRINGW nmdts;
+ /* Header */
+ static NMHDDISPINFOW nmhddi;
/* Tool Bar */
static NMTBRESTORE nmtbr;
static NMTBSAVE nmtbs;
@@ -1051,6 +1130,9 @@ static void test_wm_notify(void)
CONVERT_SEND},
{&nmdts, sizeof(nmdts), NULL, 0, (WCHAR **)&nmdts.pszUserString, NULL, DTN_USERSTRINGW, DTN_USERSTRINGA,
CONVERT_SEND},
+ /* Header */
+ {&nmhddi, sizeof(nmhddi), &nmhddi.mask, HDI_TEXT, &nmhddi.pszText, &nmhddi.cchTextMax, HDN_GETDISPINFOW,
+ HDN_GETDISPINFOA, SEND_EMPTY_IF_NULL | CONVERT_SEND | CONVERT_RECEIVE},
/* Tool Bar */
{&nmtbs, sizeof(nmtbs), NULL, 0, (WCHAR **)&nmtbs.tbButton.iString, NULL, TBN_SAVE, TBN_SAVE,
DONT_CONVERT_SEND | DONT_CONVERT_RECEIVE},
@@ -1081,6 +1163,7 @@ static void test_wm_notify(void)
/* Tests for those that can't be covered by generic text test helper */
test_wm_notify_comboboxex(pager);
test_wm_notify_datetime(pager);
+ test_wm_notify_header(pager);
test_wm_notify_tooltip(pager);
DestroyWindow(parent);
--
2.18.0
Sept. 24, 2018