This commit is contained in:
Bloxx12 2025-06-24 15:51:34 +02:00
commit 334bca71fe
Signed by: faukah
SSH key fingerprint: SHA256:Uj2AXqvtdCA4hn5Hq0ZonhIAyUqI1q4w2sMG3Z1TH7E
17 changed files with 733 additions and 117 deletions

View file

@ -7,6 +7,8 @@ import Quickshell.Io
import Quickshell.Wayland import Quickshell.Wayland
import Quickshell.Widgets import Quickshell.Widgets
import "./config"
Singleton { Singleton {
id: launcher id: launcher
property bool launcherOpen: false property bool launcherOpen: false
@ -32,11 +34,10 @@ Singleton {
activeAsync: launcher.launcherOpen activeAsync: launcher.launcherOpen
PanelWindow { PanelWindow {
width: 450 implicitWidth: 450
height: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10 implicitHeight: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10
color: "transparent" color: "transparent"
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
WlrLayershell.namespace: "shell:launcher"
Rectangle { Rectangle {
@ -48,9 +49,9 @@ Singleton {
} }
} }
width: 450 width: 450
color: "#30c0afaf" color: Config.catppuccin.base
radius: 5 radius: 5
border.color: "black" border.color: Config.catppuccin.mantle
border.width: 2 border.width: 2
ColumnLayout { ColumnLayout {
@ -63,24 +64,20 @@ Singleton {
id: searchContainer id: searchContainer
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: searchbox.implicitHeight + 10 implicitHeight: searchbox.implicitHeight + 10
color: "#30c0ffff" color: Config.catppuccin.base
radius: 3 radius: 3
border.color: "#50ffffff" border.color: Config.catppuccin.mantle
RowLayout { RowLayout {
id: searchbox id: searchbox
anchors.fill: parent anchors.fill: parent
anchors.margins: 5 anchors.margins: 5
IconImage {
implicitSize: parent.height
source: "root:icons/magnifying-glass.svg"
}
TextInput { TextInput {
id: search id: search
Layout.fillWidth: true Layout.fillWidth: true
color: "black" color: Config.catppuccin.text
font.pointSize: 13
focus: true focus: true
Keys.forwardTo: [list] Keys.forwardTo: [list]
@ -254,9 +251,9 @@ Singleton {
highlight: Rectangle { highlight: Rectangle {
radius: 5 radius: 5
color: "#20e0ffff" color: "transparent"
border.color: "#30ffffff" border.color: Config.catppuccin.lavender
border.width: 1 border.width: 2
} }
keyNavigationEnabled: true keyNavigationEnabled: true
keyNavigationWraps: true keyNavigationWraps: true
@ -296,8 +293,9 @@ Singleton {
} }
Text { Text {
text: modelData.name text: modelData.name
color: "black" color: Config.catppuccin.text
font.family: "ComicShannsMono Nerd Font Mono" font.family: "JetBrainsMono Nerd Font Mono"
font.pointSize: 13
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
} }
} }

View file

@ -0,0 +1,85 @@
===== Build Information =====
Git Revision: 95d0af8113394b1fdb71c94ac5160c83b8b829cb
Buildtime Qt Version: 6.9.0
Build Type: RelWithDebInfo
Compiler: Clang (19.1.7)
Complie Flags:
Build configuration:
Distributor: Official-Nix-Flake
Distributor provided debuginfo: TRUE
Disable precompild headers (dev): OFF
Build tests (dev): OFF
ASAN (dev): OFF
Keep Frame Pointers (dev): OFF
Crash Handling: TRUE
Use jemalloc: TRUE
Unix Sockets: ON
Wayland: TRUE
Wlroots Layer-Shell: ON
Session Lock: ON
Foreign Toplevel Management: ON
Hyprland: TRUE
Hyprland IPC: ON
Hyprland Global Shortcuts: ON
Hyprland Focus Grabbing: ON
Hyprland Surface Extensions: ON
Screencopy: TRUE
Image Copy Capture: ON
Wlroots Screencopy: ON
Hyprland Toplevel Export: ON
X11: ON
I3/Sway: TRUE
I3/Sway IPC: ON
System Tray: ON
PipeWire: TRUE
Mpris: ON
Pam: TRUE
Greetd: ON
UPower: ON
Notifications: ON
===== Runtime Information =====
Runtime Qt Version: 6.9.0
Crashed process ID: 934130
Run ID: cysjzw2dys
Shell ID: 3d5bdcfe44ead3996569d85a1bee5ccd
Config Path: /home/cr/.config/quickshell/shell.qml
===== Report Integrity =====
Minidump save status: 0
Log save status: 0
Binary copy status: 0
===== System Information =====
/etc/os-release:
ANSI_COLOR="0;38;2;126;186;228"
BUG_REPORT_URL="https://github.com/NixOS/nixpkgs/issues"
BUILD_ID="25.11.20250617.9e83b64"
CPE_NAME="cpe:/o:nixos:nixos:25.11"
DEFAULT_HOSTNAME=nixos
DOCUMENTATION_URL="https://nixos.org/learn.html"
HOME_URL="https://nixos.org/"
ID=nixos
ID_LIKE=""
IMAGE_ID=""
IMAGE_VERSION=""
LOGO="nix-snowflake"
NAME=NixOS
PRETTY_NAME="NixOS 25.11 (Xantusia)"
SUPPORT_URL="https://nixos.org/community.html"
VARIANT=""
VARIANT_ID=""
VENDOR_NAME=NixOS
VENDOR_URL="https://nixos.org/"
VERSION="25.11 (Xantusia)"
VERSION_CODENAME=xantusia
VERSION_ID="25.11"
/etc/lsb-release:
DISTRIB_CODENAME=xantusia
DISTRIB_DESCRIPTION="NixOS 25.11 (Xantusia)"
DISTRIB_ID=nixos
DISTRIB_RELEASE="25.11"
LSB_VERSION="25.11 (Xantusia)"

141
crashes/cysjzw2dys/krash Normal file
View file

@ -0,0 +1,141 @@
PID: 934130 (.quickshell-wra)
UID: 1000 (cr)
GID: 100 (users)
Signal: 11 (SEGV)
Timestamp: Tue 2025-06-24 17:05:45 CEST (1min 6s ago)
Command Line: /nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/quickshell
Executable: /nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped
Control Group: /user.slice/user-1000.slice/user@1000.service/app.slice/app-ghostty-transient-893450.scope/surfaces/56064E44FCE0.scope
Unit: user@1000.service
User Unit: app-ghostty-transient-893450.scope
Slice: user-1000.slice
Owner UID: 1000 (cr)
Boot ID: cf8c340fb08a42959615d04c1ed95e43
Machine ID: 34366a1d940e471481fb5b10aa9acce4
Hostname: hermit
Storage: /var/lib/systemd/coredump/core.\x2equickshell-wra.1000.cf8c340fb08a42959615d04c1ed95e43.934130.1750777545000000.zst (present)
Size on Disk: 7.8M
Message: Process 934130 (.quickshell-wra) of user 1000 dumped core.
Module libwebpmux.so.3 without build-id.
Module libwebpdemux.so.2 without build-id.
Module libwebp.so.7 without build-id.
Module libLerc.so.4 without build-id.
Module libdeflate.so.0 without build-id.
Module libtiff.so.6 without build-id.
Module liblcms2.so.2 without build-id.
Module libmng.so.2 without build-id.
Module libatomic.so.1 without build-id.
Module libvmaf.so.3 without build-id.
Module libnuma.so.1 without build-id.
Module libsharpyuv.so.0 without build-id.
Module libaom.so.3 without build-id.
Module libde265.so without build-id.
Module libx265.so.215 without build-id.
Module libheif.so.1 without build-id.
Module libjasper.so.7 without build-id.
Module libjpeg.so.62 without build-id.
Module libpciaccess.so.0 without build-id.
Module liblzma.so.5 without build-id.
Module libxml2.so.2 without build-id.
Module libdrm_intel.so.1 without build-id.
Module libdrm_amdgpu.so.1 without build-id.
Module libxshmfence.so.1 without build-id.
Module libxcb-sync.so.1 without build-id.
Module libsensors.so.5 without build-id.
Module libxcb-present.so.0 without build-id.
Module libxcb-dri3.so.0 without build-id.
Module libxcb-shm.so.0 without build-id.
Module libxcb-xfixes.so.0 without build-id.
Module libxcb-randr.so.0 without build-id.
Module libX11-xcb.so.1 without build-id.
Module libunistring.so.5 without build-id.
Module libselinux.so.1 without build-id.
Module libpsl.so.5 without build-id.
Module libssh2.so.1 without build-id.
Module libidn2.so.0 without build-id.
Module libnghttp2.so.14 without build-id.
Module libduktape.so.207 without build-id.
Module libgomp.so.1 without build-id.
Module libcap.so.2 without build-id.
Module libpxbackend-1.0.so without build-id.
Module libbrotlicommon.so.1 without build-id.
Module libkeyutils.so.1 without build-id.
Module libkrb5support.so.0 without build-id.
Module libcom_err.so.3 without build-id.
Module libk5crypto.so.3 without build-id.
Module libkrb5.so.3 without build-id.
Module libgraphite2.so.3 without build-id.
Module libpcre2-8.so.0 without build-id.
Module libexpat.so.1 without build-id.
Module libbz2.so.1 without build-id.
Module libpcre2-16.so.0 without build-id.
Module libb2.so.1 without build-id.
Module libdouble-conversion.so.3 without build-id.
Module libicudata.so.76 without build-id.
Module libicuuc.so.76 without build-id.
Module libicui18n.so.76 without build-id.
Module libproxy.so.1 without build-id.
Module libzstd.so.1 without build-id.
Module libbrotlidec.so.1 without build-id.
Module libgssapi_krb5.so.2 without build-id.
Module libXext.so.6 without build-id.
Module libz.so.1 without build-id.
Module libfreetype.so.6 without build-id.
Module libmd4c.so.0 without build-id.
Module libharfbuzz.so.0 without build-id.
Module libpng16.so.16 without build-id.
Module libX11.so.6 without build-id.
Module libfontconfig.so.1 without build-id.
Module libvulkan.so without build-id.
Module libaudit.so.1 without build-id.
Module libXdmcp.so.6 without build-id.
Module libXau.so.6 without build-id.
Module libffi.so.8 without build-id.
Module libGLdispatch.so.0 without build-id.
Module libgcc_s.so.1 without build-id.
Module libstdc++.so.6 without build-id.
Module libOpenGL.so.0 without build-id.
Module libGLX.so.0 without build-id.
Module libpam.so.0 without build-id.
Module libpipewire-0.3.so.0 without build-id.
Module libxcb.so.1 without build-id.
Module libxkbcommon.so.0 without build-id.
Module libEGL.so.1 without build-id.
Module libgbm.so.1 without build-id.
Module libdrm.so.2 without build-id.
Module libjemalloc.so.2 without build-id.
Stack trace of thread 934130:
#0 0x000055b31f19466b _ZN14PostReloadHook14postReloadTreeEP7QObject (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x12566b)
#1 0x000055b31f194699 _ZN14PostReloadHook14postReloadTreeEP7QObject (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x125699)
#2 0x000055b31f194699 _ZN14PostReloadHook14postReloadTreeEP7QObject (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x125699)
#3 0x000055b31f19fe76 _ZN9QtPrivate15QCallableObjectIZN16EngineGeneration8onReloadEPS1_E3$_0NS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x130e76)
#4 0x00007f0dc001c7a0 _Z10doActivateILb0EEvP7QObjectiPPv (libQt6Core.so.6 + 0x21c7a0)
#5 0x00007f0dc00129a3 _ZN7QObject9destroyedEPS_ (libQt6Core.so.6 + 0x2129a3)
#6 0x00007f0dc0018f8b _ZN7QObjectD1Ev (libQt6Core.so.6 + 0x218f8b)
#7 0x000055b31f19cf45 _ZN16EngineGenerationD1Ev (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x12df45)
#8 0x000055b31f19cfb9 _ZN16EngineGenerationD0Ev (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x12dfb9)
#9 0x000055b31f19fe08 _ZN9QtPrivate15QCallableObjectIZN16EngineGeneration7destroyEvE3$_0NS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x130e08)
#10 0x00007f0dc001c7a0 _Z10doActivateILb0EEvP7QObjectiPPv (libQt6Core.so.6 + 0x21c7a0)
#11 0x00007f0dc00129a3 _ZN7QObject9destroyedEPS_ (libQt6Core.so.6 + 0x2129a3)
#12 0x00007f0dc0018f8b _ZN7QObjectD1Ev (libQt6Core.so.6 + 0x218f8b)
#13 0x000055b31f1ed6c9 _ZN11QQmlPrivate11QQmlElementI9ShellRootED0Ev (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x17e6c9)
#14 0x00007f0dc000dc86 _ZN7QObject5eventEP6QEvent (libQt6Core.so.6 + 0x20dc86)
#15 0x00007f0dbffb2698 _ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent (libQt6Core.so.6 + 0x1b2698)
#16 0x00007f0dbffb63e4 _ZN23QCoreApplicationPrivate16sendPostedEventsEP7QObjectiP11QThreadData (libQt6Core.so.6 + 0x1b63e4)
#17 0x00007f0dc02c42c7 _ZL23postEventSourceDispatchP8_GSourcePFiPvES1_ (libQt6Core.so.6 + 0x4c42c7)
#18 0x00007f0dbf90181e g_main_context_dispatch_unlocked (libglib-2.0.so.0 + 0x6181e)
#19 0x00007f0dbf903a90 g_main_context_iterate_unlocked.isra.0 (libglib-2.0.so.0 + 0x63a90)
#20 0x00007f0dbf9042bc g_main_context_iteration (libglib-2.0.so.0 + 0x642bc)
#21 0x00007f0dc02c39a3 _ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE (libQt6Core.so.6 + 0x4c39a3)
#22 0x00007f0dbffc0beb _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE (libQt6Core.so.6 + 0x1c0beb)
#23 0x00007f0dbffbc02e _ZN16QCoreApplication4execEv (libQt6Core.so.6 + 0x1bc02e)
#24 0x000055b31f11b062 _ZN2qs6launch6launchERKNS0_10LaunchArgsEPPcP16QCoreApplication (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0xac062)
#25 0x000055b31f1126f0 _ZN2qs6launch12_GLOBAL__N_117launchFromCommandERNS0_12CommandStateEP16QCoreApplication (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0xa36f0)
#26 0x000055b31f111a63 _ZN2qs6launch10runCommandEiPPcP16QCoreApplication (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0xa2a63)
#27 0x000055b31f108999 _ZN2qs6launch4mainEiPPc (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x99999)
#28 0x00007f0dbf62a47e __libc_start_call_main (libc.so.6 + 0x2a47e)
#29 0x00007f0dbf62a539 __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x2a539)
#30 0x000055b31f106b25 _start (/nix/store/yv42brzi79h6q6sfawxynh6wdmbm1jwc-quickshell-0.1.0/bin/.quickshell-wrapped + 0x97b25)
ELF object binary architecture: AMD x86-64

Binary file not shown.

View file

@ -6,11 +6,9 @@ import Quickshell
import "../../config" import "../../config"
import "components" import "components"
Rectangle { Item {
id: root id: root
color: Config.bar.colors.bar
required property ShellScreen screen required property ShellScreen screen
anchors { anchors {
@ -48,10 +46,5 @@ Rectangle {
screen: root.screen screen: root.screen
} }
} }
Text {
text: root.screen.name
color: "green"
}
} }
} }

View file

@ -13,22 +13,23 @@ Rectangle {
required property ShellScreen screen required property ShellScreen screen
property var workspaces: Niri.workspaces property var workspaces: Niri.workspaces
property var wsCount: Niri.workspaces.length
property var activeWorkspace: Niri.activeWorkspace property var activeWorkspace: Niri.activeWorkspace
property var activeWorkspaceIndex: Niri.activeWorkspaceIndex property var activeWorkspaceIndex: Niri.activeWorkspaceIndex
property int wsItemHeight: 15 property int wsItemHeight: 15
property bool _: log() signal workspaceAdded(workspace: var)
function log() { function onWorkspaceAdded(workspace: var) {
console.debug("Screen name: " + screen.name); root.workspaces.push(workspace);
console.debug("Found the following workspaces:");
for (let i = 0; i < workspaces.length; i++) {
console.debug("Workspace " + workspaces[i].id + " On screen " + workspaces[i].output + " With name: " + workspaces[i].name);
// console.debug(workspaces[i].output);
}
return true;
} }
// property bool _: log()
// function log() {
// console.log(workspaces.values);
// return true;
// }
// Works // Works
height: 300 height: 300
@ -96,8 +97,13 @@ Rectangle {
border.color: Config.catppuccin.mantle border.color: Config.catppuccin.mantle
border.width: 0 border.width: 0
color: Config.catppuccin.blue color: Config.catppuccin.blue
// visible: wsItem.isCorrectScreen
} }
} }
} }
Component.onCompleted: {
Niri.workspaces.forEach(workspace => {
root.workspaceAdded(workspace);
});
}
} }

View file

@ -1,3 +0,0 @@
import QtQuick
import QtQuick.Shapes

View file

@ -0,0 +1,9 @@
import Quickshell
import QtQuick
import QtQuick.Shapes
import "../notifications" as Notifications
Rectangle {
required property Item bar
}

View file

@ -7,7 +7,7 @@ import "../../config"
Item { Item {
id: root id: root
required property Rectangle bar required property Item bar
anchors.fill: parent anchors.fill: parent

View file

@ -7,9 +7,11 @@ import QtQuick
import QtQuick.Effects import QtQuick.Effects
import "../bar" import "../bar"
import "../volume"
import "../notifications" import "../notifications"
// import "../../services" import "../../services"
import "../../config"
Variants { Variants {
model: Quickshell.screens model: Quickshell.screens
@ -35,13 +37,22 @@ Variants {
// Clickthrough mask. // Clickthrough mask.
// Clickable areas of the window are determined by the provided region. // Clickable areas of the window are determined by the provided region.
mask: Region { mask: Region {
// Start at the bottom left; right of the bar and on top of the border
x: bar.implicitWidth x: bar.implicitWidth
y: 8 y: Config.border.thickness
width: win.width - bar.implicitWidth
height: win.height - 8 // Width is the window width - the bar's width - the border thickness
width: win.width - bar.implicitWidth - Config.border.thickness
// Height is window width - the border thickness x2 top border and bottom border.
height: win.height - Config.border.thickness * 2
// Setting the intersection mode to Xor will invert the mask and make everything in the mask region not clickable and pass through clicks inside it through the window. // Setting the intersection mode to Xor will invert the mask and make everything in the mask region not clickable and pass through clicks inside it through the window.
intersection: Intersection.Xor intersection: Intersection.Xor
Region {
item: volume
intersection: Intersection.Subtract
}
} }
anchors { anchors {
@ -60,6 +71,10 @@ Variants {
Border { Border {
bar: bar bar: bar
} }
Backgrounds {
bar: bar
}
} }
MultiEffect { MultiEffect {
@ -73,45 +88,18 @@ Variants {
id: bar id: bar
screen: scope.modelData screen: scope.modelData
} }
Item {
id: notifs
readonly property list<Notif> list: [] VolumeSlider {
readonly property list<Notif> popups: list.filter(n => n.popup) id: volume
isInRightPanel: hover.isInRightPanel
screen: scope.modelData
}
NotificationServer { Hover {
id: server id: hover
screen: scope.modelData
keepOnReload: false bar: bar
onNotification: notif => {
notif.tracked = true;
console.log("Got notification: " + notif.body);
root.list.push(notifComp.createObject(root, {
popup: true,
notification: notif,
body: notif.body,
appName: notif.appName
}));
}
}
Component {
id: notifComp
Notif {}
}
} }
} }
} }
component Notif: QtObject {
property bool popup
readonly property date time: new Date()
required property Notification notification
readonly property string body: notification.body
readonly property string appName: notification.appName
}
} }

View file

@ -0,0 +1,319 @@
pragma Singleton
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
import Quickshell.Widgets
Singleton {
id: launcher
property bool launcherOpen: false
IpcHandler {
target: "launcher"
function open(): void {
launcher.launcherOpen = true;
}
function close(): void {
launcher.launcherOpen = false;
}
function toggle(): void {
launcher.launcherOpen = !launcher.launcherOpen;
}
}
LazyLoader {
id: loader
activeAsync: launcher.launcherOpen
PanelWindow {
width: 450
height: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10
color: "transparent"
anchors {
bottom: parent.bottom
}
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
WlrLayershell.namespace: "shell:launcher"
Rectangle {
height: 7 + searchContainer.implicitHeight + list.topMargin + list.bottomMargin + Math.min(list.contentHeight, list.delegateHeight * 10)
Behavior on height {
NumberAnimation {
duration: 200
easing.type: Easing.OutCubic
}
}
width: 450
color: "#30c0afaf"
radius: 5
border.color: "black"
border.width: 2
ColumnLayout {
anchors.fill: parent
anchors.margins: 7
anchors.bottomMargin: 0
spacing: 0
Rectangle {
id: searchContainer
Layout.fillWidth: true
implicitHeight: searchbox.implicitHeight + 10
color: "#30c0ffff"
radius: 3
border.color: "#50ffffff"
RowLayout {
id: searchbox
anchors.fill: parent
anchors.margins: 5
IconImage {
implicitSize: parent.height
source: "root:icons/magnifying-glass.svg"
}
TextInput {
id: search
Layout.fillWidth: true
color: "black"
focus: true
Keys.forwardTo: [list]
Keys.onEscapePressed: launcher.launcherOpen = false
Keys.onPressed: event => {
if (event.modifiers & Qt.ControlModifier) {
if (event.key == Qt.Key_J) {
list.currentIndex = list.currentIndex == list.count - 1 ? 0 : list.currentIndex + 1;
event.accepted = true;
} else if (event.key == Qt.Key_K) {
list.currentIndex = list.currentIndex == 0 ? list.count - 1 : list.currentIndex - 1;
event.accepted = true;
}
}
}
onAccepted: {
if (list.currentItem) {
list.currentItem.clicked(null);
}
}
onTextChanged: {
list.currentIndex = 0;
}
}
}
}
ListView {
id: list
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
cacheBuffer: 0 // works around QTBUG-131106
//reuseItems: true
model: ScriptModel {
values: DesktopEntries.applications.values.map(object => {
const stxt = search.text.toLowerCase();
const ntxt = object.name.toLowerCase();
let si = 0;
let ni = 0;
let matches = [];
let startMatch = -1;
for (let si = 0; si != stxt.length; ++si) {
const sc = stxt[si];
while (true) {
// Drop any entries with letters that don't exist in order
if (ni == ntxt.length)
return null;
const nc = ntxt[ni++];
if (nc == sc) {
if (startMatch == -1)
startMatch = ni;
break;
} else {
if (startMatch != -1) {
matches.push({
index: startMatch,
length: ni - startMatch
});
startMatch = -1;
}
}
}
}
if (startMatch != -1) {
matches.push({
index: startMatch,
length: ni - startMatch + 1
});
}
return {
object: object,
matches: matches
};
}).filter(entry => entry !== null).sort((a, b) => {
let ai = 0;
let bi = 0;
let s = 0;
while (ai != a.matches.length && bi != b.matches.length) {
const am = a.matches[ai];
const bm = b.matches[bi];
s = bm.length - am.length;
if (s != 0)
return s;
s = am.index - bm.index;
if (s != 0)
return s;
++ai;
++bi;
}
s = a.matches.length - b.matches.length;
if (s != 0)
return s;
s = a.object.name.length - b.object.name.length;
if (s != 0)
return s;
return a.object.name.localeCompare(b.object.name);
}).map(entry => entry.object)
onValuesChanged: list.currentIndex = 0
}
topMargin: 7
bottomMargin: list.count == 0 ? 0 : 7
add: Transition {
NumberAnimation {
property: "opacity"
from: 0
to: 1
duration: 100
}
}
displaced: Transition {
NumberAnimation {
property: "y"
duration: 200
easing.type: Easing.OutCubic
}
NumberAnimation {
property: "opacity"
to: 1
duration: 100
}
}
move: Transition {
NumberAnimation {
property: "y"
duration: 200
easing.type: Easing.OutCubic
}
NumberAnimation {
property: "opacity"
to: 1
duration: 100
}
}
remove: Transition {
NumberAnimation {
property: "y"
duration: 200
easing.type: Easing.OutCubic
}
NumberAnimation {
property: "opacity"
to: 0
duration: 100
}
}
highlight: Rectangle {
radius: 5
color: "#20e0ffff"
border.color: "#30ffffff"
border.width: 1
}
keyNavigationEnabled: true
keyNavigationWraps: true
highlightMoveVelocity: -1
highlightMoveDuration: 50
preferredHighlightBegin: list.topMargin
preferredHighlightEnd: list.height - list.bottomMargin
highlightRangeMode: ListView.ApplyRange
snapMode: ListView.SnapToItem
readonly property real delegateHeight: 44
delegate: MouseArea {
required property DesktopEntry modelData
implicitHeight: list.delegateHeight
implicitWidth: ListView.view.width
onClicked: {
modelData.execute();
launcher.launcherOpen = false;
}
RowLayout {
id: delegateLayout
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: 5
}
IconImage {
Layout.alignment: Qt.AlignVCenter
asynchronous: true
implicitSize: 30
source: Quickshell.iconPath(modelData.icon)
}
Text {
text: modelData.name
color: "black"
font.family: "ComicShannsMono Nerd Font Mono"
Layout.alignment: Qt.AlignVCenter
}
}
}
}
}
}
}
}
function init() {
}
}

View file

@ -0,0 +1,41 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Wayland
import Quickshell.Services.Notifications
import QtQuick
import QtQuick.Effects
Rectangle {
id: root
required property bool isInRightPanel
required property ShellScreen screen
property bool isVisible
color: "transparent"
property bool _: log()
function log() {
console.log(hover.hovered);
return true
}
anchors {
right: parent.right
verticalCenter: parent.verticalCenter
}
implicitWidth: 60
implicitHeight: screen.height / 3
HoverHandler {
id: hover
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
}
Rectangle {
anchors.right: parent.right
color: "green"
implicitWidth: hover.hovered | root.isInRightPanel ? 60 : 10
implicitHeight: root.screen.height / 3
}
}

Binary file not shown.

49
services/Hover.qml Normal file
View file

@ -0,0 +1,49 @@
import Quickshell
import QtQuick
import "../config"
MouseArea {
id: root
anchors.fill: parent
hoverEnabled: true
required property ShellScreen screen
// required property Panels panels
required property Item bar
property bool showVolumeMenu: false
property bool isInRightPanel: false
// function withinPanelHeight(panel: Item, x: real, y: real): bool {
// const panelY = Config.border.thickness + panel.y;
// return y >= panelY - Config.border.rounding && y <= panelY + panel.height + Config.border.rounding;
// }
// function inLeftBorder(x: real, y: real): bool {
// return x <= Config.border.thickness;
// }
function inRightPanel(x: real, y: real): bool {
// Cursor is in middle veritcal third of screen
// Cursor is in the right border
return y >= root.screen.height / 3 && y <= (root.screen.height / 3) * 2 && x >= root.screen.width - Config.border.thickness;
}
// Update on mouse cursor movement
onPositionChanged: event => {
const x = event.x;
const y = event.y;
root.isInRightPanel = inRightPanel(x, y);
console.log("In right panel: " + root.isInRightPanel);
console.log("x:" + x + " y: " + y);
}
onContainsMouseChanged: {
if (!containsMouse) {
root.isInRightPanel = false;
}
}
}

View file

@ -1,42 +1,20 @@
pragma Singleton pragma Singleton
pragma ComponentBehavior: Bound pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Services.Notifications
import QtQuick import QtQuick
import Quickshell
import Quickshell.Io
import Quickshell.Services.Notifications
/**
* Provides extra features not in Quickshell.Services.Notifications:
* - Persistent storage
* - Popup notifications, with timeout
* - Notification groups by app
*/
Singleton { Singleton {
id: root id: root
NotificationServer {
readonly property list<Notif> list: [] }
readonly property list<Notif> popups: list.filter(n => n.popup)
NotificationServer {
id: server
keepOnReload: false
onNotification: notif => {
notif.tracked = true;
root.list.push(notifComp.createObject(root, {
popup: true,
notification: notif
}));
}
}
component Notif: QtObject {
property bool popup
readonly property date time: new Date()
required property Notification notification
readonly property string summary: notification.summary
}
Component {
id: notifComp
Notif {}
}
} }

View file

@ -26,7 +26,7 @@ Singleton {
var event = JSON.parse(data); var event = JSON.parse(data);
let workspaces = []; let workspaces = [];
if (event.WorkspacesChanged) { if (event.WorkspacesChanged) {
root.workspaces = event.WorkspacesChanged.workspaces.filter(w => w.name); root.workspaces = event.WorkspacesChanged.workspaces;
root.workspaces = root.workspaces.sort((a, b) => a.id - b.id); root.workspaces = root.workspaces.sort((a, b) => a.id - b.id);
root.activeWorkspaceIndex = root.workspaces.findIndex(w => w.is_focused); root.activeWorkspaceIndex = root.workspaces.findIndex(w => w.is_focused);
if (root.activeWorkspaceIndex < 0) { if (root.activeWorkspaceIndex < 0) {
@ -68,6 +68,15 @@ Singleton {
} }
} }
} }
// component Workspace: QtObject {
// required property int id
// property int idx
// property string name: "VOID"
// required property string output
// property bool is_active
// property bool is_focused
// property int active_window_id
// }
} }
// { // {

View file

@ -5,6 +5,8 @@ import QtQuick
import "modules" import "modules"
import "modules/drawers" import "modules/drawers"
import "services"
// import "modules/background" // import "modules/background"
ShellRoot { ShellRoot {
@ -13,6 +15,7 @@ ShellRoot {
Component.onCompleted: [Launcher.init()] Component.onCompleted: [Launcher.init()]
Drawers {} Drawers {}
// Background {} // Background {}Popup
//
} }