@@ -18,16 +18,18 @@ namespace BizHawk.Bizware.Input
18
18
{
19
19
internal static class EvDevKeyInput
20
20
{
21
- private struct EvDevKeyboard
21
+ private sealed record EvDevKeyboard (
22
+ uint DriverVersion ,
23
+ ushort IdBus ,
24
+ ushort IdVendor ,
25
+ ushort IdProduct ,
26
+ ushort IdVersion ,
27
+ string Name ,
28
+ int Fd ,
29
+ string Path ) : IDisposable
22
30
{
23
- public uint DriverVersion ;
24
- public ushort IdBus ;
25
- public ushort IdVendor ;
26
- public ushort IdProduct ;
27
- public ushort IdVersion ;
28
- public string Name ;
29
- public int Fd ;
30
- public string Path ;
31
+ public void Dispose ( )
32
+ => _ = close ( Fd ) ;
31
33
32
34
public override string ToString ( )
33
35
{
@@ -44,7 +46,7 @@ public override string ToString()
44
46
45
47
private static readonly object _lockObj = new ( ) ;
46
48
47
- private static List < int > DecodeBits ( Span < byte > bits )
49
+ private static List < int > DecodeBits ( ReadOnlySpan < byte > bits )
48
50
{
49
51
var result = new List < int > ( bits . Length * 8 ) ;
50
52
for ( var i = 0 ; i < bits . Length ; i ++ )
@@ -135,17 +137,16 @@ private static unsafe void MaybeAddKeyboard(string path)
135
137
return ;
136
138
}
137
139
138
- var keyboard = new EvDevKeyboard
139
- {
140
- DriverVersion = version ,
141
- IdBus = id [ 0 ] ,
142
- IdProduct = id [ 1 ] ,
143
- IdVendor = id [ 2 ] ,
144
- IdVersion = id [ 3 ] ,
145
- Name = name ,
146
- Fd = fd ,
147
- Path = path ,
148
- } ;
140
+ var keyboard = new EvDevKeyboard (
141
+ DriverVersion : version ,
142
+ IdBus : id [ 0 ] ,
143
+ IdProduct : id [ 1 ] ,
144
+ IdVendor : id [ 2 ] ,
145
+ IdVersion : id [ 3 ] ,
146
+ Name : name ,
147
+ Fd : fd ,
148
+ Path : path
149
+ ) ;
149
150
150
151
Console . WriteLine ( $ "Added keyboard { keyboard } ") ;
151
152
_keyboards . Add ( path , keyboard ) ;
@@ -155,8 +156,8 @@ private static void MaybeRemoveKeyboard(string path)
155
156
{
156
157
if ( _keyboards . TryGetValue ( path , out var keyboard ) )
157
158
{
158
- _ = close ( keyboard . Fd ) ;
159
159
Console . WriteLine ( $ "Removed keyboard { keyboard } ") ;
160
+ keyboard . Dispose ( ) ;
160
161
_keyboards . Remove ( path ) ;
161
162
}
162
163
}
@@ -181,7 +182,7 @@ private static void OnWatcherEvent(object _, FileSystemEventArgs e)
181
182
MaybeRemoveKeyboard ( e . FullPath ) ;
182
183
break ;
183
184
default :
184
- Console . WriteLine ( $ "Unexpected watcher event { e . ChangeType } ") ;
185
+ Debug . WriteLine ( $ "Unexpected watcher event { e . ChangeType } ") ;
185
186
break ;
186
187
}
187
188
}
@@ -228,7 +229,7 @@ public static void Deinitialize()
228
229
229
230
foreach ( var keyboard in _keyboards . Values )
230
231
{
231
- _ = close ( keyboard . Fd ) ;
232
+ keyboard . Dispose ( ) ;
232
233
}
233
234
234
235
_keyboards . Clear ( ) ;
@@ -248,8 +249,7 @@ public static IEnumerable<KeyEvent> Update()
248
249
var kbEvent = default ( EvDevKeyboardEvent ) ;
249
250
var kbEventSize = ( IntPtr ) Marshal . SizeOf < EvDevKeyboardEvent > ( ) ;
250
251
var kbsToClose = new List < string > ( ) ;
251
- Span < byte > keyChanges = stackalloc byte [ ( int ) EvDevKeyCode . KEY_CNT ] ;
252
- keyChanges . Clear ( ) ;
252
+ var keyEvents = new List < KeyEvent > ( ) ;
253
253
254
254
foreach ( var keyboard in _keyboards . Values )
255
255
{
@@ -275,6 +275,7 @@ public static IEnumerable<KeyEvent> Update()
275
275
// ENODEV means the device is gone
276
276
if ( errno == ENODEV )
277
277
{
278
+ // can't remove the kbs while iterating them!
278
279
kbsToClose . Add ( keyboard . Path ) ;
279
280
break ;
280
281
}
@@ -296,24 +297,24 @@ public static IEnumerable<KeyEvent> Update()
296
297
continue ;
297
298
}
298
299
299
- if ( kbEvent . code > EvDevKeyCode . KEY_MAX )
300
- {
301
- Debug . WriteLine ( $ "Unexpected event code { kbEvent . code } ") ;
302
- continue ;
303
- }
304
-
305
- switch ( kbEvent . value )
300
+ if ( KeyEnumMap . TryGetValue ( kbEvent . code , out var key ) )
306
301
{
307
- case EvDevKeyValue . KeyUp :
308
- keyChanges [ ( int ) kbEvent . code ] = 1 ;
309
- break ;
310
- case EvDevKeyValue . KeyDown :
311
- case EvDevKeyValue . KeyRepeat :
312
- keyChanges [ ( int ) kbEvent . code ] = 2 ;
313
- break ;
314
- default :
315
- Debug . WriteLine ( $ "Unexpected event value { kbEvent . value } ") ;
316
- break ;
302
+ switch ( kbEvent . value )
303
+ {
304
+ case EvDevKeyValue . KeyUp :
305
+ keyEvents . Add ( new ( key , pressed : false ) ) ;
306
+ break ;
307
+ case EvDevKeyValue . KeyDown :
308
+ keyEvents . Add ( new ( key , pressed : true ) ) ;
309
+ break ;
310
+ case EvDevKeyValue . KeyRepeat :
311
+ // should this be considered a press event?
312
+ // probably not particularly useful to do so
313
+ break ;
314
+ default :
315
+ Debug . WriteLine ( $ "Unexpected event value { kbEvent . value } ") ;
316
+ break ;
317
+ }
317
318
}
318
319
}
319
320
}
@@ -323,16 +324,6 @@ public static IEnumerable<KeyEvent> Update()
323
324
MaybeRemoveKeyboard ( path ) ;
324
325
}
325
326
326
- var keyEvents = new List < KeyEvent > ( ) ;
327
- for ( var i = 0 ; i < ( int ) EvDevKeyCode . KEY_CNT ; i ++ )
328
- {
329
- if ( keyChanges [ i ] != 0 &&
330
- KeyEnumMap . TryGetValue ( ( EvDevKeyCode ) i , out var key ) )
331
- {
332
- keyEvents . Add ( new ( key , keyChanges [ i ] == 1 ) ) ;
333
- }
334
- }
335
-
336
327
return keyEvents ;
337
328
}
338
329
}
0 commit comments