Skip to content
Open
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
87 changes: 87 additions & 0 deletions dotfiles/.config/hypr/scripts/brightness.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
#!/usr/bin/env bash

get_mode() {
if ls /sys/class/backlight/* >/dev/null 2>&1; then
echo "backlight"
else
echo "ddc"
fi
}

MODE=$(get_mode)

case "$1" in

displays)
if [ "$MODE" = "backlight" ]; then
echo 1
else
ddcutil detect | grep "Display" | wc -l
fi
;;

get)
if [ "$MODE" = "backlight" ]; then
brightnessctl -m | awk -F, '{gsub("%","",$4); print $4}'
else
ddcutil getvcp 10 | grep -oP 'current value =\s*\K\d+' | head -1
fi
;;

get-display)
if [ "$MODE" = "backlight" ]; then
brightnessctl -m | awk -F, '{gsub("%","",$4); print $4}'
else
ddcutil --display "$2" getvcp 10 | grep -oP 'current value =\s*\K\d+'
fi
;;

set)
if [ "$MODE" = "backlight" ]; then
brightnessctl set "$2%"
else
for d in $(seq 1 $(ddcutil detect | grep Display | wc -l)); do
ddcutil --display "$d" setvcp 10 "$2"
done
fi
;;

set-percentage)
if [ "$MODE" = "backlight" ]; then
brightnessctl set "$2%"
else
for d in $(seq 1 $(ddcutil detect | grep Display | wc -l)); do
current=$(ddcutil --display "$d" getvcp 10 | grep -oP 'current value =\s*\K\d+')
new=$((current + $2))

[ "$new" -gt 100 ] && new=100
[ "$new" -lt 0 ] && new=0

ddcutil --display "$d" setvcp 10 "$new"
done
fi
;;

set-display)
if [ "$MODE" = "backlight" ]; then
brightnessctl set "$3%"
else
ddcutil --display "$2" setvcp 10 "$3"
fi
;;

set-display-percentage)
if [ "$MODE" = "backlight" ]; then
brightnessctl set "$3%"
else
delta="$3"
current=$(ddcutil --display "$2" getvcp 10 | grep -oP 'current value =\s*\K\d+')
new=$((current + delta))

[ "$new" -gt 100 ] && new=100
[ "$new" -lt 0 ] && new=0

ddcutil --display "$2" setvcp 10 "$new"
fi

esac
118 changes: 118 additions & 0 deletions dotfiles/.config/quickshell/SidebarApp/BrightnessControls.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import Quickshell
import Quickshell.Io
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import qs.CustomTheme

ColumnLayout {
id: root
Layout.fillWidth: true
spacing: 20

property bool isOpen: false
property int screenCount: 1

Process {
id: brightnessDisplays
command: ["bash", "-c", "~/.config/hypr/scripts/brightness.sh displays"]

running: root.isOpen

stdout: StdioCollector {
onStreamFinished: {
root.screenCount = parseInt(this.text.trim());
}
}
}

Text {
text: "Brightness" // Sun/Brightness icon
color: Theme.primary
font.family: "monospace"
font.pixelSize: 18
Layout.alignment: Qt.AlignVCenter
}

Repeater {
model: root.screenCount

delegate: RowLayout {
Layout.fillWidth: true
spacing: 15

Text {
text: "☀ "
color: Theme.primary
font.family: "monospace"
font.pixelSize: 18
Layout.alignment: Qt.AlignVCenter
}

Slider {
id: brightnessSlider
Layout.fillWidth: true
from: 0
to: 100
value: 50 // Default

Process {
command: ["bash", "-c", "~/.config/hypr/scripts/brightness.sh get-display " + (index + 1)]
running: root.isOpen
stdout: StdioCollector {
onStreamFinished: {
let v = parseInt(this.text.trim());
if (!isNaN(v))
brightnessSlider.value = v;
}
}
}

Timer {
id: brightnessTimer
interval: 50 // play with the delay if you want to make it more or less responsive, keep in mind that DDC/CI commands can be slow and you don't want to spam them too much
repeat: false

onTriggered: {
Quickshell.execDetached(["bash", "-c", "~/.config/hypr/scripts/brightness.sh set-display " + (index + 1) + " " + Math.round(brightnessSlider.value)]);
}
}

onMoved: {
brightnessTimer.restart();
}

background: Rectangle {
x: brightnessSlider.leftPadding
y: brightnessSlider.topPadding + brightnessSlider.availableHeight / 2 - height / 2
implicitWidth: 200
implicitHeight: 6
width: brightnessSlider.availableWidth
height: implicitHeight
radius: 3
color: Theme.background
border.color: Theme.primary
border.width: 1

Rectangle {
width: brightnessSlider.visualPosition * parent.width
height: parent.height
color: Theme.primary
radius: 3
}
}

handle: Rectangle {
x: brightnessSlider.leftPadding + brightnessSlider.visualPosition * (brightnessSlider.availableWidth - width)
y: brightnessSlider.topPadding + brightnessSlider.availableHeight / 2 - height / 2
implicitWidth: 16
implicitHeight: 16
radius: 8
color: brightnessSlider.pressed ? Theme.background : Theme.primary
border.color: Theme.primary
border.width: 1
}
}
}
}
}
Loading