diff --git a/flake.lock b/flake.lock index 662dd33..427e80c 100755 --- a/flake.lock +++ b/flake.lock @@ -297,6 +297,24 @@ "inputs": { "nixpkgs-lib": "nixpkgs-lib" }, + "locked": { + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, "locked": { "lastModified": 1765835352, "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", @@ -311,7 +329,7 @@ "type": "github" } }, - "flake-parts_2": { + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "nur", @@ -944,6 +962,28 @@ "type": "github" } }, + "mango": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": [ + "nixpkgs" + ], + "scenefx": "scenefx" + }, + "locked": { + "lastModified": 1771671174, + "narHash": "sha256-5yOc1wyqRPUBrKHyjxgKHjCIUA4WEiLpWhW1l6cOrdA=", + "owner": "DreamMaoMao", + "repo": "mango", + "rev": "5f6f014debb8af0fc27b2a52f2569d984ada3ef9", + "type": "github" + }, + "original": { + "owner": "DreamMaoMao", + "repo": "mango", + "type": "github" + } + }, "nix-formatter-pack": { "inputs": { "nixpkgs": [ @@ -1059,7 +1099,7 @@ "nixcord": { "inputs": { "flake-compat": "flake-compat_5", - "flake-parts": "flake-parts", + "flake-parts": "flake-parts_2", "nixpkgs": "nixpkgs_7" }, "locked": { @@ -1206,6 +1246,21 @@ } }, "nixpkgs-lib": { + "locked": { + "lastModified": 1748740939, + "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "656a64127e9d791a334452c6b6606d17539476e2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-lib_2": { "locked": { "lastModified": 1765674936, "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", @@ -1220,7 +1275,7 @@ "type": "github" } }, - "nixpkgs-lib_2": { + "nixpkgs-lib_3": { "locked": { "lastModified": 1765674936, "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", @@ -1496,7 +1551,7 @@ }, "nur": { "inputs": { - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts_3", "nixpkgs": "nixpkgs_11" }, "locked": { @@ -1515,7 +1570,7 @@ }, "parts": { "inputs": { - "nixpkgs-lib": "nixpkgs-lib_2" + "nixpkgs-lib": "nixpkgs-lib_3" }, "locked": { "lastModified": 1768135262, @@ -1566,6 +1621,7 @@ "hyprland-plugins": "hyprland-plugins", "impermanence": "impermanence", "lan-mouse": "lan-mouse", + "mango": "mango", "nix-index-database": "nix-index-database", "nix-on-droid": "nix-on-droid", "nix-secrets": "nix-secrets", @@ -1667,6 +1723,27 @@ "type": "github" } }, + "scenefx": { + "inputs": { + "nixpkgs": [ + "mango", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1750785057, + "narHash": "sha256-tGX6j4W91rcb+glXJo43sjPI9zQvPotonknG1BdihR4=", + "owner": "wlrfx", + "repo": "scenefx", + "rev": "3a6cfb12e4ba97b43326357d14f7b3e40897adfc", + "type": "github" + }, + "original": { + "owner": "wlrfx", + "repo": "scenefx", + "type": "github" + } + }, "scss-reset": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 49c9730..70cab36 100755 --- a/flake.nix +++ b/flake.nix @@ -160,6 +160,10 @@ url = "github:hyprwm/hyprland-plugins"; inputs.hyprland.follows = "hyprland"; }; + mango = { + url = "github:DreamMaoMao/mango"; + inputs.nixpkgs.follows = "nixpkgs"; + }; vicinae-extensions = { url = "github:vicinaehq/extensions"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/hosts/canopus/default.nix b/hosts/canopus/default.nix index 72fd5ff..3e82a72 100755 --- a/hosts/canopus/default.nix +++ b/hosts/canopus/default.nix @@ -17,6 +17,7 @@ ../../modules/nixos/desktop ../../modules/nixos/desktop/awesome ../../modules/nixos/desktop/hyprland + ../../modules/nixos/desktop/mango ../../modules/nixos/virtualisation ../../modules/nixos/steam.nix ../../modules/nixos/obs-studio.nix @@ -282,7 +283,7 @@ supergfxd = { enable = true; settings = { - mode = "Integrated"; + mode = "Hybrid"; vfio_enable = false; vfio_save = false; always_reboot = false; diff --git a/hosts/canopus/home.nix b/hosts/canopus/home.nix index dfcd7a3..8a18144 100644 --- a/hosts/canopus/home.nix +++ b/hosts/canopus/home.nix @@ -2,6 +2,7 @@ imports = [ ../../modules/home/desktop/awesome ../../modules/home/desktop/hyprland + ../../modules/home/desktop/mango ../../modules/home/desktop/vicinae ../../modules/home/desktop/utils ../../modules/home/picom diff --git a/modules/home/desktop/mango/default.nix b/modules/home/desktop/mango/default.nix new file mode 100644 index 0000000..884bd2d --- /dev/null +++ b/modules/home/desktop/mango/default.nix @@ -0,0 +1,214 @@ +{inputs, ...}: { + imports = [ + inputs.mango.hmModules.mango + ]; + + wayland.windowManager.mango = { + enable = true; + settings = '' + # Monitors + monitorrule = name:eDP-1, width:2560, height:1440, refresh:165, x:0, y:10, vrr:1 + monitorrule = name:HDMI-A-1, width:2560, height:1440, refresh:100, x:0, y:-1440, vrr:1 + + # Keyboard + repeat_rate = 25 + repeat_delay = 600 + numlockon = 0 + xkb_rules_layout = us + + # Trackpad + 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 + mouse_natural_scrolling = 0 + accel_profile = 0 + + # Theme + border_radius = 8 + no_radius_when_single = 0 + focused_opacity = 1.0 + unfocused_opacity = 1.0 + + # Scroller Layout Setting + scroller_structs = 0 + scroller_default_proportion = 0.5 + scroller_ignore_proportion_single = 0 + scroller_default_proportion_single = 1.0 + + # Master-Stack Layout Setting + new_is_master = 0 + default_mfact = 0.5 + default_nmaster = 1 + smartgaps = 0 + + # Overview Setting + hotarea_size = 10 + enable_hotarea = 1 + ov_tab_mode = 0 + overviewgappi = 15 + overviewgappo = 15 + + # layouts + 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:scroller + + # Keybindings + mousebind = SUPER, btn_left, moveresize, curmove + mousebind = SUPER, btn_right, moveresize, curresize + gesturebind = none, left, 3, viewtoright_have_client + gesturebind = none, right, 3, viewtoleft_have_client + gesturebind = none, up, 3, toggleoverview + gesturebind = none, down, 3, toggleoverview + + # apps + bind = SUPER, Return, spawn, wezterm + bind = SUPER, Space, spawn, vicinae toggle + bind = SUPER, B, spawn, brave + bind = SUPER, V, spawn, vicinae vicinae://extensions/vicinae/clipboard/history + bind = SUPER+SHIFT, W, spawn, vicinae vicinae://extensions/sovereign/awww-switcher/wpgrid + + # WM + bind = SUPER, Q, killclient + bind = SUPER+SHIFT, R, reload_config + bind = SUPER+SHIFT, F, togglefullscreen + bind = SUPER+SHIFT, Space, togglefloating + + bind = ALT, Tab, toggleoverview + bind = ALT+SHIFT, minus, incgaps, -1 + bind = ALT+SHIFT, equal, incgaps, 1 + bind = ALT+SHIFT, R, togglegaps + + # switch layout + bind = SUPER+SHIFT, H, setlayout, tile + bind = SUPER+SHIFT, V, setlayout, vertical_tile + bind = SUPER+SHIFT, S, setlayout, scroller + + # resize client + bind = SUPER+CTRL, Up, resizewin, +0, -50 + bind = SUPER+CTRL, Down, resizewin, +0, +50 + bind = SUPER+CTRL, Left, resizewin, -50, +0 + bind = SUPER+CTRL, Right, resizewin, +50, +0 + + # swap client + bind = SUPER+SHIFT, Up, exchange_client, up + bind = SUPER+SHIFT, Down, exchange_client, down + bind = SUPER+SHIFT, Left, exchange_client, left + bind = SUPER+SHIFT, Right, exchange_client, right + + # switch client focus + bind = SUPER, Tab, focusstack, next + bind = SUPER, Left, focusdir, left + bind = SUPER, Right, focusdir, right + bind = SUPER, Up, focusdir, up + bind = SUPER, Down, focusdir, down + + # switch view + 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 + + # move client to the tag with focus + bind = SUPER+SHIFT, 1, tagsilent, 1, 0 + bind = SUPER+SHIFT, 2, tagsilent, 2, 0 + bind = SUPER+SHIFT, 3, tagsilent, 3, 0 + bind = SUPER+SHIFT, 4, tagsilent, 4, 0 + bind = SUPER+SHIFT, 5, tagsilent, 5, 0 + bind = SUPER+SHIFT, 6, tagsilent, 6, 0 + + # move client to the tag without focus + bind = SUPER+ALT, 1, tag, 1, 0 + bind = SUPER+ALT, 2, tag, 2, 0 + bind = SUPER+ALT, 3, tag, 3, 0 + bind = SUPER+ALT, 4, tag, 4, 0 + bind = SUPER+ALT, 5, tag, 5, 0 + bind = SUPER+ALT, 6, tag, 6, 0 + + # 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 + + # Animation + animations = 1 + layer_animations = 1 + animation_type_open = slide + animation_type_close = fade + 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 = 100 + animation_duration_open = 100 + animation_duration_close = 100 + animation_duration_tag = 200 + 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 + + # Appearance + borderpx = 0 + gappih = 10 + gappiv = 10 + gappoh = 10 + gappov = 10 + + rootcolor = 0x201b14ff + bordercolor = 0x444444ff + focuscolor = 0xc9b890ff + maximizescreencolor = 0x89aa61ff + urgentcolor = 0xad401fff + scratchpadcolor = 0x516c93ff + globalcolor = 0xb153a7ff + overlaycolor = 0x14a57cff + + # Misc + adaptive_sync = 1 + syncobj_enable = 1 + + exec-once = awww-daemon + exec-once = kdeconnectd + exec-once = kdeconnect-indicator + exec-once = dbus-update-activation-environment --systemd --all; systemctl --user reset-failed && systemctl --user start mango-session.target + ''; + }; +} diff --git a/modules/nixos/desktop/mango/default.nix b/modules/nixos/desktop/mango/default.nix new file mode 100644 index 0000000..120de56 --- /dev/null +++ b/modules/nixos/desktop/mango/default.nix @@ -0,0 +1,26 @@ +{ + inputs, + pkgs, + lib, + ... +}: { + imports = [ + inputs.mango.nixosModules.mango + ]; + + programs.mango.enable = true; + + xdg.portal = { + enable = lib.mkDefault true; + extraPortals = with pkgs; [ + hyprland-git.xdg-desktop-portal-hyprland + xdg-desktop-portal-wlr + xdg-desktop-portal-gtk + ]; + config.mango = { + default = lib.mkForce ["hyprland" "gtk"]; + "org.freedesktop.impl.portal.ScreenCast" = lib.mkForce ["hyprland"]; + "org.freedesktop.impl.portal.ScreenShot" = lib.mkForce ["hyprland"]; + }; + }; +}