Merge branch 'end-4:main' into parallax

This commit is contained in:
Ivan Rosinskii
2026-03-26 18:37:09 +01:00
committed by GitHub
30 changed files with 394 additions and 241 deletions
+16 -13
View File
@@ -1,28 +1,31 @@
function fish_prompt -d "Write out the prompt"
# This shows up as USER@HOST /home/user/ >, with the directory colored
# $USER and $hostname are set by fish, so you can just use them
# instead of using `whoami` and `hostname`
printf '%s@%s %s%s%s > ' $USER $hostname \
(set_color $fish_color_cwd) (prompt_pwd) (set_color normal)
end
if status is-interactive # Commands to run in interactive sessions can go here
# Commands to run in interactive sessions can go here
if status is-interactive
# No greeting
set fish_greeting
# Use starship
starship init fish | source
function starship_transient_prompt_func
starship module character
end
if test "$TERM" != "linux"
starship init fish | source
enable_transience
end
# Colors
if test -f ~/.local/state/quickshell/user/generated/terminal/sequences.txt
cat ~/.local/state/quickshell/user/generated/terminal/sequences.txt
end
# Aliases
alias clear "printf '\033[2J\033[3J\033[1;1H'" # fix: kitty doesn't clear properly
# kitty doesn't clear properly so we need to do this weird printing
alias clear "printf '\033[2J\033[3J\033[1;1H'"
alias celar "printf '\033[2J\033[3J\033[1;1H'"
alias claer "printf '\033[2J\033[3J\033[1;1H'"
alias ls 'eza --icons'
alias pamcan pacman
alias q 'qs -c ii'
if test "$TERM" != "linux"
alias ls 'eza --icons'
end
end
@@ -12,11 +12,11 @@ QuickToggleModel {
name: Translation.tr("Night Light")
statusText: (auto ? Translation.tr("Auto, ") : "") + (toggled ? Translation.tr("Active") : Translation.tr("Inactive"))
toggled: Hyprsunset.active
toggled: Hyprsunset.temperatureActive
icon: auto ? "night_sight_auto" : "bedtime"
mainAction: () => {
Hyprsunset.toggle()
Hyprsunset.toggleTemperature()
}
hasMenu: true
@@ -17,6 +17,7 @@ Slider {
id: root
property list<real> stopIndicatorValues: [1]
property list<real> dividerValues: []
enum Configuration {
Wavy = 4,
XS = 12,
@@ -45,6 +46,7 @@ Slider {
property real handleHeight: (configuration === StyledSlider.Configuration.Wavy) ? 24 : Math.max(33, trackWidth + 9)
property real handleWidth: root.pressed ? handlePressedWidth : handleDefaultWidth
property real handleMargins: 4
property real dividerMargins: 2
property real trackDotSize: 3
property bool usePercentTooltip: true
property string tooltipContent: usePercentTooltip ? `${Math.round(((value - from) / (to - from)) * 100)}%` : `${Math.round(value)}`
@@ -94,71 +96,94 @@ Slider {
}
background: Item {
id: background
anchors.verticalCenter: parent.verticalCenter
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
width: root.width
implicitHeight: trackWidth
property var normalized: root.dividerValues.map(v => (v - root.from) / (root.to - root.from))
property var filtered: normalized.filter(v => Math.abs(v - root.visualPosition) * effectiveDraggingWidth > handleMargins + handleWidth / 2 - dividerMargins)
property var leftValues: [0, ...filtered.filter(v => v < root.visualPosition), root.visualPosition]
property var rightValues: [root.visualPosition, ...filtered.filter(v => v > root.visualPosition), 1]
property var leftWidths: leftValues.map((v, i, a) => a[i + 1] - v).slice(0, -1)
property var rightWidths: rightValues.map((v, i, a) => a[i + 1] - v).slice(0, -1)
// Fill left
Loader {
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
}
width: root.handleMargins + (root.visualPosition * root.effectiveDraggingWidth) - (root.handleWidth / 2 + root.handleMargins)
height: root.trackWidth
active: !root.wavy
sourceComponent: Rectangle {
color: root.highlightColor
topLeftRadius: root.trackRadius
bottomLeftRadius: root.trackRadius
topRightRadius: root.unsharpenRadius
bottomRightRadius: root.unsharpenRadius
Repeater {
model: background.leftWidths.length
Loader {
required property real index
anchors.verticalCenter: background.verticalCenter
property real leftMargin: index > 0 ? root.dividerMargins : 0
property real rightMargin: index < background.leftWidths.length - 1 ? root.dividerMargins : root.handleMargins
x: background.leftValues[index] * root.effectiveDraggingWidth + leftMargin + (index > 0 ? leftPadding : 0)
width: background.leftWidths[index] * root.effectiveDraggingWidth - leftMargin - rightMargin - (index === background.leftWidths.length - 1 ? handleWidth / 2 : 0) + (index === 0 ? leftPadding : 0)
height: root.trackWidth
active: !root.wavy
sourceComponent: Rectangle {
color: root.highlightColor
topLeftRadius: index === 0 ? root.trackRadius : root.unsharpenRadius
bottomLeftRadius: index === 0 ? root.trackRadius : root.unsharpenRadius
topRightRadius: root.unsharpenRadius
bottomRightRadius: root.unsharpenRadius
}
}
}
Loader {
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
}
width: root.handleMargins + (root.visualPosition * root.effectiveDraggingWidth) - (root.handleWidth / 2 + root.handleMargins)
height: root.height
active: root.wavy
sourceComponent: WavyLine {
id: wavyFill
frequency: root.waveFrequency
fullLength: root.width
color: root.highlightColor
amplitudeMultiplier: root.wavy ? 0.5 : 0
width: root.handleMargins + (root.visualPosition * root.effectiveDraggingWidth) - (root.handleWidth / 2 + root.handleMargins)
height: root.trackWidth
Connections {
target: root
function onValueChanged() { wavyFill.requestPaint(); }
function onHighlightColorChanged() { wavyFill.requestPaint(); }
}
FrameAnimation {
running: root.animateWave
onTriggered: {
wavyFill.requestPaint()
Repeater {
model: background.leftWidths.length
Loader {
required property int index
anchors.verticalCenter: background.verticalCenter
property real leftMargin: index > 0 ? root.dividerMargins : 0
property real rightMargin: index < background.leftWidths.length - 1 ? root.dividerMargins : root.handleMargins
x: background.leftValues[index] * root.effectiveDraggingWidth + leftMargin + (index > 0 ? leftPadding : 0)
width: background.leftWidths[index] * root.effectiveDraggingWidth - leftMargin - rightMargin - (index === background.leftWidths.length - 1 ? handleWidth / 2 : 0) + (index === 0 ? leftPadding : 0)
height: root.height
active: root.wavy
sourceComponent: WavyLine {
id: wavyFill
frequency: root.waveFrequency
fullLength: root.width
color: root.highlightColor
amplitudeMultiplier: root.wavy ? 0.5 : 0
width: parent.width
height: root.trackWidth
Connections {
target: root
function onValueChanged() { wavyFill.requestPaint(); }
function onHighlightColorChanged() { wavyFill.requestPaint(); }
}
FrameAnimation {
running: root.animateWave
onTriggered: {
wavyFill.requestPaint()
}
}
}
}
}
}
// Fill right
Rectangle {
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
Repeater {
model: background.rightWidths.length
Rectangle {
required property int index
anchors.verticalCenter: background.verticalCenter
property real leftMargin: index > 0 ? root.dividerMargins : root.handleMargins
property real rightMargin: index < background.rightWidths.length - 1 ? root.dividerMargins : 0
x: background.rightValues[index] * root.effectiveDraggingWidth + leftMargin + (index === 0 ? handleWidth / 2 : 0) + leftPadding
width: background.rightWidths[index] * root.effectiveDraggingWidth - leftMargin - rightMargin - (index === 0 ? handleWidth / 2 : 0) + (index === background.rightWidths.length - 1 ? rightPadding : 0)
height: trackWidth
color: root.trackColor
topRightRadius: index === background.rightWidths.length - 1 ? root.trackRadius : root.unsharpenRadius
bottomRightRadius: index === background.rightWidths.length - 1 ? root.trackRadius : root.unsharpenRadius
topLeftRadius: root.unsharpenRadius
bottomLeftRadius: root.unsharpenRadius
}
width: root.handleMargins + ((1 - root.visualPosition) * root.effectiveDraggingWidth) - (root.handleWidth / 2 + root.handleMargins)
height: trackWidth
color: root.trackColor
topRightRadius: root.trackRadius
bottomRightRadius: root.trackRadius
topLeftRadius: root.unsharpenRadius
bottomLeftRadius: root.unsharpenRadius
}
// Stop indicators
@@ -177,7 +202,7 @@ Slider {
implicitWidth: root.handleWidth
implicitHeight: root.handleHeight
x: root.handleMargins + (root.visualPosition * root.effectiveDraggingWidth) - (root.handleWidth / 2)
x: root.leftPadding + (root.visualPosition * root.effectiveDraggingWidth) - (root.handleWidth / 2)
anchors.verticalCenter: parent.verticalCenter
radius: Appearance.rounding.full
color: root.handleColor
@@ -59,8 +59,8 @@ Item { // Bar content region
implicitWidth: leftSectionRowLayout.implicitWidth
implicitHeight: Appearance.sizes.baseBarHeight
onScrollDown: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05)
onScrollUp: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05)
onScrollDown: Brightness.decreaseBrightness()
onScrollUp: Brightness.increaseBrightness()
onMovedAway: GlobalStates.osdBrightnessOpen = false
onPressed: event => {
if (event.button === Qt.LeftButton)
@@ -70,7 +70,7 @@ Item { // Bar content region
// Visual content
ScrollHint {
reveal: barLeftSideMouseArea.hovered
icon: "light_mode"
icon: Hyprsunset.gamma === 100 ? "light_mode" : "wb_twilight"
tooltipText: Translation.tr("Scroll to change brightness")
side: "left"
anchors.left: parent.left
@@ -25,6 +25,10 @@ Scope {
id: "brightness",
sourceUrl: "indicators/BrightnessIndicator.qml"
},
{
id: "gamma",
sourceUrl: "indicators/GammaIndicator.qml"
},
]
function triggerOsd() {
@@ -52,6 +56,15 @@ Scope {
}
}
Connections {
target: Hyprsunset
function onGammaChangeAttempt() {
root.protectionMessage = "";
root.currentIndicator = "gamma";
root.triggerOsd();
}
}
Connections {
// Listen to volume changes
target: Audio.sink?.audio ?? null
@@ -11,6 +11,8 @@ Item {
required property string name
property bool rotateIcon: false
property bool scaleIcon: false
property alias from: valueProgressBar.from
property alias to: valueProgressBar.to
property real valueIndicatorVerticalPadding: 9
property real valueIndicatorLeftPadding: 10
@@ -9,7 +9,7 @@ OsdValueIndicator {
property var focusedScreen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name)
property var brightnessMonitor: Brightness.getMonitorForScreen(focusedScreen)
icon: Hyprsunset.active ? "routine" : "light_mode"
icon: Hyprsunset.temperatureActive ? "routine" : "light_mode"
rotateIcon: true
scaleIcon: true
name: Translation.tr("Brightness")
@@ -0,0 +1,14 @@
import qs.services
import QtQuick
import Quickshell
import Quickshell.Hyprland
import qs.modules.ii.onScreenDisplay
OsdValueIndicator {
id: rotateIcon
icon: "wb_twilight"
name: Translation.tr("Gamma")
from: Hyprsunset.gammaLowerLimit / 100
value: Hyprsunset.gamma / 100 ?? 0.5
}
@@ -98,7 +98,7 @@ Scope {
if (!Config.options.sidebar.cornerOpen.valueScroll)
return;
if (cornerWidget.isLeft)
cornerPanelWindow.brightnessMonitor.setBrightness(cornerPanelWindow.brightnessMonitor.brightness - 0.05);
Brightness.decreaseBrightness()
else {
const currentVolume = Audio.value;
const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2;
@@ -109,7 +109,7 @@ Scope {
if (!Config.options.sidebar.cornerOpen.valueScroll)
return;
if (cornerWidget.isLeft)
cornerPanelWindow.brightnessMonitor.setBrightness(cornerPanelWindow.brightnessMonitor.brightness + 0.05);
Brightness.increaseBrightness()
else {
const currentVolume = Audio.value;
const step = currentVolume < 0.1 ? 0.01 : 0.02 || 0.2;
@@ -40,10 +40,25 @@ Rectangle {
visible: active
active: Config.options.sidebar.quickSliders.showBrightness
sourceComponent: QuickSlider {
materialSymbol: "brightness_6"
value: root.brightnessMonitor.brightness
materialSymbol: "light_mode"
secondaryMaterialSymbol: "wb_twilight"
stopIndicatorValues: Hyprsunset.gamma !== 100 && root.brightnessMonitor?.brightness !== 0 ? [0.3 + root.brightnessMonitor?.brightness * 0.7] : []
value: Hyprsunset.gamma === 100? 0.3 + root.brightnessMonitor?.brightness * 0.7 : Hyprsunset.gamma / 100 * 0.3
tooltipContent: Hyprsunset.gamma === 100 ? `${Math.round(root.brightnessMonitor?.brightness * 100)}%` : `${Translation.tr("Gamma")} ${Hyprsunset.gamma}%`
onMoved: {
root.brightnessMonitor.setBrightness(value)
if (value >= 0.3) {
// 0.3 - 1.0 brightness
root.brightnessMonitor.setBrightness((value - 0.3) / 0.7);
if (Hyprsunset.gamma !== 100) {
Hyprsunset.setGamma(100);
}
} else {
// 0 - 0.3 gamma
if (root.brightnessMonitor.brightness !== 0) {
root.brightnessMonitor.setBrightness(0);
}
Hyprsunset.setGamma(value * 100 / 0.3);
}
}
}
}
@@ -84,16 +99,18 @@ Rectangle {
component QuickSlider: StyledSlider {
id: quickSlider
required property string materialSymbol
property string secondaryMaterialSymbol
configuration: StyledSlider.Configuration.M
stopIndicatorValues: []
dividerValues: secondaryMaterialSymbol.length > 0 ? [secondaryIcon.iconLocation] : []
MaterialSymbol {
id: icon
property bool nearFull: quickSlider.value >= 0.9
anchors {
verticalCenter: parent.verticalCenter
right: nearFull ? quickSlider.handle.right : parent.right
rightMargin: quickSlider.nearFull ? 14 : 8
verticalCenter: quickSlider.verticalCenter
right: nearFull ? quickSlider.handle.right : quickSlider.right
rightMargin: nearFull ? 14 : 8
}
iconSize: 20
color: nearFull ? Appearance.colors.colOnPrimary : Appearance.colors.colOnSecondaryContainer
@@ -105,7 +122,25 @@ Rectangle {
Behavior on anchors.rightMargin {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
}
MaterialSymbol {
id: secondaryIcon
visible: secondaryMaterialSymbol.length > 0
property real iconLocation: 0.3
property bool nearIcon: iconLocation - quickSlider.value <= 0.1 && iconLocation - quickSlider.value > (quickSlider.handleWidth + 8 - 14) / quickSlider.effectiveDraggingWidth
anchors {
verticalCenter: quickSlider.verticalCenter
right: nearIcon ? quickSlider.handle.right : quickSlider.right
rightMargin: nearIcon ? 14 : (1 - iconLocation) * quickSlider.effectiveDraggingWidth + quickSlider.rightPadding + 8
}
iconSize: 20
color: quickSlider.value >= iconLocation - 0.1 ? Appearance.colors.colOnPrimary : Appearance.colors.colOnSecondaryContainer
text: secondaryMaterialSymbol
Behavior on color {
animation: Appearance.animation.elementMoveFast.colorAnimation.createObject(this)
}
}
}
}
@@ -15,7 +15,7 @@ WindowDialog {
id: root
property var screen: root.QsWindow.window?.screen
property var brightnessMonitor: Brightness.getMonitorForScreen(screen)
backgroundHeight: 600
backgroundHeight: 700
WindowDialogTitle {
text: Translation.tr("Eye protection")
@@ -44,9 +44,9 @@ WindowDialog {
iconSize: Appearance.font.pixelSize.larger
buttonIcon: "check"
text: Translation.tr("Enable now")
checked: Hyprsunset.active
checked: Hyprsunset.temperatureActive
onCheckedChanged: {
Hyprsunset.toggle(checked)
Hyprsunset.toggleTemperature(checked)
}
}
@@ -146,6 +146,33 @@ WindowDialog {
id: brightnessColumn
Layout.topMargin: -16
Layout.fillWidth: true
WindowDialogSlider {
anchors {
left: parent.left
right: parent.right
leftMargin: 4
rightMargin: 4
}
value: root.brightnessMonitor.brightness
onMoved: root.brightnessMonitor.setBrightness(value)
}
}
WindowDialogSectionHeader {
text: Translation.tr("Gamma")
}
WindowDialogSeparator {
Layout.topMargin: -22
Layout.leftMargin: 0
Layout.rightMargin: 0
}
Column {
id: gammaColumn
Layout.topMargin: -16
Layout.fillWidth: true
Layout.fillHeight: true
WindowDialogSlider {
@@ -155,9 +182,10 @@ WindowDialog {
leftMargin: 4
rightMargin: 4
}
// text: Translation.tr("Brightness")
value: root.brightnessMonitor.brightness
onMoved: root.brightnessMonitor.setBrightness(value)
from: Hyprsunset.gammaLowerLimit / 100
value: Hyprsunset.gamma / 100
onMoved: Hyprsunset.setGamma(value * 100)
tooltipContent: `${Math.round(value * 100)}%`
}
}
@@ -6,10 +6,10 @@ import Quickshell.Io
QuickToggleButton {
id: nightLightButton
toggled: Hyprsunset.active
toggled: Hyprsunset.temperatureActive
buttonIcon: Config.options.light.night.automatic ? "night_sight_auto" : "bedtime"
onClicked: {
Hyprsunset.toggle()
Hyprsunset.toggleTemperature()
}
altAction: () => {
@@ -54,8 +54,8 @@ Item { // Bar content region
height: (root.height - middleSection.height) / 2
width: Appearance.sizes.verticalBarWidth
onScrollDown: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness - 0.05)
onScrollUp: root.brightnessMonitor.setBrightness(root.brightnessMonitor.brightness + 0.05)
onScrollDown: Brightness.decreaseBrightness()
onScrollUp: Brightness.increaseBrightness()
onMovedAway: GlobalStates.osdBrightnessOpen = false
onPressed: event => {
if (event.button === Qt.LeftButton)
@@ -303,7 +303,7 @@ ContentPage {
Config.options.background.widgets.clock.cookie.useSineCookie = checked;
}
StyledToolTip {
text: "Looks a bit softer and more consistent with different number of sides,\nbut has less impressive morphing"
text: Translation.tr("Looks a bit softer and more consistent with different number of sides,\nbut has less impressive morphing")
}
}
@@ -327,7 +327,7 @@ ContentPage {
Config.options.background.widgets.clock.cookie.constantlyRotate = checked;
}
StyledToolTip {
text: "Makes the clock always rotate. This is extremely expensive\n(expect 50% usage on Intel UHD Graphics) and thus impractical."
text: Translation.tr("Makes the clock always rotate. This is extremely expensive\n(expect 50% usage on Intel UHD Graphics) and thus impractical.")
}
}
@@ -345,7 +345,7 @@ ContentPage {
Config.options.background.widgets.clock.cookie.hourMarks = checked;
}
StyledToolTip {
text: "Can only be turned on using the 'Dots' or 'Full' dial style for aesthetic reasons"
text: Translation.tr("Can only be turned on using the 'Dots' or 'Full' dial style for aesthetic reasons")
}
}
@@ -361,7 +361,7 @@ ContentPage {
Config.options.background.widgets.clock.cookie.timeIndicators = checked;
}
StyledToolTip {
text: "Can't be turned on when using 'Numbers' dial style for aesthetic reasons"
text: Translation.tr("Can't be turned on when using 'Numbers' dial style for aesthetic reasons")
}
}
}
@@ -87,9 +87,9 @@ Item {
name: Translation.tr("Enable now")
description: Translation.tr("More comfortable viewing at night")
iconName: WIcons.nightLightIcon
checked: Hyprsunset.active
checked: Hyprsunset.temperatureActive
onCheckedChanged: {
Hyprsunset.toggle(checked);
Hyprsunset.toggleTemperature(checked);
}
}
@@ -71,7 +71,7 @@ Singleton {
property string bluetoothIcon: BluetoothStatus.connected ? "bluetooth-connected" : BluetoothStatus.enabled ? "bluetooth" : "bluetooth-disabled"
property string nightLightIcon: Hyprsunset.active ? "weather-moon" : "weather-moon-off"
property string nightLightIcon: Hyprsunset.temperatureActive ? "weather-moon" : "weather-moon-off"
property string notificationsIcon: Notifications.silent ? "alert-snooze" : "alert"
@@ -40,6 +40,9 @@ apply_kitty() {
for i in "${!colorlist[@]}"; do
sed -i "s/${colorlist[$i]} #/${colorvalues[$i]#\#}/g" "$STATE_DIR"/user/generated/terminal/kitty-theme.conf
done
# Reload
kill -SIGUSR1 $(pidof kitty)
}
apply_anyterm() {
@@ -23,5 +23,27 @@ cursor #$term7 #
foreground #$term7 #
selection_background #$term7 #
selection_foreground #$term0 #
selection_background #$onSecondaryContainer #
selection_foreground #$secondaryContainer #
# Override obscure colors for starship prompt (these are greys at the end)
color255 #$primary #
color254 #$primaryContainer #
color253 #$secondary #
color252 #$secondaryContainer #
color251 #$tertiary #
color250 #$tertiaryContainer #
color249 #$error #
color248 #$errorContainer #
color232 #$onPrimary #
color233 #$onPrimaryContainer #
color234 #$onSecondary #
color235 #$onSecondaryContainer #
color236 #$onTertiary #
color237 #$onTertiaryContainer #
color238 #$onError #
color239 #$onErrorContainer #
color244 #$outline #
color245 #$outlineVariant #
@@ -28,6 +28,12 @@ Singleton {
}
function increaseBrightness(): void {
// if gamma is not yet 100, first increase gamma
if (Hyprsunset.gamma !== 100) {
Hyprsunset.setGamma(Hyprsunset.gamma + 5);
return;
}
const focusedName = Hyprland.focusedMonitor.name;
const monitor = monitors.find(m => focusedName === m.screen.name);
if (monitor)
@@ -37,8 +43,12 @@ Singleton {
function decreaseBrightness(): void {
const focusedName = Hyprland.focusedMonitor.name;
const monitor = monitors.find(m => focusedName === m.screen.name);
if (monitor)
if (monitor && monitor.brightness > 0)
monitor.setBrightness(monitor.brightness - 0.05);
// if brightness is 0, then decrease gamma
else {
Hyprsunset.setGamma(Hyprsunset.gamma - 5);
}
}
reloadableId: "brightness"
@@ -13,13 +13,18 @@ import Quickshell.Hyprland
*/
Singleton {
id: root
signal gammaChangeAttempt()
readonly property real gammaLowerLimit: 25
property string from: Config.options?.light?.night?.from ?? "19:00"
property string to: Config.options?.light?.night?.to ?? "06:30"
property bool automatic: Config.options?.light?.night?.automatic && (Config?.ready ?? true)
property int colorTemperature: Config.options?.light?.night?.colorTemperature ?? 5000
property int gamma: 100
property bool shouldBeOn
property bool firstEvaluation: true
property bool active: false
property bool temperatureActive: false
property int fromHour: Number(from.split(":")[0])
property int fromMinute: Number(from.split(":")[1])
@@ -71,24 +76,52 @@ Singleton {
if (!root.automatic || root.manualActive !== undefined)
return;
if (root.shouldBeOn) {
root.enable();
root.enableTemperature();
} else {
root.disable();
root.disableTemperature();
}
}
function load() { } // Dummy to force init
function enable() {
root.active = true;
// console.log("[Hyprsunset] Enabling");
Quickshell.execDetached(["bash", "-c", `pidof hyprsunset || hyprsunset --temperature ${root.colorTemperature}`]);
function startHyprsunset() {
Quickshell.execDetached(["bash", "-c", `pidof hyprsunset || hyprsunset`]);
}
function disable() {
root.active = false;
function load() {
root.startHyprsunset();
updateHyprsunset.restart();
}
Timer {
id: updateHyprsunset
interval: 100
repeat: false
onTriggered: {
root.ensureState();
root.setGamma(root.gamma);
}
}
function enableTemperature() {
root.temperatureActive = true;
// console.log("[Hyprsunset] Enabling");
root.startHyprsunset();
Quickshell.execDetached(["bash", "-c", `hyprctl hyprsunset temperature ${root.colorTemperature}`]);
}
function disableTemperature() {
root.temperatureActive = false;
// console.log("[Hyprsunset] Disabling");
Quickshell.execDetached(["bash", "-c", `pkill hyprsunset`]);
Quickshell.execDetached(["hyprctl", "hyprsunset", "identity"]);
}
function setGamma(gamma) {
root.gamma = Math.max(root.gammaLowerLimit, Math.min(100, gamma));
root.gammaChangeAttempt();
root.startHyprsunset();
Quickshell.execDetached(["bash", "-c", `hyprctl hyprsunset gamma ${root.gamma}`]);
}
function fetchState() {
@@ -104,26 +137,26 @@ Singleton {
onStreamFinished: {
const output = stateCollector.text.trim();
if (output.length == 0 || output.startsWith("Couldn't"))
root.active = false;
root.temperatureActive = false;
else
root.active = (output != "6500"); // 6500 is the default when off
// console.log("[Hyprsunset] Fetched state:", output, "->", root.active);
root.temperatureActive = (output != "6500"); // 6500 is the default when off
// console.log("[Hyprsunset] Fetched state:", output, "->", root.temperatureActive);
}
}
}
function toggle(active = undefined) {
function toggleTemperature(active = undefined) {
if (root.manualActive === undefined) {
root.manualActive = root.active;
root.manualActive = root.temperatureActive;
root.manualActiveHour = root.clockHour;
root.manualActiveMinute = root.clockMinute;
}
root.manualActive = active !== undefined ? active : !root.manualActive;
if (root.manualActive) {
root.enable();
root.enableTemperature();
} else {
root.disable();
root.disableTemperature();
}
}
@@ -131,9 +164,9 @@ Singleton {
Connections {
target: Config.options.light.night
function onColorTemperatureChanged() {
if (!root.active) return;
if (!root.temperatureActive) return;
Hyprland.dispatch(`hyprctl hyprsunset temperature ${Config.options.light.night.colorTemperature}`);
Quickshell.execDetached(["hyprctl", "hyprsunset", "temperature", `${Config.options.light.night.colorTemperature}`]);
}
}
}
}
@@ -81,6 +81,7 @@
"Unknown function call: %1": "Unknown function call: %1",
"Online | %1's model | Delivers fast, responsive and well-formatted answers. Disadvantages: not very eager to do stuff; might make up unknown function calls": "Online | %1's model | Delivers fast, responsive and well-formatted answers. Disadvantages: not very eager to do stuff; might make up unknown function calls",
"Volume": "Volume",
"Gamma": "Gamma",
"Medium": "Medium",
"Copy code": "Copy code",
"Exceeded max allowed": "Exceeded max allowed",
@@ -359,6 +360,10 @@
"Connect to Wi-Fi": "Connect to Wi-Fi",
"... and %1 more": "... and %1 more",
"Cookie clock settings": "Cookie clock settings",
"Looks a bit softer and more consistent with different number of sides,\nbut has less impressive morphing": "Looks a bit softer and more consistent with different number of sides,\nbut has less impressive morphing",
"Makes the clock always rotate. This is extremely expensive\n(expect 50% usage on Intel UHD Graphics) and thus impractical.": "Makes the clock always rotate. This is extremely expensive\n(expect 50% usage on Intel UHD Graphics) and thus impractical.",
"Can only be turned on using the 'Dots' or 'Full' dial style for aesthetic reasons": "Can only be turned on using the 'Dots' or 'Full' dial style for aesthetic reasons",
"Can't be turned on when using 'Numbers' dial style for aesthetic reasons": "Can't be turned on when using 'Numbers' dial style for aesthetic reasons",
"Brightness and volume": "Brightness and volume",
"Choose file": "Choose file",
"Invalid model. Supported: \n```": "Invalid model. Supported: \n```",
@@ -607,4 +612,4 @@
"Battery full": "Battery full",
"Pin": "Pin",
"Unpin": "Unpin"
}
}
@@ -35,7 +35,7 @@
"Help & Support": "Помощь",
"Bubble": "Пузырчатый",
"Large images | God tier quality, no NSFW.": "Большие изобр. | Отличное качество, без NSFW.",
"Dark": "Тьма",
"Dark": "Тёмный",
"Center clock": "Часы по центру экрана",
"Search, calculate or run": "Поиск, расчёт, запуск",
"Region height": "Высота области",
@@ -47,7 +47,7 @@
"at": "в",
"Math": "Математика",
"Consider plugging in your device": "Подключите зарядку",
"Workspaces shown": "Видимые пространство",
"Workspaces shown": "Видимые пространства",
"Place the corners to trigger at the bottom": "Триггер-углы снизу",
"No API key\nSet it with /key YOUR_API_KEY": "Нет API-ключа\nУстановите: /key ВАШ_КЛЮЧ",
"Auto (System)": "Авто (система)",
@@ -223,7 +223,7 @@
"Networking": "Сеть",
"Tint icons": "Тонировать иконки",
"Low battery": "Низкий заряд",
"Make icons pinned by default": "Показывать все иконки",
"Make icons pinned by default": "Закреплять все иконки",
"Get the next page of results": "Следующая стр. результатов",
"Invalid API provider. Supported: \n-": "Неверный провайдер. Поддерж:\n-",
"Show \"Locked\" text": "Показ. текст «Заблокировано»",
@@ -276,7 +276,7 @@
"Prefixes": "Префиксы",
"Terminal": "Терминала",
"Incorrect password": "Неверный пароль",
"Line-separated": "Без разделения",
"Line-separated": "Разделение по строкам",
"Always": "Всегда",
"☕ Break: %1 minutes": "☕ Перерыв: %1 мин",
"Depends on sidebars": "Зависит от панелей",
@@ -288,7 +288,7 @@
"Base URL": "Базовый URL",
"Float": "Флоат",
"Invalid arguments. Must provide `command`.": "Неверные аргументы. Укажите `command`.",
"Fully charged": "Полностью заряжен",
"Fully charged": "Полностью заряжена",
"Earbang protection": "Защита ушей",
"Low warning": "Увед. о низком %",
"Advanced": "Прочее",
@@ -330,6 +330,10 @@
"Connect to Wi-Fi": "Подкл. к Wi-Fi",
"... and %1 more": "... и ещё %1",
"Cookie clock settings": "Настройки «Cookie»-часов",
"Looks a bit softer and more consistent with different number of sides,\nbut has less impressive morphing": "Выглядит мягче и уместнее с разным количеством углов,\nно сжатие может выглядить менее впечатляюще",
"Makes the clock always rotate. This is extremely expensive\n(expect 50% usage on Intel UHD Graphics) and thus impractical.": "Часы будут постоянно вращаться. Это крайне ресурсозатратно\n(примерно 50% использования Intel UHD Graphics) и фактически бесполезно.",
"Can only be turned on using the 'Dots' or 'Full' dial style for aesthetic reasons": "Может быть активировано только в режимах 'С точками' и 'Полностью залитый' по эстетическим причинам",
"Can't be turned on when using 'Numbers' dial style for aesthetic reasons": "Не может быть включено, когда используется стиль 'С числами' по эстетическим причинам",
"Brightness and volume": "Яркость и громкость",
"Choose file": "Выбор обоев",
"Invalid model. Supported: \n```": "Неверная модель. Поддерживаемые: \n```",
@@ -434,7 +438,7 @@
"Game mode": "Игровой режим",
"Usage: %1save CHAT_NAME": "Исп: %1save ИМЯ_ЧАТА",
"Thin": "Тонкий",
"Light": "Свет",
"Light": "Светлый",
"When not fullscreen": "Не в фулл-скрине",
"Commands, edit configs, search.\nTakes an extra turn to switch to search mode if that's needed": "Команды, редактирование конфигов, поиск.\nПри необходимости переключается в режим поиска",
"Privacy Policy": "Политика конфиденциальности",
@@ -506,7 +510,7 @@
"Could be images or parts of the screen that have some containment.\nMight not always be accurate.\nThis is done with an image processing algorithm run locally and no AI is used.": "Могут быть изображения или части экрана с содержимым.\nМожет быть неточно.\nИспользуется локальный алгоритм обработки изображений, без ИИ.",
"Polling interval (m)": "Интервал опроса (мин)",
"Inactive": "Неактивно",
"Authentication": "Аутентиф.",
"Authentication": "Аутентификация",
"Full warning": "Уведомление о полном заряде при проценте",
"Power Profile": "Профиль питания",
"Content region": "Обл. контента",
@@ -596,7 +600,7 @@
"Battery: %1%2": "Батарея: %1%2",
"Command": "Команда",
"Tooltips": "Подсказки",
"Show hidden icons": "Системный трей",
"Show hidden icons": "Показать скрытые значки",
"Used for headings and titles": "Для заголовков",
"Top-down": "Сверху вниз",
"of %1": "из %1",
@@ -613,7 +617,7 @@
"Overlay: General": "Игровой оверлей",
"Enable opening zoom animation": "Анимация зума при открытии",
"More Internet settings": "Доп. сетевые настройки",
"Nerd font icons": "Иконки Nerd Font (эмодзи)",
"Nerd font icons": "Иконки Nerd Font",
"Display modifiers and keys in multiple keycap (e.g., \"Ctrl + A\" instead of \"Ctrl A\" or \"󰘴 + A\" instead of \"󰘴 A\")": "Показывать модификаторы с разделителем (напр, «Ctrl + A» вместо «Ctrl A»)",
"Change password": "Изменить пароль",
"Check interval (mins)": "Интервал пров. (мин)",
@@ -633,7 +637,7 @@
"Numbers font": "Шрифт чисел",
"Move right": "Переместить вправо",
"Unknown Application": "Неизв. приложение",
"Used for decorative/expressive text": "Для декоротивного / выразительного текста",
"Used for decorative/expressive text": "Для декоративного / выразительного текста",
"Used for reading large blocks of text": "Для чтения больших блоков",
"Type /key to get started with online models\nCtrl+O to expand sidebar\nCtrl+P to pin sidebar\nCtrl+D to detach sidebar": "Введите /key для онлайн-моделей\nCtrl+O - расширить панель\nCtrl+P - закрепить панель\nCtrl+D - открепить панель",
"Health:": "Здоровье:",
@@ -648,7 +652,7 @@
"Pinned": "Закреплено",
"Unpin from Start": "Открепить из пуска",
"Adjust the color temperature": "Цветовая температура",
"Han chars": "Кандзи",
"Han chars": "Иероглифы",
"Show only when locked": "Отображать только при блокировке",
"Widget: Weather": "Виджет погоды",
"Right to left": "Справа налево",
@@ -659,13 +663,13 @@
"Fonts": "Шрифты",
"Left to right": "Слева направо",
"Set FPS limit": "Лимит FPS",
"Draggable": "Drag & drop",
"Draggable": "Перетаскиваемый",
"Turn on from sunset to sunrise": "От заката до рассвета",
"Do you want to allow this app to make changes to your device?": "Разрешить приложению изменять устройство?",
"Balance brightness based on content": "Баланс яркости по содержимому",
"Font width and roundness settings are only available for some fonts like Google Sans Flex": "Ширина и скруглённость - только для нек. шрифтов (напр, Google Sans Flex)",
"Record region": "Запись обл.",
"You can also manually edit cheatsheet.superKey": "Можно вручную отредактировать клавишу в шпаргалке клавиш и в других частях системы",
"You can also manually edit cheatsheet.superKey": "Также вы можете вручную отредактировать cheatsheet.superKey",
"Sign out": "Выйти",
"Overlay: Crosshair": "Оверлей: прицел",
"Shut down": "Выключить",
+21 -18
View File
@@ -7,28 +7,31 @@ add_newline = false
# Cool stuff 󰜥   
# format = """
# $cmd_duration$username$hostname $directory $git_branch
# $character
# """
# $directory $fill $git_branch $cmd_duration
# $character"""
format = """
$cmd_duration 󰜥 $directory $git_branch
$character"""
$cmd_duration $directory$git_branch
$character"""
[fill]
symbol = '-'
style = 'fg:245'
# Replace the "" symbol in the prompt with "➜"
[character] # The name of the module we are configuring is "character"
success_symbol = "[  ](bold fg:blue)"
error_symbol = "[  ](bold fg:red)"
success_symbol = "[ ](bold fg:255)"
error_symbol = "[ ](bold fg:249)"
# Disable the package module, hiding it from the prompt completely
[package]
disabled = true
[git_branch]
style = "bg: cyan"
style = "bg: 252"
symbol = "󰘬"
truncation_length = 12
truncation_symbol = ""
format = "󰜥 [](bold fg:cyan)[$symbol $branch(:$remote_branch)](fg:black bg:cyan)[ ](bold fg:cyan)"
format = " 󰜥 [](bold fg:252)[$symbol $branch(:$remote_branch)](fg:235 bg:252)[ ](bold fg:252)"
[git_commit]
commit_hash_length = 4
@@ -52,7 +55,7 @@ deleted = " 🗑 "
[hostname]
ssh_only = false
format = "[•$hostname](bg:cyan bold fg:black)[](bold fg:cyan)"
format = "[•$hostname](bg:252 bold fg:235)[](bold fg:252)"
trim_at = ".companyname.com"
disabled = false
@@ -71,19 +74,19 @@ format = '🕙[\[ $time \]]($style) '
time_format = "%T"
[username]
style_user = "bold bg:cyan fg:black"
style_user = "bold bg:252 fg:235"
style_root = "red bold"
format = "[](bold fg:cyan)[$user]($style)"
format = "[](bold fg:252)[$user]($style)"
disabled = false
show_always = true
[directory]
home_symbol = "  "
home_symbol = " "
read_only = "  "
style = "bg:green fg:black"
truncation_length = 6
truncation_symbol = " ••/"
format = '[](bold fg:green)[󰉋 $path]($style)[](bold fg:green)'
style = "bg:255 fg:black"
truncation_length = 2
truncation_symbol = ".../"
format = '[](bold fg:255)[󰉋 $path]($style)[](bold fg:255)'
[directory.substitutions]
@@ -97,4 +100,4 @@ format = '[](bold fg:green)[󰉋 $path]($style)[](bold fg:green)'
[cmd_duration]
min_time = 0
format = '[](bold fg:yellow)[󰪢 $duration](bold bg:yellow fg:black)[](bold fg:yellow)'
format = '[](bold fg:252)[󰪢 $duration](bold bg:252 fg:235)[](bold fg:252)'
@@ -9,62 +9,62 @@ DESCRIPTION="Toolkit for building desktop widgets using QtQuick"
HOMEPAGE="https://quickshell.org/"
EGIT_REPO_URI="https://github.com/quickshell-mirror/quickshell.git"
EGIT_COMMIT="6e17efab83d3a5ad5d6e59bc08d26095c6660502"
EGIT_COMMIT="7511545ee20664e3b8b8d3322c0ffe7567c56f7a"
KEYWORDS="~amd64 ~arm64 ~x86"
LICENSE="LGPL-3"
SLOT="0"
# Upstream recommends leaving all build options enabled by default
IUSE="+breakpad +jemalloc +sockets +wayland +layer-shell +session-lock +toplevel-management +screencopy +X +pipewire +tray +mpris +pam +hyprland +hyprland-global-shortcuts +hyprland-focus-grab +i3 +i3-ipc +bluetooth"
IUSE="-breakpad +jemalloc +sockets +wayland +layer-shell +session-lock +toplevel-management +screencopy +X +pipewire +tray +mpris +pam +hyprland +hyprland-global-shortcuts +hyprland-focus-grab -i3 -i3-ipc +bluetooth"
RDEPEND="
dev-qt/qtbase:6
dev-qt/qtsvg:6
dev-qt/qt5compat:6
dev-qt/qtimageformats:6
dev-qt/qtmultimedia:6
dev-qt/qtpositioning:6
dev-qt/qtquicktimeline:6
dev-qt/qtsensors:6
dev-qt/qtsvg:6
dev-qt/qttools:6
dev-qt/qttranslations:6
dev-qt/qtvirtualkeyboard:6
dev-qt/qtwayland:6
dev-qt/qtbase:6=
dev-qt/qtdeclarative:6=
dev-qt/qt5compat:6=
kde-frameworks/kimageformats:6=[avif]
dev-cpp/cpptrace[unwind]
dev-qt/qtimageformats:6=
dev-qt/qtmultimedia:6=
dev-qt/qtpositioning:6=
dev-qt/qtquicktimeline:6=
dev-qt/qtsensors:6=
dev-qt/qtsvg:6=
dev-qt/qttools:6=
dev-qt/qttranslations:6=
dev-qt/qtvirtualkeyboard:6=
dev-qt/qtwayland:6=
kde-apps/kdialog
kde-frameworks/syntax-highlighting:6
kde-frameworks/kirigami
kde-frameworks/syntax-highlighting:6=
kde-frameworks/kirigami:6=
jemalloc? ( dev-libs/jemalloc )
jemalloc? ( dev-libs/jemalloc:= )
wayland? (
dev-libs/wayland
dev-qt/qtwayland:6
dev-qt/qtwayland:6=
)
screencopy? (
x11-libs/libdrm
media-libs/mesa
)
X? ( x11-libs/libxcb )
pipewire? ( media-video/pipewire )
mpris? ( dev-qt/qtdbus )
X? ( x11-libs/libxcb:= )
pipewire? ( media-video/pipewire:= )
mpris? ( dev-qt/qtdbus:= )
pam? ( sys-libs/pam )
bluetooth? ( net-wireless/bluez )
"
DEPEND="${RDEPEND}"
BDEPEND="
|| ( >=sys-devel/gcc-14:* >=llvm-core/clang-17:* )
dev-cpp/cli11
dev-build/cmake
dev-vcs/git
dev-build/ninja
dev-qt/qtshadertools
dev-util/spirv-tools
dev-qt/qtshadertools:6
wayland? (
dev-util/wayland-scanner
dev-libs/wayland-protocols
)
dev-cpp/cli11
dev-build/ninja
dev-build/cmake
dev-vcs/git
virtual/pkgconfig
breakpad? ( dev-util/breakpad )
dev-util/vulkan-headers
@@ -74,7 +74,7 @@ src_configure(){
mycmakeargs=(
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DDISTRIBUTOR="Gentoo Illogical-Impulses"
-DINSTALL_QML_PREFIX="lib64/qt6/qml"
-DINSTALL_QML_PREFIX="$(get_libdir)/qt6/qml"
-DCRASH_REPORTER=$(usex breakpad ON OFF)
-DUSE_JEMALLOC=$(usex jemalloc ON OFF)
-DSOCKETS=$(usex sockets ON OFF)
@@ -18,7 +18,7 @@ RDEPEND="
gui-apps/hypridle
gui-apps/hyprlock
gui-apps/hyprpicker
app-misc/songrec
media-sound/songrec
app-i18n/translate-shell
gui-apps/wlogout
sci-libs/libqalculate
-3
View File
@@ -19,6 +19,3 @@ import_ebuild "${FT_DIR}" "media-fonts" "rubik-vf"
import_ebuild "${FT_DIR}" "media-fonts" "space-grotesk"
import_ebuild "${FT_DIR}" "kde-plasma" "breeze-plus"
import_ebuild "${FT_DIR}" "x11-themes" "darkly"
############### WIDGETS
import_ebuild "${WIDGETS_DIR}" "app-misc" "songrec"
+2 -1
View File
@@ -52,7 +52,6 @@ v sudo sh -c 'cat ./sdata/dist-gentoo/additional-useflags >> /etc/portage/packag
v sudo emerge --sync
v sudo emerge --quiet --newuse --update --deep @world
v sudo emerge --quiet @smart-live-rebuild
v sudo emerge --depclean
# Remove old ebuilds (if this isn't done the wildcard will fuck upon a version change)
x sudo rm -fr ${ebuild_dir}/app-misc/illogical-impulse-*
@@ -66,3 +65,5 @@ for i in "${metapkgs[@]}"; do
v sudo ebuild ${ebuild_dir}/app-misc/${i}/*.ebuild digest
v sudo emerge --update --quiet app-misc/${i}
done
v sudo emerge --depclean
+3 -2
View File
@@ -28,7 +28,6 @@ gui-libs/hyprcursor
gui-apps/wf-recorder
gui-apps/wtype
gui-apps/fuzzel
gui-apps/quickshell **
gui-apps/wlogout
dev-cpp/sdbus-c++
dev-libs/hyprland-protocols
@@ -52,5 +51,7 @@ media-fonts/space-grotesk
media-fonts/material-symbols-variable **
media-fonts/readex-pro
media-fonts/rubik-vf
app-misc/songrec
media-sound/songrec
dev-cpp/glaze
dev-cpp/cpptrace
dev-libs/libdwarf
@@ -1,48 +0,0 @@
# Copyright 2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
DESCRIPTION="Illogicall Impulse Widget Dependencies"
HOMEPAGE=""
SRC_URI="https://github.com/marin-m/SongRec/archive/${PV}.tar.gz -> ${P}-SongRec.tar.gz"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~x86"
# need for cargo fetch, idk how to get around it if possible
RESTRICT="strip network-sandbox"
DEPEND=""
RDEPEND=""
S="${WORKDIR}/SongRec-${PV}"
src_prepare() {
default
export CARGO_HOME="${WORKDIR}/cargo"
cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')"
}
src_compile() {
export CARGO_HOME="${WORKDIR}/cargo"
cargo build --release --frozen --offline
}
src_install() {
dobin target/release/songrec
insinto /usr/share/applications
doins packaging/rootfs/usr/share/applications/com.github.marinm.songrec.desktop
insinto /usr/share/icons/hicolor/scalable/apps
doins packaging/rootfs/usr/share/icons/hicolor/scalable/apps/com.github.marinm.songrec.svg
insinto /usr/share/metainfo
doins packaging/rootfs/usr/share/metainfo/com.github.marinm.songrec.metainfo.xml
insinto /usr/share/songrec/translations
doins -r translations/*
dodoc README.md
}
+3 -1
View File
@@ -111,7 +111,9 @@ sys-power/upower introspection
gui-apps/fuzzel png svg
dev-libs/glib dbus elf introspection mime xattr
# ngl idk about nm-connection-editor. Works fine without
gui-apps/quickshell -X -i3 -i3-ipc breakpad bluetooth hyprland hyprland-focus-grab hyprland-global-shortcuts jemalloc layer-shell mpris pam pipewire screencopy session-lock sockets toplevel-management tray wayland
#app-i18n/translate-shell (nothing needed)
#gui-apps/wlogout (no use flags)
media-gfx/imagemagick xml
################### OTHER ###################
dev-cpp/cpptrace unwind