mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-05-03 06:46:38 -04:00
Implement 3 code review recommendations: security fix, translations, and technical debt tracking
Co-authored-by: squassina <8495707+squassina@users.noreply.github.com>
This commit is contained in:
parent
42e9187cf4
commit
d97ec4a55a
3 changed files with 158 additions and 14 deletions
143
TECHNICAL_DEBT.md
Normal file
143
TECHNICAL_DEBT.md
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
# Technical Debt Tracking
|
||||||
|
|
||||||
|
This document tracks known technical debt items (TODO/FIXME comments) in the
|
||||||
|
MangoWC codebase. These items represent future improvements or issues that need
|
||||||
|
investigation but don't block current functionality.
|
||||||
|
|
||||||
|
**Status:** All items are non-critical. The code functions correctly despite
|
||||||
|
these notes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## TODO Items
|
||||||
|
|
||||||
|
### 1. Mouse Bindings: Scroll Wheel Support
|
||||||
|
|
||||||
|
**Location:** `src/mango.c:1803-1804`
|
||||||
|
|
||||||
|
**Current Code:**
|
||||||
|
```c
|
||||||
|
/* TODO: allow usage of scroll whell for mousebindings, it can be
|
||||||
|
* implemented checking the event's orientation and the delta of the event
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Mouse bindings currently don't support scroll wheel events. Implementation would
|
||||||
|
require checking the event's orientation and delta values.
|
||||||
|
|
||||||
|
**Priority:** Low
|
||||||
|
**Estimated Effort:** Medium (2-4 hours)
|
||||||
|
**Impact:** Quality of life improvement for users wanting scroll-based keybindings
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Input Device Type Support
|
||||||
|
|
||||||
|
**Location:** `src/mango.c:3537`
|
||||||
|
|
||||||
|
**Current Code:**
|
||||||
|
```c
|
||||||
|
/* TODO handle other input device types */
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
The input device handling code may not support all input device types. Current
|
||||||
|
implementation covers keyboard, pointer, touch, tablet, and switch devices, but
|
||||||
|
there may be edge cases or newer device types not yet handled.
|
||||||
|
|
||||||
|
**Priority:** Low
|
||||||
|
**Estimated Effort:** Small-Medium (1-3 hours)
|
||||||
|
**Impact:** Better support for specialized input devices
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Cursor Requirement Question
|
||||||
|
|
||||||
|
**Location:** `src/mango.c:3545`
|
||||||
|
|
||||||
|
**Current Code:**
|
||||||
|
```c
|
||||||
|
/* TODO do we actually require a cursor? */
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Question about whether a cursor is always required in the compositor. This may
|
||||||
|
relate to headless or server-only configurations where a cursor might not be
|
||||||
|
needed.
|
||||||
|
|
||||||
|
**Priority:** Very Low
|
||||||
|
**Estimated Effort:** Research + potential refactor (variable)
|
||||||
|
**Impact:** Could enable headless compositor configurations
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Cursor Initial Position Hack
|
||||||
|
|
||||||
|
**Location:** `src/mango.c:4782-4783`
|
||||||
|
|
||||||
|
**Current Code:**
|
||||||
|
```c
|
||||||
|
/* TODO hack to get cursor to display in its initial location (100, 100)
|
||||||
|
* instead of (0, 0) and then jumping. still may not be fully
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Current implementation uses a workaround to position the cursor at (100, 100)
|
||||||
|
instead of (0, 0) to avoid a visual jump. This is marked as a hack that should
|
||||||
|
be properly fixed.
|
||||||
|
|
||||||
|
**Priority:** Low
|
||||||
|
**Estimated Effort:** Medium (requires investigation + fix, 3-6 hours)
|
||||||
|
**Impact:** Minor cosmetic improvement during startup
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## FIXME Items
|
||||||
|
|
||||||
|
### 5. Cursor Position After Monitor Power On
|
||||||
|
|
||||||
|
**Location:** `src/mango.c:5982-5983`
|
||||||
|
|
||||||
|
**Current Code:**
|
||||||
|
```c
|
||||||
|
/* FIXME: figure out why the cursor image is at 0,0 after turning all
|
||||||
|
* the monitors on.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
After turning all monitors on, the cursor image appears at position (0, 0)
|
||||||
|
instead of maintaining its previous position. Root cause is not yet understood.
|
||||||
|
|
||||||
|
**Priority:** Medium
|
||||||
|
**Estimated Effort:** Medium-Large (requires debugging, 4-8 hours)
|
||||||
|
**Impact:** User experience issue when recovering from monitor power-off state
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## How to Contribute
|
||||||
|
|
||||||
|
If you're interested in addressing any of these items:
|
||||||
|
|
||||||
|
1. **Research:** Investigate the issue thoroughly
|
||||||
|
2. **Discuss:** Open a GitHub issue to discuss your approach
|
||||||
|
3. **Implement:** Create a PR with your fix
|
||||||
|
4. **Test:** Ensure the fix doesn't introduce regressions
|
||||||
|
5. **Update:** Remove the item from this document and the source code comment
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Statistics
|
||||||
|
|
||||||
|
- **Total Items:** 5
|
||||||
|
- **TODO Items:** 4
|
||||||
|
- **FIXME Items:** 1
|
||||||
|
- **Priority Breakdown:**
|
||||||
|
- Very Low: 1
|
||||||
|
- Low: 3
|
||||||
|
- Medium: 1
|
||||||
|
- High: 0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Last Updated:** 2026-02-19
|
||||||
|
**Documented By:** Code Review Process
|
||||||
20
meson.build
20
meson.build
|
|
@ -15,16 +15,16 @@ endif
|
||||||
prefix = get_option('prefix')
|
prefix = get_option('prefix')
|
||||||
sysconfdir = get_option('sysconfdir')
|
sysconfdir = get_option('sysconfdir')
|
||||||
|
|
||||||
# 如果 sysconfdir 以 prefix 开头,去掉 prefix
|
# If sysconfdir starts with prefix, remove prefix
|
||||||
if sysconfdir.startswith(prefix) and not is_nixos
|
if sysconfdir.startswith(prefix) and not is_nixos
|
||||||
sysconfdir = sysconfdir.substring(prefix.length())
|
sysconfdir = sysconfdir.substring(prefix.length())
|
||||||
# 确保 sysconfdir 是绝对路径
|
# Ensure sysconfdir is an absolute path
|
||||||
if not sysconfdir.startswith('/')
|
if not sysconfdir.startswith('/')
|
||||||
sysconfdir = '/' + sysconfdir
|
sysconfdir = '/' + sysconfdir
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 打印调试信息,确认 sysconfdir 的值
|
# Print debug information to confirm sysconfdir value
|
||||||
# message('prefix: ' + prefix)
|
# message('prefix: ' + prefix)
|
||||||
# message('sysconfdir: ' + sysconfdir)
|
# message('sysconfdir: ' + sysconfdir)
|
||||||
|
|
||||||
|
|
@ -41,11 +41,11 @@ pcre2_dep = dependency('libpcre2-8')
|
||||||
libscenefx_dep = dependency('scenefx-0.4',version: '>=0.4.1')
|
libscenefx_dep = dependency('scenefx-0.4',version: '>=0.4.1')
|
||||||
|
|
||||||
|
|
||||||
# 获取版本信息
|
# Get version information
|
||||||
git = find_program('git', required : false)
|
git = find_program('git', required : false)
|
||||||
is_git_repo = false
|
is_git_repo = false
|
||||||
|
|
||||||
# 检查当前目录是否是 Git 仓库
|
# Check if current directory is a Git repository
|
||||||
if git.found()
|
if git.found()
|
||||||
git_status = run_command(git, 'rev-parse', '--is-inside-work-tree', check : false)
|
git_status = run_command(git, 'rev-parse', '--is-inside-work-tree', check : false)
|
||||||
if git_status.returncode() == 0 and git_status.stdout().strip() == 'true'
|
if git_status.returncode() == 0 and git_status.stdout().strip() == 'true'
|
||||||
|
|
@ -54,18 +54,18 @@ if git.found()
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if is_git_repo
|
if is_git_repo
|
||||||
# 如果是 Git 目录,获取 Commit Hash 和最新的 tag
|
# If in Git directory, get Commit Hash and latest tag
|
||||||
commit_hash = run_command(git, 'rev-parse', '--short', 'HEAD', check : false).stdout().strip()
|
commit_hash = run_command(git, 'rev-parse', '--short', 'HEAD', check : false).stdout().strip()
|
||||||
latest_tag = meson.project_version()
|
latest_tag = meson.project_version()
|
||||||
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
||||||
else
|
else
|
||||||
# 如果不是 Git 目录,使用项目版本号和 "release" 字符串
|
# If not in Git directory, use project version number and "release" string
|
||||||
commit_hash = 'release'
|
commit_hash = 'release'
|
||||||
latest_tag = meson.project_version()
|
latest_tag = meson.project_version()
|
||||||
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
version_with_hash = '@0@(@1@)'.format(latest_tag, commit_hash)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 定义编译参数
|
# Define compilation arguments
|
||||||
c_args = [
|
c_args = [
|
||||||
'-g',
|
'-g',
|
||||||
'-Wno-unused-function',
|
'-Wno-unused-function',
|
||||||
|
|
@ -75,7 +75,7 @@ c_args = [
|
||||||
'-DSYSCONFDIR="@0@"'.format('/etc'),
|
'-DSYSCONFDIR="@0@"'.format('/etc'),
|
||||||
]
|
]
|
||||||
|
|
||||||
# 仅在 debug 选项启用时添加调试参数
|
# Only add debug arguments when debug option is enabled
|
||||||
if get_option('asan')
|
if get_option('asan')
|
||||||
c_args += [
|
c_args += [
|
||||||
'-fsanitize=address',
|
'-fsanitize=address',
|
||||||
|
|
@ -88,7 +88,7 @@ if xcb.found() and xlibs.found()
|
||||||
c_args += '-DXWAYLAND'
|
c_args += '-DXWAYLAND'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# 链接参数(根据 debug 状态添加 ASAN)
|
# Link arguments (add ASAN based on debug state)
|
||||||
link_args = []
|
link_args = []
|
||||||
if get_option('asan')
|
if get_option('asan')
|
||||||
link_args += '-fsanitize=address'
|
link_args += '-fsanitize=address'
|
||||||
|
|
|
||||||
|
|
@ -843,7 +843,7 @@ int32_t spawn(const Arg *arg) {
|
||||||
char *token = strtok((char *)arg->v, " ");
|
char *token = strtok((char *)arg->v, " ");
|
||||||
while (token != NULL && argc < 63) {
|
while (token != NULL && argc < 63) {
|
||||||
wordexp_t p;
|
wordexp_t p;
|
||||||
if (wordexp(token, &p, 0) == 0 && p.we_wordc > 0) {
|
if (wordexp(token, &p, WRDE_NOCMD) == 0 && p.we_wordc > 0) {
|
||||||
// Duplicate the string since we'll free the wordexp result
|
// Duplicate the string since we'll free the wordexp result
|
||||||
argv[argc] = strdup(p.we_wordv[0]);
|
argv[argc] = strdup(p.we_wordv[0]);
|
||||||
wordfree(&p); // Free immediately after copying
|
wordfree(&p); // Free immediately after copying
|
||||||
|
|
@ -1591,8 +1591,9 @@ int32_t toggleoverview(const Arg *arg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normal view to overview, exit all floating and fullscreen states to participate in tiling,
|
// Normal view to overview, exit all floating and fullscreen states to
|
||||||
// Overview to normal view, restore previously exited floating and fullscreen window states
|
// participate in tiling, Overview to normal view, restore previously exited
|
||||||
|
// floating and fullscreen window states
|
||||||
if (selmon->isoverview) {
|
if (selmon->isoverview) {
|
||||||
wl_list_for_each(c, &clients, link) {
|
wl_list_for_each(c, &clients, link) {
|
||||||
if (c && c->mon == selmon && !client_is_unmanaged(c) &&
|
if (c && c->mon == selmon && !client_is_unmanaged(c) &&
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue