summaryrefslogtreecommitdiffstats
path: root/sway/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/commands.c')
-rw-r--r--sway/commands.c111
1 files changed, 103 insertions, 8 deletions
diff --git a/sway/commands.c b/sway/commands.c
index d2be2f9b..c621fa92 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -31,6 +31,7 @@
31#include "ipc-server.h" 31#include "ipc-server.h"
32#include "list.h" 32#include "list.h"
33#include "input.h" 33#include "input.h"
34#include "border.h"
34 35
35typedef struct cmd_results *sway_cmd(int argc, char **argv); 36typedef struct cmd_results *sway_cmd(int argc, char **argv);
36 37
@@ -43,6 +44,7 @@ static sway_cmd cmd_assign;
43static sway_cmd cmd_bar; 44static sway_cmd cmd_bar;
44static sway_cmd cmd_bindcode; 45static sway_cmd cmd_bindcode;
45static sway_cmd cmd_bindsym; 46static sway_cmd cmd_bindsym;
47static sway_cmd cmd_border;
46static sway_cmd cmd_debuglog; 48static sway_cmd cmd_debuglog;
47static sway_cmd cmd_exec; 49static sway_cmd cmd_exec;
48static sway_cmd cmd_exec_always; 50static sway_cmd cmd_exec_always;
@@ -55,6 +57,7 @@ static sway_cmd cmd_font;
55static sway_cmd cmd_for_window; 57static sway_cmd cmd_for_window;
56static sway_cmd cmd_fullscreen; 58static sway_cmd cmd_fullscreen;
57static sway_cmd cmd_gaps; 59static sway_cmd cmd_gaps;
60static sway_cmd cmd_hide_edge_borders;
58static sway_cmd cmd_include; 61static sway_cmd cmd_include;
59static sway_cmd cmd_input; 62static sway_cmd cmd_input;
60static sway_cmd cmd_kill; 63static sway_cmd cmd_kill;
@@ -345,6 +348,71 @@ static struct cmd_results *cmd_bindcode(int argc, char **argv) {
345 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 348 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
346} 349}
347 350
351static struct cmd_results *cmd_border(int argc, char **argv) {
352 struct cmd_results *error = NULL;
353 if ((error = checkarg(argc, "border", EXPECTED_AT_LEAST, 1))) {
354 return error;
355 }
356
357 if (argc > 2) {
358 return cmd_results_new(CMD_FAILURE, "border",
359 "Expected 'border <normal|pixel|none|toggle> [<n>]");
360 }
361
362 enum swayc_border_types border = config->border;
363 int thickness = config->border_thickness;
364
365 swayc_t *view = NULL;
366 if (config->active) {
367 view = get_focused_view(&root_container);
368 border = view->border_type;
369 thickness = view->border_thickness;
370 }
371
372 if (strcasecmp(argv[0], "none") == 0) {
373 border = B_NONE;
374 } else if (strcasecmp(argv[0], "normal") == 0) {
375 border = B_NORMAL;
376 } else if (strcasecmp(argv[0], "pixel") == 0) {
377 border = B_PIXEL;
378 } else if (strcasecmp(argv[0], "toggle") == 0) {
379 switch (border) {
380 case B_NONE:
381 border = B_PIXEL;
382 break;
383 case B_NORMAL:
384 border = B_NONE;
385 break;
386 case B_PIXEL:
387 border = B_NORMAL;
388 break;
389 }
390 } else {
391 return cmd_results_new(CMD_FAILURE, "border",
392 "Expected 'border <normal|pixel|none|toggle>");
393 }
394
395
396 if (argc == 2 && (border == B_NORMAL || border == B_PIXEL)) {
397 thickness = (int)strtol(argv[1], NULL, 10);
398 if (errno == ERANGE || thickness < 0) {
399 errno = 0;
400 return cmd_results_new(CMD_INVALID, "border", "Number is out out of range.");
401 }
402 }
403
404 if (config->active && view) {
405 view->border_type = border;
406 view->border_thickness = thickness;
407 update_geometry(view);
408 } else {
409 config->border = border;
410 config->border_thickness = thickness;
411 }
412
413 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
414}
415
348static struct cmd_results *cmd_exec_always(int argc, char **argv) { 416static struct cmd_results *cmd_exec_always(int argc, char **argv) {
349 struct cmd_results *error = NULL; 417 struct cmd_results *error = NULL;
350 if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL); 418 if (!config->active) return cmd_results_new(CMD_DEFER, NULL, NULL);
@@ -847,9 +915,9 @@ static struct cmd_results *cmd_move(int argc, char **argv) {
847 } else if (strcasecmp(argv[0], "position") == 0 && strcasecmp(argv[1], "mouse") == 0) { 915 } else if (strcasecmp(argv[0], "position") == 0 && strcasecmp(argv[1], "mouse") == 0) {
848 if (view->is_floating) { 916 if (view->is_floating) {
849 swayc_t *output = swayc_parent_by_type(view, C_OUTPUT); 917 swayc_t *output = swayc_parent_by_type(view, C_OUTPUT);
850 const struct wlc_geometry *geometry = wlc_view_get_geometry(view->handle); 918 struct wlc_geometry g;
919 wlc_view_get_visible_geometry(view->handle, &g);
851 const struct wlc_size *size = wlc_output_get_resolution(output->handle); 920 const struct wlc_size *size = wlc_output_get_resolution(output->handle);
852 struct wlc_geometry g = *geometry;
853 921
854 struct wlc_point origin; 922 struct wlc_point origin;
855 wlc_pointer_get_position(&origin); 923 wlc_pointer_get_position(&origin);
@@ -1500,6 +1568,29 @@ static struct cmd_results *cmd_smart_gaps(int argc, char **argv) {
1500 return cmd_results_new(CMD_SUCCESS, NULL, NULL); 1568 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1501} 1569}
1502 1570
1571static struct cmd_results *cmd_hide_edge_borders(int argc, char **argv) {
1572 struct cmd_results *error = NULL;
1573 if ((error = checkarg(argc, "hide_edge_borders", EXPECTED_EQUAL_TO, 1))) {
1574 return error;
1575 }
1576
1577 if (strcasecmp(argv[0], "none") == 0) {
1578 config->hide_edge_borders = E_NONE;
1579 } else if (strcasecmp(argv[0], "vertical") == 0) {
1580 config->hide_edge_borders = E_VERTICAL;
1581 } else if (strcasecmp(argv[0], "horizontal") == 0) {
1582 config->hide_edge_borders = E_HORIZONTAL;
1583 } else if (strcasecmp(argv[0], "both") == 0) {
1584 config->hide_edge_borders = E_BOTH;
1585 } else {
1586 return cmd_results_new(CMD_INVALID, "hide_edge_borders",
1587 "Expected 'hide_edge_borders <none|vertical|horizontal|both>'");
1588 }
1589
1590 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1591}
1592
1593
1503static struct cmd_results *cmd_kill(int argc, char **argv) { 1594static struct cmd_results *cmd_kill(int argc, char **argv) {
1504 if (config->reading) return cmd_results_new(CMD_FAILURE, "kill", "Can't be used in config file."); 1595 if (config->reading) return cmd_results_new(CMD_FAILURE, "kill", "Can't be used in config file.");
1505 if (!config->active) return cmd_results_new(CMD_FAILURE, "kill", "Can only be used when sway is running."); 1596 if (!config->active) return cmd_results_new(CMD_FAILURE, "kill", "Can only be used when sway is running.");
@@ -1866,16 +1957,18 @@ static struct cmd_results *cmd_font(int argc, char **argv) {
1866 } 1957 }
1867 1958
1868 char *font = join_args(argv, argc); 1959 char *font = join_args(argv, argc);
1960 free(config->font);
1869 if (strlen(font) > 6 && strncmp("pango:", font, 6) == 0) { 1961 if (strlen(font) > 6 && strncmp("pango:", font, 6) == 0) {
1870 free(config->font); 1962 config->font = strdup(font + 6);
1871 config->font = font;
1872 sway_log(L_DEBUG, "Settings font %s", config->font);
1873 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1874 } else {
1875 free(font); 1963 free(font);
1876 return cmd_results_new(CMD_FAILURE, "font", "non-pango font detected"); 1964 } else {
1965 config->font = font;
1877 } 1966 }
1878 1967
1968 config->font_height = get_font_text_height(config->font);
1969
1970 sway_log(L_DEBUG, "Settings font %s", config->font);
1971 return cmd_results_new(CMD_SUCCESS, NULL, NULL);
1879} 1972}
1880 1973
1881 1974
@@ -2044,6 +2137,7 @@ static struct cmd_handler handlers[] = {
2044 { "bar", cmd_bar }, 2137 { "bar", cmd_bar },
2045 { "bindcode", cmd_bindcode }, 2138 { "bindcode", cmd_bindcode },
2046 { "bindsym", cmd_bindsym }, 2139 { "bindsym", cmd_bindsym },
2140 { "border", cmd_border },
2047 { "debuglog", cmd_debuglog }, 2141 { "debuglog", cmd_debuglog },
2048 { "default_orientation", cmd_orientation }, 2142 { "default_orientation", cmd_orientation },
2049 { "exec", cmd_exec }, 2143 { "exec", cmd_exec },
@@ -2057,6 +2151,7 @@ static struct cmd_handler handlers[] = {
2057 { "for_window", cmd_for_window }, 2151 { "for_window", cmd_for_window },
2058 { "fullscreen", cmd_fullscreen }, 2152 { "fullscreen", cmd_fullscreen },
2059 { "gaps", cmd_gaps }, 2153 { "gaps", cmd_gaps },
2154 { "hide_edge_borders", cmd_hide_edge_borders },
2060 { "include", cmd_include }, 2155 { "include", cmd_include },
2061 { "input", cmd_input }, 2156 { "input", cmd_input },
2062 { "kill", cmd_kill }, 2157 { "kill", cmd_kill },