all repos — quickshell @ 4ed0758c7fa6305a3e9487b82bf7b96a64e79efb

A desert-witch desktop shell

meow
trickyni trickyniv56@gmail.com
Sat, 30 Aug 2025 12:10:02 +0300
commit

4ed0758c7fa6305a3e9487b82bf7b96a64e79efb

A Resources.qml

@@ -0,0 +1,41 @@

+pragma Singleton +import QtQuick +import Quickshell +import Quickshell.Io + + +Singleton { + id: root + property var palette: { + "fg": "#afd2e9", + "bg": "#3b3228", + "bg95": "#43392d", + "bg75": "#4c4134", + "altbg": "#5d4f40", + "bg25": "#6b6055", + "sand": "#c1a387", + "scarlet": "#e86045", + "moss": "#92a650", + "celadon": "#ace1af", + "orange": "#e68d53", + "saffron": "#f8e2a0", + "cyan": "#3eccbe", + "grey": "#868686" + } + property var fontsize: { + "topbar_text": 12, + "bottombar_text": 8, + "topbar_icon": 16 + } + property var icons: { + "sunset": "󰖚", + "volume": "", + "volume_mixer": "", + "download": "", + "ram": "󰍛", + "tasklist": "", + "battery": "", + "headphones": "" + } +} +
A TODO.txt

@@ -0,0 +1,32 @@

+First: + workspaces + - animations + - buttons: + - - background + - - clickability + volume + - mute indicator + - icons/colors change + - click to mute/unmute? + Battery + - headset battery + - laptop battery + - support for new batteries on the fly + +Second: + sunset timer + taskwarrior + ram + network + resize indicator + +low priority: + moon + zen mode + +expansion: + notification + app launcher + bluetooth launcher + +Fix proggyfont
A bar/Bar.qml

@@ -0,0 +1,24 @@

+// Bar.qml +import Quickshell +import QtQuick +import QtQuick.Layouts +import ".." +import "modules" as Module + +Scope { + TopBar { + TopbarLeft { + Module.Timedate {} + Module.Sunset {} + Module.Volume {} + Module.MegaPlaceholder {} + } + Module.Workspaces {} + } + BottomBar { + BottombarLeft { + Module.HeadphonesBattery{} + } + } +} +
A bar/BottomBar.qml

@@ -0,0 +1,20 @@

+// BottomBar.qml +import Quickshell +import QtQuick +import QtQuick.Layouts +import ".." + +PanelWindow { + id: bottom_bar + anchors { + bottom: true + left: true + right: true + } + margins { + left: 8 + right:8 + } + implicitHeight: 8 + color: Resources.palette.bg +}
A bar/BottombarLeft.qml

@@ -0,0 +1,15 @@

+//BottombarLeft.qml +import Quickshell +import QtQuick +import QtQuick.Layouts +import ".." + +RowLayout { + id: bottom_left + spacing: 2 + layoutDirection: Qt.RightToLeft + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + } +}
A bar/TopBar.qml

@@ -0,0 +1,20 @@

+// TopBar.qml +import Quickshell +import QtQuick +import QtQuick.Layouts +import ".." + +PanelWindow { + id: top_bar + anchors { + top: true + left: true + right: true + } + margins { + left: 8 + right:8 + } + implicitHeight: 24 + color: Resources.palette.bg +}
A bar/TopbarLeft.qml

@@ -0,0 +1,16 @@

+//TopbarLeft.qml +import Quickshell +import QtQuick +import QtQuick.Layouts +import ".." + + +RowLayout { + id: topbar_left + spacing: 2 + layoutDirection: Qt.RightToLeft + anchors { + right: parent.right + verticalCenter: parent.verticalCenter + } +}
A bar/classes/BottombarText.qml

@@ -0,0 +1,11 @@

+//BottombarText.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import ".." +import "../.." + +Text { + font.pixelSize: Resources.fontsize.bottombar_text + color: Resources.palette.fg +}
A bar/classes/TopSep.qml

@@ -0,0 +1,11 @@

+//TopSep.qml +import QtQuick +import Quickshell +import ".." +import "../.." + +TopbarText { + id: separator + text: "|" + color: Resources.palette.sand +}
A bar/classes/TopbarIcon.qml

@@ -0,0 +1,12 @@

+//TopbarIcon.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import ".." +import "../.." + +Text { + font.pixelSize: Resources.fontsize.topbar_icon + color: Resources.palette.orange + font.family: font_icon.name +}
A bar/classes/TopbarText.qml

@@ -0,0 +1,11 @@

+//TopbarText.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import ".." +import "../.." + +Text { + font.pixelSize: Resources.fontsize.topbar_text + color: Resources.palette.fg +}
A bar/modules/HeadphonesBattery.qml

@@ -0,0 +1,19 @@

+//HeadphonesBattery.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import Quickshell.Services.UPower +import ".." +import "../classes" as Class + + +RowLayout { + id: headphones_battery + property var jotm: "/org/freedesktop/UPower/devices/headset_dev_AC_80_0A_2E_C9_07" + spacing: 2 + layoutDirection: Qt.RightToLeft + Class.BottombarText { + // text: UPower.devices["jotm"].percentage + "%" + text:"placeholder!" + } +}
A bar/modules/LaptopBattery.qml

@@ -0,0 +1,16 @@

+//LaptopBattery.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import Quickshell.Services.UPower +import ".." +import "../classes" as Class + +RowLayout { + id: laptop_battery + spacing:2 + layoutDirection: Qt.RightToLeft + Class.BottombarText { + text: UPower.displayBattery.percentage + "%" + } +}
A bar/modules/MegaPlaceholder.qml

@@ -0,0 +1,40 @@

+// MegaPlaceholder.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import "../../" +import "../classes" as Class + +RowLayout { + spacing: 2 + layoutDirection: Qt.RightToLeft + Class.TopbarIcon { + text: "" + color: Resources.palette.grey + } + Class.TopSep{ + color: Resources.palette.grey + } + Class.TopbarText { + text: " 20%" + color: Resources.palette.grey + } + Class.TopbarIcon { + text: Resources.icons.ram + color: Resources.palette.grey + } + Class.TopSep{ + color: Resources.palette.grey + } + Class.TopbarText { + text: "do all the things" + color: Resources.palette.grey + } + Class.TopbarIcon { + text: Resources.icons.tasklist + color: Resources.palette.grey + } + Class.TopSep{ + color: Resources.palette.grey + } +}
A bar/modules/Ram.qml

@@ -0,0 +1,7 @@

+// Ram.qml +import QtQuick +import Quickshell +import Quickshell.Io +import QtQuick.Layouts +import "../../" +import "../classes" as Class
A bar/modules/Sunset.qml

@@ -0,0 +1,41 @@

+// Timedate.qml +import QtQuick +import Quickshell +import Quickshell.Io +import QtQuick.Layouts +import "../../" +import "../classes" as Class +// import "../scripts/suntime.sh" as Sunset + +RowLayout { + spacing: 2 + layoutDirection: Qt.RightToLeft + + Class.TopbarText { + id: sunset + color: Resources.palette.scarlet + + Process { + id: sunset_script + command: ["sh","suntime.sh"] + running: true + stdout: StdioCollector { + // onStreamFinished: sunset.text = this.text + onStreamFinished: sunset.text = this.text + } + } + + Timer { + interval: 1000 + running: true + repeat: true + onTriggered: sunset_script.running = true + } + } + Class.TopbarIcon { + text: Resources.icons.sunset + color: Resources.palette.scarlet + } + Class.TopSep { + } +}
A bar/modules/Timedate.qml

@@ -0,0 +1,26 @@

+// Timedate.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import ".." +import "../classes" as Class + +RowLayout { + id: timedate + spacing: 2 + layoutDirection: Qt.RightToLeft + Class.TopbarText { + id: time + text: Qt.formatDateTime(clock.date, "hh:mm") + } + Class.TopSep {} + Class.TopbarText { + id: date + text: Qt.formatDateTime(clock.date, "MMM dd") + } + Class.TopSep {} + SystemClock { + id: clock + precision: SystemClock.Seconds + } +}
A bar/modules/Volume.qml

@@ -0,0 +1,27 @@

+// Volume.qml +import QtQuick +import Quickshell +import QtQuick.Layouts +import Quickshell.Services.Pipewire +import "../classes" as Class +import "../../" + +RowLayout { + id: volume + spacing:2 + layoutDirection: Qt.RightToLeft + Layout.alignment: Qt.AlignVCenter + PwObjectTracker { + objects: [ Pipewire.defaultAudioSink ] + } + Class.TopbarText { + id: vol_indicator + text: Math.round((Pipewire.defaultAudioSink?.audio.volume ?? 0) * 100) + "%" + } + Class.TopbarIcon { + id: vol_icon + text: Resources.icons.volume //TODO make icon change based on volume levels + rightPadding: 4 + } + Class.TopSep {} +}
A bar/modules/Workspaces.qml

@@ -0,0 +1,25 @@

+import Quickshell +import QtQuick +import Quickshell.I3 +import QtQuick.Controls.Basic +import QtQuick.Layouts +import "../classes" as Class +import "../../" +RowLayout { + spacing: 8 + id: workspaces + Layout.alignment: Qt.alignVCenter | Qt.alignLeft + // anchors.left: parent.left + // anchors.verticalCenter: parent.verticalCenter + property var ws_list: I3.workspaces.values + property var ws_focused: I3.focusedWorkspace?.number + Repeater { + model: parent.ws_list + Text { + id: wsLabel + text: (modelData.name == "12") ? Resources.icons.volume_mixer : (modelData.name == "11") ? Resources.icons.download : modelData.name + color: (modelData.name == ws_focused) ? Resources.palette.orange : Resources.palette.fg + } + } +} +
A bar/scripts/moon.sh

@@ -0,0 +1,4 @@

+#!/usr/bin/env bash +moon-phases -t + +# cargo install moon-phases
A bar/scripts/suntime.sh

@@ -0,0 +1,23 @@

+#! /bin/sh +if [ ! -e '~/.location' ]; then + coordinates=$(cat ~/.location) +else + echo "<~/.location> file not found. please create one with coordinates in a <XX.XXXXXN XX.XXXXXXXE> format" >&2 + exit 1 +fi + +if [ "$(sunwait poll $coordinates)" == DAY ]; then + sun=$(sunwait list set $coordinates civil) + now=$(date '+%H:%M') + output=$(qalc -t $sun - $now to time) + echo "+"$output +else + exit 1 +fi + + +#echo $(sunwait list set $(cat ~/.location) civil)":00" + + +# coordinates=$(curl -s ipinfo.io | grep loc | cut -d ' ' -f 4 | sed 's/",/E/g' | sed 's/,/N /g' | sed 's/"//g') +# coordinates= xx.xxxN xx.xxxE
A shell.qml

@@ -0,0 +1,18 @@

+//@ pragma Env QT_QPA_PLATFORM=wayland +import Quickshell +import Quickshell.Io +import QtQuick +import ".." +import "bar" + +Scope { + FontLoader { + id: font_proggy + source: "fonts/ProggyCleanSZNerdFontMono-Regular.ttf" + } + FontLoader { + id: font_icon + source: "fonts/SymbolsNerdFontMono-Regular.ttf" + } + Bar {} +}