Commit 1e6f8c0b authored by Gerard Gascón's avatar Gerard Gascón
Browse files

refactor: extract input sender to an interface for multiple platform support

parent 184f7812
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -37,11 +37,15 @@
    <setting file="file://$PROJECT_DIR$/SlidePresenter/Program.cs" root0="FORCE_HIGHLIGHTING" />
  </component>
  <component name="MetaFilesCheckinStateConfiguration" checkMetaFiles="true" />
  <component name="ProblemsViewState">
    <option name="selectedTabId" value="Toolset" />
  </component>
  <component name="ProjectColorInfo">{
  &quot;associatedIndex&quot;: 6
}</component>
  <component name="ProjectId" id="2htCW7BWCLo4IJC4dn1HIEGkg1I" />
  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
    <OptionsSetting value="false" id="Update" />
    <ConfirmationsSetting value="2" id="Add" />
  </component>
  <component name="ProjectViewState">
+6 −0
Original line number Diff line number Diff line
namespace SwitchSlidePresenter.InputSender;

public interface IInputSender {
	void NextSlide();
	void PreviousSlide();
}
 No newline at end of file
+47 −0
Original line number Diff line number Diff line
using System.Runtime.InteropServices;
using Win32Api;

namespace SwitchSlidePresenter.InputSender;

public class WindowsInputSender : IInputSender {
	private const uint INPUT_KEYBOARD = 1;
	private const ushort VK_NEXT = 0x22;
	private const ushort VK_PRIOR = 0x21;
	private const uint KEYEVENTF_KEYDOWN = 0x0000;
	private const uint KEYEVENTF_KEYUP = 0x0002;

	public void NextSlide() => SimulateKeyPress(VK_NEXT);
	public void PreviousSlide() => SimulateKeyPress(VK_PRIOR);

	private static void SimulateKeyPress(ushort keyCode) {
		Input[] inputs = new Input[2];

		inputs[0] = new Input {
			type = INPUT_KEYBOARD,
			u = new InputUnion {
				ki = new KeyboardInput {
					wVk = keyCode,
					wScan = 0,
					dwFlags = KEYEVENTF_KEYDOWN,
					time = 0,
					dwExtraInfo = IntPtr.Zero
				}
			}
		};

		inputs[1] = new Input {
			type = INPUT_KEYBOARD,
			u = new InputUnion {
				ki = new KeyboardInput {
					wVk = keyCode,
					wScan = 0,
					dwFlags = KEYEVENTF_KEYUP,
					time = 0,
					dwExtraInfo = IntPtr.Zero
				}
			}
		};

		Win32Api.Win32Api.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(Input)));
	}
}
 No newline at end of file
+4 −47
Original line number Diff line number Diff line
using System.Runtime.InteropServices;
using Win32Api;
using SwitchSlidePresenter.InputSender;

namespace SwitchSlidePresenter;

public class SlideSwitcher : IDisposable {
	private readonly IGamepadReader? _reader;

	private const uint INPUT_KEYBOARD = 1;
	private const ushort VK_NEXT = 0x22;
	private const ushort VK_PRIOR = 0x21;
	private const uint KEYEVENTF_KEYDOWN = 0x0000;
	private const uint KEYEVENTF_KEYUP = 0x0002;
	private readonly IInputSender _inputSender = new WindowsInputSender();

	public SlideSwitcher(IGamepadReader? reader) {
		_reader = reader;
@@ -23,43 +17,6 @@ public class SlideSwitcher : IDisposable {
		_reader.PrevSlide -= PreviousSlide;
	}

	private static void NextSlide() {
		SimulateKeyPress(VK_NEXT);
	}

	private static void PreviousSlide() {
		SimulateKeyPress(VK_PRIOR);
	}

	private static void SimulateKeyPress(ushort keyCode) {
		Input[] inputs = new Input[2];

		inputs[0] = new Input {
			type = INPUT_KEYBOARD,
			u = new InputUnion {
				ki = new KeyboardInput {
					wVk = keyCode,
					wScan = 0,
					dwFlags = KEYEVENTF_KEYDOWN,
					time = 0,
					dwExtraInfo = IntPtr.Zero
				}
			}
		};

		inputs[1] = new Input {
			type = INPUT_KEYBOARD,
			u = new InputUnion {
				ki = new KeyboardInput {
					wVk = keyCode,
					wScan = 0,
					dwFlags = KEYEVENTF_KEYUP,
					time = 0,
					dwExtraInfo = IntPtr.Zero
				}
			}
		};

		Win32Api.Win32Api.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(Input)));
	}
	private void NextSlide() => _inputSender.NextSlide();
	private void PreviousSlide() => _inputSender.PreviousSlide();
}
 No newline at end of file