Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5fa34c59df | |||
| cf2cbaf679 | |||
| dbc9afbbdf | |||
| 766ce8542d | |||
| c151bb796d | |||
| dd0abcf958 | |||
| 4e16d193f7 | |||
| 6e5d3906aa |
Vendored
+1
@@ -0,0 +1 @@
|
||||
monitor-setup.log
|
||||
+69
-55
@@ -8,10 +8,10 @@ CURR_BRIGHT_LVL_FILE="$CURR_BRIGHT_LVL_PATH/current-brightness-level"
|
||||
|
||||
show_hdr_status() {
|
||||
ICON="/usr/share/icons/breeze-dark/devices/64/monitor.svg"
|
||||
|
||||
if [[ $(kscreen-doctor -o | grep -A 15 $MONITOR | grep HDR) == *"enabled"* ]]; then
|
||||
|
||||
if [[ $(kscreen-doctor -o | grep -A 15 "$MONITOR" | grep HDR) == *"enabled"* ]]; then
|
||||
notify-send -a "HDR Helper" -i $ICON "HDR Enabled"
|
||||
else
|
||||
else
|
||||
notify-send -a "HDR Helper" -i $ICON "HDR Disabled"
|
||||
fi
|
||||
}
|
||||
@@ -20,72 +20,76 @@ set_brightness() {
|
||||
# Store the current brightness level before attempting to update it.
|
||||
if [ ! -f $CURR_BRIGHT_LVL_PATH ]; then
|
||||
mkdir $CURR_BRIGHT_LVL_PATH
|
||||
fi
|
||||
|
||||
kscreen-doctor -o | \
|
||||
grep Brightness | \
|
||||
head -n 1 | \
|
||||
grep -oP "(?<=set to )[0-9]+" \
|
||||
> $CURR_BRIGHT_LVL_FILE
|
||||
|
||||
if [ -v SDR_TARGET_BRIGHTNESS ]; then
|
||||
kscreen-doctor output.$MONITOR.brightness.$SDR_TARGET_BRIGHTNESS
|
||||
fi
|
||||
|
||||
if [ -v SDR_TARGET_BRIGHTNESS_NITS ]; then
|
||||
kscreen-doctor output.$MONITOR.sdr-brightness.$SDR_TARGET_BRIGHTNESS_NITS
|
||||
kscreen-doctor -o |
|
||||
grep Brightness |
|
||||
head -n 1 |
|
||||
grep -oP "(?<=set to )[0-9]+" \
|
||||
>"$CURR_BRIGHT_LVL_FILE"
|
||||
|
||||
if [ -v SDR_TARGET_BRIGHTNESS ]; then
|
||||
kscreen-doctor output."$MONITOR".brightness."$SDR_TARGET_BRIGHTNESS"
|
||||
fi
|
||||
|
||||
if [ -v SDR_TARGET_BRIGHTNESS_NITS ]; then
|
||||
kscreen-doctor output."$MONITOR".sdr-brightness."$SDR_TARGET_BRIGHTNESS_NITS"
|
||||
fi
|
||||
}
|
||||
|
||||
restore_brightness() {
|
||||
if [ -f $CURR_BRIGHT_LVL_FILE ]; then
|
||||
kscreen-doctor output.$MONITOR.brightness.$(cat $CURR_BRIGHT_LVL_FILE)
|
||||
rm $CURR_BRIGHT_LVL_FILE
|
||||
if [ -f "$CURR_BRIGHT_LVL_FILE" ]; then
|
||||
kscreen-doctor output."$MONITOR".brightness."$(cat "$CURR_BRIGHT_LVL_FILE")"
|
||||
rm "$CURR_BRIGHT_LVL_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
refresh_display() {
|
||||
kscreen-doctor output.$MONITOR.mode.$TEMP_RES > /dev/null 2>&1
|
||||
kscreen-doctor output.$MONITOR.mode.$NATIVE_RES > /dev/null 2>&1
|
||||
kscreen-doctor output."$MONITOR".mode."$TEMP_RES" >/dev/null 2>&1
|
||||
kscreen-doctor output."$MONITOR".mode."$NATIVE_RES" >/dev/null 2>&1
|
||||
show_hdr_status
|
||||
}
|
||||
|
||||
enable_hdr () {
|
||||
kscreen-doctor output.$MONITOR.hdr.enable > /dev/null 2>&1
|
||||
kscreen-doctor output.$MONITOR.wcg.enable > /dev/null 2>&1
|
||||
enable_hdr() {
|
||||
kscreen-doctor output."$MONITOR".hdr.enable >/dev/null 2>&1
|
||||
kscreen-doctor output."$MONITOR".wcg.enable >/dev/null 2>&1
|
||||
refresh_display
|
||||
set_brightness
|
||||
}
|
||||
|
||||
disable_hdr() {
|
||||
kscreen-doctor output.$MONITOR.hdr.disable > /dev/null 2>&1
|
||||
kscreen-doctor output.$MONITOR.wcg.disable > /dev/null 2>&1
|
||||
kscreen-doctor output."$MONITOR".hdr.disable >/dev/null 2>&1
|
||||
kscreen-doctor output."$MONITOR".wcg.disable >/dev/null 2>&1
|
||||
refresh_display
|
||||
restore_brightness
|
||||
}
|
||||
|
||||
test_hdr_support() {
|
||||
if [[ $XDG_SESSION_TYPE != "wayland" ]]; then
|
||||
echo "⚠️ Warning: You are not running Wayland. HDR is not supported on X11."
|
||||
exit -5
|
||||
fi
|
||||
if [[ $XDG_SESSION_TYPE != "wayland" ]]; then
|
||||
echo "⚠️ Warning: You are not running Wayland. HDR is not supported on X11."
|
||||
exit 5
|
||||
fi
|
||||
|
||||
HDR_CONTEXT=$(kscreen-doctor -o | grep -A 15 $MONITOR | grep "HDR" | awk '{ print $3 }')
|
||||
if [[ $HDR_CONTEXT == *"incapable"* ]]; then
|
||||
echo "❌ HDR capabilities are either disabled or not supported on your current display."
|
||||
echo ""
|
||||
echo "Please check the correct display is configured in monitor.conf and that"
|
||||
echo "HDR is both supported and enabled."
|
||||
elif [[ $HDR_CONTEXT == *"enabled"* || *"disabled"* ]]; then
|
||||
echo "✅ HDR capabilities are supported on your current display."
|
||||
else
|
||||
echo "ERROR: Unhandled HDR status"
|
||||
exit -4
|
||||
fi
|
||||
HDR_CONTEXT=$(kscreen-doctor -o | grep -A 15 "$MONITOR" | grep "HDR" | awk '{ print $3 }')
|
||||
if [[ $HDR_CONTEXT == *"incapable"* ]]; then
|
||||
echo "❌ HDR capabilities are either disabled or not supported on your current display."
|
||||
echo ""
|
||||
echo "Please check the correct display is configured in monitor.conf and that"
|
||||
echo "HDR is both supported and enabled."
|
||||
elif [[ $HDR_CONTEXT == *"abled"* ]]; then
|
||||
echo "✅ HDR capabilities are supported on your current display."
|
||||
else
|
||||
echo "ERROR: Unhandled HDR status"
|
||||
exit 4
|
||||
fi
|
||||
}
|
||||
|
||||
setup_conf_file() {
|
||||
python monitor-setup.py
|
||||
}
|
||||
|
||||
auto_hdr() {
|
||||
if [[ $(kscreen-doctor -o | grep -A 15 $MONITOR | grep HDR) == *"enabled"* ]]; then
|
||||
if [[ $(kscreen-doctor -o | grep -A 15 "$MONITOR" | grep HDR) == *"enabled"* ]]; then
|
||||
disable_hdr
|
||||
else
|
||||
enable_hdr
|
||||
@@ -95,8 +99,7 @@ auto_hdr() {
|
||||
show_version() {
|
||||
echo "HDR Helper v"$VERSION
|
||||
}
|
||||
|
||||
show_help () {
|
||||
show_help() {
|
||||
echo "=== Usage ==="
|
||||
echo "The default behaviour will automatically enable or disable HDR"
|
||||
echo " hdr-helper (no args)"
|
||||
@@ -112,6 +115,8 @@ show_help () {
|
||||
echo " hdr-helper -h (--help)"
|
||||
echo "Tests whether the connected display is HDR capable"
|
||||
echo " hdr-helper -t (--test)"
|
||||
echo "Automate monitor.conf file setup"
|
||||
echo " hdr-helper -a (--auto-setup-conf-file)"
|
||||
echo ""
|
||||
echo "=== Info ==="
|
||||
echo "Currently only KDE Plasma is supported running Wayland. Ensure that kscreen-doctor"
|
||||
@@ -130,27 +135,33 @@ if [[ $(whereis kscreen-doctor) != *"kscreen-doctor" ]]; then
|
||||
echo "Error: kscreen-doctor cannot be detected, aborting."
|
||||
echo "Please note that only KDE Plasma is currently supported on Wayland."
|
||||
echo ""
|
||||
exit -1
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Import monitor.conf values
|
||||
if source "$CONFIG_FILE"; then
|
||||
if [[ $MONITOR == "" ]] || [[ $NATIVE_RES == "" ]] || [[ $TEMP_RES == "" ]]; then
|
||||
echo "Error: monitor.conf has not been configured."
|
||||
exit -2
|
||||
import_config() {
|
||||
if [[ -f "$CONFIG_FILE" ]]; then
|
||||
# shellcheck source=monitor.conf
|
||||
source "$CONFIG_FILE"
|
||||
if [[ $MONITOR == "" ]] || [[ $NATIVE_RES == "" ]] || [[ $TEMP_RES == "" ]]; then
|
||||
echo "Error: monitor.conf has not been configured."
|
||||
exit 2
|
||||
fi
|
||||
else
|
||||
echo "❌ Error: monitor.conf file not found. Please ensure it's been properly setup."
|
||||
echo "Try running 'hdr-helper -a' to try automatically generating one."
|
||||
exit 3
|
||||
fi
|
||||
else
|
||||
echo "Error: monitor.conf file not found. Please ensure it's been properly setup."
|
||||
exit -3
|
||||
fi
|
||||
}
|
||||
|
||||
# Handle Args
|
||||
if [[ $1 == "-e" ]] || [[ $1 == "--enable" ]]; then
|
||||
import_config
|
||||
enable_hdr
|
||||
elif [[ $1 == "-d" ]] || [[ $1 == "--disable" ]]; then
|
||||
import_config
|
||||
disable_hdr
|
||||
elif [[ $1 == "-s" ]] || [[ $1 == "--status" ]]; then
|
||||
import_config
|
||||
show_hdr_status
|
||||
elif [[ $1 == "-v" ]] || [[ $1 == "--version" ]]; then
|
||||
show_version
|
||||
@@ -158,7 +169,10 @@ elif [[ $1 == "-h" ]] || [[ $1 == "--help" ]]; then
|
||||
show_help
|
||||
elif [[ $1 == "-t" ]] || [[ $1 == "--test" ]]; then
|
||||
test_hdr_support
|
||||
elif [[ $1 == "-a" ]] || [[ $1 == "--auto-setup-conf-file" ]]; then
|
||||
setup_conf_file
|
||||
elif [[ $# -eq 0 ]]; then # Automatically Toggle HDR | Default Behaviour
|
||||
import_config
|
||||
auto_hdr
|
||||
else
|
||||
show_help
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
import re
|
||||
import subprocess
|
||||
import os
|
||||
import shutil
|
||||
|
||||
class MonitorSetup():
|
||||
def __init__(self):
|
||||
self._stg_conf_file = "monitor.conf"
|
||||
self._conf_file_dir = os.path.join(os.path.expanduser('~'),
|
||||
".config/hdr-helper")
|
||||
self._conf_file_path = os.path.join(self._conf_file_dir,
|
||||
self._stg_conf_file)
|
||||
|
||||
################################
|
||||
self.default_mode = None
|
||||
self.alt_rate = None
|
||||
self.alt_res_and_rate = None
|
||||
self.output_name = None
|
||||
|
||||
def extract_display_info(self):
|
||||
# Run process, capture output as a string
|
||||
proc = subprocess.run(
|
||||
["kscreen-doctor -o"],
|
||||
shell=True,
|
||||
capture_output=True,
|
||||
text=True
|
||||
)
|
||||
output = proc.stdout
|
||||
|
||||
# Remove ANSI escape codes for clean regex matching
|
||||
output_clean = re.sub(r'\x1b\[[0-9;]*m', '', output)
|
||||
|
||||
# Find all resolutions with flags
|
||||
resolutions = re.findall(r'\d+x\d+@\d+\S', output_clean)
|
||||
|
||||
# Identify default display mode and alternatives
|
||||
for i in resolutions:
|
||||
if i.endswith('*'):
|
||||
self.default_mode = i
|
||||
if self.default_mode and i != self.default_mode:
|
||||
if i.startswith(self.default_mode.split('@')[0]):
|
||||
self.alt_rate = i
|
||||
break
|
||||
else:
|
||||
self.alt_res_and_rate = i
|
||||
|
||||
|
||||
# Remove asterisk from default
|
||||
if self.default_mode:
|
||||
self.default_mode = self.default_mode.strip('*')
|
||||
|
||||
search_output = re.search(r'Output:\s*\d+\s+(\S+)', output_clean)
|
||||
|
||||
# Extract and print output name
|
||||
if search_output:
|
||||
self.output_name = search_output.group(1)
|
||||
|
||||
def log_display_info(self):
|
||||
_log_file = "monitor-setup.log"
|
||||
with open(_log_file, "w") as file:
|
||||
file.write(f"Output Name: {self.output_name}\n")
|
||||
file.write(f"Default Mode: {self.default_mode}\n")
|
||||
file.write(f"Alternative Rate: {self.alt_rate}\n")
|
||||
file.write(f"Alternative Resolution and Rate: {self.alt_res_and_rate}")
|
||||
|
||||
if os.path.isfile(_log_file):
|
||||
print(f"Log file was written to {os.path.join(os.getcwd(),_log_file)}")
|
||||
|
||||
def edit_config_file(self):
|
||||
_validation_check_cnt = 0
|
||||
|
||||
if os.path.isfile(self._stg_conf_file):
|
||||
with open(self._stg_conf_file, "r") as file:
|
||||
lines = file.readlines()
|
||||
|
||||
with open(self._stg_conf_file, "w") as file:
|
||||
for line in lines:
|
||||
if "MONITOR=" in line:
|
||||
line = line.replace("MONITOR=\n", f"MONITOR={self.output_name}\n")
|
||||
_validation_check_cnt += 1
|
||||
elif "NATIVE_RES=" in line:
|
||||
line = line.replace("NATIVE_RES=\n", f"NATIVE_RES={self.default_mode}\n")
|
||||
_validation_check_cnt += 1
|
||||
|
||||
# Prefer alt_rate if available, otherwise alt_res_and_rate
|
||||
if "TEMP_RES=" in line:
|
||||
if self.alt_rate:
|
||||
line = line.replace("TEMP_RES=\n", f"TEMP_RES={self.alt_rate}\n")
|
||||
_validation_check_cnt += 1
|
||||
elif self.alt_res_and_rate:
|
||||
line = line.replace("TEMP_RES=\n", f"TEMP_RES={self.alt_res_and_rate}\n")
|
||||
_validation_check_cnt += 1
|
||||
|
||||
file.write(line)
|
||||
|
||||
if _validation_check_cnt != 3:
|
||||
print("❌ Automation configuration failed, one or more settings could not be detected.")
|
||||
self.log_display_info()
|
||||
exit(1)
|
||||
|
||||
if not os.path.isfile(self._stg_conf_file):
|
||||
print("❌ Error creating configuration file.")
|
||||
|
||||
def copy_config_file(self):
|
||||
if not os.path.exists(self._conf_file_dir):
|
||||
os.makedirs(self._conf_file_dir)
|
||||
|
||||
# Backup existing config file if it exists
|
||||
if os.path.isfile(self._conf_file_path):
|
||||
shutil.move(self._conf_file_path, self._conf_file_path + ".backup" )
|
||||
|
||||
# Copy staging config file to target location
|
||||
if os.path.isfile(self._stg_conf_file):
|
||||
shutil.copy(self._stg_conf_file, self._conf_file_path)
|
||||
print(f"✅ Configuration file was copied to location: {self._conf_file_path}")
|
||||
|
||||
|
||||
setup = MonitorSetup()
|
||||
setup.extract_display_info()
|
||||
setup.edit_config_file()
|
||||
setup.copy_config_file()
|
||||
Reference in New Issue
Block a user