Compare commits

..

1 Commits

Author SHA1 Message Date
reed 93459a22b5 Initial commit 2026-04-17 18:10:23 -05:00
15 changed files with 0 additions and 1646 deletions
-1
View File
@@ -1 +0,0 @@
use flake
-13
View File
@@ -1,13 +0,0 @@
# Generated by nix
.direnv/
result
# Generated by Cargo
# will have compiled files and executables
debug/
target/
# These are backup files generated by rustfmt
**/*.rs.bk
.qmlls.ini
Generated
-570
View File
@@ -1,570 +0,0 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "anstyle"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000"
[[package]]
name = "anyhow"
version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
[[package]]
name = "cc"
version = "1.2.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"
dependencies = [
"find-msvc-tools",
"jobserver",
"libc",
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "clang-format"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "696283b40e1a39d208ee614b92e5f6521d16962edeb47c48372585ec92419943"
dependencies = [
"thiserror",
]
[[package]]
name = "clap"
version = "4.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
dependencies = [
"anstyle",
"clap_lex",
"strsim",
]
[[package]]
name = "clap_lex"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9"
[[package]]
name = "codespan-reporting"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
dependencies = [
"termcolor",
"unicode-width 0.1.14",
]
[[package]]
name = "codespan-reporting"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681"
dependencies = [
"serde",
"termcolor",
"unicode-width 0.2.2",
]
[[package]]
name = "convert_case"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "cxx"
version = "1.0.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "747d8437319e3a2f43d93b341c137927ca70c0f5dabeea7a005a73665e247c7e"
dependencies = [
"cc",
"cxx-build",
"cxxbridge-cmd",
"cxxbridge-flags",
"cxxbridge-macro",
"foldhash",
"link-cplusplus",
]
[[package]]
name = "cxx-build"
version = "1.0.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e"
dependencies = [
"cc",
"codespan-reporting 0.13.1",
"indexmap",
"proc-macro2",
"quote",
"scratch",
"syn",
]
[[package]]
name = "cxx-gen"
version = "0.7.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "035b6c61a944483e8a4b2ad4fb8b13830d63491bd004943716ad16d85dcc64bc"
dependencies = [
"codespan-reporting 0.13.1",
"indexmap",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "cxx-qt"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdf26e5ee4375a85799d0fe436662e5a8ef099bd0964b84bce8812c35c7daea"
dependencies = [
"cxx",
"cxx-qt-build",
"cxx-qt-macro",
"qt-build-utils",
"static_assertions",
"thiserror",
]
[[package]]
name = "cxx-qt-build"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f9a88c7f8241bfe4dfd19d27397a5845f0f275735a34ee7fb219045da81945e3"
dependencies = [
"cc",
"codespan-reporting 0.11.1",
"cxx-gen",
"cxx-qt-gen",
"proc-macro2",
"qt-build-utils",
"quote",
"serde",
"serde_json",
]
[[package]]
name = "cxx-qt-gen"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b1917c90b10117890e3794f4a0dc764a24704de40711d688ae128b0704490b8"
dependencies = [
"clang-format",
"convert_case",
"cxx-gen",
"indoc",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "cxx-qt-lib"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7b3de184cff59ad29d657021f933380e584d9b70265247f6a96098bef964211"
dependencies = [
"cxx",
"cxx-qt",
"cxx-qt-build",
"qt-build-utils",
]
[[package]]
name = "cxx-qt-macro"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "230b0d8b20d3d02a85885742be4fabc0382fead4e382dd8c9c9ff1827f221e8c"
dependencies = [
"cxx-qt-gen",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "cxxbridge-cmd"
version = "1.0.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0956799fa8678d4c50eed028f2de1c0552ae183c76e976cf7ca8c4e36a7c328"
dependencies = [
"clap",
"codespan-reporting 0.13.1",
"indexmap",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "cxxbridge-flags"
version = "1.0.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23384a836ab4f0ad98ace7e3955ad2de39de42378ab487dc28d3990392cb283a"
[[package]]
name = "cxxbridge-macro"
version = "1.0.194"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6acc6b5822b9526adfb4fc377b67128fdd60aac757cc4a741a6278603f763cf"
dependencies = [
"indexmap",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "equivalent"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "find-msvc-tools"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
[[package]]
name = "foldhash"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
[[package]]
name = "getrandom"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"libc",
"r-efi",
"wasip2",
]
[[package]]
name = "hashbrown"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
[[package]]
name = "indexmap"
version = "2.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
dependencies = [
"equivalent",
"hashbrown",
]
[[package]]
name = "indoc"
version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
dependencies = [
"rustversion",
]
[[package]]
name = "itoa"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "jobserver"
version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33"
dependencies = [
"getrandom",
"libc",
]
[[package]]
name = "libc"
version = "0.2.185"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"
[[package]]
name = "link-cplusplus"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82"
dependencies = [
"cc",
]
[[package]]
name = "memchr"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "qt-build-utils"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d074750fd3baba12fdb47388d591ad9ed043e23864a79d129dcf3a1ef6fc8d9"
dependencies = [
"anyhow",
"cc",
"semver",
"serde",
"thiserror",
]
[[package]]
name = "quote"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rshell"
version = "0.1.0"
dependencies = [
"cxx",
"cxx-qt",
"cxx-qt-build",
"cxx-qt-lib",
]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "scratch"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2"
[[package]]
name = "semver"
version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
dependencies = [
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "termcolor"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
dependencies = [
"winapi-util",
]
[[package]]
name = "thiserror"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "unicode-segmentation"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c"
[[package]]
name = "unicode-width"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "unicode-width"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
[[package]]
name = "wasip2"
version = "1.0.2+wasi-0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5"
dependencies = [
"wit-bindgen",
]
[[package]]
name = "winapi-util"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
dependencies = [
"windows-sys",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "wit-bindgen"
version = "0.51.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
[[package]]
name = "zmij"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
-15
View File
@@ -1,15 +0,0 @@
[package]
name = "rshell"
version = "0.1.0"
edition = "2024"
[lib]
crate-type = ["cdylib"]
[dependencies]
cxx = "1.0"
cxx-qt = "0.8"
cxx-qt-lib = { version = "0.8", features = ["qt_qml"] }
[build-dependencies]
cxx-qt-build = { version = "0.8", features = ["link_qt_object_files"] }
-13
View File
@@ -1,13 +0,0 @@
use cxx_qt_build::{CxxQtBuilder, PluginType, QmlModule};
fn main() {
CxxQtBuilder::new_qml_module(
QmlModule::new("one.krantz.rshell").plugin_type(PluginType::Dynamic),
)
.files(["src/my_object.rs"])
.build();
// This is a fix for "Could not resolve 'qt_plugin_instance' function"
// It works by using black magic with some rocket science to get things to work
println!("cargo::rustc-link-arg-cdylib=-Wl,--version-script=qt-plugin.version");
}
Generated
-98
View File
@@ -1,98 +0,0 @@
{
"nodes": {
"crane": {
"locked": {
"lastModified": 1775839657,
"narHash": "sha256-SPm9ck7jh3Un9nwPuMGbRU04UroFmOHjLP56T10MOeM=",
"owner": "ipetkov",
"repo": "crane",
"rev": "7cf72d978629469c4bd4206b95c402514c1f6000",
"type": "github"
},
"original": {
"owner": "ipetkov",
"repo": "crane",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1775087534,
"narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1776169885,
"narHash": "sha256-l/iNYDZ4bGOAFQY2q8y5OAfBBtrDAaPuRQqWaFHVRXM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "4bd9165a9165d7b5e33ae57f3eecbcb28fb231c9",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1774748309,
"narHash": "sha256-+U7gF3qxzwD5TZuANzZPeJTZRHS29OFQgkQ2kiTJBIQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "333c4e0545a6da976206c74db8773a1645b5870a",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"root": {
"inputs": {
"crane": "crane",
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs",
"treefmt-nix": "treefmt-nix"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1775636079,
"narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
-291
View File
@@ -1,291 +0,0 @@
{
description = "A quickshell based graphical shell named rshell";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
treefmt-nix = {
url = "github:numtide/treefmt-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
crane.url = "github:ipetkov/crane";
};
outputs = {
self,
flake-parts,
treefmt-nix,
crane,
...
} @ inputs:
flake-parts.lib.mkFlake {inherit inputs;} {
imports = [
treefmt-nix.flakeModule
];
systems = ["aarch64-linux" "x86_64-linux" "aarch64-darwin" "x86_64-darwin"];
perSystem = {
pkgs,
lib,
...
}: let
craneLib = crane.mkLib pkgs;
src = let
unfilteredRoot = ./.;
in
lib.fileset.toSource {
root = unfilteredRoot;
fileset = lib.fileset.unions [
# Default files from crane (Rust and cargo files)
(craneLib.fileset.commonCargoSources unfilteredRoot)
(lib.fileset.maybeMissing ./qt-plugin.version)
];
};
manifest = (lib.importTOML "${src}/Cargo.toml").package;
# pkgs.qt6.env already includes pkgs.qt6.qtbase
# And using `with` to prevent a lot of typing.
qtEnv = with pkgs.qt6;
env "qt-rshell-${qtbase.version}" [
qtdeclarative
qttools
];
# runtime dependencies
buildInputs = with pkgs; [
qtEnv
];
# build dependencies
nativeBuildInputs = with pkgs; [
# pkg-config
# rustPlatform.bindgenHook
];
# Build *just* the cargo dependencies, so we can reuse
# all of that work (e.g. via cachix) when running in CI
cargoArtifacts = craneLib.buildDepsOnly {
inherit src buildInputs nativeBuildInputs;
};
in rec {
# Dev Shell that lets you enter an environment with all the necessary utilites
# Available through 'nix develop'
# Also can be activated automatically if direnv is installed on the system with 'direnv allow'
devShells.default = craneLib.devShell {
inherit checks;
# extra tooling dependencies
packages = with pkgs; [
rust-analyzer
quickshell
];
shellHook =
/*
bash
*/
''
export QML2_IMPORT_PATH=$(git rev-parse --show-toplevel)/result/:$QML2_IMPORT_PATH
'';
inputsFrom = [packages.default];
};
# Formatter for nix files, available through 'nix fmt'
treefmt = {
programs.alejandra.enable = true;
programs.rustfmt = {
enable = true;
edition = manifest.edition;
};
};
# Your custom packages
# Accessible through 'nix build', 'nix shell', 'nix run', etc
packages = rec {
lib = craneLib.buildPackage {
inherit src buildInputs nativeBuildInputs cargoArtifacts;
};
qmlModule = pkgs.runCommand "rshell-qml-dir" {} ''
mkdir -p $out
cat << EOF > $out/qmldir
${''
module one.krantz.rshell
plugin rshell ${lib}/lib
''}
EOF
'';
default = qmlModule;
};
checks = {
clippy = craneLib.cargoClippy {
inherit src buildInputs nativeBuildInputs cargoArtifacts;
cargoClippyExtraArgs = "-- --deny warnings";
};
};
};
flake = {
homeManagerModules.default = {
lib,
config,
pkgs,
...
}: let
cfg = config.krantz.rshell;
colors = config.lib.stylix.colors;
mkColorOption = default: description:
lib.mkOption {
inherit default;
description = "The ${description} color.";
type = lib.types.str;
};
qmlDir = pkgs.runCommand "quickshell-config" {} ''
mkdir -p $out
# Copy your main files
cp -r ${lib.sources.sourceFilesBySuffices ./qml [".qml"]}/* $out/
# Copy the rust plugin
cp -Lr ${self.packages.${pkgs.stdenv.hostPlatform.system}.qmlModule} $out/one.krantz.rshell
# Copy the nix generate qml files
cp -Lr ${nixQmlDir} $out/nix
'';
nixQmlDir = pkgs.runCommand "nix-qml-dir" {} ''
mkdir -p $out/
cat << EOF > $out/CodeDirStat.qml
${
/*
qml
*/
''
pragma Singleton
import Quickshell
import Quickshell.Io
import QtQuick
Singleton {
id: root
property int files
property int commits
property int stashes
Process {
id: codedirstatproc
command: [${"\""
+ (with pkgs;
writeScript "quickshell-codedirstat"
/*
nu
*/
''
#!${nushell}/bin/nu --plugins [${nushellPlugins.gstat}/bin/nu_plugin_gstat]
ls ~/code/**/*/.git/..
| each {|r| gstat $r.name}
| each {|r| { files: (($r.wt_untracked + $r.wt_modified) > 0), commits: ($r.ahead > 0), stashes: ($r.stashes > 0) }}
| into int files commits stashes
| math sum
| $"($in.files):($in.commits):($in.stashes)"
'')
+ "\""}]
running: true
stdout: StdioCollector {
onStreamFinished: {
const res = this.text.split(":")
root.files = res[0]
root.commits = res[1]
root.stashes = res[2]
}
}
}
Timer {
interval: 30000
running: true
repeat: true
onTriggered: codedirstatproc.running = true
}
}
''
}
EOF
cat << EOF > $out/Theme.qml
${
/*
qml
*/
''
pragma Singleton
import Quickshell
import QtQuick
Singleton {
${builtins.concatStringsSep "\n" (
lib.attrsets.mapAttrsToList (
name: color: "readonly property color ${name}: \"#${color}\""
)
cfg.colors
)}
}
''
}
EOF
'';
in {
options.krantz.rshell = {
enable = lib.mkEnableOption "rshell, quickshell based graphical shell";
colors = {
bg = mkColorOption colors.base00-hex "default background";
fg = mkColorOption colors.base07-hex "default content";
text = mkColorOption colors.base07-hex "default text";
accent = mkColorOption colors.base0D-hex "accent";
shaded = mkColorOption colors.base03-hex "darker icon or text";
containerBg = mkColorOption colors.base01-hex "container background";
divider = mkColorOption colors.base02-hex "divider";
inactive = mkColorOption colors.base03-hex "inactive element";
bad = mkColorOption colors.base08-hex "bad state / low amount of resource";
ok = mkColorOption colors.base0A-hex "ok state / medium amount of resource";
good = mkColorOption colors.base0B-hex "good state / high amount of resource";
};
};
config = lib.mkIf cfg.enable {
programs.quickshell = {
enable = true;
systemd.enable = true;
configs = {
"shell.qml" = "${qmlDir}/shell.qml";
"nix" = nixQmlDir;
"one.krantz.rshell" = self.packages.${pkgs.stdenv.hostPlatform.system}.qmlModule;
};
};
};
};
};
};
}
-1
View File
@@ -1 +0,0 @@
nix/
-234
View File
@@ -1,234 +0,0 @@
import "nix"
import Quickshell
import Quickshell.Wayland
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
// You'll need to create or import a fuzzy matching utility
// For desktop entries, you may need a custom C++ plugin or use
// QProcess to query applications
PanelWindow {
id: win
anchors {
top: true
bottom: true
left: true
right: true
}
exclusionMode: ExclusionMode.Ignore
focusable: true
color: "transparent"
// Main content container
Rectangle {
id: contentBox
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 100
width: 700
height: contentCol.implicitHeight + contentCol.anchors.topMargin + contentCol.anchors.bottomMargin
radius: 12
color: Theme.bg
palette {
text: Theme.fg
placeholderText: Theme.shaded
windowText: Theme.fg
}
// Close on escape and handle Alt+number shortcuts
Keys.onPressed: event => {
if (event.key === Qt.Key_Escape) {
win.visible = false;
event.accepted = true;
return;
}
// Handle Alt+1 through Alt+9
if (event.modifiers & Qt.AltModifier) {
var num = -1;
if (event.key >= Qt.Key_1 && event.key <= Qt.Key_9) {
num = event.key - Qt.Key_1; // 0-8
} else if (event.key === Qt.Key_0) {
num = 9; // Alt+0 for 10th item if needed
}
if (num >= 0 && num < appList.count) {
launch(appList.get(num));
event.accepted = true;
}
}
}
ColumnLayout {
id: contentCol
anchors.fill: parent
anchors.margins: 15
Layout.preferredHeight: 20
spacing: 10
// Search entry row
RowLayout {
id: searchEntry
Layout.fillWidth: true
spacing: 10
Text {
font.pixelSize: 32
text: ""
color: Theme.accent
}
TextField {
id: searchField
Layout.fillWidth: true
placeholderText: "Application"
font.pixelSize: 24
background: Rectangle {
color: "transparent"
}
onTextChanged: search(text)
onAccepted: {
if (appList.count > 0) {
console.log("launching:", appList.get(0).name);
launch(appList.get(0));
}
}
Component.onCompleted: forceActiveFocus()
}
}
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: 3
color: Theme.divider
visible: appList.count > 0
}
// Application list
ListView {
id: listView
visible: appList.count > 0
Layout.fillWidth: true
Layout.preferredHeight: Math.min(appList.count * 50, 450)
model: appList
spacing: 0
clip: true
delegate: Button {
id: entryButton
width: listView.width
height: 50
background: Rectangle {
color: entryButton.hovered ? Theme.accent : "transparent"
radius: 14
}
contentItem: RowLayout {
anchors.fill: parent
anchors.leftMargin: 12
anchors.rightMargin: 12
spacing: 10
Image {
source: model.icon ? "image://icon/" + model.icon : ""
Layout.preferredWidth: 32
Layout.preferredHeight: 32
}
Label {
text: model.name
font.pixelSize: 24
Layout.fillWidth: true
elide: Text.ElideRight
maximumLineCount: 1
wrapMode: Text.Wrap
}
Label {
text: "⌘" + (index + 1)
Layout.alignment: Qt.AlignRight
color: entryButton.hovered ? Theme.fg : Theme.accent
font.pointSize: 12
}
}
onClicked: launch(model)
}
}
}
}
// Close when clicking outside content
MouseArea {
anchors.fill: parent
onPressed: mouse => {
var pnt = mapToItem(contentBox, mouse.x, mouse.y);
if (!contentBox.contains(Qt.point(pnt.x, pnt.y))) {
win.visible = false;
}
}
// Let clicks pass through to content
propagateComposedEvents: true
}
// Data model for applications
ListModel {
id: appList
}
// Function to perform fuzzy search
function search(text) {
if (text === "") {
appList.clear();
return;
}
// You'll need to implement fuzzy_query
// This could be via a C++ plugin or calling an external process
// For now, placeholder showing the pattern:
var results = DesktopEntries.applications.values;
appList.clear();
for (var i = 0; i < results.length; i++) {
appList.append(results[i]);
}
}
// Function to launch application
function launch(app) {
if (!app)
return;
win.visible = false;
app.execute();
}
// Handle visibility changes
onVisibleChanged: {
if (visible) {
searchField.forceActiveFocus();
searchField.selectAll();
} else {
searchField.text = "";
appList.clear();
}
}
}
-349
View File
@@ -1,349 +0,0 @@
import "nix"
import "one.krantz.rshell"
import Quickshell
import Quickshell.Hyprland
import Quickshell.Services.UPower
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import QtQuick.Shapes
Variants {
model: Quickshell.screens
PanelWindow {
id: panel
// the screen from the screens list will be injected into this
// property
required property var modelData
// we can then set the window's screen to the injected property
screen: modelData
anchors.top: true
anchors.left: true
anchors.right: true
implicitHeight: 36
margins.top: 7
margins.left: 7
margins.right: 7
color: "transparent"
Rectangle {
id: bar
anchors.fill: parent
radius: 7
color: Theme.bg
// Left section
Pane {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.left: parent.left
topPadding: 0
bottomPadding: 0
leftPadding: 10
rightPadding: 10
background: Rectangle {
radius: bar.radius
color: Theme.containerBg
}
RowLayout {
anchors.fill: parent
spacing: 10
Text {
id: clock
Layout.fillHeight: true
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
color: Theme.text
font.bold: true
text: Time.time
}
Rectangle {
Layout.fillHeight: true
width: 3
color: Theme.divider
}
Text {
id: codedirstat
Layout.fillHeight: true
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
color: Theme.text
font.bold: true
text: `${CodeDirStat.files}<font color=\"${Theme.shaded}\">󰈔 </font>${CodeDirStat.commits}<font color=\"${Theme.shaded}\">󰅟 </font>${CodeDirStat.stashes}<font color=\"${Theme.shaded}\"></font>`
}
}
}
// Center section
RowLayout {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.leftMargin: 10
anchors.rightMargin: 10
spacing: 10
Repeater {
model: 6
Rectangle {
id: workspace
required property int index
readonly property HyprlandWorkspace ws: {
Hyprland.workspaces.values.find(ws => ws.id === index + 1);
}
width: 16
height: width
radius: width * 0.5
border.width: 3
border.color: Theme.inactive
color: "transparent"
states: [
State {
name: "active-current"
when: (workspace.ws && workspace.ws.active && workspace.ws.monitor.name === panel.screen.name)
PropertyChanges {
target: workspace
color: workspace.border.color
border.color: Theme.accent
}
},
State {
name: "active-other"
when: (workspace.ws && workspace.ws.active)
PropertyChanges {
target: workspace
color: workspace.border.color
border.color: Theme.fg
}
},
State {
name: "current"
when: (workspace.ws && workspace.ws.monitor.name === panel.screen.name)
PropertyChanges {
target: workspace
border.color: Theme.accent
}
},
State {
name: "other"
when: (workspace.ws)
PropertyChanges {
target: workspace
border.color: Theme.fg
}
}
]
transitions: Transition {
ParallelAnimation {
ColorAnimation {
target: workspace
property: "color"
duration: 500
easing.type: Easing.InOutQuad
}
ColorAnimation {
target: workspace.border
property: "color"
duration: 500
easing.type: Easing.InOutQuad
}
}
}
}
}
}
// Right section
Pane {
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
topPadding: 0
bottomPadding: 0
leftPadding: 10
rightPadding: 10
background: Rectangle {
radius: bar.radius
color: Theme.containerBg
}
RowLayout {
anchors.fill: parent
spacing: 10
Item {
id: batteryIcon
property UPowerDevice battery: UPower.displayDevice
visible: battery.isPresent
width: 60
height: 30
property real borderWidth: 3
scale: 2 / 3
// Properties
property color lowColor: Theme.bad
property color mediumColor: Theme.ok
property color highColor: Theme.good
property color borderColor: Theme.fg
// Calculate fill color based on level
property color fillColor: {
if (battery.percentage <= 0.15)
return lowColor;
if (battery.percentage <= 0.4)
return mediumColor;
return highColor;
}
// Battery body with border
Rectangle {
id: batteryBody
anchors.fill: parent
color: "transparent"
border.color: batteryIcon.borderColor
border.width: batteryIcon.borderWidth
radius: 7
// Fill progress bar
Rectangle {
id: fillBar
anchors {
left: parent.left
top: parent.top
bottom: parent.bottom
margins: batteryIcon.borderWidth + 2
}
width: Math.max(0, (parent.width - 2 * batteryIcon.borderWidth) * batteryIcon.battery.percentage)
color: batteryIcon.fillColor
radius: 2
// Smooth animation for level changes
Behavior on width {
NumberAnimation {
duration: 1000
easing.type: Easing.OutCubic
}
}
// Color transition animation
Behavior on color {
ColorAnimation {
duration: 500
}
}
}
}
// Battery positive terminal (nub)
Rectangle {
id: batteryNub
anchors {
left: batteryBody.right
verticalCenter: batteryBody.verticalCenter
}
width: 6
height: 12
color: batteryIcon.borderColor
radius: 1
}
// Lightning bolt (visible when charging)
Shape {
id: lightningBolt
anchors.centerIn: batteryBody
width: 14
height: 20
scale: 0.8
visible: batteryIcon.battery.state === UPowerDeviceState.Charging || batteryIcon.battery.state === UPowerDeviceState.FullyCharged || batteryIcon.battery.state === UPowerDeviceState.PendingCharge
opacity: batteryIcon.battery.state === UPowerDeviceState.FullyCharged || batteryIcon.battery.state === UPowerDeviceState.PendingCharge ? 100 : 0
// Pulsing animation
SequentialAnimation on opacity {
running: batteryIcon.battery.state === UPowerDeviceState.Charging
loops: Animation.Infinite
NumberAnimation {
to: 1
duration: 400
}
NumberAnimation {
to: 0.4
duration: 400
}
}
ShapePath {
strokeWidth: 1
fillColor: batteryIcon.borderColor
startX: 5
startY: 20
PathLine {
x: 14
y: 8
}
PathLine {
x: 7
y: 8
}
PathLine {
x: 11
y: 0
}
PathLine {
x: 7
y: 0
}
PathLine {
x: 0
y: 12
}
PathLine {
x: 7
y: 12
}
PathLine {
x: 5
y: 20
}
}
}
}
}
}
}
}
}
-18
View File
@@ -1,18 +0,0 @@
import "nix"
pragma Singleton
import Quickshell
import QtQuick
Singleton {
id: root
readonly property string time: {
Qt.formatDateTime(clock.date, "MM/dd/yy hh:mm:ss AP")
}
SystemClock {
id: clock
precision: SystemClock.Seconds
}
}
-7
View File
@@ -1,7 +0,0 @@
import Quickshell
ShellRoot {
settings.watchFiles: true
Bar {}
}
-4
View File
@@ -1,4 +0,0 @@
QT_PLUGIN_META {
global:
qt_plugin_instance;
};
-1
View File
@@ -1 +0,0 @@
pub mod my_object;
-31
View File
@@ -1,31 +0,0 @@
#[cxx_qt::bridge]
pub mod qobject {
unsafe extern "C++" {
include!("cxx-qt-lib/qstring.h");
type QString = cxx_qt_lib::QString;
}
extern "RustQt" {
#[qobject]
#[qml_element]
#[qproperty(i32, counter)]
type CounterLogic = super::CounterLogicRust;
#[qinvokable]
fn increment(self: Pin<&mut Self>);
}
}
use core::pin::Pin;
#[derive(Default)]
pub struct CounterLogicRust {
counter: i32,
}
impl qobject::CounterLogic {
pub fn increment(self: Pin<&mut Self>) {
let new_val = *self.counter() + 1;
self.set_counter(new_val);
}
}