view parser/parser.h @ 1:50bab568625d default tip

lol
author tsukasa <qwerasdnoob@gmail.com>
date Sat, 11 Jul 2026 17:56:41 +0800
parents
children
line wrap: on
line source

#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