diff options
Diffstat (limited to 'sway/commands.c')
-rw-r--r-- | sway/commands.c | 111 |
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 | ||
35 | typedef struct cmd_results *sway_cmd(int argc, char **argv); | 36 | typedef struct cmd_results *sway_cmd(int argc, char **argv); |
36 | 37 | ||
@@ -43,6 +44,7 @@ static sway_cmd cmd_assign; | |||
43 | static sway_cmd cmd_bar; | 44 | static sway_cmd cmd_bar; |
44 | static sway_cmd cmd_bindcode; | 45 | static sway_cmd cmd_bindcode; |
45 | static sway_cmd cmd_bindsym; | 46 | static sway_cmd cmd_bindsym; |
47 | static sway_cmd cmd_border; | ||
46 | static sway_cmd cmd_debuglog; | 48 | static sway_cmd cmd_debuglog; |
47 | static sway_cmd cmd_exec; | 49 | static sway_cmd cmd_exec; |
48 | static sway_cmd cmd_exec_always; | 50 | static sway_cmd cmd_exec_always; |
@@ -55,6 +57,7 @@ static sway_cmd cmd_font; | |||
55 | static sway_cmd cmd_for_window; | 57 | static sway_cmd cmd_for_window; |
56 | static sway_cmd cmd_fullscreen; | 58 | static sway_cmd cmd_fullscreen; |
57 | static sway_cmd cmd_gaps; | 59 | static sway_cmd cmd_gaps; |
60 | static sway_cmd cmd_hide_edge_borders; | ||
58 | static sway_cmd cmd_include; | 61 | static sway_cmd cmd_include; |
59 | static sway_cmd cmd_input; | 62 | static sway_cmd cmd_input; |
60 | static sway_cmd cmd_kill; | 63 | static 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 | ||
351 | static 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 | |||
348 | static struct cmd_results *cmd_exec_always(int argc, char **argv) { | 416 | static 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 | ||
1571 | static 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 | |||
1503 | static struct cmd_results *cmd_kill(int argc, char **argv) { | 1594 | static 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 }, |