From 62501ad859731f03fd293ebaf37ce3e86ec5d4e7 Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Mon, 16 Oct 2023 16:08:19 -0700 Subject: [PATCH] do minor cleanup with EvDevKeyInput, add in define for switching from X11KeyInput to EvDevKeyInput --- .../OSTailoredKeyInputAdapter.cs | 14 +++ .../evdev/EvDevKeyInput.cs | 97 +++++++++---------- 2 files changed, 58 insertions(+), 53 deletions(-) diff --git a/src/BizHawk.Bizware.Input/OSTailoredKeyInputAdapter.cs b/src/BizHawk.Bizware.Input/OSTailoredKeyInputAdapter.cs index 9e6d9c0a0b..0c64cb60b7 100644 --- a/src/BizHawk.Bizware.Input/OSTailoredKeyInputAdapter.cs +++ b/src/BizHawk.Bizware.Input/OSTailoredKeyInputAdapter.cs @@ -1,5 +1,7 @@ #nullable enable +// #define USE_EVDEV + using System; using System.Collections.Generic; using System.Linq; @@ -27,7 +29,11 @@ namespace BizHawk.Bizware.Input switch (OSTailoredCode.CurrentOS) { case OSTailoredCode.DistinctOS.Linux: +#if USE_EVDEV + EvDevKeyInput.Deinitialize(); +#else X11KeyInput.Deinitialize(); +#endif break; case OSTailoredCode.DistinctOS.macOS: QuartzKeyInput.Deinitialize(); @@ -47,7 +53,11 @@ namespace BizHawk.Bizware.Input case OSTailoredCode.DistinctOS.Linux: // TODO: probably need a libinput option for Wayland // (unless we just want to ditch this and always use evdev here?) +#if USE_EVDEV + EvDevKeyInput.Deinitialize(); +#else X11KeyInput.Initialize(); +#endif break; case OSTailoredCode.DistinctOS.macOS: QuartzKeyInput.Initialize(); @@ -74,7 +84,11 @@ namespace BizHawk.Bizware.Input { var ret = OSTailoredCode.CurrentOS switch { +#if USE_EVDEV + OSTailoredCode.DistinctOS.Linux => EvDevKeyInput.Update(), +#else OSTailoredCode.DistinctOS.Linux => X11KeyInput.Update(), +#endif OSTailoredCode.DistinctOS.macOS => QuartzKeyInput.Update(), OSTailoredCode.DistinctOS.Windows => RAWKeyInput.Update(_config ?? throw new(nameof(ProcessHostKeyboards) + " called before the global config was passed")), _ => throw new InvalidOperationException() diff --git a/src/BizHawk.Bizware.Input/evdev/EvDevKeyInput.cs b/src/BizHawk.Bizware.Input/evdev/EvDevKeyInput.cs index 54c04dcebc..cdcb0e30e0 100644 --- a/src/BizHawk.Bizware.Input/evdev/EvDevKeyInput.cs +++ b/src/BizHawk.Bizware.Input/evdev/EvDevKeyInput.cs @@ -18,16 +18,18 @@ namespace BizHawk.Bizware.Input { internal static class EvDevKeyInput { - private struct EvDevKeyboard + private sealed record EvDevKeyboard( + uint DriverVersion, + ushort IdBus, + ushort IdVendor, + ushort IdProduct, + ushort IdVersion, + string Name, + int Fd, + string Path) : IDisposable { - public uint DriverVersion; - public ushort IdBus; - public ushort IdVendor; - public ushort IdProduct; - public ushort IdVersion; - public string Name; - public int Fd; - public string Path; + public void Dispose() + => _ = close(Fd); public override string ToString() { @@ -44,7 +46,7 @@ namespace BizHawk.Bizware.Input private static readonly object _lockObj = new(); - private static List DecodeBits(Span bits) + private static List DecodeBits(ReadOnlySpan bits) { var result = new List(bits.Length * 8); for (var i = 0; i < bits.Length; i++) @@ -135,17 +137,16 @@ namespace BizHawk.Bizware.Input return; } - var keyboard = new EvDevKeyboard - { - DriverVersion = version, - IdBus = id[0], - IdProduct = id[1], - IdVendor = id[2], - IdVersion = id[3], - Name = name, - Fd = fd, - Path = path, - }; + var keyboard = new EvDevKeyboard( + DriverVersion: version, + IdBus: id[0], + IdProduct: id[1], + IdVendor: id[2], + IdVersion: id[3], + Name: name, + Fd: fd, + Path: path + ); Console.WriteLine($"Added keyboard {keyboard}"); _keyboards.Add(path, keyboard); @@ -155,8 +156,8 @@ namespace BizHawk.Bizware.Input { if (_keyboards.TryGetValue(path, out var keyboard)) { - _ = close(keyboard.Fd); Console.WriteLine($"Removed keyboard {keyboard}"); + keyboard.Dispose(); _keyboards.Remove(path); } } @@ -181,7 +182,7 @@ namespace BizHawk.Bizware.Input MaybeRemoveKeyboard(e.FullPath); break; default: - Console.WriteLine($"Unexpected watcher event {e.ChangeType}"); + Debug.WriteLine($"Unexpected watcher event {e.ChangeType}"); break; } } @@ -228,7 +229,7 @@ namespace BizHawk.Bizware.Input foreach (var keyboard in _keyboards.Values) { - _ = close(keyboard.Fd); + keyboard.Dispose(); } _keyboards.Clear(); @@ -248,8 +249,7 @@ namespace BizHawk.Bizware.Input var kbEvent = default(EvDevKeyboardEvent); var kbEventSize = (IntPtr)Marshal.SizeOf(); var kbsToClose = new List(); - Span keyChanges = stackalloc byte[(int)EvDevKeyCode.KEY_CNT]; - keyChanges.Clear(); + var keyEvents = new List(); foreach (var keyboard in _keyboards.Values) { @@ -275,6 +275,7 @@ namespace BizHawk.Bizware.Input // ENODEV means the device is gone if (errno == ENODEV) { + // can't remove the kbs while iterating them! kbsToClose.Add(keyboard.Path); break; } @@ -296,24 +297,24 @@ namespace BizHawk.Bizware.Input continue; } - if (kbEvent.code > EvDevKeyCode.KEY_MAX) + if (KeyEnumMap.TryGetValue(kbEvent.code, out var key)) { - Debug.WriteLine($"Unexpected event code {kbEvent.code}"); - continue; - } - - switch (kbEvent.value) - { - case EvDevKeyValue.KeyUp: - keyChanges[(int)kbEvent.code] = 1; - break; - case EvDevKeyValue.KeyDown: - case EvDevKeyValue.KeyRepeat: - keyChanges[(int)kbEvent.code] = 2; - break; - default: - Debug.WriteLine($"Unexpected event value {kbEvent.value}"); - break; + switch (kbEvent.value) + { + case EvDevKeyValue.KeyUp: + keyEvents.Add(new(key, pressed: false)); + break; + case EvDevKeyValue.KeyDown: + keyEvents.Add(new(key, pressed: true)); + break; + case EvDevKeyValue.KeyRepeat: + // should this be considered a press event? + // probably not particularly useful to do so + break; + default: + Debug.WriteLine($"Unexpected event value {kbEvent.value}"); + break; + } } } } @@ -323,16 +324,6 @@ namespace BizHawk.Bizware.Input MaybeRemoveKeyboard(path); } - var keyEvents = new List(); - for (var i = 0; i < (int)EvDevKeyCode.KEY_CNT; i++) - { - if (keyChanges[i] != 0 && - KeyEnumMap.TryGetValue((EvDevKeyCode)i, out var key)) - { - keyEvents.Add(new(key, keyChanges[i] == 1)); - } - } - return keyEvents; } }