Module: wine Branch: master Commit: 67a11c60afe77aa8dff6380b75e947fcf606589c URL: http://source.winehq.org/git/wine.git/?a=commit;h=67a11c60afe77aa8dff6380b75...
Author: Hans Leidekker hans@codeweavers.com Date: Tue Apr 14 12:35:28 2009 +0200
winex11.drv: Set HKCU\Keyboard Layout\Preload key.
---
dlls/winex11.drv/keyboard.c | 66 +++++++++++++++++++++++++++++------------- 1 files changed, 45 insertions(+), 21 deletions(-)
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index f7dad12..80f8445 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -44,6 +44,7 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" +#include "winreg.h" #include "winnls.h" #include "x11drv.h" #include "wine/server.h" @@ -1613,6 +1614,48 @@ static HKL get_locale_kbd_layout(void) return (HKL)layout; }
+/*********************************************************************** + * GetKeyboardLayoutName (X11DRV.@) + */ +BOOL CDECL X11DRV_GetKeyboardLayoutName(LPWSTR name) +{ + static const WCHAR formatW[] = {'%','0','8','l','x',0}; + DWORD layout; + LANGID langid; + + layout = main_key_tab[kbd_layout].lcid; + /* see comment for get_locale_kbd_layout */ + langid = PRIMARYLANGID(LANGIDFROMLCID(layout)); + if (langid == LANG_CHINESE || langid == LANG_JAPANESE || langid == LANG_KOREAN) + layout |= 0xe001 << 16; /* FIXME */ + + sprintfW(name, formatW, layout); + TRACE("returning %s\n", debugstr_w(name)); + return TRUE; +} + +static void set_kbd_layout_preload_key(void) +{ + static const WCHAR preload[] = + {'K','e','y','b','o','a','r','d',' ','L','a','y','o','u','t','\','P','r','e','l','o','a','d',0}; + static const WCHAR one[] = {'1',0}; + + HKEY hkey; + WCHAR layout[KL_NAMELENGTH]; + + if (RegCreateKeyExW(HKEY_CURRENT_USER, preload, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey, NULL)) + return; + + if (!RegQueryValueExW(hkey, one, NULL, NULL, NULL, NULL)) + { + RegCloseKey(hkey); + return; + } + if (X11DRV_GetKeyboardLayoutName(layout)) + RegSetValueExW(hkey, one, 0, REG_SZ, (const BYTE *)layout, sizeof(layout)); + + RegCloseKey(hkey); +}
/********************************************************************** * X11DRV_InitKeyboard @@ -1630,6 +1673,8 @@ void X11DRV_InitKeyboard( Display *display ) const char (*lkey)[MAIN_LEN][4]; char vkey_used[256] = { 0 };
+ set_kbd_layout_preload_key(); + wine_tsx11_lock(); XDisplayKeycodes(display, &min_keycode, &max_keycode); ksp = XGetKeyboardMapping(display, min_keycode, @@ -1901,27 +1946,6 @@ HKL CDECL X11DRV_GetKeyboardLayout(DWORD dwThreadid)
/*********************************************************************** - * GetKeyboardLayoutName (X11DRV.@) - */ -BOOL CDECL X11DRV_GetKeyboardLayoutName(LPWSTR name) -{ - static const WCHAR formatW[] = {'%','0','8','l','x',0}; - DWORD layout; - LANGID langid; - - layout = main_key_tab[kbd_layout].lcid; - /* see comment for get_locale_kbd_layout */ - langid = PRIMARYLANGID(LANGIDFROMLCID(layout)); - if (langid == LANG_CHINESE || langid == LANG_JAPANESE || langid == LANG_KOREAN) - layout |= 0xe001 << 16; /* FIXME */ - - sprintfW(name, formatW, layout); - TRACE("returning %s\n", debugstr_w(name)); - return TRUE; -} - - -/*********************************************************************** * LoadKeyboardLayout (X11DRV.@) */ HKL CDECL X11DRV_LoadKeyboardLayout(LPCWSTR name, UINT flags)