diff --git a/README.md b/README.md index 5ff367f..100bca8 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Easymotion is basically a single dispatcher that brings up window labels and the `bind = SUPER, z, easymotion, action:hyprctl dispatch focuswindow address:{}` This bind will bring up easymotion with SUPER-z. Once you select a window the window -will focus. If you want to change the command, the selected window's address is substituted where "{}" occurs. +will focus. If you want to change the command, the selected window's address is substituted where "{}" occurs. You can configure the appearance of the labels. Defaults are as follows: @@ -28,7 +28,7 @@ plugin { #font to use for the label. This is passed directly to the pango font description textfont=Sans - + #padding around the text (inside the label box) size in pixels, adjusted for #monitor scaling. This is the same format as hyprland's gapsin/gapsout workspace layout rule #example: textpadding=2 5 5 2 (spaces not commas) @@ -59,10 +59,34 @@ Every one of these variables is also settable via the dispatcher, so you can cre 1. Run `hyprpm add https://github.com/zakk4223/hyprland-easymotion` and wait for hyprpm to build the plugin. 2. Run `hyprpm enable hyprEasymotion` +## NixOS (Flakes) +Please note, you should *also have hyprland as a flake input*. +Add this repo to your flake inputs: +```nix +inputs = { + hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; + hyprland-easymotion = { + url = "github:zakk4223/hyprland-easymotion"; + inputs.hyprland.follows = "hyprland"; + }; + # ... +}; +outputs = { self, hyprland, ... } @ inputs: + # ... +``` +Add the plugin to your Hyprland Home Manager config: +```nix +wayland.windowManager.hyprland = { + plugins = [ + inputs.hyprland-easymotion.packages.${pkgs.system}.hyprland-easymotion + ]; + # ... +}; +``` # TODO -- [ ] Blur? -- [ ] Allow multi-letter labels? -- [ ] Fixed/static label box sizing +- [ ] Blur? +- [ ] Allow multi-letter labels? +- [ ] Fixed/static label box sizing - [ ] Location of label in window (edges etc) - [ ] Auto label placement that tries to avoid being occluded diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..dde91a5 --- /dev/null +++ b/flake.lock @@ -0,0 +1,284 @@ +{ + "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1726665257, + "narHash": "sha256-rEzEZtd3iyVo5RJ1OGujOlnywNf3gsrOnjAn1NLciD4=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "752d0fbd141fabb5a1e7f865199b80e6e76f8d8e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1722623071, + "narHash": "sha256-sLADpVgebpCBFXkA1FlCXtvEPu1tdEsTfqK1hfeHySE=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "912d56025f03d41b1ad29510c423757b4379eb1c", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs", + "systems": "systems", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1726995313, + "narHash": "sha256-HTbsXJDFugdQ794d1Bnh8eRSY7AlunIxd7jFW9kkKNM=", + "ref": "refs/heads/main", + "rev": "e5ff19ac0f2c8d53a0c847d06a17676e636d6447", + "revCount": 5247, + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" + }, + "original": { + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "xdph", + "nixpkgs" + ], + "systems": [ + "hyprland", + "xdph", + "systems" + ] + }, + "locked": { + "lastModified": 1721326555, + "narHash": "sha256-zCu4R0CSHEactW9JqYki26gy8h9f6rHmSwj4XJmlHgg=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "5a11232266bf1a1f5952d5b179c3f4b2facaaa84", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1725997860, + "narHash": "sha256-d/rZ/fHR5l1n7PeyLw0StWMNLXVU9c4HFyfskw568so=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "dfeb5811dd6485490cce18d6cc1e38a055eea876", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1724966483, + "narHash": "sha256-WXDgKIbzjYKczxSZOsJplCS1i1yrTUpsDPuJV/xpYLo=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "8976e3f6a5357da953a09511d0c7f6a890fb6ec2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1721324119, + "narHash": "sha256-SOOqIT27/X792+vsLSeFdrNTF+OSRp5qXv6Te+fb2Qg=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "a048a6cb015340bd82f97c1f40a4b595ca85cc30", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1725983898, + "narHash": "sha256-4b3A9zPpxAxLnkF9MawJNHDtOOl6ruL0r6Og1TEDGCE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1355a0cbfeac61d785b7183c0caaec1f97361b43", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1726755586, + "narHash": "sha256-PmUr/2GQGvFTIJ6/Tvsins7Q43KTMvMFhvG6oaYK+Wk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "c04d5652cfa9742b1d519688f65d1bbccea9eb7e", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "hyprland": "hyprland", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": "hyprland-protocols", + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1726046979, + "narHash": "sha256-6SEsjurq9cdTkITA6d49ncAJe4O/8CgRG5/F//s6Xh8=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "e695669fd8e1d1be9eaae40f35e00f8bd8b64c18", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..645aa4f --- /dev/null +++ b/flake.nix @@ -0,0 +1,45 @@ +# Nix config informed by VirtCode's 'Dynamic Cursor' +# https://github.com/VirtCode/hypr-dynamic-cursors +{ + description = "Easymotion, for hyprland"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1"; + }; + + outputs = { + self, + nixpkgs, + ... + } @ inputs: let + forAllSystems = function: + nixpkgs.lib.genAttrs [ + "x86_64-linux" + ] (system: function nixpkgs.legacyPackages.${system}); + in { + packages = forAllSystems (pkgs: { + default = self.packages.${pkgs.system}.hyprland-easymotion; + hyprland-easymotion = pkgs.stdenvNoCC.mkDerivation rec { + name = "hyprland-easymotion"; + pname = name; + src = ./.; + nativeBuildInputs = inputs.hyprland.packages.${pkgs.system}.hyprland.nativeBuildInputs ++ [inputs.hyprland.packages.${pkgs.system}.hyprland pkgs.gcc13]; + buildInputs = inputs.hyprland.packages.${pkgs.system}.hyprland.buildInputs; + + dontUseCmakeConfigure = true; + dontUseMesonConfigure = true; + dontUseNinjaBuild = true; + dontUseNinjaInstall = true; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/lib" + cp -r ./hypreasymotion.so "$out/lib/libhyprland-easymotion.so" + runHook postInstall + ''; + }; + }); + }; +}