summaryrefslogtreecommitdiffstats
path: root/sway/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands.c')
-rw-r--r--sway/commands.c115
1 files changed, 96 insertions, 19 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 55f46f79..2248e1c7 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -83,6 +83,7 @@ static sway_cmd cmd_orientation;
83static sway_cmd cmd_output; 83static sway_cmd cmd_output;
84static sway_cmd cmd_reload; 84static sway_cmd cmd_reload;
85static sway_cmd cmd_resize; 85static sway_cmd cmd_resize;
86static sway_cmd cmd_resize_set;
86static sway_cmd cmd_scratchpad; 87static sway_cmd cmd_scratchpad;
87static sway_cmd cmd_set; 88static sway_cmd cmd_set;
88static sway_cmd cmd_smart_gaps; 89static sway_cmd cmd_smart_gaps;
@@ -2000,36 +2001,112 @@ static struct cmd_results *cmd_resize(int argc, char **argv) {
2000 struct cmd_results *error = NULL; 2001 struct cmd_results *error = NULL;
2001 if (config->reading) return cmd_results_new(CMD_FAILURE, "resize", "Can't be used in config file."); 2002 if (config->reading) return cmd_results_new(CMD_FAILURE, "resize", "Can't be used in config file.");
2002 if (!config->active) return cmd_results_new(CMD_FAILURE, "resize", "Can only be used when sway is running."); 2003 if (!config->active) return cmd_results_new(CMD_FAILURE, "resize", "Can only be used when sway is running.");
2004
2005 if (strcasecmp(argv[0], "set") == 0) {
2006 return cmd_resize_set(argc - 1, &argv[1]);
2007 }
2008
2003 if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 2))) { 2009 if ((error = checkarg(argc, "resize", EXPECTED_AT_LEAST, 2))) {
2004 return error; 2010 return error;
2005 } 2011 }
2006 2012
2007 int amount = (int)strtol(argv[argc - 1], NULL, 10); 2013 int dim_arg = argc - 1;
2014
2015 enum resize_dim_types dim_type = RESIZE_DIM_DEFAULT;
2016 if (strcasecmp(argv[dim_arg], "ppt") == 0) {
2017 dim_type = RESIZE_DIM_PPT;
2018 dim_arg--;
2019 } else if (strcasecmp(argv[dim_arg], "px") == 0) {
2020 dim_type = RESIZE_DIM_PX;
2021 dim_arg--;
2022 }
2023
2024 int amount = (int)strtol(argv[dim_arg], NULL, 10);
2008 if (errno == ERANGE || amount == 0) { 2025 if (errno == ERANGE || amount == 0) {
2009 errno = 0; 2026 errno = 0;
2010 return cmd_results_new(CMD_INVALID, "resize", "Number is out of range."); 2027 amount = 10; // this is the default resize dimension used by i3 for both px and ppt
2028 sway_log(L_DEBUG, "Tried to get resize dimension out of '%s' but failed; setting dimension to default %d",
2029 argv[dim_arg], amount);
2011 } 2030 }
2012 2031
2013 if (strcmp(argv[0], "shrink") == 0 || strcmp(argv[0], "grow") == 0) { 2032 bool use_width = false;
2014 if (strcmp(argv[0], "shrink") == 0) { 2033 if (strcasecmp(argv[1], "width") == 0) {
2015 amount *= -1; 2034 use_width = true;
2016 } 2035 } else if (strcasecmp(argv[1], "height") != 0) {
2036 return cmd_results_new(CMD_INVALID, "resize",
2037 "Expected 'resize <shrink|grow> <width|height> [<amount>] [px|ppt]'");
2038 }
2017 2039
2018 if (strcmp(argv[1], "width") == 0) { 2040 if (strcasecmp(argv[0], "shrink") == 0) {
2019 resize_tiled(amount, true); 2041 amount *= -1;
2020 } else if (strcmp(argv[1], "height") == 0) { 2042 } else if (strcasecmp(argv[0], "grow") != 0) {
2021 resize_tiled(amount, false); 2043 return cmd_results_new(CMD_INVALID, "resize",
2022 } else { 2044 "Expected 'resize <shrink|grow> <width|height> [<amount>] [px|ppt]'");
2023 return cmd_results_new(CMD_INVALID, "resize", 2045 }
2024 "Expected 'resize <shrink|grow> <width|height> <amount>' or 'resize <width|height> <amount>'"); 2046
2047 resize(amount, use_width, dim_type);
2048 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
2049}
2050
2051static struct cmd_results *cmd_resize_set(int argc, char **argv) {
2052 struct cmd_results *error = NULL;
2053 if ((error = checkarg(argc, "resize set", EXPECTED_AT_LEAST, 2))) {
2054 return error;
2055 }
2056
2057 if (strcasecmp(argv[0], "width") == 0 || strcasecmp(argv[0], "height") == 0) {
2058 // handle `reset set width 100 px height 100 px` syntax, also allows
2059 // specifying only one dimension for a `resize set`
2060 int cmd_num = 0;
2061 int dim;
2062
2063 while ((cmd_num + 1) < argc) {
2064 dim = (int)strtol(argv[cmd_num + 1], NULL, 10);
2065 if (errno == ERANGE || dim == 0) {
2066 errno = 0;
2067 return cmd_results_new(CMD_INVALID, "resize set",
2068 "Expected 'resize set <width|height> <amount> [px] [<width|height> <amount> [px]]'");
2069 }
2070
2071 if (strcasecmp(argv[cmd_num], "width") == 0) {
2072 set_size(dim, true);
2073 } else if (strcasecmp(argv[cmd_num], "height") == 0) {
2074 set_size(dim, false);
2075 } else {
2076 return cmd_results_new(CMD_INVALID, "resize set",
2077 "Expected 'resize set <width|height> <amount> [px] [<width|height> <amount> [px]]'");
2078 }
2079
2080 cmd_num += 2;
2081
2082 if (cmd_num < argc && strcasecmp(argv[cmd_num], "px") == 0) {
2083 // if this was `resize set width 400 px height 300 px`, disregard the `px` arg
2084 cmd_num++;
2085 }
2025 } 2086 }
2026 } else if (strcmp(argv[0], "width") == 0) {
2027 set_size_tiled(amount, true);
2028 } else if (strcmp(argv[0], "height") == 0) {
2029 set_size_tiled(amount, false);
2030 } else { 2087 } else {
2031 return cmd_results_new(CMD_INVALID, "resize", 2088 // handle `reset set 100 px 100 px` syntax
2032 "Expected 'resize <shrink|grow> <width|height> <amount>' or 'resize <width|height> <amount>'"); 2089 int width = (int)strtol(argv[0], NULL, 10);
2090 if (errno == ERANGE || width == 0) {
2091 errno = 0;
2092 return cmd_results_new(CMD_INVALID, "resize set",
2093 "Expected 'resize set <width> [px] <height> [px]'");
2094 }
2095
2096 int height_arg = 1;
2097 if (strcasecmp(argv[1], "px") == 0) {
2098 height_arg = 2;
2099 }
2100
2101 int height = (int)strtol(argv[height_arg], NULL, 10);
2102 if (errno == ERANGE || height == 0) {
2103 errno = 0;
2104 return cmd_results_new(CMD_INVALID, "resize set",
2105 "Expected 'resize set <width> [px] <height> [px]'");
2106 }
2107
2108 set_size(width, true);
2109 set_size(height, false);
2033 } 2110 }
2034 2111
2035 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 2112 return cmd_results_new(CMD_SUCCESS, NULL, NULL);