# 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** is POSIX make. Do not introduce autotools, CMake, or meson. - Ensure your code compiles cleanly with `make debug` and `make release` -- CI checks both targets. These guidelines are suggestions, not hard rules. When in doubt, match the style of the surrounding code.