{ homeManager, inputs, moduleNameSpace, ... }: { config, lib, pkgs, ... }: let cfg = config.${moduleNameSpace}.mango; snip = pkgs.writeShellScript "snip" '' case $1 in full) ${pkgs.grim}/bin/grim - | wl-copy ;; selection) GEOM=$(${pkgs.slurp}/bin/slurp) || exit ${pkgs.grim}/bin/grim -g "$GEOM" - | wl-copy ;; esac ''; smart-alacritty = pkgs.writeShellScript "smart-alacritty" '' alacritty msg create-window || exec alacritty ''; smart-ghostty = pkgs.writeShellScript "smart-ghostty" '' ghostty +new-window || exec ghostty ''; terminal = if config.beeMods.terminal.default == "alacritty" then smart-alacritty else if config.beeMods.terminal.default == "ghostty" then smart-ghostty else config.beeMods.terminal.default; in { imports = if homeManager then [ inputs.mango.hmModules.mango ] else [ inputs.mango.nixosModules.mango ]; options.${moduleNameSpace}.mango = { enable = lib.mkEnableOption "mango setup"; animations = lib.mkEnableOption "Uiiiiiiiiiii"; waybar = lib.mkEnableOption "Enable waybar"; window = { blur = { enable = lib.mkEnableOption "Enable window blur"; passes = lib.mkOption { type = lib.types.int; default = 1; }; radius = lib.mkOption { type = lib.types.int; default = 10; }; }; shadows = lib.mkEnableOption "Enable window drop shadows"; border_radius = lib.mkOption { type = lib.types.int; default = 0; description = "Border radius"; }; opacity = lib.mkOption { type = lib.types.number; default = 1.0; description = "Window opacity"; }; }; }; config = lib.mkIf cfg.enable ( if homeManager then { wayland.windowManager.mango = { enable = true; settings = '' ${lib.optionalString (config.beeMods.matugen.enable) '' source=~/.config/mango/mango-colors.conf ''} # Window effect blur=${if cfg.window.blur.enable then "1" else "0"} blur_layer=0 blur_optimized=1 blur_params_num_passes = ${toString cfg.window.blur.passes} blur_params_radius = ${toString cfg.window.blur.radius} blur_params_noise = 0.02 blur_params_brightness = 0.9 blur_params_contrast = 0.9 blur_params_saturation = 1.2 shadows=${if cfg.window.shadows then "1" else "0"} layer_shadows = 0 shadow_only_floating = 1 shadows_size = 10 shadows_blur = 15 shadows_position_x = 0 shadows_position_y = 0 border_radius=${toString cfg.window.border_radius} no_radius_when_single=0 ${ if (cfg.window.blur.enable && cfg.window.opacity == 1.0) then '' focused_opacity=0.91 unfocused_opacity=0.91 '' else '' focused_opacity=${toString cfg.window.opacity} unfocused_opacity=${toString cfg.window.opacity} '' } # Animation Configuration(support type:zoom,slide) # tag_animation_direction: 1-horizontal,0-vertical animations=${if cfg.animations then "1" else "0"} layer_animations=0 animation_type_open=slide animation_type_close=zoom animation_fade_in=0 animation_fade_out=1 tag_animation_direction=1 zoom_initial_ratio=0.8 zoom_end_ratio=0.8 fadein_begin_opacity=0.5 fadeout_begin_opacity=0.5 animation_duration_move=300 animation_duration_open=350 animation_duration_tag=350 animation_duration_close=150 animation_duration_focus=0 animation_curve_open=0.05,0.7,0.1,1.0 animation_curve_move=0.46,1.0,0.29,1 animation_curve_tag=0.46,1.0,0.29,1 animation_curve_close=0.0,0.0,1.0,1.0 animation_curve_focus=0.05,0.7,0.1,1.0 animation_curve_opafadeout=0.5,0.5,0.5,0.5 animation_curve_opafadein=0.46,1.0,0.29,1 # Scroller configuration scroller_structs=15 scroller_default_proportion=0.8 scroller_focus_center=0 scroller_prefer_center=0 edge_scroller_pointer_focus=1 scroller_default_proportion_single=1.0 scroller_ignore_proportion_single=0 scroller_proportion_preset=0.5,0.8,1.0 # Master-Stack Layout Setting new_is_master=0 default_mfact=0.56 default_nmaster=1 smartgaps=0 # Overview Setting hotarea_size=10 enable_hotarea=0 ov_tab_mode=0 overviewgappi=5 overviewgappo=30 # Misc no_border_when_single=0 axis_bind_apply_timeout=100 focus_on_activate=1 idleinhibit_ignore_visible=0 sloppyfocus=1 warpcursor=1 focus_cross_monitor=0 focus_cross_tag=0 enable_floating_snap=0 snap_distance=30 # cursor_size=24 drag_tile_to_tile=1 xwayland_persistence=0 syncobj_enable=0 allow_tearing=0 # keyboard repeat_delay=300; repeat_rate=50; numlockon=0 xkb_rules_layout=us # Trackpad # need relogin to make it apply disable_trackpad=0 tap_to_click=1 tap_and_drag=1 drag_lock=1 trackpad_natural_scrolling=1 disable_while_typing=1 left_handed=0 middle_button_emulation=0 swipe_min_threshold=1 # mouse # need relogin to make it apply mouse_natural_scrolling=0 windowrule=tags:1,appid:^(foot|footclient|alacritty)$ windowrule=tags:2,appid:^(zen|firefox|obsidian)$ windowrule=tags:3,appid:^(vesktop|discord|thunderbird|Element|equibop)$ windowrule=tags:4,appid:^steam$ windowrule=scroller_proportion:0.3,appid:^steam$,title:^Friends List$ windowrule=scroller_proportion:0.5,appid:^steam$,title:.*(Settings|Properties).* windowrule=isfloating:1,appid:^steam$,title:^Steam - News$ windowrule=isfloating:1,appid:^(org.gnome.Calculator|org.pulseaudio.pavucontrol)$ windowrule=isoverlay:1,appid:^com.gabm.satty$ # Appearance gappih=5 gappiv=5 gappoh=5 gappov=5 scratchpad_width_ratio=0.8 scratchpad_height_ratio=0.9 borderpx=2 # layout support: # tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller tagrule=id:1,layout_name:tgmix tagrule=id:2,layout_name:scroller tagrule=id:3,layout_name:scroller tagrule=id:4,layout_name:scroller tagrule=id:5,layout_name:grid tagrule=id:6,layout_name:tile tagrule=id:7,layout_name:tile tagrule=id:8,layout_name:tile tagrule=id:9,layout_name:tile # Key Bindings # key name refer to `xev` or `wev` command output, # mod keys name: super,ctrl,alt,shift,none # reload config bind=SUPER,r,reload_config bind=SUPER,Return,spawn,${terminal} # bind=SUPER,v,spawn,clipvault list | rofi -dmenu -display-columns 2 | clipvault get | wl-copy bind=SUPER,a,spawn,rofi -show drun bind=SUPER,period,spawn,rofi -show emoji -modi emoji bind=ALT,F4,spawn,wlogout -C ~/.config/wlogout/style.css -l ~/.config/wlogout/layout -b 6 --protocol layer-shell bind=SUPER,y,spawn,wall-picker bind=SUPER,F12,spawn,gnome-calculator bind=SUPER,b,spawn,zen bind=SUPER,e,spawn,nautilus # exit bind=SUPER,m,quit bind=SUPER,q,killclient, # switch window focus bind=SUPER,h,focusdir,left bind=SUPER,l,focusdir,right bind=SUPER,k,focusdir,up bind=SUPER,j,focusdir,down bind=NONE,Print,spawn,${snip} full bind=SUPER,Print,spawn,${snip} selection # swap window bind=SUPER+SHIFT,k,exchange_client,up bind=SUPER+SHIFT,j,exchange_client,down bind=SUPER+SHIFT,h,exchange_client,left bind=SUPER+SHIFT,l,exchange_client,right # switch window status bind=SUPER,g,toggleglobal, bind=ALT,Tab,toggleoverview, bind=SUPER,space,togglefloating, bind=ALT,a,togglemaximizescreen, bind=ALT,f,togglefullscreen, bind=ALT+SHIFT,f,togglefakefullscreen, bind=SUPER,i,minimized, bind=SUPER,o,toggleoverlay, bind=SUPER+SHIFT,I,restore_minimized bind=ALT,z,toggle_scratchpad # scroller layout bind=ALT,e,set_proportion,1.0 bind=ALT,x,switch_proportion_preset, # switch layout bind=SUPER,n,switch_layout # tag switch bind=SUPER,1,view,1,0 bind=SUPER,2,view,2,0 bind=SUPER,3,view,3,0 bind=SUPER,4,view,4,0 bind=SUPER,5,view,5,0 bind=SUPER,6,view,6,0 bind=SUPER,7,view,7,0 bind=SUPER,8,view,8,0 bind=SUPER,9,view,9,0 # tag: move client to the tag and focus it # tagsilent: move client to the tag and not focus it # bind=Alt,1,tagsilent,1 bind=SUPER+SHIFT,1,tag,1,0 bind=SUPER+SHIFT,2,tag,2,0 bind=SUPER+SHIFT,3,tag,3,0 bind=SUPER+SHIFT,4,tag,4,0 bind=SUPER+SHIFT,5,tag,5,0 bind=SUPER+SHIFT,6,tag,6,0 bind=SUPER+SHIFT,7,tag,7,0 bind=SUPER+SHIFT,8,tag,8,0 bind=SUPER+SHIFT,9,tag,9,0 # monitor switch bind=alt+shift,Left,focusmon,left bind=alt+shift,Right,focusmon,right bind=SUPER+Alt,Left,tagmon,left bind=SUPER+Alt,Right,tagmon,right # gaps bind=ALT+SHIFT,X,incgaps,1 bind=ALT+SHIFT,Z,incgaps,-1 bind=ALT+SHIFT,R,togglegaps # movewin bind=SUPER,Up,movewin,+0,-50 bind=SUPER,Down,movewin,+0,+50 bind=SUPER,Left,movewin,-50,+0 bind=SUPER,Right,movewin,+50,+0 # resizewin bind=ALT,k,resizewin,+0,-50 bind=ALT,j,resizewin,+0,+50 bind=ALT,h,resizewin,-50,+0 bind=ALT,l,resizewin,+50,+0 # Volume Control (using wpctl/Pipewire) bind=NONE,XF86AudioRaiseVolume,spawn,volume-control up bind=NONE,XF86AudioLowerVolume,spawn,volume-control down bind=NONE,XF86AudioMute,spawn,volume-control mute bind=NONE,XF86AudioPlay,spawn,playerctl play-pause bind=NONE,XF86AudioNext,spawn,playerctl next bind=NONE,XF86AudioPrev,spawn,playerctl previous bind=NONE,XF86AudioStop,spawn,playerctl stop # Mic Control bind=NONE,XF86AudioMicMute,spawn,mic-control toggle # Brightness Control (using brightnessctl) bind=NONE,XF86MonBrightnessUp,spawn,brightness-control up bind=NONE,XF86MonBrightnessDown,spawn,brightness-control down # Mouse Button Bindings # NONE mode key only work in ov mode mousebind=SUPER,btn_left,moveresize,curmove mousebind=NONE,btn_middle,togglemaximizescreen,0 mousebind=SUPER,btn_right,moveresize,curresize # Axis Bindings axisbind=SUPER,UP,viewtoleft_have_client axisbind=SUPER,DOWN,viewtoright_have_client # layer rule layerrule=animation_type_open:zoom,layer_name:rofi layerrule=animation_type_close:zoom,layer_name:rofi env=NIXOS_OZONE_WL,1 env=QT_AUTO_SCREEN_SCALE_FACTOR,1 env=ELECTRON_OZONE_PLATFORM_HINT,auto env=QT_QPA_PLATFORM,wayland;xcb env=XDG_SESSION_TYPE,wayland env=GDK_BACKEND,wayland,x11 env=GDK_SCALE,1 # exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = /bin/sh -c 'eval $(gnome-keyring-daemon --start --components=secrets,ssh); dbus-update-activation-environment --systemd --all' exec-once = ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 ${lib.optionalString (config.services.picom.enable) '' exec-once = systemctl --user stop picom.service ''} exec-once = sh ~/.swaybg ${lib.optionalString (cfg.waybar) '' exec-once = waybar & ''} exec-once = dunst & exec-once = wl-clip-persist --clipboard regular ''; }; home.packages = with pkgs; [ swaybg wl-clipboard-rs wl-clip-persist ]; } else { programs.mango.enable = true; } ); }