From 334bca71fe998f68d3a1d029b9c151b6392799f9 Mon Sep 17 00:00:00 2001 From: Bloxx12 Date: Tue, 24 Jun 2025 15:51:34 +0200 Subject: [PATCH] progress --- Launcher.qml | 34 +- crashes/cysjzw2dys/info.txt | 85 +++++ crashes/cysjzw2dys/krash | 141 ++++++++ crashes/cysjzw2dys/log.qslog.log | Bin 0 -> 225664 bytes modules/bar/Bar.qml | 9 +- modules/bar/components/Workspaces.qml | 26 +- modules/drawers/Background.qml | 3 - modules/drawers/Backgrounds.qml | 9 + modules/drawers/Border.qml | 2 +- modules/drawers/Drawers.qml | 68 ++-- modules/launcher/Launcher.qml | 319 ++++++++++++++++++ modules/volume/VolumeSlider.qml | 41 +++ ...9da1129b1cc2d04ba8f904947ed9ce9e43a79.qmlc | Bin 0 -> 736 bytes services/Hover.qml | 49 +++ services/Notification.qml | 48 +-- services/niri/Niri.qml | 11 +- shell.qml | 5 +- 17 files changed, 733 insertions(+), 117 deletions(-) create mode 100644 crashes/cysjzw2dys/info.txt create mode 100644 crashes/cysjzw2dys/krash create mode 100644 crashes/cysjzw2dys/log.qslog.log delete mode 100644 modules/drawers/Background.qml create mode 100644 modules/drawers/Backgrounds.qml create mode 100644 modules/launcher/Launcher.qml create mode 100644 modules/volume/VolumeSlider.qml create mode 100644 qmlcache/2269da1129b1cc2d04ba8f904947ed9ce9e43a79.qmlc create mode 100644 services/Hover.qml diff --git a/Launcher.qml b/Launcher.qml index 30dacdb..183175e 100644 --- a/Launcher.qml +++ b/Launcher.qml @@ -7,6 +7,8 @@ import Quickshell.Io import Quickshell.Wayland import Quickshell.Widgets +import "./config" + Singleton { id: launcher property bool launcherOpen: false @@ -32,11 +34,10 @@ Singleton { activeAsync: launcher.launcherOpen PanelWindow { - width: 450 - height: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10 + implicitWidth: 450 + implicitHeight: 7 + searchContainer.implicitHeight + list.topMargin * 2 + list.delegateHeight * 10 color: "transparent" WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive - WlrLayershell.namespace: "shell:launcher" Rectangle { @@ -48,9 +49,9 @@ Singleton { } } width: 450 - color: "#30c0afaf" + color: Config.catppuccin.base radius: 5 - border.color: "black" + border.color: Config.catppuccin.mantle border.width: 2 ColumnLayout { @@ -63,24 +64,20 @@ Singleton { id: searchContainer Layout.fillWidth: true implicitHeight: searchbox.implicitHeight + 10 - color: "#30c0ffff" + color: Config.catppuccin.base radius: 3 - border.color: "#50ffffff" + border.color: Config.catppuccin.mantle 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" + color: Config.catppuccin.text + font.pointSize: 13 focus: true Keys.forwardTo: [list] @@ -254,9 +251,9 @@ Singleton { highlight: Rectangle { radius: 5 - color: "#20e0ffff" - border.color: "#30ffffff" - border.width: 1 + color: "transparent" + border.color: Config.catppuccin.lavender + border.width: 2 } keyNavigationEnabled: true keyNavigationWraps: true @@ -296,8 +293,9 @@ Singleton { } Text { text: modelData.name - color: "black" - font.family: "ComicShannsMono Nerd Font Mono" + color: Config.catppuccin.text + font.family: "JetBrainsMono Nerd Font Mono" + font.pointSize: 13 Layout.alignment: Qt.AlignVCenter } } diff --git a/crashes/cysjzw2dys/info.txt b/crashes/cysjzw2dys/info.txt new file mode 100644 index 0000000..c79ee65 --- /dev/null +++ b/crashes/cysjzw2dys/info.txt @@ -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)" diff --git a/crashes/cysjzw2dys/krash b/crashes/cysjzw2dys/krash new file mode 100644 index 0000000..2dbafd3 --- /dev/null +++ b/crashes/cysjzw2dys/krash @@ -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 + diff --git a/crashes/cysjzw2dys/log.qslog.log b/crashes/cysjzw2dys/log.qslog.log new file mode 100644 index 0000000000000000000000000000000000000000..d74c952af89fee1d371d4b2ef71e1ef1a5fea897 GIT binary patch literal 225664 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 literal 0 HcmV?d00001 diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 4846949..b0fc519 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -6,11 +6,9 @@ import Quickshell import "../../config" import "components" -Rectangle { +Item { id: root - color: Config.bar.colors.bar - required property ShellScreen screen anchors { @@ -48,10 +46,5 @@ Rectangle { screen: root.screen } } - - Text { - text: root.screen.name - color: "green" - } } } diff --git a/modules/bar/components/Workspaces.qml b/modules/bar/components/Workspaces.qml index c6cd704..91bc9d2 100644 --- a/modules/bar/components/Workspaces.qml +++ b/modules/bar/components/Workspaces.qml @@ -13,22 +13,23 @@ Rectangle { required property ShellScreen screen property var workspaces: Niri.workspaces + property var wsCount: Niri.workspaces.length property var activeWorkspace: Niri.activeWorkspace property var activeWorkspaceIndex: Niri.activeWorkspaceIndex property int wsItemHeight: 15 - property bool _: log() - function log() { - console.debug("Screen name: " + screen.name); - 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; + signal workspaceAdded(workspace: var) + function onWorkspaceAdded(workspace: var) { + root.workspaces.push(workspace); } + // property bool _: log() + // function log() { + // console.log(workspaces.values); + // return true; + // } + // Works height: 300 @@ -96,8 +97,13 @@ Rectangle { border.color: Config.catppuccin.mantle border.width: 0 color: Config.catppuccin.blue - // visible: wsItem.isCorrectScreen } } } + + Component.onCompleted: { + Niri.workspaces.forEach(workspace => { + root.workspaceAdded(workspace); + }); + } } diff --git a/modules/drawers/Background.qml b/modules/drawers/Background.qml deleted file mode 100644 index 1e07cd8..0000000 --- a/modules/drawers/Background.qml +++ /dev/null @@ -1,3 +0,0 @@ -import QtQuick -import QtQuick.Shapes - diff --git a/modules/drawers/Backgrounds.qml b/modules/drawers/Backgrounds.qml new file mode 100644 index 0000000..388efc4 --- /dev/null +++ b/modules/drawers/Backgrounds.qml @@ -0,0 +1,9 @@ +import Quickshell +import QtQuick +import QtQuick.Shapes + +import "../notifications" as Notifications + +Rectangle { + required property Item bar +} diff --git a/modules/drawers/Border.qml b/modules/drawers/Border.qml index bebd353..9117fee 100644 --- a/modules/drawers/Border.qml +++ b/modules/drawers/Border.qml @@ -7,7 +7,7 @@ import "../../config" Item { id: root - required property Rectangle bar + required property Item bar anchors.fill: parent diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml index ffbaa6c..eb85dea 100644 --- a/modules/drawers/Drawers.qml +++ b/modules/drawers/Drawers.qml @@ -7,9 +7,11 @@ import QtQuick import QtQuick.Effects import "../bar" +import "../volume" import "../notifications" -// import "../../services" +import "../../services" +import "../../config" Variants { model: Quickshell.screens @@ -35,13 +37,22 @@ Variants { // Clickthrough mask. // Clickable areas of the window are determined by the provided region. mask: Region { + // Start at the bottom left; right of the bar and on top of the border x: bar.implicitWidth - y: 8 - width: win.width - bar.implicitWidth - height: win.height - 8 + y: Config.border.thickness + + // 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. intersection: Intersection.Xor + Region { + item: volume + intersection: Intersection.Subtract + } } anchors { @@ -60,6 +71,10 @@ Variants { Border { bar: bar } + + Backgrounds { + bar: bar + } } MultiEffect { @@ -73,45 +88,18 @@ Variants { id: bar screen: scope.modelData } - Item { - id: notifs - readonly property list list: [] - readonly property list popups: list.filter(n => n.popup) + VolumeSlider { + id: volume + isInRightPanel: hover.isInRightPanel + screen: scope.modelData + } - NotificationServer { - id: server - - keepOnReload: false - - 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 {} - } + Hover { + id: hover + screen: scope.modelData + bar: bar } } } - - 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 - } } diff --git a/modules/launcher/Launcher.qml b/modules/launcher/Launcher.qml new file mode 100644 index 0000000..8cf4f37 --- /dev/null +++ b/modules/launcher/Launcher.qml @@ -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() { + } +} diff --git a/modules/volume/VolumeSlider.qml b/modules/volume/VolumeSlider.qml new file mode 100644 index 0000000..af00a16 --- /dev/null +++ b/modules/volume/VolumeSlider.qml @@ -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 + } +} diff --git a/qmlcache/2269da1129b1cc2d04ba8f904947ed9ce9e43a79.qmlc b/qmlcache/2269da1129b1cc2d04ba8f904947ed9ce9e43a79.qmlc new file mode 100644 index 0000000000000000000000000000000000000000..28eab7da68404f8a9ee09bcd1999a25d3292fdf4 GIT binary patch literal 736 zcmXRcGf7TKEJ<`?U|?Y2WMlC7Z1Zd?BLl+&CI$vS&j_o7Q7fPA{?=J;zyB9c$EP2@ z(VyeGtFn^}i^~d=jB`!X%aV=CL0Un0;^9qSv!3+{Gim?X$8H+D>soPgsozqzI^(h% zyH2YdI>QXI0;G@;L@+S?fKWu!3{ZXK(EtDc|Ifj|zyQJuOi+s%7#K7d85j&085lem z85lAc85lYk85kBYGBE65WMH_!$iVOdW+zk&I|BnlAVUd5AVVobCPOkqHdLI4fq@~I zA%h{2A%!88p@_kiA&nu8A(bJSp#-dgn}LBLi6Mufl%a^Bh#{3Bg~5}dgdvq77c2{L zR~b}&K0^_M5km@ChK+%NAs=j3F+(cUERY1q9c2ue48;tYU~^MJf(#4{AoaxzxeWOX z`3xlt8BkFM1~CQ(hC+rShGYgS27QJUhD3%EhC~K^1}CVSV6M?)C}hZG$bstvd0&8m z0UYEiP#Po#QozC>!0`V+1A_(w0|O{XLGcR`2Zc3AM+gH00|+O81Q{3@Kr{%0RD)=c zITOHc7GPj!2w<23RR^P485kH?z;PD90P-)$OpqRsGA@Py1}=sRVE=-|L1G}x$q>N6 K$?yQg1Y-cld1nFu literal 0 HcmV?d00001 diff --git a/services/Hover.qml b/services/Hover.qml new file mode 100644 index 0000000..cd29894 --- /dev/null +++ b/services/Hover.qml @@ -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; + } + } +} diff --git a/services/Notification.qml b/services/Notification.qml index d539166..bdf52de 100644 --- a/services/Notification.qml +++ b/services/Notification.qml @@ -1,42 +1,20 @@ pragma Singleton pragma ComponentBehavior: Bound -import Quickshell -import Quickshell.Services.Notifications 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 { - id: root - - readonly property list list: [] - readonly property list 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 {} - } + id: root + NotificationServer { + + } } diff --git a/services/niri/Niri.qml b/services/niri/Niri.qml index 61c0aa4..de16157 100644 --- a/services/niri/Niri.qml +++ b/services/niri/Niri.qml @@ -26,7 +26,7 @@ Singleton { var event = JSON.parse(data); let workspaces = []; 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.activeWorkspaceIndex = root.workspaces.findIndex(w => w.is_focused); 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 + // } } // { diff --git a/shell.qml b/shell.qml index 1520716..05fea55 100644 --- a/shell.qml +++ b/shell.qml @@ -5,6 +5,8 @@ import QtQuick import "modules" import "modules/drawers" +import "services" + // import "modules/background" ShellRoot { @@ -13,6 +15,7 @@ ShellRoot { Component.onCompleted: [Launcher.init()] Drawers {} - // Background {} + // Background {}Popup + // }