PowerControl: Add 3 dots + L1 + R1 to reset current resolution

This commit is contained in:
Kamil Trzciński 2023-05-31 11:12:24 +02:00 committed by Kamil Trzcinski
parent 903e5fefae
commit 3417b529b5
5 changed files with 120 additions and 41 deletions

View file

@ -1,5 +1,6 @@
using System.Diagnostics;
using System.Reflection;
using System.Text.Json;
using Sentry;
namespace CommonHelpers
@ -129,6 +130,15 @@ namespace CommonHelpers
}
}
public static void TraceObject(string name, object subject)
{
var serialized = JsonSerializer.Serialize(
subject,
new JsonSerializerOptions { IncludeFields = true }
);
TraceLine("Object: {0}: {1}", name, serialized);
}
public static void TraceLine(string format, params object?[] arg)
{
if (!LogToTrace && !LogToConsole && !LogToFile)

View file

@ -323,12 +323,27 @@ namespace PowerControl
input.buttons4 == (SDCButton4.BTN_L4 | SDCButton4.BTN_R4) &&
input.buttons5 == SDCButton5.BTN_QUICK_ACCESS)
{
dismissNeptuneInput();
rootMenu.Show();
rootMenu.Reset();
notifyIcon.ShowBalloonTip(3000, TitleWithVersion, "Settings were reset to default.", ToolTipIcon.Info);
return;
}
// Display reset sequence
if (input.buttons0 == (SDCButton0.BTN_L1 | SDCButton0.BTN_R1) &&
input.buttons1 == 0 &&
input.buttons2 == 0 &&
input.buttons3 == 0 &&
input.buttons4 == 0 &&
input.buttons5 == SDCButton5.BTN_QUICK_ACCESS)
{
dismissNeptuneInput();
DisplayResolutionController.ResetCurrentResolution();
notifyIcon.ShowBalloonTip(3000, TitleWithVersion, "Resolution was reset.", ToolTipIcon.Info);
return;
}
if (!neptuneDeviceState.buttons5.HasFlag(SDCButton5.BTN_QUICK_ACCESS) || !OSDHelpers.IsOSDForeground())
{
// schedule next repeat far in the future

View file

@ -7,6 +7,7 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using CommonHelpers;
using static PowerControl.Helpers.PhysicalMonitorBrightnessController;
namespace PowerControl.Helpers
@ -71,15 +72,91 @@ namespace PowerControl.Helpers
return null;
}
public static bool SetDisplaySettings(DEVMODE? best)
private static bool SetDisplaySettings(String type, DEVMODE? best)
{
if (best == null)
return false;
DEVMODE oldDm = new DEVMODE();
if (!EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref oldDm))
return false;
Log.TraceObject("SetDisplaySettings:" + type + ":IN", oldDm);
DEVMODE dm = best.Value;
var dispChange = ChangeDisplaySettingsEx(null, ref dm, IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_NONE, IntPtr.Zero);
return dispChange == DISP_CHANGE.Successful;
if (dm.dmPelsWidth == oldDm.dmPelsWidth &&
dm.dmPelsHeight == oldDm.dmPelsHeight &&
dm.dmDisplayFrequency == oldDm.dmDisplayFrequency)
{
Log.TraceLine(
"DispChange: {0}, already set: {1}x{2}@{3}",
type,
oldDm.dmPelsWidth, oldDm.dmPelsHeight, oldDm.dmDisplayFrequency);
return true;
}
var testChange = ChangeDisplaySettingsEx(
null, ref dm, IntPtr.Zero,
ChangeDisplaySettingsFlags.CDS_TEST, IntPtr.Zero);
var applyChange = DISP_CHANGE.NotUpdated;
Log.TraceObject("SetDisplaySettings:" + type + ":REQ", dm);
if (testChange == DISP_CHANGE.Successful)
{
applyChange = ChangeDisplaySettingsEx(
null, ref dm, IntPtr.Zero,
ChangeDisplaySettingsFlags.CDS_RESET, IntPtr.Zero);
}
DEVMODE newDm = new DEVMODE();
if (!EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref newDm))
return false;
Log.TraceObject("SetDisplaySettings:" + type + ":OUT", newDm);
Log.TraceLine(
"DispChange: {0}, Test: {1}, Set: {8}, from: {2}x{3}@{4}, to: {5}x{6}@{7}",
type, testChange,
oldDm.dmPelsWidth, oldDm.dmPelsHeight, oldDm.dmDisplayFrequency,
newDm.dmPelsWidth, newDm.dmPelsHeight, newDm.dmDisplayFrequency,
applyChange
);
return applyChange == DISP_CHANGE.Successful;
}
public static bool SetDisplaySettings(DisplayResolution size, int hz, String type = "DisplaySettings")
{
DEVMODE? best = FindAllDisplaySettings()
.Where((dm) => dm.dmPelsWidth == size.Width && dm.dmPelsHeight == size.Height)
.Where((dm) => dm.dmDisplayFrequency == hz)
.First();
if (best is null)
return false;
return SetDisplaySettings(type, best);
}
public static bool ResetCurrentResolution()
{
try
{
var dm = CurrentDisplaySettings();
// Reset to best default
var bestResolution = GetAllResolutions().Last();
var bestRefreshRate = GetRefreshRates(bestResolution).Max();
SetDisplaySettings(bestResolution, bestRefreshRate, "ResetToDefault");
return SetDisplaySettings("Reset", dm);
}
catch (Exception e)
{
Log.TraceException("ResetResolution", e);
return false;
}
}
public static DisplayResolution[] GetAllResolutions()
@ -108,20 +185,7 @@ namespace PowerControl.Helpers
if (best == null)
return false;
DEVMODE dm = best.Value;
var dispChange = ChangeDisplaySettingsEx(null, ref dm, IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_NONE, IntPtr.Zero);
if (!EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref dm))
return false;
Trace.WriteLine("DispChange: " + dispChange.ToString() + " Size:" + size.ToString() +
" SetSize:" + new DisplayResolution(dm.dmPelsWidth, dm.dmPelsHeight).ToString());
if (dispChange == DISP_CHANGE.Successful)
return true;
return true;
return SetDisplaySettings("Resolution", best);
}
public static int[] GetRefreshRates(DisplayResolution? size = null)
@ -150,32 +214,11 @@ namespace PowerControl.Helpers
public static bool SetRefreshRate(int hz)
{
var current = CurrentDisplaySettings();
var current = GetResolution();
if (current is null)
return false;
DEVMODE? best = FindAllDisplaySettings()
.Where((dm) => dm.dmPelsWidth == current.Value.dmPelsWidth && dm.dmPelsHeight == current.Value.dmPelsHeight)
.Where((dm) => dm.dmDisplayFrequency == hz)
.First();
if (best is null)
return false;
DEVMODE dm = best.Value;
var dispChange = ChangeDisplaySettingsEx(null, ref dm, IntPtr.Zero, ChangeDisplaySettingsFlags.CDS_NONE, IntPtr.Zero);
if (!EnumDisplaySettings(null, ENUM_CURRENT_SETTINGS, ref dm))
return false;
Trace.WriteLine("DispChange: " + dispChange.ToString() + " HZ:" + hz.ToString() + " SetHZ:" + dm.dmDisplayFrequency.ToString());
if (dispChange == DISP_CHANGE.Successful)
return true;
return true;
return SetDisplaySettings(current.Value, hz, "SetRefreshRate");
}

View file

@ -4,14 +4,24 @@
[**READ IF PLAYING ONLINE GAMES AND/OR GAMES THAT HAVE ANTI-CHEAT ENABLED**](https://steam-deck-tools.ayufan.dev/#anti-cheat-and-antivirus-software)
## 0.6.x
## Latest
- PowerControl: Add `3 dots + L1 + R1` to reset current resolution
## 0.6.17
- SteamController/PowerControl: Create Logs in Documents/SteamDeckTools/Logs
- SteamController: Improve **Steam Input** support for **Steam Version 1684535786** WARNING: only English is supported!
- SteamController: Allow to configure DS4 back buttons
- SteamController: Allow to `EnableDS4Support=false` to hide DS4 controller
## 0.6.16
- All: Support [unofficial APU drivers](https://sourceforge.net/projects/amernimezone/files/Release%20Polaris-Vega-Navi/AMD%20SOC%20Driver%20Variant/) that present themselves as `AMD Radeon 670M`
- PowerControl: Show Game Profiles menu item
## 0.6.15
- PowerControl: Support SMU of Vangogh GPU shipped with BIOS 115
- SteamController: Add `DS4` support (with Gyro, Accel, Trackpads and Haptics)
- SteamController: Move `KeepX360AlwaysConnected` to `Settings`

View file

@ -32,6 +32,7 @@ Additional shortcuts:
- Control Volume: use Volume Up and Down
- Control Brightness: press and hold Quick Access (3 dots), and then Volume Up and Down
- Press `3 dots + L4 + R4 + L5 + R5` to reset (TDP, Refresh Rate, FPS limit) to default
- Press `3 dots + L1 + R1` to reset current resolution (allows to fix black screen)
## 2. SWICD configuration