lagrange icon indicating copy to clipboard operation
lagrange copied to clipboard

Automatically switch to dark theme on Windows

Open quienn opened this issue 1 year ago • 3 comments

The iOS build automatically switches themes according to the current system color scheme, and if IIRC the macOS build does it too. I wonder, could this feature land on Windows too? I think it's pretty useful for folks like me that use AutoDarkMode to switch color schemes on a schedule.

quienn avatar Apr 09 '23 01:04 quienn

This should be doable.

However, there is a small wrinkle in that this feature requires Windows 10 while the app should run on Windows 7, too. Something to take into consideration...

skyjake avatar Apr 10 '23 15:04 skyjake

There's the AppsUseLightTheme registry key (located at Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize). By being accesible through the registry i think it should work on previous versions too.

Wish I could help with the implementation but I don't really know any C. 😕 Thank you for this great piece of software though! Hope my suggestion was helpful.

quienn avatar Apr 17 '23 18:04 quienn

I've read through the code and it seems like the app already does some form of dark mode detection, which is for the title bar only. Could it be possible to also enable the option in the UI and execute a os.theme.changed command like in MacOS & iOS?


Edit: In the mean time, if anyone is interested in this feature and is already a user of Windows Auto Dark Mode, I wrote a PowerShell script for it:

# Lagrange.psm1
enum Theme {
  black = 0
  dark = 1
  light = 2
  white = 3
}

function Set-LagrangeTheme {
  param(
    [Theme]$Theme,
    [string]$LagrangePath = "C:\Program Files\Lagrange\lagrange.exe",
    [string]$LagrangeConfig = "$env:APPDATA\fi.skyjake.Lagrange"
  )

  if (Get-Process -Name "lagrange" -ErrorAction Ignore) {
    Write-Warning "Changing theme for running Lagrange instance..."
    Start-Process -FilePath $LagrangePath -ArgumentList "--theme $Theme"
  }
  else {
    $ConfigFile = Join-Path -Path $LagrangeConfig -ChildPath "prefs.cfg"
    $Config = Get-Content -Path $ConfigFile -Raw
    $Config = $Config -replace 'theme\.set arg:\d', "theme.set arg:$($Theme.value__)"
    Set-Content -Path $ConfigFile -Value $Config
  }
}

Export-ModuleMember -Function Set-LagrangeTheme

Then, ADM's scripts.yaml should look like this:

# $env:APPDATA\AutoDarkMode\scripts.yaml
...
  Scripts:
    - Name: Lagrange
      Command: pwsh
      WorkingDirectory: C:\Path\To\Scripts\Directory
      ArgsLight:
        [
          -NoLogo,
          -NoProfile,
          -Command,
          "Import-Module .\\Lagrange.psm1; Set-LagrangeTheme light",
        ]
      ArgsDark:
        [
          -NoLogo,
          -NoProfile,
          -Command,
          "Import-Module .\\Lagrange.psm1; Set-LagrangeTheme dark",
        ]
      AllowedSources: [Any]
      TimeoutMillis:

quienn avatar Jul 06 '24 23:07 quienn