winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
February 2023
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
599 discussions
Start a n
N
ew thread
Alexandre Julliard : winedump: Print more information from the PE Load Config directory.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 51adaa33e3c9283793d6f12c265e7fc1c9449d38 URL:
https://gitlab.winehq.org/wine/wine/-/commit/51adaa33e3c9283793d6f12c265e7f…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Tue Feb 7 17:58:25 2023 +0100 winedump: Print more information from the PE Load Config directory. --- dlls/ntdll/tests/generated.c | 70 ++++++++++++---------- include/winnt.h | 96 +++++++++++++++++++++++++----- tools/winedump/lib.c | 2 +- tools/winedump/pe.c | 138 ++++++++++++++++++++++++++++++++++++++++--- tools/winedump/winedump.h | 2 +- 5 files changed, 252 insertions(+), 56 deletions(-)
1
0
0
0
Gabriel Ivăncescu : kernelbase: Fix grouping repeat for number formatting.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 8d02e4e2e9fffc6ceca90900acf0d97ba5cdde90 URL:
https://gitlab.winehq.org/wine/wine/-/commit/8d02e4e2e9fffc6ceca90900acf0d9…
Author: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> Date: Thu Jan 19 18:47:14 2023 +0200 kernelbase: Fix grouping repeat for number formatting. Fixes a regression introduced by 56099a31242dcc522fb94643e70553e152c522ec. LOCALE_SGROUPING's string and the `Grouping` field in NUMBERFMTW are confusingly different. The former, which is what is fixed here, treats a '0' as a repeat of the previous grouping. But a 0 at the end of the `Grouping` field prevents it from repeating (it repeats by default otherwise) so it's the opposite. Note that without a '0' in the LOCALE_SGROUPING string, it shouldn't even repeat in the first place. Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com> --- dlls/kernel32/tests/locale.c | 78 ++++++++++++++++++++++++++++++++++++++++++++ dlls/kernelbase/locale.c | 66 ++++++++++++++++++++++++++++++++++--- 2 files changed, 139 insertions(+), 5 deletions(-) diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index 886240cc22c..b2c581dc518 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -1404,6 +1404,7 @@ static void test_GetNumberFormatA(void) static char szComma[] = { ',', '\0' }; int ret; LCID lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); + WCHAR grouping[32], t1000[8], dec[8], frac[8], lzero[8]; char buffer[BUFFER_SIZE]; NUMBERFMTA format; @@ -1522,6 +1523,22 @@ static void test_GetNumberFormatA(void) ret = GetNumberFormatA(lcid, 0, "123456789", &format, buffer, ARRAY_SIZE(buffer)); expect_str(ret, buffer, "1234,567,89.0"); + format.Grouping = 203; + ret = GetNumberFormatA(lcid, 0, "123456789", &format, buffer, ARRAY_SIZE(buffer)); + expect_str(ret, buffer, "1,234,567,,89.0"); + + format.Grouping = 2030; + ret = GetNumberFormatA(lcid, 0, "123456789", &format, buffer, ARRAY_SIZE(buffer)); + expect_str(ret, buffer, "1234,567,,89.0"); + + format.Grouping = 2003; + ret = GetNumberFormatA(lcid, 0, "123456789", &format, buffer, ARRAY_SIZE(buffer)); + expect_str(ret, buffer, "1,234,567,,,89.0"); + + format.Grouping = 1200; + ret = GetNumberFormatA(lcid, 0, "123456789", &format, buffer, ARRAY_SIZE(buffer)); + expect_str(ret, buffer, "123456,,78,9.0"); + /* Grouping of a negative number */ format.NegativeOrder = NEG_LEFT; format.Grouping = 3; @@ -1563,6 +1580,67 @@ static void test_GetNumberFormatA(void) ret = GetNumberFormatA(lcid, NUO, "-12345", NULL, buffer, ARRAY_SIZE(buffer)); expect_str(ret, buffer, "-12\xa0\x33\x34\x35,00"); /* Non breaking space */ } + + /* Test the actual LOCALE_SGROUPING string, the rules for repeats are opposite */ + if (GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, grouping, ARRAY_SIZE(grouping)) && + GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, t1000, ARRAY_SIZE(t1000)) && + GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, dec, ARRAY_SIZE(dec)) && + GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, frac, ARRAY_SIZE(frac)) && + GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, lzero, ARRAY_SIZE(lzero))) + { + static const struct + { + const char *grouping; + const char *expected; + } tests[] = { + { "3;0", "1,234,567,890.54321" }, + { "2;3", "12345,678,90.54321" }, + { "1", "123456789,0.54321" }, + { "1;0", "1,2,3,4,5,6,7,8,9,0.54321" }, + { "1;0;3", "123456,789,,0.54321" }, + { "0", "1234567890.54321" }, + { "0;0", "1234567890.54321" }, + { "0;1", "123456789,0.54321" }, + { "0;0;0", "1234567890.54321" }, + { "0;1;0", "1,2,3,4,5,6,7,8,9,0.54321" }, + { "2;0;0", "12345678,90.54321" }, + { "2;0;0;0", "12345678,,90.54321" }, + { "2;0;0;0;0", "12345678,,,90.54321" }, + { "2;0;0;1;0", "1,2,3,4,5,6,7,8,,,90.54321" }, + { "1;3;2", "1234,56,789,0.54321" }, + { "1;3;2;0", "12,34,56,789,0.54321" }, + { "3;1;1;2;0", "1,23,45,6,7,890.54321" }, + { "6;1", "123,4,567890.54321" }, + }; + unsigned i; + + SetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, ","); + SetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, "."); + SetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, "5"); + SetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ILZERO, "0"); + + for (i = 0; i < ARRAY_SIZE(tests); i++) + { + SetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, tests[i].grouping); + SetLastError(0xdeadbeef); + ret = GetNumberFormatA(LOCALE_USER_DEFAULT, 0, "1234567890.54321", NULL, buffer, ARRAY_SIZE(buffer)); + if (ret) + { + ok(GetLastError() == 0xdeadbeef, "[%u] unexpected error %lu\n", i, GetLastError()); + ok(ret == strlen(tests[i].expected) + 1, "[%u] unexpected ret %d\n", i, ret); + ok(!strcmp(buffer, tests[i].expected), "[%u] unexpected string %s\n", i, buffer); + } + else + ok(0, "[%u] expected success, got error %ld\n", i, GetLastError()); + } + + /* Restore */ + ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SGROUPING, grouping), "Restoring SGROUPING failed\n"); + ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, t1000), "Restoring STHOUSAND failed\n"); + ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, dec), "Restoring SDECIMAL failed\n"); + ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, frac), "Restoring IDIGITS failed\n"); + ok(SetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_ILZERO, lzero), "Restoring ILZERO failed\n"); + } } static void test_GetNumberFormatEx(void) diff --git a/dlls/kernelbase/locale.c b/dlls/kernelbase/locale.c index 1e96e49622e..13ec1ebeb3a 100644 --- a/dlls/kernelbase/locale.c +++ b/dlls/kernelbase/locale.c @@ -7245,8 +7245,20 @@ BOOL WINAPI SetUserGeoName(PWSTR geo_name) static void grouping_to_string( UINT grouping, WCHAR *buffer ) { + UINT last_digit = grouping % 10; WCHAR tmp[10], *p = tmp; + /* The string is confusingly different when it comes to repetitions (trailing zeros). For a string, + * a 0 signals that the format needs to be repeated, which is the opposite of the grouping integer. */ + if (last_digit == 0) + { + grouping /= 10; + + /* Special case: two or more trailing zeros result in zero-sided groupings, with no repeats */ + if (grouping % 10 == 0) + last_digit = ~0; + } + while (grouping) { *p++ = '0' + grouping % 10; @@ -7257,6 +7269,17 @@ static void grouping_to_string( UINT grouping, WCHAR *buffer ) *buffer++ = *(--p); if (p > tmp) *buffer++ = ';'; } + if (last_digit != 0) + { + *buffer++ = ';'; + *buffer++ = '0'; + if (last_digit == ~0) + { + /* Add another trailing zero due to the weird way trailing zeros work in grouping string */ + *buffer++ = ';'; + *buffer++ = '0'; + } + } *buffer = 0; } @@ -7272,9 +7295,9 @@ static WCHAR *prepend_str( WCHAR *end, const WCHAR *str ) static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decimal_sep, const WCHAR *thousand_sep, const WCHAR *grouping, UINT digits, BOOL lzero ) { + BOOL round = FALSE, repeat = FALSE; + UINT i, len = 0, prev = ~0; const WCHAR *frac = NULL; - BOOL round = FALSE; - UINT i, len = 0; *(--end) = 0; @@ -7327,9 +7350,43 @@ static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decima } if (len) lzero = FALSE; + /* leading 0s are ignored */ + while (grouping[0] == '0' && grouping[1] == ';') + grouping += 2; + while (len) { - UINT limit = *grouping == '0' ? ~0u : *grouping - '0'; + UINT limit = prev; + + if (!repeat) + { + limit = *grouping - '0'; + if (grouping[1] == ';') + { + grouping += 2; + if (limit) + prev = limit; + else + { + /* Trailing 0;0 is a special case */ + prev = ~0; + if (grouping[0] == '0' && grouping[1] != ';') + { + repeat = TRUE; + limit = prev; + } + } + } + else + { + repeat = TRUE; + if (!limit) + limit = prev; + else + prev = ~0; + } + } + while (len && limit--) { WCHAR ch = value[--len]; @@ -7345,7 +7402,6 @@ static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decima *(--end) = ch; } if (len) end = prepend_str( end, thousand_sep ); - if (grouping[1] == ';') grouping += 2; } if (round) *(--end) = '1'; else if (lzero) *(--end) = '0'; @@ -7356,7 +7412,7 @@ static WCHAR *format_number( WCHAR *end, const WCHAR *value, const WCHAR *decima static int get_number_format( const NLS_LOCALE_DATA *locale, DWORD flags, const WCHAR *value, const NUMBERFMTW *format, WCHAR *buffer, int len ) { - WCHAR *num, fmt_decimal[4], fmt_thousand[4], fmt_neg[5], grouping[20], output[256]; + WCHAR *num, fmt_decimal[4], fmt_thousand[4], fmt_neg[5], grouping[24], output[256]; const WCHAR *decimal_sep = fmt_decimal, *thousand_sep = fmt_thousand; DWORD digits, lzero, order; int ret = 0;
1
0
0
0
Rémi Bernon : win32u: Use KBDTABLES for NtUserToUnicodeEx.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 2d3516cde91f4e574d0970a7609c98ba72986272 URL:
https://gitlab.winehq.org/wine/wine/-/commit/2d3516cde91f4e574d0970a7609c98…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sat Jan 7 21:41:11 2023 +0100 win32u: Use KBDTABLES for NtUserToUnicodeEx. --- dlls/win32u/input.c | 122 ++++++++++++++++++++++------------------------------ 1 file changed, 52 insertions(+), 70 deletions(-) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index fd4d11e8b82..36f2a45f4ef 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -462,6 +462,20 @@ static UINT kbd_tables_get_mod_bits( const KBDTABLES *tables, UINT mod ) return -1; } +static UINT kbd_tables_get_mod_num( const KBDTABLES *tables, const BYTE *state, BOOL caps ) +{ + const MODIFIERS *mods = tables->pCharModifiers; + const VK_TO_BIT *entry; + WORD bits = 0; + + for (entry = mods->pVkToBit; entry->Vk; ++entry) + if (state[entry->Vk] & 0x80) bits |= entry->ModBits; + if (caps) bits |= KBDSHIFT; + + if (bits > mods->wMaxModBits) return -1; + return mods->ModNumber[bits]; +} + static WORD kbd_tables_wchar_to_vkey( const KBDTABLES *tables, WCHAR wch ) { const VK_TO_WCHAR_TABLE *table; @@ -488,6 +502,37 @@ static WORD kbd_tables_wchar_to_vkey( const KBDTABLES *tables, WCHAR wch ) return wch >= 0x0080 ? -1 : 0; } +static WCHAR kbd_tables_vkey_to_wchar( const KBDTABLES *tables, UINT vkey, const BYTE *state ) +{ + UINT mod, caps_mod, alt, ctrl, caps; + const VK_TO_WCHAR_TABLE *table; + const VK_TO_WCHARS1 *entry; + + alt = state[VK_MENU] & 0x80; + ctrl = state[VK_CONTROL] & 0x80; + caps = state[VK_CAPITAL] & 1; + + if (ctrl && alt) return WCH_NONE; + if (!ctrl && vkey == VK_ESCAPE) return VK_ESCAPE; + + mod = caps_mod = kbd_tables_get_mod_num( tables, state, FALSE ); + if (caps) caps_mod = kbd_tables_get_mod_num( tables, state, TRUE ); + + for (table = tables->pVkToWcharTable; table->pVkToWchars; table++) + { + if (table->nModifications <= mod) continue; + for (entry = table->pVkToWchars; entry->VirtualKey; entry = NEXT_ENTRY(table, entry)) + { + if (entry->VirtualKey != vkey) continue; + if ((entry->Attributes & CAPLOK) && table->nModifications > caps_mod) return entry->wch[caps_mod]; + return entry->wch[mod]; + } + } + + if (ctrl && vkey >= 'A' && vkey <= 'Z') return vkey - 'A' + 1; + return WCH_NONE; +} + #undef NEXT_ENTRY /********************************************************************** @@ -1079,86 +1124,23 @@ INT WINAPI NtUserGetKeyNameText( LONG lparam, WCHAR *buffer, INT size ) INT WINAPI NtUserToUnicodeEx( UINT virt, UINT scan, const BYTE *state, WCHAR *str, int size, UINT flags, HKL layout ) { - BOOL shift, ctrl, alt, numlock; - WCHAR buffer[2]; + const KBDTABLES *kbd_tables = &kbdus_tables; + WCHAR buffer[2] = {0}; INT len; - TRACE_(keyboard)( "virt %u, scan %u, state %p, str %p, size %d, flags %x, layout %p.\n", + TRACE_(keyboard)( "virt %#x, scan %#x, state %p, str %p, size %d, flags %#x, layout %p.\n", virt, scan, state, str, size, flags, layout ); if (!state) return 0; if ((len = user_driver->pToUnicodeEx( virt, scan, state, str, size, flags, layout )) >= -1) return len; - alt = state[VK_MENU] & 0x80; - shift = state[VK_SHIFT] & 0x80; - ctrl = state[VK_CONTROL] & 0x80; - numlock = state[VK_NUMLOCK] & 0x01; + if (scan & 0x8000) buffer[0] = 0; /* key up */ + else buffer[0] = kbd_tables_vkey_to_wchar( kbd_tables, virt, state ); - /* FIXME: English keyboard layout specific */ + if (buffer[0] != WCH_NONE) len = 1; + else buffer[0] = len = 0; - if (scan & 0x8000) buffer[0] = 0; /* key up */ - else if (virt == VK_ESCAPE) buffer[0] = VK_ESCAPE; - else if (!ctrl) - { - switch (virt) - { - case VK_BACK: buffer[0] = '\b'; break; - case VK_OEM_1: buffer[0] = shift ? ':' : ';'; break; - case VK_OEM_2: buffer[0] = shift ? '?' : '/'; break; - case VK_OEM_3: buffer[0] = shift ? '~' : '`'; break; - case VK_OEM_4: buffer[0] = shift ? '{' : '['; break; - case VK_OEM_5: buffer[0] = shift ? '|' : '\\'; break; - case VK_OEM_6: buffer[0] = shift ? '}' : ']'; break; - case VK_OEM_7: buffer[0] = shift ? '"' : '\''; break; - case VK_OEM_COMMA: buffer[0] = shift ? '<' : ','; break; - case VK_OEM_MINUS: buffer[0] = shift ? '_' : '-'; break; - case VK_OEM_PERIOD: buffer[0] = shift ? '>' : '.'; break; - case VK_OEM_PLUS: buffer[0] = shift ? '+' : '='; break; - case VK_RETURN: buffer[0] = '\r'; break; - case VK_SPACE: buffer[0] = ' '; break; - case VK_TAB: buffer[0] = '\t'; break; - case VK_MULTIPLY: buffer[0] = '*'; break; - case VK_ADD: buffer[0] = '+'; break; - case VK_SUBTRACT: buffer[0] = '-'; break; - case VK_DIVIDE: buffer[0] = '/'; break; - default: - if (virt >= '0' && virt <= '9') - buffer[0] = shift ? ")!@#$%^&*("[virt - '0'] : virt; - else if (virt >= 'A' && virt <= 'Z') - buffer[0] = shift || (state[VK_CAPITAL] & 0x01) ? virt : virt + 'a' - 'A'; - else if (virt >= VK_NUMPAD0 && virt <= VK_NUMPAD9 && numlock && !shift) - buffer[0] = '0' + virt - VK_NUMPAD0; - else if (virt == VK_DECIMAL && numlock && !shift) - buffer[0] = '.'; - else - buffer[0] = 0; - break; - } - } - else if (!alt) /* Control codes */ - { - switch (virt) - { - case VK_OEM_4: buffer[0] = 0x1b; break; - case VK_OEM_5: buffer[0] = 0x1c; break; - case VK_OEM_6: buffer[0] = 0x1d; break; - case '6': buffer[0] = shift ? 0x1e : 0; break; - case VK_OEM_MINUS: buffer[0] = shift ? 0x1f : 0; break; - case VK_BACK: buffer[0] = 0x7f; break; - case VK_RETURN: buffer[0] = shift ? 0 : '\n'; break; - case '2': buffer[0] = shift ? 0xffff : 0xf000; break; - case VK_SPACE: buffer[0] = ' '; break; - default: - if (virt >= 'A' && virt <= 'Z') buffer[0] = virt - 'A' + 1; - else buffer[0] = 0; - break; - } - } - else buffer[0] = 0; - buffer[1] = 0; - len = lstrlenW( buffer ); - if (buffer[0] == 0xffff) buffer[0] = 0; lstrcpynW( str, buffer, size ); TRACE_(keyboard)( "ret %d, str %s.\n", len, debugstr_w(str) );
1
0
0
0
Rémi Bernon : win32u: Use KBDTABLES for NtUserVkKeyScanEx.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 2e13fc3542bb4dcbb230105732332a8e55209517 URL:
https://gitlab.winehq.org/wine/wine/-/commit/2e13fc3542bb4dcbb230105732332a…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sun Jan 8 10:26:59 2023 +0100 win32u: Use KBDTABLES for NtUserVkKeyScanEx. --- dlls/win32u/input.c | 89 +++++++++++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 50 deletions(-) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 7fd414be5af..fd4d11e8b82 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -451,6 +451,43 @@ static void kbd_tables_init_vk2char( const KBDTABLES *tables, BYTE vk2char[0x100 } } +static UINT kbd_tables_get_mod_bits( const KBDTABLES *tables, UINT mod ) +{ + const MODIFIERS *mods = tables->pCharModifiers; + WORD bits; + + for (bits = 0; bits <= mods->wMaxModBits; ++bits) + if (mods->ModNumber[bits] == mod) return bits; + + return -1; +} + +static WORD kbd_tables_wchar_to_vkey( const KBDTABLES *tables, WCHAR wch ) +{ + const VK_TO_WCHAR_TABLE *table; + const VK_TO_WCHARS1 *entry; + WORD bits; + BYTE mod; + + if (wch == '\x001b') return VK_ESCAPE; + + for (table = tables->pVkToWcharTable; table->pVkToWchars; table++) + { + for (entry = table->pVkToWchars; entry->VirtualKey; entry = NEXT_ENTRY(table, entry)) + { + for (mod = 0; mod < table->nModifications; ++mod) + { + if (entry->wch[mod] == WCH_NONE || entry->wch[mod] != wch) continue; + bits = kbd_tables_get_mod_bits( tables, mod ); + return (bits << 8) | entry->VirtualKey; + } + } + } + + if (wch >= 0x0001 && wch <= 0x001a) return (0x200) | ('A' + wch - 1); /* CTRL + A-Z */ + return wch >= 0x0080 ? -1 : 0; +} + #undef NEXT_ENTRY /********************************************************************** @@ -893,61 +930,13 @@ BOOL WINAPI NtUserSetKeyboardState( BYTE *state ) */ WORD WINAPI NtUserVkKeyScanEx( WCHAR chr, HKL layout ) { - WORD shift = 0x100, ctrl = 0x200; + const KBDTABLES *kbd_tables = &kbdus_tables; SHORT ret; TRACE_(keyboard)( "chr %s, layout %p\n", debugstr_wn(&chr, 1), layout ); if ((ret = user_driver->pVkKeyScanEx( chr, layout )) != -256) return ret; - - /* FIXME: English keyboard layout specific */ - - if (chr == VK_CANCEL || chr == VK_BACK || chr == VK_TAB || chr == VK_RETURN || - chr == VK_ESCAPE || chr == VK_SPACE) ret = chr; - else if (chr >= '0' && chr <= '9') ret = chr; - else if (chr == ')') ret = shift + '0'; - else if (chr == '!') ret = shift + '1'; - else if (chr == '@') ret = shift + '2'; - else if (chr == '#') ret = shift + '3'; - else if (chr == '$') ret = shift + '4'; - else if (chr == '%') ret = shift + '5'; - else if (chr == '^') ret = shift + '6'; - else if (chr == '&') ret = shift + '7'; - else if (chr == '*') ret = shift + '8'; - else if (chr == '(') ret = shift + '9'; - else if (chr >= 'a' && chr <= 'z') ret = chr - 'a' + 'A'; - else if (chr >= 'A' && chr <= 'Z') ret = shift + chr; - else if (chr == ';') ret = VK_OEM_1; - else if (chr == '=') ret = VK_OEM_PLUS; - else if (chr == ',') ret = VK_OEM_COMMA; - else if (chr == '-') ret = VK_OEM_MINUS; - else if (chr == '.') ret = VK_OEM_PERIOD; - else if (chr == '/') ret = VK_OEM_2; - else if (chr == '`') ret = VK_OEM_3; - else if (chr == '[') ret = VK_OEM_4; - else if (chr == '\\') ret = VK_OEM_5; - else if (chr == ']') ret = VK_OEM_6; - else if (chr == '\'') ret = VK_OEM_7; - else if (chr == ':') ret = shift + VK_OEM_1; - else if (chr == '+') ret = shift + VK_OEM_PLUS; - else if (chr == '<') ret = shift + VK_OEM_COMMA; - else if (chr == '_') ret = shift + VK_OEM_MINUS; - else if (chr == '>') ret = shift + VK_OEM_PERIOD; - else if (chr == '?') ret = shift + VK_OEM_2; - else if (chr == '~') ret = shift + VK_OEM_3; - else if (chr == '{') ret = shift + VK_OEM_4; - else if (chr == '|') ret = shift + VK_OEM_5; - else if (chr == '}') ret = shift + VK_OEM_6; - else if (chr == '\"') ret = shift + VK_OEM_7; - else if (chr == 0x7f) ret = ctrl + VK_BACK; - else if (chr == '\n') ret = ctrl + VK_RETURN; - else if (chr == 0xf000) ret = ctrl + '2'; - else if (chr == 0x0000) ret = ctrl + shift + '2'; - else if (chr >= 0x0001 && chr <= 0x001a) ret = ctrl + 'A' + chr - 1; - else if (chr >= 0x001c && chr <= 0x001d) ret = ctrl + VK_OEM_3 + chr; - else if (chr == 0x001e) ret = ctrl + shift + '6'; - else if (chr == 0x001f) ret = ctrl + shift + VK_OEM_MINUS; - else ret = -1; + ret = kbd_tables_wchar_to_vkey( kbd_tables, chr ); TRACE_(keyboard)( "ret %04x\n", ret ); return ret;
1
0
0
0
Rémi Bernon : win32u: Use KBDTABLES for NtUserMapVirtualKeyEx MAP_VK_TO_CHAR.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 70dc48e3f0a3472bf8ad6d34bf473d2a1ea0e329 URL:
https://gitlab.winehq.org/wine/wine/-/commit/70dc48e3f0a3472bf8ad6d34bf473d…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sat Jan 7 17:25:20 2023 +0100 win32u: Use KBDTABLES for NtUserMapVirtualKeyEx MAP_VK_TO_CHAR. --- dlls/win32u/input.c | 167 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 141 insertions(+), 26 deletions(-)
1
0
0
0
Rémi Bernon : include: Add VK_TO_WCHARS constants definitions to kbd.h.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: c04f351db26c71c9f69f4cb8dd586233e3db53af URL:
https://gitlab.winehq.org/wine/wine/-/commit/c04f351db26c71c9f69f4cb8dd5862…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Nov 30 20:16:09 2022 +0100 include: Add VK_TO_WCHARS constants definitions to kbd.h. --- include/kbd.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/kbd.h b/include/kbd.h index de1d2c784d2..9bbcd886b1c 100644 --- a/include/kbd.h +++ b/include/kbd.h @@ -21,6 +21,25 @@ #include "windef.h" +#define KBDBASE 0 +#define KBDSHIFT 1 +#define KBDCTRL 2 +#define KBDALT 4 +#define KBDKANA 8 +#define KBDROYA 0x10 +#define KBDLOYA 0x20 +#define KBDGRPSELTAP 0x80 + +#define WCH_NONE 0xf000 +#define WCH_DEAD 0xf001 +#define WCH_LGTR 0xf002 + +#define CAPLOK 0x01 +#define SGCAPS 0x02 +#define CAPLOKALTGR 0x04 +#define KANALOK 0x08 +#define GRPSELTAP 0x80 + typedef struct { BYTE Vk;
1
0
0
0
Rémi Bernon : win32u: Use KBDTABLES for NtUserMapVirtualKeyEx VSC / VK mapping.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 37de2cb434dcce61e8ae07ce4b81213ef97b5d45 URL:
https://gitlab.winehq.org/wine/wine/-/commit/37de2cb434dcce61e8ae07ce4b8121…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sat Jan 7 17:25:20 2023 +0100 win32u: Use KBDTABLES for NtUserMapVirtualKeyEx VSC / VK mapping. --- dlls/win32u/input.c | 181 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 111 insertions(+), 70 deletions(-)
1
0
0
0
Rémi Bernon : include: Add VSC_VK constants definitions to kbd.h.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 48c71b31f5aeb0d71563303438ff63e07156e869 URL:
https://gitlab.winehq.org/wine/wine/-/commit/48c71b31f5aeb0d71563303438ff63…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Nov 30 20:16:09 2022 +0100 include: Add VSC_VK constants definitions to kbd.h. --- include/kbd.h | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/include/kbd.h b/include/kbd.h index 3cf0b35ac8e..de1d2c784d2 100644 --- a/include/kbd.h +++ b/include/kbd.h @@ -113,4 +113,211 @@ typedef struct tagKbdLayer DWORD dwSubType; } KBDTABLES, *PKBDTABLES; +#define KBD_VERSION 1 +#define GET_KBD_VERSION(table) (HIWORD((table)->fLocaleFlags)) + +#ifndef KBD_TYPE +#define KBD_TYPE 4 +#endif + +#define KBDEXT (USHORT)0x0100 +#define KBDMULTIVK (USHORT)0x0200 +#define KBDSPECIAL (USHORT)0x0400 +#define KBDNUMPAD (USHORT)0x0800 +#define KBDUNICODE (USHORT)0x1000 +#define KBDINJECTEDVK (USHORT)0x2000 +#define KBDMAPPEDVK (USHORT)0x4000 +#define KBDBREAK (USHORT)0x8000 + +#define VK__none_ 0xff +#define VK_ABNT_C1 0xc1 +#define VK_ABNT_C2 0xc2 + +#if (KBD_TYPE <= 6) +#define _EQ(v4) (VK_##v4) +#if (KBD_TYPE == 1) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v1) +#elif (KBD_TYPE == 2) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v2) +#elif (KBD_TYPE == 3) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v3) +#elif (KBD_TYPE == 4) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v4) +#elif (KBD_TYPE == 5) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v5) +#elif (KBD_TYPE == 6) +#define _NE(v1, v2, v3, v4, v5, v6) (VK_##v6) +#endif +#define T00 _EQ(_none_) +#define T01 _EQ(ESCAPE) +#define T02 '1' +#define T03 '2' +#define T04 '3' +#define T05 '4' +#define T06 '5' +#define T07 '6' +#define T08 '7' +#define T09 '8' +#define T0A '9' +#define T0B '0' +#define T0C _EQ(OEM_MINUS) +#define T0D _NE(OEM_PLUS,OEM_4, OEM_PLUS, OEM_PLUS, OEM_PLUS, OEM_PLUS) +#define T0E _EQ(BACK) +#define T0F _EQ(TAB) +#define T10 'Q' +#define T11 'W' +#define T12 'E' +#define T13 'R' +#define T14 'T' +#define T15 'Y' +#define T16 'U' +#define T17 'I' +#define T18 'O' +#define T19 'P' +#define T1A _NE(OEM_4, OEM_6, OEM_4, OEM_4, OEM_4, OEM_4) +#define T1B _NE(OEM_6, OEM_1, OEM_6, OEM_6, OEM_6, OEM_6) +#define T1C _EQ(RETURN) +#define T1D _EQ(LCONTROL) +#define T1E 'A' +#define T1F 'S' +#define T20 'D' +#define T21 'F' +#define T22 'G' +#define T23 'H' +#define T24 'J' +#define T25 'K' +#define T26 'L' +#define T27 _NE(OEM_1, OEM_PLUS, OEM_1, OEM_1, OEM_1, OEM_1) +#define T28 _NE(OEM_7, OEM_3, OEM_7, OEM_7, OEM_3, OEM_3) +#define T29 _NE(OEM_3, OEM_7, OEM_3, OEM_3, OEM_7, OEM_7) +#define T2A _EQ(LSHIFT) +#define T2B _EQ(OEM_5) +#define T2C 'Z' +#define T2D 'X' +#define T2E 'C' +#define T2F 'V' +#define T30 'B' +#define T31 'N' +#define T32 'M' +#define T33 _EQ(OEM_COMMA) +#define T34 _EQ(OEM_PERIOD) +#define T35 _EQ(OEM_2) +#define T36 _EQ(RSHIFT) +#define T37 _EQ(MULTIPLY) +#define T38 _EQ(LMENU) +#define T39 ' ' +#define T3A _EQ(CAPITAL) +#define T3B _EQ(F1) +#define T3C _EQ(F2) +#define T3D _EQ(F3) +#define T3E _EQ(F4) +#define T3F _EQ(F5) +#define T40 _EQ(F6) +#define T41 _EQ(F7) +#define T42 _EQ(F8) +#define T43 _EQ(F9) +#define T44 _EQ(F10) +#define T45 _EQ(NUMLOCK) +#define T46 _EQ(SCROLL) +#define T47 _EQ(HOME) +#define T48 _EQ(UP) +#define T49 _EQ(PRIOR) +#define T4A _EQ(SUBTRACT) +#define T4B _EQ(LEFT) +#define T4C _EQ(CLEAR) +#define T4D _EQ(RIGHT) +#define T4E _EQ(ADD) +#define T4F _EQ(END) +#define T50 _EQ(DOWN) +#define T51 _EQ(NEXT) +#define T52 _EQ(INSERT) +#define T53 _EQ(DELETE) +#define T54 _EQ(SNAPSHOT) +#define T55 _EQ(_none_) +#define T56 _NE(OEM_102, HELP, OEM_102, OEM_102, _none_, OEM_PA2) +#define T57 _NE(F11, RETURN, F11, F11, _none_, HELP) +#define T58 _NE(F12, LEFT, F12, F12, _none_, OEM_102) +#define T59 _EQ(CLEAR) +#define T5A _EQ(OEM_WSCTRL) +#define T5B _EQ(OEM_FINISH) +#define T5C _EQ(OEM_JUMP) +#define T5D _EQ(EREOF) +#define T5E _EQ(OEM_BACKTAB) +#define T5F _EQ(OEM_AUTO) +#define T60 _EQ(_none_) +#define T61 _EQ(_none_) +#define T62 _EQ(ZOOM) +#define T63 _EQ(HELP) +#define T64 _EQ(F13) +#define T65 _EQ(F14) +#define T66 _EQ(F15) +#define T67 _EQ(F16) +#define T68 _EQ(F17) +#define T69 _EQ(F18) +#define T6A _EQ(F19) +#define T6B _EQ(F20) +#define T6C _EQ(F21) +#define T6D _EQ(F22) +#define T6E _EQ(F23) +#define T6F _EQ(OEM_PA3) +#define T70 _EQ(_none_) +#define T71 _EQ(OEM_RESET) +#define T72 _EQ(_none_) +#define T73 _EQ(ABNT_C1) +#define T74 _EQ(_none_) +#define T75 _EQ(_none_) +#define T76 _EQ(F24) +#define T77 _EQ(_none_) +#define T78 _EQ(_none_) +#define T79 _EQ(_none_) +#define T7A _EQ(_none_) +#define T7B _EQ(OEM_PA1) +#define T7C _EQ(TAB) +#define T7D _EQ(_none_) +#define T7E _EQ(ABNT_C2) +#define T7F _EQ(OEM_PA2) +#define X10 _EQ(MEDIA_PREV_TRACK) +#define X19 _EQ(MEDIA_NEXT_TRACK) +#define X1C _EQ(RETURN) +#define X1D _EQ(RCONTROL) +#define X20 _EQ(VOLUME_MUTE) +#define X21 _EQ(LAUNCH_APP2) +#define X22 _EQ(MEDIA_PLAY_PAUSE) +#define X24 _EQ(MEDIA_STOP) +#define X2E _EQ(VOLUME_DOWN) +#define X30 _EQ(VOLUME_UP) +#define X32 _EQ(BROWSER_HOME) +#define X35 _EQ(DIVIDE) +#define X37 _EQ(SNAPSHOT) +#define X38 _EQ(RMENU) +#define X46 _EQ(CANCEL) +#define X47 _EQ(HOME) +#define X48 _EQ(UP) +#define X49 _EQ(PRIOR) +#define X4B _EQ(LEFT) +#define X4D _EQ(RIGHT) +#define X4F _EQ(END) +#define X50 _EQ(DOWN) +#define X51 _NE(NEXT, F1, NEXT, NEXT, _none_, OEM_PA2) +#define X52 _EQ(INSERT) +#define X53 _EQ(DELETE) +#define X5B _EQ(LWIN) +#define X5C _EQ(RWIN) +#define X5D _EQ(APPS) +#define X5E _EQ(POWER) +#define X5F _EQ(SLEEP) +#define X65 _EQ(BROWSER_SEARCH) +#define X66 _EQ(BROWSER_FAVORITES) +#define X67 _EQ(BROWSER_REFRESH) +#define X68 _EQ(BROWSER_STOP) +#define X69 _EQ(BROWSER_FORWARD) +#define X6A _EQ(BROWSER_BACK) +#define X6B _EQ(LAUNCH_APP1) +#define X6C _EQ(LAUNCH_MAIL) +#define X6D _EQ(LAUNCH_MEDIA_SELECT) +#define Y1D _EQ(PAUSE) +#else +#error "Unsupported KBD_TYPE" +#endif + #endif /* __WINE_KBD_H */
1
0
0
0
Rémi Bernon : win32u: Use KBDTABLES for default NtUserGetKeyNameText.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: 1cd690a33678a9348b5df0c26d02973d77cd5e16 URL:
https://gitlab.winehq.org/wine/wine/-/commit/1cd690a33678a9348b5df0c26d0297…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Sat Jan 7 17:25:20 2023 +0100 win32u: Use KBDTABLES for default NtUserGetKeyNameText. --- dlls/win32u/input.c | 236 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 181 insertions(+), 55 deletions(-)
1
0
0
0
Rémi Bernon : include: Add new kbd.h header with KBDTABLES definition.
by Alexandre Julliard
07 Feb '23
07 Feb '23
Module: wine Branch: master Commit: f0ac3b218d3e2239955443cf065ea9de47c1ed30 URL:
https://gitlab.winehq.org/wine/wine/-/commit/f0ac3b218d3e2239955443cf065ea9…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Wed Nov 30 20:16:09 2022 +0100 include: Add new kbd.h header with KBDTABLES definition. --- include/Makefile.in | 1 + include/kbd.h | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/include/Makefile.in b/include/Makefile.in index e98df3ad0d6..dba9ae86135 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -379,6 +379,7 @@ SOURCES = \ iptypes.h \ isguids.h \ ivectorchangedeventargs.idl \ + kbd.h \ knownfolders.h \ ks.h \ ksguid.h \ diff --git a/include/kbd.h b/include/kbd.h new file mode 100644 index 00000000000..3cf0b35ac8e --- /dev/null +++ b/include/kbd.h @@ -0,0 +1,116 @@ +/* + * Copyright 2022 Rémi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_KBD_H +#define __WINE_KBD_H + +#include "windef.h" + +typedef struct +{ + BYTE Vk; + BYTE ModBits; +} VK_TO_BIT, *PVK_TO_BIT; + +typedef struct +{ + VK_TO_BIT *pVkToBit; + WORD wMaxModBits; + BYTE ModNumber[]; +} MODIFIERS, *PMODIFIERS; + +#define TYPEDEF_VK_TO_WCHARS(n) \ + typedef struct _VK_TO_WCHARS##n \ + { \ + BYTE VirtualKey; \ + BYTE Attributes; \ + WCHAR wch[n]; \ + } VK_TO_WCHARS##n, *PVK_TO_WCHARS##n + +TYPEDEF_VK_TO_WCHARS(1); +TYPEDEF_VK_TO_WCHARS(2); +TYPEDEF_VK_TO_WCHARS(3); +TYPEDEF_VK_TO_WCHARS(4); +TYPEDEF_VK_TO_WCHARS(5); +TYPEDEF_VK_TO_WCHARS(6); +TYPEDEF_VK_TO_WCHARS(7); +TYPEDEF_VK_TO_WCHARS(8); +TYPEDEF_VK_TO_WCHARS(9); +TYPEDEF_VK_TO_WCHARS(10); + +typedef struct _VK_TO_WCHAR_TABLE +{ + VK_TO_WCHARS1 *pVkToWchars; + BYTE nModifications; + BYTE cbSize; +} VK_TO_WCHAR_TABLE, *PVK_TO_WCHAR_TABLE; + +typedef struct +{ + DWORD dwBoth; + WCHAR wchComposed; + USHORT uFlags; +} DEADKEY, *PDEADKEY; + +typedef struct +{ + BYTE vsc; + WCHAR *pwsz; +} VSC_LPWSTR, *PVSC_LPWSTR; + +typedef struct _VSC_VK +{ + BYTE Vsc; + USHORT Vk; +} VSC_VK, *PVSC_VK; + +#define TYPEDEF_LIGATURE(n) \ + typedef struct _LIGATURE##n \ + { \ + BYTE VirtualKey; \ + WORD ModificationNumber; \ + WCHAR wch[n]; \ + } LIGATURE##n, *PLIGATURE##n; + +TYPEDEF_LIGATURE(1) +TYPEDEF_LIGATURE(2) +TYPEDEF_LIGATURE(3) +TYPEDEF_LIGATURE(4) +TYPEDEF_LIGATURE(5) + +typedef struct tagKbdLayer +{ + MODIFIERS *pCharModifiers; + VK_TO_WCHAR_TABLE *pVkToWcharTable; + DEADKEY *pDeadKey; + VSC_LPWSTR *pKeyNames; + VSC_LPWSTR *pKeyNamesExt; + WCHAR **pKeyNamesDead; + USHORT *pusVSCtoVK; + BYTE bMaxVSCtoVK; + VSC_VK *pVSCtoVK_E0; + VSC_VK *pVSCtoVK_E1; + DWORD fLocaleFlags; + BYTE nLgMax; + BYTE cbLgEntry; + LIGATURE1 *pLigature; + DWORD dwType; + DWORD dwSubType; +} KBDTABLES, *PKBDTABLES; + +#endif /* __WINE_KBD_H */
1
0
0
0
← Newer
1
...
48
49
50
51
52
53
54
...
60
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Results per page:
10
25
50
100
200