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
November 2021
- 83 participants
- 2620 messages
[PATCH 3/7] winegstreamer: Don't set bTemporalCompression for WMF video formats.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/quartz_parser.c | 3 ++-
dlls/wmvcore/tests/wmvcore.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 4cc4795a5ff..e0f82878cea 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -316,7 +316,8 @@ static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *
mt->subtype = *format_table[format->u.video.format].subtype;
if (wm)
mt->bFixedSizeSamples = TRUE;
- mt->bTemporalCompression = TRUE;
+ else
+ mt->bTemporalCompression = TRUE;
mt->lSampleSize = 1;
mt->formattype = FORMAT_VideoInfo;
mt->cbFormat = sizeof(VIDEOINFOHEADER);
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index fa730c978e3..bc7d044b39b 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -626,7 +626,7 @@ static void check_video_type(const WM_MEDIA_TYPE *mt)
ok(IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo), "Got format %s.\n", debugstr_guid(&mt->formattype));
ok(mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", mt->bFixedSizeSamples);
- todo_wine ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression);
+ ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression);
ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk);
ok(EqualRect(&video_info->rcSource, &rect), "Got source rect %s.\n", wine_dbgstr_rect(&rect));
--
2.33.0
Nov. 2, 2021
[PATCH 2/7] winegstreamer: Set bFixedSizeSamples for WMF video formats.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/quartz_parser.c | 2 ++
dlls/wmvcore/tests/wmvcore.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 77a186bbb26..4cc4795a5ff 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -314,6 +314,8 @@ static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *
mt->majortype = MEDIATYPE_Video;
mt->subtype = *format_table[format->u.video.format].subtype;
+ if (wm)
+ mt->bFixedSizeSamples = TRUE;
mt->bTemporalCompression = TRUE;
mt->lSampleSize = 1;
mt->formattype = FORMAT_VideoInfo;
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 469666161a4..fa730c978e3 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -625,7 +625,7 @@ static void check_video_type(const WM_MEDIA_TYPE *mt)
static const RECT rect = {.right = 64, .bottom = 48};
ok(IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo), "Got format %s.\n", debugstr_guid(&mt->formattype));
- todo_wine ok(mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", mt->bFixedSizeSamples);
+ ok(mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", mt->bFixedSizeSamples);
todo_wine ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression);
ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk);
--
2.33.0
Nov. 2, 2021
[PATCH 1/7] winegstreamer: Set rcSource and rcTarget for WMF video formats.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/winegstreamer/gst_private.h | 2 +-
dlls/winegstreamer/quartz_parser.c | 29 +++++++++++++++++------------
dlls/winegstreamer/wm_reader.c | 4 ++--
dlls/wmvcore/tests/wmvcore.c | 4 ++--
4 files changed, 22 insertions(+), 17 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 109ce6ab28f..f11543d7fb2 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -101,7 +101,7 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN
HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN;
-bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format);
+bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm);
bool amt_to_wg_format(const AM_MEDIA_TYPE *mt, struct wg_format *format);
BOOL init_gstreamer(void) DECLSPEC_HIDDEN;
diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c
index 4e7e22a64ea..77a186bbb26 100644
--- a/dlls/winegstreamer/quartz_parser.c
+++ b/dlls/winegstreamer/quartz_parser.c
@@ -275,7 +275,7 @@ static unsigned int get_image_size(const struct wg_format *format)
return 0;
}
-static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *format)
+static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm)
{
static const struct
{
@@ -322,6 +322,11 @@ static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *
memset(video_format, 0, sizeof(*video_format));
+ if (wm)
+ {
+ SetRect(&video_format->rcSource, 0, 0, format->u.video.width, format->u.video.height);
+ video_format->rcTarget = video_format->rcSource;
+ }
if ((frame_time = MulDiv(10000000, format->u.video.fps_d, format->u.video.fps_n)) != -1)
video_format->AvgTimePerFrame = frame_time;
video_format->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
@@ -343,7 +348,7 @@ static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *
return true;
}
-bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format)
+bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm)
{
memset(mt, 0, sizeof(*mt));
@@ -356,7 +361,7 @@ bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format)
return amt_from_wg_format_audio(mt, format);
case WG_MAJOR_TYPE_VIDEO:
- return amt_from_wg_format_video(mt, format);
+ return amt_from_wg_format_video(mt, format, wm);
}
assert(0);
@@ -1076,7 +1081,7 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin,
memset(mt, 0, sizeof(AM_MEDIA_TYPE));
- if (amt_from_wg_format(mt, &format))
+ if (amt_from_wg_format(mt, &format, false))
{
if (!index--)
return S_OK;
@@ -1086,14 +1091,14 @@ static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin,
if (format.major_type == WG_MAJOR_TYPE_VIDEO && index < ARRAY_SIZE(video_formats))
{
format.u.video.format = video_formats[index];
- if (!amt_from_wg_format(mt, &format))
+ if (!amt_from_wg_format(mt, &format, false))
return E_OUTOFMEMORY;
return S_OK;
}
else if (format.major_type == WG_MAJOR_TYPE_AUDIO && !index)
{
format.u.audio.format = WG_AUDIO_FORMAT_S16LE;
- if (!amt_from_wg_format(mt, &format))
+ if (!amt_from_wg_format(mt, &format, false))
return E_OUTOFMEMORY;
return S_OK;
}
@@ -1613,7 +1618,7 @@ static HRESULT wave_parser_source_query_accept(struct parser_source *pin, const
HRESULT hr;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(&pad_mt, &format))
+ if (!amt_from_wg_format(&pad_mt, &format, false))
return E_OUTOFMEMORY;
hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE;
FreeMediaType(&pad_mt);
@@ -1628,7 +1633,7 @@ static HRESULT wave_parser_source_get_media_type(struct parser_source *pin,
if (index > 0)
return VFW_S_NO_MORE_ITEMS;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(mt, &format))
+ if (!amt_from_wg_format(mt, &format, false))
return E_OUTOFMEMORY;
return S_OK;
}
@@ -1699,7 +1704,7 @@ static HRESULT avi_splitter_source_query_accept(struct parser_source *pin, const
HRESULT hr;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(&pad_mt, &format))
+ if (!amt_from_wg_format(&pad_mt, &format, false))
return E_OUTOFMEMORY;
hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE;
FreeMediaType(&pad_mt);
@@ -1714,7 +1719,7 @@ static HRESULT avi_splitter_source_get_media_type(struct parser_source *pin,
if (index > 0)
return VFW_S_NO_MORE_ITEMS;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(mt, &format))
+ if (!amt_from_wg_format(mt, &format, false))
return E_OUTOFMEMORY;
return S_OK;
}
@@ -1783,7 +1788,7 @@ static HRESULT mpeg_splitter_source_query_accept(struct parser_source *pin, cons
HRESULT hr;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(&pad_mt, &format))
+ if (!amt_from_wg_format(&pad_mt, &format, false))
return E_OUTOFMEMORY;
hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE;
FreeMediaType(&pad_mt);
@@ -1798,7 +1803,7 @@ static HRESULT mpeg_splitter_source_get_media_type(struct parser_source *pin,
if (index > 0)
return VFW_S_NO_MORE_ITEMS;
wg_parser_stream_get_preferred_format(pin->wg_stream, &format);
- if (!amt_from_wg_format(mt, &format))
+ if (!amt_from_wg_format(mt, &format, false))
return E_OUTOFMEMORY;
return S_OK;
}
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 82f74318062..1d46db3fb0d 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -157,7 +157,7 @@ static IWMOutputMediaProps *output_props_create(const struct wg_format *format)
object->IWMOutputMediaProps_iface.lpVtbl = &output_props_vtbl;
object->refcount = 1;
- if (!amt_from_wg_format(&object->mt, format))
+ if (!amt_from_wg_format(&object->mt, format, true))
{
free(object);
return NULL;
@@ -338,7 +338,7 @@ static HRESULT WINAPI stream_config_GetStreamType(IWMStreamConfig *iface, GUID *
EnterCriticalSection(&reader->cs);
- if (!amt_from_wg_format(&mt, &config->stream->format))
+ if (!amt_from_wg_format(&mt, &config->stream->format, true))
{
LeaveCriticalSection(&reader->cs);
return E_OUTOFMEMORY;
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 6e196234208..469666161a4 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -629,8 +629,8 @@ static void check_video_type(const WM_MEDIA_TYPE *mt)
todo_wine ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression);
ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk);
- todo_wine ok(EqualRect(&video_info->rcSource, &rect), "Got source rect %s.\n", wine_dbgstr_rect(&rect));
- todo_wine ok(EqualRect(&video_info->rcTarget, &rect), "Got target rect %s.\n", wine_dbgstr_rect(&rect));
+ ok(EqualRect(&video_info->rcSource, &rect), "Got source rect %s.\n", wine_dbgstr_rect(&rect));
+ ok(EqualRect(&video_info->rcTarget, &rect), "Got target rect %s.\n", wine_dbgstr_rect(&rect));
ok(!video_info->dwBitRate, "Got bit rate %u.\n", video_info->dwBitRate);
ok(!video_info->dwBitErrorRate, "Got bit error rate %u.\n", video_info->dwBitErrorRate);
ok(video_info->bmiHeader.biSize == sizeof(video_info->bmiHeader),
--
2.33.0
Nov. 2, 2021
Re: [PATCH 2/2] server: Also queue hotkey message for WM_SYSKEYDOWN.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=101136
Your paranoid android.
=== w8adm (32 bit report) ===
user32:
msg.c:15240: Test failed: unexpected message 31f
msg.c:15241: Test failed: bad wparam 1
msg.c:15247: Test failed: unicode WM_CHAR: 0: the msg sequence is not complete: expected 0102 - actual 0000
=== w10pro64_he (64 bit report) ===
user32:
msg.c:12806: Test failed: message time not advanced: b9ba b9ba
msg.c:12807: Test failed: coords not changed: (101 101) (101 101)
msg.c:12824: Test failed: message time not advanced: b9ba b9ba
msg.c:12825: Test failed: coords not changed: (101 101) (101 101)
Nov. 2, 2021
Re: [PATCH v5 3/7] win32u: fix return value of StretchDIBits for EMF DC.
by Jin-oh Kang
On Tue, Nov 2, 2021 at 6:21 AM Jacek Caban <jacek(a)codeweavers.com> wrote:
>
> Hi Jinoh,
>
> On 11/1/21 6:30 AM, Jinoh Kang wrote:
> > Signed-off-by: Jinoh Kang <jinoh.kang.kr(a)gmail.com>
> > ---
> > dlls/win32u/emfdrv.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/dlls/win32u/emfdrv.c b/dlls/win32u/emfdrv.c
> > index e05f11d7b9a..395d51048d8 100644
> > --- a/dlls/win32u/emfdrv.c
> > +++ b/dlls/win32u/emfdrv.c
> > @@ -408,7 +408,7 @@ static INT CDECL EMFDRV_StretchDIBits( PHYSDEV dev, INT x_dst, INT y_dst, INT wi
> > UINT wUsage, DWORD dwRop )
> > {
> > /* FIXME: Update bound rect */
> > - return height_src;
> > + return abs( info->bmiHeader.biHeight );
> > }
> >
> > static INT CDECL EMFDRV_SetDIBitsToDevice( PHYSDEV dev, INT x_dst, INT y_dst, DWORD width,
>
>
> For this and the next patch, you could simply remove
> EMFDRV_StretchDIBits and EMFDRV_SetDIBitsToDevice and let the null
> driver take care of it.
The nulldrv code is still broken w.r.t. BI_RLE[48] case, so I guess
that side needs fixing?
> I originally left it because of bound rect
> update (that's supposed to happen in win32u instead of of gdi32), but
> that doesn't seem worth keeping it now.
I suppose the most ideal way to deal with it is to do normalization
early (in either gdi32 or NtGdi* functions) so that the calculation
code doesn't have to be duplicated between emfdc.c, EMFDRV and
nulldrv. Currently the args are passed as-is to both EMFDC and NtGdi*,
and the normalization work is done *twice*.
>
>
> Thanks,
>
> Jacek
>
Nov. 2, 2021
[PATCH 2/2] server: Also queue hotkey message for WM_SYSKEYDOWN.
by Ziqing Hui
ALT and F10 key generate WM_SYSKEYDOWN message.
They should also have the ability to queue hotkey message.
Signed-off-by: Ziqing Hui <zhui(a)codeweavers.com>
---
dlls/user32/tests/msg.c | 2 +-
server/queue.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 73737eab98b..c054a145112 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -17699,7 +17699,7 @@ static void test_hotkey(void)
}
DispatchMessageA(&msg);
}
- ok_sequence(WmHotkeyPressWithALT, "window hotkey press with ALT", TRUE);
+ ok_sequence(WmHotkeyPressWithALT, "window hotkey press with ALT", FALSE);
keybd_event(hotkey_letter, 0, KEYEVENTF_KEYUP, 0);
while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
diff --git a/server/queue.c b/server/queue.c
index 63a3a1fe2db..f7bc28f39e9 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1422,7 +1422,7 @@ static int queue_hotkey_message( struct desktop *desktop, struct message *msg )
struct hotkey *hotkey;
unsigned int modifiers = 0;
- if (msg->msg != WM_KEYDOWN) return 0;
+ if (msg->msg != WM_KEYDOWN && msg->msg != WM_SYSKEYDOWN) return 0;
if (desktop->keystate[VK_MENU] & 0x80) modifiers |= MOD_ALT;
if (desktop->keystate[VK_CONTROL] & 0x80) modifiers |= MOD_CONTROL;
--
2.25.1
Nov. 2, 2021
[PATCH 1/2] user32/tests: Add ALT+letter hotkey tests.
by Ziqing Hui
Signed-off-by: Ziqing Hui <zhui(a)codeweavers.com>
---
dlls/user32/tests/msg.c | 81 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 79 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 4b2495f4197..73737eab98b 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -17359,6 +17359,29 @@ static const struct message WmHotkeyNew[] = {
{ WM_KEYUP, sent, 0, 0x80000001 }, /* lparam not checked so the sequence isn't a todo */
{ 0 }
};
+static const struct message WmHotkeyPressALT[] = {
+ { WM_SYSKEYDOWN, kbd_hook|wparam|lparam, VK_LMENU, LLKHF_INJECTED|LLKHF_ALTDOWN },
+ { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_MENU, 0x20000001 },
+ { WM_SYSKEYDOWN, sent|wparam|lparam, VK_MENU, 0x20000001 },
+ { 0 }
+};
+static const struct message WmHotkeyPressWithALT[] = {
+ { WM_SYSKEYDOWN, kbd_hook, 0, LLKHF_INJECTED|LLKHF_ALTDOWN }, /* lparam not checked */
+ { WM_HOTKEY, sent|wparam, 6 },
+ { 0 }
+};
+static const struct message WmHotkeyReleaseWithALT[] = {
+ { WM_SYSKEYUP, kbd_hook|lparam, 0, LLKHF_INJECTED|LLKHF_UP|LLKHF_ALTDOWN },
+ { HCBT_KEYSKIPPED, hook|lparam|optional, 0, 0xa0000001 },
+ { WM_SYSKEYUP, sent|lparam, 0, 0xa0000001 },
+ { 0 }
+};
+static const struct message WmHotkeyReleaseALT[] = {
+ { WM_KEYUP, kbd_hook|wparam|lparam, VK_LMENU, LLKHF_INJECTED|LLKHF_UP },
+ { HCBT_KEYSKIPPED, hook|wparam|lparam|optional, VK_MENU, 0xc0000001 },
+ { WM_KEYUP, sent|wparam|lparam, VK_MENU, 0xc0000001 },
+ { 0 }
+};
static int hotkey_letter;
@@ -17378,9 +17401,12 @@ static LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam
msg.descr = "KeyboardHookProc";
add_message(&msg);
- if (wParam == WM_KEYUP || wParam == WM_KEYDOWN)
+ if (wParam == WM_KEYUP || wParam == WM_KEYDOWN ||
+ wParam == WM_SYSKEYUP || wParam == WM_SYSKEYDOWN)
{
- ok(kdbhookstruct->vkCode == VK_LWIN || kdbhookstruct->vkCode == hotkey_letter,
+ ok(kdbhookstruct->vkCode == VK_LWIN ||
+ kdbhookstruct->vkCode == VK_LMENU ||
+ kdbhookstruct->vkCode == hotkey_letter,
"unexpected keycode %x\n", kdbhookstruct->vkCode);
}
}
@@ -17635,6 +17661,56 @@ static void test_hotkey(void)
}
ok_sequence(WmHotkeyReleaseLWIN, "thread hotkey release LWIN", FALSE);
+ /* Search for an ALT + letter combination that hasn't been registered */
+ for (hotkey_letter = 0x41; hotkey_letter <= 0x51; hotkey_letter ++)
+ {
+ SetLastError(0xdeadbeef);
+ ret = RegisterHotKey(test_window, 6, MOD_ALT, hotkey_letter);
+
+ if (ret == TRUE)
+ {
+ break;
+ }
+ else
+ {
+ ok(GetLastError() == ERROR_HOTKEY_ALREADY_REGISTERED || broken(GetLastError() == 0xdeadbeef),
+ "unexpected error %d\n", GetLastError());
+ }
+ }
+
+ if (hotkey_letter == 0x52)
+ {
+ ok(0, "Couldn't find any free ALT + letter combination\n");
+ goto end;
+ }
+
+ keybd_event(VK_LMENU, 0, 0, 0);
+ while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
+ DispatchMessageA(&msg);
+ ok_sequence(WmHotkeyPressALT, "window hotkey press ALT", TRUE);
+
+ keybd_event(hotkey_letter, 0, 0, 0);
+ while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ if (msg.message == WM_HOTKEY)
+ {
+ ok(msg.hwnd == test_window, "unexpected hwnd %p\n", msg.hwnd);
+ ok(msg.lParam == MAKELPARAM(MOD_ALT, hotkey_letter), "unexpected WM_HOTKEY lparam %lx\n", msg.lParam);
+ }
+ DispatchMessageA(&msg);
+ }
+ ok_sequence(WmHotkeyPressWithALT, "window hotkey press with ALT", TRUE);
+
+ keybd_event(hotkey_letter, 0, KEYEVENTF_KEYUP, 0);
+ while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
+ DispatchMessageA(&msg);
+ ok_sequence(WmHotkeyReleaseWithALT, "window hotkey release with ALT", TRUE);
+
+ keybd_event(VK_LMENU, 0, KEYEVENTF_KEYUP, 0);
+ while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE))
+ DispatchMessageA(&msg);
+ ok_sequence(WmHotkeyReleaseALT, "window hotkey release ALT", FALSE);
+
/* Unregister thread hotkey */
ret = UnregisterHotKey(NULL, 5);
ok(ret == TRUE, "expected TRUE, got %i, err=%d\n", ret, GetLastError());
@@ -17645,6 +17721,7 @@ static void test_hotkey(void)
end:
UnregisterHotKey(NULL, 5);
UnregisterHotKey(test_window, 5);
+ UnregisterHotKey(test_window, 6);
DestroyWindow(test_window);
flush_sequence();
}
--
2.25.1
Nov. 2, 2021
[PATCH 6/6] msdasql: Trace unsupported rowset interfaces.
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 15 +++++++++++++++
dlls/msdasql/tests/provider.c | 10 ++++++++++
2 files changed, 25 insertions(+)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index 5345701a35e..0298c7e7424 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -472,6 +472,21 @@ static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid,
{
*ppv = &rowset->IColumnsRowset_iface;
}
+ else if (IsEqualGUID(&IID_IRowsetChange, riid))
+ {
+ TRACE("IID_IRowsetChange not supported\n");
+ return E_NOINTERFACE;
+ }
+ else if (IsEqualGUID(&IID_IRowsetUpdate, riid))
+ {
+ TRACE("IID_IRowsetUpdate not supported\n");
+ return E_NOINTERFACE;
+ }
+ else if (IsEqualGUID(&IID_IRowsetLocate, riid))
+ {
+ TRACE("IID_IRowsetLocate not supported\n");
+ return E_NOINTERFACE;
+ }
if(*ppv)
{
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index f10156aacfa..8b076ed4479 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -228,6 +228,7 @@ static void test_rowset_interfaces(IRowset *rowset)
IColumnsInfo *col_info;
IColumnsRowset *col_rs;
IAccessor *accessor;
+ IUnknown *unk;
HRESULT hr;
hr = IRowset_QueryInterface(rowset, &IID_IRowsetInfo, (void**)&info);
@@ -245,6 +246,15 @@ static void test_rowset_interfaces(IRowset *rowset)
hr = IRowset_QueryInterface(rowset, &IID_IColumnsRowset, (void**)&col_rs);
ok(hr == S_OK, "got 0x%08x\n", hr);
IColumnsRowset_Release(col_rs);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IRowsetChange, (void**)&unk);
+ ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IRowsetUpdate, (void**)&unk);
+ ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IRowsetLocate, (void**)&unk);
+ ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
}
static void test_command_rowset(IUnknown *cmd)
--
2.33.0
Nov. 2, 2021
[PATCH 5/6] msdasql: Add IColumnsRowset support to rowset
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 55 +++++++++++++++++++++++++++++++++++
dlls/msdasql/tests/provider.c | 5 ++++
2 files changed, 60 insertions(+)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index f1e4eecb1ac..5345701a35e 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -415,6 +415,7 @@ struct msdasql_rowset
IRowsetInfo IRowsetInfo_iface;
IColumnsInfo IColumnsInfo_iface;
IAccessor IAccessor_iface;
+ IColumnsRowset IColumnsRowset_iface;
LONG refs;
};
@@ -438,6 +439,11 @@ static inline struct msdasql_rowset *impl_from_IAccessor ( IAccessor *iface )
return CONTAINING_RECORD( iface, struct msdasql_rowset, IAccessor_iface );
}
+static inline struct msdasql_rowset *impl_from_IColumnsRowset ( IColumnsRowset *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_rowset, IColumnsRowset_iface );
+}
+
static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid, void **ppv)
{
struct msdasql_rowset *rowset = impl_from_IRowset( iface );
@@ -462,6 +468,10 @@ static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid,
{
*ppv = &rowset->IAccessor_iface;
}
+ else if(IsEqualGUID(&IID_IColumnsRowset, riid))
+ {
+ *ppv = &rowset->IColumnsRowset_iface;
+ }
if(*ppv)
{
@@ -700,6 +710,50 @@ struct IAccessorVtbl accessor_vtbl =
rowset_accessor_ReleaseAccessor
};
+static HRESULT WINAPI column_rs_QueryInterface(IColumnsRowset *iface, REFIID riid, void **out)
+{
+ struct msdasql_rowset *rowset = impl_from_IColumnsRowset( iface );
+ return IRowset_QueryInterface(&rowset->IRowset_iface, riid, out);
+}
+
+static ULONG WINAPI column_rs_AddRef(IColumnsRowset *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IColumnsRowset( iface );
+ return IRowset_AddRef(&rowset->IRowset_iface);
+}
+
+static ULONG WINAPI column_rs_Release(IColumnsRowset *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IColumnsRowset( iface );
+ return IRowset_Release(&rowset->IRowset_iface);
+}
+
+static HRESULT WINAPI column_rs_GetAvailableColumns(IColumnsRowset *iface, DBORDINAL *count, DBID **columns)
+{
+ struct msdasql_rowset *rowset = impl_from_IColumnsRowset( iface );
+ FIXME("%p, %p, %p\n", rowset, count, columns);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI column_rs_GetColumnsRowset(IColumnsRowset *iface, IUnknown *outer, DBORDINAL count,
+ const DBID columns[], REFIID riid, ULONG property_cnt, DBPROPSET property_sets[], IUnknown **unk_rs)
+{
+ struct msdasql_rowset *rowset = impl_from_IColumnsRowset( iface );
+ FIXME("(%p)->(%p %ld %p %s %u, %p %p): stub\n", rowset, outer, count, columns, debugstr_guid(riid),
+ property_cnt, property_sets, unk_rs);
+ return E_NOTIMPL;
+}
+
+struct IColumnsRowsetVtbl columnrs_rs_vtbl =
+{
+ column_rs_QueryInterface,
+ column_rs_AddRef,
+ column_rs_Release,
+ column_rs_GetAvailableColumns,
+ column_rs_GetColumnsRowset
+};
+
+
static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFIID riid,
DBPARAMS *params, DBROWCOUNT *affected, IUnknown **rowset)
{
@@ -717,6 +771,7 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI
msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
msrowset->IColumnsInfo_iface.lpVtbl = &rowset_columninfo_vtbll;
msrowset->IAccessor_iface.lpVtbl = &accessor_vtbl;
+ msrowset->IColumnsRowset_iface.lpVtbl = &columnrs_rs_vtbl;
msrowset->refs = 1;
if (affected)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index 8acac93ddd8..f10156aacfa 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -226,6 +226,7 @@ static void test_rowset_interfaces(IRowset *rowset)
{
IRowsetInfo *info;
IColumnsInfo *col_info;
+ IColumnsRowset *col_rs;
IAccessor *accessor;
HRESULT hr;
@@ -240,6 +241,10 @@ static void test_rowset_interfaces(IRowset *rowset)
hr = IRowset_QueryInterface(rowset, &IID_IAccessor, (void**)&accessor);
ok(hr == S_OK, "got 0x%08x\n", hr);
IAccessor_Release(accessor);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IColumnsRowset, (void**)&col_rs);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IColumnsRowset_Release(col_rs);
}
static void test_command_rowset(IUnknown *cmd)
--
2.33.0
Nov. 2, 2021
[PATCH 4/6] msdasql: Add IAccessor to rowset
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 71 +++++++++++++++++++++++++++++++++++
dlls/msdasql/tests/provider.c | 5 +++
2 files changed, 76 insertions(+)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index 898cf6fa864..f1e4eecb1ac 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -414,6 +414,7 @@ struct msdasql_rowset
IRowset IRowset_iface;
IRowsetInfo IRowsetInfo_iface;
IColumnsInfo IColumnsInfo_iface;
+ IAccessor IAccessor_iface;
LONG refs;
};
@@ -432,6 +433,11 @@ static inline struct msdasql_rowset *rowset_impl_from_IColumnsInfo( IColumnsInfo
return CONTAINING_RECORD( iface, struct msdasql_rowset, IColumnsInfo_iface );
}
+static inline struct msdasql_rowset *impl_from_IAccessor ( IAccessor *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_rowset, IAccessor_iface );
+}
+
static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid, void **ppv)
{
struct msdasql_rowset *rowset = impl_from_IRowset( iface );
@@ -452,6 +458,10 @@ static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid,
{
*ppv = &rowset->IColumnsInfo_iface;
}
+ else if(IsEqualGUID(&IID_IAccessor, riid))
+ {
+ *ppv = &rowset->IAccessor_iface;
+ }
if(*ppv)
{
@@ -630,6 +640,66 @@ static struct IColumnsInfoVtbl rowset_columninfo_vtbll =
rowset_colsinfo_MapColumnIDs
};
+static HRESULT WINAPI rowset_accessor_QueryInterface(IAccessor *iface, REFIID riid, void **out)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ return IRowset_QueryInterface(&rowset->IRowset_iface, riid, out);
+}
+
+static ULONG WINAPI rowset_accessor_AddRef(IAccessor *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ return IRowset_AddRef(&rowset->IRowset_iface);
+}
+
+static ULONG WINAPI rowset_accessor_Release(IAccessor *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ return IRowset_Release(&rowset->IRowset_iface);
+}
+
+static HRESULT WINAPI rowset_accessor_AddRefAccessor(IAccessor *iface, HACCESSOR accessor, DBREFCOUNT *count)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ FIXME("%p, %lu, %p\n", rowset, accessor, count);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_accessor_CreateAccessor(IAccessor *iface, DBACCESSORFLAGS flags,
+ DBCOUNTITEM count, const DBBINDING bindings[], DBLENGTH row_size, HACCESSOR *accessor,
+ DBBINDSTATUS status[])
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ FIXME("%p 0x%08x, %lu, %p, %lu, %p, %p\n", rowset, flags, count, bindings, row_size, accessor, status);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_accessor_GetBindings(IAccessor *iface, HACCESSOR accessor,
+ DBACCESSORFLAGS *flags, DBCOUNTITEM *count, DBBINDING **bindings)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ FIXME("%p %lu, %p, %p, %p\n", rowset, accessor, flags, count, bindings);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_accessor_ReleaseAccessor(IAccessor *iface, HACCESSOR accessor, DBREFCOUNT *count)
+{
+ struct msdasql_rowset *rowset = impl_from_IAccessor( iface );
+ FIXME("%p, %lu, %p\n", rowset, accessor, count);
+ return E_NOTIMPL;
+}
+
+struct IAccessorVtbl accessor_vtbl =
+{
+ rowset_accessor_QueryInterface,
+ rowset_accessor_AddRef,
+ rowset_accessor_Release,
+ rowset_accessor_AddRefAccessor,
+ rowset_accessor_CreateAccessor,
+ rowset_accessor_GetBindings,
+ rowset_accessor_ReleaseAccessor
+};
+
static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFIID riid,
DBPARAMS *params, DBROWCOUNT *affected, IUnknown **rowset)
{
@@ -646,6 +716,7 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI
msrowset->IRowset_iface.lpVtbl = &msdasql_rowset_vtbl;
msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
msrowset->IColumnsInfo_iface.lpVtbl = &rowset_columninfo_vtbll;
+ msrowset->IAccessor_iface.lpVtbl = &accessor_vtbl;
msrowset->refs = 1;
if (affected)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index 708d6d22ed3..8acac93ddd8 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -226,6 +226,7 @@ static void test_rowset_interfaces(IRowset *rowset)
{
IRowsetInfo *info;
IColumnsInfo *col_info;
+ IAccessor *accessor;
HRESULT hr;
hr = IRowset_QueryInterface(rowset, &IID_IRowsetInfo, (void**)&info);
@@ -235,6 +236,10 @@ static void test_rowset_interfaces(IRowset *rowset)
hr = IRowset_QueryInterface(rowset, &IID_IColumnsInfo, (void**)&col_info);
ok(hr == S_OK, "got 0x%08x\n", hr);
IColumnsInfo_Release(col_info);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IAccessor, (void**)&accessor);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IAccessor_Release(accessor);
}
static void test_command_rowset(IUnknown *cmd)
--
2.33.0
Nov. 2, 2021