Skip to content

Commit c27baff

Browse files
DONOTPICK: add Fixed-Scancodes staging patchset
1 parent 16dba00 commit c27baff

8 files changed

Lines changed: 783 additions & 0 deletions
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
From f68070c821e4fc58ce32b5e01f9e5c96f17a39fc Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
3+
Date: Fri, 6 Jan 2023 11:22:10 +0100
4+
Subject: [PATCH 1/8] winex11: Always create the HKCU configuration registry
5+
key.
6+
7+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=30984
8+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45605
9+
---
10+
dlls/winex11.drv/x11drv_main.c | 67 ++++++++++++++++++++++++++++++++--
11+
1 file changed, 64 insertions(+), 3 deletions(-)
12+
13+
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
14+
index 0ddf6cf1147..2c834c8cd69 100644
15+
--- a/dlls/winex11.drv/x11drv_main.c
16+
+++ b/dlls/winex11.drv/x11drv_main.c
17+
@@ -360,11 +360,61 @@ HKEY reg_open_key( HKEY root, const WCHAR *name, ULONG name_len )
18+
return NtOpenKeyEx( &ret, MAXIMUM_ALLOWED, &attr, 0 ) ? 0 : ret;
19+
}
20+
21+
+/* wrapper for NtCreateKey that creates the key recursively if necessary */
22+
+static HKEY reg_create_key( HKEY root, const WCHAR *name, ULONG name_len,
23+
+ DWORD options, DWORD *disposition )
24+
+{
25+
+ UNICODE_STRING nameW = { name_len, name_len, (WCHAR *)name };
26+
+ OBJECT_ATTRIBUTES attr;
27+
+ NTSTATUS status;
28+
+ HANDLE ret;
29+
30+
-HKEY open_hkcu_key( const char *name )
31+
+ attr.Length = sizeof(attr);
32+
+ attr.RootDirectory = root;
33+
+ attr.ObjectName = &nameW;
34+
+ attr.Attributes = 0;
35+
+ attr.SecurityDescriptor = NULL;
36+
+ attr.SecurityQualityOfService = NULL;
37+
+
38+
+ status = NtCreateKey( &ret, MAXIMUM_ALLOWED, &attr, 0, NULL, options, disposition );
39+
+ if (status == STATUS_OBJECT_NAME_NOT_FOUND)
40+
+ {
41+
+ static const WCHAR registry_rootW[] = { '\\','R','e','g','i','s','t','r','y','\\' };
42+
+ DWORD pos = 0, i = 0, len = name_len / sizeof(WCHAR);
43+
+
44+
+ /* don't try to create registry root */
45+
+ if (!root && len > ARRAY_SIZE(registry_rootW) &&
46+
+ !memcmp( name, registry_rootW, sizeof(registry_rootW) ))
47+
+ i += ARRAY_SIZE(registry_rootW);
48+
+
49+
+ while (i < len && name[i] != '\\') i++;
50+
+ if (i == len) return 0;
51+
+ for (;;)
52+
+ {
53+
+ unsigned int subkey_options = options;
54+
+ if (i < len) subkey_options &= ~(REG_OPTION_CREATE_LINK | REG_OPTION_OPEN_LINK);
55+
+ nameW.Buffer = (WCHAR *)name + pos;
56+
+ nameW.Length = (i - pos) * sizeof(WCHAR);
57+
+ status = NtCreateKey( &ret, MAXIMUM_ALLOWED, &attr, 0, NULL, subkey_options, disposition );
58+
+
59+
+ if (attr.RootDirectory != root) NtClose( attr.RootDirectory );
60+
+ if (!NT_SUCCESS(status)) return 0;
61+
+ if (i == len) break;
62+
+ attr.RootDirectory = ret;
63+
+ while (i < len && name[i] == '\\') i++;
64+
+ pos = i;
65+
+ while (i < len && name[i] != '\\') i++;
66+
+ }
67+
+ }
68+
+ return ret;
69+
+}
70+
+
71+
+static HKEY reg_open_hkcu_key( const char *name, BOOL create )
72+
{
73+
WCHAR bufferW[256];
74+
static HKEY hkcu;
75+
+ DWORD disp;
76+
+ HKEY key;
77+
78+
if (!hkcu)
79+
{
80+
@@ -389,7 +439,18 @@ HKEY open_hkcu_key( const char *name )
81+
hkcu = reg_open_key( NULL, bufferW, len * sizeof(WCHAR) );
82+
}
83+
84+
- return reg_open_key( hkcu, bufferW, asciiz_to_unicode( bufferW, name ) - sizeof(WCHAR) );
85+
+ if ((key = reg_open_key( hkcu, bufferW, asciiz_to_unicode( bufferW, name ) - sizeof(WCHAR) )) || !create) return key;
86+
+ return reg_create_key( hkcu, bufferW, asciiz_to_unicode( bufferW, name ) - sizeof(WCHAR), 0, &disp );
87+
+}
88+
+
89+
+HKEY open_hkcu_key( const char *name )
90+
+{
91+
+ return reg_open_hkcu_key( name, FALSE );
92+
+}
93+
+
94+
+static HKEY create_hkcu_key( const char *name )
95+
+{
96+
+ return reg_open_hkcu_key( name, TRUE );
97+
}
98+
99+
100+
@@ -453,7 +514,7 @@ static void setup_options(void)
101+
DWORD len;
102+
103+
/* @@ Wine registry key: HKCU\Software\Wine\X11 Driver */
104+
- hkey = open_hkcu_key( "Software\\Wine\\X11 Driver" );
105+
+ hkey = create_hkcu_key( "Software\\Wine\\X11 Driver" );
106+
107+
/* open the app-specific key */
108+
109+
--
110+
2.54.0
111+
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
From 62d60fb2e854d31b222d24804c94907cbc22552d Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
3+
Date: Fri, 6 Jan 2023 08:09:11 +0100
4+
Subject: [PATCH 2/8] winex11: Write supported keyboard layout list in
5+
registry.
6+
7+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=30984
8+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45605
9+
---
10+
dlls/winex11.drv/keyboard.c | 21 +++++++++++++++++++++
11+
dlls/winex11.drv/x11drv.h | 4 ++++
12+
dlls/winex11.drv/x11drv_main.c | 17 +++++++++++++++++
13+
3 files changed, 42 insertions(+)
14+
15+
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
16+
index 3907828201f..8dad121d637 100644
17+
--- a/dlls/winex11.drv/keyboard.c
18+
+++ b/dlls/winex11.drv/keyboard.c
19+
@@ -1093,6 +1093,27 @@ static const WORD xfree86_vendor_key_vkey[256] =
20+
0, 0, 0, 0, 0, 0, 0, 0 /* 1008FFF8 */
21+
};
22+
23+
+WCHAR *x11drv_get_keyboard_layout_list( DWORD *length )
24+
+{
25+
+ WCHAR *tmp, *layouts = calloc( 1, sizeof(WCHAR) );
26+
+ int i;
27+
+
28+
+ for (i = 0, *length = 1; main_key_tab[i].comment; i++)
29+
+ {
30+
+ const char *name = main_key_tab[i].comment;
31+
+ int len = strlen( name ) + 1;
32+
+
33+
+ if (!(tmp = realloc( layouts, (*length + len) * sizeof(WCHAR) ))) return layouts;
34+
+ layouts = tmp;
35+
+
36+
+ asciiz_to_unicode( layouts + *length - 1, name );
37+
+ layouts[*length + len - 1] = 0;
38+
+ (*length) += len;
39+
+ }
40+
+
41+
+ return layouts;
42+
+}
43+
+
44+
/* Returns the Windows virtual key code associated with the X event <e> */
45+
/* kbd_section must be held */
46+
static WORD EVENT_event_to_vkey( XIC xic, XKeyEvent *e)
47+
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
48+
index 41fc515357a..034899147bd 100644
49+
--- a/dlls/winex11.drv/x11drv.h
50+
+++ b/dlls/winex11.drv/x11drv.h
51+
@@ -797,6 +797,10 @@ extern void xinerama_init( unsigned int width, unsigned int height );
52+
extern void init_recursive_mutex( pthread_mutex_t *mutex );
53+
extern void init_icm_profile(void);
54+
55+
+/* keyboard.c */
56+
+
57+
+extern WCHAR *x11drv_get_keyboard_layout_list( DWORD *size );
58+
+
59+
#define DEPTH_COUNT 3
60+
extern const unsigned int *depths;
61+
extern RECT gamescope_screen_rect;
62+
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
63+
index 2c834c8cd69..190a19e0afb 100644
64+
--- a/dlls/winex11.drv/x11drv_main.c
65+
+++ b/dlls/winex11.drv/x11drv_main.c
66+
@@ -453,6 +453,19 @@ static HKEY create_hkcu_key( const char *name )
67+
return reg_open_hkcu_key( name, TRUE );
68+
}
69+
70+
+static BOOL set_reg_value( HKEY hkey, const WCHAR *name, UINT type, const void *value, DWORD count )
71+
+{
72+
+ unsigned int name_size = name ? lstrlenW( name ) * sizeof(WCHAR) : 0;
73+
+ UNICODE_STRING nameW = { name_size, name_size, (WCHAR *)name };
74+
+ return !NtSetValueKey( hkey, &nameW, 0, type, value, count );
75+
+}
76+
+
77+
+static void set_reg_string_value( HKEY hkey, const char *name, const WCHAR *value, DWORD count )
78+
+{
79+
+ WCHAR nameW[64];
80+
+ asciiz_to_unicode( nameW, name );
81+
+ set_reg_value( hkey, nameW, REG_MULTI_SZ, value, count );
82+
+}
83+
84+
ULONG query_reg_value( HKEY hkey, const WCHAR *name, KEY_VALUE_PARTIAL_INFORMATION *info, ULONG size )
85+
{
86+
@@ -565,6 +578,10 @@ static void setup_options(void)
87+
if (!get_config_key( hkey, appkey, "GrabFullscreen", buffer, sizeof(buffer) ))
88+
grab_fullscreen = IS_OPTION_TRUE( buffer[0] );
89+
90+
+ p = x11drv_get_keyboard_layout_list( &len );
91+
+ if (p) set_reg_string_value( hkey, "KeyboardLayoutList", p, len * sizeof(WCHAR) );
92+
+ free( p );
93+
+
94+
if (!get_config_key( hkey, appkey, "ScreenDepth", buffer, sizeof(buffer) ))
95+
default_visual.depth = wcstol( buffer, NULL, 0 );
96+
97+
--
98+
2.54.0
99+
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
From 36cb225502f88e66423b71752dfd1f8c35aef705 Mon Sep 17 00:00:00 2001
2+
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
3+
Date: Fri, 6 Jan 2023 08:15:41 +0100
4+
Subject: [PATCH 3/8] winecfg: Add a keyboard layout selection config option.
5+
6+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=30984
7+
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45605
8+
---
9+
programs/winecfg/input.c | 48 ++++++++++++++++++++++++++++++++++++-
10+
programs/winecfg/resource.h | 3 +++
11+
programs/winecfg/winecfg.rc | 9 +++++++
12+
3 files changed, 59 insertions(+), 1 deletion(-)
13+
14+
diff --git a/programs/winecfg/input.c b/programs/winecfg/input.c
15+
index 115161b9040..f2f035df80f 100644
16+
--- a/programs/winecfg/input.c
17+
+++ b/programs/winecfg/input.c
18+
@@ -35,7 +35,9 @@ static BOOL updating_ui;
19+
20+
static void init_dialog( HWND dialog )
21+
{
22+
- WCHAR *buffer;
23+
+ WCHAR auto_detect_layout[256];
24+
+ WCHAR *buffer, *layout;
25+
+ HWND layouts;
26+
27+
convert_x11_desktop_key();
28+
29+
@@ -46,6 +48,23 @@ static void init_dialog( HWND dialog )
30+
else CheckDlgButton( dialog, IDC_FULLSCREEN_GRAB, BST_UNCHECKED );
31+
free( buffer );
32+
33+
+ layouts = GetDlgItem( dialog, IDC_KEYBOARD_LAYOUT );
34+
+ LoadStringW( GetModuleHandleW( NULL ), IDS_INPUT_AUTO_DETECT_LAYOUT, auto_detect_layout,
35+
+ ARRAY_SIZE(auto_detect_layout) );
36+
+
37+
+ SendMessageW( layouts, CB_RESETCONTENT, 0, 0 );
38+
+ SendMessageW( layouts, CB_ADDSTRING, 0, (LPARAM)auto_detect_layout );
39+
+
40+
+ buffer = get_reg_key( config_key, keypath( L"X11 Driver" ), L"KeyboardLayoutList", L"" );
41+
+ for (layout = buffer; *layout; layout += wcslen( layout ) + 1)
42+
+ SendMessageW( layouts, CB_ADDSTRING, 0, (LPARAM)layout );
43+
+ free( buffer );
44+
+
45+
+ buffer = get_reg_key( config_key, keypath( L"X11 Driver" ), L"KeyboardLayout", L"" );
46+
+ if (!buffer || !buffer[0]) SendMessageW( layouts, CB_SETCURSEL, 0, 0 );
47+
+ else SendMessageW( layouts, CB_SELECTSTRING, -1, (LPARAM)buffer );
48+
+ free( buffer );
49+
+
50+
updating_ui = FALSE;
51+
}
52+
53+
@@ -56,6 +75,24 @@ static void on_fullscreen_grab_clicked( HWND dialog )
54+
else set_reg_key( config_key, keypath( L"X11 Driver" ), L"GrabFullscreen", L"N" );
55+
}
56+
57+
+static void on_keyboard_layout_changed( HWND dialog )
58+
+{
59+
+ int len, index;
60+
+ WCHAR *buffer;
61+
+
62+
+ if (!(index = SendMessageW( GetDlgItem( dialog, IDC_KEYBOARD_LAYOUT ), CB_GETCURSEL, 0, 0 )))
63+
+ set_reg_key( config_key, keypath( L"X11 Driver" ), L"KeyboardLayout", L"" );
64+
+ else
65+
+ {
66+
+ len = SendMessageW( GetDlgItem( dialog, IDC_KEYBOARD_LAYOUT ), CB_GETLBTEXTLEN, index, 0 ) + 1;
67+
+ if (!(buffer = malloc( len * sizeof(WCHAR) ))) return;
68+
+
69+
+ SendMessageW( GetDlgItem( dialog, IDC_KEYBOARD_LAYOUT ), CB_GETLBTEXT, index, (LPARAM)buffer );
70+
+ set_reg_key( config_key, keypath( L"X11 Driver" ), L"KeyboardLayout", buffer );
71+
+ free( buffer );
72+
+ }
73+
+}
74+
+
75+
INT_PTR CALLBACK InputDlgProc( HWND dialog, UINT message, WPARAM wparam, LPARAM lparam )
76+
{
77+
TRACE( "dialog %p, message %#x, wparam %#Ix, lparam %#Ix\n", dialog, message, wparam, lparam );
78+
@@ -77,6 +114,15 @@ INT_PTR CALLBACK InputDlgProc( HWND dialog, UINT message, WPARAM wparam, LPARAM
79+
case IDC_FULLSCREEN_GRAB: on_fullscreen_grab_clicked( dialog ); break;
80+
}
81+
break;
82+
+
83+
+ case CBN_SELCHANGE:
84+
+ if (updating_ui) break;
85+
+ SendMessageW( GetParent( dialog ), PSM_CHANGED, 0, 0 );
86+
+ switch (LOWORD(wparam))
87+
+ {
88+
+ case IDC_KEYBOARD_LAYOUT: on_keyboard_layout_changed( dialog ); break;
89+
+ }
90+
+ break;
91+
}
92+
break;
93+
94+
diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h
95+
index 8022bf4b30c..05331f9db58 100644
96+
--- a/programs/winecfg/resource.h
97+
+++ b/programs/winecfg/resource.h
98+
@@ -235,3 +235,6 @@
99+
100+
/* input tab */
101+
#define IDC_FULLSCREEN_GRAB 1501
102+
+#define IDC_KEYBOARD_LAYOUT 1502
103+
+
104+
+#define IDS_INPUT_AUTO_DETECT_LAYOUT 8501
105+
diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc
106+
index f993e5eec89..6c814617f15 100644
107+
--- a/programs/winecfg/winecfg.rc
108+
+++ b/programs/winecfg/winecfg.rc
109+
@@ -136,6 +136,11 @@ BEGIN
110+
IDC_SYSPARAMS_MENUBAR "Menu Bar"
111+
END
112+
113+
+STRINGTABLE
114+
+BEGIN
115+
+ IDS_INPUT_AUTO_DETECT_LAYOUT "(Auto detect)"
116+
+END
117+
+
118+
IDD_ABOUTCFG DIALOGEX 0, 0, 260, 220
119+
STYLE WS_CHILD
120+
FONT 8, "MS Shell Dlg"
121+
@@ -340,6 +345,10 @@ FONT 8, "MS Shell Dlg"
122+
BEGIN
123+
GROUPBOX "Mouse settings",IDC_STATIC,8,4,244,64
124+
CONTROL "Automatically capture the &mouse in full-screen windows",IDC_FULLSCREEN_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,10
125+
+
126+
+ GROUPBOX "Keyboard settings",IDC_STATIC,8,70,244,64
127+
+ LTEXT "&Layout:",IDC_STATIC,15,82,230,8
128+
+ COMBOBOX IDC_KEYBOARD_LAYOUT,110,80,135,60,CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP
129+
END
130+
131+
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
132+
--
133+
2.54.0
134+

0 commit comments

Comments
 (0)