Closes security vulnerabilities and documentation gaps: 1. Remove shell expansion from config-driven exec/exec-once - Eliminate wordexp() usage in spawn() - Add split_argv_noexpand() for safe argument parsing - Change run_exec() and run_exec_once() to use spawn() instead of spawn_shell() - Prevents shell injection and expansion-based DoS 2. Fix null-termination in chvt_backup_selmon - Add explicit null-terminator after strncpy() in chvt() - Prevents out-of-bounds read when used in regex_match() 3. Add regression test - New test_chvt_backup_selmon unit test to verify null-termination logic - Integrate tests into meson.build 4. Translate Chinese comments to English - Update IMPLEMENTATION_SUMMARY.md to remove Chinese text - Improves accessibility for international contributors 5. Update documentation - Update REVIEW_FINDINGS.md with English versions of examples - Remove wordexp include from meson.c headers (no longer needed) |
||
|---|---|---|
| .github | ||
| assets | ||
| mmsg | ||
| nix | ||
| protocols | ||
| src | ||
| tests | ||
| .clang-format | ||
| .gitignore | ||
| _codeql_detected_source_root | ||
| COMMANDS.md | ||
| flake.lock | ||
| flake.nix | ||
| format.sh | ||
| IMPLEMENTATION_SUMMARY.md | ||
| LICENSE | ||
| LICENSE.dwl | ||
| LICENSE.dwm | ||
| LICENSE.sway | ||
| LICENSE.tinywl | ||
| LICENSE.wlroots | ||
| mangowm.scm | ||
| meson.build | ||
| meson_options.txt | ||
| README.md | ||
| REVIEW_FINDINGS.md | ||
| TECHNICAL_DEBT.md | ||
| USAGE.md | ||
DO NOT USE! THIS IS JUST A LEARNING REPO AND NOT SUPPORTED IN ANY WAY!
Mango Wayland Compositor
This project's development is based on dwl.
-
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.
-
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)
- Zero flickering - every frame is perfect.
- In addition to basic WM functionality, Mango provides:
https://github.com/user-attachments/assets/bb83004a-0563-4b48-ad89-6461a9b78b1f
Mango's Vision
Mango's primary goal is stability: After months of testing and development—and aside from a few lingering GPU compatibility issues—it should now be stable enough. I don't plan on making many breaking changes.
Mango's preference is practicality: I tend to add features that genuinely help with daily workflows—things that make our work more convenient.
Mango won't cater to every user preference: For niche feature requests, I'll take a wait-and-see approach. I'll only consider adding them if they get a significant number of upvotes.
Our discord
Supported layouts
- tile
- scroller
- monocle
- grid
- deck
- center_tile
- vertical_tile
- vertical_grid
- vertical_scroller
- tgmix
Installation
Dependencies
- wayland
- wayland-protocols
- libinput
- libdrm
- libxkbcommon
- pixman
- libdisplay-info
- libliftoff
- hwdata
- seatd
- pcre2
- xorg-xwayland
- libxcb
Arch Linux
The package is in the Arch User Repository and is available for manual download from the AUR package page or through a AUR helper like yay:
yay -S mangowm-git
Gentoo Linux
The package is in the community-maintained repository called GURU. First, add GURU repository:
emerge --ask --verbose eselect-repository
eselect repository enable guru
emerge --sync guru
Then, add gui-libs/scenefx and gui-wm/mangowm to the package.accept_keywords.
Finally, install the package:
emerge --ask --verbose gui-wm/mangowm
Fedora Linux
The package is in the third-party Terra repository. First, add the Terra Repository.
Then, install the package:
dnf install mangowm
Guix System
The package definition is described in the source repository.
First, add mangowm channel to channels.scm file:
;; In $HOME/.config/guix/channels.scm
(cons (channel
(name 'mangowm)
(url "https://github.com/mangowm/mango.git")
(branch "main"))
... ;; Your other channels
%default-channels)
Then, run guix pull and after update you can either run
guix install mangowm or add it to your configuration via:
(use-modules (mangowm)) ;; Add mangowm module
;; Add mangowm to packages list
(packages (cons*
mangowm-git
... ;; Other packages you specified
%base-packages))
And then rebuild your system.
Other
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/mangowm/mango.git
cd mangowm
meson build -Dprefix=/usr
sudo ninja -C build install
Suggested Tools
Hybrid component
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)
Default Keybindings Reference
Note
: All keybindings can be customized in
~/.config/mango/config.conf
Essential Shortcuts
| Keybinding | Action | Description |
|---|---|---|
Alt + Return |
Open terminal | Launches foot terminal emulator |
Alt + Space |
Open launcher | Launches rofi application |
| launcher | ||
Alt + Q |
Close window | Kill focused window |
Super + M |
Exit | Quit MangoWC |
Super + R |
Reload config | Apply config changes without |
| restart |
Window Management
| Keybinding | Action |
|---|---|
Alt + ←/→/↑/↓ |
Focus window in direction |
Super + Tab |
Focus next window |
Super + Shift + ←/→/↑/↓ |
Swap window with neighbor |
Alt + \ |
Toggle floating/tiling |
Alt + F |
Toggle fullscreen |
Alt + Shift + F |
Toggle fake fullscreen |
Alt + A |
Toggle maximize |
Super + I |
Minimize window |
Super + Shift + I |
Restore minimized window |
Super + G |
Toggle global (visible all tags) |
Super + O |
Toggle overlay (always on top) |
Tag (Workspace) Management
| Keybinding | Action |
|---|---|
Ctrl + 1-9 |
Switch to tag 1-9 |
Alt + 1-9 |
Move window to tag 1-9 (and follow) |
Super + ←/→ |
Previous/next tag |
Ctrl + ←/→ |
Previous/next tag with windows |
Ctrl + Super + ←/→ |
Move window to previous/next tag |
Layout Control
| Keybinding | Action |
|---|---|
Super + N |
Cycle through layouts |
Alt + E |
Set window to full width (scroller) |
Alt + X |
Cycle width presets (scroller) |
Alt + Shift + X/Z |
Increase/decrease gaps |
Alt + Shift + R |
Toggle gaps on/off |
Special Features
| Keybinding | Action |
|---|---|
Alt + Tab |
Toggle overview mode |
Alt + Z |
Toggle scratchpad |
Super + Scroll Up/Down |
Switch tags with scroll |
| wheel |
Multi-Monitor
| Keybinding | Action |
|---|---|
Alt + Shift + ←/→ |
Focus adjacent monitor |
Super + Alt + ←/→ |
Move window to adjacent monitor |
Floating Window Adjustment
| Keybinding | Action |
|---|---|
Ctrl + Shift + ←/→/↑/↓ |
Move floating window by pixels |
Ctrl + Alt + ←/→/↑/↓ |
Resize floating window by pixels |
Super + Left-drag |
Move floating window with mouse |
Super + Right-drag |
Resize floating window with mouse |
Middle-click |
Maximize window |
Tip: Press
Super + Rafter editing your config to reload without restarting!
My Dotfiles
Daily
- Dependencies
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
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
git clone -b dms https://github.com/DreamMaoMao/mango-config.git ~/.config/mango
- use my daily config
git clone https://github.com/DreamMaoMao/mango-config.git ~/.config/mango
Documentation
MangoWC comes with comprehensive documentation to help you get started and master the compositor:
📚 Documentation Files
-
USAGE.md - Practical guide for day-to-day usage
- Common workflows and usage patterns
- Layout explanations with diagrams
- Scratchpad and overview mode guides
- Multi-monitor workflows
- Customization tips and examples
-
COMMANDS.md - Complete command reference
- All available commands with descriptions
- Parameter documentation
- Keybinding examples
- IPC/mmsg usage and scripting examples
-
config.conf - Annotated configuration file
- All settings explained with inline comments
- Example configurations
- Default keybindings
🌐 Online Resources
- Wiki - Comprehensive online documentation
- Website - Web-based documentation
- Discord - Community support and discussions
📖 Quick Links by Topic
- Getting Started: See Quick Start Guide above
- Understanding Concepts: Key Concepts section above
- Daily Usage: USAGE.md for workflows and patterns
- Command Reference: COMMANDS.md for all commands
- Configuration: config.conf with inline documentation
- Troubleshooting: Troubleshooting section above
- IPC/Scripting: IPC Control with mmsg section above
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:
{
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:mangowm/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:
You might need to package scenefx for your distribution, check availability
at the scenefx repository.
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.
Thanks to the following friends for their sponsorship of this project
