#!/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 " 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."