diff options
-rw-r--r-- | sway/commands.c | 153 |
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 | ||
1148 | static struct cmd_results *cmd_bar(int argc, char **argv) { | 1148 | static 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 | ||
1692 | static 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 | |||
1682 | static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) { | 1721 | static 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 | |||
1762 | static 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 | ||
1706 | static struct cmd_results *bar_cmd_mode(int argc, char **argv) { | 1792 | static 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 | ||