From a5ec186a591675a25aea87309549dda8bd71e411 Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Mon, 16 Oct 2023 23:09:14 +0200 Subject: [PATCH] pinwheel: Add `enable` option to `hyprland` module --- hosts/pinwheel/configuration.nix | 1 + hosts/pinwheel/modules/hyprland/default.nix | 375 ++++++++++---------- 2 files changed, 194 insertions(+), 182 deletions(-) diff --git a/hosts/pinwheel/configuration.nix b/hosts/pinwheel/configuration.nix index b9c8aa1..d6e12bb 100644 --- a/hosts/pinwheel/configuration.nix +++ b/hosts/pinwheel/configuration.nix @@ -77,6 +77,7 @@ mod = { nix-index.enable = true; greetd.enable = true; + hyprland.enable = true; git.enable = true; openvpn.enable = true; go.enable = true; diff --git a/hosts/pinwheel/modules/hyprland/default.nix b/hosts/pinwheel/modules/hyprland/default.nix index 5da9f72..e9e3841 100644 --- a/hosts/pinwheel/modules/hyprland/default.nix +++ b/hosts/pinwheel/modules/hyprland/default.nix @@ -1,201 +1,212 @@ -{ pkgs, ... }: +{ pkgs, lib, config, ... }: +let + enabled = config.mod.hyprland.enable; +in { - home-manager.users.alex = { - wayland.windowManager.hyprland = { - enable = true; + options = { + mod.hyprland= { + enable = lib.mkEnableOption "enable hyprland module"; + }; + }; - xwayland = { + config = lib.mkIf enabled { + home-manager.users.alex = { + wayland.windowManager.hyprland = { enable = true; - }; - - extraConfig = '' - exec-once=waybar - - env = GDK_DPI_SCALE,1.5 - env = XCURSOR_SIZE,64 - - workspace = 1, monitor:HDMI-A-1 - workspace = 2, monitor:HDMI-A-1 - workspace = 3, monitor:HDMI-A-1 - workspace = 4, monitor:HDMI-A-1 - workspace = 5, monitor:HDMI-A-1 - workspace = 6, monitor:eDP-1 - workspace = 7, monitor:eDP-1 - workspace = 8, monitor:eDP-1 - workspace = 9, monitor:eDP-1 - workspace = 10, monitor:eDP-1 - ''; - - settings = { - "$mod" = "SUPER"; - - animations.enabled = false; xwayland = { - force_zero_scaling = true; + enable = true; }; - input = { - kb_layout = "se"; + extraConfig = '' + exec-once=waybar - # 2 - Cursor focus will be detached from keyboard focus. Clicking on a window will move keyboard focus to that window. - follow_mouse = 2; + env = GDK_DPI_SCALE,1.5 + env = XCURSOR_SIZE,64 - sensitivity = 0.30; - touchpad = { - natural_scroll = false; - tap-and-drag = false; + workspace = 1, monitor:HDMI-A-1 + workspace = 2, monitor:HDMI-A-1 + workspace = 3, monitor:HDMI-A-1 + workspace = 4, monitor:HDMI-A-1 + workspace = 5, monitor:HDMI-A-1 + workspace = 6, monitor:eDP-1 + workspace = 7, monitor:eDP-1 + workspace = 8, monitor:eDP-1 + workspace = 9, monitor:eDP-1 + workspace = 10, monitor:eDP-1 + ''; + + settings = { + "$mod" = "SUPER"; + + animations.enabled = false; + + xwayland = { + force_zero_scaling = true; + }; + + input = { + kb_layout = "se"; + + # 2 - Cursor focus will be detached from keyboard focus. Clicking on a window will move keyboard focus to that window. + follow_mouse = 2; + + sensitivity = 0.30; + touchpad = { + natural_scroll = false; + tap-and-drag = false; + }; + }; + + general = { + gaps_in = 0; # gaps between windows + gaps_out = 0; # gaps between windows and monitor edges + + layout = "dwindle"; + }; + + dwindle = { + force_split = 2; + no_gaps_when_only = 1; + }; + + decoration = { + shadow_offset = "0 5"; + "col.shadow" = "rgba(00000099)"; + }; + + bind = let + ws = x: + let n = if (x + 1) < 10 + then (x + 1) + else 0; + in + builtins.toString n; + + select = builtins.genList (x: "$mod, ${ws x}, workspace, ${builtins.toString (x + 1)}") 10; + move = builtins.genList (x: "$mod SHIFT, ${ws x}, movetoworkspacesilent, ${builtins.toString (x + 1)}") 10; + + magnifier = pkgs.writeShellScript "magnifier" '' + CURRENT=$(${pkgs.hyprland}/bin/hyprctl getoption misc:cursor_zoom_factor -j | jq .float) + DELTA=0.1 + + UPDATED=1 + case $1 in + --increase) + UPDATED=$(echo $CURRENT + $DELTA | ${pkgs.bc}/bin/bc) ;; + --decrease) + UPDATED=$(echo $CURRENT - $DELTA | ${pkgs.bc}/bin/bc) ;; + --reset) + UPDATED=1 + esac + + if (( $(echo "$UPDATED < 1" | bc) )); then UPDATED=1; fi + ${pkgs.hyprland}/bin/hyprctl keyword misc:cursor_zoom_factor $UPDATED + ''; + in + select ++ move ++ [ + "$mod, ESCAPE, killactive" + + "$mod, f, fullscreen, 1" + "$mod SHIFT, f, togglefloating, active" + + "$mod, h, movefocus, l" + "$mod, j, movefocus, d" + "$mod, k, movefocus, u" + "$mod, l, movefocus, r" + + "$mod SHIFT_CONTROL, 1, exec, ${magnifier} --increase" + "$mod SHIFT_CONTROL, 2, exec, ${magnifier} --decrease" + "$mod SHIFT_CONTROL, 3, exec, ${magnifier} --reset" + ]; + + bindm = [ + # mouse movements + "$mod, mouse:272, movewindow" # left click + "$mod, mouse:273, resizewindow" # right click + ]; + + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + cursor_zoom_factor = 1; + cursor_zoom_rigid = true; }; }; - - general = { - gaps_in = 0; # gaps between windows - gaps_out = 0; # gaps between windows and monitor edges - - layout = "dwindle"; - }; - - dwindle = { - force_split = 2; - no_gaps_when_only = 1; - }; - - decoration = { - shadow_offset = "0 5"; - "col.shadow" = "rgba(00000099)"; }; - bind = let - ws = x: - let n = if (x + 1) < 10 - then (x + 1) - else 0; - in - builtins.toString n; + home.packages = [ pkgs.jq pkgs.bc ]; + }; - select = builtins.genList (x: "$mod, ${ws x}, workspace, ${builtins.toString (x + 1)}") 10; - move = builtins.genList (x: "$mod SHIFT, ${ws x}, movetoworkspacesilent, ${builtins.toString (x + 1)}") 10; + # openGL is needed for wayland/hyprland + hardware.opengl.enable = true; - magnifier = pkgs.writeShellScript "magnifier" '' - CURRENT=$(${pkgs.hyprland}/bin/hyprctl getoption misc:cursor_zoom_factor -j | jq .float) - DELTA=0.1 - - UPDATED=1 - case $1 in - --increase) - UPDATED=$(echo $CURRENT + $DELTA | ${pkgs.bc}/bin/bc) ;; - --decrease) - UPDATED=$(echo $CURRENT - $DELTA | ${pkgs.bc}/bin/bc) ;; - --reset) - UPDATED=1 - esac - - if (( $(echo "$UPDATED < 1" | bc) )); then UPDATED=1; fi - ${pkgs.hyprland}/bin/hyprctl keyword misc:cursor_zoom_factor $UPDATED - ''; - in - select ++ move ++ [ - "$mod, ESCAPE, killactive" - - "$mod, f, fullscreen, 1" - "$mod SHIFT, f, togglefloating, active" - - "$mod, h, movefocus, l" - "$mod, j, movefocus, d" - "$mod, k, movefocus, u" - "$mod, l, movefocus, r" - - "$mod SHIFT_CONTROL, 1, exec, ${magnifier} --increase" - "$mod SHIFT_CONTROL, 2, exec, ${magnifier} --decrease" - "$mod SHIFT_CONTROL, 3, exec, ${magnifier} --reset" - ]; - - bindm = [ - # mouse movements - "$mod, mouse:272, movewindow" # left click - "$mod, mouse:273, resizewindow" # right click - ]; - - misc = { - disable_hyprland_logo = true; - disable_splash_rendering = true; - cursor_zoom_factor = 1; - cursor_zoom_rigid = true; - }; + systemd.user.services.hyprland-monitors = { + # systemctl --user restart hyprland-monitors.service + # journalctl --user -u hyprland-monitors.service -e -f + unitConfig = { + Description = "handles hyprland monitor connect/disconnect"; }; + + wantedBy = [ "graphical-session.target" ]; + requires = [ "graphical-session.target" ]; + after = [ "graphical-session.target" ]; + + path = [ + pkgs.hyprland + pkgs.socat + pkgs.jq + pkgs.bc + pkgs.libnotify + ]; + + script = '' + update() { + # waybar is buggy and duplicates workspaces somtimes + pkill waybar && waybar & disown + + HDMI_STATUS=$(cat /sys/class/drm/card0-HDMI-A-1/status) + + INTERNAL_WIDTH=1920 + INTERNAL_HEIGHT=1200 + + if [ $HDMI_STATUS = "connected" ]; then + notify-send "Using external and laptop monitor" + + hyprctl keyword monitor HDMI-A-1,preferred,0x0,1 + + HDMI=$(hyprctl monitors -j | jq '.[] | select(.name=="HDMI-A-1")') + HDMI_WIDTH=$(echo $HDMI | jq .width) + HDMI_HEIGHT=$(echo $HDMI | jq .height) + + INTERNAL_POS_X=$(echo "($HDMI_WIDTH - $INTERNAL_WIDTH) / 2" | bc) + if (( $(echo "$INTERNAL_POS_X < 0" | bc) )); then INTERNAL_POS_X=0; fi + INTERNAL_POS_Y=$HDMI_HEIGHT + + hyprctl keyword monitor eDP-1,$INTERNAL_WIDTH"x"$INTERNAL_HEIGHT,$INTERNAL_POS_X"x"$INTERNAL_POS_Y,1 + else + notify-send "Using only laptop monitor" + + hyprctl --batch "keyword monitor HDMI-A,disable; keyword monitor eDP-1,$INTERNAL_WIDTH"x"$INTERNAL_HEIGHT,0x0,1" + fi + } + + handle() { + case $1 in + monitoradded*|monitorremoved*) + echo "handling event: \"$1\"" + update ;; + esac + } + + echo "Starting service with instance \"$HYPRLAND_INSTANCE_SIGNATURE\"" + echo "$(hyprctl monitors)" + + # Do initial configuration + update + + socat -U - UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do handle "$line"; done + ''; }; - - home.packages = [ pkgs.jq pkgs.bc ]; - }; - - # openGL is needed for wayland/hyprland - hardware.opengl.enable = true; - - systemd.user.services.hyprland-monitors = { - # systemctl --user restart hyprland-monitors.service - # journalctl --user -u hyprland-monitors.service -e -f - unitConfig = { - Description = "handles hyprland monitor connect/disconnect"; - }; - - wantedBy = [ "graphical-session.target" ]; - requires = [ "graphical-session.target" ]; - after = [ "graphical-session.target" ]; - - path = [ - pkgs.hyprland - pkgs.socat - pkgs.jq - pkgs.bc - pkgs.libnotify - ]; - - script = '' - update() { - # waybar is buggy and duplicates workspaces somtimes - pkill waybar && waybar & disown - - HDMI_STATUS=$(cat /sys/class/drm/card0-HDMI-A-1/status) - - INTERNAL_WIDTH=1920 - INTERNAL_HEIGHT=1200 - - if [ $HDMI_STATUS = "connected" ]; then - notify-send "Using external and laptop monitor" - - hyprctl keyword monitor HDMI-A-1,preferred,0x0,1 - - HDMI=$(hyprctl monitors -j | jq '.[] | select(.name=="HDMI-A-1")') - HDMI_WIDTH=$(echo $HDMI | jq .width) - HDMI_HEIGHT=$(echo $HDMI | jq .height) - - INTERNAL_POS_X=$(echo "($HDMI_WIDTH - $INTERNAL_WIDTH) / 2" | bc) - if (( $(echo "$INTERNAL_POS_X < 0" | bc) )); then INTERNAL_POS_X=0; fi - INTERNAL_POS_Y=$HDMI_HEIGHT - - hyprctl keyword monitor eDP-1,$INTERNAL_WIDTH"x"$INTERNAL_HEIGHT,$INTERNAL_POS_X"x"$INTERNAL_POS_Y,1 - else - notify-send "Using only laptop monitor" - - hyprctl --batch "keyword monitor HDMI-A,disable; keyword monitor eDP-1,$INTERNAL_WIDTH"x"$INTERNAL_HEIGHT,0x0,1" - fi - } - - handle() { - case $1 in - monitoradded*|monitorremoved*) - echo "handling event: \"$1\"" - update ;; - esac - } - - echo "Starting service with instance \"$HYPRLAND_INSTANCE_SIGNATURE\"" - echo "$(hyprctl monitors)" - - # Do initial configuration - update - - socat -U - UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do handle "$line"; done - ''; }; }