mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Added automatic toggle for "Lid Action" when external display and power is connected to keep the laptop awake when lid is closed (known as Clamshell Mode).
This commit is contained in:
76
app/Helpers/ClamshellModeControl.cs
Normal file
76
app/Helpers/ClamshellModeControl.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using GHelper.Display;
|
||||
using GHelper.Mode;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace GHelper.Helpers
|
||||
{
|
||||
internal class ClamshellModeControl
|
||||
{
|
||||
public bool IsExternalDisplayConnected()
|
||||
{
|
||||
var devices = ScreenInterrogatory.GetAllDevices().ToArray();
|
||||
|
||||
foreach (var device in devices)
|
||||
{
|
||||
if (device.outputTechnology != ScreenInterrogatory.DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL &&
|
||||
device.outputTechnology != ScreenInterrogatory.DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED)
|
||||
{
|
||||
Logger.WriteLine("Found external screen: " + device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString());
|
||||
|
||||
//Already found one, we do not have to check whether there are more
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool IsClamshellEnabled()
|
||||
{
|
||||
return AppConfig.Get("toggle_clamshell_mode") != 0;
|
||||
}
|
||||
|
||||
public bool IsChargerConnected()
|
||||
{
|
||||
return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online;
|
||||
}
|
||||
|
||||
public bool IsInClamshellMode()
|
||||
{
|
||||
return IsExternalDisplayConnected() && IsChargerConnected();
|
||||
}
|
||||
|
||||
public void ToggleLidAction()
|
||||
{
|
||||
if (IsInClamshellMode() && IsClamshellEnabled())
|
||||
{
|
||||
PowerNative.SetLidAction(0, true);
|
||||
Logger.WriteLine("Engaging Clamshell Mode");
|
||||
}
|
||||
else
|
||||
{
|
||||
PowerNative.SetLidAction(1, true);
|
||||
Logger.WriteLine("Disengaging Clamshell Mode");
|
||||
}
|
||||
}
|
||||
|
||||
public void UnregisterDisplayEvents()
|
||||
{
|
||||
SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged;
|
||||
}
|
||||
|
||||
public void RegisterDisplayEvents()
|
||||
{
|
||||
SystemEvents.DisplaySettingsChanged += SystemEvents_DisplaySettingsChanged;
|
||||
}
|
||||
|
||||
private void SystemEvents_DisplaySettingsChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Logger.WriteLine("Display configuration changed.");
|
||||
|
||||
if (IsClamshellEnabled())
|
||||
ToggleLidAction();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user