249 lines
7.2 KiB
Bash
Executable File
249 lines
7.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
VERBOSE=1
|
|
|
|
function log {
|
|
if [ $VERBOSE -eq 1 ]; then
|
|
echo "$@"
|
|
fi
|
|
}
|
|
set -e
|
|
|
|
# Make sure a config file was provided
|
|
if [ $# -lt 1 ]; then
|
|
echo "Usage: $0 <config file>"
|
|
exit
|
|
fi
|
|
|
|
PROFILE=$1
|
|
|
|
if [[ ! -f "$PROFILE" ]]; then
|
|
echo "Profile file not found: $PROFILE" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v jq &>/dev/null; then
|
|
echo "jq not installed!" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v kscreen-doctor &>/dev/null; then
|
|
echo "kscreen-doctor not found!" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Extract outputs list
|
|
enabled_outputs=$(jq -c '.outputs[] | select(.enabled == true)' "$PROFILE")
|
|
disabled_outputs=$(jq -c '.outputs[] | select(.enabled == false)' "$PROFILE")
|
|
outputs=$(jq -c '.outputs[]' "$PROFILE")
|
|
|
|
# Restore enabled/disabled starting with the enabled monitors
|
|
# Starting with a disabled monitor might not work if it was
|
|
# previously the only enabled monitor
|
|
|
|
function enable_outputs {
|
|
local outputs=$1
|
|
|
|
# If empty or only whitespace, return early
|
|
[[ -z "$outputs" ]] && return
|
|
|
|
while IFS= read -r out; do
|
|
id=$(echo "$out" | jq -r '.id')
|
|
log "[VAR] id:" $id
|
|
name=$(echo "$out" | jq -r '.name')
|
|
log "[VAR] name:" $name
|
|
enabled=$(echo "$out" | jq -r '.enabled')
|
|
log "[VAR] enabled:" $enabled
|
|
|
|
# Enable/disable
|
|
if [[ "$enabled" == "true" ]]; then
|
|
CMD="kscreen-doctor output.$name.enable"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
else
|
|
CMD="kscreen-doctor output.$name.disable"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
fi
|
|
done <<< "$outputs"
|
|
}
|
|
|
|
log "Enabling enabled outputs..."
|
|
enable_outputs "$enabled_outputs"
|
|
log "Disabling disabled outputs..."
|
|
enable_outputs "$disabled_outputs"
|
|
|
|
function apply_attribute {
|
|
output_id=$1
|
|
attribute=$2
|
|
value=$3
|
|
value_map=$4
|
|
|
|
if [[ -n "$value_map" ]]; then
|
|
value=${map["$value"]}
|
|
fi
|
|
|
|
if [ $value != "null" ]; then
|
|
CMD="kscreen-doctor output.$output_id.$attribute.$value"
|
|
fi
|
|
log "[CMDDDDDD]" $CMD
|
|
$CMD
|
|
}
|
|
|
|
function load_profile_to_outputs {
|
|
local outputs=$1
|
|
|
|
# If empty or only whitespace, return early
|
|
[[ -z "$outputs" ]] && return
|
|
|
|
while IFS= read -r out; do
|
|
id=$(echo "$out" | jq -r '.id')
|
|
name=$(echo "$out" | jq -r '.name')
|
|
posx=$(echo "$out" | jq -r '.pos.x')
|
|
posy=$(echo "$out" | jq -r '.pos.y')
|
|
rotation=$(echo "$out" | jq -r '.rotation')
|
|
scale=$(echo "$out" | jq -r '.scale')
|
|
mode_id=$(echo "$out" | jq -r '.currentModeId')
|
|
brightness=$(echo "$out" | jq -r '.brightness')
|
|
brightness=$(awk "BEGIN {printf \"%d\", $brightness * 100}")
|
|
ddcCi=$(echo "$out" | jq -r '.ddcCi')
|
|
iccProfilePath=$(echo "$out" | jq -r '.iccProfilePath')
|
|
# mode_name=$(echo "$out" | jq -r ".modes[] | select(.id == \"$mode_id\") | .name")
|
|
# log "[VAR] mode_name:" $mode_name
|
|
refresh_rate=$(echo "$out" | jq -r ".modes[] | select(.id == \"$mode_id\") | .refreshRate")
|
|
refresh_rate=$(printf "%.0f" "$refresh_rate")
|
|
height=$(echo "$out" | jq -r ".modes[] | select(.id == \"$mode_id\") | .size.height")
|
|
width=$(echo "$out" | jq -r ".modes[] | select(.id == \"$mode_id\") | .size.width")
|
|
mode="${width}x${height}@${refresh_rate}"
|
|
replication_source_id=$(echo "$out" | jq -r ".replicationSource")
|
|
hdr=$(echo "$out" | jq -r ".hdr")
|
|
maxBpc=$(echo "$out" | jq -r ".maxBpc")
|
|
overscan=$(echo "$out" | jq -r ".overscan")
|
|
rgbRange=$(echo "$out" | jq -r ".rgbRange")
|
|
sdrbrightness=$(echo "$out" | jq -r '."sdr-brightness"')
|
|
vrrPolicy=$(echo "$out" | jq -r ".vrrPolicy")
|
|
wcg=$(echo "$out" | jq -r ".wcg")
|
|
|
|
|
|
declare -A bool_enable_map
|
|
wcg_map["true"]="enable"
|
|
wcg_map["false"]="false"
|
|
|
|
apply_attribute $name "wcg" $wcg $bool_enable_map
|
|
#if [ $wcg == true ]; then
|
|
# CMD="kscreen-doctor output.$name.wcg.enable"
|
|
#else
|
|
# CMD="kscreen-doctor output.$name.wcg.disable"
|
|
#fi
|
|
#log "[CMD]" $CMD
|
|
#$CMD
|
|
|
|
if [ $sdrbrightness != "null" ]; then
|
|
CMD="kscreen-doctor output.$name.sdr-brightness.${sdrbrightness}"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
fi
|
|
|
|
apply_attribute $name "vrrpolicy" $vrrPolicy
|
|
|
|
apply_attribute $name rgbrange $rgbRange
|
|
|
|
CMD="kscreen-doctor output.$name.overscan.$overscan"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
if [ "$maxBpc" == 0 ]; then
|
|
CMD="kscreen-doctor output.$name.maxbpc.automatic"
|
|
else
|
|
CMD="kscreen-doctor output.$name.maxbpc.$maxBpc"
|
|
fi
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
if [ "$hdr" == true ]; then
|
|
CMD="kscreen-doctor output.$name.hdr.enable"
|
|
else
|
|
CMD="kscreen-doctor output.$name.hdr.disable"
|
|
fi
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
log "[VAR] replication_source_id: $replication_source_id"
|
|
if [ $replication_source_id != 0 ]; then
|
|
replication_source_name=$(echo "$outputs.[] | select(.id == \"$replication_source_id\" | .name)" )
|
|
log "[VAR] replication_source_name: $replication_source_name"
|
|
CMD="kscreen-doctor output.$name.mirror.$replication_source_name"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
else
|
|
CMD="kscreen-doctor output.$name.mirror.none"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
fi
|
|
|
|
log "[VAR] mode: $mode"
|
|
priority=$(echo "$out" | jq -r '.priority')
|
|
|
|
if [ $ddcCi == true ]; then
|
|
CMD="kscreen-doctor output.$name.ddcCi.allow"
|
|
else
|
|
CMD="kscreen-doctor output.$name.ddcCi.disallow"
|
|
fi
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
if [ "$iccProfilePath" != "" ]; then
|
|
CMD="kscreen-doctor output.$name.iccProfilePath.$iccProfilePath"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
fi
|
|
|
|
CMD="kscreen-doctor output.$name.brightness.$brightness"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
#
|
|
|
|
# Mode (Resolution + refresh)
|
|
# CMD="kscreen-doctor output.$name.mode.$mode"
|
|
CMD="kscreen-doctor output.$name.mode.$mode"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
# Position
|
|
CMD="kscreen-doctor output.$name.position.$posx,$posy"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
# Scale
|
|
CMD="kscreen-doctor output.$name.scale.$scale"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
# Rotation (map from JSON names to kscreen-doctor options)
|
|
CMD=""
|
|
case "$rotation" in
|
|
"1") CMD="kscreen-doctor output.$name.rotation.normal" ;;
|
|
"2") CMD="kscreen-doctor output.$name.rotation.left" ;;
|
|
"4") CMD="kscreen-doctor output.$name.rotation.inverted" ;;
|
|
"8") CMD="kscreen-doctor output.$name.rotation.right" ;;
|
|
esac
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
# Primary / Not Primary
|
|
if [ $priority -eq 1 ]; then
|
|
CMD="kscreen-doctor output.$name.primary"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
fi
|
|
|
|
CMD="kscreen-doctor output.$name.priority.$priority"
|
|
log "[CMD]" $CMD
|
|
$CMD
|
|
|
|
done <<< "$outputs"
|
|
}
|
|
|
|
load_profile_to_outputs "$outputs"
|
|
|
|
echo "Display configuration restored." |