diff options
author | emersion <contact@emersion.fr> | 2018-08-02 23:49:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-02 23:49:25 +0100 |
commit | 3a54e2291c017397ceff60511c29fe70d229bc8b (patch) | |
tree | d340b7776f945462f5ecffc830ada4d5fbe82f51 /swaynag/main.c | |
parent | Enable wlr-gamma-control-unstable-v1 (diff) | |
parent | Merge pull request #2411 from emersion/fullscreen-pointer-input (diff) | |
download | sway-3a54e2291c017397ceff60511c29fe70d229bc8b.tar.gz sway-3a54e2291c017397ceff60511c29fe70d229bc8b.tar.zst sway-3a54e2291c017397ceff60511c29fe70d229bc8b.zip |
Merge branch 'master' into wlr-gamma-control
Diffstat (limited to 'swaynag/main.c')
-rw-r--r-- | swaynag/main.c | 129 |
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 | |||
9 | static struct swaynag swaynag; | ||
10 | |||
11 | void sig_handler(int signal) { | ||
12 | swaynag_destroy(&swaynag); | ||
13 | exit(EXIT_FAILURE); | ||
14 | } | ||
15 | |||
16 | void sway_terminate(int code) { | ||
17 | swaynag_destroy(&swaynag); | ||
18 | exit(code); | ||
19 | } | ||
20 | |||
21 | int 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 | |||
123 | cleanup: | ||
124 | swaynag_types_free(types); | ||
125 | free(swaynag.details.button_details.text); | ||
126 | swaynag_destroy(&swaynag); | ||
127 | return exit_code; | ||
128 | } | ||
129 | |||