feat: linux support

This commit is contained in:
Gerard Gascón 2024-06-29 23:50:26 +02:00
parent 04ebe3f606
commit d996ca0efb
3 changed files with 80 additions and 1 deletions

View file

@ -1,13 +1,32 @@
#if OS_LINUX #if OS_LINUX
using System.Diagnostics;
namespace ControllerSlidePresenter.InputSender; namespace ControllerSlidePresenter.InputSender;
public class LinuxInputSender : IInputSender { public class LinuxInputSender : IInputSender {
public void NextSlide() { private const string PageUp = "0xff55";
private const string PageDown = "0xff56";
public void NextSlide() {
SendKeys(PageDown);
} }
public void PreviousSlide() { public void PreviousSlide() {
SendKeys(PageUp);
}
private static void SendKeys(string keycode) {
Process proc = new() {
StartInfo = {
FileName = "xdotool",
Arguments = $"key {keycode}",
UseShellExecute = false,
RedirectStandardError = false,
RedirectStandardInput = false,
RedirectStandardOutput = false
}
};
proc.Start();
} }
} }
#endif #endif

55
SlidePresenter/Linux.cs Normal file
View file

@ -0,0 +1,55 @@
#if OS_LINUX
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ControllerSlidePresenter;
public static class Linux {
public static bool CanRun() {
if (getuid() != 0) {
Console.WriteLine("On Linux you need tu run as 'sudo'");
return false;
}
if (!IsXdoToolInstalled())
return false;
return true;
}
private static bool IsXdoToolInstalled() {
string result = RunShellCommand("which xdotool");
if (!string.IsNullOrEmpty(result))
return true;
Console.WriteLine("xdotool is not installed.");
return false;
}
private static string RunShellCommand(string command) {
try {
ProcessStartInfo procStartInfo = new("bash", "-c \"" + command + "\"") {
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
using Process process = new();
process.StartInfo = procStartInfo;
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return result.Trim();
}
catch (Exception ex) {
Console.WriteLine("Error: " + ex.Message);
return string.Empty;
}
}
[DllImport("libc")]
private static extern uint getuid();
}
#endif

View file

@ -3,6 +3,11 @@
namespace ControllerSlidePresenter { namespace ControllerSlidePresenter {
internal abstract class Program { internal abstract class Program {
private static async Task Main() { private static async Task Main() {
#if OS_LINUX
if (!Linux.CanRun())
return;
#endif
IGamepadReader? reader = ControllerSelector.GetReader(); IGamepadReader? reader = ControllerSelector.GetReader();
if (reader == null) { if (reader == null) {
Console.WriteLine("Invalid Controller Selected."); Console.WriteLine("Invalid Controller Selected.");