You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
94f00cd958 | ||
|
b22c061c3f | ||
|
0e42f8ce9a | ||
|
f2c44a8a4d | ||
|
8f0f175429 | ||
|
3fe7d402eb | ||
|
7fc2d64fee | ||
|
c6119e3d5c | ||
|
8ee2551c93 | ||
|
f0d1a4a5ba |
@@ -0,0 +1,134 @@
|
||||
From bdd925e61fa6ba20272960bfea8e0638d20060f1 Mon Sep 17 00:00:00 2001
|
||||
From: Jactry Zeng <jzeng@codeweavers.com>
|
||||
Date: Fri, 3 Jun 2022 02:50:29 -0500
|
||||
Subject: [PATCH 1/2] dwmapi: Fill rateRefresh/rateCompose and qpcRefreshPeriod
|
||||
of DWM_TIMING_INFO from DwmGetCompositionTimingInfo().
|
||||
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53035
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53038
|
||||
Signed-off-by: Jactry Zeng <jzeng@codeweavers.com>
|
||||
---
|
||||
dlls/dwmapi/Makefile.in | 1 +
|
||||
dlls/dwmapi/dwmapi_main.c | 27 ++++++++++++++++++++++++++-
|
||||
dlls/dwmapi/tests/Makefile.in | 2 +-
|
||||
dlls/dwmapi/tests/dwmapi.c | 22 ++++++++++++++++++++++
|
||||
4 files changed, 50 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/dwmapi/Makefile.in b/dlls/dwmapi/Makefile.in
|
||||
index e63dbc2ea00..37411a57608 100644
|
||||
--- a/dlls/dwmapi/Makefile.in
|
||||
+++ b/dlls/dwmapi/Makefile.in
|
||||
@@ -1,4 +1,5 @@
|
||||
MODULE = dwmapi.dll
|
||||
+IMPORTS = user32
|
||||
IMPORTLIB = dwmapi
|
||||
|
||||
EXTRADLLFLAGS = -Wb,--prefer-native
|
||||
diff --git a/dlls/dwmapi/dwmapi_main.c b/dlls/dwmapi/dwmapi_main.c
|
||||
index 6bb086a87d1..1fb522e389a 100644
|
||||
--- a/dlls/dwmapi/dwmapi_main.c
|
||||
+++ b/dlls/dwmapi/dwmapi_main.c
|
||||
@@ -211,12 +211,28 @@ HRESULT WINAPI DwmRegisterThumbnail(HWND dest, HWND src, PHTHUMBNAIL thumbnail_i
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
+static int get_display_frequency(void)
|
||||
+{
|
||||
+ DEVMODEA mode;
|
||||
+
|
||||
+ memset(&mode, 0, sizeof(mode));
|
||||
+ mode.dmSize = sizeof(mode);
|
||||
+ if (EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &mode))
|
||||
+ return mode.dmDisplayFrequency;
|
||||
+ else
|
||||
+ {
|
||||
+ WARN("Failed to query display frequency, returning a fallback value.\n");
|
||||
+ return 60;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/**********************************************************************
|
||||
* DwmGetCompositionTimingInfo (DWMAPI.@)
|
||||
*/
|
||||
HRESULT WINAPI DwmGetCompositionTimingInfo(HWND hwnd, DWM_TIMING_INFO *info)
|
||||
{
|
||||
- static int i;
|
||||
+ LARGE_INTEGER performance_frequency;
|
||||
+ static int i, display_frequency;
|
||||
|
||||
if (!info)
|
||||
return E_INVALIDARG;
|
||||
@@ -229,6 +245,15 @@ HRESULT WINAPI DwmGetCompositionTimingInfo(HWND hwnd, DWM_TIMING_INFO *info)
|
||||
memset(info, 0, info->cbSize);
|
||||
info->cbSize = sizeof(DWM_TIMING_INFO);
|
||||
|
||||
+ display_frequency = get_display_frequency();
|
||||
+ info->rateRefresh.uiNumerator = display_frequency;
|
||||
+ info->rateRefresh.uiDenominator = 1;
|
||||
+ info->rateCompose.uiNumerator = display_frequency;
|
||||
+ info->rateCompose.uiDenominator = 1;
|
||||
+
|
||||
+ QueryPerformanceFrequency(&performance_frequency);
|
||||
+ info->qpcRefreshPeriod = performance_frequency.QuadPart / display_frequency;
|
||||
+
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
diff --git a/dlls/dwmapi/tests/Makefile.in b/dlls/dwmapi/tests/Makefile.in
|
||||
index 6c6130401d6..e819e3ca09a 100644
|
||||
--- a/dlls/dwmapi/tests/Makefile.in
|
||||
+++ b/dlls/dwmapi/tests/Makefile.in
|
||||
@@ -1,5 +1,5 @@
|
||||
TESTDLL = dwmapi.dll
|
||||
-IMPORTS = dwmapi
|
||||
+IMPORTS = dwmapi user32
|
||||
|
||||
C_SRCS = \
|
||||
dwmapi.c
|
||||
diff --git a/dlls/dwmapi/tests/dwmapi.c b/dlls/dwmapi/tests/dwmapi.c
|
||||
index 696aa9c9d86..29dbcbe74bd 100644
|
||||
--- a/dlls/dwmapi/tests/dwmapi.c
|
||||
+++ b/dlls/dwmapi/tests/dwmapi.c
|
||||
@@ -35,7 +35,11 @@ static void test_DwmIsCompositionEnabled(void)
|
||||
|
||||
static void test_DwmGetCompositionTimingInfo(void)
|
||||
{
|
||||
+ LARGE_INTEGER performance_frequency;
|
||||
+ int result, display_frequency;
|
||||
DWM_TIMING_INFO timing_info;
|
||||
+ QPC_TIME refresh_period;
|
||||
+ DEVMODEA mode;
|
||||
BOOL enabled;
|
||||
HRESULT hr;
|
||||
|
||||
@@ -56,9 +60,27 @@ static void test_DwmGetCompositionTimingInfo(void)
|
||||
hr = DwmGetCompositionTimingInfo(NULL, &timing_info);
|
||||
ok(hr == MILERR_MISMATCHED_SIZE, "Got hr %#lx.\n", hr);
|
||||
|
||||
+ memset(&mode, 0, sizeof(mode));
|
||||
+ mode.dmSize = sizeof(mode);
|
||||
+ result = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &mode);
|
||||
+ ok(!!result, "Failed to get display mode %#lx.\n", GetLastError());
|
||||
+ display_frequency = mode.dmDisplayFrequency;
|
||||
+ ok(!!QueryPerformanceFrequency(&performance_frequency), "Failed to get performance counter frequency.\n");
|
||||
+ refresh_period = performance_frequency.QuadPart / display_frequency;
|
||||
+
|
||||
timing_info.cbSize = sizeof(timing_info);
|
||||
hr = DwmGetCompositionTimingInfo(NULL, &timing_info);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
+ ok(timing_info.cbSize == sizeof(timing_info), "Got wrong struct size %d.\n", timing_info.cbSize);
|
||||
+ ok(timing_info.rateRefresh.uiDenominator == 1 && timing_info.rateRefresh.uiNumerator == display_frequency,
|
||||
+ "Got wrong monitor refresh rate %d/%d.\n", timing_info.rateRefresh.uiDenominator,
|
||||
+ timing_info.rateRefresh.uiNumerator);
|
||||
+ ok(timing_info.rateCompose.uiDenominator == 1 && timing_info.rateCompose.uiNumerator == display_frequency,
|
||||
+ "Got wrong composition rate %d/%d.\n", timing_info.rateCompose.uiDenominator,
|
||||
+ timing_info.rateCompose.uiNumerator);
|
||||
+ ok(timing_info.qpcRefreshPeriod == refresh_period
|
||||
+ || broken(timing_info.qpcRefreshPeriod == display_frequency), /* win10 v1507 */
|
||||
+ "Got wrong monitor refresh period %s.\n", wine_dbgstr_longlong(timing_info.qpcRefreshPeriod));
|
||||
}
|
||||
|
||||
START_TEST(dwmapi)
|
||||
--
|
||||
2.35.1
|
||||
|
@@ -0,0 +1,27 @@
|
||||
From e1cdd6b53b73325cdb12815135162e43270df2ea Mon Sep 17 00:00:00 2001
|
||||
From: Jactry Zeng <jzeng@codeweavers.com>
|
||||
Date: Fri, 3 Jun 2022 02:50:30 -0500
|
||||
Subject: [PATCH 2/2] dwmapi: Return S_OK from DwmFlush().
|
||||
|
||||
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53035
|
||||
Signed-off-by: Jactry Zeng <jzeng@codeweavers.com>
|
||||
---
|
||||
dlls/dwmapi/dwmapi_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/dwmapi/dwmapi_main.c b/dlls/dwmapi/dwmapi_main.c
|
||||
index 1fb522e389a..1a65410c7eb 100644
|
||||
--- a/dlls/dwmapi/dwmapi_main.c
|
||||
+++ b/dlls/dwmapi/dwmapi_main.c
|
||||
@@ -92,7 +92,7 @@ HRESULT WINAPI DwmFlush(void)
|
||||
|
||||
if (!once++) FIXME("() stub\n");
|
||||
|
||||
- return E_NOTIMPL;
|
||||
+ return S_OK;
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
--
|
||||
2.35.1
|
||||
|
2
patches/dwmapi-DwmGetCompositionTimingInfo/definition
Normal file
2
patches/dwmapi-DwmGetCompositionTimingInfo/definition
Normal file
@@ -0,0 +1,2 @@
|
||||
Fixes: [53038] - dwmapi: Supply some defaults values for DwmGetCompositionTimingInfo.
|
||||
Fixes: [53035] - dwmapi: DwmFlush return S_OK.
|
File diff suppressed because it is too large
Load Diff
@@ -1,128 +0,0 @@
|
||||
From dca517521550923c881c95659f2309756c84d597 Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Maurer <dark.shadow4@web.de>
|
||||
Date: Sat, 8 Aug 2020 16:47:15 +0200
|
||||
Subject: [PATCH] kernelbase: Implement sortkey punctuation
|
||||
|
||||
Signed-off-by: Fabian Maurer <dark.shadow4@web.de>
|
||||
---
|
||||
dlls/kernel32/tests/locale.c | 29 +++++++++++++++++++++++++++++
|
||||
dlls/kernelbase/locale.c | 35 +++++++++++++++++++++++++++++++----
|
||||
2 files changed, 60 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
|
||||
index d875bf94f92..25c460f4175 100644
|
||||
--- a/dlls/kernel32/tests/locale.c
|
||||
+++ b/dlls/kernel32/tests/locale.c
|
||||
@@ -3210,6 +3210,35 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
|
||||
{ L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"A\x0301\x0301", L"A\x0301\x00ad\x0301" }, /* Unsortable combined with diacritics */
|
||||
{ L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"b\x07f2\x07f2", L"b\x07f2\x2064\x07f2" }, /* Unsortable combined with diacritics */
|
||||
{ L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"X\x0337\x0337", L"X\x0337\xfffd\x0337" }, /* Unsortable combined with diacritics */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORECASE, L"c", L"C" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORECASE, L"e", L"E" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORECASE, L"A", L"a" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x001b", L"\x001c" }, /* Punctuation primary weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0005", L"\x0006" }, /* Punctuation primary weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0027", L"\xff07", TRUE }, /* Punctuation diacritic/case weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x07f4", L"\x07f5", TRUE }, /* Punctuation diacritic/case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x207b", L"\x0008" }, /* Punctuation diacritic/case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x207b", L"\x0008" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0004", L"\x0011" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xff07", L"\x07f4" }, /* Punctuation primary weight has priority */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xfe32", L"\x2014" }, /* Punctuation primary weight has priority */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x058a", L"\x2027" }, /* Punctuation primary weight has priority */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS, L"\x207b", L"\x0008" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS, L"\x0004", L"\x0011" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x207b", L"\x0008" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, SORT_STRINGSORT, L"\x0004", L"\x0011" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x207b", L"\x0008" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x0004", L"\x0011" }, /* Punctuation */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, SORT_STRINGSORT, L"\x001a", L"\x001b" }, /* Punctuation main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x2027", L"\x2011" }, /* Punctuation main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x3030", L"\x301c" }, /* Punctuation main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x058a", L"\x2010" }, /* Punctuation diacritic weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x07F5", L"\x07F4" }, /* Punctuation diacritic weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe32", L"\x2013" }, /* Punctuation case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe31", L"\xfe58" }, /* Punctuation case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xff07", L"\x0027" }, /* Punctuation case weight */
|
||||
+
|
||||
+
|
||||
};
|
||||
|
||||
static void test_unicode_sorting(void)
|
||||
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
|
||||
index 3a29f3e8250..bce705ab484 100644
|
||||
--- a/dlls/kernelbase/locale.c
|
||||
+++ b/dlls/kernelbase/locale.c
|
||||
@@ -2556,7 +2556,11 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_PUNCTUATION:
|
||||
- /* TODO */
|
||||
+ if ((flags & NORM_IGNORESYMBOLS) || !(flags & SORT_STRINGSORT))
|
||||
+ break;
|
||||
+
|
||||
+ sortkey_add_weight(data, info.script_member);
|
||||
+ sortkey_add_weight(data, info.weight_primary);
|
||||
break;
|
||||
|
||||
case SORTKEY_SYMBOL_1:
|
||||
@@ -2619,7 +2623,9 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
break;
|
||||
|
||||
case SORTKEY_PUNCTUATION:
|
||||
- /* TODO */
|
||||
+ if ((flags & NORM_IGNORESYMBOLS) || !(flags & SORT_STRINGSORT))
|
||||
+ break;
|
||||
+ sortkey_add_diacritic_weight(data, info.weight_diacritic, last_weighted_pos);
|
||||
break;
|
||||
|
||||
case SORTKEY_SYMBOL_1:
|
||||
@@ -2660,7 +2666,9 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_PUNCTUATION:
|
||||
- /* TODO */
|
||||
+ if ((flags & NORM_IGNORESYMBOLS) || !(flags & SORT_STRINGSORT))
|
||||
+ break;
|
||||
+ sortkey_add_case_weight(data, flags, info.weight_case);
|
||||
break;
|
||||
|
||||
case SORTKEY_SYMBOL_1:
|
||||
@@ -2680,6 +2688,24 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
}
|
||||
}
|
||||
|
||||
+static void sortkey_add_special_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+ BYTE weight_second;
|
||||
+
|
||||
+ sortkey_get_char(&info, c);
|
||||
+
|
||||
+ if (info.script_member == SORTKEY_PUNCTUATION)
|
||||
+ {
|
||||
+ if ((flags & NORM_IGNORESYMBOLS) || (flags & SORT_STRINGSORT))
|
||||
+ return;
|
||||
+
|
||||
+ weight_second = (BYTE)(info.weight_diacritic * 8 + info.weight_case);
|
||||
+ sortkey_add_weight(data, info.weight_primary);
|
||||
+ sortkey_add_weight(data, weight_second);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, int str_len, BYTE *buffer, int buffer_len)
|
||||
{
|
||||
static const BYTE SORTKEY_SEPARATOR = 1;
|
||||
@@ -2721,7 +2747,8 @@ static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, in
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Special weights */
|
||||
- /* TODO */
|
||||
+ for (i = 0; i < str_len; i++)
|
||||
+ sortkey_add_special_weights(&data, flags, str[i]);
|
||||
sortkey_add_weight(&data, SORTKEY_TERMINATOR);
|
||||
|
||||
if (data.buffer_pos <= buffer_len || !buffer)
|
||||
--
|
||||
2.29.2
|
||||
|
@@ -1,273 +0,0 @@
|
||||
From 0f23a9db326dd6040b2d41fac99bd495f718d63d Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Maurer <dark.shadow4@web.de>
|
||||
Date: Sat, 8 Aug 2020 16:49:02 +0200
|
||||
Subject: [PATCH] kernelbase: Implement sortkey for Japanese characters
|
||||
|
||||
Signed-off-by: Fabian Maurer <dark.shadow4@web.de>
|
||||
---
|
||||
dlls/kernel32/tests/locale.c | 94 ++++++++++++++++++++++++++++++-
|
||||
dlls/kernelbase/locale.c | 104 +++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 192 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
|
||||
index 25c460f4175..43a244d2a6b 100644
|
||||
--- a/dlls/kernel32/tests/locale.c
|
||||
+++ b/dlls/kernel32/tests/locale.c
|
||||
@@ -3237,8 +3237,98 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe32", L"\x2013" }, /* Punctuation case weight */
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe31", L"\xfe58" }, /* Punctuation case weight */
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xff07", L"\x0027" }, /* Punctuation case weight */
|
||||
-
|
||||
-
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS, L"\x207b", L"\x0008" }, /* Punctuation NORM_IGNORESYMBOLS */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS, L"\x0004", L"\x0011" }, /* Punctuation NORM_IGNORESYMBOLS */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x207b", L"\x0008" }, /* Punctuation NORM_IGNORESYMBOLS SORT_STRINGSORT */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORESYMBOLS | SORT_STRINGSORT, L"\x0004", L"\x0011" }, /* Punctuation NORM_IGNORESYMBOLS SORT_STRINGSORT */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, SORT_STRINGSORT, L"\x001a", L"\x001b" }, /* Punctuation SORT_STRINGSORT main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x2027", L"\x2011", }, /* Punctuation SORT_STRINGSORT main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x3030", L"\x301c", }, /* Punctuation SORT_STRINGSORT main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x058a", L"\x2010" }, /* Punctuation SORT_STRINGSORT diacritic weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\x07F5", L"\x07F4" }, /* Punctuation SORT_STRINGSORT diacritic weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe32", L"\x2013" }, /* Punctuation SORT_STRINGSORT case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xfe31", L"\xfe58" }, /* Punctuation SORT_STRINGSORT case weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, SORT_STRINGSORT, L"\xff07", L"\x0027" }, /* Punctuation SORT_STRINGSORT case weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x04b0", L"\x32db" }, /* Japanese main weight */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x3093", L"\x1e62\x013f" }, /* Japanese main weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30d3", L"\x30d4" }, /* Japanese diacritic weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x307b", L"\x307c" }, /* Japanese diacritic weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30ea", L"\x32f7" }, /* Japanese diacritic weight */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x31fb", L"\x30e9" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30db", L"\x31f9" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xff6d", L"\xff95" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\x31fb", L"\x30e9" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\x30db", L"\x31f9" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\xff6d", L"\xff95" }, /* Japanese case weight small */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30d5", L"\x3075" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x306a", L"\x30ca" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x305a", L"\x30ba" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x30d5", L"\x3075" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x306a", L"\x30ca" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x305a", L"\x30ba" }, /* Japanese case weight kana */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30bf", L"\xff80" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30ab", L"\xff76" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30a2", L"\xff71" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\x30bf", L"\xff80" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\x30ab", L"\xff76" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\x30a2", L"\xff71" }, /* Japanese case weight width */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\x31a2", L"\x3110" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\x1342", L"\x133a" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNORENONSPACE, L"\x16a4", L"\x16a5" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30b1\x30f6", L"\xff79\x30b1" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30a6\x30a5", L"\xff73\x30a6" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30a8\x30a7", L"\xff74\x30a8" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30b1", L"\xff79" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30a6", L"\xff73" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30a8", L"\xff74" }, /* Kana small data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x3046\x30a9", L"\x30a6\x30aa" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x304a\x3041", L"\x30aa\x3042" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x3059\x30a7", L"\x30b9\x30a8" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x3046", L"\x30a6" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x304a", L"\x30aa" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x3059", L"\x30b9" }, /* Kana small data must have priority over kana type data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30a6\x30a8", L"\xff73\x3048" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30ab\x30a3", L"\xff76\x3043" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30b5\x30ac", L"\xff7b\x304c" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30a6", L"\xff73" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30ab", L"\xff76" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30b5", L"\xff7b" }, /* Kana type data must have priority over width data */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x305a a", L"\x30ba A" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30c1 b", L"\xff81 B" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xff8b x", L"\x31f6 X" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x305a", L"\x30ba" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30c1", L"\xff81" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\xff8b", L"\x31f6" }, /* Case weights have priority over extra weights */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0027\x31ff", L"\x007f\xff9b" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x07f5\x30f3", L"\x07f4\x3093" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xfe63\x30e0", L"\xff0d\x3080" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x0027", L"\x007f" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x07f5", L"\x07f4" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\xfe63", L"\xff0d" }, /* Extra weights have priority over special weights */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\xff68", L"\x30a3" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\xff75", L"\x30aa" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\x30e2", L"\xff93" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xff68", L"\x30a3" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\xff75", L"\x30aa" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x30e2", L"\xff93" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x30a8", L"\x3048" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x30af", L"\x304f" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREKANATYPE, L"\x3067", L"\x30c7" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30a8", L"\x3048" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x30af", L"\x304f" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x3067", L"\x30c7" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\xffb7", L"\x3147" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\xffb6", L"\x3146" },
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, NORM_IGNOREWIDTH, L"\x3145", L"\xffb5" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, NORM_IGNORECASE, L"\xffb7", L"\x3147" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, NORM_IGNORECASE, L"\xffb6", L"\x3146" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x3145", L"\xffb5" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, NORM_IGNORECASE, L"\x2cff", L"\x30ba" }, /* Coptic < Japanese */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, NORM_IGNORECASE, L"\x2cdb", L"\x32de" }, /* Coptic < Japanese */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, NORM_IGNORECASE, L"\x2ce0", L"\x30c6" }, /* Coptic < Japanese */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05d3", L"\x30ba" }, /* Hebrew > Japanese */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05e3", L"\x32de" }, /* Hebrew > Japanese */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05d7", L"\x30c6" }, /* Hebrew > Japanese */
|
||||
};
|
||||
|
||||
static void test_unicode_sorting(void)
|
||||
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
|
||||
index bce705ab484..feec402cb61 100644
|
||||
--- a/dlls/kernelbase/locale.c
|
||||
+++ b/dlls/kernelbase/locale.c
|
||||
@@ -2473,6 +2473,11 @@ enum sortkey_special_script
|
||||
|
||||
#define SORTKEY_MIN_WEIGHT 2
|
||||
|
||||
+const BYTE SORTKEY_FLAGS_EXTRA = 0xc4; /* Extra data added to the flags values */
|
||||
+const BYTE SORTKEY_FLAG_HIRAGANA = 0x20; /* if bit is set then hiragana, else katakana */
|
||||
+const BYTE SORTKEY_FLAG_LARGE = 0x02; /* if bit is set then normal kana, else small kana */
|
||||
+const BYTE SORTKEY_FLAG_FULLWIDTH = 0x01; /* if bit is set then full width, else half width */
|
||||
+
|
||||
struct character_info
|
||||
{
|
||||
BYTE weight_primary;
|
||||
@@ -2541,7 +2546,15 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_JAPANESE:
|
||||
- /* TODO */
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ sortkey_add_weight(data, 34);
|
||||
+ sortkey_add_weight(data, info.weight_primary);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case SORTKEY_JAMO:
|
||||
@@ -2614,7 +2627,12 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
break;
|
||||
|
||||
case SORTKEY_JAPANESE:
|
||||
- /* TODO */
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ sortkey_add_diacritic_weight(data, info.weight_diacritic, last_weighted_pos);
|
||||
break;
|
||||
|
||||
case SORTKEY_JAMO:
|
||||
@@ -2658,7 +2676,12 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_JAPANESE:
|
||||
- /* TODO */
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ sortkey_add_case_weight(data, flags, SORTKEY_MIN_WEIGHT);
|
||||
break;
|
||||
|
||||
case SORTKEY_CJK:
|
||||
@@ -2706,10 +2729,75 @@ static void sortkey_add_special_weights(struct sortkey_data *data, int flags, WC
|
||||
}
|
||||
}
|
||||
|
||||
+static void sortkey_add_extra_weights_small(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+
|
||||
+ sortkey_get_char(&info, c);
|
||||
+
|
||||
+ if (info.script_member == SORTKEY_JAPANESE)
|
||||
+ {
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (!(flags & NORM_IGNORENONSPACE))
|
||||
+ {
|
||||
+ sortkey_add_weight(data, (info.weight_case & SORTKEY_FLAG_LARGE) | SORTKEY_FLAGS_EXTRA);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void sortkey_add_extra_weights_kana(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+
|
||||
+ sortkey_get_char(&info, c);
|
||||
+
|
||||
+ if (info.script_member == SORTKEY_JAPANESE)
|
||||
+ {
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (flags & NORM_IGNOREKANATYPE)
|
||||
+ info.weight_case = 0;
|
||||
+ sortkey_add_weight(data, (info.weight_case & SORTKEY_FLAG_HIRAGANA) | SORTKEY_FLAGS_EXTRA);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void sortkey_add_extra_weights_width(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+
|
||||
+ sortkey_get_char(&info, c);
|
||||
+
|
||||
+ if (info.script_member == SORTKEY_JAPANESE)
|
||||
+ {
|
||||
+ if (info.weight_primary <= 1)
|
||||
+ {
|
||||
+ /* TODO Kana iteration/repeat characters not implemented yet */
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (flags & NORM_IGNOREWIDTH)
|
||||
+ info.weight_case = 0;
|
||||
+ sortkey_add_weight(data, (info.weight_case & SORTKEY_FLAG_FULLWIDTH) | SORTKEY_FLAGS_EXTRA);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, int str_len, BYTE *buffer, int buffer_len)
|
||||
{
|
||||
static const BYTE SORTKEY_SEPARATOR = 1;
|
||||
static const BYTE SORTKEY_TERMINATOR = 0;
|
||||
+ static const BYTE SORTKEY_EXTRA_SEPARATOR = 0xff;
|
||||
int i;
|
||||
struct sortkey_data data;
|
||||
|
||||
@@ -2743,7 +2831,15 @@ static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, in
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Extra weights */
|
||||
- /* TODO */
|
||||
+ for (i = 0; i < str_len; i++)
|
||||
+ sortkey_add_extra_weights_small(&data, flags, str[i]);
|
||||
+ sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
+ for (i = 0; i < str_len; i++)
|
||||
+ sortkey_add_extra_weights_kana(&data, flags, str[i]);
|
||||
+ sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
+ for (i = 0; i < str_len; i++)
|
||||
+ sortkey_add_extra_weights_width(&data, flags, str[i]);
|
||||
+ sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Special weights */
|
||||
--
|
||||
2.29.2
|
||||
|
@@ -1,188 +0,0 @@
|
||||
From 9ccd944af35dc418a09a17ab70619b37e598ea43 Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Maurer <dark.shadow4@web.de>
|
||||
Date: Sat, 8 Aug 2020 16:49:45 +0200
|
||||
Subject: [PATCH] kernelbase: Implement sortkey expansion
|
||||
|
||||
Signed-off-by: Fabian Maurer <dark.shadow4@web.de>
|
||||
---
|
||||
dlls/kernel32/tests/locale.c | 6 +++
|
||||
dlls/kernelbase/locale.c | 91 +++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 96 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
|
||||
index 43a244d2a6b..e8adb32bbbd 100644
|
||||
--- a/dlls/kernel32/tests/locale.c
|
||||
+++ b/dlls/kernel32/tests/locale.c
|
||||
@@ -3329,6 +3329,12 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05d3", L"\x30ba" }, /* Hebrew > Japanese */
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05e3", L"\x32de" }, /* Hebrew > Japanese */
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, NORM_IGNORECASE, L"\x05d7", L"\x30c6" }, /* Hebrew > Japanese */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"\x00c6", L"\x0041\x0045" }, /* Expansion */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"\x0f5c", L"\x0f5b\x0fb7" }, /* Expansion */
|
||||
+ { L"en-US", CSTR_EQUAL, CSTR_EQUAL, 0, L"\x05f0", L"\x05d5\x05d5" }, /* Expansion */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\x0f75", L"\x0f71\x0f74" }, /* Expansion character always follow default character logic */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\xfc5e", L"\x064c\x0651" }, /* Expansion character always follow default character logic */
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\xfb2b", L"\x05e9\x05c2" }, /* Expansion character always follow default character logic */
|
||||
};
|
||||
|
||||
static void test_unicode_sorting(void)
|
||||
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
|
||||
index feec402cb61..da358d74934 100644
|
||||
--- a/dlls/kernelbase/locale.c
|
||||
+++ b/dlls/kernelbase/locale.c
|
||||
@@ -2459,6 +2459,7 @@ enum sortkey_special_script
|
||||
{
|
||||
SORTKEY_UNSORTABLE = 0,
|
||||
SORTKEY_DIACRITIC = 1,
|
||||
+ SORTKEY_EXPANSION = 2,
|
||||
SORTKEY_JAPANESE = 3,
|
||||
SORTKEY_JAMO = 4,
|
||||
SORTKEY_CJK = 5,
|
||||
@@ -2496,13 +2497,27 @@ struct sortkey_data
|
||||
static void sortkey_get_char(struct character_info *info, WCHAR ch)
|
||||
{
|
||||
DWORD value = sort.keys[ch];
|
||||
-
|
||||
info->weight_case = value >> 24;
|
||||
info->weight_diacritic = (value >> 16) & 0xff;
|
||||
info->script_member = (value >> 8) & 0xff;
|
||||
info->weight_primary = value & 0xff;
|
||||
}
|
||||
|
||||
+static const WCHAR* sortkey_get_expansion(WCHAR ch)
|
||||
+{
|
||||
+ DWORD pos_info = sort.keys[ch];
|
||||
+ unsigned int pos = pos_info >> 16;
|
||||
+ const DWORD *ptr;
|
||||
+ unsigned int count_expansion;
|
||||
+ if ((WORD)pos_info != 0x200) /* Check for expansion magic number */
|
||||
+ return NULL;
|
||||
+ ptr = (const DWORD *)(sort.guids + sort.guid_count);
|
||||
+ count_expansion = *ptr++;
|
||||
+ if (pos >= count_expansion)
|
||||
+ return NULL;
|
||||
+ return (const WCHAR *)(ptr + pos);
|
||||
+}
|
||||
+
|
||||
|
||||
static BOOL sortkey_is_PUA(BYTE script_member)
|
||||
{
|
||||
@@ -2533,6 +2548,27 @@ static void sortkey_add_diacritic_weight(struct sortkey_data *data, BYTE value,
|
||||
*last_weighted_pos = data->buffer_pos;
|
||||
}
|
||||
|
||||
+static void sortkey_handle_expansion_main(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+ const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
+ if (expansion)
|
||||
+ {
|
||||
+ /* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
+ sortkey_handle_expansion_main(data, flags, expansion[0]);
|
||||
+ sortkey_handle_expansion_main(data, flags, expansion[1]);
|
||||
+ return;
|
||||
+ }
|
||||
+ sortkey_get_char(&info, c);
|
||||
+ if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
+ {
|
||||
+ sortkey_add_weight(data, info.script_member);
|
||||
+ sortkey_add_weight(data, info.weight_primary);
|
||||
+ if (sortkey_is_PUA(info.script_member))
|
||||
+ sortkey_add_weight(data, info.weight_diacritic);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
{
|
||||
struct character_info info;
|
||||
@@ -2542,6 +2578,12 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
switch (info.script_member)
|
||||
{
|
||||
case SORTKEY_UNSORTABLE:
|
||||
+ break;
|
||||
+
|
||||
+ case SORTKEY_EXPANSION:
|
||||
+ sortkey_handle_expansion_main(data, flags, c);
|
||||
+ break;
|
||||
+
|
||||
case SORTKEY_DIACRITIC:
|
||||
break;
|
||||
|
||||
@@ -2598,6 +2640,25 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
}
|
||||
}
|
||||
|
||||
+static void sortkey_handle_expansion_diacritic(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+ const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
+ if (expansion)
|
||||
+ {
|
||||
+ /* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, expansion[0], last_weighted_pos);
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, expansion[1], last_weighted_pos);
|
||||
+ return;
|
||||
+ }
|
||||
+ sortkey_get_char(&info, c);
|
||||
+ if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
+ {
|
||||
+ if (!sortkey_is_PUA(info.script_member))
|
||||
+ sortkey_add_diacritic_weight(data, info.weight_diacritic, last_weighted_pos);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos, int diacritic_start_pos)
|
||||
{
|
||||
struct character_info info;
|
||||
@@ -2610,6 +2671,10 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
case SORTKEY_UNSORTABLE:
|
||||
break;
|
||||
|
||||
+ case SORTKEY_EXPANSION:
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, c, last_weighted_pos);
|
||||
+ break;
|
||||
+
|
||||
case SORTKEY_DIACRITIC:
|
||||
old_pos = data->buffer_pos - 1;
|
||||
/*
|
||||
@@ -2663,6 +2728,24 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
}
|
||||
}
|
||||
|
||||
+static void sortkey_handle_expansion_case(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+{
|
||||
+ struct character_info info;
|
||||
+ const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
+ if (expansion)
|
||||
+ {
|
||||
+ /* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
+ sortkey_handle_expansion_case(data, flags, expansion[0]);
|
||||
+ sortkey_handle_expansion_case(data, flags, expansion[1]);
|
||||
+ return;
|
||||
+ }
|
||||
+ sortkey_get_char(&info, c);
|
||||
+ if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
+ {
|
||||
+ sortkey_add_case_weight(data, flags, info.weight_case);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
{
|
||||
struct character_info info;
|
||||
@@ -2672,6 +2755,12 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
switch (info.script_member)
|
||||
{
|
||||
case SORTKEY_UNSORTABLE:
|
||||
+ break;
|
||||
+
|
||||
+ case SORTKEY_EXPANSION:
|
||||
+ sortkey_handle_expansion_case(data, flags, c);
|
||||
+ break;
|
||||
+
|
||||
case SORTKEY_DIACRITIC:
|
||||
break;
|
||||
|
||||
--
|
||||
2.29.2
|
||||
|
@@ -1,377 +0,0 @@
|
||||
From 74ed8758a238f1747055b4c8fa78edc2d5e7aba9 Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Maurer <dark.shadow4@web.de>
|
||||
Date: Sat, 8 Aug 2020 17:32:56 +0200
|
||||
Subject: [PATCH] kernelbase: Implement sortkey language support
|
||||
|
||||
Signed-off-by: Fabian Maurer <dark.shadow4@web.de>
|
||||
---
|
||||
dlls/kernel32/tests/locale.c | 50 ++++++++++++++++++
|
||||
dlls/kernelbase/locale.c | 99 +++++++++++++++++++++---------------
|
||||
2 files changed, 109 insertions(+), 40 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
|
||||
index 0aaa87e38c1..84931318075 100644
|
||||
--- a/dlls/kernel32/tests/locale.c
|
||||
+++ b/dlls/kernel32/tests/locale.c
|
||||
@@ -3210,6 +3210,56 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
|
||||
{ L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\x0f75", L"\x0f71\x0f74" }, /* Expansion character always follow default character logic */
|
||||
{ L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\xfc5e", L"\x064c\x0651" }, /* Expansion character always follow default character logic */
|
||||
{ L"en-US", CSTR_LESS_THAN, CSTR_EQUAL, 0, L"\xfb2b", L"\x05e9\x05c2" }, /* Expansion character always follow default character logic */
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x6df8", L"\x654b\x29e9" }, /* Japanese locale */
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x685d\x1239\x1b61", L"\x59b6\x6542\x2a62\x04a7" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x62f3\x43e9", L"\x5760" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x634c", L"\x2f0d\x5f1c\x7124" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x69e7\x0502", L"\x57cc" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x7589", L"\x67c5" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x5ede\x765c", L"\x7324" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x5c7f\x5961", L"\x7cbe" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x3162", L"\x6a84\x1549\x0b60" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x769e\x448e", L"\x4e6e" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x59a4", L"\x5faa\x607c" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x529b", L"\x733f" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x6ff8\x2a0a", L"\x7953\x6712" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x6dfb", L"\x6793" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x67ed", L"\x6aa2" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x4e61", L"\x6350\x6b08" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x5118", L"\x53b3\x75b4" },
|
||||
+ { L"ja-JP", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x6bbf", L"\x65a3" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x5690", L"\x5fa8" },
|
||||
+ { L"ja-JP", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x61e2", L"\x76e5" },
|
||||
+ { L"ko-KR", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x8db6", L"\xd198" },
|
||||
+ { L"ko-KR", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x8f72", L"\xd2b9" },
|
||||
+ { L"ko-KR", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x91d8", L"\xd318" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x8db6", L"\xd198" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x8f72", L"\xd2b9" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x91d8", L"\xd318" },
|
||||
+ { L"cs-CZ", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x0160", L"\x0219" },
|
||||
+ { L"cs-CZ", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x059a", L"\x0308" },
|
||||
+ { L"cs-CZ", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x013a", L"\x013f" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0160", L"\x0219" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x059a", L"\x0308" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x013a", L"\x013f" },
|
||||
+ { L"vi-VN", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x1d8f", L"\x1ea8" },
|
||||
+ { L"vi-VN", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0323", L"\xfe26" },
|
||||
+ { L"vi-VN", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"R", L"\xff32" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x1d8f", L"\x1ea8" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x0323", L"\xfe26" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"R", L"\xff32" },
|
||||
+ { L"zh-HK", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x83ae", L"\x71b9" },
|
||||
+ { L"zh-HK", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x7e50", L"\xc683" },
|
||||
+ { L"zh-HK", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x6c69", L"\x7f8a" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x83ae", L"\x71b9" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x7e50", L"\xc683" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x6c69", L"\x7f8a" },
|
||||
+ { L"tr-TR", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x00dc", L"\x1ee9" },
|
||||
+ { L"tr-TR", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x00fc", L"\x1ee6" },
|
||||
+ { L"tr-TR", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x0152", L"\x00d6" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x00dc", L"\x1ee9" },
|
||||
+ { L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x00fc", L"\x1ee6" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x0152", L"\x00d6" },
|
||||
};
|
||||
|
||||
static void test_unicode_sorting(void)
|
||||
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
|
||||
index e81ed0e0f2e..394912307a9 100644
|
||||
--- a/dlls/kernelbase/locale.c
|
||||
+++ b/dlls/kernelbase/locale.c
|
||||
@@ -2530,9 +2530,27 @@ struct sortkey_data
|
||||
int buffer_len;
|
||||
};
|
||||
|
||||
-static void sortkey_get_char(struct character_info *info, WCHAR ch)
|
||||
+static DWORD sortkey_get_exception(WCHAR ch, const struct sortguid *locale)
|
||||
{
|
||||
- DWORD value = sort.keys[ch];
|
||||
+ if (locale && locale->except)
|
||||
+ {
|
||||
+ DWORD *table = sort.keys + locale->except;
|
||||
+ DWORD hi = ch >> 8;
|
||||
+ DWORD lo = ch & 0xff;
|
||||
+ if (table[hi] == hi * 0x100)
|
||||
+ return 0;
|
||||
+ if (sort.keys[table[hi] + lo] == sort.keys[hi * 0x100 + lo])
|
||||
+ return 0;
|
||||
+ return sort.keys[table[hi] + lo];
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void sortkey_get_char(struct character_info *info, WCHAR ch, const struct sortguid *locale)
|
||||
+{
|
||||
+ DWORD value = sortkey_get_exception(ch, locale);
|
||||
+ if (!value)
|
||||
+ value = sort.keys[ch];
|
||||
info->weight_case = value >> 24;
|
||||
info->weight_diacritic = (value >> 16) & 0xff;
|
||||
info->script_member = (value >> 8) & 0xff;
|
||||
@@ -2584,18 +2602,18 @@ static void sortkey_add_diacritic_weight(struct sortkey_data *data, BYTE value,
|
||||
*last_weighted_pos = data->buffer_pos;
|
||||
}
|
||||
|
||||
-static void sortkey_handle_expansion_main(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_handle_expansion_main(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
if (expansion)
|
||||
{
|
||||
/* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
- sortkey_handle_expansion_main(data, flags, expansion[0]);
|
||||
- sortkey_handle_expansion_main(data, flags, expansion[1]);
|
||||
+ sortkey_handle_expansion_main(data, flags, expansion[0], locale);
|
||||
+ sortkey_handle_expansion_main(data, flags, expansion[1], locale);
|
||||
return;
|
||||
}
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
{
|
||||
sortkey_add_weight(data, info.script_member);
|
||||
@@ -2605,11 +2623,11 @@ static void sortkey_handle_expansion_main(struct sortkey_data *data, int flags,
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
switch (info.script_member)
|
||||
{
|
||||
@@ -2617,7 +2635,7 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_EXPANSION:
|
||||
- sortkey_handle_expansion_main(data, flags, c);
|
||||
+ sortkey_handle_expansion_main(data, flags, c, locale);
|
||||
break;
|
||||
|
||||
case SORTKEY_DIACRITIC:
|
||||
@@ -2676,18 +2694,18 @@ static void sortkey_add_main_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_handle_expansion_diacritic(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos)
|
||||
+static void sortkey_handle_expansion_diacritic(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
if (expansion)
|
||||
{
|
||||
/* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
- sortkey_handle_expansion_diacritic(data, flags, expansion[0], last_weighted_pos);
|
||||
- sortkey_handle_expansion_diacritic(data, flags, expansion[1], last_weighted_pos);
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, expansion[0], last_weighted_pos, locale);
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, expansion[1], last_weighted_pos, locale);
|
||||
return;
|
||||
}
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
{
|
||||
if (!sortkey_is_PUA(info.script_member))
|
||||
@@ -2695,12 +2713,12 @@ static void sortkey_handle_expansion_diacritic(struct sortkey_data *data, int fl
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos, int diacritic_start_pos)
|
||||
+static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags, WCHAR c, int *last_weighted_pos, int diacritic_start_pos, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
int old_pos;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
switch (info.script_member)
|
||||
{
|
||||
@@ -2708,7 +2726,7 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
break;
|
||||
|
||||
case SORTKEY_EXPANSION:
|
||||
- sortkey_handle_expansion_diacritic(data, flags, c, last_weighted_pos);
|
||||
+ sortkey_handle_expansion_diacritic(data, flags, c, last_weighted_pos, locale);
|
||||
break;
|
||||
|
||||
case SORTKEY_DIACRITIC:
|
||||
@@ -2764,29 +2782,29 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_handle_expansion_case(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_handle_expansion_case(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
const WCHAR *expansion = sortkey_get_expansion(c);
|
||||
if (expansion)
|
||||
{
|
||||
/* Expansion characters always follow default character logic, ignoring the script_member value */
|
||||
- sortkey_handle_expansion_case(data, flags, expansion[0]);
|
||||
- sortkey_handle_expansion_case(data, flags, expansion[1]);
|
||||
+ sortkey_handle_expansion_case(data, flags, expansion[0], locale);
|
||||
+ sortkey_handle_expansion_case(data, flags, expansion[1], locale);
|
||||
return;
|
||||
}
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
if (info.script_member != SORTKEY_UNSORTABLE)
|
||||
{
|
||||
sortkey_add_case_weight(data, flags, info.weight_case);
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
switch (info.script_member)
|
||||
{
|
||||
@@ -2794,7 +2812,7 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
break;
|
||||
|
||||
case SORTKEY_EXPANSION:
|
||||
- sortkey_handle_expansion_case(data, flags, c);
|
||||
+ sortkey_handle_expansion_case(data, flags, c, locale);
|
||||
break;
|
||||
|
||||
case SORTKEY_DIACRITIC:
|
||||
@@ -2836,12 +2854,12 @@ static void sortkey_add_case_weights(struct sortkey_data *data, int flags, WCHAR
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_special_weights(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_special_weights(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
BYTE weight_second;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
if (info.script_member == SORTKEY_PUNCTUATION)
|
||||
{
|
||||
@@ -2854,11 +2872,11 @@ static void sortkey_add_special_weights(struct sortkey_data *data, int flags, WC
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_extra_weights_small(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_extra_weights_small(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
if (info.script_member == SORTKEY_JAPANESE)
|
||||
{
|
||||
@@ -2876,11 +2894,11 @@ static void sortkey_add_extra_weights_small(struct sortkey_data *data, int flags
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_extra_weights_kana(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_extra_weights_kana(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
if (info.script_member == SORTKEY_JAPANESE)
|
||||
{
|
||||
@@ -2897,11 +2915,11 @@ static void sortkey_add_extra_weights_kana(struct sortkey_data *data, int flags,
|
||||
}
|
||||
}
|
||||
|
||||
-static void sortkey_add_extra_weights_width(struct sortkey_data *data, int flags, WCHAR c)
|
||||
+static void sortkey_add_extra_weights_width(struct sortkey_data *data, int flags, WCHAR c, const struct sortguid *locale)
|
||||
{
|
||||
struct character_info info;
|
||||
|
||||
- sortkey_get_char(&info, c);
|
||||
+ sortkey_get_char(&info, c, locale);
|
||||
|
||||
if (info.script_member == SORTKEY_JAPANESE)
|
||||
{
|
||||
@@ -2918,13 +2936,14 @@ static void sortkey_add_extra_weights_width(struct sortkey_data *data, int flags
|
||||
}
|
||||
}
|
||||
|
||||
-static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, int str_len, BYTE *buffer, int buffer_len)
|
||||
+static int sortkey_generate(int flags, const WCHAR *locale_name, const WCHAR *str, int str_len, BYTE *buffer, int buffer_len)
|
||||
{
|
||||
static const BYTE SORTKEY_SEPARATOR = 1;
|
||||
static const BYTE SORTKEY_TERMINATOR = 0;
|
||||
static const BYTE SORTKEY_EXTRA_SEPARATOR = 0xff;
|
||||
int i;
|
||||
struct sortkey_data data;
|
||||
+ const struct sortguid *locale = get_language_sort(locale_name);
|
||||
|
||||
data.buffer = buffer;
|
||||
data.buffer_pos = 0;
|
||||
@@ -2935,7 +2954,7 @@ static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, in
|
||||
|
||||
/* Main weights */
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_main_weights(&data, flags, str[i]);
|
||||
+ sortkey_add_main_weights(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Diacritic weights */
|
||||
@@ -2944,7 +2963,7 @@ static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, in
|
||||
int diacritic_start_pos = data.buffer_pos;
|
||||
int last_weighted_pos = data.buffer_pos;
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_diacritic_weights(&data, flags, str[i], &last_weighted_pos, diacritic_start_pos);
|
||||
+ sortkey_add_diacritic_weights(&data, flags, str[i], &last_weighted_pos, diacritic_start_pos, locale);
|
||||
/* Remove all weights <= SORTKEY_MIN_WEIGHT from the end */
|
||||
data.buffer_pos = last_weighted_pos;
|
||||
}
|
||||
@@ -2952,24 +2971,24 @@ static int sortkey_generate(int flags, const WCHAR *locale, const WCHAR *str, in
|
||||
|
||||
/* Case weights */
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_case_weights(&data, flags, str[i]);
|
||||
+ sortkey_add_case_weights(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Extra weights */
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_extra_weights_small(&data, flags, str[i]);
|
||||
+ sortkey_add_extra_weights_small(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_extra_weights_kana(&data, flags, str[i]);
|
||||
+ sortkey_add_extra_weights_kana(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_extra_weights_width(&data, flags, str[i]);
|
||||
+ sortkey_add_extra_weights_width(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_EXTRA_SEPARATOR);
|
||||
sortkey_add_weight(&data, SORTKEY_SEPARATOR);
|
||||
|
||||
/* Special weights */
|
||||
for (i = 0; i < str_len; i++)
|
||||
- sortkey_add_special_weights(&data, flags, str[i]);
|
||||
+ sortkey_add_special_weights(&data, flags, str[i], locale);
|
||||
sortkey_add_weight(&data, SORTKEY_TERMINATOR);
|
||||
|
||||
if (data.buffer_pos <= buffer_len || !buffer)
|
||||
@@ -5667,7 +5686,7 @@ INT WINAPI DECLSPEC_HOTPATCH LCMapStringEx( const WCHAR *locale, DWORD flags, co
|
||||
TRACE( "(%s,0x%08lx,%s,%d,%p,%d)\n",
|
||||
debugstr_w(locale), flags, debugstr_wn(src, srclen), srclen, dst, dstlen );
|
||||
|
||||
- if (!(ret = sortkey_generate(flags, L"", src, srclen, (BYTE *)dst, dstlen )))
|
||||
+ if (!(ret = sortkey_generate(flags, locale, src, srclen, (BYTE *)dst, dstlen )))
|
||||
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
@@ -1,446 +0,0 @@
|
||||
From 4b39a274dd286b963fc34048ea131ae1cf4dc71c Mon Sep 17 00:00:00 2001
|
||||
From: Fabian Maurer <dark.shadow4@web.de>
|
||||
Date: Sun, 6 Dec 2020 20:57:16 +0100
|
||||
Subject: [PATCH] kernelbase: Implement CompareString functions
|
||||
|
||||
---
|
||||
dlls/kernel32/tests/locale.c | 33 +++--
|
||||
dlls/kernelbase/locale.c | 261 ++++++++++++++++++-----------------
|
||||
2 files changed, 149 insertions(+), 145 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
|
||||
index 0ec859363db..59929756dc6 100644
|
||||
--- a/dlls/kernel32/tests/locale.c
|
||||
+++ b/dlls/kernel32/tests/locale.c
|
||||
@@ -1831,16 +1831,16 @@ static void test_CompareStringA(void)
|
||||
"a\\0b vs a expected CSTR_EQUAL or CSTR_GREATER_THAN, got %d\n", ret);
|
||||
|
||||
ret = CompareStringA(lcid, 0, "\2", 2, "\1", 2);
|
||||
- todo_wine ok(ret != CSTR_EQUAL, "\\2 vs \\1 expected unequal\n");
|
||||
+ ok(ret != CSTR_EQUAL, "\\2 vs \\1 expected unequal\n");
|
||||
|
||||
ret = CompareStringA(lcid, NORM_IGNORECASE | LOCALE_USE_CP_ACP, "#", -1, ".", -1);
|
||||
- todo_wine ok(ret == CSTR_LESS_THAN, "\"#\" vs \".\" expected CSTR_LESS_THAN, got %d\n", ret);
|
||||
+ ok(ret == CSTR_LESS_THAN, "\"#\" vs \".\" expected CSTR_LESS_THAN, got %d\n", ret);
|
||||
|
||||
ret = CompareStringA(lcid, NORM_IGNORECASE, "_", -1, ".", -1);
|
||||
- todo_wine ok(ret == CSTR_GREATER_THAN, "\"_\" vs \".\" expected CSTR_GREATER_THAN, got %d\n", ret);
|
||||
+ ok(ret == CSTR_GREATER_THAN, "\"_\" vs \".\" expected CSTR_GREATER_THAN, got %d\n", ret);
|
||||
|
||||
ret = lstrcmpiA("#", ".");
|
||||
- todo_wine ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret);
|
||||
+ ok(ret == -1, "\"#\" vs \".\" expected -1, got %d\n", ret);
|
||||
|
||||
lcid = MAKELCID(MAKELANGID(LANG_POLISH, SUBLANG_DEFAULT), SORT_DEFAULT);
|
||||
|
||||
@@ -1926,9 +1926,9 @@ static void test_CompareStringW(void)
|
||||
ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
|
||||
ret = CompareStringW(CP_ACP, NORM_IGNORENONSPACE, ABC_EE, 3, A_ACUTE_BC, 4);
|
||||
- todo_wine ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
+ ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
ret = CompareStringW(CP_ACP, NORM_IGNORENONSPACE, ABC_EE, 4, A_ACUTE_BC_DECOMP, 5);
|
||||
- todo_wine ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
+ ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
ret = CompareStringW(CP_ACP, NORM_IGNORENONSPACE, A_ACUTE_BC, 4, A_ACUTE_BC_DECOMP, 5);
|
||||
ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
|
||||
@@ -1940,12 +1940,12 @@ static void test_CompareStringW(void)
|
||||
ret = CompareStringW(CP_ACP, 0, A_NULL_BC, 4, A_ACUTE_BC, 4);
|
||||
ok(ret == CSTR_LESS_THAN, "expected CSTR_LESS_THAN, got %d\n", ret);
|
||||
ret = CompareStringW(CP_ACP, NORM_IGNORENONSPACE, A_NULL_BC, 4, A_ACUTE_BC, 4);
|
||||
- todo_wine ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
+ ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
|
||||
ret = CompareStringW(CP_ACP, 0, A_NULL_BC, 4, A_ACUTE_BC_DECOMP, 5);
|
||||
ok(ret == CSTR_LESS_THAN, "expected CSTR_LESS_THAN, got %d\n", ret);
|
||||
ret = CompareStringW(CP_ACP, NORM_IGNORENONSPACE, A_NULL_BC, 4, A_ACUTE_BC_DECOMP, 5);
|
||||
- todo_wine ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
+ ok(ret == CSTR_EQUAL, "expected CSTR_EQUAL, got %d\n", ret);
|
||||
}
|
||||
|
||||
struct comparestringex_test {
|
||||
@@ -1982,7 +1982,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 5 */
|
||||
"tr-TR", 0,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, FALSE
|
||||
},
|
||||
/* with NORM_IGNORECASE */
|
||||
{ /* 6 */
|
||||
@@ -2007,7 +2007,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 11 */
|
||||
"tr-TR", NORM_IGNORECASE,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, FALSE
|
||||
},
|
||||
/* with NORM_LINGUISTIC_CASING */
|
||||
{ /* 12 */
|
||||
@@ -2032,7 +2032,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 17 */
|
||||
"tr-TR", NORM_LINGUISTIC_CASING,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, FALSE
|
||||
},
|
||||
/* with LINGUISTIC_IGNORECASE */
|
||||
{ /* 18 */
|
||||
@@ -2057,7 +2057,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 23 */
|
||||
"tr-TR", LINGUISTIC_IGNORECASE,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, FALSE
|
||||
},
|
||||
/* with NORM_LINGUISTIC_CASING | NORM_IGNORECASE */
|
||||
{ /* 24 */
|
||||
@@ -2082,7 +2082,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 29 */
|
||||
"tr-TR", NORM_LINGUISTIC_CASING | NORM_IGNORECASE,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, -1, FALSE
|
||||
},
|
||||
/* with NORM_LINGUISTIC_CASING | LINGUISTIC_IGNORECASE */
|
||||
{ /* 30 */
|
||||
@@ -2107,7 +2107,7 @@ static const struct comparestringex_test comparestringex_tests[] = {
|
||||
},
|
||||
{ /* 35 */
|
||||
"tr-TR", NORM_LINGUISTIC_CASING | LINGUISTIC_IGNORECASE,
|
||||
- {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, CSTR_LESS_THAN, TRUE
|
||||
+ {0x130,0}, {0x131,0}, CSTR_GREATER_THAN, CSTR_LESS_THAN, FALSE
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3372,6 +3372,9 @@ static const struct sorting_test_entry unicode_sorting_tests[] =
|
||||
{ L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x00dc", L"\x1ee9" },
|
||||
{ L"en-US", CSTR_LESS_THAN, CSTR_LESS_THAN, 0, L"\x00fc", L"\x1ee6" },
|
||||
{ L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\x0152", L"\x00d6" },
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\xa042\x09bc", L"\xa042" }, /* Diacritic is added */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\xa063\x302b", L"\xa063" }, /* Diacritic is added */
|
||||
+ { L"en-US", CSTR_GREATER_THAN, CSTR_GREATER_THAN, 0, L"\xa07e\x0c56", L"\xa07e" }, /* Diacritic is added */
|
||||
};
|
||||
|
||||
static void test_unicode_sorting(void)
|
||||
@@ -6260,7 +6263,7 @@ static void test_FindNLSStringEx(void)
|
||||
{ localeW, FIND_FROMSTART, comb_s_accent1W, ARRAY_SIZE(comb_s_accent1W)-1,
|
||||
comb_s_accent2W, ARRAY_SIZE(comb_s_accent2W)-1, 0, 0, 6, 1, TRUE },
|
||||
{ localeW, FIND_FROMSTART, comb_q_accent1W, ARRAY_SIZE(comb_q_accent1W)-1,
|
||||
- comb_q_accent2W, ARRAY_SIZE(comb_q_accent2W)-1, 0, 0, 7, 1, FALSE },
|
||||
+ comb_q_accent2W, ARRAY_SIZE(comb_q_accent2W)-1, 0, 0, 7, 0, FALSE },
|
||||
{ 0 }
|
||||
};
|
||||
struct test_data *ptest;
|
||||
diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c
|
||||
index d1d461c84e9..28a69c53144 100644
|
||||
--- a/dlls/kernelbase/locale.c
|
||||
+++ b/dlls/kernelbase/locale.c
|
||||
@@ -3064,126 +3064,6 @@ static int map_to_halfwidth( WCHAR c, WCHAR *dst, int dstlen )
|
||||
return 1;
|
||||
}
|
||||
|
||||
-
|
||||
-/* 32-bit collation element table format:
|
||||
- * unicode weight - high 16 bit, diacritic weight - high 8 bit of low 16 bit,
|
||||
- * case weight - high 4 bit of low 8 bit.
|
||||
- */
|
||||
-
|
||||
-enum weight { UNICODE_WEIGHT, DIACRITIC_WEIGHT, CASE_WEIGHT };
|
||||
-
|
||||
-static unsigned int get_weight( WCHAR ch, enum weight type )
|
||||
-{
|
||||
- unsigned int ret;
|
||||
-
|
||||
- ret = collation_table[collation_table[collation_table[ch >> 8] + ((ch >> 4) & 0x0f)] + (ch & 0xf)];
|
||||
- if (ret == ~0u) return ch;
|
||||
-
|
||||
- switch (type)
|
||||
- {
|
||||
- case UNICODE_WEIGHT: return ret >> 16;
|
||||
- case DIACRITIC_WEIGHT: return (ret >> 8) & 0xff;
|
||||
- case CASE_WEIGHT: return (ret >> 4) & 0x0f;
|
||||
- default: return 0;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static void inc_str_pos( const WCHAR **str, int *len, unsigned int *dpos, unsigned int *dlen )
|
||||
-{
|
||||
- (*dpos)++;
|
||||
- if (*dpos == *dlen)
|
||||
- {
|
||||
- *dpos = *dlen = 0;
|
||||
- (*str)++;
|
||||
- (*len)--;
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-
|
||||
-static int compare_weights(int flags, const WCHAR *str1, int len1,
|
||||
- const WCHAR *str2, int len2, enum weight type )
|
||||
-{
|
||||
- unsigned int ce1, ce2, dpos1 = 0, dpos2 = 0, dlen1 = 0, dlen2 = 0;
|
||||
- const WCHAR *dstr1 = NULL, *dstr2 = NULL;
|
||||
-
|
||||
- while (len1 > 0 && len2 > 0)
|
||||
- {
|
||||
- if (!dlen1 && !(dstr1 = get_decomposition( *str1, &dlen1 ))) dstr1 = str1;
|
||||
- if (!dlen2 && !(dstr2 = get_decomposition( *str2, &dlen2 ))) dstr2 = str2;
|
||||
-
|
||||
- if (flags & NORM_IGNORESYMBOLS)
|
||||
- {
|
||||
- int skip = 0;
|
||||
- /* FIXME: not tested */
|
||||
- if (get_char_type( CT_CTYPE1, dstr1[dpos1] ) & (C1_PUNCT | C1_SPACE))
|
||||
- {
|
||||
- inc_str_pos( &str1, &len1, &dpos1, &dlen1 );
|
||||
- skip = 1;
|
||||
- }
|
||||
- if (get_char_type( CT_CTYPE1, dstr2[dpos2] ) & (C1_PUNCT | C1_SPACE))
|
||||
- {
|
||||
- inc_str_pos( &str2, &len2, &dpos2, &dlen2 );
|
||||
- skip = 1;
|
||||
- }
|
||||
- if (skip) continue;
|
||||
- }
|
||||
-
|
||||
- /* hyphen and apostrophe are treated differently depending on
|
||||
- * whether SORT_STRINGSORT specified or not
|
||||
- */
|
||||
- if (type == UNICODE_WEIGHT && !(flags & SORT_STRINGSORT))
|
||||
- {
|
||||
- if (dstr1[dpos1] == '-' || dstr1[dpos1] == '\'')
|
||||
- {
|
||||
- if (dstr2[dpos2] != '-' && dstr2[dpos2] != '\'')
|
||||
- {
|
||||
- inc_str_pos( &str1, &len1, &dpos1, &dlen1 );
|
||||
- continue;
|
||||
- }
|
||||
- }
|
||||
- else if (dstr2[dpos2] == '-' || dstr2[dpos2] == '\'')
|
||||
- {
|
||||
- inc_str_pos( &str2, &len2, &dpos2, &dlen2 );
|
||||
- continue;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- ce1 = get_weight( dstr1[dpos1], type );
|
||||
- if (!ce1)
|
||||
- {
|
||||
- inc_str_pos( &str1, &len1, &dpos1, &dlen1 );
|
||||
- continue;
|
||||
- }
|
||||
- ce2 = get_weight( dstr2[dpos2], type );
|
||||
- if (!ce2)
|
||||
- {
|
||||
- inc_str_pos( &str2, &len2, &dpos2, &dlen2 );
|
||||
- continue;
|
||||
- }
|
||||
-
|
||||
- if (ce1 - ce2) return ce1 - ce2;
|
||||
-
|
||||
- inc_str_pos( &str1, &len1, &dpos1, &dlen1 );
|
||||
- inc_str_pos( &str2, &len2, &dpos2, &dlen2 );
|
||||
- }
|
||||
- while (len1)
|
||||
- {
|
||||
- if (!dlen1 && !(dstr1 = get_decomposition( *str1, &dlen1 ))) dstr1 = str1;
|
||||
- ce1 = get_weight( dstr1[dpos1], type );
|
||||
- if (ce1) break;
|
||||
- inc_str_pos( &str1, &len1, &dpos1, &dlen1 );
|
||||
- }
|
||||
- while (len2)
|
||||
- {
|
||||
- if (!dlen2 && !(dstr2 = get_decomposition( *str2, &dlen2 ))) dstr2 = str2;
|
||||
- ce2 = get_weight( dstr2[dpos2], type );
|
||||
- if (ce2) break;
|
||||
- inc_str_pos( &str2, &len2, &dpos2, &dlen2 );
|
||||
- }
|
||||
- return len1 - len2;
|
||||
-}
|
||||
-
|
||||
enum sortkey_special_script
|
||||
{
|
||||
SORTKEY_UNSORTABLE = 0,
|
||||
@@ -3221,6 +3101,7 @@ struct sortkey_data
|
||||
BYTE *buffer;
|
||||
int buffer_pos;
|
||||
int buffer_len;
|
||||
+ BOOL is_compare_string;
|
||||
};
|
||||
|
||||
static DWORD sortkey_get_exception(WCHAR ch, const struct sortguid *locale)
|
||||
@@ -3432,7 +3313,10 @@ static void sortkey_add_diacritic_weights(struct sortkey_data *data, int flags,
|
||||
if (old_pos >= diacritic_start_pos)
|
||||
{
|
||||
if (old_pos < data->buffer_len)
|
||||
+ {
|
||||
data->buffer[old_pos] += info.weight_diacritic; /* Overflow can happen, that's okay */
|
||||
+ *last_weighted_pos = data->buffer_pos;
|
||||
+ }
|
||||
}
|
||||
else
|
||||
sortkey_add_diacritic_weight(data, info.weight_diacritic, last_weighted_pos);
|
||||
@@ -3641,6 +3525,7 @@ static int sortkey_generate(int flags, const WCHAR *locale_name, const WCHAR *st
|
||||
data.buffer = buffer;
|
||||
data.buffer_pos = 0;
|
||||
data.buffer_len = buffer ? buffer_len : 0;
|
||||
+ data.is_compare_string = FALSE;
|
||||
|
||||
if (str_len == -1)
|
||||
str_len = wcslen(str);
|
||||
@@ -3690,6 +3575,130 @@ static int sortkey_generate(int flags, const WCHAR *locale_name, const WCHAR *st
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int early_exit_sortkey_comparison(const struct sortkey_data* data1, const struct sortkey_data* data2, int start_index)
|
||||
+{
|
||||
+ int i;
|
||||
+ int end_index = min(data1->buffer_pos, data2->buffer_pos);
|
||||
+
|
||||
+ for (i = start_index; i < end_index; i++)
|
||||
+ {
|
||||
+ BYTE weight1 = data1->buffer[i];
|
||||
+ BYTE weight2 = data2->buffer[i];
|
||||
+
|
||||
+ if (weight1 > weight2) return CSTR_GREATER_THAN;
|
||||
+ if (weight1 < weight2) return CSTR_LESS_THAN;
|
||||
+ }
|
||||
+
|
||||
+ return CSTR_EQUAL;
|
||||
+}
|
||||
+
|
||||
+static int sortkey_compare(int flags, const WCHAR *locale_name, const WCHAR *str1, int str1_len, const WCHAR *str2, int str2_len)
|
||||
+{
|
||||
+ int i1, i2;
|
||||
+ int ret;
|
||||
+ struct sortkey_data data1, data2;
|
||||
+ const struct sortguid *locale = get_language_sort(locale_name);
|
||||
+ int diacritic_start_pos1;
|
||||
+ int last_weighted_pos1;
|
||||
+ int diacritic_start_pos2;
|
||||
+ int last_weighted_pos2;
|
||||
+ int pos_weight_compare;
|
||||
+
|
||||
+ BYTE buffer1[10000];
|
||||
+ BYTE buffer2[10000];
|
||||
+
|
||||
+ data1.buffer = buffer1;
|
||||
+ data1.buffer_pos = 0;
|
||||
+ data1.buffer_len = sizeof(buffer1);
|
||||
+ data1.is_compare_string = TRUE;
|
||||
+
|
||||
+ data2.buffer = buffer2;
|
||||
+ data2.buffer_pos = 0;
|
||||
+ data2.buffer_len = sizeof(buffer2);
|
||||
+ data2.is_compare_string = TRUE;
|
||||
+
|
||||
+ /* Main weights */
|
||||
+ for (i1 = 0, i2 = 0; i1 < str1_len || i2 < str2_len; i1++, i2++)
|
||||
+ {
|
||||
+ int pos_weight_compare = min(data1.buffer_pos, data2.buffer_pos);
|
||||
+ if (i1 < str1_len)
|
||||
+ {
|
||||
+ sortkey_add_main_weights(&data1, flags, str1[i1], locale);
|
||||
+ }
|
||||
+ if (i2 < str2_len)
|
||||
+ {
|
||||
+ sortkey_add_main_weights(&data2, flags, str2[i2], locale);
|
||||
+ }
|
||||
+
|
||||
+ /* For clear differences we must return early without reading all characters. See tests. */
|
||||
+ ret = early_exit_sortkey_comparison(&data1, &data2, pos_weight_compare);
|
||||
+ if (ret != CSTR_EQUAL)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (data1.buffer_pos > data2.buffer_pos)
|
||||
+ return CSTR_GREATER_THAN;
|
||||
+ if (data1.buffer_pos < data2.buffer_pos)
|
||||
+ return CSTR_LESS_THAN;
|
||||
+
|
||||
+ diacritic_start_pos1 = data1.buffer_pos;
|
||||
+ last_weighted_pos1 = data1.buffer_pos;
|
||||
+ diacritic_start_pos2 = data2.buffer_pos;
|
||||
+ last_weighted_pos2 = data2.buffer_pos;
|
||||
+ pos_weight_compare = min(data1.buffer_pos, data2.buffer_pos);
|
||||
+ /* Diacritic weights */
|
||||
+ if (!(flags & NORM_IGNORENONSPACE))
|
||||
+ {
|
||||
+ for (i1 = 0, i2 = 0; i1 < str1_len || i2 < str2_len; i1++, i2++)
|
||||
+ {
|
||||
+ if (i1 < str1_len)
|
||||
+ {
|
||||
+ sortkey_add_diacritic_weights(&data1, flags, str1[i1], &last_weighted_pos1, diacritic_start_pos1, locale);
|
||||
+ }
|
||||
+ if (i2 < str2_len)
|
||||
+ {
|
||||
+ sortkey_add_diacritic_weights(&data2, flags, str2[i2], &last_weighted_pos2, diacritic_start_pos2, locale);
|
||||
+ }
|
||||
+ }
|
||||
+ data1.buffer_pos = last_weighted_pos1;
|
||||
+ data2.buffer_pos = last_weighted_pos2;
|
||||
+
|
||||
+ ret = early_exit_sortkey_comparison(&data1, &data2, pos_weight_compare);
|
||||
+ if (ret != CSTR_EQUAL)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (data1.buffer_pos > data2.buffer_pos)
|
||||
+ return CSTR_GREATER_THAN;
|
||||
+ if (data1.buffer_pos < data2.buffer_pos)
|
||||
+ return CSTR_LESS_THAN;
|
||||
+ }
|
||||
+
|
||||
+ /* Special weights */
|
||||
+ for (i1 = 0, i2 = 0; i1 < str1_len || i2 < str2_len; i1++, i2++)
|
||||
+ {
|
||||
+ int pos_weight_compare = min(data1.buffer_pos, data2.buffer_pos);
|
||||
+ if (i1 < str1_len)
|
||||
+ {
|
||||
+ sortkey_add_special_weights(&data1, flags, str1[i1], locale);
|
||||
+ }
|
||||
+ if (i2 < str2_len)
|
||||
+ {
|
||||
+ sortkey_add_special_weights(&data2, flags, str2[i2], locale);
|
||||
+ }
|
||||
+
|
||||
+ ret = early_exit_sortkey_comparison(&data1, &data2, pos_weight_compare);
|
||||
+ if (ret != CSTR_EQUAL)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ if (data1.buffer_pos > data2.buffer_pos)
|
||||
+ return CSTR_GREATER_THAN;
|
||||
+ if (data1.buffer_pos < data2.buffer_pos)
|
||||
+ return CSTR_LESS_THAN;
|
||||
+
|
||||
+ return CSTR_EQUAL;
|
||||
+}
|
||||
+
|
||||
static int compare_tzdate( const TIME_FIELDS *tf, const SYSTEMTIME *compare )
|
||||
{
|
||||
static const int month_lengths[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||
@@ -4166,16 +4175,8 @@ INT WINAPI CompareStringEx( const WCHAR *locale, DWORD flags, const WCHAR *str1,
|
||||
if (len1 < 0) len1 = lstrlenW(str1);
|
||||
if (len2 < 0) len2 = lstrlenW(str2);
|
||||
|
||||
- ret = compare_weights( flags, str1, len1, str2, len2, UNICODE_WEIGHT );
|
||||
- if (!ret)
|
||||
- {
|
||||
- if (!(flags & NORM_IGNORENONSPACE))
|
||||
- ret = compare_weights( flags, str1, len1, str2, len2, DIACRITIC_WEIGHT );
|
||||
- if (!ret && !(flags & NORM_IGNORECASE))
|
||||
- ret = compare_weights( flags, str1, len1, str2, len2, CASE_WEIGHT );
|
||||
- }
|
||||
- if (!ret) return CSTR_EQUAL;
|
||||
- return (ret < 0) ? CSTR_LESS_THAN : CSTR_GREATER_THAN;
|
||||
+ ret = sortkey_compare(flags, locale, str1, len1, str2, len2);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.35.1
|
||||
|
@@ -1,3 +0,0 @@
|
||||
Fixes: [5163] Microsoft Office XP 2002 installer reports error 25003 (installation source corrupted), custom action 'CADpc' returns 1603
|
||||
Fixes: [10767] Fix comparison of punctuation characters in lstrcmp
|
||||
Fixes: [32490] Graphical issues in Inquisitor
|
@@ -1,4 +1,4 @@
|
||||
From de8040e1a8900116a6a3fa0f0560e4a3c66d4d71 Mon Sep 17 00:00:00 2001
|
||||
From 0dc447fc1d384c9412e9c8f55bfef9adfaeec994 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sat, 5 Aug 2017 03:39:23 +0200
|
||||
Subject: [PATCH] ntdll: Use fast CS functions for heap locking.
|
||||
@@ -8,10 +8,10 @@ Subject: [PATCH] ntdll: Use fast CS functions for heap locking.
|
||||
1 file changed, 8 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
|
||||
index 51567d0552b..b1dcb01cd4f 100644
|
||||
index 1b6337d4ce8..ea2d4153b96 100644
|
||||
--- a/dlls/ntdll/heap.c
|
||||
+++ b/dlls/ntdll/heap.c
|
||||
@@ -340,13 +340,13 @@ static inline ULONG heap_get_flags( const HEAP *heap, ULONG flags )
|
||||
@@ -457,13 +457,13 @@ static inline ULONG heap_get_flags( const HEAP *heap, ULONG flags )
|
||||
static void heap_lock( HEAP *heap, ULONG flags )
|
||||
{
|
||||
if (heap_get_flags( heap, flags ) & HEAP_NO_SERIALIZE) return;
|
||||
@@ -27,19 +27,19 @@ index 51567d0552b..b1dcb01cd4f 100644
|
||||
}
|
||||
|
||||
static void heap_set_status( const HEAP *heap, ULONG flags, NTSTATUS status )
|
||||
@@ -1577,9 +1577,9 @@ HANDLE WINAPI RtlCreateHeap( ULONG flags, PVOID addr, SIZE_T totalSize, SIZE_T c
|
||||
@@ -1401,9 +1401,9 @@ HANDLE WINAPI RtlCreateHeap( ULONG flags, PVOID addr, SIZE_T totalSize, SIZE_T c
|
||||
/* link it into the per-process heap list */
|
||||
if (processHeap)
|
||||
{
|
||||
HEAP *heapPtr = subheap->heap;
|
||||
- RtlEnterCriticalSection( &processHeap->cs );
|
||||
+ enter_critical_section( &processHeap->cs );
|
||||
list_add_head( &processHeap->entry, &heapPtr->entry );
|
||||
list_add_head( &processHeap->entry, &heap->entry );
|
||||
- RtlLeaveCriticalSection( &processHeap->cs );
|
||||
+ leave_critical_section( &processHeap->cs );
|
||||
}
|
||||
else if (!addr)
|
||||
{
|
||||
@@ -1623,9 +1623,9 @@ HANDLE WINAPI RtlDestroyHeap( HANDLE heap )
|
||||
@@ -1447,9 +1447,9 @@ HANDLE WINAPI RtlDestroyHeap( HANDLE heap )
|
||||
if (heap == processHeap) return heap; /* cannot delete the main process heap */
|
||||
|
||||
/* remove it from the per-process list */
|
||||
@@ -51,7 +51,7 @@ index 51567d0552b..b1dcb01cd4f 100644
|
||||
|
||||
heapPtr->cs.DebugInfo->Spare[0] = 0;
|
||||
RtlDeleteCriticalSection( &heapPtr->cs );
|
||||
@@ -2171,7 +2171,7 @@ ULONG WINAPI RtlGetProcessHeaps( ULONG count, HANDLE *heaps )
|
||||
@@ -1930,7 +1930,7 @@ ULONG WINAPI RtlGetProcessHeaps( ULONG count, HANDLE *heaps )
|
||||
ULONG total = 1; /* main heap */
|
||||
struct list *ptr;
|
||||
|
||||
@@ -60,7 +60,7 @@ index 51567d0552b..b1dcb01cd4f 100644
|
||||
LIST_FOR_EACH( ptr, &processHeap->entry ) total++;
|
||||
if (total <= count)
|
||||
{
|
||||
@@ -2179,7 +2179,7 @@ ULONG WINAPI RtlGetProcessHeaps( ULONG count, HANDLE *heaps )
|
||||
@@ -1938,7 +1938,7 @@ ULONG WINAPI RtlGetProcessHeaps( ULONG count, HANDLE *heaps )
|
||||
LIST_FOR_EACH( ptr, &processHeap->entry )
|
||||
*heaps++ = LIST_ENTRY( ptr, HEAP, entry );
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 6cfa7d9011879898a079614077a605c812cb440e Mon Sep 17 00:00:00 2001
|
||||
From da81169743bd7f070186ec5e58c89bab53d0bb7f Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 28 Sep 2014 23:39:51 +0200
|
||||
Subject: [PATCH] ntdll: OutputDebugString should throw the exception a second
|
||||
@@ -10,7 +10,7 @@ Subject: [PATCH] ntdll: OutputDebugString should throw the exception a second
|
||||
2 files changed, 21 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/dlls/kernelbase/debug.c b/dlls/kernelbase/debug.c
|
||||
index 9488f2e2399..1cea4b5ba3c 100644
|
||||
index 9e954e3ffbe..a6793c20204 100644
|
||||
--- a/dlls/kernelbase/debug.c
|
||||
+++ b/dlls/kernelbase/debug.c
|
||||
@@ -200,6 +200,23 @@ void WINAPI DECLSPEC_HOTPATCH OutputDebugStringA( LPCSTR str )
|
||||
@@ -38,10 +38,10 @@ index 9488f2e2399..1cea4b5ba3c 100644
|
||||
if (!mutex_inited)
|
||||
{
|
||||
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
|
||||
index c4413d4d66e..4fe2c2b04db 100644
|
||||
index 3e76b001147..0c02486e19c 100644
|
||||
--- a/dlls/ntdll/tests/exception.c
|
||||
+++ b/dlls/ntdll/tests/exception.c
|
||||
@@ -8327,7 +8327,7 @@ static LONG CALLBACK outputdebugstring_vectored_handler(EXCEPTION_POINTERS *Exce
|
||||
@@ -8345,7 +8345,7 @@ static LONG CALLBACK outputdebugstring_vectored_handler(EXCEPTION_POINTERS *Exce
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ index c4413d4d66e..4fe2c2b04db 100644
|
||||
{
|
||||
PVOID vectored_handler;
|
||||
|
||||
@@ -8343,7 +8343,6 @@ static void test_outputdebugstring(DWORD numexc, BOOL todo)
|
||||
@@ -8361,7 +8361,6 @@ static void test_outputdebugstring(DWORD numexc, BOOL todo)
|
||||
outputdebugstring_exceptions = 0;
|
||||
OutputDebugStringA("Hello World");
|
||||
|
||||
@@ -58,7 +58,7 @@ index c4413d4d66e..4fe2c2b04db 100644
|
||||
ok(outputdebugstring_exceptions == numexc, "OutputDebugStringA generated %ld exceptions, expected %ld\n",
|
||||
outputdebugstring_exceptions, numexc);
|
||||
|
||||
@@ -10660,9 +10659,9 @@ START_TEST(exception)
|
||||
@@ -10785,9 +10784,9 @@ START_TEST(exception)
|
||||
else skip( "RtlRaiseException not found\n" );
|
||||
#endif
|
||||
test_stage = 3;
|
||||
@@ -70,15 +70,15 @@ index c4413d4d66e..4fe2c2b04db 100644
|
||||
test_stage = 5;
|
||||
test_ripevent(0);
|
||||
test_stage = 6;
|
||||
@@ -10766,7 +10765,7 @@ START_TEST(exception)
|
||||
@@ -10900,7 +10899,7 @@ START_TEST(exception)
|
||||
test_debugger(DBG_EXCEPTION_HANDLED);
|
||||
test_debugger(DBG_CONTINUE);
|
||||
test_thread_context();
|
||||
- test_outputdebugstring(1, FALSE);
|
||||
+ test_outputdebugstring(1);
|
||||
test_ripevent(1);
|
||||
test_fastfail();
|
||||
test_breakpoint(1);
|
||||
test_closehandle(0, (HANDLE)0xdeadbeef);
|
||||
--
|
||||
2.35.1
|
||||
2.36.1
|
||||
|
||||
|
@@ -51,13 +51,13 @@ usage()
|
||||
# Get the upstream commit sha
|
||||
upstream_commit()
|
||||
{
|
||||
echo "230e953e31f7228d10c8b0a0d2e8cf4f9af9a231"
|
||||
echo "631f4d5e42b7c2f705eb4b40eeea0ce1866bf513"
|
||||
}
|
||||
|
||||
# Show version information
|
||||
version()
|
||||
{
|
||||
echo "Wine Staging 7.9"
|
||||
echo "Wine Staging 7.10"
|
||||
echo "Copyright (C) 2014-2019 the Wine Staging project authors."
|
||||
echo "Copyright (C) 2018-2020 Alistair Leslie-Hughes"
|
||||
echo ""
|
||||
@@ -108,6 +108,7 @@ patch_enable_all ()
|
||||
enable_dinput_joy_mappings="$1"
|
||||
enable_dsound_EAX="$1"
|
||||
enable_dsound_Fast_Mixer="$1"
|
||||
enable_dwmapi_DwmGetCompositionTimingInfo="$1"
|
||||
enable_dwrite_FontFallback="$1"
|
||||
enable_eventfd_synchronization="$1"
|
||||
enable_explorer_Video_Registry_Key="$1"
|
||||
@@ -123,7 +124,6 @@ patch_enable_all ()
|
||||
enable_kernel32_Processor_Group="$1"
|
||||
enable_krnl386_exe16_GDT_LDT_Emulation="$1"
|
||||
enable_krnl386_exe16_Invalid_Console_Handles="$1"
|
||||
enable_libs_Unicode_Collation="$1"
|
||||
enable_loader_KeyboardLayouts="$1"
|
||||
enable_mmsystem_dll16_MIDIHDR_Refcount="$1"
|
||||
enable_mountmgr_DosDevices="$1"
|
||||
@@ -349,6 +349,9 @@ patch_enable ()
|
||||
dsound-Fast_Mixer)
|
||||
enable_dsound_Fast_Mixer="$2"
|
||||
;;
|
||||
dwmapi-DwmGetCompositionTimingInfo)
|
||||
enable_dwmapi_DwmGetCompositionTimingInfo="$2"
|
||||
;;
|
||||
dwrite-FontFallback)
|
||||
enable_dwrite_FontFallback="$2"
|
||||
;;
|
||||
@@ -394,9 +397,6 @@ patch_enable ()
|
||||
krnl386.exe16-Invalid_Console_Handles)
|
||||
enable_krnl386_exe16_Invalid_Console_Handles="$2"
|
||||
;;
|
||||
libs-Unicode_Collation)
|
||||
enable_libs_Unicode_Collation="$2"
|
||||
;;
|
||||
loader-KeyboardLayouts)
|
||||
enable_loader_KeyboardLayouts="$2"
|
||||
;;
|
||||
@@ -1723,6 +1723,20 @@ if test "$enable_dsound_EAX" -eq 1; then
|
||||
patch_apply dsound-EAX/0023-dsound-Fake-success-for-EAX-Set-Buffer-ListenerPrope.patch
|
||||
fi
|
||||
|
||||
# Patchset dwmapi-DwmGetCompositionTimingInfo
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#53038] - dwmapi: Supply some defaults values for DwmGetCompositionTimingInfo.
|
||||
# | * [#53035] - dwmapi: DwmFlush return S_OK.
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/dwmapi/Makefile.in, dlls/dwmapi/dwmapi_main.c, dlls/dwmapi/tests/Makefile.in, dlls/dwmapi/tests/dwmapi.c
|
||||
# |
|
||||
if test "$enable_dwmapi_DwmGetCompositionTimingInfo" -eq 1; then
|
||||
patch_apply dwmapi-DwmGetCompositionTimingInfo/0001-dwmapi-Fill-rateRefresh-rateCompose-and-qpcRefreshPe.patch
|
||||
patch_apply dwmapi-DwmGetCompositionTimingInfo/0002-dwmapi-Return-S_OK-from-DwmFlush.patch
|
||||
fi
|
||||
|
||||
# Patchset dwrite-FontFallback
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
@@ -2112,26 +2126,6 @@ if test "$enable_krnl386_exe16_Invalid_Console_Handles" -eq 1; then
|
||||
patch_apply krnl386.exe16-Invalid_Console_Handles/0001-krnl386.exe16-Really-translate-all-invalid-console-h.patch
|
||||
fi
|
||||
|
||||
# Patchset libs-Unicode_Collation
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
# | * [#5163] Microsoft Office XP 2002 installer reports error 25003 (installation source corrupted), custom action 'CADpc'
|
||||
# | returns 1603
|
||||
# | * [#10767] Fix comparison of punctuation characters in lstrcmp
|
||||
# | * [#32490] Graphical issues in Inquisitor
|
||||
# |
|
||||
# | Modified files:
|
||||
# | * dlls/kernel32/tests/locale.c, dlls/kernelbase/locale.c
|
||||
# |
|
||||
if test "$enable_libs_Unicode_Collation" -eq 1; then
|
||||
patch_apply libs-Unicode_Collation/0001-kernelbase-Implement-sortkey-generation-on-official-.patch
|
||||
patch_apply libs-Unicode_Collation/0002-kernelbase-Implement-sortkey-punctuation.patch
|
||||
patch_apply libs-Unicode_Collation/0003-kernelbase-Implement-sortkey-for-Japanese-characters.patch
|
||||
patch_apply libs-Unicode_Collation/0004-kernelbase-Implement-sortkey-expansion.patch
|
||||
patch_apply libs-Unicode_Collation/0005-kernelbase-Implement-sortkey-language-support.patch
|
||||
patch_apply libs-Unicode_Collation/0006-kernelbase-Implement-CompareString-functions.patch
|
||||
fi
|
||||
|
||||
# Patchset loader-KeyboardLayouts
|
||||
# |
|
||||
# | This patchset fixes the following Wine bugs:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 54065eb714959facb7f4d463d9c8a11e5c6b2b42 Mon Sep 17 00:00:00 2001
|
||||
From 0c3e20339d2b531e62819b670b30635af6e75ea0 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Wed, 17 May 2017 23:55:55 +0800
|
||||
Subject: [PATCH] server: Add support for a layered window region. (v3)
|
||||
@@ -11,10 +11,10 @@ Subject: [PATCH] server: Add support for a layered window region. (v3)
|
||||
4 files changed, 84 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
|
||||
index e15de7e5ccd..568fd26bb69 100644
|
||||
index 62ff4ad7777..a458e002ca0 100644
|
||||
--- a/dlls/user32/tests/input.c
|
||||
+++ b/dlls/user32/tests/input.c
|
||||
@@ -3695,13 +3695,11 @@ static void test_Input_mouse(void)
|
||||
@@ -3683,13 +3683,11 @@ static void test_Input_mouse(void)
|
||||
|
||||
if (msg.message == WM_LBUTTONDOWN)
|
||||
{
|
||||
@@ -29,18 +29,18 @@ index e15de7e5ccd..568fd26bb69 100644
|
||||
got_button_up = TRUE;
|
||||
break;
|
||||
diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
|
||||
index 550c5f06f37..8204e3dba9e 100644
|
||||
index 10388a1cc8f..5ff6e23fa8d 100644
|
||||
--- a/dlls/winex11.drv/bitblt.c
|
||||
+++ b/dlls/winex11.drv/bitblt.c
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "winbase.h"
|
||||
@@ -48,6 +48,7 @@
|
||||
|
||||
#include "x11drv.h"
|
||||
#include "winternl.h"
|
||||
+#include "wine/server.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(bitblt);
|
||||
@@ -1623,6 +1624,48 @@ static inline void add_row( HRGN rgn, RGNDATA *data, int x, int y, int len )
|
||||
@@ -1625,6 +1626,48 @@ static inline void add_row( HRGN rgn, RGNDATA *data, int x, int y, int len )
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -89,7 +89,7 @@ index 550c5f06f37..8204e3dba9e 100644
|
||||
/***********************************************************************
|
||||
* update_surface_region
|
||||
*/
|
||||
@@ -1641,6 +1684,7 @@ static void update_surface_region( struct x11drv_window_surface *surface )
|
||||
@@ -1643,6 +1686,7 @@ static void update_surface_region( struct x11drv_window_surface *surface )
|
||||
if (!surface->is_argb && surface->color_key == CLR_INVALID)
|
||||
{
|
||||
XShapeCombineMask( gdi_display, surface->window, ShapeBounding, 0, 0, None, ShapeSet );
|
||||
@@ -97,7 +97,7 @@ index 550c5f06f37..8204e3dba9e 100644
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1751,6 +1795,7 @@ static void update_surface_region( struct x11drv_window_surface *surface )
|
||||
@@ -1753,6 +1797,7 @@ static void update_surface_region( struct x11drv_window_surface *surface )
|
||||
free( data );
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 4fb0e8d596496359484426d726a929ff8acf2e21 Mon Sep 17 00:00:00 2001
|
||||
From 3c53044557316db957a20471118c1481bb712a6c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Thu, 23 Jan 2020 11:00:19 +0100
|
||||
Subject: [PATCH] winex11.drv: Support XInput2 events for individual windows.
|
||||
@@ -14,10 +14,10 @@ which can bring additional information.
|
||||
5 files changed, 65 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/dlls/winex11.drv/desktop.c b/dlls/winex11.drv/desktop.c
|
||||
index c335bc5ba2b..3523e9c843c 100644
|
||||
index bc2ba60397b..96f74478600 100644
|
||||
--- a/dlls/winex11.drv/desktop.c
|
||||
+++ b/dlls/winex11.drv/desktop.c
|
||||
@@ -359,6 +359,7 @@ NTSTATUS x11drv_create_desktop( void *arg )
|
||||
@@ -363,6 +363,7 @@ NTSTATUS x11drv_create_desktop( void *arg )
|
||||
0, 0, params->width, params->height, 0, default_visual.depth, InputOutput,
|
||||
default_visual.visual, CWEventMask | CWCursor | CWColormap, &win_attr );
|
||||
if (!win) return FALSE;
|
||||
@@ -26,10 +26,10 @@ index c335bc5ba2b..3523e9c843c 100644
|
||||
|
||||
X11DRV_init_desktop( win, params->width, params->height );
|
||||
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
|
||||
index a321e324a24..dec32ec963a 100644
|
||||
index f81d2338faf..93032cedf70 100644
|
||||
--- a/dlls/winex11.drv/event.c
|
||||
+++ b/dlls/winex11.drv/event.c
|
||||
@@ -239,6 +239,13 @@ static Bool filter_event( Display *display, XEvent *event, char *arg )
|
||||
@@ -237,6 +237,13 @@ static Bool filter_event( Display *display, XEvent *event, char *arg )
|
||||
return (mask & QS_MOUSEBUTTON) != 0;
|
||||
#ifdef GenericEvent
|
||||
case GenericEvent:
|
||||
@@ -44,10 +44,10 @@ index a321e324a24..dec32ec963a 100644
|
||||
case MotionNotify:
|
||||
case EnterNotify:
|
||||
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
|
||||
index eee737a1e40..bf67d6b727f 100644
|
||||
index b0dce3b245f..0725da89f67 100644
|
||||
--- a/dlls/winex11.drv/mouse.c
|
||||
+++ b/dlls/winex11.drv/mouse.c
|
||||
@@ -304,20 +304,32 @@ void x11drv_xinput_init(void)
|
||||
@@ -305,20 +305,32 @@ void x11drv_xinput_init(void)
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
@@ -85,7 +85,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
|
||||
mask.mask = mask_bits;
|
||||
mask.mask_len = sizeof(mask_bits);
|
||||
@@ -327,8 +339,9 @@ static void enable_xinput2(void)
|
||||
@@ -328,8 +340,9 @@ static void enable_xinput2(void)
|
||||
XISetMask( mask_bits, XI_RawMotion );
|
||||
XISetMask( mask_bits, XI_ButtonPress );
|
||||
|
||||
@@ -96,7 +96,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
pointer_info = pXIQueryDevice( data->display, data->xi2_core_pointer, &count );
|
||||
update_relative_valuators( pointer_info->classes, pointer_info->num_classes );
|
||||
pXIFreeDeviceInfo( pointer_info );
|
||||
@@ -337,7 +350,7 @@ static void enable_xinput2(void)
|
||||
@@ -338,7 +351,7 @@ static void enable_xinput2(void)
|
||||
* no XI_DeviceChanged events happened. If any hierarchy change occurred that
|
||||
* might be relevant here (eg. user switching mice after (un)plugging), a
|
||||
* XI_DeviceChanged event will point us to the right slave. So this list is
|
||||
@@ -105,7 +105,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
*/
|
||||
if (data->xi2_devices) pXIFreeDeviceInfo( data->xi2_devices );
|
||||
data->xi2_devices = pXIQueryDevice( data->display, XIAllDevices, &data->xi2_device_count );
|
||||
@@ -349,24 +362,37 @@ static void enable_xinput2(void)
|
||||
@@ -350,24 +363,37 @@ static void enable_xinput2(void)
|
||||
#endif
|
||||
|
||||
/***********************************************************************
|
||||
@@ -149,7 +149,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
pXIFreeDeviceInfo( data->xi2_devices );
|
||||
data->x_valuator.number = -1;
|
||||
data->y_valuator.number = -1;
|
||||
@@ -375,6 +401,7 @@ static void disable_xinput2(void)
|
||||
@@ -376,6 +402,7 @@ static void disable_xinput2(void)
|
||||
data->xi2_devices = NULL;
|
||||
data->xi2_core_pointer = 0;
|
||||
data->xi2_current_slave = 0;
|
||||
@@ -157,7 +157,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -417,7 +444,7 @@ static BOOL grab_clipping_window( const RECT *clip )
|
||||
@@ -421,7 +448,7 @@ static BOOL grab_clipping_window( const RECT *clip )
|
||||
}
|
||||
|
||||
/* enable XInput2 unless we are already clipping */
|
||||
@@ -166,7 +166,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
|
||||
if (data->xi2_state != xi_enabled)
|
||||
{
|
||||
@@ -447,7 +474,7 @@ static BOOL grab_clipping_window( const RECT *clip )
|
||||
@@ -451,7 +478,7 @@ static BOOL grab_clipping_window( const RECT *clip )
|
||||
|
||||
if (!clipping_cursor)
|
||||
{
|
||||
@@ -175,7 +175,7 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
NtUserDestroyWindow( msg_hwnd );
|
||||
return FALSE;
|
||||
}
|
||||
@@ -530,7 +557,7 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND prev_clip_hwnd, HWND new_clip_hwnd )
|
||||
@@ -534,7 +561,7 @@ LRESULT clip_cursor_notify( HWND hwnd, HWND prev_clip_hwnd, HWND new_clip_hwnd )
|
||||
TRACE( "clip hwnd reset from %p\n", hwnd );
|
||||
data->clip_hwnd = 0;
|
||||
data->clip_reset = NtGetTickCount();
|
||||
@@ -185,10 +185,10 @@ index eee737a1e40..bf67d6b727f 100644
|
||||
}
|
||||
else if (prev_clip_hwnd)
|
||||
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
|
||||
index b9450911abc..4c7faeac969 100644
|
||||
index 5d9a93688c3..bfad72482e6 100644
|
||||
--- a/dlls/winex11.drv/window.c
|
||||
+++ b/dlls/winex11.drv/window.c
|
||||
@@ -358,6 +358,7 @@ static void sync_window_style( struct x11drv_win_data *data )
|
||||
@@ -361,6 +361,7 @@ static void sync_window_style( struct x11drv_win_data *data )
|
||||
int mask = get_window_attributes( data, &attr );
|
||||
|
||||
XChangeWindowAttributes( data->display, data->whole_window, mask, &attr );
|
||||
@@ -196,7 +196,7 @@ index b9450911abc..4c7faeac969 100644
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1593,6 +1594,7 @@ static void create_whole_window( struct x11drv_win_data *data )
|
||||
@@ -1599,6 +1600,7 @@ static void create_whole_window( struct x11drv_win_data *data )
|
||||
data->vis.visual, mask, &attr );
|
||||
if (!data->whole_window) goto done;
|
||||
|
||||
@@ -204,19 +204,19 @@ index b9450911abc..4c7faeac969 100644
|
||||
set_initial_wm_hints( data->display, data->whole_window );
|
||||
set_wm_hints( data );
|
||||
|
||||
@@ -1907,6 +1909,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd )
|
||||
@@ -1911,6 +1913,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd )
|
||||
data->clip_window = XCreateWindow( data->display, root_window, 0, 0, 1, 1, 0, 0,
|
||||
InputOnly, default_visual.visual,
|
||||
CWOverrideRedirect | CWEventMask, &attr );
|
||||
+ x11drv_xinput_enable( data->display, data->clip_window, attr.event_mask );
|
||||
XFlush( data->display );
|
||||
NtUserSetProp( hwnd, clip_window_prop, (HANDLE)data->clip_window );
|
||||
x11drv_client_call( client_clipboard_init, 0 );
|
||||
X11DRV_DisplayDevices_RegisterEventHandlers();
|
||||
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
|
||||
index d92a235f889..82540cab507 100644
|
||||
index 9fd5fb481a7..c1c5f1ac34d 100644
|
||||
--- a/dlls/winex11.drv/x11drv.h
|
||||
+++ b/dlls/winex11.drv/x11drv.h
|
||||
@@ -253,6 +253,8 @@ extern void X11DRV_ThreadDetach(void) DECLSPEC_HIDDEN;
|
||||
@@ -259,6 +259,8 @@ extern void X11DRV_ThreadDetach(void) DECLSPEC_HIDDEN;
|
||||
extern void X11DRV_Xcursor_Init(void) DECLSPEC_HIDDEN;
|
||||
extern void x11drv_xinput_load(void) DECLSPEC_HIDDEN;
|
||||
extern void x11drv_xinput_init(void) DECLSPEC_HIDDEN;
|
||||
@@ -225,7 +225,7 @@ index d92a235f889..82540cab507 100644
|
||||
|
||||
extern DWORD copy_image_bits( BITMAPINFO *info, BOOL is_r8g8b8, XImage *image,
|
||||
const struct gdi_image_bits *src_bits, struct gdi_image_bits *dst_bits,
|
||||
@@ -359,6 +361,14 @@ struct x11drv_escape_flush_gl_drawable
|
||||
@@ -364,6 +366,14 @@ struct x11drv_escape_flush_gl_drawable
|
||||
* X11 USER driver
|
||||
*/
|
||||
|
||||
@@ -240,7 +240,7 @@ index d92a235f889..82540cab507 100644
|
||||
struct x11drv_thread_data
|
||||
{
|
||||
Display *display;
|
||||
@@ -375,7 +385,7 @@ struct x11drv_thread_data
|
||||
@@ -379,7 +389,7 @@ struct x11drv_thread_data
|
||||
HWND clip_hwnd; /* message window stored in desktop while clipping is active */
|
||||
DWORD clip_reset; /* time when clipping was last reset */
|
||||
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
|
||||
@@ -250,5 +250,5 @@ index d92a235f889..82540cab507 100644
|
||||
int xi2_device_count;
|
||||
XIValuatorClassInfo x_valuator;
|
||||
--
|
||||
2.35.1
|
||||
2.36.1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 91fc3cbb52d157a44a59c5c2a12dc872c8559551 Mon Sep 17 00:00:00 2001
|
||||
From e918b15543bd0fef3005fdd931e2f3a69b5f78c2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
||||
Date: Wed, 24 Mar 2021 23:29:28 +0100
|
||||
Subject: [PATCH] user32: Set SEND_HWMSG_RAWINPUT flags only when RAWINPUT is
|
||||
@@ -20,7 +20,7 @@ __wine_send_input with INPUT_HARDWARE input type and a rawinput.
|
||||
9 files changed, 26 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c
|
||||
index 06393b0f392..9b217647071 100644
|
||||
index ff2b570957e..85004c13e10 100644
|
||||
--- a/dlls/win32u/input.c
|
||||
+++ b/dlls/win32u/input.c
|
||||
@@ -131,6 +131,7 @@ UINT WINAPI NtUserSendInput( UINT count, INPUT *inputs, int size )
|
||||
@@ -41,7 +41,7 @@ index 06393b0f392..9b217647071 100644
|
||||
case INPUT_HARDWARE:
|
||||
SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
|
||||
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c
|
||||
index 13645122161..025ff61d447 100644
|
||||
index db8b893f805..54990243bf1 100644
|
||||
--- a/dlls/win32u/message.c
|
||||
+++ b/dlls/win32u/message.c
|
||||
@@ -2404,7 +2404,7 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, const RAWINPUT *r
|
||||
@@ -114,43 +114,43 @@ index 5143990836f..d91a5c4d3ff 100644
|
||||
|
||||
default:
|
||||
diff --git a/dlls/winemac.drv/ime.c b/dlls/winemac.drv/ime.c
|
||||
index 8b89c0089fc..11b7a4cbccd 100644
|
||||
index fd94591a2b8..fe96b077a55 100644
|
||||
--- a/dlls/winemac.drv/ime.c
|
||||
+++ b/dlls/winemac.drv/ime.c
|
||||
@@ -42,6 +42,7 @@
|
||||
#include "winuser.h"
|
||||
@@ -38,6 +38,7 @@
|
||||
#include "imm.h"
|
||||
#include "ddk/imm.h"
|
||||
#include "wine/debug.h"
|
||||
+#include "wine/server.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(imm);
|
||||
|
||||
@@ -1418,6 +1419,7 @@ void macdrv_im_set_text(const macdrv_event *event)
|
||||
event->im_set_text.cursor_pos, !event->im_set_text.complete);
|
||||
@@ -1408,6 +1409,7 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size)
|
||||
params->cursor_pos, !params->complete);
|
||||
else
|
||||
{
|
||||
+ RAWINPUT rawinput;
|
||||
INPUT input;
|
||||
CFIndex i;
|
||||
unsigned int i;
|
||||
|
||||
@@ -1430,10 +1432,10 @@ void macdrv_im_set_text(const macdrv_event *event)
|
||||
@@ -1420,10 +1422,10 @@ NTSTATUS WINAPI macdrv_ime_set_text(void *arg, ULONG size)
|
||||
{
|
||||
input.ki.wScan = chars[i];
|
||||
input.ki.wScan = params->text[i];
|
||||
input.ki.dwFlags = KEYEVENTF_UNICODE;
|
||||
- __wine_send_input(hwnd, &input, NULL);
|
||||
+ __wine_send_input(hwnd, &input, &rawinput);
|
||||
- __wine_send_input(params->hwnd, &input, NULL);
|
||||
+ __wine_send_input(params->hwnd, &input, &rawinput);
|
||||
|
||||
input.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
|
||||
- __wine_send_input(hwnd, &input, NULL);
|
||||
+ __wine_send_input(hwnd, &input, &rawinput);
|
||||
- __wine_send_input(params->hwnd, &input, NULL);
|
||||
+ __wine_send_input(params->hwnd, &input, &rawinput);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c
|
||||
index acd6fe6bf0a..23be3d1aa07 100644
|
||||
index 824addad78b..5859aa8a4eb 100644
|
||||
--- a/dlls/winemac.drv/keyboard.c
|
||||
+++ b/dlls/winemac.drv/keyboard.c
|
||||
@@ -916,6 +916,7 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
||||
@@ -990,6 +990,7 @@ void macdrv_compute_keyboard_layout(struct macdrv_thread_data *thread_data)
|
||||
*/
|
||||
static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, DWORD flags, DWORD time)
|
||||
{
|
||||
@@ -158,7 +158,7 @@ index acd6fe6bf0a..23be3d1aa07 100644
|
||||
INPUT input;
|
||||
|
||||
TRACE_(key)("hwnd %p vkey=%04x scan=%04x flags=%04x\n", hwnd, vkey, scan, flags);
|
||||
@@ -927,7 +928,7 @@ static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, DWORD fl
|
||||
@@ -1001,7 +1002,7 @@ static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, DWORD fl
|
||||
input.ki.time = time;
|
||||
input.ki.dwExtraInfo = 0;
|
||||
|
||||
@@ -168,10 +168,10 @@ index acd6fe6bf0a..23be3d1aa07 100644
|
||||
|
||||
|
||||
diff --git a/dlls/winemac.drv/mouse.c b/dlls/winemac.drv/mouse.c
|
||||
index 34d6febdefa..18b93b1ab97 100644
|
||||
index 3f79dda2073..b1d50f39ac8 100644
|
||||
--- a/dlls/winemac.drv/mouse.c
|
||||
+++ b/dlls/winemac.drv/mouse.c
|
||||
@@ -136,6 +136,7 @@ static const CFStringRef cocoa_cursor_names[] =
|
||||
@@ -129,6 +129,7 @@ static const CFStringRef cocoa_cursor_names[] =
|
||||
static void send_mouse_input(HWND hwnd, macdrv_window cocoa_window, UINT flags, int x, int y,
|
||||
DWORD mouse_data, BOOL drag, unsigned long time)
|
||||
{
|
||||
@@ -179,7 +179,7 @@ index 34d6febdefa..18b93b1ab97 100644
|
||||
INPUT input;
|
||||
HWND top_level_hwnd;
|
||||
|
||||
@@ -165,7 +166,7 @@ static void send_mouse_input(HWND hwnd, macdrv_window cocoa_window, UINT flags,
|
||||
@@ -158,7 +159,7 @@ static void send_mouse_input(HWND hwnd, macdrv_window cocoa_window, UINT flags,
|
||||
input.mi.time = time;
|
||||
input.mi.dwExtraInfo = 0;
|
||||
|
||||
@@ -189,10 +189,10 @@ index 34d6febdefa..18b93b1ab97 100644
|
||||
|
||||
|
||||
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
|
||||
index 2c7c2e6c5be..8b2a89236f8 100644
|
||||
index 3029cb4c5eb..a12ee3d54dd 100644
|
||||
--- a/dlls/winex11.drv/keyboard.c
|
||||
+++ b/dlls/winex11.drv/keyboard.c
|
||||
@@ -1130,6 +1130,7 @@ static WORD EVENT_event_to_vkey( XIC xic, XKeyEvent *e)
|
||||
@@ -1134,6 +1134,7 @@ static WORD EVENT_event_to_vkey( XIC xic, XKeyEvent *e)
|
||||
*/
|
||||
static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD flags, DWORD time )
|
||||
{
|
||||
@@ -200,7 +200,7 @@ index 2c7c2e6c5be..8b2a89236f8 100644
|
||||
INPUT input;
|
||||
|
||||
TRACE_(key)( "hwnd %p vkey=%04x scan=%04x flags=%04x\n", hwnd, vkey, scan, flags );
|
||||
@@ -1141,7 +1142,7 @@ static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD f
|
||||
@@ -1145,7 +1146,7 @@ static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD f
|
||||
input.u.ki.time = time;
|
||||
input.u.ki.dwExtraInfo = 0;
|
||||
|
||||
@@ -210,10 +210,10 @@ index 2c7c2e6c5be..8b2a89236f8 100644
|
||||
|
||||
|
||||
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
|
||||
index 8878a99d14e..49048c83fed 100644
|
||||
index 6b5f67a2c00..86cbd72387c 100644
|
||||
--- a/dlls/winex11.drv/mouse.c
|
||||
+++ b/dlls/winex11.drv/mouse.c
|
||||
@@ -745,6 +745,7 @@ static void map_event_coords( HWND hwnd, Window window, Window event_root, int x
|
||||
@@ -749,6 +749,7 @@ static void map_event_coords( HWND hwnd, Window window, Window event_root, int x
|
||||
static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPUT *input )
|
||||
{
|
||||
struct x11drv_win_data *data;
|
||||
@@ -221,7 +221,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
|
||||
input->type = INPUT_MOUSE;
|
||||
|
||||
@@ -761,7 +762,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
|
||||
@@ -765,7 +766,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
|
||||
sync_window_cursor( window );
|
||||
last_cursor_change = input->u.mi.time;
|
||||
}
|
||||
@@ -230,7 +230,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -801,7 +802,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
|
||||
@@ -805,7 +806,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
|
||||
SERVER_END_REQ;
|
||||
}
|
||||
|
||||
@@ -239,7 +239,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
}
|
||||
|
||||
#ifdef SONAME_LIBXCURSOR
|
||||
@@ -1759,6 +1760,7 @@ void move_resize_window( HWND hwnd, int dir )
|
||||
@@ -1787,6 +1788,7 @@ void move_resize_window( HWND hwnd, int dir )
|
||||
{
|
||||
MSG msg;
|
||||
INPUT input;
|
||||
@@ -247,7 +247,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
int x, y, rootX, rootY;
|
||||
|
||||
if (!XQueryPointer( display, root_window, &root, &child, &rootX, &rootY, &x, &y, &xstate )) break;
|
||||
@@ -1774,7 +1776,7 @@ void move_resize_window( HWND hwnd, int dir )
|
||||
@@ -1802,7 +1804,7 @@ void move_resize_window( HWND hwnd, int dir )
|
||||
input.u.mi.dwFlags = button_up_flags[button - 1] | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
|
||||
input.u.mi.time = NtGetTickCount();
|
||||
input.u.mi.dwExtraInfo = 0;
|
||||
@@ -256,7 +256,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
}
|
||||
|
||||
while (NtUserPeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
|
||||
@@ -1987,6 +1989,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
|
||||
@@ -2015,6 +2017,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input )
|
||||
static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
|
||||
{
|
||||
XIRawEvent *event = xev->data;
|
||||
@@ -264,7 +264,7 @@ index 8878a99d14e..49048c83fed 100644
|
||||
INPUT input;
|
||||
|
||||
if (broken_rawevents && is_old_motion_event( xev->serial ))
|
||||
@@ -2004,7 +2007,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
|
||||
@@ -2032,7 +2035,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
|
||||
input.u.mi.dy = 0;
|
||||
if (!map_raw_event_coords( event, &input )) return FALSE;
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 9a550439fe370711ce1a2146753aa41026d5fb2a Mon Sep 17 00:00:00 2001
|
||||
From 99c5822c8856c033ae30776ad2f6522f089f96ab Mon Sep 17 00:00:00 2001
|
||||
From: Ken Thomases <ken@codeweavers.com>
|
||||
Date: Tue, 22 Jun 2021 07:56:43 +1000
|
||||
Subject: [PATCH] winemac.drv: No Flicker patch
|
||||
@@ -10,30 +10,30 @@ Subject: [PATCH] winemac.drv: No Flicker patch
|
||||
3 files changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h
|
||||
index d73a52fa35f..f85973de13d 100644
|
||||
index 7c0f7127883..ec82202cd4e 100644
|
||||
--- a/dlls/winemac.drv/macdrv.h
|
||||
+++ b/dlls/winemac.drv/macdrv.h
|
||||
@@ -41,6 +41,7 @@
|
||||
extern BOOL allow_set_gamma DECLSPEC_HIDDEN;
|
||||
extern BOOL allow_software_rendering DECLSPEC_HIDDEN;
|
||||
extern BOOL disable_window_decorations DECLSPEC_HIDDEN;
|
||||
extern HMODULE macdrv_module DECLSPEC_HIDDEN;
|
||||
+extern BOOL force_backing_store DECLSPEC_HIDDEN;
|
||||
|
||||
|
||||
extern const char* debugstr_cf(CFTypeRef t) DECLSPEC_HIDDEN;
|
||||
extern NTSTATUS (WINAPI *pNtWaitForMultipleObjects)(ULONG,const HANDLE*,BOOLEAN,
|
||||
BOOLEAN,const LARGE_INTEGER*) DECLSPEC_HIDDEN;
|
||||
diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c
|
||||
index d8d16b1f4df..09fee166a05 100644
|
||||
index e1fd7b2d331..f9d97ee70ed 100644
|
||||
--- a/dlls/winemac.drv/macdrv_main.c
|
||||
+++ b/dlls/winemac.drv/macdrv_main.c
|
||||
@@ -63,6 +63,7 @@ int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE;
|
||||
@@ -66,6 +66,7 @@ int use_precise_scrolling = TRUE;
|
||||
int gl_surface_mode = GL_SURFACE_IN_FRONT_OPAQUE;
|
||||
int retina_enabled = FALSE;
|
||||
HMODULE macdrv_module = 0;
|
||||
int enable_app_nap = FALSE;
|
||||
+BOOL force_backing_store = FALSE;
|
||||
|
||||
CFDictionaryRef localized_strings;
|
||||
|
||||
@@ -213,6 +214,9 @@ static void setup_options(void)
|
||||
@@ -386,6 +387,9 @@ static void setup_options(void)
|
||||
if (!get_config_key(hkey, appkey, "EnableAppNap", buffer, sizeof(buffer)))
|
||||
enable_app_nap = IS_OPTION_TRUE(buffer[0]);
|
||||
|
||||
@@ -44,10 +44,10 @@ index d8d16b1f4df..09fee166a05 100644
|
||||
processes in the prefix. */
|
||||
if (!get_config_key(hkey, NULL, "RetinaMode", buffer, sizeof(buffer)))
|
||||
diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c
|
||||
index 33132de7415..b2c66296d9c 100644
|
||||
index 63b24ee991d..b1c43e77f37 100644
|
||||
--- a/dlls/winemac.drv/opengl.c
|
||||
+++ b/dlls/winemac.drv/opengl.c
|
||||
@@ -1465,7 +1465,7 @@ static BOOL create_context(struct wgl_context *context, CGLContextObj share, uns
|
||||
@@ -1452,7 +1452,7 @@ static BOOL create_context(struct wgl_context *context, CGLContextObj share, uns
|
||||
attribs[n++] = pf->samples;
|
||||
}
|
||||
|
||||
@@ -57,5 +57,5 @@ index 33132de7415..b2c66296d9c 100644
|
||||
|
||||
if (core)
|
||||
--
|
||||
2.33.0
|
||||
2.35.1
|
||||
|
||||
|
@@ -1,2 +1,2 @@
|
||||
Wine Staging 7.9
|
||||
Wine Staging 7.10
|
||||
|
||||
|
@@ -1 +1 @@
|
||||
230e953e31f7228d10c8b0a0d2e8cf4f9af9a231
|
||||
631f4d5e42b7c2f705eb4b40eeea0ce1866bf513
|
||||
|
Reference in New Issue
Block a user