Files
peachwm/CONTRIBUTING.md
T
huntedbytheirs 79e7e26a49 build(Makefile): LLD linker, objects/ dir, LTO+linker opts
- Compiler selection: Remove TCC, default to Clang, GCC fallback
- LLD linker: -fuse-ld=lld for all builds (peachwm + peachmsg)
- Object relocation: .o files output to objects/{src,parser,protocols,peachmsg}/
- Clean target: rm -rf objects + transitional stale .o cleanup
- Release: -flto=thin, linker opts (gc-sections, icf=safe, z now, etc.)
- Release: strip both peachwm and peachmsg binaries
- README + CONTRIBUTING: Add LLD dependency, update build docs
- .gitignore: Add objects/ directory
2026-07-05 20:27:47 -04:00

84 lines
2.8 KiB
Markdown

# Contributing
PeachWM is a completely open source project,
and grateful for any outside contributions that improve the project.
If you'd like to contribute, fork the project and create a pull request or issue.
Before contributing, please consider the following guidelines.
## How to Contribute
1. **Discuss first** -- Open an issue to discuss significant changes before
implementing them. This avoids wasted effort if the change isn't a good fit.
2. **Keep it focused** -- Each pull request should address a single concern.
Avoid mixing bug fixes, refactors, and features in the same PR.
3. **Test your changes** -- Run `make debug` (Clang with `-Weverything` and
sanitizers) and `make release` (`-Werror`) to ensure no warnings or errors.
4. **Match the existing style** -- See the Coding Style section below.
## Coding Style
PeachWM follows a consistent style throughout the codebase. Please match it.
### Indentation and Formatting
- **2-space indentation** -- No tabs, no 4-space indents.
- **K&R brace style** -- Opening brace on the same line as the statement.
- **Return type on its own line** -- Every function declaration and definition
places the return type on a separate line:
```c
static inline int
client_is_x11(Client *c)
{
...
}
```
- **No extra spaces inside parentheses** -- `if (cond)`, `func(a, b)`.
- **Pointer asterisk attached to the name** -- `Client *c`, not `Client* c`.
### Naming Conventions
- **Functions and variables:** `snake_case`
- **Types (structs, enums, typedefs):** `PascalCase`
- **Macros:** `UPPER_SNAKE_CASE`
- **Enum values:** `PascalCase` (e.g., `CurNormal`, `XDGShell`, `LyrBg`)
### Code Patterns
- **Use `wl_list`** for intrusive linked lists (Wayland native pattern).
- **Use the `LISTEN` macro** to attach `wl_signal` handlers:
```c
LISTEN(&server->new_output, &output_listener, handle_new_output);
```
- **Follow the `wl_container_of` pattern** in event listeners:
```c
void
handle_new_output(struct wl_listener *listener, void *data)
{
Monitor *m = wl_container_of(listener, m, frame);
...
}
```
- **Guard X11-specific code** with `#ifdef XWAYLAND` / `#endif`.
- **Use `ecalloc()`** instead of raw `malloc()` -- it calls `die()` on OOM.
- **Prefer static inline functions in headers** over function pointers,
consistent with `include/client.h`.
### Build and Compiler
- The project uses **C23** (`-std=c23`).
- The **Makefile** uses GNU make extensions (`.ONESHELL`, `ifeq`, target-specific
variables). Do not introduce autotools, CMake, or meson.
- Ensure your code compiles cleanly with `make debug` and `make release` -- the
project requires Clang (default) and the LLD linker for building. CI checks
both targets.
These guidelines are suggestions, not hard rules. When in doubt, match the
style of the surrounding code.