nix-conf/system/modules/mango.nix
2026-02-04 18:21:40 +08:00

297 lines
11 KiB
Nix

{
config,
lib,
...
}:
let
inherit (lib)
mkIf
removePrefix
concatStringsSep
mapAttrsToList
;
in
{
config = mkIf config.programs.mango.enable {
home-manager.sharedModules = [
(
{ config, ... }:
let
wmCfg = config.wm;
bindCfg = wmCfg.keybinds;
in
{
wm.keybinds = {
mod = "SUPER";
separator = ",";
hypr-type = true;
};
wayland.windowManager.mango = {
enable = true;
settings =
let
keybinds = concatStringsSep "\n" (
mapAttrsToList (n: v: "bind=${n},spawn,${v}") (bindCfg.spawn-repeat // bindCfg.spawn)
);
in
''
# Window effect
blur=0
blur_layer=0
blur_optimized=1
blur_params_num_passes = 2
blur_params_radius = 5
blur_params_noise = 0.02
blur_params_brightness = 0.9
blur_params_contrast = 0.9
blur_params_saturation = 1.2
shadows = 0
layer_shadows = 0
shadow_only_floating = 1
shadows_size = 10
shadows_blur = 15
shadows_position_x = 0
shadows_position_y = 0
shadowscolor= 0x000000ff
border_radius=${toString wmCfg.border.radius}
no_radius_when_single=0
focused_opacity=${toString wmCfg.window.opacity}
unfocused_opacity=${toString wmCfg.window.opacity}
# Animation Configuration(support type:zoom,slide)
# tag_animation_direction: 1-horizontal,0-vertical
animations=1
layer_animations=1
animation_type_open=slide
animation_type_close=slide
animation_fade_in=1
animation_fade_out=1
tag_animation_direction=1
zoom_initial_ratio=0.3
zoom_end_ratio=0.8
fadein_begin_opacity=0.5
fadeout_begin_opacity=0.8
animation_duration_move=500
animation_duration_open=400
animation_duration_tag=350
animation_duration_close=800
animation_duration_focus=0
animation_curve_open=0.46,1.0,0.29,1
animation_curve_move=0.46,1.0,0.29,1
animation_curve_tag=0.46,1.0,0.29,1
animation_curve_close=0.08,0.92,0,1
animation_curve_focus=0.46,1.0,0.29,1
animation_curve_opafadeout=0.5,0.5,0.5,0.5
animation_curve_opafadein=0.46,1.0,0.29,1
# Scroller Layout Setting
scroller_structs=20
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_proportion_preset=0.5,0.8,1.0
# Master-Stack Layout Setting
new_is_master=1
default_mfact=0.55
default_nmaster=1
smartgaps=0
# Overview Setting
hotarea_size=10
enable_hotarea=1
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
# keyboard
repeat_rate=${toString wmCfg.input.keyboard.repeat-rate}
repeat_delay=${toString wmCfg.input.keyboard.repeat-delay}
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=0
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
# Appearance
gappih=5
gappiv=5
gappoh=10
gappov=10
scratchpad_width_ratio=0.8
scratchpad_height_ratio=0.9
borderpx=4
rootcolor=0x${removePrefix "#" wmCfg.border.active.to}ff
bordercolor=0x${removePrefix "#" wmCfg.border.active.from}ff
focuscolor=0x${removePrefix "#" wmCfg.border.active.to}ff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
globalcolor=0xb153a7ff
overlaycolor=0x14a57cff
# layout support:
# tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:tile
tagrule=id:3,layout_name:tile
tagrule=id:4,layout_name:tile
tagrule=id:5,layout_name:tile
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
${keybinds}
# exit
bind=${bindCfg.close-window},killclient
# switch window focus
bind=${bindCfg.switch-window-focus},focusstack,next
bind=${bindCfg.move-window-focus.left},focusdir,left
bind=${bindCfg.move-window-focus.right},focusdir,right
bind=${bindCfg.move-window-focus.up},focusdir,up
bind=${bindCfg.move-window-focus.down},focusdir,down
# swap window
bind=${bindCfg.move-window.up},exchange_client,up
bind=${bindCfg.move-window.down},exchange_client,down
bind=${bindCfg.move-window.left},exchange_client,left
bind=${bindCfg.move-window.right},exchange_client,right
# switch window status
bind=SUPER,g,toggleglobal,
bind=${bindCfg.toggle-overview},toggleoverview,
bind=${bindCfg.toggle-float},togglefloating,
bind=${bindCfg.maximize-column},togglemaximizescreen,
# bind=${bindCfg.toggle-fullscreen},togglefullscreen,
bind=${bindCfg.toggle-fullscreen},togglefakefullscreen,
bind=${bindCfg.minimize},minimized,
# bind=SUPER,o,toggleoverlay,
bind=${bindCfg.restore-minimize},restore_minimized
bind=${bindCfg.toggle-scratchpad},toggle_scratchpad
# scroller layout
bind=${bindCfg.expand-column-to-available-width},set_proportion,1.0
bind=${bindCfg.switch-preset-column-width},switch_proportion_preset,
# switch layout
bind=${bindCfg.switch-layout},switch_layout
# tag switch
bind=SUPER,Left,viewtoleft,0
bind=CTRL,Left,viewtoleft_have_client,0
bind=SUPER,Right,viewtoright,0
bind=CTRL,Right,viewtoright_have_client,0
bind=CTRL+SUPER,Left,tagtoleft,0
bind=CTRL+SUPER,Right,tagtoright,0
bind=${bindCfg.focus-workspace-prefix},1,view,1,0
bind=${bindCfg.focus-workspace-prefix},2,view,2,0
bind=${bindCfg.focus-workspace-prefix},3,view,3,0
bind=${bindCfg.focus-workspace-prefix},4,view,4,0
bind=${bindCfg.focus-workspace-prefix},5,view,5,0
bind=${bindCfg.focus-workspace-prefix},6,view,6,0
bind=${bindCfg.focus-workspace-prefix},7,view,7,0
bind=${bindCfg.focus-workspace-prefix},8,view,8,0
bind=${bindCfg.focus-workspace-prefix},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=Alt,1,tag,1,0
bind=Alt,2,tag,2,0
bind=Alt,3,tag,3,0
bind=Alt,4,tag,4,0
bind=Alt,5,tag,5,0
bind=Alt,6,tag,6,0
bind=Alt,7,tag,7,0
bind=Alt,8,tag,8,0
bind=Alt,9,tag,9,0
# monitor switch
bind=${bindCfg.move-monitor-focus.left},focusmon,left
bind=${bindCfg.move-monitor-focus.right},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=CTRL+SHIFT,Up,movewin,+0,-50
bind=CTRL+SHIFT,Down,movewin,+0,+50
bind=CTRL+SHIFT,Left,movewin,-50,+0
bind=CTRL+SHIFT,Right,movewin,+50,+0
# resizewin
bind=CTRL+ALT,Up,resizewin,+0,-50
bind=CTRL+ALT,Down,resizewin,+0,+50
bind=CTRL+ALT,Left,resizewin,-50,+0
bind=CTRL+ALT,Right,resizewin,+50,+0
# 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
mousebind=NONE,btn_left,toggleoverview,1
mousebind=NONE,btn_right,killclient,0
# 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
'';
autostart_sh = ''
${wmCfg.exec-once}
'';
};
}
)
];
};
}