diff options
Diffstat (limited to 'sway/config.c')
-rw-r--r-- | sway/config.c | 72 |
1 files changed, 71 insertions, 1 deletions
diff --git a/sway/config.c b/sway/config.c index 7d5999d8..e737f83c 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -167,6 +167,16 @@ void free_pid_workspace(struct pid_workspace *pw) { | |||
167 | free(pw); | 167 | free(pw); |
168 | } | 168 | } |
169 | 169 | ||
170 | void free_command_policy(struct command_policy *policy) { | ||
171 | free(policy->command); | ||
172 | free(policy); | ||
173 | } | ||
174 | |||
175 | void free_feature_policy(struct feature_policy *policy) { | ||
176 | free(policy->program); | ||
177 | free(policy); | ||
178 | } | ||
179 | |||
170 | void free_config(struct sway_config *config) { | 180 | void free_config(struct sway_config *config) { |
171 | int i; | 181 | int i; |
172 | for (i = 0; i < config->symbols->length; ++i) { | 182 | for (i = 0; i < config->symbols->length; ++i) { |
@@ -211,6 +221,16 @@ void free_config(struct sway_config *config) { | |||
211 | } | 221 | } |
212 | list_free(config->output_configs); | 222 | list_free(config->output_configs); |
213 | 223 | ||
224 | for (i = 0; i < config->command_policies->length; ++i) { | ||
225 | free_command_policy(config->command_policies->items[i]); | ||
226 | } | ||
227 | list_free(config->command_policies); | ||
228 | |||
229 | for (i = 0; i < config->feature_policies->length; ++i) { | ||
230 | free_feature_policy(config->feature_policies->items[i]); | ||
231 | } | ||
232 | list_free(config->feature_policies); | ||
233 | |||
214 | list_free(config->active_bar_modifiers); | 234 | list_free(config->active_bar_modifiers); |
215 | free_flat_list(config->config_chain); | 235 | free_flat_list(config->config_chain); |
216 | free(config->font); | 236 | free(config->font); |
@@ -321,6 +341,11 @@ static void config_defaults(struct sway_config *config) { | |||
321 | config->border_colors.placeholder.child_border = 0x0C0C0CFF; | 341 | config->border_colors.placeholder.child_border = 0x0C0C0CFF; |
322 | 342 | ||
323 | config->border_colors.background = 0xFFFFFFFF; | 343 | config->border_colors.background = 0xFFFFFFFF; |
344 | |||
345 | // Security | ||
346 | config->command_policies = create_list(); | ||
347 | config->feature_policies = create_list(); | ||
348 | config->ipc_policy = UINT32_MAX; | ||
324 | } | 349 | } |
325 | 350 | ||
326 | static int compare_modifiers(const void *left, const void *right) { | 351 | static int compare_modifiers(const void *left, const void *right) { |
@@ -556,7 +581,13 @@ bool read_config(FILE *file, struct sway_config *config) { | |||
556 | free(line); | 581 | free(line); |
557 | continue; | 582 | continue; |
558 | } | 583 | } |
559 | struct cmd_results *res = config_command(line, block); | 584 | struct cmd_results *res; |
585 | if (block == CMD_BLOCK_COMMANDS) { | ||
586 | // Special case | ||
587 | res = config_commands_command(line); | ||
588 | } else { | ||
589 | res = config_command(line, block); | ||
590 | } | ||
560 | switch(res->status) { | 591 | switch(res->status) { |
561 | case CMD_FAILURE: | 592 | case CMD_FAILURE: |
562 | case CMD_INVALID: | 593 | case CMD_INVALID: |
@@ -602,6 +633,30 @@ bool read_config(FILE *file, struct sway_config *config) { | |||
602 | } | 633 | } |
603 | break; | 634 | break; |
604 | 635 | ||
636 | case CMD_BLOCK_COMMANDS: | ||
637 | if (block == CMD_BLOCK_END) { | ||
638 | block = CMD_BLOCK_COMMANDS; | ||
639 | } else { | ||
640 | sway_log(L_ERROR, "Invalid block '%s'", line); | ||
641 | } | ||
642 | break; | ||
643 | |||
644 | case CMD_BLOCK_IPC: | ||
645 | if (block == CMD_BLOCK_END) { | ||
646 | block = CMD_BLOCK_IPC; | ||
647 | } else { | ||
648 | sway_log(L_ERROR, "Invalid block '%s'", line); | ||
649 | } | ||
650 | break; | ||
651 | |||
652 | case CMD_BLOCK_IPC_EVENTS: | ||
653 | if (block == CMD_BLOCK_IPC) { | ||
654 | block = CMD_BLOCK_IPC_EVENTS; | ||
655 | } else { | ||
656 | sway_log(L_ERROR, "Invalid block '%s'", line); | ||
657 | } | ||
658 | break; | ||
659 | |||
605 | case CMD_BLOCK_END: | 660 | case CMD_BLOCK_END: |
606 | switch(block) { | 661 | switch(block) { |
607 | case CMD_BLOCK_MODE: | 662 | case CMD_BLOCK_MODE: |
@@ -627,6 +682,21 @@ bool read_config(FILE *file, struct sway_config *config) { | |||
627 | block = CMD_BLOCK_BAR; | 682 | block = CMD_BLOCK_BAR; |
628 | break; | 683 | break; |
629 | 684 | ||
685 | case CMD_BLOCK_COMMANDS: | ||
686 | sway_log(L_DEBUG, "End of commands block"); | ||
687 | block = CMD_BLOCK_END; | ||
688 | break; | ||
689 | |||
690 | case CMD_BLOCK_IPC: | ||
691 | sway_log(L_DEBUG, "End of IPC block"); | ||
692 | block = CMD_BLOCK_END; | ||
693 | break; | ||
694 | |||
695 | case CMD_BLOCK_IPC_EVENTS: | ||
696 | sway_log(L_DEBUG, "End of IPC events block"); | ||
697 | block = CMD_BLOCK_IPC; | ||
698 | break; | ||
699 | |||
630 | case CMD_BLOCK_END: | 700 | case CMD_BLOCK_END: |
631 | sway_log(L_ERROR, "Unmatched }"); | 701 | sway_log(L_ERROR, "Unmatched }"); |
632 | break; | 702 | break; |