Compare commits
7 Commits
changing-t
...
fix-mirror
| Author | SHA1 | Date | |
|---|---|---|---|
| b25cb6b278 | |||
| e92be07078 | |||
|
|
bc15980ba5 | ||
| 5490b665f3 | |||
| 3c184743d0 | |||
| 46bf8aec49 | |||
| b07d7f3b03 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
profiles/*.json
|
profiles/
|
||||||
|
*.json
|
||||||
29
all_attributes.md
Normal file
29
all_attributes.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# All Kscreen Doctor attributes
|
||||||
|
- [x] primary
|
||||||
|
- [x] priority
|
||||||
|
- [x] enable
|
||||||
|
- [x] disable
|
||||||
|
- [x] mode
|
||||||
|
- [x] position
|
||||||
|
- [x] scale
|
||||||
|
- [x] orientation / rotation
|
||||||
|
- [x] overscan (0-100)
|
||||||
|
- [x] vrrpolicy (never / always / automatic)
|
||||||
|
- [x] rgbrange (automatic / full / limited)
|
||||||
|
- [x] hdr (enable / disable / toggle)
|
||||||
|
- [x] sdr-brightness (50-10000)
|
||||||
|
- [x] wcg (enable / disable / toggle)
|
||||||
|
- [x] iccprofile (path)
|
||||||
|
- [ ] sdrGamut (0-100)
|
||||||
|
- [ ] maxBrightnessOverride (disable / int)
|
||||||
|
- [ ] maxAverageBrightnessOverride (disable / int)
|
||||||
|
- [ ] minBrightnessOverride (disable / int)
|
||||||
|
- [ ] colorProfileSource (sRBG / ICC / EDID)
|
||||||
|
- [x] brightness (0-100)
|
||||||
|
- [ ] colorPowerTradeoff (preferEfficiency / preferAccuracy)
|
||||||
|
- [ ] dimming (0-100)
|
||||||
|
- [x] mirror ( none / output )
|
||||||
|
- [x] ddcCi (allow / disallow)
|
||||||
|
- [x] maxbpc (automatic / 6-16)
|
||||||
|
- [ ] edrPolicy (never / always)
|
||||||
|
- [ ] sharpness (0 - 100)
|
||||||
15
apply.sh
15
apply.sh
@@ -1,15 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Make sure a config file was provided
|
|
||||||
if [ $# -lt 1 ]; then
|
|
||||||
echo "Usage: $0 <config file>"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Attempt to parse the config file
|
|
||||||
INPUT_FILE=$1
|
|
||||||
echo "Parsing config info from $INPUT_FILE..."
|
|
||||||
|
|
||||||
TEST=$(jq '.outputs[]' $INPUT_FILE)
|
|
||||||
|
|
||||||
echo $TEST[0]
|
|
||||||
@@ -1,5 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
VERBOSE=1
|
||||||
|
|
||||||
|
function log {
|
||||||
|
if [ $VERBOSE -eq 1 ]; then
|
||||||
|
echo "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
# Make sure a config file was provided
|
# Make sure a config file was provided
|
||||||
@@ -27,11 +34,7 @@ fi
|
|||||||
|
|
||||||
# Extract outputs list
|
# Extract outputs list
|
||||||
enabled_outputs=$(jq -c '.outputs[] | select(.enabled == true)' "$PROFILE")
|
enabled_outputs=$(jq -c '.outputs[] | select(.enabled == true)' "$PROFILE")
|
||||||
echo "enabled:"
|
|
||||||
echo $enabled_outputs
|
|
||||||
disabled_outputs=$(jq -c '.outputs[] | select(.enabled == false)' "$PROFILE")
|
disabled_outputs=$(jq -c '.outputs[] | select(.enabled == false)' "$PROFILE")
|
||||||
echo "disabled:"
|
|
||||||
echo $disabled_outputs
|
|
||||||
outputs=$(jq -c '.outputs[]' "$PROFILE")
|
outputs=$(jq -c '.outputs[]' "$PROFILE")
|
||||||
|
|
||||||
# Restore enabled/disabled starting with the enabled monitors
|
# Restore enabled/disabled starting with the enabled monitors
|
||||||
@@ -40,25 +43,64 @@ outputs=$(jq -c '.outputs[]' "$PROFILE")
|
|||||||
|
|
||||||
function enable_outputs {
|
function enable_outputs {
|
||||||
local outputs=$1
|
local outputs=$1
|
||||||
|
|
||||||
|
# If empty or only whitespace, return early
|
||||||
|
[[ -z "$outputs" ]] && return
|
||||||
|
|
||||||
while IFS= read -r out; do
|
while IFS= read -r out; do
|
||||||
id=$(echo "$out" | jq -r '.id')
|
id=$(echo "$out" | jq -r '.id')
|
||||||
|
log "[VAR] id:" $id
|
||||||
name=$(echo "$out" | jq -r '.name')
|
name=$(echo "$out" | jq -r '.name')
|
||||||
|
log "[VAR] name:" $name
|
||||||
enabled=$(echo "$out" | jq -r '.enabled')
|
enabled=$(echo "$out" | jq -r '.enabled')
|
||||||
|
log "[VAR] enabled:" $enabled
|
||||||
|
|
||||||
# Enable/disable
|
# Enable/disable
|
||||||
if [[ "$enabled" == "true" ]]; then
|
if [[ "$enabled" == "true" ]]; then
|
||||||
kscreen-doctor "output.$name.enable"
|
CMD="kscreen-doctor output.$name.enable"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
else
|
else
|
||||||
kscreen-doctor "output.$name.disable"
|
CMD="kscreen-doctor output.$name.disable"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
fi
|
fi
|
||||||
done <<< "$outputs"
|
done <<< "$outputs"
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_outputs $enabled_outputs
|
log "Enabling enabled outputs..."
|
||||||
enable_outputs $disabled_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 [ $value != "null" ]; then
|
||||||
|
|
||||||
|
if [[ -n "$value_map" ]]; then
|
||||||
|
log "[PREVALUE] Value supplied for $output_id $attribute: $value"
|
||||||
|
value=${value_map["$value"]}
|
||||||
|
log "[POSTVALUE] Value output for $output_id $attribute: $value"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CMD="kscreen-doctor output.$output_id.$attribute.$value"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
else
|
||||||
|
log "Output $output_id has not attribute $attribute, skipping..."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function load_profile_to_outputs {
|
function load_profile_to_outputs {
|
||||||
local outputs=$1
|
local outputs=$1
|
||||||
|
|
||||||
|
# If empty or only whitespace, return early
|
||||||
|
[[ -z "$outputs" ]] && return
|
||||||
|
|
||||||
while IFS= read -r out; do
|
while IFS= read -r out; do
|
||||||
id=$(echo "$out" | jq -r '.id')
|
id=$(echo "$out" | jq -r '.id')
|
||||||
name=$(echo "$out" | jq -r '.name')
|
name=$(echo "$out" | jq -r '.name')
|
||||||
@@ -66,55 +108,141 @@ function load_profile_to_outputs {
|
|||||||
posy=$(echo "$out" | jq -r '.pos.y')
|
posy=$(echo "$out" | jq -r '.pos.y')
|
||||||
rotation=$(echo "$out" | jq -r '.rotation')
|
rotation=$(echo "$out" | jq -r '.rotation')
|
||||||
scale=$(echo "$out" | jq -r '.scale')
|
scale=$(echo "$out" | jq -r '.scale')
|
||||||
mode=$(echo "$out" | jq -r '.currentModeId')
|
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
|
||||||
|
bool_enable_map["true"]="enable"
|
||||||
|
bool_enable_map["false"]="disable"
|
||||||
|
|
||||||
|
declare -A rgb_range_map
|
||||||
|
rgb_range_map["0"]="automatic"
|
||||||
|
rgb_range_map["full"]="full"
|
||||||
|
rgb_range_map["limited"]="limited"
|
||||||
|
|
||||||
|
apply_attribute $name "wcg" $wcg $bool_enable_map
|
||||||
|
|
||||||
|
apply_attribute $name "sdr-brightness" $sdrbrightness
|
||||||
|
|
||||||
|
apply_attribute $name "vrrpolicy" $vrrPolicy
|
||||||
|
|
||||||
|
apply_attribute $name "rgbrange" $rgbRange $rgb_range_map
|
||||||
|
|
||||||
|
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')
|
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)
|
# Mode (Resolution + refresh)
|
||||||
kscreen-doctor "output.$id.mode.$mode"
|
# CMD="kscreen-doctor output.$name.mode.$mode"
|
||||||
|
CMD="kscreen-doctor output.$name.mode.$mode"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
|
||||||
# Position
|
# Position
|
||||||
kscreen-doctor "output.$id.position.$posx,$posy"
|
CMD="kscreen-doctor output.$name.position.$posx,$posy"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
|
||||||
# Scale
|
# Scale
|
||||||
kscreen-doctor "output.$id.scale.$scale"
|
CMD="kscreen-doctor output.$name.scale.$scale"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
|
||||||
# Rotation (map from JSON names to kscreen-doctor options)
|
# Rotation (map from JSON names to kscreen-doctor options)
|
||||||
|
CMD=""
|
||||||
case "$rotation" in
|
case "$rotation" in
|
||||||
"1") kscreen-doctor "output.$id.rotation.normal" ;;
|
"1") CMD="kscreen-doctor output.$name.rotation.normal" ;;
|
||||||
"2") kscreen-doctor "output.$id.rotation.left" ;;
|
"2") CMD="kscreen-doctor output.$name.rotation.left" ;;
|
||||||
"4") kscreen-doctor "output.$id.rotation.inverted" ;;
|
"4") CMD="kscreen-doctor output.$name.rotation.inverted" ;;
|
||||||
"8") kscreen-doctor "output.$id.rotation.right" ;;
|
"8") CMD="kscreen-doctor output.$name.rotation.right" ;;
|
||||||
esac
|
esac
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
|
||||||
# Primary / Not Primary
|
# Primary / Not Primary
|
||||||
echo $priority
|
|
||||||
if [ $priority -eq 1 ]; then
|
if [ $priority -eq 1 ]; then
|
||||||
kscreen-doctor "output.$id.primary"
|
CMD="kscreen-doctor output.$name.primary"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
CMD="kscreen-doctor output.$name.priority.$priority"
|
||||||
|
log "[CMD]" $CMD
|
||||||
|
$CMD
|
||||||
|
|
||||||
done <<< "$outputs"
|
done <<< "$outputs"
|
||||||
}
|
}
|
||||||
|
|
||||||
load_profile_to_outputs $outputs
|
load_profile_to_outputs "$outputs"
|
||||||
|
|
||||||
#########################
|
|
||||||
# 2. Restore clone groups
|
|
||||||
#########################
|
|
||||||
|
|
||||||
clone_groups=$(jq -c '.clones[]?' "$PROFILE")
|
|
||||||
|
|
||||||
function restore_clone_groups {
|
|
||||||
local clone_groups=$1
|
|
||||||
while IFS= read -r clone; do
|
|
||||||
primary=$(echo "$clone" | jq -r '.[0]')
|
|
||||||
others=$(echo "$clone" | jq -r '.[]' | tail -n +2)
|
|
||||||
|
|
||||||
for o in $others; do
|
|
||||||
kscreen-doctor "output.$o.clone.$primary"
|
|
||||||
done
|
|
||||||
done <<< "$clone_groups"
|
|
||||||
}
|
|
||||||
|
|
||||||
restore_clone_groups $clone_groups
|
|
||||||
|
|
||||||
echo "Display configuration restored."
|
echo "Display configuration restored."
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1297
profiles/tv.json
1297
profiles/tv.json
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user