diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-10-14 14:30:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-14 14:30:52 +0200 |
commit | abde9d6627483256ccfd20bdeeaa52d7790b0426 (patch) | |
tree | a851a6f4f6356470123d5d870c5d12fb9de78f73 | |
parent | Merge pull request #2829 from espkk/master (diff) | |
parent | cmd_bar: simplify logic (diff) | |
download | sway-abde9d6627483256ccfd20bdeeaa52d7790b0426.tar.gz sway-abde9d6627483256ccfd20bdeeaa52d7790b0426.tar.zst sway-abde9d6627483256ccfd20bdeeaa52d7790b0426.zip |
Merge pull request #2808 from RedSoxFan/bar-subcommands
Fix bar subcommand handler structs and selection
-rw-r--r-- | include/sway/config.h | 2 | ||||
-rw-r--r-- | sway/commands/bar.c | 115 | ||||
-rw-r--r-- | sway/commands/bar/id.c | 2 | ||||
-rw-r--r-- | sway/commands/bar/status_command.c | 2 | ||||
-rw-r--r-- | sway/config/bar.c | 14 |
5 files changed, 79 insertions, 56 deletions
diff --git a/include/sway/config.h b/include/sway/config.h index ca17a645..f21ecbb1 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -530,6 +530,8 @@ void free_sway_binding(struct sway_binding *sb); | |||
530 | 530 | ||
531 | void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding); | 531 | void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding); |
532 | 532 | ||
533 | void load_swaybar(struct bar_config *bar); | ||
534 | |||
533 | void load_swaybars(void); | 535 | void load_swaybars(void); |
534 | 536 | ||
535 | void terminate_swaybg(pid_t pid); | 537 | void terminate_swaybg(pid_t pid); |
diff --git a/sway/commands/bar.c b/sway/commands/bar.c index 03f4c557..c808aef2 100644 --- a/sway/commands/bar.c +++ b/sway/commands/bar.c | |||
@@ -17,7 +17,6 @@ static struct cmd_handler bar_handlers[] = { | |||
17 | { "height", bar_cmd_height }, | 17 | { "height", bar_cmd_height }, |
18 | { "hidden_state", bar_cmd_hidden_state }, | 18 | { "hidden_state", bar_cmd_hidden_state }, |
19 | { "icon_theme", bar_cmd_icon_theme }, | 19 | { "icon_theme", bar_cmd_icon_theme }, |
20 | { "id", bar_cmd_id }, | ||
21 | { "mode", bar_cmd_mode }, | 20 | { "mode", bar_cmd_mode }, |
22 | { "modifier", bar_cmd_modifier }, | 21 | { "modifier", bar_cmd_modifier }, |
23 | { "output", bar_cmd_output }, | 22 | { "output", bar_cmd_output }, |
@@ -27,7 +26,6 @@ static struct cmd_handler bar_handlers[] = { | |||
27 | { "separator_symbol", bar_cmd_separator_symbol }, | 26 | { "separator_symbol", bar_cmd_separator_symbol }, |
28 | { "status_command", bar_cmd_status_command }, | 27 | { "status_command", bar_cmd_status_command }, |
29 | { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, | 28 | { "strip_workspace_numbers", bar_cmd_strip_workspace_numbers }, |
30 | { "swaybar_command", bar_cmd_swaybar_command }, | ||
31 | { "tray_output", bar_cmd_tray_output }, | 29 | { "tray_output", bar_cmd_tray_output }, |
32 | { "tray_padding", bar_cmd_tray_padding }, | 30 | { "tray_padding", bar_cmd_tray_padding }, |
33 | { "workspace_buttons", bar_cmd_workspace_buttons }, | 31 | { "workspace_buttons", bar_cmd_workspace_buttons }, |
@@ -36,54 +34,49 @@ static struct cmd_handler bar_handlers[] = { | |||
36 | 34 | ||
37 | // Must be in alphabetical order for bsearch | 35 | // Must be in alphabetical order for bsearch |
38 | static struct cmd_handler bar_config_handlers[] = { | 36 | static struct cmd_handler bar_config_handlers[] = { |
39 | { "hidden_state", bar_cmd_hidden_state }, | 37 | { "id", bar_cmd_id }, |
40 | { "mode", bar_cmd_mode } | 38 | { "swaybar_command", bar_cmd_swaybar_command }, |
41 | }; | 39 | }; |
42 | 40 | ||
41 | // Determines whether the subcommand is valid in any bar handler struct | ||
42 | static bool is_subcommand(char *name) { | ||
43 | return find_handler(name, bar_handlers, sizeof(bar_handlers)) || | ||
44 | find_handler(name, bar_config_handlers, sizeof(bar_config_handlers)); | ||
45 | } | ||
46 | |||
43 | struct cmd_results *cmd_bar(int argc, char **argv) { | 47 | struct cmd_results *cmd_bar(int argc, char **argv) { |
44 | struct cmd_results *error = NULL; | 48 | struct cmd_results *error = NULL; |
45 | if ((error = checkarg(argc, "bar", EXPECTED_AT_LEAST, 1))) { | 49 | if ((error = checkarg(argc, "bar", EXPECTED_AT_LEAST, 2))) { |
46 | return error; | 50 | return error; |
47 | } | 51 | } |
48 | 52 | ||
49 | if (find_handler(argv[0], bar_config_handlers, | 53 | bool spawn = false; |
50 | sizeof(bar_config_handlers))) { | 54 | struct bar_config *bar = NULL; |
51 | if (config->reading) { | 55 | if (strcmp(argv[0], "id") != 0 && is_subcommand(argv[1])) { |
52 | return config_subcommand(argv, argc, bar_config_handlers, | 56 | for (int i = 0; i < config->bars->length; ++i) { |
53 | sizeof(bar_config_handlers)); | 57 | struct bar_config *item = config->bars->items[i]; |
54 | } | 58 | if (strcmp(item->id, argv[0]) == 0) { |
55 | return cmd_results_new(CMD_FAILURE, "bar", | 59 | wlr_log(WLR_DEBUG, "Selecting bar: %s", argv[0]); |
56 | "Can only be used in config file."); | 60 | bar = item; |
57 | } | 61 | break; |
58 | |||
59 | if (argc > 1) { | ||
60 | struct bar_config *bar = NULL; | ||
61 | if (!find_handler(argv[0], bar_handlers, sizeof(bar_handlers)) | ||
62 | && find_handler(argv[1], bar_handlers, sizeof(bar_handlers))) { | ||
63 | for (int i = 0; i < config->bars->length; ++i) { | ||
64 | struct bar_config *item = config->bars->items[i]; | ||
65 | if (strcmp(item->id, argv[0]) == 0) { | ||
66 | wlr_log(WLR_DEBUG, "Selecting bar: %s", argv[0]); | ||
67 | bar = item; | ||
68 | break; | ||
69 | } | ||
70 | } | 62 | } |
63 | } | ||
64 | if (!bar) { | ||
65 | spawn = !config->reading; | ||
66 | wlr_log(WLR_DEBUG, "Creating bar: %s", argv[0]); | ||
67 | bar = default_bar_config(); | ||
71 | if (!bar) { | 68 | if (!bar) { |
72 | wlr_log(WLR_DEBUG, "Creating bar: %s", argv[0]); | 69 | return cmd_results_new(CMD_FAILURE, "bar", |
73 | bar = default_bar_config(); | 70 | "Unable to allocate bar state"); |
74 | if (!bar) { | ||
75 | return cmd_results_new(CMD_FAILURE, "bar", | ||
76 | "Unable to allocate bar state"); | ||
77 | } | ||
78 | |||
79 | bar->id = strdup(argv[0]); | ||
80 | } | 71 | } |
81 | config->current_bar = bar; | 72 | |
82 | ++argv; --argc; | 73 | bar->id = strdup(argv[0]); |
83 | } | 74 | } |
75 | config->current_bar = bar; | ||
76 | ++argv; --argc; | ||
84 | } | 77 | } |
85 | 78 | ||
86 | if (!config->current_bar) { | 79 | if (!config->current_bar && config->reading) { |
87 | // Create new bar with default values | 80 | // Create new bar with default values |
88 | struct bar_config *bar = default_bar_config(); | 81 | struct bar_config *bar = default_bar_config(); |
89 | if (!bar) { | 82 | if (!bar) { |
@@ -92,18 +85,13 @@ struct cmd_results *cmd_bar(int argc, char **argv) { | |||
92 | } | 85 | } |
93 | 86 | ||
94 | // set bar id | 87 | // set bar id |
95 | for (int i = 0; i < config->bars->length; ++i) { | 88 | const int len = 5 + numlen(config->bars->length - 1); // "bar-"+i+\0 |
96 | if (bar == config->bars->items[i]) { | 89 | bar->id = malloc(len * sizeof(char)); |
97 | const int len = 5 + numlen(i); // "bar-" + i + \0 | 90 | if (bar->id) { |
98 | bar->id = malloc(len * sizeof(char)); | 91 | snprintf(bar->id, len, "bar-%d", config->bars->length - 1); |
99 | if (bar->id) { | 92 | } else { |
100 | snprintf(bar->id, len, "bar-%d", i); | 93 | return cmd_results_new(CMD_FAILURE, |
101 | } else { | 94 | "bar", "Unable to allocate bar ID"); |
102 | return cmd_results_new(CMD_FAILURE, | ||
103 | "bar", "Unable to allocate bar ID"); | ||
104 | } | ||
105 | break; | ||
106 | } | ||
107 | } | 95 | } |
108 | 96 | ||
109 | // Set current bar | 97 | // Set current bar |
@@ -111,5 +99,32 @@ struct cmd_results *cmd_bar(int argc, char **argv) { | |||
111 | wlr_log(WLR_DEBUG, "Creating bar %s", bar->id); | 99 | wlr_log(WLR_DEBUG, "Creating bar %s", bar->id); |
112 | } | 100 | } |
113 | 101 | ||
114 | return config_subcommand(argv, argc, bar_handlers, sizeof(bar_handlers)); | 102 | if (find_handler(argv[0], bar_config_handlers, |
103 | sizeof(bar_config_handlers))) { | ||
104 | if (config->reading) { | ||
105 | return config_subcommand(argv, argc, bar_config_handlers, | ||
106 | sizeof(bar_config_handlers)); | ||
107 | } else if (spawn) { | ||
108 | for (int i = config->bars->length - 1; i >= 0; i--) { | ||
109 | struct bar_config *bar = config->bars->items[i]; | ||
110 | if (bar == config->current_bar) { | ||
111 | list_del(config->bars, i); | ||
112 | free_bar_config(bar); | ||
113 | break; | ||
114 | } | ||
115 | } | ||
116 | } | ||
117 | return cmd_results_new(CMD_INVALID, "bar", | ||
118 | "Can only be used in the config file."); | ||
119 | } | ||
120 | |||
121 | struct cmd_results *res = | ||
122 | config_subcommand(argv, argc, bar_handlers, sizeof(bar_handlers)); | ||
123 | if (!config->reading) { | ||
124 | if (spawn) { | ||
125 | load_swaybar(config->current_bar); | ||
126 | } | ||
127 | config->current_bar = NULL; | ||
128 | } | ||
129 | return res; | ||
115 | } | 130 | } |
diff --git a/sway/commands/bar/id.c b/sway/commands/bar/id.c index 65fa69fd..7690a852 100644 --- a/sway/commands/bar/id.c +++ b/sway/commands/bar/id.c | |||
@@ -13,6 +13,8 @@ struct cmd_results *bar_cmd_id(int argc, char **argv) { | |||
13 | const char *oldname = config->current_bar->id; | 13 | const char *oldname = config->current_bar->id; |
14 | if (strcmp(name, oldname) == 0) { | 14 | if (strcmp(name, oldname) == 0) { |
15 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); // NOP | 15 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); // NOP |
16 | } else if (strcmp(name, "id") == 0) { | ||
17 | return cmd_results_new(CMD_INVALID, "id", "id cannot be 'id'"); | ||
16 | } | 18 | } |
17 | // check if id is used by a previously defined bar | 19 | // check if id is used by a previously defined bar |
18 | for (int i = 0; i < config->bars->length; ++i) { | 20 | for (int i = 0; i < config->bars->length; ++i) { |
diff --git a/sway/commands/bar/status_command.c b/sway/commands/bar/status_command.c index 5b4fdc87..490393f1 100644 --- a/sway/commands/bar/status_command.c +++ b/sway/commands/bar/status_command.c | |||
@@ -25,7 +25,7 @@ struct cmd_results *bar_cmd_status_command(int argc, char **argv) { | |||
25 | } | 25 | } |
26 | 26 | ||
27 | if (config->active && !config->validating) { | 27 | if (config->active && !config->validating) { |
28 | load_swaybars(); | 28 | load_swaybar(config->current_bar); |
29 | } | 29 | } |
30 | 30 | ||
31 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 31 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
diff --git a/sway/config/bar.c b/sway/config/bar.c index c6899f57..5726e95b 100644 --- a/sway/config/bar.c +++ b/sway/config/bar.c | |||
@@ -226,13 +226,17 @@ static void invoke_swaybar(struct bar_config *bar) { | |||
226 | close(filedes[1]); | 226 | close(filedes[1]); |
227 | } | 227 | } |
228 | 228 | ||
229 | void load_swaybar(struct bar_config *bar) { | ||
230 | if (bar->pid != 0) { | ||
231 | terminate_swaybar(bar->pid); | ||
232 | } | ||
233 | wlr_log(WLR_DEBUG, "Invoking swaybar for bar id '%s'", bar->id); | ||
234 | invoke_swaybar(bar); | ||
235 | } | ||
236 | |||
229 | void load_swaybars(void) { | 237 | void load_swaybars(void) { |
230 | for (int i = 0; i < config->bars->length; ++i) { | 238 | for (int i = 0; i < config->bars->length; ++i) { |
231 | struct bar_config *bar = config->bars->items[i]; | 239 | struct bar_config *bar = config->bars->items[i]; |
232 | if (bar->pid != 0) { | 240 | load_swaybar(bar); |
233 | terminate_swaybar(bar->pid); | ||
234 | } | ||
235 | wlr_log(WLR_DEBUG, "Invoking swaybar for bar id '%s'", bar->id); | ||
236 | invoke_swaybar(bar); | ||
237 | } | 241 | } |
238 | } | 242 | } |