Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move default config to installed file #434

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 24 additions & 126 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,47 +17,9 @@ static int32_t max(int32_t a, int32_t b) {
return (a > b) ? a : b;
}

void init_default_config(struct mako_config *config) {
static void init_config(struct mako_config *config) {
memset(config, 0, sizeof(struct mako_config));
wl_list_init(&config->criteria);
struct mako_criteria *new_criteria = create_criteria(config);
init_default_style(&new_criteria->style);
new_criteria->raw_string = strdup("(root)");

// Hide grouped notifications by default, and put the group count in
// their format...
new_criteria = create_criteria(config);
init_empty_style(&new_criteria->style);
new_criteria->grouped = true;
new_criteria->spec.grouped = true;
new_criteria->style.invisible = true;
new_criteria->style.spec.invisible = true;
new_criteria->style.format = strdup("(%g) <b>%s</b>\n%b");
new_criteria->style.spec.format = true;
new_criteria->raw_string = strdup("(default grouped)");

// ...but make the first one in the group visible.
new_criteria = create_criteria(config);
init_empty_style(&new_criteria->style);
new_criteria->group_index = 0;
new_criteria->spec.group_index = true;
new_criteria->style.invisible = false;
new_criteria->style.spec.invisible = true;
new_criteria->raw_string = strdup("(default group-index=0)");

// Define the default format for the hidden placeholder notification.
new_criteria = create_criteria(config);
init_empty_style(&new_criteria->style);
new_criteria->hidden = true;
new_criteria->spec.hidden = true;
new_criteria->style.format = strdup("(%h more)");
new_criteria->style.spec.format = true;
new_criteria->raw_string = strdup("(default hidden)");

init_empty_style(&config->superstyle);

config->max_history = 5;
config->sort_criteria = MAKO_SORT_CRITERIA_TIME;
config->sort_asc = 0;
}

void finish_config(struct mako_config *config) {
Expand All @@ -69,72 +31,6 @@ void finish_config(struct mako_config *config) {
finish_style(&config->superstyle);
}

void init_default_style(struct mako_style *style) {
style->width = 300;
style->height = 100;

style->outer_margin.top = 0;
style->outer_margin.right = 0;
style->outer_margin.bottom = 0;
style->outer_margin.left = 0;

style->margin.top = 10;
style->margin.right = 10;
style->margin.bottom = 10;
style->margin.left = 10;

style->padding.top = 5;
style->padding.right = 5;
style->padding.bottom = 5;
style->padding.left = 5;

style->border_size = 2;
style->border_radius = 0;

#ifdef HAVE_ICONS
style->icons = true;
#else
style->icons = false;
#endif
style->max_icon_size = 64;
style->icon_path = strdup(""); // hicolor and pixmaps are implicit.

style->font = strdup("monospace 10");
style->markup = true;
style->format = strdup("<b>%s</b>\n%b");
style->text_alignment = PANGO_ALIGN_LEFT;

style->actions = true;
style->default_timeout = 0;
style->ignore_timeout = false;

style->colors.background = 0x285577FF;
style->colors.text = 0xFFFFFFFF;
style->colors.border = 0x4C7899FF;
style->colors.progress.value = 0x5588AAFF;
style->colors.progress.operator = CAIRO_OPERATOR_OVER;

style->group_criteria_spec.none = true;
style->invisible = false;
style->history = true;
style->icon_location = MAKO_ICON_LOCATION_LEFT;

style->output = strdup("");
style->layer = ZWLR_LAYER_SHELL_V1_LAYER_TOP;
style->max_visible = 5;

style->anchor =
ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT;

style->button_bindings.left.action = MAKO_BINDING_INVOKE_DEFAULT_ACTION;
style->button_bindings.right.action = MAKO_BINDING_DISMISS;
style->button_bindings.middle.action = MAKO_BINDING_NONE;
style->touch_binding.action = MAKO_BINDING_DISMISS;

// Everything in the default config is explicitly specified.
memset(&style->spec, true, sizeof(struct mako_style_spec));
}

void init_empty_style(struct mako_style *style) {
memset(style, 0, sizeof(struct mako_style));
}
Expand Down Expand Up @@ -722,21 +618,10 @@ static char *get_config_path(void) {
return NULL;
}

int load_config_file(struct mako_config *config, char *config_arg) {
char *path = NULL;
if (config_arg == NULL) {
path = get_config_path();
if (!path) {
return 0;
}
} else {
path = config_arg;
}

static int load_config_file(struct mako_config *config, char *path) {
FILE *f = fopen(path, "r");
if (!f) {
fprintf(stderr, "Unable to open %s for reading\n", path);
free(path);
return -1;
}
const char *base = basename(path);
Expand Down Expand Up @@ -800,7 +685,6 @@ int load_config_file(struct mako_config *config, char *config_arg) {
valid_option = apply_config_option(config, line, eq + 1);
}


if (!valid_option) {
fprintf(stderr, "[%s:%d] Failed to parse option '%s'\n",
base, lineno, line);
Expand All @@ -820,7 +704,6 @@ int load_config_file(struct mako_config *config, char *config_arg) {
free(section);
free(line);
fclose(f);
free(path);
return ret;
}

Expand Down Expand Up @@ -865,7 +748,7 @@ int parse_config_arguments(struct mako_config *config, int argc, char **argv) {
};

optind = 1;
char *config_arg = NULL;
const char *config_arg = NULL;
int opt_status = 0;
while (1) {
int option_index = -1;
Expand All @@ -876,23 +759,32 @@ int parse_config_arguments(struct mako_config *config, int argc, char **argv) {
opt_status = 1;
break;
} else if (c == 'c') {
free(config_arg);
config_arg = strdup(optarg);
config_arg = optarg;
} else if (c != 0) {
opt_status = -1;
break;
}
}

if (opt_status != 0) {
free(config_arg);
return opt_status;
}

int config_status = load_config_file(config, config_arg);
char *config_path = NULL;
if (config_arg == NULL) {
config_path = get_config_path();
} else {
config_path = strdup(config_arg);
}
if (!config_path) {
return -1;
}

int config_status = load_config_file(config, config_path);
if (config_status < 0) {
return -1;
}
free(config_path);

optind = 1;
while (1) {
Expand Down Expand Up @@ -920,7 +812,13 @@ int parse_config_arguments(struct mako_config *config, int argc, char **argv) {
// immediately due to something the user asked for (like help).
int reload_config(struct mako_config *config, int argc, char **argv) {
struct mako_config new_config = {0};
init_default_config(&new_config);
init_config(&new_config);

int ret = load_config_file(&new_config, SYSCONFDIR "/mako/config");
if (ret != 0) {
fprintf(stderr, "Failed to parse default config\n");
return ret;
}

int args_status = parse_config_arguments(&new_config, argc, argv);

Expand Down
37 changes: 37 additions & 0 deletions config.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
width=300
height=100
margin=10
padding=5
border-size=2
icons=@icons@
max-icon-size=64
font=monospace 10
markup=1
actions=1
history=1
format=<b>%s</b>\n%b
text-alignment=left
layer=top
max-visible=5
anchor=top-right

on-button-left=invoke-default-action
on-button-right=dismiss
on-touch=dismiss

max-history=5
sort=-time

# Hide grouped notifications by default, and put the group count in
# their format...
[grouped]
invisible=1
format=(%g) <b>%s</b>\n%b

# ...but make the first one in the group visible.
[group_index=0]
invisible=0

# Define the default format for the hidden placeholder notification.
[hidden]
format=(%h more)
3 changes: 0 additions & 3 deletions include/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,15 @@ struct mako_config {
struct mako_style superstyle;
};

void init_default_config(struct mako_config *config);
void finish_config(struct mako_config *config);

void init_default_style(struct mako_style *style);
void init_empty_style(struct mako_style *style);
void finish_style(struct mako_style *style);
bool apply_style(struct mako_style *target, const struct mako_style *style);
bool apply_superset_style(
struct mako_style *target, struct mako_config *config);

int parse_config_arguments(struct mako_config *config, int argc, char **argv);
int load_config_file(struct mako_config *config, char *config_arg);
int reload_config(struct mako_config *config, int argc, char **argv);
bool apply_global_option(struct mako_config *config, const char *name,
const char *value);
Expand Down
4 changes: 0 additions & 4 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,10 @@ int main(int argc, char *argv[]) {
wl_list_init(&state.surfaces);

// This is a bit wasteful, but easier than special-casing the reload.
init_default_config(&state.config);
int ret = reload_config(&state.config, argc, argv);

if (ret < 0) {
finish_config(&state.config);
return EXIT_FAILURE;
} else if (ret > 0) {
finish_config(&state.config);
printf("%s", usage);
return EXIT_SUCCESS;
}
Expand Down
10 changes: 10 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ if (not cc.has_function('timerfd_create', prefix: '#include <sys/timerfd.h>') or
epoll = dependency('epoll-shim')
endif

add_project_arguments('-DSYSCONFDIR="@0@"'.format(get_option('sysconfdir')), language: 'c')

if get_option('sd-bus-provider') == 'auto'
assert(get_option('auto_features').auto(), 'sd-bus-provider must not be set to auto since auto_features != auto')
sdbus = dependency('libsystemd', 'libelogind', 'basu')
Expand Down Expand Up @@ -105,6 +107,7 @@ install_data(

conf_data = configuration_data()
conf_data.set('bindir', get_option('prefix') / get_option('bindir'))
conf_data.set('icons', gdk_pixbuf.found().to_int())

configure_file(
configuration: conf_data,
Expand All @@ -113,6 +116,13 @@ configure_file(
install_dir: get_option('datadir') + '/dbus-1/services',
)

configure_file(
configuration: conf_data,
input: 'config.in',
output: '@BASENAME@',
install_dir: get_option('sysconfdir') + '/mako/config',
)

scdoc = dependency('scdoc', required: get_option('man-pages'), version: '>= 1.9.7', native: true)
if scdoc.found()
man_pages = ['mako.1.scd', 'mako.5.scd', 'makoctl.1.scd']
Expand Down