diff --git a/flake.lock b/flake.lock index bec760d..ef1c06b 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ ] }, "locked": { - "lastModified": 1765900596, - "narHash": "sha256-+hn8v9jkkLP9m+o0Nm5SiEq10W0iWDSotH2XfjU45fA=", + "lastModified": 1767024902, + "narHash": "sha256-sMdk6QkMDhIOnvULXKUM8WW8iyi551SWw2i6KQHbrrU=", "owner": "hyprwm", "repo": "aquamarine", - "rev": "d83c97f8f5c0aae553c1489c7d9eff3eadcadace", + "rev": "b8a0c5ba5a9fbd2c660be7dd98bdde0ff3798556", "type": "github" }, "original": { @@ -43,11 +43,11 @@ ] }, "locked": { - "lastModified": 1767198468, - "narHash": "sha256-FxDbqVgsT/ofpcVD4oNSO4YyPK0bu0/w4TGr/p87E4A=", + "lastModified": 1768182537, + "narHash": "sha256-1Ff3WJ57qPtX8D5srMKzXbsWD+bmC0sZzWIIRdAkmNo=", "owner": "nix-community", "repo": "emacs-overlay", - "rev": "ff02fe1802aa90146fe3c236ec504c788825b152", + "rev": "35a115b97a6dfc196cc479c676556ce3c874ee81", "type": "github" }, "original": { @@ -59,15 +59,15 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1761588595, - "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", - "owner": "edolstra", + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", "repo": "flake-compat", - "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", "type": "github" }, "original": { - "owner": "edolstra", + "owner": "NixOS", "repo": "flake-compat", "type": "github" } @@ -122,11 +122,11 @@ ] }, "locked": { - "lastModified": 1767104570, - "narHash": "sha256-GKgwu5//R+cLdKysZjGqvUEEOGXXLdt93sNXeb2M/Lk=", + "lastModified": 1768068402, + "narHash": "sha256-bAXnnJZKJiF7Xr6eNW6+PhBf1lg2P1aFUO9+xgWkXfA=", "owner": "nix-community", "repo": "home-manager", - "rev": "e4e78a2cbeaddd07ab7238971b16468cc1d14daf", + "rev": "8bc5473b6bc2b6e1529a9c4040411e1199c43b4c", "type": "github" }, "original": { @@ -180,11 +180,11 @@ ] }, "locked": { - "lastModified": 1763733840, - "narHash": "sha256-JnET78yl5RvpGuDQy3rCycOCkiKoLr5DN1fPhRNNMco=", + "lastModified": 1766946335, + "narHash": "sha256-MRD+Jr2bY11MzNDfenENhiK6pvN+nHygxdHoHbZ1HtE=", "owner": "hyprwm", "repo": "hyprgraphics", - "rev": "8f1bec691b2d198c60cccabca7a94add2df4ed1a", + "rev": "4af02a3925b454deb1c36603843da528b67ded6c", "type": "github" }, "original": { @@ -218,11 +218,11 @@ "xdph": "xdph" }, "locked": { - "lastModified": 1767201430, - "narHash": "sha256-2FF66EaIbsc7CL1jKHbRFslSePDq40fzlTTbUlm5v3k=", + "lastModified": 1768144432, + "narHash": "sha256-6fc6FyEmfwT1Ke+2ib/80XPshc1h2lapIB/HlsaxyP4=", "owner": "hyprwm", "repo": "Hyprland", - "rev": "48a024e0322bbd7c4c88126498ec478444ec4cb2", + "rev": "fbf421df889ceff3bac08a9f4b9493def5eecc4d", "type": "github" }, "original": { @@ -264,11 +264,11 @@ ] }, "locked": { - "lastModified": 1765643131, - "narHash": "sha256-CCGohW5EBIRy4B7vTyBMqPgsNcaNenVad/wszfddET0=", + "lastModified": 1767023960, + "narHash": "sha256-R2HgtVS1G3KSIKAQ77aOZ+Q0HituOmPgXW9nBNkpp3Q=", "owner": "hyprwm", "repo": "hyprland-guiutils", - "rev": "e50ae912813bdfa8372d62daf454f48d6df02297", + "rev": "c2e906261142f5dd1ee0bfc44abba23e2754c660", "type": "github" }, "original": { @@ -284,11 +284,11 @@ ] }, "locked": { - "lastModified": 1766381032, - "narHash": "sha256-Wuk2MULnGfgAbP1N/Rp6H6k7zG/ynDiy54mPvkt/4bM=", + "lastModified": 1767957561, + "narHash": "sha256-N0kFdc6tSE0yFeQ/Iit3KNrz4nf2K5xvP3juL7SUyhc=", "owner": "outfoxxed", "repo": "hy3", - "rev": "50643d625829f303239f9ec019021f17d7e9f3fc", + "rev": "3287049e79e9e51431de8c09f9192a18afa1bf35", "type": "github" }, "original": { @@ -335,11 +335,11 @@ ] }, "locked": { - "lastModified": 1764612430, - "narHash": "sha256-54ltTSbI6W+qYGMchAgCR6QnC1kOdKXN6X6pJhOWxFg=", + "lastModified": 1767983607, + "narHash": "sha256-8C2co8NYfR4oMOUEsPROOJ9JHrv9/ktbJJ6X1WsTbXc=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "0d00dc118981531aa731150b6ea551ef037acddd", + "rev": "d4037379e6057246b408bbcf796cf3e9838af5b2", "type": "github" }, "original": { @@ -464,11 +464,11 @@ ] }, "locked": { - "lastModified": 1766253200, - "narHash": "sha256-26qPwrd3od+xoYVywSB7hC2cz9ivN46VPLlrsXyGxvE=", + "lastModified": 1767473322, + "narHash": "sha256-RGOeG+wQHeJ6BKcsSB8r0ZU77g9mDvoQzoTKj2dFHwA=", "owner": "hyprwm", "repo": "hyprwire", - "rev": "1079777525b30a947c8d657fac158e00ae85de9d", + "rev": "d5e7d6b49fe780353c1cf9a1cf39fa8970bd9d11", "type": "github" }, "original": { @@ -519,11 +519,11 @@ ] }, "locked": { - "lastModified": 1730724501, - "narHash": "sha256-zvNdomPM86fUf0iAwJV1RQC8yAqDCKbCDJKIs4iIPy0=", + "lastModified": 1767942797, + "narHash": "sha256-ypny6yOP3Buh7UBmETW3R/el3nHdzYNOCMhVnCdm9U4=", "ref": "refs/heads/master", - "rev": "8f897ffb4a1575252c536c63db8be72f22b6a494", - "revCount": 1, + "rev": "8bdd6351a130f8ed8fe13c9ec87ed965c4d9912b", + "revCount": 2, "type": "git", "url": "https://git.outfoxxed.me/outfoxxed/nix-qml-support" }, @@ -534,11 +534,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1766902085, - "narHash": "sha256-coBu0ONtFzlwwVBzmjacUQwj3G+lybcZ1oeNSQkgC0M=", + "lastModified": 1768127708, + "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", + "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38", "type": "github" }, "original": { @@ -555,11 +555,11 @@ ] }, "locked": { - "lastModified": 1767202981, - "narHash": "sha256-XF68CQaLfPcCk5DVAP/OLbyqchc9uj4E65AEf363HI8=", + "lastModified": 1768203973, + "narHash": "sha256-bf+HggwDgQRt47maAe9fbv2sH6uwZnzVy4tTb2nonP8=", "owner": "nix-community", "repo": "NUR", - "rev": "8666a7d3d9d26a7a3031ba4d5688ba4e6f83d6bd", + "rev": "7a7b3e1d25b93474d988915412e69c6f2401a0b7", "type": "github" }, "original": { @@ -578,11 +578,11 @@ ] }, "locked": { - "lastModified": 1765911976, - "narHash": "sha256-t3T/xm8zstHRLx+pIHxVpQTiySbKqcQbK+r+01XVKc0=", + "lastModified": 1767281941, + "narHash": "sha256-6MkqajPICgugsuZ92OMoQcgSHnD6sJHwk8AxvMcIgTE=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "b68b780b69702a090c8bb1b973bab13756cc7a27", + "rev": "f0927703b7b1c8d97511c4116eb9b4ec6645a0fa", "type": "github" }, "original": { @@ -598,11 +598,11 @@ ] }, "locked": { - "lastModified": 1766725085, - "narHash": "sha256-O2aMFdDUYJazFrlwL7aSIHbUSEm3ADVZjmf41uBJfHs=", + "lastModified": 1768204289, + "narHash": "sha256-aXPr9W8AEmPz9+dH8CHIwrppKIjtS3mHyOXR2ppH/aw=", "ref": "refs/heads/master", - "rev": "41828c4180fb921df7992a5405f5ff05d2ac2fff", - "revCount": 715, + "rev": "db37dc580afc9db1bc598436649c650138b6166d", + "revCount": 723, "type": "git", "url": "https://git.outfoxxed.me/quickshell/quickshell" }, @@ -631,11 +631,11 @@ }, "stable": { "locked": { - "lastModified": 1767051569, - "narHash": "sha256-0MnuWoN+n1UYaGBIpqpPs9I9ZHW4kynits4mrnh1Pk4=", + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "40ee5e1944bebdd128f9fbada44faefddfde29bd", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 4bc5921..c296088 100755 --- a/flake.nix +++ b/flake.nix @@ -48,6 +48,18 @@ inputs.hyprland.follows = "hyprland"; }; + /*hyprqt6engine = { + url = "github:hyprwm/hyprqt6engine"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.hyprutils.follows = "hyprutils"; + inputs.hyprlang.follows = "hyprlang"; + };*/ + + /*qt6engine = { + url = "github:kosslan/qt6engine"; + inputs.nixpkgs.follows = "nixpkgs"; + };*/ + quickshell = { url = "git+https://git.outfoxxed.me/quickshell/quickshell"; inputs.nixpkgs.follows = "nixpkgs"; @@ -79,6 +91,7 @@ ./modules/hyprland ./modules/xserver ./systems/msi + #(inputs.vps-testing.nixosConfigurations.localHostModule) ]; }; @@ -95,6 +108,19 @@ ]; }; + userland = nixpkgs.lib.nixosSystem rec { + system = "x86_64-linux"; + specialArgs = { inherit self system inputs; }; + + modules = [ + ./modules/impurity.nix + ./modules/preserve-system.nix + ./modules/system.nix + ./modules/hyprland + ./systems/userland + ]; + }; + msi-impure = self.nixosConfigurations.msi.extendModules { modules = [ { impurity.enable = true; } ]; }; lenovo-impure = self.nixosConfigurations.lenovo.extendModules { modules = [ { impurity.enable = true; } ]; }; }; diff --git a/modules/emacs/default.nix b/modules/emacs/default.nix index c4c5f5f..519e826 100644 --- a/modules/emacs/default.nix +++ b/modules/emacs/default.nix @@ -102,13 +102,7 @@ use-package vertico which-key - (melpaPackages.ws-butler.overrideAttrs { # https://github.com/nix-community/emacs-overlay/issues/499 - src = pkgs.fetchFromSavannah { - repo = "emacs/nongnu"; - rev = "9ee5a7657a22e836618813c2e2b64a548d27d2f"; - hash = "sha256-S9aFJcFMkyB1KozJc9hpwKjAMkOyEnCZ6Wf3JVZ8d0c="; - }; - }) + melpaPackages.ws-butler minuet zig-ts-mode ])); diff --git a/modules/overlay-pkgs/tws.nix b/modules/overlay-pkgs/tws.nix index 1cc42a5..871f076 100644 --- a/modules/overlay-pkgs/tws.nix +++ b/modules/overlay-pkgs/tws.nix @@ -74,7 +74,7 @@ in stdenv.mkDerivation { src = fetchurl { url = "https://download2.interactivebrokers.com/installers/tws/latest-standalone/tws-latest-standalone-linux-x64.sh"; - hash = "sha256-QN7dSe+R2kfDjtJWa9TIGbc8zCSC3XNmxSxOZOjOB2o="; + hash = "sha256-c+PptydEHvVkntDzX1Eod06hSE7prhuoXiTFZK+7dTI="; }; nativeBuildInputs = [ diff --git a/modules/system.nix b/modules/system.nix index e3c32f3..aebdc34 100644 --- a/modules/system.nix +++ b/modules/system.nix @@ -22,6 +22,7 @@ git git-lfs vim + android-tools ]; services.ntp.enable = true; @@ -69,7 +70,6 @@ # removable disks in file manager services.udisks2.enable = true; - programs.adb.enable = true; users.users.${config.main-user}.extraGroups = [ "adbusers" ]; services.tailscale.enable = true; diff --git a/modules/user/dev-support.nix b/modules/user/dev-support.nix index 41ba047..3109db6 100644 --- a/modules/user/dev-support.nix +++ b/modules/user/dev-support.nix @@ -7,7 +7,7 @@ typescript-language-server astro-language-server haskell-language-server - glslls + #glslls zls eslint diff --git a/modules/user/modules/quickshell/shell/bar/audio/AudioControl.qml b/modules/user/modules/quickshell/shell/bar/audio/AudioControl.qml index 4e33856..3ce604b 100644 --- a/modules/user/modules/quickshell/shell/bar/audio/AudioControl.qml +++ b/modules/user/modules/quickshell/shell/bar/audio/AudioControl.qml @@ -10,6 +10,12 @@ ClickableIcon { PwObjectTracker { objects: [ node ] } + PwNodePeakMonitor { + id: peakMonitor + node: root.node + enabled: tooltip.visible + } + implicitHeight: width; acceptedButtons: Qt.LeftButton | Qt.RightButton; fillWindowWidth: true @@ -55,6 +61,7 @@ ClickableIcon { //enabled: !node.audio.muted value: node.audio.volume + peak: peakMonitor.peak onValueChanged: node.audio.volume = value } } diff --git a/modules/user/modules/quickshell/shell/bar/audio/Mixer.qml b/modules/user/modules/quickshell/shell/bar/audio/Mixer.qml index 1a44257..bb0bb2a 100644 --- a/modules/user/modules/quickshell/shell/bar/audio/Mixer.qml +++ b/modules/user/modules/quickshell/shell/bar/audio/Mixer.qml @@ -45,6 +45,7 @@ ColumnLayout { required property PwLinkGroup modelData; node: trackedNode.isSink ? modelData.source : modelData.target; state: modelData.state; + peakDetect: trackedNode.isSink image: { let icon = ""; diff --git a/modules/user/modules/quickshell/shell/bar/audio/MixerEntryBase.qml b/modules/user/modules/quickshell/shell/bar/audio/MixerEntryBase.qml index 52d3278..531b497 100644 --- a/modules/user/modules/quickshell/shell/bar/audio/MixerEntryBase.qml +++ b/modules/user/modules/quickshell/shell/bar/audio/MixerEntryBase.qml @@ -9,6 +9,7 @@ RowLayout { required property PwNode node; required property string image; required property Item headerComponent; + property bool peakDetect: true; property int state: PwLinkState.Unlinked; @@ -21,6 +22,12 @@ RowLayout { PwObjectTracker { objects: [ node ] } + PwNodePeakMonitor { + id: peakMonitor + node: root.node + enabled: root.peakDetect + } + ClickableIcon { image: root.image asynchronous: true @@ -44,6 +51,7 @@ RowLayout { Layout.fillWidth: true value: node.audio.volume + peak: root.peakDetect ? peakMonitor.peak : 1 onValueChanged: node.audio.volume = value } } diff --git a/modules/user/modules/quickshell/shell/bar/audio/VolumeSlider.qml b/modules/user/modules/quickshell/shell/bar/audio/VolumeSlider.qml index 1e22f73..04701cd 100644 --- a/modules/user/modules/quickshell/shell/bar/audio/VolumeSlider.qml +++ b/modules/user/modules/quickshell/shell/bar/audio/VolumeSlider.qml @@ -7,11 +7,13 @@ Item { property real to: 1.5 property real warning: 1.0 property real value: 0.0 + property real peak: 1.0 implicitWidth: groove.implicitWidth implicitHeight: 20 property real __valueOffset: ((value - from) / (to - from)) * groove.width + property real __peakOffset: peak * __valueOffset property real __wheelValue: -1 MouseArea { @@ -55,10 +57,24 @@ Item { } radius: 5 - color: "#80ceffff" + color: "#40ceffff" width: __valueOffset } + Rectangle { + id: peakFill + + anchors { + left: groove.left + top: groove.top + bottom: groove.bottom + } + + radius: 5 + color: "#60ceffff" + width: __peakOffset + } + Rectangle { id: groove diff --git a/modules/user/modules/quickshell/shell/bar/connections/Connections.qml b/modules/user/modules/quickshell/shell/bar/connections/Connections.qml index c3c9a98..c326e70 100644 --- a/modules/user/modules/quickshell/shell/bar/connections/Connections.qml +++ b/modules/user/modules/quickshell/shell/bar/connections/Connections.qml @@ -15,6 +15,11 @@ BarWidgetInner { margins: 5 } + Network { + Layout.fillWidth: true + bar: root.bar + } + Bluetooth { Layout.fillWidth: true bar: root.bar diff --git a/modules/user/modules/quickshell/shell/bar/connections/Network.qml b/modules/user/modules/quickshell/shell/bar/connections/Network.qml new file mode 100644 index 0000000..51fa325 --- /dev/null +++ b/modules/user/modules/quickshell/shell/bar/connections/Network.qml @@ -0,0 +1,132 @@ +pragma ComponentBehavior: Bound +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Quickshell +import Quickshell.Widgets +import Quickshell.Networking +import qs +import qs.bar + +ClickableIcon { + id: root + required property var bar; + readonly property NetworkDevice adapter: Networking.devices.values[0] + readonly property bool connected: adapter.connected + readonly property WifiNetwork activeNetwork: adapter.networks.values.find(network => network.connected) + + property bool showMenu: false + + onPressed: event => { + event.accepted = true; + if (event.button === Qt.RightButton) { + showMenu = !showMenu; + } + } + + onClicked: event => { + if (event.button === Qt.LeftButton) { + Networking.wifiEnabled = !Networking.wifiEnabled; + } + } + + showPressed: showMenu || (pressedButtons & ~Qt.RightButton) + + implicitHeight: width + fillWindowWidth: true + acceptedButtons: Qt.LeftButton | Qt.RightButton + image: Networking.wifiEnabled + ? (connected ? `root:/icons/wifi-${Math.round(root.activeNetwork.signalStrength * 3)}.svg` : "root:/icons/wifi-x.svg") + : "root:/icons/wifi-slash.svg" + + property var tooltip: TooltipItem { + tooltip: bar.tooltip + owner: root + show: root.containsMouse + + Label { text: "Network" } + } + + property var rightclickMenu: TooltipItem { + id: rightclickMenu + tooltip: bar.tooltip + owner: root + + isMenu: true + show: root.showMenu + onClose: root.showMenu = false + + Loader { + width: 400 + active: root.showMenu || rightclickMenu.visible + + sourceComponent: Column { + spacing: 5 + + move: Transition { + SmoothedAnimation { property: "y"; velocity: 350 } + } + + RowLayout { + width: parent.width + + ClickableIcon { + image: root.image + implicitHeight: 40 + implicitWidth: height + onClicked: root.adapter.enabled = !root.adapter.enabled + } + + Label { + text: `Wifi (${root.adapter.name})` + } + + Item { Layout.fillWidth: true } + + ClickableIcon { + image: Networking.wifiEnabled ? "root:/icons/wifi-slash.svg" : "root:/icons/wifi-x.svg" + implicitHeight: 24 + implicitWidth: height + onClicked: Networking.wifiEnabled = !Networking.wifiEnabled + } + + ActivityButton { + image: "root:/icons/binoculars.svg" + implicitHeight: 24 + implicitWidth: height + onClicked: root.adapter.scannerEnabled = !root.adapter.scannerEnabled + showAction: root.adapter.scannerEnabled + Layout.rightMargin: 4 + } + } + + Rectangle { + width: parent.width + implicitHeight: 1 + visible: root.adapter.networks.values.length > 0 + + color: ShellGlobals.colors.separator + } + + Repeater { + model: ScriptModel { + values: [...root.adapter.networks.values].sort((a, b) => { + if (a.connected && !b.connected) return -1; + if (b.connected && !a.connected) return 1; + if (a.bonded && !b.bonded) return -1; + if (b.bonded && !a.bonded) return 1; + return b.name - a.name; + }) + } + + delegate: NetworkDelegate { + required property var modelData + device: root.adapter + network: modelData + width: parent.width + } + } + } + } + } +} diff --git a/modules/user/modules/quickshell/shell/bar/connections/NetworkDelegate.qml b/modules/user/modules/quickshell/shell/bar/connections/NetworkDelegate.qml new file mode 100644 index 0000000..896b896 --- /dev/null +++ b/modules/user/modules/quickshell/shell/bar/connections/NetworkDelegate.qml @@ -0,0 +1,63 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Quickshell +import Quickshell.Widgets +import Quickshell.Networking +import qs +import qs.bar + +WrapperMouseArea { + id: root + required property NetworkDevice device + required property WifiNetwork network + property bool menuOpen: false + readonly property bool showBg: false + hoverEnabled: true + + onClicked: menuOpen = !menuOpen + + WrapperRectangle { + color: root.showBg ? ShellGlobals.colors.widget : "transparent" + border.width: 1 + border.color: root.showBg ? ShellGlobals.colors.widgetOutline : "transparent" + radius: 4 + rightMargin: 2 + + ColumnLayout { + RowLayout { + ClickableIcon { + image: `root:/icons/wifi-${Math.round(root.network.signalStrength * 3)}` + implicitHeight: 40 + implicitWidth: height + } + + Label { + text: root.network.name + } + + Item { Layout.fillWidth: true } + + ActivityButton { + image: root.network.connected ? "root:/icons/plugs-connected.svg" : "root:/icons/plugs.svg" + implicitHeight: 24 + implicitWidth: height + showAction: root.network.stateChanging + onClicked: { + if (showAction) return; + else if (root.network.connected) root.device.disconnect(); + else root.network.connect(); + } + } + + ClickableIcon { + image: "root:/icons/trash.svg" + implicitHeight: 24 + implicitWidth: height + visible: root.network.known + onClicked: root.network.forget() + } + } + } + } +}