Added --define
This commit is contained in:
parent
d57ae47057
commit
5ec88a365e
@ -25,6 +25,8 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void config_put(struct map* map, char* line);
|
||||
|
||||
void config_load(struct map* map, const char* config);
|
||||
|
||||
char* config_get(struct map* config, const char* key, char* def_opt);
|
||||
|
@ -91,6 +91,9 @@ Specifies the location. See \fBwofi\fR(7) for more information, default is cente
|
||||
.TP
|
||||
.B \-a, \-\-no\-actions
|
||||
Disables multiple actions for modes that support it.
|
||||
.TP
|
||||
.B \-D, \-\-define=\fIKEY=VALUE\fR
|
||||
Sets a config option
|
||||
|
||||
.SH CONFIGURATION
|
||||
Wofi has 3 main files used for configuration. All files are completely optional.
|
||||
|
90
src/config.c
90
src/config.c
@ -17,51 +17,61 @@
|
||||
|
||||
#include <config.h>
|
||||
|
||||
void config_put(struct map* map, char* line) {
|
||||
line = strdup(line);
|
||||
char* hash = strchr(line, '#');
|
||||
if(hash != NULL) {
|
||||
if(hash == line || *(hash - 1) != '\\') {
|
||||
*hash = 0;
|
||||
}
|
||||
}
|
||||
char* backslash = strchr(line, '\\');
|
||||
size_t backslash_count = 0;
|
||||
while(backslash != NULL) {
|
||||
++backslash_count;
|
||||
backslash = strchr(backslash + 1, '\\');
|
||||
}
|
||||
size_t line_size = strlen(line);
|
||||
char* new_line = calloc(1, line_size + 1 - backslash_count);
|
||||
size_t new_line_count = 0;
|
||||
for(size_t count = 0; count < line_size; ++count) {
|
||||
if(line[count] == '\\') {
|
||||
continue;
|
||||
}
|
||||
new_line[new_line_count++] = line[count];
|
||||
}
|
||||
free(line);
|
||||
line = new_line;
|
||||
char* equals = strchr(line, '=');
|
||||
if(equals == NULL) {
|
||||
free(line);
|
||||
return;
|
||||
}
|
||||
*equals = 0;
|
||||
char* key = equals - 1;
|
||||
while(*key == ' ') {
|
||||
--key;
|
||||
}
|
||||
*(key + 1) = 0;
|
||||
char* value = equals + 1;
|
||||
while(*value == ' ') {
|
||||
++value;
|
||||
}
|
||||
size_t len = strlen(value);
|
||||
char* end = value + len - 1;
|
||||
if(*end == '\n' || *end == ' ') {
|
||||
*end = 0;
|
||||
}
|
||||
map_put(map, line, value);
|
||||
free(line);
|
||||
}
|
||||
|
||||
void config_load(struct map* map, const char* config) {
|
||||
FILE* file = fopen(config, "r");
|
||||
char* line = NULL;
|
||||
size_t size = 0;
|
||||
while(getline(&line, &size, file) != -1) {
|
||||
char* hash = strchr(line, '#');
|
||||
if(hash != NULL) {
|
||||
if(hash == line || *(hash - 1) != '\\') {
|
||||
*hash = 0;
|
||||
}
|
||||
}
|
||||
char* backslash = strchr(line, '\\');
|
||||
size_t backslash_count = 0;
|
||||
while(backslash != NULL) {
|
||||
++backslash_count;
|
||||
backslash = strchr(backslash + 1, '\\');
|
||||
}
|
||||
char* new_line = calloc(1, size - backslash_count);
|
||||
size_t line_size = strlen(line);
|
||||
size_t new_line_count = 0;
|
||||
for(size_t count = 0; count < line_size; ++count) {
|
||||
if(line[count] == '\\') {
|
||||
continue;
|
||||
}
|
||||
new_line[new_line_count++] = line[count];
|
||||
}
|
||||
free(line);
|
||||
line = new_line;
|
||||
char* equals = strchr(line, '=');
|
||||
if(equals == NULL) {
|
||||
continue;
|
||||
}
|
||||
*equals = 0;
|
||||
char* key = equals - 1;
|
||||
while(*key == ' ') {
|
||||
--key;
|
||||
}
|
||||
*(key + 1) = 0;
|
||||
char* value = equals + 1;
|
||||
while(*value == ' ') {
|
||||
++value;
|
||||
}
|
||||
size_t len = strlen(value);
|
||||
*(value + len - 1) = 0;
|
||||
map_put(map, line, value);
|
||||
config_put(map, line);
|
||||
}
|
||||
free(line);
|
||||
fclose(file);
|
||||
|
31
src/main.c
31
src/main.c
@ -34,6 +34,11 @@ static char* config_path;
|
||||
static char* stylesheet;
|
||||
static char* color_path;
|
||||
|
||||
struct option_node {
|
||||
char* option;
|
||||
struct wl_list link;
|
||||
};
|
||||
|
||||
static char* get_exec_name(char* path) {
|
||||
char* slash = strrchr(path, '/');
|
||||
uint64_t offset;
|
||||
@ -74,6 +79,7 @@ static void print_usage(char** argv) {
|
||||
printf("--version\t-v\tPrints the version and then exits\n");
|
||||
printf("--location\t-l\tSets the location\n");
|
||||
printf("--no-actions\t-a\tDisables multiple actions for modes that support it\n");
|
||||
printf("--define\t-D\tSets a config option\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
@ -339,6 +345,12 @@ int main(int argc, char** argv) {
|
||||
.flag = NULL,
|
||||
.val = 'a'
|
||||
},
|
||||
{
|
||||
.name = "define",
|
||||
.has_arg = required_argument,
|
||||
.flag = NULL,
|
||||
.val = 'D'
|
||||
},
|
||||
{
|
||||
.name = NULL,
|
||||
.has_arg = 0,
|
||||
@ -369,8 +381,13 @@ int main(int argc, char** argv) {
|
||||
char* parse_search = NULL;
|
||||
char* location = NULL;
|
||||
char* no_actions = NULL;
|
||||
|
||||
struct wl_list options;
|
||||
wl_list_init(&options);
|
||||
struct option_node* node;
|
||||
|
||||
int opt;
|
||||
while((opt = getopt_long(argc, argv, "hfc:s:C:dS:W:H:p:x:y:nImk:t:P::ebM:iqvl:a", opts, NULL)) != -1) {
|
||||
while((opt = getopt_long(argc, argv, "hfc:s:C:dS:W:H:p:x:y:nImk:t:P::ebM:iqvl:aD:", opts, NULL)) != -1) {
|
||||
switch(opt) {
|
||||
case 'h':
|
||||
print_usage(argv);
|
||||
@ -456,6 +473,11 @@ int main(int argc, char** argv) {
|
||||
case 'a':
|
||||
no_actions = "true";
|
||||
break;
|
||||
case 'D':
|
||||
node = malloc(sizeof(struct option_node));
|
||||
node->option = optarg;
|
||||
wl_list_insert(&options, &node->link);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -531,6 +553,13 @@ int main(int argc, char** argv) {
|
||||
|
||||
free(COLORS_LOCATION);
|
||||
|
||||
struct option_node* tmp;
|
||||
wl_list_for_each_safe(node, tmp, &options, link) {
|
||||
config_put(config, node->option);
|
||||
wl_list_remove(&node->link);
|
||||
free(node);
|
||||
}
|
||||
|
||||
if(map_get(config, "show") != NULL) {
|
||||
map_put(config, "mode", map_get(config, "show"));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user