diff --git a/flake.lock b/flake.lock
index 1f3980c..cd246d3 100644
--- a/flake.lock
+++ b/flake.lock
@@ -37,11 +37,11 @@
"base16-helix": {
"flake": false,
"locked": {
- "lastModified": 1736852337,
- "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=",
+ "lastModified": 1748408240,
+ "narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=",
"owner": "tinted-theming",
"repo": "base16-helix",
- "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5",
+ "rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e",
"type": "github"
},
"original": {
@@ -104,11 +104,11 @@
]
},
"locked": {
- "lastModified": 1748225455,
- "narHash": "sha256-AzlJCKaM4wbEyEpV3I/PUq5mHnib2ryEy32c+qfj6xk=",
+ "lastModified": 1749436314,
+ "narHash": "sha256-CqmqU5FRg5AadtIkxwu8ulDSOSoIisUMZRLlcED3Q5w=",
"owner": "nix-community",
"repo": "disko",
- "rev": "a894f2811e1ee8d10c50560551e50d6ab3c392ba",
+ "rev": "dfa4d1b9c39c0342ef133795127a3af14598017a",
"type": "github"
},
"original": {
@@ -125,11 +125,11 @@
},
"locked": {
"dir": "pkgs/firefox-addons",
- "lastModified": 1748318605,
- "narHash": "sha256-rxxxdxFGX+C6xT0QPzMY5lDSBgigqtegQfVRRrZicHg=",
+ "lastModified": 1749441800,
+ "narHash": "sha256-bN4tccrmczfR4PUuepHpxNNmWG3cLZTFIt4BaD8YyvA=",
"owner": "rycee",
"repo": "nur-expressions",
- "rev": "0497d706cb79a3eef1f35dbc45419850c0e01bf1",
+ "rev": "fe13e6abfe72b39ad8381595c3c404849330c3cb",
"type": "gitlab"
},
"original": {
@@ -142,11 +142,11 @@
"firefox-gnome-theme": {
"flake": false,
"locked": {
- "lastModified": 1744642301,
- "narHash": "sha256-5A6LL7T0lttn1vrKsNOKUk9V0ittdW0VEqh6AtefxJ4=",
+ "lastModified": 1748383148,
+ "narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=",
"owner": "rafaelmardojai",
"repo": "firefox-gnome-theme",
- "rev": "59e3de00f01e5adb851d824cf7911bd90c31083a",
+ "rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf",
"type": "github"
},
"original": {
@@ -158,11 +158,11 @@
"flake-compat": {
"flake": false,
"locked": {
- "lastModified": 1733328505,
- "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+ "lastModified": 1747046372,
+ "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+ "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github"
},
"original": {
@@ -205,11 +205,11 @@
},
"flake-compat_4": {
"locked": {
- "lastModified": 1733328505,
- "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+ "lastModified": 1747046372,
+ "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+ "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
"type": "github"
},
"original": {
@@ -225,11 +225,11 @@
]
},
"locked": {
- "lastModified": 1743550720,
- "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
+ "lastModified": 1749398372,
+ "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "c621e8422220273271f52058f618c94e405bb0f5",
+ "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569",
"type": "github"
},
"original": {
@@ -243,11 +243,11 @@
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
- "lastModified": 1743550720,
- "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
+ "lastModified": 1748821116,
+ "narHash": "sha256-F82+gS044J1APL0n4hH50GYdPRv/5JWm34oCJYmVKdE=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "c621e8422220273271f52058f618c94e405bb0f5",
+ "rev": "49f0870db23e8c1ca0b5259734a02cd9e1e371a1",
"type": "github"
},
"original": {
@@ -326,11 +326,11 @@
]
},
"locked": {
- "lastModified": 1733312601,
- "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
+ "lastModified": 1743550720,
+ "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
"owner": "hercules-ci",
"repo": "flake-parts",
- "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
+ "rev": "c621e8422220273271f52058f618c94e405bb0f5",
"type": "github"
},
"original": {
@@ -428,11 +428,11 @@
]
},
"locked": {
- "lastModified": 1742649964,
- "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
+ "lastModified": 1747372754,
+ "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=",
"owner": "cachix",
"repo": "git-hooks.nix",
- "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
+ "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46",
"type": "github"
},
"original": {
@@ -505,11 +505,11 @@
},
"hardware": {
"locked": {
- "lastModified": 1747900541,
- "narHash": "sha256-dn64Pg9xLETjblwZs9Euu/SsjW80pd6lr5qSiyLY1pg=",
+ "lastModified": 1749195551,
+ "narHash": "sha256-W5GKQHgunda/OP9sbKENBZhMBDNu2QahoIPwnsF6CeM=",
"owner": "nixos",
"repo": "nixos-hardware",
- "rev": "11f2d9ea49c3e964315215d6baa73a8d42672f06",
+ "rev": "4602f7e1d3f197b3cb540d5accf5669121629628",
"type": "github"
},
"original": {
@@ -569,11 +569,11 @@
]
},
"locked": {
- "lastModified": 1748227609,
- "narHash": "sha256-SaSdslyo6UGDpPUlmrPA4dWOEuxCy2ihRN9K6BnqYsA=",
+ "lastModified": 1749400020,
+ "narHash": "sha256-0nTmHO8AYgRYk5v6zw5oZ3x9nh+feb+Isn7WNe318M0=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "d23d20f55d49d8818ac1f1b2783671e8a6725022",
+ "rev": "2835e8ba0ad99ba86d4a5e497a962ec9fa35e48f",
"type": "github"
},
"original": {
@@ -648,11 +648,11 @@
]
},
"locked": {
- "lastModified": 1748281511,
- "narHash": "sha256-feFNkno0UVfXWJln474OdHMBqH0grtXp6WDzXYxcvaQ=",
+ "lastModified": 1749348095,
+ "narHash": "sha256-4KaUocEPNoU6gpFE6WPLMvMK5tmvJyc0qf84Mp8Chlw=",
"owner": "fufexan",
"repo": "nix-gaming",
- "rev": "aa4362cf3b4ec587bbe43132a7b8384934fb38af",
+ "rev": "4221d80488883c40003f0704af78699a583f0c9f",
"type": "github"
},
"original": {
@@ -668,11 +668,11 @@
]
},
"locked": {
- "lastModified": 1748145500,
- "narHash": "sha256-t9fx0l61WOxtWxXCqlXPWSuG/0XMF9DtE2T7KXgMqJw=",
+ "lastModified": 1749355504,
+ "narHash": "sha256-L17CdJMD+/FCBOHjREQLXbe2VUnc3rjffenBbu2Kwpc=",
"owner": "Mic92",
"repo": "nix-index-database",
- "rev": "a98adbf54d663395df0b9929f6481d4d80fc8927",
+ "rev": "40a6e15e44b11fbf8f2b1df9d64dbfc117625e94",
"type": "github"
},
"original": {
@@ -690,11 +690,11 @@
]
},
"locked": {
- "lastModified": 1748225187,
- "narHash": "sha256-gpNN43fNJQoHhnK1Z+nms4lo6i/t9t2rfZMAxc165vQ=",
+ "lastModified": 1749435098,
+ "narHash": "sha256-8U85+jkZGjQs0YZ4ryuIvPEjIY905AueoTqm104lUSU=",
"owner": "Infinidoge",
"repo": "nix-minecraft",
- "rev": "98c1bcaaa4dbd5980523a08a5b32e35d44e830e5",
+ "rev": "8f383663f62afaaa79aec68a076c092da80f706f",
"type": "github"
},
"original": {
@@ -705,11 +705,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1748190013,
- "narHash": "sha256-R5HJFflOfsP5FBtk+zE8FpL8uqE7n62jqOsADvVshhE=",
+ "lastModified": 1749285348,
+ "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "62b852f6c6742134ade1abdd2a21685fd617a291",
+ "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f",
"type": "github"
},
"original": {
@@ -721,11 +721,11 @@
},
"nixpkgs-lib": {
"locked": {
- "lastModified": 1743296961,
- "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=",
+ "lastModified": 1748740939,
+ "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
- "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa",
+ "rev": "656a64127e9d791a334452c6b6606d17539476e2",
"type": "github"
},
"original": {
@@ -762,11 +762,11 @@
"treefmt-nix": "treefmt-nix_2"
},
"locked": {
- "lastModified": 1746056780,
- "narHash": "sha256-/emueQGaoT4vu0QjU9LDOG5roxRSfdY0K2KkxuzazcM=",
+ "lastModified": 1748730660,
+ "narHash": "sha256-5LKmRYKdPuhm8j5GFe3AfrJL8dd8o57BQ34AGjJl1R0=",
"owner": "nix-community",
"repo": "NUR",
- "rev": "d476cd0972dd6242d76374fcc277e6735715c167",
+ "rev": "2c0bc52fe14681e9ef60e3553888c4f086e46ecb",
"type": "github"
},
"original": {
@@ -783,11 +783,11 @@
]
},
"locked": {
- "lastModified": 1748469046,
- "narHash": "sha256-8bTCadTsn6GG+d4wtX+0lQlY5meGA3rdU6E9GpvJrFU=",
+ "lastModified": 1749544886,
+ "narHash": "sha256-O4WkML1B9yqe/WlZ4S3hI5h2RcsRwhEfiJeV2wPNLRE=",
"owner": "xunuwu",
"repo": "nvim-config",
- "rev": "f2127a5caa6aba90b8dc3cf2a4d7ea2af9a73580",
+ "rev": "b193c5fc7bfa935e5e9086dc3062f1e893fd99cc",
"type": "github"
},
"original": {
@@ -859,7 +859,6 @@
"sops-nix": "sops-nix",
"stylix": "stylix",
"vpn-confinement": "vpn-confinement",
- "wallpaper": "wallpaper",
"wayland-appusage": "wayland-appusage"
}
},
@@ -870,11 +869,11 @@
]
},
"locked": {
- "lastModified": 1747050424,
- "narHash": "sha256-+Z1eDiah8w3C+wZ3Rw4vWLYZEtEDp0Vo9bqJZEe6Pkw=",
+ "lastModified": 1750164640,
+ "narHash": "sha256-50JV0gzn64VaJJoXfl6qC9BXEst5PoVf3zxQD+hOAro=",
"owner": "xunuwu",
"repo": "sobercookie",
- "rev": "171f7b4b490e0e6cba8f26631888ec4d48ada8d6",
+ "rev": "cb6cbee3faf89190788c60f936aac71e7490a3f1",
"type": "github"
},
"original": {
@@ -929,11 +928,11 @@
"tinted-zed": "tinted-zed"
},
"locked": {
- "lastModified": 1748376235,
- "narHash": "sha256-LIQnskjlVHTJC5dW4xoWlMCtrKeWOPW7/8HYd8IruLA=",
+ "lastModified": 1749398498,
+ "narHash": "sha256-Usx6sGnT/D8ZnWiZg+J1OY3dp4ZssMQiN1XeXcsL/cs=",
"owner": "danth",
"repo": "stylix",
- "rev": "e38a646e5cd3d000c8fffb14632f3bb8a45dd042",
+ "rev": "5869510e48e64d916dc6905dc664a02b0f85f1bd",
"type": "github"
},
"original": {
@@ -1038,11 +1037,11 @@
"tinted-schemes": {
"flake": false,
"locked": {
- "lastModified": 1744974599,
- "narHash": "sha256-Fg+rdGs5FAgfkYNCs74lnl8vkQmiZVdBsziyPhVqrlY=",
+ "lastModified": 1748180480,
+ "narHash": "sha256-7n0XiZiEHl2zRhDwZd/g+p38xwEoWtT0/aESwTMXWG4=",
"owner": "tinted-theming",
"repo": "schemes",
- "rev": "28c26a621123ad4ebd5bbfb34ab39421c0144bdd",
+ "rev": "87d652edd26f5c0c99deda5ae13dfb8ece2ffe31",
"type": "github"
},
"original": {
@@ -1054,11 +1053,11 @@
"tinted-tmux": {
"flake": false,
"locked": {
- "lastModified": 1745111349,
- "narHash": "sha256-udV+nHdpqgkJI9D0mtvvAzbqubt9jdifS/KhTTbJ45w=",
+ "lastModified": 1748740859,
+ "narHash": "sha256-OEM12bg7F4N5WjZOcV7FHJbqRI6jtCqL6u8FtPrlZz4=",
"owner": "tinted-theming",
"repo": "tinted-tmux",
- "rev": "e009f18a01182b63559fb28f1c786eb027c3dee9",
+ "rev": "57d5f9683ff9a3b590643beeaf0364da819aedda",
"type": "github"
},
"original": {
@@ -1160,18 +1159,6 @@
"type": "github"
}
},
- "wallpaper": {
- "flake": false,
- "locked": {
- "narHash": "sha256-/TKznBlLva2h7omNRZMoIIPyVXDFhVkpzWcz2p0N51M=",
- "type": "file",
- "url": "https://cdn.donmai.us/original/43/20/__kasane_teto_and_kasane_teto_utau_and_1_more_drawn_by_maguru_white__43204cf49ef8c071c34009553d1c0455.jpg"
- },
- "original": {
- "type": "file",
- "url": "https://cdn.donmai.us/original/43/20/__kasane_teto_and_kasane_teto_utau_and_1_more_drawn_by_maguru_white__43204cf49ef8c071c34009553d1c0455.jpg"
- }
- },
"wayland-appusage": {
"inputs": {
"crane": "crane_2",
diff --git a/flake.nix b/flake.nix
index 3360a91..a8e522a 100644
--- a/flake.nix
+++ b/flake.nix
@@ -108,7 +108,5 @@
own-website.url = "github:xunuwu/xunuwu.xyz";
own-website.inputs.nixpkgs.follows = "nixpkgs";
-
- wallpaper.url = "file+https://cdn.donmai.us/original/43/20/__kasane_teto_and_kasane_teto_utau_and_1_more_drawn_by_maguru_white__43204cf49ef8c071c34009553d1c0455.jpg";
};
}
diff --git a/home/desktop/sway/__waybar.nix b/home/desktop/sway/__waybar.nix
index 3a2958d..4e31ec5 100644
--- a/home/desktop/sway/__waybar.nix
+++ b/home/desktop/sway/__waybar.nix
@@ -1,4 +1,9 @@
-{pkgs, ...}: {
+{
+ pkgs,
+ lib,
+ self,
+ ...
+}: {
programs.waybar = {
enable = true;
package = pkgs.waybar.overrideAttrs (final: prev: {
@@ -16,6 +21,7 @@
"sway/window"
];
modules-right = [
+ "custom/keyboard-state"
"tray"
"clock"
];
@@ -25,6 +31,11 @@
"sway/window" = {
max-length = 80;
};
+ "custom/keyboard-state" = {
+ return-type = "json";
+ exec = "${lib.getExe self.packages.${pkgs.system}.keyboard-state}";
+ restart-interval = "60";
+ };
clock = {
format = "{:%V|%d %a %H:%M}";
tooltip-format = "{:%a %Y-%m-%d %H:%M}\n{calendar}";
diff --git a/home/develop/langs/c.nix b/home/develop/langs/c.nix
index 8dc2430..a5de208 100644
--- a/home/develop/langs/c.nix
+++ b/home/develop/langs/c.nix
@@ -1,3 +1,9 @@
{pkgs, ...}: {
- home.packages = with pkgs; [clang-tools buckle gdb lldb];
+ home.packages = with pkgs; [
+ clang-tools
+ buckle
+ gdb
+ lldb
+ lld
+ ];
}
diff --git a/hosts/nixdesk/home.nix b/hosts/nixdesk/home.nix
index 8dafff6..63864d2 100644
--- a/hosts/nixdesk/home.nix
+++ b/hosts/nixdesk/home.nix
@@ -76,7 +76,7 @@
mode = "1920x1080@165Hz";
position = "1920 0";
# allow_tearing = "yes";
- bg = "${inputs.wallpaper.outPath} fill";
+ # bg = "${inputs.wallpaper.outPath} fill";
};
"HDMI-A-1" = {
position = "0 0";
@@ -152,6 +152,7 @@
heroic
lutris
ryubing # switch emu
+ rpcs3 # ps3 emu
prismlauncher
inputs.sobercookie.packages.${pkgs.system}.default
self.packages.${pkgs.system}.krunker
diff --git a/pkgs/default.nix b/pkgs/default.nix
index a9a2057..5c6bfd0 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -4,5 +4,6 @@
krunker = pkgs.callPackage ./krunker {};
ida-pro = pkgs.callPackage ./ida-pro {};
cartograph-cf = pkgs.callPackage ./cartograph-cf {};
+ keyboard-state = pkgs.callPackage ./keyboard-state {};
};
}
diff --git a/pkgs/keyboard-state/default.nix b/pkgs/keyboard-state/default.nix
new file mode 100644
index 0000000..db9f213
--- /dev/null
+++ b/pkgs/keyboard-state/default.nix
@@ -0,0 +1,17 @@
+{
+ rustPlatform,
+ pkg-config,
+ udev,
+}:
+rustPlatform.buildRustPackage {
+ pname = "keyboard-state";
+ version = "0.1.0";
+
+ src = ./source;
+ cargoLock.lockFile = ./source/Cargo.lock;
+
+ nativeBuildInputs = [pkg-config];
+ buildInputs = [udev];
+
+ meta.mainProgram = "keyboard-state";
+}
diff --git a/pkgs/keyboard-state/source/.gitignore b/pkgs/keyboard-state/source/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/pkgs/keyboard-state/source/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/pkgs/keyboard-state/source/Cargo.lock b/pkgs/keyboard-state/source/Cargo.lock
new file mode 100644
index 0000000..df3b8bb
--- /dev/null
+++ b/pkgs/keyboard-state/source/Cargo.lock
@@ -0,0 +1,185 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "anyhow"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
+
+[[package]]
+name = "cc"
+version = "1.2.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
+dependencies = [
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
+
+[[package]]
+name = "enumflags2"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef"
+dependencies = [
+ "enumflags2_derive",
+]
+
+[[package]]
+name = "enumflags2_derive"
+version = "0.7.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "hidapi"
+version = "2.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03b876ecf37e86b359573c16c8366bc3eba52b689884a0fc42ba3f67203d2a8b"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "libc",
+ "pkg-config",
+ "windows-sys",
+]
+
+[[package]]
+name = "keyboard-state"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "enumflags2",
+ "hidapi",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.173"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "syn"
+version = "2.0.103"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff --git a/pkgs/keyboard-state/source/Cargo.toml b/pkgs/keyboard-state/source/Cargo.toml
new file mode 100644
index 0000000..6d1773a
--- /dev/null
+++ b/pkgs/keyboard-state/source/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "keyboard-state"
+version = "0.1.0"
+edition = "2024"
+
+[dependencies]
+anyhow = "1.0.98"
+enumflags2 = "0.7.12"
+hidapi = "2.6.3"
diff --git a/pkgs/keyboard-state/source/src/main.rs b/pkgs/keyboard-state/source/src/main.rs
new file mode 100644
index 0000000..76ea034
--- /dev/null
+++ b/pkgs/keyboard-state/source/src/main.rs
@@ -0,0 +1,95 @@
+use std::thread;
+use std::time::Duration;
+
+use enumflags2::{BitFlag, bitflags};
+use hidapi::{HidApi, HidDevice, HidResult};
+
+const VENDOR_ID: u16 = 0x594d;
+const PRODUCT_ID: u16 = 0x0075;
+
+const USAGE_PAGE: u16 = 0xFF60;
+const USAGE: u16 = 0x61;
+
+#[bitflags]
+#[repr(u16)]
+#[derive(Copy, Clone, Debug, PartialEq)]
+enum Layer {
+ Base = 1 << 0,
+ Gaming = 1 << 1,
+ More = 1 << 2,
+ Extra = 1 << 3,
+}
+
+fn main() -> anyhow::Result<()> {
+ let mut api = HidApi::new()?;
+
+ let mut device: Option = None;
+
+ loop {
+ match &device {
+ Some(d) => {
+ let mut data = [0u8; 32];
+ if d.read(&mut data).is_err() {
+ eprintln!("Device disconnected. Searching for device...");
+ device = None;
+ } else {
+ let layers = Layer::from_bits_truncate(u16::from_le_bytes([data[0], data[1]]));
+
+ let short_layers: String = layers
+ .iter()
+ .map(|x| match x {
+ Layer::Base => "B",
+ Layer::Gaming => "G",
+ Layer::More => "m",
+ Layer::Extra => "e",
+ })
+ .collect();
+
+ let long_layers: String = layers
+ .iter()
+ .map(|x| match x {
+ Layer::Base => "Base",
+ Layer::Gaming => "Gaming",
+ Layer::More => "more",
+ Layer::Extra => "extra",
+ })
+ .flat_map(|elem| [", ", elem])
+ .skip(1)
+ .collect();
+
+ println!(
+ r#"{{"text":"{short_layers}", "alt": "none", "tooltip": "{long_layers}", "class": "none"}}"#
+ );
+ }
+ }
+ None => {
+ api.reset_devices()?;
+ api.add_devices(VENDOR_ID, PRODUCT_ID)?;
+ println!(
+ r#"{{"text":"N/A", "alt": "Unknown keyboard state", "tooltip": "none", "class": "none"}}"#
+ );
+
+ match api.device_list().find(|device| {
+ device.vendor_id() == VENDOR_ID
+ && device.product_id() == PRODUCT_ID
+ && device.usage_page() == USAGE_PAGE
+ && device.usage() == USAGE
+ }) {
+ Some(d) => match api.open_path(d.path()) {
+ Ok(d) => {
+ eprintln!("Device connected");
+ device = Some(d)
+ }
+ Err(e) => {
+ eprintln!("Error connecting to device: {e}");
+ thread::sleep(Duration::from_secs(2));
+ }
+ },
+ None => {
+ thread::sleep(Duration::from_secs(2));
+ }
+ }
+ }
+ }
+ }
+}