Watch
1
0
Fork
You've already forked dotfiles
0

tmp night light

This commit is contained in:
Alexander Hess 2026-08-14 20:45:34 +02:00
commit 809bbe08d8
Signed by: alexander
GPG key ID: B46EDB4DFC26805D
10 changed files with 191 additions and 82 deletions

View file

@ -452,6 +452,7 @@ night-light-schedule-automatic=true
night-light-schedule-from=18.0
night-light-schedule-to=6.0
# The `$_DEFAULT_TEMPERATURE` used in the ~/.local/bin/night-light-* scripts
night-light-temperature=uint32 2200

View file

@ -0,0 +1,6 @@
[Unit]
Description=Return "Night Light" to the automatic schedule
[Service]
Type=oneshot
ExecStart=%h/.local/bin/night-light-reset

View file

@ -0,0 +1,6 @@
[Timer]
OnCalendar=03:00
Persistent=false
[Install]
WantedBy=timers.target

View file

@ -1,5 +1,5 @@
[Unit]
Description=Restore the GNOME settings from ~/.config/gnome-settings/*.ini
Description=Restore of the GNOME settings upon login
Before=gnome-session-pre.target
ConditionPathIsDirectory=%h/.config/gnome-settings

View file

@ -122,6 +122,7 @@ fi
if [ -f "$HOME/.config/systemd/user/restore-gnome.service" ]; then
systemctl --user daemon-reload
systemctl --user enable night-light-reset.timer
systemctl --user enable restore-gnome.service
systemctl --user status --no-pager restore-gnome.service || true
fi

View file

@ -4,13 +4,11 @@
# as defined in [org/gnome/settings-daemon/plugins/media-keys]
# in ~/.config/gnome-settings/key-bindings.ini
#
# This script ensures "Night Light" is forced on
# if it was not yet on by schedule
# and makes the screen a bit cooler than it currently is
# This script makes the screen a bit cooler than it currently is,
# unless it is currently in a ramping phase and not fully tinted
#
# The default warmth is restored at login by ~/.local/bin/restore-gnome
set -eu
@ -42,9 +40,41 @@ active=$(gdbus call --session \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color NightLightActive)
applied=$(gdbus call --session \
--dest org.gnome.SettingsDaemon.Color \
--object-path /org/gnome/SettingsDaemon/Color \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color Temperature \
| sed -E 's/.*uint32 ([0-9]+).*/\1/')
automatic=$(gsettings get $Schema night-light-schedule-automatic)
current=$(gsettings get $Schema night-light-temperature | awk '{print $2}')
# Cooling never turns "Night Light" on
if [ "$active" = "(<false>,)" ]; then
notify "is not tinting the screen right now (target: ${current}K)"
exit 0
fi
# While the screen is not (fully) tinted,
# stepping the target has no visible effect
# => Only show what is going on
if [ "$automatic" = "true" ] && [ $((applied - current)) -gt 300 ]; then
notify "is still following the schedule's ramp (target: ${current}K)"
exit 0
fi
# Walking past the cool end switches the feature off
if [ "$current" -ge $_MAX_TEMPERATURE ]; then
gsettings set $Schema night-light-enabled false
notify "is now off (stepped past ${_MAX_TEMPERATURE}K)"
exit 0
fi
# 500 = (4700 - 1700 + 500) / 7
# => Seven steps spanning more than the range in the GUI,
# mainly because we want to allow a bit more warmth (i.e., +500)
@ -56,30 +86,3 @@ fi
gsettings set $Schema night-light-temperature "uint32 $new"
# Force "Night Light" on, saving a <Control><Alt>n call,
# with the same settings as in ~/.local/bin/night-light-toggle-schedule
if [ "$active" = "(<false>,)" ]; then
gsettings set $Schema night-light-enabled true
gsettings set $Schema night-light-schedule-automatic false
gsettings set $Schema night-light-schedule-from 0.0
gsettings set $Schema night-light-schedule-to 24.0
fi
if [ "$current" -ge $_MAX_TEMPERATURE ]; then
if [ "$active" = "(<false>,)" ]; then
notify "is now forced on and already as cool as it gets (${_MAX_TEMPERATURE}K)"
else
notify "is already as cool as it gets (${_MAX_TEMPERATURE}K)"
fi
else
if [ "$active" = "(<false>,)" ]; then
notify "is now forced on at ${new}K"
fi
fi

View file

@ -5,12 +5,10 @@
# in ~/.config/gnome-settings/key-bindings.ini
#
# This script ensures "Night Light" is forced on
# if it was not yet on by schedule
# and makes the screen a bit warmer than it currently is
# or makes the screen a bit warmer than it currently is
#
# The default warmth is restored at login by ~/.local/bin/restore-gnome
set -eu
@ -20,6 +18,8 @@ set -eu
_MIN_TEMPERATURE=1200
_MAX_TEMPERATURE=4700
_DEFAULT_TEMPERATURE=2200
notify() {
ID_FILE="${XDG_RUNTIME_DIR}/night-light-notification-id"
@ -42,25 +42,52 @@ active=$(gdbus call --session \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color NightLightActive)
applied=$(gdbus call --session \
--dest org.gnome.SettingsDaemon.Color \
--object-path /org/gnome/SettingsDaemon/Color \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color Temperature \
| sed -E 's/.*uint32 ([0-9]+).*/\1/')
automatic=$(gsettings get $Schema night-light-schedule-automatic)
current=$(gsettings get $Schema night-light-temperature | awk '{print $2}')
# 500 = (4700 - 1700 + 500) / 7
# => Seven steps spanning more than the range in the GUI,
# mainly because we want to allow a bit more warmth (i.e., +500)
new=$((current - 500))
if [ "$new" -lt $_MIN_TEMPERATURE ]; then
new=$_MIN_TEMPERATURE
if [ "$active" = "(<true>,)" ] \
&& { [ "$automatic" = "false" ] || [ $((applied - current)) -le 300 ]; }; then
at_target=true
else
at_target=false
fi
gsettings set $Schema night-light-temperature "uint32 $new"
# Step only if the screen already shows the target tint
# while off or ramping in, forcing on below provides the warming already
if [ "$at_target" = "true" ]; then
# 500 = (4700 - 1700 + 500) / 7
# => Seven steps spanning more than the range in the GUI,
# mainly because we want to allow a bit more warmth (i.e., +500)
new=$((current - 500))
if [ "$new" -lt $_MIN_TEMPERATURE ]; then
new=$_MIN_TEMPERATURE
fi
gsettings set $Schema night-light-temperature "uint32 $new"
# Untinted and parked at a cool target
# => Forcing on would barely show otherwise
elif [ "$active" = "(<false>,)" ] && [ "$current" -gt $_DEFAULT_TEMPERATURE ]; then
gsettings set $Schema night-light-temperature "uint32 $_DEFAULT_TEMPERATURE"
fi
# Force "Night Light" on, saving a <Control><Alt>n call,
# Always force "Night Light" on, saving a <Control><Alt>n call,
# with the same settings as in ~/.local/bin/night-light-toggle-schedule
if [ "$active" = "(<false>,)" ]; then
if [ "$active" = "(<false>,)" ] || [ "$automatic" = "true" ]; then
gsettings set $Schema night-light-enabled true
gsettings set $Schema night-light-schedule-automatic false
gsettings set $Schema night-light-schedule-from 0.0
@ -68,18 +95,8 @@ if [ "$active" = "(<false>,)" ]; then
fi
if [ "$current" -le $_MIN_TEMPERATURE ]; then
if [ "$active" = "(<false>,)" ]; then
notify "is now forced on and already as warm as it gets (${_MIN_TEMPERATURE}K)"
else
# Notify only if the press produced no visible change
# (i.e., already at the minimum and not just snapped to full warmth by the force)
if [ "$at_target" = "true" ] && [ "$current" -le $_MIN_TEMPERATURE ]; then
notify "is already as warm as it gets (${_MIN_TEMPERATURE}K)"
fi
else
if [ "$active" = "(<false>,)" ]; then
notify "is now forced on at ${new}K"
fi
fi

25
.local/bin/night-light-reset Executable file
View file

@ -0,0 +1,25 @@
#!/bin/sh
# Ensure "Night Light" is enabled,
# set to run according to the automatic schedule,
# and reverted to the `_DEFAULT_TEMPERATURE`
#
# Intended to be run at 03:00 by the `night-light-reset.timer` systemd
# user unit, so that a forced state does not persist
#
# See ~/.local/bin/night-light-toggle-schedule for detailed documentation
set -eu
_DEFAULT_TEMPERATURE=2200
Schema=org.gnome.settings-daemon.plugins.color
gsettings set $Schema night-light-enabled true
gsettings set $Schema night-light-schedule-automatic true
gsettings set $Schema night-light-schedule-from 18.0
gsettings set $Schema night-light-schedule-to 6.0
gsettings set $Schema night-light-temperature "uint32 $_DEFAULT_TEMPERATURE"

View file

@ -8,7 +8,6 @@
# for the other half of the toggling logic
# and extensive documentation
set -eu
@ -48,9 +47,17 @@ else
# We could start from our default warmth, as defined
# in [org/gnome/settings-daemon/plugins/color]
# in ~/.config/gnome-settings/misc.ini
# but choose not to do that because the default
# warmth is reset anyways after a reboot
# gsettings set $Schema night-light-temperature "uint32 2200"
# but choose not to do that because this is meant to be
# a plain on/off switch with no side effects
# => Snapping is left to <Alt><Shift>Right, which is about
# warmth rather than about the feature being on or off
#
# _DEFAULT_TEMPERATURE=2200
# current=$(gsettings get $Schema night-light-temperature | awk '{print $2}')
#
# if [ "$current" -gt $_DEFAULT_TEMPERATURE ]; then
# gsettings set $Schema night-light-temperature "uint32 $_DEFAULT_TEMPERATURE"
# fi
# Give the settings daemon a moment to recompute "NightLightActive"
sleep 0.1

View file

@ -12,28 +12,62 @@
# + "Un-force" the Night Light into the local evening schedule
# - <Alt><Shift>n => "if" toggle
# Plain on/off switch for the Night Light feature
# - <Alt><Shift>Left => Make the screen cooler
# - <Alt><Shift>Right => Make the screen warmer, and "force" warmness
#
# Neither key binding changes what the other controls, so they don't fight.
#
# Making the screen cooler or warmer with <Alt><Shift>Left/Right
# also forces "Night Light" on because adjusting this implies
# that the user wants to use it.
#
# State machine:
# TARGET STATE
# +--------------------------+--------------------------+
# CURRENT STATE | nl-toggle-schedule | nl-toggle-enabled |
# +--------------------------+--------------------------+--------------------------+
# | disabled, automatic | enabled, force | enabled, automatic (*) |
# | disabled, force | enabled, force | enabled, force |
# | enabled, automatic | enabled, force (*) | disabled, automatic (*) |
# | enabled, force | enabled, automatic (*) | disabled, force |
# +--------------------------+--------------------------+--------------------------+
# (*) There are four cases where a user does not perceive a change on the screen.
# Then, a notification is shown instead.
#
# See ~/.local/bin/night-light-toggle-enabled for the other half of the toggling logic
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | | "IF" toggle | "WHEN" toggle | "make COOLER" | "make WARMER" |
# | Current STATE | <Alt><Shift>n | <Control><Alt>n | <Alt><Shift>Left | <Alt><Shift>Right |
# | | | | | |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | DISABLED | ENABLE | enabled | still disabled | enabled |
# | + scheduled | + still scheduled | + FORCED on | + still scheduled | + FORCED on |
# | => no tint | => no or set tint | => set tint | => still no tint | => set tint |
# | | based on time N? | | N! | *1 |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | DISABLED | ENABLE | enabled | still disabled | enabled |
# | + forced on | + still forced | + still FORCED on | + still forced | + still FORCED on |
# | => no tint | => set tint | => set tint | => still no tint | => set tint |
# | | | | N! | *1 |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | enabled | DISABLE | still enabled | still enabled | still enabled |
# | + SCHEDULED (day) | + still scheduled | + FORCED on | + still scheduled | + FORCED on |
# | => no tint yet | => still no tint | => set tint | => still no tint | => set tint |
# | | N! | | N! | *1 |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | enabled | DISABLE | still enabled | still enabled | still enabled |
# | + SCHEDULED (ramping) | + still scheduled | + FORCED on | + still scheduled | + FORCED on |
# | => some tint already | => no tint | => set tint | => no change in tint | => set tint |
# | | | | N! | |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | enabled | DISABLE | still enabled | still enabled | still enabled |
# | + SCHEDULED (night) | + still scheduled | + FORCED on | + still scheduled | + FORCED on |
# | => set tint | => no tint | => set tint | => LESS tint | => MORE tint |
# | | | N! | *2 N? | N? |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# | enabled | DISABLE | still enabled | still enabled | still enabled |
# | + FORCED on | + still forced on | + back to SCHEDULED | + still forced on | + still forced on |
# | => set tint | => no tint | => no or set tint | => LESS tint | => MORE tint |
# | | | based on time N? | *2 N? | N? |
# +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
# Legend:
# - N! => A notification is shown for sure because there is no visible change on the screen
# - N? => A notification is shown if there was no visible change on the screen
# - *1 => The temperature is snapped to 2200K to ensure a visible effect
# - *2 => The tint is turned off entirely when stepping over the maximum temperature
#
# Notes:
# - The main state property or state change is shown in CAPS
# - Steps range from 1200K (warmest) to 4700K (coolest),
# which is a bit more than the 1700K to 4700K in `gnome-control-center`
# - If the range is already exhausted, so that the tint does not change, a notification is shown
# - A 03:00 timer re-enables the Night Light feature and puts it back on the automatic schedule
# with the `$_DEFAULT_TEMPERATURE` set
#
set -eu
@ -59,8 +93,16 @@ active_before=$(gdbus call --session \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color NightLightActive)
applied=$(gdbus call --session \
--dest org.gnome.SettingsDaemon.Color \
--object-path /org/gnome/SettingsDaemon/Color \
--method org.freedesktop.DBus.Properties.Get \
org.gnome.SettingsDaemon.Color Temperature \
| sed -E 's/.*uint32 ([0-9]+).*/\1/')
automatic=$(gsettings get $Schema night-light-schedule-automatic)
enabled=$(gsettings get $Schema night-light-enabled)
target=$(gsettings get $Schema night-light-temperature | awk '{print $2}')
if [ "$automatic" = "true" ] || [ "$enabled" = "false" ]; then
@ -71,7 +113,8 @@ if [ "$automatic" = "true" ] || [ "$enabled" = "false" ]; then
gsettings set $Schema night-light-schedule-from 0.0
gsettings set $Schema night-light-schedule-to 24.0
if [ "$active_before" = "(<true>,)" ] && [ "$automatic" = "true" ]; then
if [ "$active_before" = "(<true>,)" ] && [ "$automatic" = "true" ] \
&& [ $((applied - target)) -le 300 ]; then
notify "is now forced to stay on and no longer on an automatic schedule"
fi