mirror of
https://github.com/labwc/labwc.git
synced 2026-04-12 08:21:13 -04:00
Add the -m|--merge-config command line option to iterate backwards over XDG Base Dir paths and read config/theme files multiple times. For example if both ~/.config/labwc/rc.xml and /etc/xdg/labwc/rc.xml exist, the latter will be read first and then the former (if --merge-config is enabled). When $XDG_CONFIG_HOME is defined, make it replace (not augment) $HOME/.config. Similarly, make $XDG_CONFIG_DIRS replace /etc/xdg when defined. XDG Base Dir Spec does not specify whether or not an application (or a compositor!) should (a) define that only the file under the most important base directory should be used, or (b) define rules for merging the information from the different files. ref: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html In the case of labwc there is a use-case for both positions, just to be clear, the default behaviour, described by position (a) above, does NOT change. This change affects the following config/theme files: - rc.xml - menu.xml - autostart - environment - themerc - themerc-override - Theme buttons, for example max.xbm Instead of caching global config/theme directories, create lists of paths (e.g. '/home/foo/.config/labwc/rc.xml', '/etc/xdg/labwc/rc.xml', etc). This creates more common parsing logic and just reversing the direction of iteration and breaks early if config-merge is not wanted. Enable better fallback for themes. For example if a particular theme does not exist in $HOME/.local/share/themes, it will be searched for in ~/.themes/ and so on. This also applies to theme buttons which now fallback on an individual basis. Avoid using stat() in most situations and just go straight to fopen(). Fixes #1406
143 lines
3 KiB
C
143 lines
3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
#ifndef LABWC_RCXML_H
|
|
#define LABWC_RCXML_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <wayland-server-core.h>
|
|
|
|
#include "common/border.h"
|
|
#include "common/buf.h"
|
|
#include "common/font.h"
|
|
#include "config/tablet.h"
|
|
#include "config/libinput.h"
|
|
#include "resize_indicator.h"
|
|
#include "theme.h"
|
|
|
|
enum window_switcher_field_content {
|
|
LAB_FIELD_NONE = 0,
|
|
LAB_FIELD_TYPE,
|
|
LAB_FIELD_IDENTIFIER,
|
|
LAB_FIELD_TRIMMED_IDENTIFIER,
|
|
LAB_FIELD_TITLE,
|
|
};
|
|
|
|
enum view_placement_policy {
|
|
LAB_PLACE_CENTER = 0,
|
|
LAB_PLACE_CURSOR,
|
|
LAB_PLACE_AUTOMATIC
|
|
};
|
|
|
|
enum adaptive_sync_mode {
|
|
LAB_ADAPTIVE_SYNC_DISABLED,
|
|
LAB_ADAPTIVE_SYNC_ENABLED,
|
|
LAB_ADAPTIVE_SYNC_FULLSCREEN,
|
|
};
|
|
|
|
struct usable_area_override {
|
|
struct border margin;
|
|
char *output;
|
|
struct wl_list link; /* struct rcxml.usable_area_overrides */
|
|
};
|
|
|
|
struct window_switcher_field {
|
|
enum window_switcher_field_content content;
|
|
int width;
|
|
struct wl_list link; /* struct rcxml.window_switcher.fields */
|
|
};
|
|
|
|
struct rcxml {
|
|
char *config_dir;
|
|
bool merge_config;
|
|
|
|
/* core */
|
|
bool xdg_shell_server_side_deco;
|
|
int gap;
|
|
enum adaptive_sync_mode adaptive_sync;
|
|
bool allow_tearing;
|
|
bool reuse_output_mode;
|
|
enum view_placement_policy placement_policy;
|
|
|
|
/* focus */
|
|
bool focus_follow_mouse;
|
|
bool focus_follow_mouse_requires_movement;
|
|
bool raise_on_focus;
|
|
|
|
/* theme */
|
|
char *theme_name;
|
|
int corner_radius;
|
|
bool ssd_keep_border;
|
|
struct font font_activewindow;
|
|
struct font font_inactivewindow;
|
|
struct font font_menuitem;
|
|
struct font font_osd;
|
|
/* Pointer to current theme */
|
|
struct theme *theme;
|
|
|
|
/* <margin top="" bottom="" left="" right="" output="" /> */
|
|
struct wl_list usable_area_overrides;
|
|
|
|
/* keyboard */
|
|
int repeat_rate;
|
|
int repeat_delay;
|
|
bool kb_numlock_enable;
|
|
bool kb_layout_per_window;
|
|
struct wl_list keybinds; /* struct keybind.link */
|
|
|
|
/* mouse */
|
|
long doubleclick_time; /* in ms */
|
|
struct wl_list mousebinds; /* struct mousebind.link */
|
|
double scroll_factor;
|
|
|
|
/* touch tablet */
|
|
struct touch_config {
|
|
char *output_name;
|
|
} touch;
|
|
|
|
/* graphics tablet */
|
|
struct tablet_config {
|
|
char *output_name;
|
|
struct wlr_fbox box;
|
|
enum rotation rotation;
|
|
uint16_t button_map_count;
|
|
struct button_map_entry button_map[BUTTON_MAP_MAX];
|
|
} tablet;
|
|
|
|
/* libinput */
|
|
struct wl_list libinput_categories;
|
|
|
|
/* resistance */
|
|
int screen_edge_strength;
|
|
|
|
/* window snapping */
|
|
int snap_edge_range;
|
|
bool snap_top_maximize;
|
|
|
|
enum resize_indicator_mode resize_indicator;
|
|
|
|
struct {
|
|
int popuptime;
|
|
int min_nr_workspaces;
|
|
struct wl_list workspaces; /* struct workspace.link */
|
|
} workspace_config;
|
|
|
|
/* Regions */
|
|
struct wl_list regions; /* struct region.link */
|
|
|
|
struct {
|
|
bool show;
|
|
bool preview;
|
|
bool outlines;
|
|
struct wl_list fields; /* struct window_switcher_field.link */
|
|
} window_switcher;
|
|
|
|
struct wl_list window_rules; /* struct window_rule.link */
|
|
};
|
|
|
|
extern struct rcxml rc;
|
|
|
|
void rcxml_parse_xml(struct buf *b);
|
|
void rcxml_read(const char *filename);
|
|
void rcxml_finish(void);
|
|
|
|
#endif /* LABWC_RCXML_H */
|