From 45a49b1529bbc7214cf93bf51b4ef4cf2e515cf1 Mon Sep 17 00:00:00 2001 From: lightly-toasted Date: Mon, 11 Aug 2025 11:45:21 +0900 Subject: [PATCH] feat: add mouse actions Refs: 302185f6a873209ea51a26b314faa24c45cd03ac --- home/toast/home.nix | 1 + home/toast/programs/hyprland.nix | 12 ++++-- .../mouse-actions/actions/autoclick.nix | 40 +++++++++++++++++++ .../programs/mouse-actions/actions/deafen.nix | 13 ++++++ .../mouse-actions/actions/default.nix | 7 ++++ .../mouse-actions/actions/sober-lag.nix | 27 +++++++++++++ home/toast/programs/mouse-actions/cycle.nix | 29 ++++++++++++++ home/toast/programs/mouse-actions/default.nix | 18 +++++++++ home/toast/programs/mouse-actions/run.nix | 31 ++++++++++++++ home/toast/programs/waybar/default.nix | 11 ++++- hosts/nixos/modules/programs.nix | 1 + hosts/nixos/modules/users.nix | 2 +- 12 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 home/toast/programs/mouse-actions/actions/autoclick.nix create mode 100644 home/toast/programs/mouse-actions/actions/deafen.nix create mode 100644 home/toast/programs/mouse-actions/actions/default.nix create mode 100644 home/toast/programs/mouse-actions/actions/sober-lag.nix create mode 100644 home/toast/programs/mouse-actions/cycle.nix create mode 100644 home/toast/programs/mouse-actions/default.nix create mode 100644 home/toast/programs/mouse-actions/run.nix diff --git a/home/toast/home.nix b/home/toast/home.nix index 112adc5..f89e71c 100644 --- a/home/toast/home.nix +++ b/home/toast/home.nix @@ -20,6 +20,7 @@ ./programs/waybar ./programs/dunst.nix ./programs/keepassxc.nix + ./programs/mouse-actions ]; home = { diff --git a/home/toast/programs/hyprland.nix b/home/toast/programs/hyprland.nix index 3e70826..09e698a 100644 --- a/home/toast/programs/hyprland.nix +++ b/home/toast/programs/hyprland.nix @@ -5,6 +5,7 @@ pkgs.tofi ]; + programs.mouse-actions.enable = true; wayland.windowManager.hyprland = { enable = true; package = pkgs.hyprland; @@ -23,10 +24,10 @@ "LIBVA_DRIVER_NAME,nvidia" "__GLX_VENDOR_LIBRARY_NAME,nvidia" "QT_QPA_PLATFORM,wayland" - "GTK_IM_MODULE,kime" - "QT_IM_MODULE,kime" - "XMODIFIERS,@im=kime" - ]; + "GTK_IM_MODULE,kime" + "QT_IM_MODULE,kime" + "XMODIFIERS,@im=kime" + ]; bind = [ "$mod, Q, exec, $terminal" @@ -71,6 +72,9 @@ "$mod SHIFT, S, exec, env HYPRSHOT_DIR=/data/Backup/Screenshots hyprshot -m region" "$mod SHIFT, E, exec, ~/bin/powermenu.sh" + + "$mod, mouse:277, exec, cycle-mouse-action" + ", mouse:277, exec, run-mouse-action" ]; bindel = [ diff --git a/home/toast/programs/mouse-actions/actions/autoclick.nix b/home/toast/programs/mouse-actions/actions/autoclick.nix new file mode 100644 index 0000000..7d625df --- /dev/null +++ b/home/toast/programs/mouse-actions/actions/autoclick.nix @@ -0,0 +1,40 @@ +{ pkgs, ... }: + +let + script = pkgs.writeShellScriptBin "autoclick-action" '' + if ! command -v ydotool >/dev/null 2>&1; then + notify-send -r 120000 "Autoclicker" "This tool requires ydotool to be installed on your system." + fi + + AUTOCLICK_FILE="/run/user/$(id -u)/autoclick" + + if [ ! -f "$AUTOCLICK_FILE" ]; then + echo "1" > "$AUTOCLICK_FILE" + fi + + current=$(cat "$AUTOCLICK_FILE") + if [ "$current" = "0" ]; then + echo "1" > "$AUTOCLICK_FILE" + notify-send -r 120000 "Autoclicker" "Stopped" + exit 0 + else + echo "0" > "$AUTOCLICK_FILE" + notify-send -r 120000 "Autoclicker" "Started" + fi + + while :; do + line=$(cat "$AUTOCLICK_FILE") + if [ "$line" = "0" ]; then + ydotool click --next-delay 25 0xC0 > /dev/null 2>&1 + else + break + fi + done + ''; +in +{ + package = pkgs.symlinkJoin { + name = "autoclick-action"; + paths = [ script pkgs.libnotify ]; + }; +} diff --git a/home/toast/programs/mouse-actions/actions/deafen.nix b/home/toast/programs/mouse-actions/actions/deafen.nix new file mode 100644 index 0000000..ba9d867 --- /dev/null +++ b/home/toast/programs/mouse-actions/actions/deafen.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +let + script = pkgs.writeShellScriptBin "deafen-action" '' + hyprctl dispatch sendshortcut CTRL+SHIFT, D, 'class:^(vesktop)$' + ''; +in +{ + package = pkgs.symlinkJoin { + name = "deafen-action"; + paths = [ script pkgs.hyprland ]; + }; +} diff --git a/home/toast/programs/mouse-actions/actions/default.nix b/home/toast/programs/mouse-actions/actions/default.nix new file mode 100644 index 0000000..fbcbe28 --- /dev/null +++ b/home/toast/programs/mouse-actions/actions/default.nix @@ -0,0 +1,7 @@ +{ pkgs }: + +{ + autoclick = import ./autoclick.nix { inherit pkgs; }; + deafen = import ./deafen.nix { inherit pkgs; }; + sober-lag = import ./sober-lag.nix { inherit pkgs; }; +} diff --git a/home/toast/programs/mouse-actions/actions/sober-lag.nix b/home/toast/programs/mouse-actions/actions/sober-lag.nix new file mode 100644 index 0000000..c13b77a --- /dev/null +++ b/home/toast/programs/mouse-actions/actions/sober-lag.nix @@ -0,0 +1,27 @@ +{ pkgs, ... }: + +let + script = pkgs.writeShellScriptBin "sober-lag-action" '' + roblox_pid=$(ps aux | grep "[s]ober --" | sort -k3 -nr | head -n 1 | awk '{print $2}') + if [ -z "$roblox_pid" ]; then + notify-send "sober-lag.sh" "Sober is not running." + exit 1 + fi + + pgid=$(ps -o pgid= -p "$roblox_pid" | xargs) + if [ -z "$pgid" ]; then + notify-send "sober-lag.sh" "Could not find PGID for PID $roblox_pid." + exit 1 + fi + + kill -STOP -- "-$pgid" + sleep 0.2 + kill -CONT -- "-$pgid" + ''; +in +{ + package = pkgs.symlinkJoin { + name = "sober-lag-action"; + paths = [ script pkgs.procps pkgs.gawk pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.libnotify ]; + }; +} diff --git a/home/toast/programs/mouse-actions/cycle.nix b/home/toast/programs/mouse-actions/cycle.nix new file mode 100644 index 0000000..d37c39b --- /dev/null +++ b/home/toast/programs/mouse-actions/cycle.nix @@ -0,0 +1,29 @@ +{ pkgs }: + +let + script = pkgs.writeShellScriptBin "cycle-mouse-action" '' + STATE_FILE="$HOME/.config/mouse-actions/state" + mkdir -p "$(dirname "$STATE_FILE")" + + if [ -f "$STATE_FILE" ]; then + CURRENT_ACTION=$(cat "$STATE_FILE") + else + CURRENT_ACTION="deafen" + fi + + case "$CURRENT_ACTION" in + "deafen") NEW_ACTION="sober-lag" ;; + "sober-lag") NEW_ACTION="autoclick" ;; + *) NEW_ACTION="deafen" + esac + + echo "$NEW_ACTION" > "$STATE_FILE.tmp" + mv "$STATE_FILE.tmp" "$STATE_FILE" + ''; +in +{ + package = pkgs.symlinkJoin { + name = "cycle-mouse-action"; + paths = [ script pkgs.libnotify ]; + }; +} diff --git a/home/toast/programs/mouse-actions/default.nix b/home/toast/programs/mouse-actions/default.nix new file mode 100644 index 0000000..29d4e49 --- /dev/null +++ b/home/toast/programs/mouse-actions/default.nix @@ -0,0 +1,18 @@ +{ lib, pkgs, config, ... }: + +{ + options.programs.mouse-actions.enable = lib.mkEnableOption "mouse-actions"; + config = lib.mkIf config.programs.mouse-actions.enable + (let + cfg = config.programs.mouse-actions; + actions = import ./actions { inherit pkgs; }; + + cycle-script = import ./cycle.nix { inherit pkgs; }; + run-script = import ./run.nix { inherit pkgs; actions = actions; }; + in { + home.packages = [ + cycle-script.package + run-script.package + ]; + }); +} diff --git a/home/toast/programs/mouse-actions/run.nix b/home/toast/programs/mouse-actions/run.nix new file mode 100644 index 0000000..91263ec --- /dev/null +++ b/home/toast/programs/mouse-actions/run.nix @@ -0,0 +1,31 @@ +{ pkgs, actions }: + +let + script = pkgs.writeShellScriptBin "run-mouse-action" '' + STATE_FILE="$HOME/.config/mouse-actions/state" + + if [ ! -f "$STATE_FILE" ]; then + exit 0 + fi + + ACTION_NAME=$(<"$STATE_FILE") + + case "$ACTION_NAME" in + "deafen") + systemd-run --user ${actions.deafen.package}/bin/deafen-action + ;; + "sober-lag") + systemd-run --user ${actions.sober-lag.package}/bin/sober-lag-action + ;; + "autoclick") + systemd-run --user ${actions.autoclick.package}/bin/autoclick-action + ;; + esac + ''; +in +{ + package = pkgs.symlinkJoin { + name = "run-mouse-action"; + paths = [ script pkgs.systemd ]; + }; +} diff --git a/home/toast/programs/waybar/default.nix b/home/toast/programs/waybar/default.nix index 2421cb4..2462e2b 100644 --- a/home/toast/programs/waybar/default.nix +++ b/home/toast/programs/waybar/default.nix @@ -6,7 +6,7 @@ position = "top"; height = 5; output = "HDMI-A-1"; - modules-left = [ ]; + modules-left = [ "custom/mouse-actions" ]; modules-center = [ ]; modules-right = [ "pulseaudio" @@ -61,6 +61,15 @@ system = true; user = false; }; + + "custom/mouse-actions" = { + format = " {}"; + exec = "tail -n 1 -F ~/.config/mouse-actions/state 2>/dev/null"; + on-click = "run-mouse-action"; + on-scroll-down = "cycle-mouse-action"; + return-type = "text"; + restart-interval = false; + }; }]; }; } diff --git a/hosts/nixos/modules/programs.nix b/hosts/nixos/modules/programs.nix index d7087ad..e0dd248 100644 --- a/hosts/nixos/modules/programs.nix +++ b/hosts/nixos/modules/programs.nix @@ -15,4 +15,5 @@ }; programs.xfconf.enable = true; programs.ssh.startAgent = true; + programs.ydotool.enable = true; } diff --git a/hosts/nixos/modules/users.nix b/hosts/nixos/modules/users.nix index fce86d0..010ae5d 100644 --- a/hosts/nixos/modules/users.nix +++ b/hosts/nixos/modules/users.nix @@ -4,7 +4,7 @@ users.users.toast = { isNormalUser = true; description = "toast"; - extraGroups = [ "networkmanager" "wheel" ]; + extraGroups = [ "networkmanager" "wheel" "ydotool" ]; packages = with pkgs; []; shell = pkgs.zsh; };