aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2015-12-21 14:33:27 +0100
committerLibravatar Mikkel Oscar Lyderik <mikkeloscar@gmail.com>2015-12-21 14:33:27 +0100
commita96a5e0013f8925cf09366fff46ffa95b1423e36 (patch)
tree335fe7a1d72327a4da0d9614c5e29269024c0dbc
parentMerge pull request #387 from mikkeloscar/handle-term-signal (diff)
downloadsway-a96a5e0013f8925cf09366fff46ffa95b1423e36.tar.gz
sway-a96a5e0013f8925cf09366fff46ffa95b1423e36.tar.zst
sway-a96a5e0013f8925cf09366fff46ffa95b1423e36.zip
Handle bar commands outside config file
Our initial implementation of `bar { }` assumed that the commands could only be used in the config. This is not true for two commands: * bar mode * bar hidden_state This patch makes it possible to issue these commands outside a bar block, for instance through swaymsg $ swaymsg bar mode hide bar-0 This does not implement the `barconfig_update` IPC event which should be trigged from these commands. I have added TODO's where this should be added once implemented.
-rw-r--r--sway/commands.c153
1 files changed, 127 insertions, 26 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 3d882a7b..de5b9705 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -1147,16 +1147,26 @@ static struct cmd_results *cmd_resize(int argc, char **argv) {
1147 1147
1148static struct cmd_results *cmd_bar(int argc, char **argv) { 1148static struct cmd_results *cmd_bar(int argc, char **argv) {
1149 struct cmd_results *error = NULL; 1149 struct cmd_results *error = NULL;
1150 if ((error = checkarg(argc, "bar", EXPECTED_EQUAL_TO, 1))) { 1150 if ((error = checkarg(argc, "bar", EXPECTED_AT_LEAST, 1))) {
1151 return error; 1151 return error;
1152 } 1152 }
1153 1153
1154 if (strcmp("{", argv[0]) != 0) { 1154 if (config->reading && strcmp("{", argv[0]) != 0) {
1155 return cmd_results_new(CMD_INVALID, "bar", 1155 return cmd_results_new(CMD_INVALID, "bar",
1156 "Expected '{' at start of bar config definition."); 1156 "Expected '{' at start of bar config definition.");
1157 } 1157 }
1158 1158
1159 if (!config->reading) { 1159 if (!config->reading) {
1160 if (argc > 1) {
1161 if (strcasecmp("mode", argv[0]) == 0) {
1162 return bar_cmd_mode(argc-1, argv + 1);
1163 }
1164
1165 if (strcasecmp("hidden_state", argv[0]) == 0) {
1166 return bar_cmd_hidden_state(argc-1, argv + 1);
1167 }
1168 }
1169
1160 return cmd_results_new(CMD_FAILURE, "bar", "Can only be used in config file."); 1170 return cmd_results_new(CMD_FAILURE, "bar", "Can only be used in config file.");
1161 } 1171 }
1162 1172
@@ -1679,53 +1689,144 @@ static struct cmd_results *bar_cmd_height(int argc, char **argv) {
1679 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1689 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1680} 1690}
1681 1691
1692static struct cmd_results *bar_set_hidden_state(struct bar_config *bar, const char *hidden_state) {
1693 char *old_state = bar->hidden_state;
1694 if (strcasecmp("toggle", hidden_state) == 0 && !config->reading) {
1695 if (strcasecmp("hide", bar->hidden_state) == 0) {
1696 bar->hidden_state = strdup("show");
1697 } else if (strcasecmp("show", bar->hidden_state) == 0) {
1698 bar->hidden_state = strdup("hide");
1699 }
1700 } else if (strcasecmp("hide", hidden_state) == 0) {
1701 bar->hidden_state = strdup("hide");
1702 } else if (strcasecmp("show", hidden_state) == 0) {
1703 bar->hidden_state = strdup("show");
1704 } else {
1705 return cmd_results_new(CMD_INVALID, "hidden_state", "Invalid value %s", hidden_state);
1706 }
1707
1708 if (strcmp(old_state, bar->hidden_state) != 0) {
1709 if (!config->reading) {
1710 // TODO: IPC event
1711 }
1712 sway_log(L_DEBUG, "Setting hidden_state: '%s' for bar: %s", bar->hidden_state, bar->id);
1713 }
1714
1715 // free old mode
1716 free(old_state);
1717 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1718}
1719
1720
1682static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) { 1721static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) {
1683 struct cmd_results *error = NULL; 1722 struct cmd_results *error = NULL;
1684 if ((error = checkarg(argc, "hidden_state", EXPECTED_EQUAL_TO, 1))) { 1723 if ((error = checkarg(argc, "hidden_state", EXPECTED_AT_LEAST, 1))) {
1724 return error;
1725 }
1726 if ((error = checkarg(argc, "hidden_state", EXPECTED_LESS_THAN, 3))) {
1685 return error; 1727 return error;
1686 } 1728 }
1687 1729
1730 if (config->reading && argc > 1) {
1731 return cmd_results_new(CMD_INVALID, "hidden_state", "Unexpected value %s in config mode", argv[1]);
1732 }
1733
1688 const char *state = argv[0]; 1734 const char *state = argv[0];
1689 char *old_state = config->current_bar->hidden_state;
1690 1735
1691 if (strcasecmp("hide", state) == 0) { 1736 if (config->reading) {
1692 config->current_bar->hidden_state = strdup(state); 1737 return bar_set_hidden_state(config->current_bar, state);
1693 } else if(strcmp("show", state) == 0) { 1738 }
1694 config->current_bar->hidden_state = strdup(state); 1739
1740 const char *id;
1741 if (argc == 2) {
1742 id = argv[1];
1743 }
1744
1745 int i;
1746 struct bar_config *bar;
1747 for (i = 0; i < config->bars->length; ++i) {
1748 bar = config->bars->items[i];
1749 if (id && strcmp(id, bar->id) == 0) {
1750 return bar_set_hidden_state(bar, state);
1751 }
1752
1753 error = bar_set_hidden_state(bar, state);
1754 if (error) {
1755 return error;
1756 }
1757 }
1758
1759 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1760}
1761
1762static struct cmd_results *bar_set_mode(struct bar_config *bar, const char *mode) {
1763 char *old_mode = bar->mode;
1764 if (strcasecmp("toggle", mode) == 0 && !config->reading) {
1765 if (strcasecmp("dock", bar->mode) == 0) {
1766 bar->mode = strdup("hide");
1767 } else if (strcasecmp("hide", bar->mode) == 0) {
1768 bar->mode = strdup("dock");
1769 }
1770 } else if (strcasecmp("dock", mode) == 0) {
1771 bar->mode = strdup("dock");
1772 } else if (strcasecmp("hide", mode) == 0) {
1773 bar->mode = strdup("hide");
1774 } else if (strcasecmp("invisible", mode) == 0) {
1775 bar->mode = strdup("invisible");
1695 } else { 1776 } else {
1696 return cmd_results_new(CMD_INVALID, "hidden_state", "Invalid value %s", state); 1777 return cmd_results_new(CMD_INVALID, "mode", "Invalid value %s", mode);
1697 } 1778 }
1698 1779
1699 sway_log(L_DEBUG, "Setting hidden_state: '%s' for bar: %s", state, config->current_bar->id); 1780 if (strcmp(old_mode, bar->mode) != 0) {
1781 if (!config->reading) {
1782 // TODO: IPC event
1783 }
1784 sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", bar->mode, bar->id);
1785 }
1700 1786
1701 // free old state 1787 // free old mode
1702 free(old_state); 1788 free(old_mode);
1703 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1789 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1704} 1790}
1705 1791
1706static struct cmd_results *bar_cmd_mode(int argc, char **argv) { 1792static struct cmd_results *bar_cmd_mode(int argc, char **argv) {
1707 struct cmd_results *error = NULL; 1793 struct cmd_results *error = NULL;
1708 if ((error = checkarg(argc, "mode", EXPECTED_EQUAL_TO, 1))) { 1794 if ((error = checkarg(argc, "mode", EXPECTED_AT_LEAST, 1))) {
1795 return error;
1796 }
1797 if ((error = checkarg(argc, "mode", EXPECTED_LESS_THAN, 3))) {
1709 return error; 1798 return error;
1710 } 1799 }
1711 1800
1801 if (config->reading && argc > 1) {
1802 return cmd_results_new(CMD_INVALID, "mode", "Unexpected value %s in config mode", argv[1]);
1803 }
1804
1712 const char *mode = argv[0]; 1805 const char *mode = argv[0];
1713 char *old_mode = config->current_bar->mode; 1806
1714 1807 if (config->reading) {
1715 if (strcasecmp("dock", mode) == 0) { 1808 return bar_set_mode(config->current_bar, mode);
1716 config->current_bar->mode = strdup(mode);
1717 } else if(strcmp("hide", mode) == 0) {
1718 config->current_bar->mode = strdup(mode);
1719 } else if(strcmp("invisible", mode) == 0) {
1720 config->current_bar->mode = strdup(mode);
1721 } else {
1722 return cmd_results_new(CMD_INVALID, "mode", "Invalid value %s", mode);
1723 } 1809 }
1724 1810
1725 sway_log(L_DEBUG, "Setting mode: '%s' for bar: %s", mode, config->current_bar->id); 1811 const char *id;
1812 if (argc == 2) {
1813 id = argv[1];
1814 }
1815
1816 int i;
1817 struct bar_config *bar;
1818 for (i = 0; i < config->bars->length; ++i) {
1819 bar = config->bars->items[i];
1820 if (id && strcmp(id, bar->id) == 0) {
1821 return bar_set_mode(bar, mode);
1822 }
1823
1824 error = bar_set_mode(bar, mode);
1825 if (error) {
1826 return error;
1827 }
1828 }
1726 1829
1727 // free old mode
1728 free(old_mode);
1729 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1830 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1730} 1831}
1731 1832