Files
alt-illogical-impulse/configs/quickshell/modules/settings/TransparencySettings.qml
T

210 lines
7.5 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Services.SystemdUser
// Transparency and Blur Settings Module
// Based on AGS configuration from ~/.config/ags/modules/sideright/centermodules/configure.js
Rectangle {
id: transparencySettings
property bool globalTransparency: false
property int terminalOpacity: 100
property bool blurEnabled: false
property bool blurXray: true
property int blurSize: 8
property int blurPasses: 4
// Storage paths (matching AGS structure)
property string colorModeFile: StandardPaths.writableLocation(StandardPaths.CacheLocation) + "/ags/user/colormode.txt"
property string terminalTransparencyFile: StandardPaths.writableLocation(StandardPaths.CacheLocation) + "/ags/user/generated/terminal/transparency"
color: "transparent"
Component.onCompleted: {
loadSettings()
}
// Load settings from files (AGS compatibility)
function loadSettings() {
// Load global transparency mode
Process.exec("bash", ["-c", `mkdir -p $(dirname "${colorModeFile}")`])
let colorModeResult = Process.exec("bash", ["-c", `sed -n '2p' "${colorModeFile}" 2>/dev/null || echo "opaque"`])
globalTransparency = (colorModeResult.stdout.trim() === "transparent")
// Load terminal opacity
Process.exec("bash", ["-c", `mkdir -p $(dirname "${terminalTransparencyFile}")`])
let termOpacityResult = Process.exec("bash", ["-c", `cat "${terminalTransparencyFile}" 2>/dev/null || echo "100"`])
terminalOpacity = parseInt(termOpacityResult.stdout.trim()) || 100
// Load Hyprland blur settings
loadHyprlandSettings()
}
function loadHyprlandSettings() {
// Load blur enabled
let blurResult = Process.exec("hyprctl", ["getoption", "-j", "decoration:blur:enabled"])
try {
let blurData = JSON.parse(blurResult.stdout)
blurEnabled = blurData.int !== 0
} catch (e) {
console.log("Failed to load blur enabled setting:", e)
}
// Load blur xray
let xrayResult = Process.exec("hyprctl", ["getoption", "-j", "decoration:blur:xray"])
try {
let xrayData = JSON.parse(xrayResult.stdout)
blurXray = xrayData.int !== 0
} catch (e) {
console.log("Failed to load blur xray setting:", e)
}
// Load blur size
let sizeResult = Process.exec("hyprctl", ["getoption", "-j", "decoration:blur:size"])
try {
let sizeData = JSON.parse(sizeResult.stdout)
blurSize = sizeData.int
} catch (e) {
console.log("Failed to load blur size setting:", e)
}
// Load blur passes
let passesResult = Process.exec("hyprctl", ["getoption", "-j", "decoration:blur:passes"])
try {
let passesData = JSON.parse(passesResult.stdout)
blurPasses = passesData.int
} catch (e) {
console.log("Failed to load blur passes setting:", e)
}
}
// Save and apply global transparency
function setGlobalTransparency(enabled) {
globalTransparency = enabled
let mode = enabled ? "transparent" : "opaque"
// Save to colormode.txt (line 2)
Process.exec("bash", ["-c", `mkdir -p $(dirname "${colorModeFile}")
if [ ! -f "${colorModeFile}" ]; then
echo "dark" > "${colorModeFile}"
echo "${mode}" >> "${colorModeFile}"
else
sed -i "2s/.*/${mode}/" "${colorModeFile}"
fi`])
// Apply color changes (equivalent to AGS switchcolor.sh)
applyColorChanges()
}
// Save and apply terminal opacity
function setTerminalOpacity(opacity) {
terminalOpacity = opacity
// Save to terminal transparency file
Process.exec("bash", ["-c", `mkdir -p $(dirname "${terminalTransparencyFile}")
echo "${opacity}" > "${terminalTransparencyFile}"`])
// Apply terminal colors (equivalent to AGS applycolor.sh term)
applyTerminalColors()
}
// Apply Hyprland blur settings
function setBlurEnabled(enabled) {
blurEnabled = enabled
Process.exec("hyprctl", ["keyword", "decoration:blur:enabled", enabled ? "1" : "0"])
}
function setBlurXray(enabled) {
blurXray = enabled
Process.exec("hyprctl", ["keyword", "decoration:blur:xray", enabled ? "1" : "0"])
}
function setBlurSize(size) {
blurSize = size
Process.exec("hyprctl", ["keyword", "decoration:blur:size", size.toString()])
}
function setBlurPasses(passes) {
blurPasses = passes
Process.exec("hyprctl", ["keyword", "decoration:blur:passes", passes.toString()])
}
// Apply color changes (equivalent to AGS color generation)
function applyColorChanges() {
// This would call the equivalent of AGS color generation scripts
Process.exec("bash", ["-c", `
# Apply transparency mode to all shell elements
# This is where we'd integrate with the quickshell theming system
echo "Applying transparency mode: ${globalTransparency ? 'transparent' : 'opaque'}"
# Reload quickshell to apply changes
quickshell ipc call settings reload || true
`])
}
// Apply terminal colors (equivalent to AGS applycolor.sh term)
function applyTerminalColors() {
let alpha = terminalOpacity / 100.0
Process.exec("bash", ["-c", `
# Update foot terminal configuration with new opacity
FOOT_CONFIG="$HOME/.config/foot/foot.ini"
if [ -f "$FOOT_CONFIG" ]; then
# Update alpha value in foot.ini
sed -i "s/^alpha=.*/alpha=${alpha}/" "$FOOT_CONFIG" || echo "alpha=${alpha}" >> "$FOOT_CONFIG"
fi
# Send terminal escape sequence to update running terminals
# This matches the AGS terminal sequences functionality
echo "Applied terminal opacity: ${terminalOpacity}%"
`])
}
// IPC Handler for external control
IpcHandler {
target: "transparencySettings"
function setTransparency(enabled) {
transparencySettings.setGlobalTransparency(enabled)
}
function setTerminalOpacity(opacity) {
transparencySettings.setTerminalOpacity(opacity)
}
function setBlur(enabled) {
transparencySettings.setBlurEnabled(enabled)
}
function setBlurXray(enabled) {
transparencySettings.setBlurXray(enabled)
}
function setBlurSize(size) {
transparencySettings.setBlurSize(size)
}
function setBlurPasses(passes) {
transparencySettings.setBlurPasses(passes)
}
function getSettings() {
return {
globalTransparency: transparencySettings.globalTransparency,
terminalOpacity: transparencySettings.terminalOpacity,
blurEnabled: transparencySettings.blurEnabled,
blurXray: transparencySettings.blurXray,
blurSize: transparencySettings.blurSize,
blurPasses: transparencySettings.blurPasses
}
}
function reload() {
transparencySettings.loadSettings()
}
}
}