aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-10-14 14:30:52 +0200
committerLibravatar GitHub <noreply@github.com>2018-10-14 14:30:52 +0200
commitabde9d6627483256ccfd20bdeeaa52d7790b0426 (patch)
treea851a6f4f6356470123d5d870c5d12fb9de78f73
parentMerge pull request #2829 from espkk/master (diff)
parentcmd_bar: simplify logic (diff)
downloadsway-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.h2
-rw-r--r--sway/commands/bar.c115
-rw-r--r--sway/commands/bar/id.c2
-rw-r--r--sway/commands/bar/status_command.c2
-rw-r--r--sway/config/bar.c14
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
531void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding); 531void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding);
532 532
533void load_swaybar(struct bar_config *bar);
534
533void load_swaybars(void); 535void load_swaybars(void);
534 536
535void terminate_swaybg(pid_t pid); 537void 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
38static struct cmd_handler bar_config_handlers[] = { 36static 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
42static 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
43struct cmd_results *cmd_bar(int argc, char **argv) { 47struct 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
229void 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
229void load_swaybars(void) { 237void 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}