Compare commits

..
4 Commits
Author SHA1 Message Date
mischbeck 01e4dcccd0 adds missing hyprland config file 2026-08-29 12:02:37 +02:00
mischbeck 2074f92244 adds wallpaper info to quickshell readme 2026-08-21 00:08:52 +02:00
mischbeck 89af518e7d adds files & wallpaper switcher toolbar 2026-08-21 00:02:49 +02:00
mischbeck 0a03db8fe6 fixes hyprland groups 2026-08-20 23:44:01 +02:00
13 changed files with 451 additions and 5 deletions
+8
View File
@@ -0,0 +1,8 @@
{
"workspace": {
"library": ["/usr/share/hypr/stubs"]
},
"diagnostics": {
"globals": ["hl"]
}
}
+3 -3
View File
@@ -30,12 +30,12 @@ hl.config({
["col.border_locked_inactive"] = color0,
groupbar = {
font_size = 12,
height = 16,
height = 1,
indicator_height = 16,
rounding = 3,
rounding = 5,
font_family = "Roboto Sans",
text_color = background,
text_offset = -16,
text_offset = -10,
font_weight_active = "bold",
font_weight_inactive = "normal",
["col.active"] = color4,
+15
View File
@@ -0,0 +1,15 @@
-- ┌──────────────────────────────────────────────────────────────┐
-- │ hyprland.lua — entry point (0.55+) │
-- └──────────────────────────────────────────────────────────────┘
-- Each require() is a separate Lua scope: errors in one file won't
-- kill the others. Keep this file lean — just source the modules.
require("config.colors") -- color variables (sourced first)
require("config.variables") -- general, decoration, animations…
require("config.monitors") -- monitor layout + workspace pinning
monitors = require("config.monitors")
require("config.input") -- keyboard / mouse / device config
require("config.keybinds") -- all hl.bind() calls
require("config.windowrules") -- hl.window_rule() calls
require("config.autostart") -- exec-once equivalents
require("config.workspaces") -- workspace configuration
+63
View File
@@ -0,0 +1,63 @@
// Bar.qml - top panel
import Quickshell
import Quickshell.Wayland
import QtQuick
import QtQuick.Layouts
import "./modules"
PanelWindow {
id: root
WlrLayershell.namespace: "quickshell-bar"
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
anchors {
top: true
left: true
right: true
}
margins {
left: 0
right: 0
bottom: 0
top: 0
}
function setColorAlpha(color, alpha) {
return Qt.hsla(color.hslHue, color.hslSaturation, color.hslLightness, alpha)
}
implicitHeight: Theme.barHeight + Theme.barPadding * 2
exclusiveZone: Theme.barHeight + Theme.barPadding * 2
color: setColorAlpha(Theme.background, 0)
RowLayout {
anchors.fill: parent
anchors.leftMargin: Theme.barPadding
anchors.topMargin: Theme.barPadding
anchors.bottomMargin: Theme.barPadding
anchors.rightMargin: Theme.barPadding
spacing: Theme.spacing
// ─── LEFT ──────────────────────────────────────────
SysTrayWidget { parentWindow: root }
ClockWidget {}
WeatherWidget {}
WorkspacesWidget { screen: root.screen }
WindowTitleWidget { screen: root.screen }
Item { Layout.fillWidth: true }
// ─── RIGHT ─────────────────────────────────────────
MediaCavaWidget {}
MemoryWidget {}
CpuWidget {}
TemperatureWidget {}
BatteryWidget {}
//BluetoothWidget {}
PowerProfilesWidget {}
PowerMenuWidget {}
}
}
+27
View File
@@ -0,0 +1,27 @@
// colors.qml - Generated by wallust
pragma Singleton
import Quickshell
import QtQuick
Singleton {
readonly property color background: "#0E0E14"
readonly property color foreground: "#B6B6BC"
readonly property color cursor: "#769BBF"
readonly property color color0: "#3A453E"
readonly property color color1: "#6A6C52"
readonly property color color2: "#42617B"
readonly property color color3: "#744246"
readonly property color color4: "#638D4F"
readonly property color color5: "#C26E26"
readonly property color color6: "#4380BA"
readonly property color color7: "#8E8E98"
readonly property color color8: "#64636A"
readonly property color color9: "#6A6C52"
readonly property color color10: "#42617B"
readonly property color color11: "#744246"
readonly property color color12: "#638D4F"
readonly property color color13: "#C26E26"
readonly property color color14: "#4380BA"
readonly property color color15: "#8E8E98"
}
+23
View File
@@ -0,0 +1,23 @@
// Exec.qml - process launcher
// Usage from any file: Exec.run(["kitty", "-e", "btop"])
pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
function run(cmd) {
const proc = procPool.createObject(root, { command: cmd });
proc.running = true;
}
Component {
id: procPool
Process {
running: false
onExited: destroy()
}
}
}
+23
View File
@@ -0,0 +1,23 @@
// GlobalStates.qml - a place to store global state variables accessible from any QML file.
pragma Singleton
import Quickshell
import QtQuick
Singleton {
id: root
// Used by the merged overview module (own/modules/overview) — see own/modules/overview/CREDITS.md
property bool overviewOpen: false
readonly property QtObject popups: QtObject {
property string active: ""
property real anchorX: 0
function open(name, ax) { popups.anchorX = ax ?? 0; popups.active = name }
function close() { popups.active = "" }
function toggle(name, ax) {
if (popups.active === name) { popups.active = "" }
else { popups.anchorX = ax ?? 0; popups.active = name }
}
}
}
+39
View File
@@ -0,0 +1,39 @@
// Pill.qml - styled module container
import QtQuick
import QtQuick.Layouts
Rectangle {
id: root
default property alias content: inner.data
property bool hovered: mouseArea.containsMouse
signal clicked(var mouse)
signal scrolled(var wheel)
property real leftPadding: Theme.pillPadH
property real rightPadding: Theme.pillPadH
implicitWidth: inner.implicitWidth + leftPadding + rightPadding
implicitHeight: Theme.barHeight
radius: Theme.radius
color: hovered ? Theme.pillHover : Theme.pill
Behavior on color { ColorAnimation { duration: 150 } }
RowLayout {
id: inner
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: root.leftPadding
spacing: 4
}
MouseArea {
id: mouseArea
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onClicked: (m) => root.clicked(m)
onWheel: (w) => root.scrolled(w)
}
}
+109
View File
@@ -0,0 +1,109 @@
// Popup.qml - a reusable popup component for Quickshell.
import Quickshell
import Quickshell.Wayland
import QtQuick
PanelWindow {
id: root
required property var screen
required property string popupName
property int rightMargin: 10
property int topMargin: 1
property int autoHideDelay: Theme.popupAutoHideDelay
default property alias content: contentItem.data
// ── Visibility ────────────────────────────────────────────
property bool logicalOpen: GlobalStates.popups.active === popupName
property bool _keepVisible: false
visible: logicalOpen || _keepVisible
onLogicalOpenChanged: {
if (logicalOpen) {
closeTimer.stop()
_keepVisible = false
openY.start()
openOpacity.start()
} else {
hideTimer.stop()
_keepVisible = true
closeY.start()
closeOpacity.start()
closeTimer.restart()
}
}
// Keeps the Overlay window alive for the duration of the close animation
Timer {
id: closeTimer
interval: 280
onTriggered: root._keepVisible = false
}
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.namespace: "quickshell-popup-" + popupName
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
anchors { top: true; left: true; right: true; bottom: true }
color: Qt.rgba(0, 0, 0, 0)
Timer {
id: hideTimer
interval: root.autoHideDelay
repeat: false
onTriggered: GlobalStates.popups.close()
}
MouseArea {
anchors.fill: parent
onClicked: GlobalStates.popups.close()
}
// ── Slide animations ──────────────────────────────────────
NumberAnimation { id: openY; target: box; property: "y"; to: root.topMargin; duration: 250; easing.type: Easing.OutCubic }
NumberAnimation { id: closeY; target: box; property: "y"; to: root.topMargin - 200; duration: 200; easing.type: Easing.InCubic }
NumberAnimation { id: openOpacity; target: box; property: "opacity"; to: Theme.popupOpacity; duration: 200 }
NumberAnimation { id: closeOpacity;target: box; property: "opacity"; to: 0.0; duration: 200 }
// ── Popup box ─────────────────────────────────────────────
Rectangle {
id: box
x: {
var ax = GlobalStates.popups.anchorX
var centered = ax > 0 ? ax - width / 2 : parent.width - width - root.rightMargin
return Math.max(4, Math.min(parent.width - width - 4, centered))
}
// Initial state: closed (above the bar, transparent)
y: root.topMargin - 40
opacity: 0.0
width: contentItem.implicitWidth + 10
height: contentItem.implicitHeight + 10
color: Theme.popupBackground
radius: Theme.radius * 2
border.color: Theme.popupBorderColor
border.width: Theme.popupBorderWidth
// Absorb clicks so the outer close-on-click doesn't fire inside the box
MouseArea { anchors.fill: parent }
// HoverHandler doesn't lose hover when a child MouseArea grabs a press,
// so clicking buttons won't accidentally start the hide timer.
HoverHandler {
onHoveredChanged: hovered ? hideTimer.stop() : hideTimer.start()
}
Item {
id: contentItem
x: 5; y: 5
implicitWidth: childrenRect.width
implicitHeight: childrenRect.height
}
}
}
+9
View File
@@ -0,0 +1,9 @@
Wallpaper switcher: echo 1 > /tmp/qs-wallpaper-ipc
In Hyprland: ctrl t
Workspace overview: qs ipc -c own call overview toggle
Merged from Shanu-Kumawat/quickshell-overview (originally extracted from
end-4/dots-hyprland). See modules/overview/CREDITS.md for details and
the untouched upstream clone at ../overview.
Wallpaper switcher trigger from Hyprland keybind: echo 1 > /tmp/qs-wallpaper-ipc
+60
View File
@@ -0,0 +1,60 @@
// Theme.qml - global palette & dimensions
// QuickShell auto-discovers this; access from any file as `Theme.colorN` etc.
pragma Singleton
import Quickshell
import QtQuick
Singleton {
function setColorAlpha(color, alpha) {
return Qt.hsla(color.hslHue, color.hslSaturation, color.hslLightness, alpha)
}
// ── Wallust palette ──────────────────────────────────────
readonly property color background: Colors.foreground
readonly property color foreground: Colors.background
readonly property color color0: Colors.color0
readonly property color color1: Colors.color1
readonly property color color2: Colors.color2
readonly property color color3: Colors.color3
readonly property color color4: Colors.color4
readonly property color color5: Colors.color5
readonly property color color6: Colors.color6
readonly property color color7: Colors.color7
readonly property color color8: Colors.color8
// ── Derived / semantic ────────────────────────────────────
readonly property color pill: setColorAlpha(Colors.background, 0.8)
readonly property color pillText: setColorAlpha(Colors.foreground, 1)
readonly property color pillHover: color2
readonly property color wsActive: color3
readonly property color wsUrgent: color1
// ── Typography ────────────────────────────────────────────
readonly property string fontSans: "Fira Sans Condensed"
readonly property string fontMono: "FiraCode Nerd Font"
readonly property int fontSize: 11
readonly property int fontSizeSecondary: 10
// ── Bar geometry ─────────────────────────────────────────
readonly property int barHeight: 24
readonly property int barPadding: 2
readonly property int radius: 5
readonly property int pillPadH: 10
readonly property int spacing: 4
// ── Popup ───────────────────────────────────────────────
readonly property color popupBackground: setColorAlpha(Colors.background, 0.75)
readonly property int popupBorderWidth: 0
readonly property color popupBorderColor: setColorAlpha(Colors.foreground, 0.1)
readonly property int popupPadding: 10
readonly property double popupOpacity: 0.7
// ── Animations ───────────────────────────────────────────
readonly property int cavaDissapearTime: 500
readonly property int workspaceSlideTime: 250
readonly property int popupAutoHideDelay: 500
// ── Other constants ───────────────────────────────────────
readonly property int titleLength: 75
}
@@ -1,5 +1,6 @@
// WallpaperPopup.qml - A popup for browsing and setting wallpapers from /usr/share/wallpapers
import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
@@ -116,9 +117,15 @@ PanelWindow {
GridView {
id: grid
anchors { fill: parent; margins: 8 }
anchors {
fill: parent
leftMargin: 8
topMargin: 8
rightMargin: 8
bottomMargin: 8
}
clip: true
cellWidth: Math.floor(width / 2)
cellWidth: Math.floor((width - 12) / 2)
cellHeight: 104
focus: true
keyNavigationEnabled: true
@@ -136,6 +143,30 @@ PanelWindow {
model: wallpaperModel
ScrollBar.vertical: ScrollBar {
policy: ScrollBar.AsNeeded
width: 12
anchors {
rightMargin: 0
topMargin: 4
bottomMargin: 4
}
background: Rectangle {
implicitWidth: 12
radius: 6
color: Theme.accent ?? Theme.pillText
opacity: 0.1
}
contentItem: Rectangle {
implicitWidth: 6
radius: 3
color: Theme.accent ?? Theme.pillText
opacity: parent.pressed ? 1.0 : 0.7
}
}
highlight: Rectangle {
z: 2
radius: Theme.radius + 1
+39
View File
@@ -0,0 +1,39 @@
// shell.qml - entry point
//@ pragma UseQApplication
import Quickshell
import "./modules"
import "./modules/overview"
ShellRoot {
Variants {
model: Quickshell.screens
Bar {
required property var modelData
screen: modelData
}
}
Variants {
model: Quickshell.screens
PowerMenuPopup {
required property var modelData
screen: modelData
}
}
Variants {
model: Quickshell.screens
MediaPopup {
required property var modelData
screen: modelData
}
}
WallpaperPopup {
screen: Quickshell.screens[0]
}
// Workspace overview (SUPER+TAB-style popup) — merged from ./overview,
// see modules/overview/CREDITS.md for attribution.
Overview {}
}