Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ chmod +x ./install.sh
./install.sh
```

The installer will prompt for your TV IP, MAC address, HDMI input, idle-monitor backend, idle timeout, and screen restore policy, then install the required services. System sleep/wake handling uses the default lifecycle service plus NetworkManager pre-down gate unless you opt out in `config.env`.
The installer will prompt for your TV IP, MAC address, HDMI input, and session idle blanking details, then install the required services. System sleep/wake handling uses the default lifecycle service plus NetworkManager pre-down gate unless you opt out in `config.env`.

On first use, you may need to accept a pairing prompt on the TV:

Expand All @@ -92,8 +92,10 @@ LG Buddy is mostly automatic after installation.
- To inspect the installed runtime version, run `lg-buddy --version`
- To check GitHub releases on demand, run `lg-buddy updates check`; add
`--notify` to send a desktop notification when an update is available
- Weekly background update checks are installed by default; opt out with
`lg-buddy settings set updates.auto_check disabled`
- To rerun full setup for TV IP, MAC address, or HDMI input, run `./configure.sh`
- To check the screen monitor, run `systemctl --user status LG_Buddy_screen.service`
- To check the user-session service, run `systemctl --user status LG_Buddy_screen.service`
- To remove LG Buddy, run `./uninstall.sh`

The settings CLI is a structured layer over `config.env`. These examples write
Expand All @@ -102,10 +104,13 @@ the same file that manual editing and `configure.sh` use:
```bash
lg-buddy settings describe tv.input
lg-buddy settings set tv.input HDMI_2
lg-buddy settings set screen.idle_blank disabled
lg-buddy settings describe screen.restore_policy
lg-buddy settings set screen.idle_timeout 600
lg-buddy settings set screen.restore_policy aggressive
lg-buddy settings set system.sleep_wake_policy disabled
lg-buddy settings set updates.auto_check disabled
lg-buddy settings set updates.channel prerelease
lg-buddy settings unset screen.restore_policy
```

Expand All @@ -115,9 +120,13 @@ Settings can also be edited directly in `config.env`:
tvs_primary_ip=192.168.1.100
tvs_primary_mac=aa:bb:cc:dd:ee:ff
tvs_primary_input=HDMI_2
screen_idle_blank=enabled
screen_backend=auto
screen_idle_timeout=300
screen_restore_policy=conservative
system_sleep_wake_policy=enabled
updates_auto_check=enabled
updates_channel=stable
```

`tv_ip`, `tv_mac`, and `input` are still accepted as legacy single-TV keys, but
Expand All @@ -136,11 +145,23 @@ Set `screen_restore_policy=aggressive` to let session wake/activity and system w

`marker_only` is still accepted as a legacy alias for `conservative`.

`screen_idle_blank=enabled` is the default. Set
`screen_idle_blank=disabled` if you want the user-session service to stay
available for update notifications without running idle-driven TV blank/restore
behavior.

`system_sleep_wake_policy=enabled` is the default. Set
`system_sleep_wake_policy=disabled` if you do not want LG Buddy to control the
TV around system sleep and wake. The lifecycle service and NetworkManager
pre-down hook stay installed and no-op while the policy is disabled.

`updates_auto_check=enabled` is the default. Set
`updates_auto_check=disabled` if you do not want the installed user timer to
check for updates and notify you when a release is available. Manual
`lg-buddy updates check` commands still work when automatic checks are disabled.
`updates_channel=stable` is the default for scheduled checks. Set it to
`prerelease` to opt in to prerelease update notifications.

## More Help

- [User guide](docs/user-guide.md)
Expand Down
6 changes: 6 additions & 0 deletions bin/LG_Buddy_Common
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ else
fi
LG_BUDDY_POINTER_FILE="${LG_BUDDY_INSTALL_DIR}/config-path"
LG_BUDDY_DEFAULT_SCREEN_BACKEND="auto"
LG_BUDDY_DEFAULT_SCREEN_IDLE_BLANK="enabled"
LG_BUDDY_DEFAULT_IDLE_TIMEOUT=300
LG_BUDDY_MAX_IDLE_TIMEOUT=86400
LG_BUDDY_DEFAULT_SCREEN_RESTORE_POLICY="conservative"
LG_BUDDY_DEFAULT_SYSTEM_SLEEP_WAKE_POLICY="enabled"
LG_BUDDY_DEFAULT_UPDATE_AUTO_CHECK="enabled"
LG_BUDDY_DEFAULT_UPDATE_CHANNEL="stable"

lg_buddy_user_config_path() {
if [ -n "${LG_BUDDY_CONFIG:-}" ]; then
Expand Down Expand Up @@ -169,10 +172,13 @@ lg_buddy_load_config() {
tv_mac="$(lg_buddy_config_get_valid_any '^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$' "" "$LG_BUDDY_CONFIG_FILE" "tvs_primary_mac" "tv_mac")"
input="$(lg_buddy_config_get_valid_any '^HDMI_[1-4]$' "" "$LG_BUDDY_CONFIG_FILE" "tvs_primary_input" "input")"
screen_backend="$(lg_buddy_config_get_valid "screen_backend" '^(auto|gnome|swayidle)$' "$LG_BUDDY_DEFAULT_SCREEN_BACKEND" "$LG_BUDDY_CONFIG_FILE")"
screen_idle_blank="$(lg_buddy_config_get_valid "screen_idle_blank" '^(enabled|disabled)$' "$LG_BUDDY_DEFAULT_SCREEN_IDLE_BLANK" "$LG_BUDDY_CONFIG_FILE")"
screen_idle_timeout="$(lg_buddy_config_get_valid "screen_idle_timeout" '^[0-9]+$' "$LG_BUDDY_DEFAULT_IDLE_TIMEOUT" "$LG_BUDDY_CONFIG_FILE")"
screen_idle_timeout="$(lg_buddy_normalize_idle_timeout "$screen_idle_timeout")"
screen_restore_policy="$(lg_buddy_config_get_valid "screen_restore_policy" '^(marker_only|conservative|aggressive)$' "$LG_BUDDY_DEFAULT_SCREEN_RESTORE_POLICY" "$LG_BUDDY_CONFIG_FILE")"
system_sleep_wake_policy="$(lg_buddy_config_get_valid "system_sleep_wake_policy" '^(enabled|disabled)$' "$LG_BUDDY_DEFAULT_SYSTEM_SLEEP_WAKE_POLICY" "$LG_BUDDY_CONFIG_FILE")"
updates_auto_check="$(lg_buddy_config_get_valid "updates_auto_check" '^(enabled|disabled)$' "$LG_BUDDY_DEFAULT_UPDATE_AUTO_CHECK" "$LG_BUDDY_CONFIG_FILE")"
updates_channel="$(lg_buddy_config_get_valid "updates_channel" '^(stable|prerelease)$' "$LG_BUDDY_DEFAULT_UPDATE_CHANNEL" "$LG_BUDDY_CONFIG_FILE")"

if [ -z "$tv_ip" ] || [ -z "$tv_mac" ] || [ -z "$input" ]; then
echo "LG Buddy: config file is missing required TV settings."
Expand Down
127 changes: 88 additions & 39 deletions configure.sh
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@ validate_backend() {
esac
}

validate_screen_idle_blank() {
case "$1" in
enabled|disabled) return 0 ;;
*) return 1 ;;
esac
}

validate_restore_policy() {
case "$1" in
marker_only|conservative|aggressive) return 0 ;;
Expand Down Expand Up @@ -80,18 +87,24 @@ current_tv_ip=""
current_tv_mac=""
current_input="HDMI_1"
current_screen_backend="$LG_BUDDY_DEFAULT_SCREEN_BACKEND"
current_screen_idle_blank="$LG_BUDDY_DEFAULT_SCREEN_IDLE_BLANK"
current_screen_idle_timeout="$LG_BUDDY_DEFAULT_IDLE_TIMEOUT"
current_screen_restore_policy="$LG_BUDDY_DEFAULT_SCREEN_RESTORE_POLICY"
current_system_sleep_wake_policy="$LG_BUDDY_DEFAULT_SYSTEM_SLEEP_WAKE_POLICY"
current_update_auto_check="$LG_BUDDY_DEFAULT_UPDATE_AUTO_CHECK"
current_update_channel="$LG_BUDDY_DEFAULT_UPDATE_CHANNEL"

if lg_buddy_load_config >/dev/null 2>&1; then
current_tv_ip="$tv_ip"
current_tv_mac="$tv_mac"
current_input="$input"
current_screen_backend="$screen_backend"
current_screen_idle_blank="$screen_idle_blank"
current_screen_idle_timeout="$screen_idle_timeout"
current_screen_restore_policy="$(normalize_restore_policy "$screen_restore_policy")"
current_system_sleep_wake_policy="$system_sleep_wake_policy"
current_update_auto_check="$updates_auto_check"
current_update_channel="$updates_channel"
echo "Loaded existing configuration from $LG_BUDDY_CONFIG_FILE"
fi

Expand All @@ -100,9 +113,12 @@ if [ "${LG_BUDDY_NONINTERACTIVE:-0}" = "1" ]; then
tv_mac="${LG_BUDDY_TV_MAC:-$current_tv_mac}"
input="${LG_BUDDY_INPUT:-$current_input}"
screen_backend="${LG_BUDDY_SCREEN_BACKEND:-$current_screen_backend}"
screen_idle_blank="$current_screen_idle_blank"
screen_idle_timeout="${LG_BUDDY_SCREEN_IDLE_TIMEOUT:-$current_screen_idle_timeout}"
screen_restore_policy="${LG_BUDDY_SCREEN_RESTORE_POLICY:-$current_screen_restore_policy}"
system_sleep_wake_policy="${LG_BUDDY_SYSTEM_SLEEP_WAKE_POLICY:-$current_system_sleep_wake_policy}"
update_auto_check="$current_update_auto_check"
update_channel="$current_update_channel"
if [ -z "${LG_BUDDY_SYSTEM_SLEEP_WAKE_POLICY:-}" ] && [ -n "${LG_BUDDY_DISABLE_SLEEP_WAKE:-}" ]; then
case "$LG_BUDDY_DISABLE_SLEEP_WAKE" in
[Yy]*|1|true|TRUE|True|yes|YES|Yes) system_sleep_wake_policy="disabled" ;;
Expand All @@ -126,6 +142,10 @@ if [ "${LG_BUDDY_NONINTERACTIVE:-0}" = "1" ]; then
echo "LG_BUDDY_SCREEN_BACKEND must be one of auto, gnome, or swayidle."
exit 1
}
validate_screen_idle_blank "$screen_idle_blank" || {
echo "screen_idle_blank must be one of enabled or disabled."
exit 1
}
validate_restore_policy "$screen_restore_policy" || {
echo "LG_BUDDY_SCREEN_RESTORE_POLICY must be one of conservative or aggressive (legacy marker_only is also accepted)."
exit 1
Expand Down Expand Up @@ -229,68 +249,94 @@ else
esac
done

echo "Choose the screen idle backend:"
echo " 1) auto"
echo " 2) gnome"
echo " 3) swayidle"

case "$current_screen_backend" in
auto) default_backend_choice="1" ;;
gnome) default_backend_choice="2" ;;
swayidle) default_backend_choice="3" ;;
*) default_backend_choice="1" ;;
case "$current_screen_idle_blank" in
enabled) default_idle_blank_choice="Y" ;;
disabled) default_idle_blank_choice="n" ;;
*) default_idle_blank_choice="Y" ;;
esac

while true; do
BACKEND_CHOICE="$(prompt_with_default "Enter number (1-3)" "$default_backend_choice")"
case "$BACKEND_CHOICE" in
1) screen_backend="auto"; break ;;
2) screen_backend="gnome"; break ;;
3) screen_backend="swayidle"; break ;;
*) echo " Please enter a number between 1 and 3." ;;
IDLE_BLANK_CHOICE="$(prompt_with_default "Enable automatic idle blank/restore? (Y/n)" "$default_idle_blank_choice")"
case "$IDLE_BLANK_CHOICE" in
""|[Yy]*|1|true|TRUE|True|yes|YES|Yes) screen_idle_blank="enabled"; break ;;
[Nn]*|0|false|FALSE|False|no|NO|No) screen_idle_blank="disabled"; break ;;
*) echo " Please answer yes or no." ;;
esac
done

while true; do
screen_idle_timeout="$(prompt_with_default "Enter idle timeout in seconds" "$current_screen_idle_timeout")"
if validate_idle_timeout "$screen_idle_timeout"; then
screen_idle_timeout="$(lg_buddy_normalize_idle_timeout "$screen_idle_timeout")"
break
fi
echo " Please enter a positive number of seconds."
done
if [ "$screen_idle_blank" = "enabled" ]; then
echo "Choose the screen idle backend:"
echo " 1) auto"
echo " 2) gnome"
echo " 3) swayidle"

case "$current_screen_backend" in
auto) default_backend_choice="1" ;;
gnome) default_backend_choice="2" ;;
swayidle) default_backend_choice="3" ;;
*) default_backend_choice="1" ;;
esac

while true; do
BACKEND_CHOICE="$(prompt_with_default "Enter number (1-3)" "$default_backend_choice")"
case "$BACKEND_CHOICE" in
1) screen_backend="auto"; break ;;
2) screen_backend="gnome"; break ;;
3) screen_backend="swayidle"; break ;;
*) echo " Please enter a number between 1 and 3." ;;
esac
done

echo "Choose how aggressively LG Buddy should restore the display:"
echo " 1) conservative (only restore when LG Buddy knows it blanked or powered off the TV)"
echo " 2) aggressive (restore on wake/activity even without prior LG Buddy ownership)"
while true; do
screen_idle_timeout="$(prompt_with_default "Enter idle timeout in seconds" "$current_screen_idle_timeout")"
if validate_idle_timeout "$screen_idle_timeout"; then
screen_idle_timeout="$(lg_buddy_normalize_idle_timeout "$screen_idle_timeout")"
break
fi
echo " Please enter a positive number of seconds."
done

case "$current_screen_restore_policy" in
conservative|marker_only) default_restore_policy_choice="1" ;;
aggressive) default_restore_policy_choice="2" ;;
*) default_restore_policy_choice="1" ;;
esac
echo "Choose how aggressively LG Buddy should restore the display:"
echo " 1) conservative (only restore when LG Buddy knows it blanked or powered off the TV)"
echo " 2) aggressive (restore on wake/activity even without prior LG Buddy ownership)"

while true; do
RESTORE_POLICY_CHOICE="$(prompt_with_default "Enter number (1-2)" "$default_restore_policy_choice")"
case "$RESTORE_POLICY_CHOICE" in
1) screen_restore_policy="conservative"; break ;;
2) screen_restore_policy="aggressive"; break ;;
*) echo " Please enter a number between 1 and 2." ;;
case "$current_screen_restore_policy" in
conservative|marker_only) default_restore_policy_choice="1" ;;
aggressive) default_restore_policy_choice="2" ;;
*) default_restore_policy_choice="1" ;;
esac
done

while true; do
RESTORE_POLICY_CHOICE="$(prompt_with_default "Enter number (1-2)" "$default_restore_policy_choice")"
case "$RESTORE_POLICY_CHOICE" in
1) screen_restore_policy="conservative"; break ;;
2) screen_restore_policy="aggressive"; break ;;
*) echo " Please enter a number between 1 and 2." ;;
esac
done
else
screen_backend="$current_screen_backend"
screen_idle_timeout="$current_screen_idle_timeout"
screen_restore_policy="$current_screen_restore_policy"
fi

system_sleep_wake_policy="$current_system_sleep_wake_policy"
update_auto_check="$current_update_auto_check"
update_channel="$current_update_channel"
fi

echo ""
echo "Configuration to apply:"
echo " TV IP: $tv_ip"
echo " TV MAC: $tv_mac"
echo " PC Input: $input"
echo " Screen Idle Blank: $screen_idle_blank"
echo " Screen Backend: $screen_backend"
echo " Screen Idle Timeout: $screen_idle_timeout"
echo " Screen Restore: $screen_restore_policy"
echo " System Sleep/Wake: $system_sleep_wake_policy"
echo " Update Checks: $update_auto_check"
echo " Update Channel: $update_channel"
echo " Config File: $CONFIG_FILE"
echo ""

Expand All @@ -312,10 +358,13 @@ cat >"$CONFIG_FILE" <<EOF
tvs_primary_ip=$tv_ip
tvs_primary_mac=$tv_mac
tvs_primary_input=$input
screen_idle_blank=$screen_idle_blank
screen_backend=$screen_backend
screen_idle_timeout=$screen_idle_timeout
screen_restore_policy=$screen_restore_policy
system_sleep_wake_policy=$system_sleep_wake_policy
updates_auto_check=$update_auto_check
updates_channel=$update_channel
EOF

chmod 600 "$CONFIG_FILE"
Expand Down
4 changes: 3 additions & 1 deletion crates/lg-buddy/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -548,7 +548,8 @@ mod tests {
BrightnessDialogDeps, BrightnessUi, ReachabilityChecker,
};
use crate::config::{
Config, HdmiInput, MacAddress, ScreenBackend, ScreenRestorePolicy, SystemSleepWakePolicy,
Config, HdmiInput, MacAddress, ScreenBackend, ScreenIdleBlankPolicy, ScreenRestorePolicy,
SystemSleepWakePolicy,
};
use crate::lifecycle::{
run_shutdown_with, run_startup_with, NetworkWaiter, RebootDetector, SleepRequestDetector,
Expand Down Expand Up @@ -1784,6 +1785,7 @@ mod tests {
.expect("parse mac"),
input,
screen_backend: ScreenBackend::Auto,
screen_idle_blank: ScreenIdleBlankPolicy::Enabled,
screen_idle_timeout: 300,
screen_restore_policy,
system_sleep_wake_policy: SystemSleepWakePolicy::Enabled,
Expand Down
Loading
Loading