user32: Move GetKeyboardLayoutList from nulldrv.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
d1c2fadac4
commit
66c3181444
|
@ -198,59 +198,7 @@ static void CDECL nulldrv_Beep(void)
|
||||||
|
|
||||||
static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
|
static UINT CDECL nulldrv_GetKeyboardLayoutList( INT size, HKL *layouts )
|
||||||
{
|
{
|
||||||
HKEY hKeyKeyboard;
|
return ~0; /* use default implementation */
|
||||||
DWORD rc;
|
|
||||||
INT count = 0;
|
|
||||||
ULONG_PTR baselayout;
|
|
||||||
LANGID langid;
|
|
||||||
|
|
||||||
baselayout = GetUserDefaultLCID();
|
|
||||||
langid = PRIMARYLANGID(LANGIDFROMLCID(baselayout));
|
|
||||||
if (langid == LANG_CHINESE || langid == LANG_JAPANESE || langid == LANG_KOREAN)
|
|
||||||
baselayout = MAKELONG( baselayout, 0xe001 ); /* IME */
|
|
||||||
else
|
|
||||||
baselayout |= baselayout << 16;
|
|
||||||
|
|
||||||
/* Enumerate the Registry */
|
|
||||||
rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,L"System\\CurrentControlSet\\Control\\Keyboard Layouts",&hKeyKeyboard);
|
|
||||||
if (rc == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
WCHAR szKeyName[9];
|
|
||||||
HKL layout;
|
|
||||||
rc = RegEnumKeyW(hKeyKeyboard, count, szKeyName, 9);
|
|
||||||
if (rc == ERROR_SUCCESS)
|
|
||||||
{
|
|
||||||
layout = (HKL)(ULONG_PTR)wcstoul(szKeyName,NULL,16);
|
|
||||||
if (baselayout != 0 && layout == (HKL)baselayout)
|
|
||||||
baselayout = 0; /* found in the registry do not add again */
|
|
||||||
if (size && layouts)
|
|
||||||
{
|
|
||||||
if (count >= size ) break;
|
|
||||||
layouts[count] = layout;
|
|
||||||
}
|
|
||||||
count ++;
|
|
||||||
}
|
|
||||||
} while (rc == ERROR_SUCCESS);
|
|
||||||
RegCloseKey(hKeyKeyboard);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure our base layout is on the list */
|
|
||||||
if (baselayout != 0)
|
|
||||||
{
|
|
||||||
if (size && layouts)
|
|
||||||
{
|
|
||||||
if (count < size)
|
|
||||||
{
|
|
||||||
layouts[count] = (HKL)baselayout;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static INT CDECL nulldrv_GetKeyNameText( LONG lparam, LPWSTR buffer, INT size )
|
static INT CDECL nulldrv_GetKeyNameText( LONG lparam, LPWSTR buffer, INT size )
|
||||||
|
|
|
@ -77,6 +77,43 @@ static WORD get_key_state(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* get_locale_kbd_layout
|
||||||
|
*/
|
||||||
|
static HKL get_locale_kbd_layout(void)
|
||||||
|
{
|
||||||
|
ULONG_PTR layout;
|
||||||
|
LANGID langid;
|
||||||
|
|
||||||
|
/* FIXME:
|
||||||
|
*
|
||||||
|
* layout = main_key_tab[kbd_layout].lcid;
|
||||||
|
*
|
||||||
|
* Winword uses return value of GetKeyboardLayout as a codepage
|
||||||
|
* to translate ANSI keyboard messages to unicode. But we have
|
||||||
|
* a problem with it: for instance Polish keyboard layout is
|
||||||
|
* identical to the US one, and therefore instead of the Polish
|
||||||
|
* locale id we return the US one.
|
||||||
|
*/
|
||||||
|
|
||||||
|
layout = GetUserDefaultLCID();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Microsoft Office expects this value to be something specific
|
||||||
|
* for Japanese and Korean Windows with an IME the value is 0xe001
|
||||||
|
* We should probably check to see if an IME exists and if so then
|
||||||
|
* set this word properly.
|
||||||
|
*/
|
||||||
|
langid = PRIMARYLANGID( LANGIDFROMLCID( layout ) );
|
||||||
|
if (langid == LANG_CHINESE || langid == LANG_JAPANESE || langid == LANG_KOREAN)
|
||||||
|
layout = MAKELONG( layout, 0xe001 ); /* IME */
|
||||||
|
else
|
||||||
|
layout = MAKELONG( layout, layout );
|
||||||
|
|
||||||
|
return (HKL)layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* set_capture_window
|
* set_capture_window
|
||||||
*/
|
*/
|
||||||
|
@ -1297,11 +1334,45 @@ BOOL WINAPI BlockInput(BOOL fBlockIt)
|
||||||
* Return number of values available if either input parm is
|
* Return number of values available if either input parm is
|
||||||
* 0, per MS documentation.
|
* 0, per MS documentation.
|
||||||
*/
|
*/
|
||||||
UINT WINAPI GetKeyboardLayoutList(INT nBuff, HKL *layouts)
|
UINT WINAPI GetKeyboardLayoutList( INT size, HKL *layouts )
|
||||||
{
|
{
|
||||||
TRACE_(keyboard)( "(%d, %p)\n", nBuff, layouts );
|
WCHAR klid[KL_NAMELENGTH];
|
||||||
|
UINT count, tmp, i = 0;
|
||||||
|
HKEY hkey;
|
||||||
|
HKL layout;
|
||||||
|
|
||||||
return USER_Driver->pGetKeyboardLayoutList( nBuff, layouts );
|
TRACE_(keyboard)( "size %d, layouts %p.\n", size, layouts );
|
||||||
|
|
||||||
|
if ((count = USER_Driver->pGetKeyboardLayoutList( size, layouts )) != ~0) return count;
|
||||||
|
|
||||||
|
layout = get_locale_kbd_layout();
|
||||||
|
count = 0;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
if (size && layouts)
|
||||||
|
{
|
||||||
|
layouts[count - 1] = layout;
|
||||||
|
if (count == size) return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Control\\Keyboard Layouts", &hkey ))
|
||||||
|
{
|
||||||
|
while (!RegEnumKeyW( hkey, i++, klid, ARRAY_SIZE(klid) ))
|
||||||
|
{
|
||||||
|
tmp = wcstoul( klid, NULL, 16 );
|
||||||
|
if (layout == UlongToHandle( tmp )) continue;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
if (size && layouts)
|
||||||
|
{
|
||||||
|
layouts[count - 1] = UlongToHandle( tmp );
|
||||||
|
if (count == size) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RegCloseKey( hkey );
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue