summaryrefslogtreecommitdiffstats
path: root/swaynag/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaynag/main.c')
-rw-r--r--swaynag/main.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/swaynag/main.c b/swaynag/main.c
new file mode 100644
index 00000000..854368e5
--- /dev/null
+++ b/swaynag/main.c
@@ -0,0 +1,129 @@
1#define _XOPEN_SOURCE 500
2#include <signal.h>
3#include "log.h"
4#include "list.h"
5#include "swaynag/config.h"
6#include "swaynag/swaynag.h"
7#include "swaynag/types.h"
8
9static struct swaynag swaynag;
10
11void sig_handler(int signal) {
12 swaynag_destroy(&swaynag);
13 exit(EXIT_FAILURE);
14}
15
16void sway_terminate(int code) {
17 swaynag_destroy(&swaynag);
18 exit(code);
19}
20
21int main(int argc, char **argv) {
22 int exit_code = EXIT_SUCCESS;
23
24 list_t *types = create_list();
25 swaynag_types_add_default(types);
26
27 memset(&swaynag, 0, sizeof(swaynag));
28 swaynag.buttons = create_list();
29
30 struct swaynag_button *button_close =
31 calloc(sizeof(struct swaynag_button), 1);
32 button_close->text = strdup("X");
33 button_close->type = SWAYNAG_ACTION_DISMISS;
34 list_add(swaynag.buttons, button_close);
35
36 swaynag.details.button_details.text = strdup("Toggle Details");
37 swaynag.details.button_details.type = SWAYNAG_ACTION_EXPAND;
38
39
40 char *config_path = NULL;
41 bool debug = false;
42 int launch_status = swaynag_parse_options(argc, argv, NULL, NULL, NULL,
43 &config_path, &debug);
44 if (launch_status != 0) {
45 exit_code = launch_status;
46 goto cleanup;
47 }
48 wlr_log_init(debug ? WLR_DEBUG : WLR_ERROR, NULL);
49
50 if (!config_path) {
51 config_path = swaynag_get_config_path();
52 }
53 if (config_path) {
54 wlr_log(WLR_DEBUG, "Loading config file: %s", config_path);
55 int config_status = swaynag_load_config(config_path, &swaynag, types);
56 free(config_path);
57 if (config_status != 0) {
58 exit_code = config_status;
59 goto cleanup;
60 }
61 }
62
63 if (argc > 1) {
64 struct swaynag_type *type_args;
65 type_args = calloc(1, sizeof(struct swaynag_type));
66 type_args->name = strdup("<args>");
67 list_add(types, type_args);
68
69 int result = swaynag_parse_options(argc, argv, &swaynag, types,
70 type_args, NULL, NULL);
71 if (result != 0) {
72 exit_code = result;
73 goto cleanup;
74 }
75 }
76
77 if (!swaynag.message) {
78 wlr_log(WLR_ERROR, "No message passed. Please provide --message/-m");
79 exit_code = EXIT_FAILURE;
80 goto cleanup;
81 }
82
83 if (!swaynag.type) {
84 swaynag.type = swaynag_type_get(types, "error");
85 }
86
87 // Construct a new type using the config defaults as base, then merging
88 // config type defaults on top, then merging arguments on top of that, and
89 // finally merging defaults on top.
90 struct swaynag_type *type = calloc(1, sizeof(struct swaynag_type));
91 type->name = strdup(swaynag.type->name);
92 swaynag_type_merge(type, swaynag_type_get(types, "<args>"));
93 swaynag_type_merge(type, swaynag.type);
94 swaynag_type_merge(type, swaynag_type_get(types, "<config>"));
95 swaynag_type_merge(type, swaynag_type_get(types, "<defaults>"));
96 swaynag.type = type;
97
98 swaynag_types_free(types);
99
100 if (swaynag.details.message) {
101 list_add(swaynag.buttons, &swaynag.details.button_details);
102 } else {
103 free(swaynag.details.button_details.text);
104 }
105
106 wlr_log(WLR_DEBUG, "Output: %s", swaynag.type->output);
107 wlr_log(WLR_DEBUG, "Anchors: %d", swaynag.type->anchors);
108 wlr_log(WLR_DEBUG, "Type: %s", swaynag.type->name);
109 wlr_log(WLR_DEBUG, "Message: %s", swaynag.message);
110 wlr_log(WLR_DEBUG, "Font: %s", swaynag.type->font);
111 wlr_log(WLR_DEBUG, "Buttons");
112 for (int i = 0; i < swaynag.buttons->length; i++) {
113 struct swaynag_button *button = swaynag.buttons->items[i];
114 wlr_log(WLR_DEBUG, "\t[%s] `%s`", button->text, button->action);
115 }
116
117 signal(SIGTERM, sig_handler);
118
119 swaynag_setup(&swaynag);
120 swaynag_run(&swaynag);
121 return exit_code;
122
123cleanup:
124 swaynag_types_free(types);
125 free(swaynag.details.button_details.text);
126 swaynag_destroy(&swaynag);
127 return exit_code;
128}
129