Files
tsukasa 01a1dbec8e init
2026-07-12 01:07:23 +08:00

156 lines
3.6 KiB
C

#ifndef SWINDLE_PARSER_H
#define SWINDLE_PARSER_H
#include <stdint.h>
#include <stdbool.h>
#include <wayland-server-core.h>
/* Maximum lengths. Good for the soul, they say */
#define CFG_MAX_RULES 64
#define CFG_MAX_MONITORS 16
#define CFG_MAX_KEYBINDS 256
#define CFG_MAX_ARGS 16
#define CFG_MAX_STRLEN 256
#define CFG_MAX_AUTOSTART 32
#define CFG_MAX_AUTOSTART_CMD 512
/* Appearance */
typedef struct {
unsigned int inner_border_px;
unsigned int outer_border_px;
unsigned int gaps;
bool smart_gaps;
float inner_border_color[4];
float outer_border_color[4];
float inner_focus_color[4];
float outer_focus_color[4];
float inner_urgent_color[4];
float outer_urgent_color[4];
float root_color[4];
float fullscreen_bg[4];
} CfgAppearance;
/* Input */
typedef struct {
int repeat_rate;
int repeat_delay;
bool tap_to_click;
bool tap_and_drag;
bool drag_lock;
bool natural_scrolling;
bool disable_while_typing;
bool left_handed;
bool middle_button_emulation;
int scroll_method; /* libinput enum value */
int click_method; /* libinput enum value */
int send_events_mode;
int accel_profile; /* libinput enum value */
double accel_speed;
int tap_button_map; /* libinput enum value */
} CfgInput;
/* Window Rules */
typedef struct {
char app_id[CFG_MAX_STRLEN];
char title[CFG_MAX_STRLEN]; /* empty string = wildcard */
uint32_t tags;
bool floating;
int monitor; /* -1 = current */
} CfgRule;
/* Monitor Rules */
typedef struct {
char name[CFG_MAX_STRLEN]; /* empty = catch-all */
float mfact;
int nmaster;
float scale;
char layout[CFG_MAX_STRLEN]; /* "dwindle", "floating", etc. */
int transform; /* WL_OUTPUT_TRANSFORM_* */
int x, y; /* -1,-1 = autoconfigure */
} CfgMonitorRule;
/* keybinds */
typedef struct {
uint32_t mods; /* WLR_MODIFIER_* bitmask */
uint32_t key; /* XKB keysym */
char action[CFG_MAX_STRLEN]; /* "spawn", "killclient", etc. */
char args[CFG_MAX_ARGS][CFG_MAX_STRLEN];
int nargs;
} CfgKeybind;
/* mouse buttons */
typedef struct {
uint32_t mods;
uint32_t button;
char action[CFG_MAX_STRLEN];
char args[CFG_MAX_ARGS][CFG_MAX_STRLEN];
int nargs;
} CfgButton;
/* Autostart */
typedef struct {
char cmd[CFG_MAX_AUTOSTART_CMD];
} CfgAutostart;
/* the whole shebang */
typedef struct {
CfgAppearance appearance;
CfgInput input;
CfgRule rules[CFG_MAX_RULES];
int nrules;
CfgMonitorRule monitors[CFG_MAX_MONITORS];
int nmonitors;
CfgKeybind keybinds[CFG_MAX_KEYBINDS];
int nkeybinds;
CfgButton buttons[CFG_MAX_KEYBINDS];
int nbuttons;
bool sloppyfocus;
bool bypass_surface_visibility;
int log_level; /* WLR_* log level */
CfgAutostart autostart[CFG_MAX_AUTOSTART];
int nautostart;
} Config;
/* Public API */
int config_load(const char *path, Config *cfg);
char *config_get_path(char *buf, size_t bufsz);
void config_apply_appearance(const Config *cfg);
void config_apply_input(const Config *cfg);
void config_apply_keybinds(const Config *cfg);
void config_autostart_run(const Config *cfg);
typedef void (*config_reload_cb)(const Config *cfg, void *userdata);
struct wl_event_source *config_watch_start(
struct wl_event_loop *loop,
const char *path,
config_reload_cb cb,
void *userdata
);
void config_watch_stop(struct wl_event_source *src);
#endif