2018-09-27 16:43:17 +02:00
|
|
|
@code_type c .c
|
|
|
|
@comment_type /* %s */
|
|
|
|
|
|
|
|
@title wmaffle
|
|
|
|
|
|
|
|
@s Introduction
|
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
This is the source code for wmaffle.
|
|
|
|
It parses it's arguments and prints either help / info text, or runs the window manager.
|
2018-09-27 16:43:17 +02:00
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
Here's an overview:
|
2018-09-27 16:43:17 +02:00
|
|
|
|
|
|
|
--- wmaffle.c
|
|
|
|
@{copyright notice}
|
2018-09-27 20:44:46 +02:00
|
|
|
@{c headers}
|
|
|
|
@{posix headers}
|
|
|
|
@{defines}
|
2018-09-27 16:43:17 +02:00
|
|
|
|
|
|
|
int
|
2018-09-27 20:44:46 +02:00
|
|
|
main(int argc, char *argv[])
|
2018-09-27 16:43:17 +02:00
|
|
|
{
|
2018-09-27 20:44:46 +02:00
|
|
|
@{variables local to main}
|
|
|
|
@{parse arguments}
|
2018-09-27 16:43:17 +02:00
|
|
|
}
|
|
|
|
---
|
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
Note that this is version NaV (not a version).
|
|
|
|
|
|
|
|
--- defines
|
|
|
|
#define VERSION_STRING "NaV"
|
|
|
|
---
|
|
|
|
|
2018-09-27 16:43:17 +02:00
|
|
|
@s Copyright
|
|
|
|
|
|
|
|
This project is licensed under the Mozilla Public License Version 2.0. Please read LICENSE for more details.
|
|
|
|
|
|
|
|
--- copyright notice
|
|
|
|
/* Copyright (c), Niclas Meyer <niclas@countingsort.com>
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
* You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
---
|
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
@s Parse arguments
|
2018-09-27 16:43:17 +02:00
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
There are only two arguments and two of them are rather straight forward.
|
|
|
|
I use getopt for this, since it's quite good and allows us to extract the config argument easily.
|
2018-09-27 16:43:17 +02:00
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
This requires `getopt.h`.
|
|
|
|
|
|
|
|
--- posix headers
|
|
|
|
#include <getopt.h>
|
|
|
|
#include <limits.h>
|
2018-09-27 16:43:17 +02:00
|
|
|
---
|
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
That one we save in a local variable in main.
|
|
|
|
|
|
|
|
--- variables local to main
|
|
|
|
char config_path[PATH_MAX];
|
|
|
|
int option;
|
|
|
|
---
|
2018-09-27 16:43:17 +02:00
|
|
|
|
2018-09-27 20:44:46 +02:00
|
|
|
--- parse arguments
|
|
|
|
config_path[0] = '\0'; // Used to check if config was already set
|
|
|
|
|
|
|
|
while ((option = getopt(argc, argv, "hvc:")) != -1) {
|
|
|
|
switch (option) {
|
|
|
|
case 'h':
|
|
|
|
printf("Usage: %s [-h|-v|-c <config_path>]\n", argv[0]);
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
break;
|
|
|
|
case 'v':
|
|
|
|
printf("v" VERSION_STRING "\n");
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
break;
|
|
|
|
case 'c':
|
|
|
|
strncpy(config_path, optarg, sizeof(config_path));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!config_path[0]) {
|
|
|
|
@{get default config path}
|
|
|
|
}
|
|
|
|
---
|
|
|
|
|
|
|
|
We also need `string.h`, `stdio.h`, and `stdlib.h`.
|
|
|
|
|
|
|
|
--- c headers
|
2018-09-27 16:43:17 +02:00
|
|
|
#include <stdio.h>
|
2018-09-27 20:44:46 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
---
|
|
|
|
|
|
|
|
@s Config default path
|
|
|
|
|
|
|
|
I can clearly see how a user doesn't specify a config path.
|
|
|
|
|
|
|
|
This was a design decision to make, whether to load a default config. I decided to go with it.
|
|
|
|
|
|
|
|
It loads `"${XDG_CONFIG_HOME:-$HOME/.config}/wmaffle/wmafflerc"`.
|
|
|
|
|
|
|
|
---get default config path
|
|
|
|
char *config_home = getenv("XDG_CONFIG_HOME");
|
|
|
|
|
|
|
|
if (config_home) {
|
|
|
|
snprintf(
|
|
|
|
config_path,
|
|
|
|
sizeof(config_path),
|
|
|
|
"%s/%s",
|
|
|
|
config_home,
|
|
|
|
"wmafflw/wmafflerc"
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
snprintf(
|
|
|
|
config_path,
|
|
|
|
sizeof(config_path),
|
|
|
|
"%s/%s",
|
|
|
|
getenv("HOME"),
|
|
|
|
".config/wmaffle/wmafflerc"
|
|
|
|
);
|
|
|
|
}
|
2018-09-27 16:43:17 +02:00
|
|
|
---
|