Merge branch 'mangowm:main' into main

This commit is contained in:
Ernesto Cruz 2026-04-06 11:25:07 +00:00 committed by GitHub
commit c00b05f306
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 28 deletions

View file

@ -15,7 +15,7 @@
#:use-module (gnu packages ninja)
#:use-module (gnu packages pkg-config)
#:use-module (guix build-system meson)
#:use-module (guix licenses))
#:use-module ((guix licenses) #:prefix license:))
(define-public mangowm-git
@ -36,10 +36,13 @@
(add-before 'configure 'patch-meson
(lambda _
(substitute* "meson.build"
;; MangoWM ignores sysconfdir handling for NixOS.
;; We also need to skip that sysconfdir edits.
(("is_nixos = false")
"is_nixos = true")
;; Unhardcode path. Fixes loading default config.
(("'-DSYSCONFDIR=\\\"@0@\\\"'.format\\('/etc'\\)")
"'-DSYSCONFDIR=\"@0@\"'.format(sysconfdir)")
(("sysconfdir = sysconfdir.substring\\(prefix.length\\(\\)\\)")
"")))))))
"'-DSYSCONFDIR=\"@0@\"'.format(sysconfdir)")))))))
(inputs (list wayland
libinput
libdrm
@ -52,14 +55,17 @@
pcre2
libxcb
xcb-util-wm
wlroots
wlroots-0.19
scenefx))
(native-inputs (list pkg-config wayland-protocols))
(home-page "https://github.com/DreamMaoMao/mangowm")
(home-page "https://github.com/mangowm/mango")
(synopsis "Wayland compositor based on wlroots and scenefx")
(description "A Wayland compositor based on wlroots and scenefx,
inspired by dwl but aiming to be more feature-rich.")
(license gpl3)))
(description
"MangoWM is a modern, lightweight, high-performance Wayland compositor
built on dwl crafted for speed, flexibility, and a customizable desktop experience.")
(license (list license:gpl3 ;mangowm itself, dwl
license:expat ;dwm, sway, wlroots
license:cc0)))) ;tinywl
(define-deprecated-package mangowc
mangowm-git)

View file

@ -913,7 +913,6 @@ int32_t spawn_shell(const Arg *arg) {
}
int32_t spawn(const Arg *arg) {
if (!arg->v)
return 0;
@ -926,28 +925,21 @@ int32_t spawn(const Arg *arg) {
dup2(STDERR_FILENO, STDOUT_FILENO);
setsid();
// 2. 解析参数
char *argv[64];
int32_t argc = 0;
char *token = strtok((char *)arg->v, " ");
while (token != NULL && argc < 63) {
wordexp_t p;
if (wordexp(token, &p, 0) == 0) {
argv[argc++] = p.we_wordv[0];
} else {
argv[argc++] = token;
}
token = strtok(NULL, " ");
// 2. 对整个参数字符串进行单词展开
wordexp_t p;
if (wordexp(arg->v, &p, 0) != 0) {
wlr_log(WLR_DEBUG, "mango: wordexp failed for '%s'\n", arg->v);
_exit(EXIT_FAILURE);
}
argv[argc] = NULL;
// 3. 执行命令
execvp(argv[0], argv);
// 3. 执行命令p.we_wordv 已经是 argv 数组)
execvp(p.we_wordv[0], p.we_wordv);
// 4. execvp 失败时:打印错误并直接退出(避免 coredump
wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", argv[0],
// 4. execvp 失败时:打印错误,释放 wordexp 资源,然后退出
wlr_log(WLR_DEBUG, "mango: execvp '%s' failed: %s\n", p.we_wordv[0],
strerror(errno));
_exit(EXIT_FAILURE); // 使用 _exit 避免缓冲区刷新等操作
wordfree(&p); // 释放 wordexp 分配的内存
_exit(EXIT_FAILURE);
}
return 0;
}