Merge pull request #1 from atheeq-rhxn/vertical-stack

refactor: cleanup unnecessary changes
This commit is contained in:
nixpup 2026-01-16 20:43:13 +01:00 committed by GitHub
commit c45469f0b5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 365 additions and 129 deletions

309
README.md
View file

@ -1,18 +1,299 @@
# Mango Wayland Compositor Nixpup Fork
![MangoWC Logo](https://codeberg.org/nixpup/MangoWC/raw/branch/main/mangowc_logo.png)
# Mango Wayland Compositor
<div>
<img src="https://github.com/DreamMaoMao/mangowc/blob/main/assets/mango-transparency-256.png" alt="MangoWC Logo" width="120"/>
</div>
# Demo
<video src="https://codeberg.org/nixpup/MangoWC/raw/branch/main/demo.mp4" controls>
Your browser does not support the video tag.
</video>
This project's development is based on [dwl](https://codeberg.org/dwl/dwl/).
1. **Lightweight & Fast Build**
- _Mango_ is as lightweight as _dwl_, and can be built completely within a few seconds. Despite this, _Mango_ does not compromise on functionality.
2. **Feature Highlights**
- In addition to basic WM functionality, Mango provides:
- Excellent xwayland support.
- Base tags not workspaces (supports separate window layouts for each tag)
- Smooth and customizable complete animations (window open/move/close, tag enter/leave,layer open/close/move)
- Excellent input method support (text input v2/v3)
- Flexible window layouts with easy switching (scroller, master-stack, monocle,center-master, etc.)
- Rich window states (swallow, minimize, maximize, unglobal, global, fakefullscreen, overlay, etc.)
- Simple yet powerful external configuration(support shortcuts hot-reload)
- Sway-like scratchpad and named scratchpad
- Ipc support(get/send message from/to compositor by external program)
- Hycov-like overview
- Window effects from scenefx (blur, shadow, corner radius, opacity)
Master-Stack Layout
https://github.com/user-attachments/assets/a9d4776e-b50b-48fb-94ce-651d8a749b8a
Scroller Layout
https://github.com/user-attachments/assets/c9bf9415-fad1-4400-bcdc-3ad2d76de85a
Layer animation
https://github.com/user-attachments/assets/014c893f-115c-4ae9-8342-f9ae3e9a0df0
# Our discord
[mangowc](https://discord.gg/CPjbDxesh5)
# Supported layouts
- tile
- scroller
- monocle
- grid
- deck
- center_tile
- vertical_tile
- vertical_grid
- vertical_scroller
# Installation
## Dependencies
- glibc
- wayland
- wayland-protocols
- libinput
- libdrm
- libxkbcommon
- pixman
- git
- meson
- ninja
- libdisplay-info
- libliftoff
- hwdata
- seatd
- pcre2
- xorg-xwayland
- libxcb
## Arch Linux
The package is in the Arch User Repository and is availble for manual download [here](https://aur.archlinux.org/packages/mangowc-git) or through a AUR helper like yay:
```bash
yay -S mangowc-git
# New Features
This build of MangoWC supports *vertical stacking* within the *scroller* layout, similar to how the Niri Wayland Compositor and Window Manager works. This means by binding the following actions in your `~/.config/mango/config.conf`:
```
bind=Alt,comma,stack_with_left
bind=Alt,period,unstack
bind=Alt,t,revert_size
```
You can automatically split/resize the window to the left of the currently selected window, and then move/tile the currently selected window below the window to its left via the `stack_with_left` option. Removing a window from a stack is triggered by the `unstack` action, and with the `revert_size` action you can revert a window to its original size, meaning it gets resized back to using the full vertical screen size, and gets re-integrated into the scroller layout.
## [Original MangoWC Repository](https://github.com/DreamMaoMao/mangowc)
## Gentoo Linux
The package is in the community-maintained repository called GURU.
First, add GURU repository:
```bash
emerge --ask --verbose eselect-repository
eselect repository enable guru
emerge --sync guru
```
Then, add `gui-libs/scenefx` and `gui-wm/mangowc` to the `package.accept_keywords`.
Finally, install the package:
```bash
emerge --ask --verbose gui-wm/mangowc
```
## Fedora Linux
The package is in the third-party Terra repository.
First, add the [Terra Repository](https://terra.fyralabs.com/).
Then, install the package:
```bash
dnf install mangowc
```
## Other
```bash
git clone -b 0.19.2 https://gitlab.freedesktop.org/wlroots/wlroots.git
cd wlroots
meson build -Dprefix=/usr
sudo ninja -C build install
git clone -b 0.4.1 https://github.com/wlrfx/scenefx.git
cd scenefx
meson build -Dprefix=/usr
sudo ninja -C build install
git clone https://github.com/DreamMaoMao/mangowc.git
cd mangowc
meson build -Dprefix=/usr
sudo ninja -C build install
```
## Suggested Tools
### Hybrid component
- [dms-shell](https://github.com/AvengeMedia/DankMaterialShell)
### Independent component
- Application launcher (rofi, bemenu, wmenu, fuzzel)
- Terminal emulator (foot, wezterm, alacritty, kitty, ghostty)
- Status bar (waybar, eww, quickshell, ags), waybar is preferred
- Wallpaper setup (swww, swaybg)
- Notification daemon (swaync, dunst,mako)
- Desktop portal (xdg-desktop-portal, xdg-desktop-portal-wlr, xdg-desktop-portal-gtk)
- Clipboard (wl-clipboard, wl-clip-persist, cliphist)
- Gamma control/night light (wlsunset, gammastep)
- Miscellaneous (xfce-polkit, wlogout)
## Some Common Default Keybindings
- alt+return: open foot terminal
- alt+space: open rofi launcher
- alt+q: kill client
- alt+left/right/up/down: focus direction
- super+m: quit mango
## My Dotfiles
### Daily
- Dependencies
```bash
yay -S rofi foot xdg-desktop-portal-wlr swaybg waybar wl-clip-persist cliphist wl-clipboard wlsunset xfce-polkit swaync pamixer wlr-dpms sway-audio-idle-inhibit-git swayidle dimland-git brightnessctl swayosd wlr-randr grim slurp satty swaylock-effects-git wlogout sox
```
### Dms
- Dependencies
```bash
yay -S foot xdg-desktop-portal-wlr swaybg wl-clip-persist cliphist wl-clipboard sway-audio-idle-inhibit-git brightnessctl grim slurp satty matugen-bin dms-shell-git
```
- use my dms config
```bash
git clone -b dms https://github.com/DreamMaoMao/mango-config.git ~/.config/mango
```
- use my daily config
```bash
git clone https://github.com/DreamMaoMao/mango-config.git ~/.config/mango
```
## Config Documentation
Refer to the repo wiki [wiki](https://github.com/DreamMaoMao/mango/wiki/)
or the website docs [docs](https://mangowc.vercel.app/docs)
# NixOS + Home-manager
The repo contains a flake that provides a NixOS module and a home-manager module for mango.
Use the NixOS module to install mango with other necessary components of a working Wayland environment.
Use the home-manager module to declare configuration and autostart for mango.
Here's an example of using the modules in a flake:
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
home-manager = {
url = "github:nix-community/home-manager";
inputs.nixpkgs.follows = "nixpkgs";
};
flake-parts.url = "github:hercules-ci/flake-parts";
mango = {
url = "github:DreamMaoMao/mango";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs =
inputs@{ self, flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
debug = true;
systems = [ "x86_64-linux" ];
flake = {
nixosConfigurations = {
hostname = inputs.nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
inputs.home-manager.nixosModules.home-manager
# Add mango nixos module
inputs.mango.nixosModules.mango
{
programs.mango.enable = true;
}
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
backupFileExtension = "backup";
users."username".imports =
[
(
{ ... }:
{
wayland.windowManager.mango = {
enable = true;
settings = ''
# see config.conf
'';
autostart_sh = ''
# see autostart.sh
# Note: here no need to add shebang
'';
};
}
)
]
++ [
# Add mango hm module
inputs.mango.hmModules.mango
];
};
}
];
};
};
};
};
}
```
# Packaging mango
To package mango for other distributions, you can check the reference setup for:
- [nix](https://github.com/DreamMaoMao/mangowc/blob/main/nix/default.nix)
- [arch](https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=mangowc-git).
- [gentoo](https://data.gpo.zugaina.org/guru/gui-wm/mangowc)
You might need to package `scenefx` for your distribution, check availability [here](https://github.com/wlrfx/scenefx.git).
If you encounter build errors when packaging `mango`, feel free to create an issue and ask a question, but
Read The Friendly Manual on packaging software in your distribution first.
# Thanks to These Reference Repositories
- https://gitlab.freedesktop.org/wlroots/wlroots - Implementation of Wayland protocol
- https://github.com/dqrk0jeste/owl - Basal window animation
- https://codeberg.org/dwl/dwl - Basal dwl feature
- https://github.com/swaywm/sway - Sample of Wayland protocol
- https://github.com/wlrfx/scenefx - Make it simple to add window effect.
# Sponsor
At present, I can only accept sponsorship through an encrypted connection.
If you find this project helpful to you, you can offer sponsorship in the following ways.
<img width="650" height="870" alt="image" src="https://github.com/user-attachments/assets/8c860317-90d2-4071-971d-f1a92b674469" />
Thanks to the following friends for their sponsorship of this project
[@tonybanters](https://github.com/tonybanters)

View file

@ -1,38 +1,7 @@
# Autostart
exec-once=wl-paste --watch cliphist store
exec-once=dex --autostart environment mango
exec-once=swaybg -i /home/puppy/Pictures/gruvbox_pokemon_marnie_wp_dark.png -m fill
exec-once=gammastep -l 52.520008:13.404954 -t 4000:4000
exec-once=dunst
exec-once=noctalia-shell
exec-once=vicinae server
# Environment
env=GBM_BACKEND,nvidia-drm
env=__GLX_VENDOR_LIBRARY_NAME,nvidia
env=DISPLAY,:0
env=XDG_CURRENT_DESKTOP,mango
env=XDG_SESSION_TYPE,wayland
env=QT_QPA_PLATFORM,wayland
env=QT_QPA_PLATFORMTHEME,qt5ct
env=QT_WAYLAND_DISABLE_WINDOWDECORATION,1
env=MOZ_ENABLE_WAYLAND,1
env=NIXOS_OZONE_WL,1
env=ELECTRON_OZONE_PLATFORM_HINT,wayland
env=OZONE_PLATFORM,wayland
env=GDK_BACKEND,wayland
env=WINDOW_MANAGER,mango
env=SDL_VIDEODRIVER,wayland
# Input
xkb_rules_layout=us
xkb_rules_options=caps:ctrl_modifier,ctrl:swapcaps
repeat_rate=25
repeat_delay=600
numlockon=0
# More option see https://github.com/DreamMaoMao/mango/wiki/
# Window effect
blur=1
blur=0
blur_layer=0
blur_optimized=1
blur_params_num_passes = 2
@ -42,7 +11,7 @@ blur_params_brightness = 0.9
blur_params_contrast = 0.9
blur_params_saturation = 1.2
shadows = 1
shadows = 0
layer_shadows = 0
shadow_only_floating = 1
shadows_size = 10
@ -54,7 +23,7 @@ shadowscolor= 0x000000ff
border_radius=6
no_radius_when_single=0
focused_opacity=1.0
unfocused_opacity=0.8
unfocused_opacity=1.0
# Animation Configuration(support type:zoom,slide)
# tag_animation_direction: 1-horizontal,0-vertical
@ -118,13 +87,19 @@ snap_distance=30
cursor_size=24
drag_tile_to_tile=1
# keyboard
repeat_rate=25
repeat_delay=600
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
trackpad_natural_scrolling=0
disable_while_typing=1
left_handed=0
middle_button_emulation=0
@ -133,7 +108,6 @@ swipe_min_threshold=1
# mouse
# need relogin to make it apply
mouse_natural_scrolling=0
sloppyfocus=1
# Appearance
gappih=5
@ -144,8 +118,8 @@ scratchpad_width_ratio=0.8
scratchpad_height_ratio=0.9
borderpx=4
rootcolor=0x201b14ff
bordercolor=0x1d1f21ff
focuscolor=0xff2a54ff
bordercolor=0x444444ff
focuscolor=0xc9b890ff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
@ -154,53 +128,51 @@ overlaycolor=0x14a57cff
# layout support:
# tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller
tagrule=id:1,layout_name:scroller
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:tile
tagrule=id:3,layout_name:monocle
tagrule=id:4,layout_name:deck
tagrule=id:5,layout_name:grid
tagrule=id:6,layout_name:center_tile
tagrule=id:7,layout_name:vertical_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
# reload config
bind=Alt+Shift,r,reload_config
bind=SUPER,r,reload_config
# menu and terminal
bind=Alt,f,spawn,vicinae open
bind=Alt+Shift,Return,spawn,kitty
bind=Alt,space,spawn,rofi -show drun
bind=Alt,Return,spawn,foot
# exit
#bind=Alt+Shift,x,quit
bind=Alt+Shift,x,spawn,~/.scripts/mango-exit.sh
bind=ALT+Shift,q,killclient,
bind=SUPER,m,quit
bind=ALT,q,killclient,
# switch window focus
bind=Alt,Tab,focusstack,next
bind=SUPER,Tab,focusstack,next
bind=ALT,Left,focusdir,left
bind=ALT,Right,focusdir,right
bind=ALT,Up,focusdir,up
bind=ALT,Down,focusdir,down
# swap window
bind=Alt+SHIFT,Up,exchange_client,up
bind=Alt+SHIFT,Down,exchange_client,down
bind=Alt+SHIFT,Left,exchange_client,left
bind=Alt+SHIFT,Right,exchange_client,right
# scroller stack operations
bind=Alt,comma,stack_with_left
bind=Alt,period,unstack
bind=Alt,t,revert_size
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 window status
bind=ALT,g,toggleglobal,
bind=SUPER,Space,toggleoverview,
bind=Super,Space,togglefloating
bind=Alt+Shift,a,togglemaximizescreen,
bind=Alt+Shift,f,togglefullscreen,
bind=SUPER+Shift,f,togglefakefullscreen,
bind=SUPER,g,toggleglobal,
bind=ALT,Tab,toggleoverview,
bind=ALT,backslash,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
@ -208,60 +180,52 @@ bind=ALT,z,toggle_scratchpad
# scroller layout
bind=ALT,e,set_proportion,1.0
# Applications
bind=ALT+Shift,e,spawn,emacs-wayland
bind=Alt,d,spawn,firefox
bind=SUPER,e,spawn,thunar
bind=SUPER,t,spawn,marker
bind=SUPER,l,spawn,hyprlock
bind=SUPER,f,spawn,sherlock
bind=Alt,a,spawn,hyprshot -m region --clipboard-only
bind=ALT,x,switch_proportion_preset,
# switch layout
bind=Alt,space,switch_layout
bind=SUPER,n,switch_layout
# tag switch
bind=SUPER,Left,viewtoleft,0
bind=CTRL+Super+Shift,Left,viewtoleft_have_client,0
bind=CTRL,Left,viewtoleft_have_client,0
bind=SUPER,Right,viewtoright,0
bind=CTRL+SUPER+Shift,Right,viewtoright_have_client,0
bind=CTRL,Right,viewtoright_have_client,0
bind=CTRL+SUPER,Left,tagtoleft,0
bind=CTRL+SUPER,Right,tagtoright,0
bind=Alt,1,view,1,0
bind=Alt,2,view,2,0
bind=Alt,3,view,3,0
bind=Alt,4,view,4,0
bind=Alt,5,view,5,0
bind=Alt,6,view,6,0
bind=Alt,7,view,7,0
bind=Alt,8,view,8,0
bind=Alt,9,view,9,0
bind=Ctrl,1,view,1,0
bind=Ctrl,2,view,2,0
bind=Ctrl,3,view,3,0
bind=Ctrl,4,view,4,0
bind=Ctrl,5,view,5,0
bind=Ctrl,6,view,6,0
bind=Ctrl,7,view,7,0
bind=Ctrl,8,view,8,0
bind=Ctrl,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+Shift,1,tag,1,0
bind=Alt+Shift,2,tag,2,0
bind=Alt+Shift,3,tag,3,0
bind=Alt+Shift,4,tag,4,0
bind=Alt+Shift,5,tag,5,0
bind=Alt+Shift,6,tag,6,0
bind=Alt+Shift,7,tag,7,0
bind=Alt+Shift,8,tag,8,0
bind=Alt+Shift,9,tag,9,0
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=alt+shift,ctrl,Left,focusmon,left
bind=alt+shift,ctrl,Right,focusmon,right
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,G,togglegaps
bind=ALT+SHIFT,R,togglegaps
# movewin
bind=CTRL+SHIFT,Up,movewin,+0,-50
@ -277,9 +241,9 @@ bind=CTRL+ALT,Right,resizewin,+50,+0
# Mouse Button Bindings
# NONE mode key only work in ov mode
mousebind=ALT,btn_left,moveresize,curmove
mousebind=SUPER,btn_left,moveresize,curmove
mousebind=NONE,btn_middle,togglemaximizescreen,0
mousebind=ALT,btn_right,moveresize,curresize
mousebind=SUPER,btn_right,moveresize,curresize
mousebind=NONE,btn_left,toggleoverview,1
mousebind=NONE,btn_right,killclient,0
@ -287,9 +251,7 @@ mousebind=NONE,btn_right,killclient,0
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
# Window Rules
windowrule=tags:2,appid:vesktop

BIN
demo.mp4

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

View file

@ -35,10 +35,6 @@ stdenv.mkDerivation {
(lib.mesonBool "asan" debug)
];
preConfigure = ''
rm -rf build
'';
nativeBuildInputs = [
meson
ninja

1
result
View file

@ -1 +0,0 @@
/nix/store/znxl3gxcqpx3bh1wdhhv7w5n2xxq05w2-mango-nightly

View file

@ -68,10 +68,9 @@ int32_t toggle_trackpad_enable(const Arg *arg);
int32_t setoption(const Arg *arg);
int32_t disable_monitor(const Arg *arg);
int32_t enable_monitor(const Arg *arg);
int32_t toggle_monitor(const Arg *arg);
int32_t expand_client_left(const Arg *arg);
int32_t collapse_client_right(const Arg *arg);
int32_t stack_with_left(const Arg *arg);
int32_t unstack(const Arg *arg);
int32_t revert_size(const Arg *arg);
int32_t toggle_monitor(const Arg *arg);

View file

@ -252,8 +252,7 @@ void scroller(Monitor *m) {
int32_t cur_gappih = enablegaps ? m->gappih : 0;
int32_t cur_gappoh = enablegaps ? m->gappoh : 0;
int32_t cur_gappov = enablegaps ? m->gappov : 0;
int32_t cur_gappiv = enablegaps ? m->gappiv : 0;
int32_t cur_gappiv = enablegaps ? m->gappiv : 0;
cur_gappih =
smartgaps && m->visible_scroll_tiling_clients == 1 ? 0 : cur_gappih;
@ -890,4 +889,4 @@ void tgmix(Monitor *m) {
grid(m);
return;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 789 KiB