aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/config.h29
-rw-r--r--sway/commands.c220
-rw-r--r--sway/config.c33
3 files changed, 270 insertions, 12 deletions
diff --git a/include/config.h b/include/config.h
index 5bb7107a..80340720 100644
--- a/include/config.h
+++ b/include/config.h
@@ -99,17 +99,24 @@ struct bar_config {
99 bool binding_mode_indicator; 99 bool binding_mode_indicator;
100 bool verbose; 100 bool verbose;
101 struct { 101 struct {
102 char *background; 102 char background[10];
103 char *foreground; 103 char statusline[10];
104 char *focused_workspace_border; 104 char separator[10];
105 char *focused_workspace_bg; 105 char focused_workspace_border[10];
106 char *focused_workspace_text; 106 char focused_workspace_bg[10];
107 char *active_workspace_border; 107 char focused_workspace_text[10];
108 char *active_workspace_bg; 108 char active_workspace_border[10];
109 char *active_workspace_text; 109 char active_workspace_bg[10];
110 char *inactive_workspace_border; 110 char active_workspace_text[10];
111 char *inactive_workspace_bg; 111 char inactive_workspace_border[10];
112 char *inactive_workspace_text; 112 char inactive_workspace_bg[10];
113 char inactive_workspace_text[10];
114 char urgent_workspace_border[10];
115 char urgent_workspace_bg[10];
116 char urgent_workspace_text[10];
117 char binding_mode_border[10];
118 char binding_mode_bg[10];
119 char binding_mode_text[10];
113 } colors; 120 } colors;
114}; 121};
115 122
diff --git a/sway/commands.c b/sway/commands.c
index 559d1e06..733fb293 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -66,6 +66,7 @@ static sway_cmd cmd_workspace;
66static sway_cmd cmd_ws_auto_back_and_forth; 66static sway_cmd cmd_ws_auto_back_and_forth;
67 67
68static sway_cmd bar_cmd_bindsym; 68static sway_cmd bar_cmd_bindsym;
69static sway_cmd bar_cmd_colors;
69static sway_cmd bar_cmd_mode; 70static sway_cmd bar_cmd_mode;
70static sway_cmd bar_cmd_modifier; 71static sway_cmd bar_cmd_modifier;
71static sway_cmd bar_cmd_hidden_state; 72static sway_cmd bar_cmd_hidden_state;
@@ -77,6 +78,16 @@ static sway_cmd bar_cmd_tray_output;
77static sway_cmd bar_cmd_tray_padding; 78static sway_cmd bar_cmd_tray_padding;
78static sway_cmd bar_cmd_workspace_buttons; 79static sway_cmd bar_cmd_workspace_buttons;
79 80
81static sway_cmd bar_colors_cmd_active_workspace;
82static sway_cmd bar_colors_cmd_background;
83static sway_cmd bar_colors_cmd_background;
84static sway_cmd bar_colors_cmd_binding_mode;
85static sway_cmd bar_colors_cmd_focused_workspace;
86static sway_cmd bar_colors_cmd_inactive_workspace;
87static sway_cmd bar_colors_cmd_separator;
88static sway_cmd bar_colors_cmd_statusline;
89static sway_cmd bar_colors_cmd_urgent_workspace;
90
80swayc_t *sp_view; 91swayc_t *sp_view;
81int sp_index = 0; 92int sp_index = 0;
82 93
@@ -1567,6 +1578,20 @@ static struct cmd_results *bar_cmd_bindsym(int argc, char **argv) {
1567 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1578 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1568} 1579}
1569 1580
1581static struct cmd_results *bar_cmd_colors(int argc, char **argv) {
1582 struct cmd_results *error = NULL;
1583 if ((error = checkarg(argc, "colors", EXPECTED_EQUAL_TO, 1))) {
1584 return error;
1585 }
1586
1587 if (strcmp("{", argv[0]) != 0) {
1588 return cmd_results_new(CMD_INVALID, "colors",
1589 "Expected '{' at the start of colors config definition.");
1590 }
1591
1592 return cmd_results_new(CMD_BLOCK_BAR_COLORS, NULL, NULL);
1593}
1594
1570static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) { 1595static struct cmd_results *bar_cmd_hidden_state(int argc, char **argv) {
1571 struct cmd_results *error = NULL; 1596 struct cmd_results *error = NULL;
1572 if ((error = checkarg(argc, "hidden_state", EXPECTED_EQUAL_TO, 1))) { 1597 if ((error = checkarg(argc, "hidden_state", EXPECTED_EQUAL_TO, 1))) {
@@ -1804,7 +1829,7 @@ static struct cmd_results *bar_cmd_workspace_buttons(int argc, char **argv) {
1804static struct cmd_handler bar_handlers[] = { 1829static struct cmd_handler bar_handlers[] = {
1805 { "binding_mode_indicator", NULL }, 1830 { "binding_mode_indicator", NULL },
1806 { "bindsym", bar_cmd_bindsym }, 1831 { "bindsym", bar_cmd_bindsym },
1807 { "colors", NULL }, 1832 { "colors", bar_cmd_colors },
1808 { "font", NULL }, 1833 { "font", NULL },
1809 { "hidden_state", bar_cmd_hidden_state }, 1834 { "hidden_state", bar_cmd_hidden_state },
1810 { "id", bar_cmd_id }, 1835 { "id", bar_cmd_id },
@@ -1820,6 +1845,195 @@ static struct cmd_handler bar_handlers[] = {
1820 { "workspace_buttons", bar_cmd_workspace_buttons }, 1845 { "workspace_buttons", bar_cmd_workspace_buttons },
1821}; 1846};
1822 1847
1848/**
1849 * Check and add color to buffer.
1850 *
1851 * return error object, or NULL if color is valid.
1852 */
1853static struct cmd_results *add_color(const char *name, char *buffer, const char *color) {
1854 int len = strlen(color);
1855 if (len != 7 && len != 9 ) {
1856 return cmd_results_new(CMD_INVALID, name, "Invalid color definition %s", color);
1857 }
1858
1859 if (color[0] != '#') {
1860 return cmd_results_new(CMD_INVALID, name, "Invalid color definition %s", color);
1861 }
1862
1863 int i;
1864 for (i = 1; i < len; ++i) {
1865 if (!isxdigit(color[i])) {
1866 return cmd_results_new(CMD_INVALID, name, "Invalid color definition %s", color);
1867 }
1868 }
1869
1870 // copy color to buffer
1871 strncpy(buffer, color, len);
1872 // add default alpha channel if color was defined without it
1873 if (len == 7) {
1874 buffer[7] = 'f';
1875 buffer[8] = 'f';
1876 }
1877 sway_log(L_DEBUG, "Setting %s color %s for bar: %s", name, buffer, config->current_bar->id);
1878
1879 return NULL;
1880}
1881
1882static struct cmd_results *bar_colors_cmd_active_workspace(int argc, char **argv) {
1883 struct cmd_results *error = NULL;
1884 if ((error = checkarg(argc, "active_workspace", EXPECTED_EQUAL_TO, 3))) {
1885 return error;
1886 }
1887
1888 if ((error = add_color("active_workspace_border", config->current_bar->colors.active_workspace_border, argv[0]))) {
1889 return error;
1890 }
1891
1892 if ((error = add_color("active_workspace_bg", config->current_bar->colors.active_workspace_bg, argv[1]))) {
1893 return error;
1894 }
1895
1896 if ((error = add_color("active_workspace_text", config->current_bar->colors.active_workspace_text, argv[2]))) {
1897 return error;
1898 }
1899
1900 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1901}
1902
1903static struct cmd_results *bar_colors_cmd_background(int argc, char **argv) {
1904 struct cmd_results *error = NULL;
1905 if ((error = checkarg(argc, "background", EXPECTED_EQUAL_TO, 1))) {
1906 return error;
1907 }
1908
1909 if ((error = add_color("background", config->current_bar->colors.background, argv[0]))) {
1910 return error;
1911 }
1912
1913 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1914}
1915
1916static struct cmd_results *bar_colors_cmd_binding_mode(int argc, char **argv) {
1917 struct cmd_results *error = NULL;
1918 if ((error = checkarg(argc, "binding_mode", EXPECTED_EQUAL_TO, 3))) {
1919 return error;
1920 }
1921
1922 if ((error = add_color("binding_mode_border", config->current_bar->colors.binding_mode_border, argv[0]))) {
1923 return error;
1924 }
1925
1926 if ((error = add_color("binding_mode_bg", config->current_bar->colors.binding_mode_bg, argv[1]))) {
1927 return error;
1928 }
1929
1930 if ((error = add_color("binding_mode_text", config->current_bar->colors.binding_mode_text, argv[2]))) {
1931 return error;
1932 }
1933
1934 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1935}
1936
1937static struct cmd_results *bar_colors_cmd_focused_workspace(int argc, char **argv) {
1938 struct cmd_results *error = NULL;
1939 if ((error = checkarg(argc, "focused_workspace", EXPECTED_EQUAL_TO, 3))) {
1940 return error;
1941 }
1942
1943 if ((error = add_color("focused_workspace_border", config->current_bar->colors.focused_workspace_border, argv[0]))) {
1944 return error;
1945 }
1946
1947 if ((error = add_color("focused_workspace_bg", config->current_bar->colors.focused_workspace_bg, argv[1]))) {
1948 return error;
1949 }
1950
1951 if ((error = add_color("focused_workspace_text", config->current_bar->colors.focused_workspace_text, argv[2]))) {
1952 return error;
1953 }
1954
1955 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1956}
1957
1958static struct cmd_results *bar_colors_cmd_inactive_workspace(int argc, char **argv) {
1959 struct cmd_results *error = NULL;
1960 if ((error = checkarg(argc, "inactive_workspace", EXPECTED_EQUAL_TO, 3))) {
1961 return error;
1962 }
1963
1964 if ((error = add_color("inactive_workspace_border", config->current_bar->colors.inactive_workspace_border, argv[0]))) {
1965 return error;
1966 }
1967
1968 if ((error = add_color("inactive_workspace_bg", config->current_bar->colors.inactive_workspace_bg, argv[1]))) {
1969 return error;
1970 }
1971
1972 if ((error = add_color("inactive_workspace_text", config->current_bar->colors.inactive_workspace_text, argv[2]))) {
1973 return error;
1974 }
1975
1976 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1977}
1978
1979static struct cmd_results *bar_colors_cmd_separator(int argc, char **argv) {
1980 struct cmd_results *error = NULL;
1981 if ((error = checkarg(argc, "separator", EXPECTED_EQUAL_TO, 1))) {
1982 return error;
1983 }
1984
1985 if ((error = add_color("separator", config->current_bar->colors.separator, argv[0]))) {
1986 return error;
1987 }
1988
1989 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1990}
1991
1992static struct cmd_results *bar_colors_cmd_statusline(int argc, char **argv) {
1993 struct cmd_results *error = NULL;
1994 if ((error = checkarg(argc, "statusline", EXPECTED_EQUAL_TO, 1))) {
1995 return error;
1996 }
1997
1998 if ((error = add_color("statusline", config->current_bar->colors.statusline, argv[0]))) {
1999 return error;
2000 }
2001
2002 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
2003}
2004
2005static struct cmd_results *bar_colors_cmd_urgent_workspace(int argc, char **argv) {
2006 struct cmd_results *error = NULL;
2007 if ((error = checkarg(argc, "urgent_workspace", EXPECTED_EQUAL_TO, 3))) {
2008 return error;
2009 }
2010
2011 if ((error = add_color("urgent_workspace_border", config->current_bar->colors.urgent_workspace_border, argv[0]))) {
2012 return error;
2013 }
2014
2015 if ((error = add_color("urgent_workspace_bg", config->current_bar->colors.urgent_workspace_bg, argv[1]))) {
2016 return error;
2017 }
2018
2019 if ((error = add_color("urgent_workspace_text", config->current_bar->colors.urgent_workspace_text, argv[2]))) {
2020 return error;
2021 }
2022
2023 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
2024}
2025
2026static struct cmd_handler bar_colors_handlers[] = {
2027 { "active_workspace", bar_colors_cmd_active_workspace },
2028 { "background", bar_colors_cmd_background },
2029 { "binding_mode", bar_colors_cmd_binding_mode },
2030 { "focused_workspace", bar_colors_cmd_focused_workspace },
2031 { "inactive_workspace", bar_colors_cmd_inactive_workspace },
2032 { "separator", bar_colors_cmd_separator },
2033 { "statusline", bar_colors_cmd_statusline },
2034 { "urgent_workspace", bar_colors_cmd_urgent_workspace },
2035};
2036
1823static int handler_compare(const void *_a, const void *_b) { 2037static int handler_compare(const void *_a, const void *_b) {
1824 const struct cmd_handler *a = _a; 2038 const struct cmd_handler *a = _a;
1825 const struct cmd_handler *b = _b; 2039 const struct cmd_handler *b = _b;
@@ -1833,6 +2047,10 @@ static struct cmd_handler *find_handler(char *line, enum cmd_status block) {
1833 res = bsearch(&d, bar_handlers, 2047 res = bsearch(&d, bar_handlers,
1834 sizeof(bar_handlers) / sizeof(struct cmd_handler), 2048 sizeof(bar_handlers) / sizeof(struct cmd_handler),
1835 sizeof(struct cmd_handler), handler_compare); 2049 sizeof(struct cmd_handler), handler_compare);
2050 } else if (block == CMD_BLOCK_BAR_COLORS){
2051 res = bsearch(&d, bar_colors_handlers,
2052 sizeof(bar_colors_handlers) / sizeof(struct cmd_handler),
2053 sizeof(struct cmd_handler), handler_compare);
1836 } else { 2054 } else {
1837 res = bsearch(&d, handlers, 2055 res = bsearch(&d, handlers,
1838 sizeof(handlers) / sizeof(struct cmd_handler), 2056 sizeof(handlers) / sizeof(struct cmd_handler),
diff --git a/sway/config.c b/sway/config.c
index 1fff3a08..e0c9151d 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -263,6 +263,14 @@ bool read_config(FILE *file, bool is_active) {
263 } 263 }
264 break; 264 break;
265 265
266 case CMD_BLOCK_BAR_COLORS:
267 if (block == CMD_BLOCK_BAR) {
268 block = CMD_BLOCK_BAR_COLORS;
269 } else {
270 sway_log(L_ERROR, "Invalid block '%s'", line);
271 }
272 break;
273
266 case CMD_BLOCK_END: 274 case CMD_BLOCK_END:
267 switch(block) { 275 switch(block) {
268 case CMD_BLOCK_MODE: 276 case CMD_BLOCK_MODE:
@@ -277,6 +285,11 @@ bool read_config(FILE *file, bool is_active) {
277 block = CMD_BLOCK_END; 285 block = CMD_BLOCK_END;
278 break; 286 break;
279 287
288 case CMD_BLOCK_BAR_COLORS:
289 sway_log(L_DEBUG, "End of bar colors block");
290 block = CMD_BLOCK_BAR;
291 break;
292
280 case CMD_BLOCK_END: 293 case CMD_BLOCK_END:
281 sway_log(L_ERROR, "Unmatched }"); 294 sway_log(L_ERROR, "Unmatched }");
282 break; 295 break;
@@ -554,6 +567,26 @@ struct bar_config *default_bar_config(void) {
554 bar->strip_workspace_numbers = false; 567 bar->strip_workspace_numbers = false;
555 bar->binding_mode_indicator = true; 568 bar->binding_mode_indicator = true;
556 bar->tray_padding = 2; 569 bar->tray_padding = 2;
570 // set default colors
571 strcpy(bar->colors.background, "#000000ff");
572 strcpy(bar->colors.statusline, "#ffffffff");
573 strcpy(bar->colors.separator, "#666666ff");
574 strcpy(bar->colors.focused_workspace_border, "#4c7899ff");
575 strcpy(bar->colors.focused_workspace_bg, "#285577ff");
576 strcpy(bar->colors.focused_workspace_text, "#ffffffff");
577 strcpy(bar->colors.active_workspace_border, "333333ff");
578 strcpy(bar->colors.active_workspace_bg, "#5f676aff");
579 strcpy(bar->colors.active_workspace_text, "#ffffffff");
580 strcpy(bar->colors.inactive_workspace_border, "#333333ff");
581 strcpy(bar->colors.inactive_workspace_bg,"#222222ff");
582 strcpy(bar->colors.inactive_workspace_text, "#888888ff");
583 strcpy(bar->colors.urgent_workspace_border, "#2f343aff");
584 strcpy(bar->colors.urgent_workspace_bg,"#900000ff");
585 strcpy(bar->colors.urgent_workspace_text, "#ffffffff");
586 strcpy(bar->colors.binding_mode_border, "#2f343aff");
587 strcpy(bar->colors.binding_mode_bg,"#900000ff");
588 strcpy(bar->colors.binding_mode_text, "#ffffffff");
589
557 list_add(config->bars, bar); 590 list_add(config->bars, bar);
558 591
559 return bar; 592 return bar;