From e67f3543332349e63b5099a241fdd85ce28ea54b Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 30 Apr 2018 21:24:13 +1000 Subject: Implement borders Implements rendering of borders. Title text is still to do. Implements the following configuration directives: * client.focused * client.focused_inactive * client.unfocused * client.urgent * border * default_border --- sway/commands/border.c | 41 ++++++++++++++++++++++ sway/commands/client.c | 79 ++++++++++++++++++++++++++++++++++++++++++ sway/commands/default_border.c | 27 +++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 sway/commands/border.c create mode 100644 sway/commands/client.c create mode 100644 sway/commands/default_border.c (limited to 'sway/commands') diff --git a/sway/commands/border.c b/sway/commands/border.c new file mode 100644 index 00000000..873abb68 --- /dev/null +++ b/sway/commands/border.c @@ -0,0 +1,41 @@ +#include "log.h" +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/container.h" +#include "sway/tree/view.h" + +struct cmd_results *cmd_border(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "border", EXPECTED_AT_LEAST, 1))) { + return error; + } + + struct sway_container *container = + config->handler_context.current_container; + if (container->type != C_VIEW) { + return cmd_results_new(CMD_INVALID, "border", + "Only views can have borders"); + } + struct sway_view *view = container->sway_view; + + if (strcmp(argv[0], "none") == 0) { + view->border = B_NONE; + } else if (strcmp(argv[0], "normal") == 0) { + view->border = B_NORMAL; + } else if (strcmp(argv[0], "pixel") == 0) { + view->border = B_PIXEL; + if (argc == 2) { + view->border_thickness = atoi(argv[1]); + } + } else if (strcmp(argv[0], "toggle") == 0) { + view->border = (view->border + 1) % 3; + } else { + return cmd_results_new(CMD_INVALID, "border", + "Expected 'border ' " + "or 'border pixel '"); + } + + view_autoconfigure(view); + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} diff --git a/sway/commands/client.c b/sway/commands/client.c new file mode 100644 index 00000000..ce519381 --- /dev/null +++ b/sway/commands/client.c @@ -0,0 +1,79 @@ +#include "log.h" +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/container.h" + +static bool parse_color(char *hexstring, float (*dest)[4]) { + if (hexstring[0] != '#') { + return false; + } + + if (strlen(hexstring) != 7) { + return false; + } + + ++hexstring; + char *end; + uint32_t decimal = strtol(hexstring, &end, 16); + + if (*end != '\0') { + return false; + } + + (*dest)[0] = ((decimal >> 16) & 0xff) / 255.0; + (*dest)[1] = ((decimal >> 8) & 0xff) / 255.0; + (*dest)[2] = (decimal & 0xff) / 255.0; + (*dest)[3] = 1.0; + return true; +} + +static struct cmd_results *handle_command(int argc, char **argv, + struct border_colors *class, char *cmd_name) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, cmd_name, EXPECTED_EQUAL_TO, 5))) { + return error; + } + + if (!parse_color(argv[0], &class->border)) { + return cmd_results_new(CMD_INVALID, cmd_name, + "Unable to parse border color"); + } + + if (!parse_color(argv[1], &class->background)) { + return cmd_results_new(CMD_INVALID, cmd_name, + "Unable to parse background color"); + } + + if (!parse_color(argv[2], &class->text)) { + return cmd_results_new(CMD_INVALID, cmd_name, + "Unable to parse text color"); + } + + if (!parse_color(argv[3], &class->indicator)) { + return cmd_results_new(CMD_INVALID, cmd_name, + "Unable to parse indicator color"); + } + + if (!parse_color(argv[4], &class->child_border)) { + return cmd_results_new(CMD_INVALID, cmd_name, + "Unable to parse child border color"); + } + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} + +struct cmd_results *cmd_client_focused(int argc, char **argv) { + return handle_command(argc, argv, &config->border_colors.focused, "client.focused"); +} + +struct cmd_results *cmd_client_focused_inactive(int argc, char **argv) { + return handle_command(argc, argv, &config->border_colors.focused_inactive, "client.focused_inactive"); +} + +struct cmd_results *cmd_client_unfocused(int argc, char **argv) { + return handle_command(argc, argv, &config->border_colors.unfocused, "client.unfocused"); +} + +struct cmd_results *cmd_client_urgent(int argc, char **argv) { + return handle_command(argc, argv, &config->border_colors.urgent, "client.urgent"); +} diff --git a/sway/commands/default_border.c b/sway/commands/default_border.c new file mode 100644 index 00000000..fcd2c075 --- /dev/null +++ b/sway/commands/default_border.c @@ -0,0 +1,27 @@ +#include "log.h" +#include "sway/commands.h" +#include "sway/config.h" +#include "sway/tree/container.h" + +struct cmd_results *cmd_default_border(int argc, char **argv) { + struct cmd_results *error = NULL; + if ((error = checkarg(argc, "default_border", EXPECTED_AT_LEAST, 1))) { + return error; + } + + if (strcmp(argv[0], "none") == 0) { + config->border = B_NONE; + } else if (strcmp(argv[0], "normal") == 0) { + config->border = B_NORMAL; + } else if (strcmp(argv[0], "pixel") == 0) { + config->border = B_PIXEL; + if (argc == 2) { + config->border_thickness = atoi(argv[1]); + } + } else { + return cmd_results_new(CMD_INVALID, "default_border", + "Expected 'default_border ' or 'default_border pixel '"); + } + + return cmd_results_new(CMD_SUCCESS, NULL, NULL); +} -- cgit v1.2.3 From 51df1d4ff864f9ba6658d568e24554169363df7b Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 1 May 2018 22:42:08 +1000 Subject: Update cursor when border is changed --- sway/commands/border.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'sway/commands') diff --git a/sway/commands/border.c b/sway/commands/border.c index 873abb68..1eb06a21 100644 --- a/sway/commands/border.c +++ b/sway/commands/border.c @@ -1,6 +1,8 @@ #include "log.h" #include "sway/commands.h" #include "sway/config.h" +#include "sway/input/cursor.h" +#include "sway/input/input-manager.h" #include "sway/tree/container.h" #include "sway/tree/view.h" @@ -37,5 +39,10 @@ struct cmd_results *cmd_border(int argc, char **argv) { view_autoconfigure(view); + struct sway_seat *seat = input_manager_current_seat(input_manager); + if (seat->cursor) { + cursor_send_pointer_motion(seat->cursor, 0); + } + return cmd_results_new(CMD_SUCCESS, NULL, NULL); } -- cgit v1.2.3 From cb07434913b89580a4025824cb181733b2db1eb7 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 1 May 2018 22:48:57 +1000 Subject: Remove unnecessary pointers --- sway/commands/client.c | 20 +++++++------- sway/config.c | 74 +++++++++++++++++++++++++------------------------- 2 files changed, 47 insertions(+), 47 deletions(-) (limited to 'sway/commands') diff --git a/sway/commands/client.c b/sway/commands/client.c index ce519381..156ff95c 100644 --- a/sway/commands/client.c +++ b/sway/commands/client.c @@ -3,7 +3,7 @@ #include "sway/config.h" #include "sway/tree/container.h" -static bool parse_color(char *hexstring, float (*dest)[4]) { +static bool parse_color(char *hexstring, float dest[static 4]) { if (hexstring[0] != '#') { return false; } @@ -20,10 +20,10 @@ static bool parse_color(char *hexstring, float (*dest)[4]) { return false; } - (*dest)[0] = ((decimal >> 16) & 0xff) / 255.0; - (*dest)[1] = ((decimal >> 8) & 0xff) / 255.0; - (*dest)[2] = (decimal & 0xff) / 255.0; - (*dest)[3] = 1.0; + dest[0] = ((decimal >> 16) & 0xff) / 255.0; + dest[1] = ((decimal >> 8) & 0xff) / 255.0; + dest[2] = (decimal & 0xff) / 255.0; + dest[3] = 1.0; return true; } @@ -34,27 +34,27 @@ static struct cmd_results *handle_command(int argc, char **argv, return error; } - if (!parse_color(argv[0], &class->border)) { + if (!parse_color(argv[0], class->border)) { return cmd_results_new(CMD_INVALID, cmd_name, "Unable to parse border color"); } - if (!parse_color(argv[1], &class->background)) { + if (!parse_color(argv[1], class->background)) { return cmd_results_new(CMD_INVALID, cmd_name, "Unable to parse background color"); } - if (!parse_color(argv[2], &class->text)) { + if (!parse_color(argv[2], class->text)) { return cmd_results_new(CMD_INVALID, cmd_name, "Unable to parse text color"); } - if (!parse_color(argv[3], &class->indicator)) { + if (!parse_color(argv[3], class->indicator)) { return cmd_results_new(CMD_INVALID, cmd_name, "Unable to parse indicator color"); } - if (!parse_color(argv[4], &class->child_border)) { + if (!parse_color(argv[4], class->child_border)) { return cmd_results_new(CMD_INVALID, cmd_name, "Unable to parse child border color"); } diff --git a/sway/config.c b/sway/config.c index ed291450..f4d78e19 100644 --- a/sway/config.c +++ b/sway/config.c @@ -130,11 +130,11 @@ static void destroy_removed_seats(struct sway_config *old_config, } } -static void set_color(float (*dest)[4], uint32_t color) { - (*dest)[0] = ((color >> 16) & 0xff) / 255.0; - (*dest)[1] = ((color >> 8) & 0xff) / 255.0; - (*dest)[2] = (color & 0xff) / 255.0; - (*dest)[3] = 1.0; +static void set_color(float dest[static 4], uint32_t color) { + dest[0] = ((color >> 16) & 0xff) / 255.0; + dest[1] = ((color >> 8) & 0xff) / 255.0; + dest[2] = (color & 0xff) / 255.0; + dest[3] = 1.0; } static void config_defaults(struct sway_config *config) { @@ -205,38 +205,38 @@ static void config_defaults(struct sway_config *config) { config->hide_edge_borders = E_NONE; // border colors - set_color(&config->border_colors.focused.border, 0x4C7899); - set_color(&config->border_colors.focused.border, 0x4C7899); - set_color(&config->border_colors.focused.background, 0x285577); - set_color(&config->border_colors.focused.text, 0xFFFFFF); - set_color(&config->border_colors.focused.indicator, 0x2E9EF4); - set_color(&config->border_colors.focused.child_border, 0x285577); - - set_color(&config->border_colors.focused_inactive.border, 0x333333); - set_color(&config->border_colors.focused_inactive.background, 0x5F676A); - set_color(&config->border_colors.focused_inactive.text, 0xFFFFFF); - set_color(&config->border_colors.focused_inactive.indicator, 0x484E50); - set_color(&config->border_colors.focused_inactive.child_border, 0x5F676A); - - set_color(&config->border_colors.unfocused.border, 0x333333); - set_color(&config->border_colors.unfocused.background, 0x222222); - set_color(&config->border_colors.unfocused.text, 0x888888); - set_color(&config->border_colors.unfocused.indicator, 0x292D2E); - set_color(&config->border_colors.unfocused.child_border, 0x222222); - - set_color(&config->border_colors.urgent.border, 0x2F343A); - set_color(&config->border_colors.urgent.background, 0x900000); - set_color(&config->border_colors.urgent.text, 0xFFFFFF); - set_color(&config->border_colors.urgent.indicator, 0x900000); - set_color(&config->border_colors.urgent.child_border, 0x900000); - - set_color(&config->border_colors.placeholder.border, 0x000000); - set_color(&config->border_colors.placeholder.background, 0x0C0C0C); - set_color(&config->border_colors.placeholder.text, 0xFFFFFF); - set_color(&config->border_colors.placeholder.indicator, 0x000000); - set_color(&config->border_colors.placeholder.child_border, 0x0C0C0C); - - set_color(&config->border_colors.background, 0xFFFFFF); + set_color(config->border_colors.focused.border, 0x4C7899); + set_color(config->border_colors.focused.border, 0x4C7899); + set_color(config->border_colors.focused.background, 0x285577); + set_color(config->border_colors.focused.text, 0xFFFFFF); + set_color(config->border_colors.focused.indicator, 0x2E9EF4); + set_color(config->border_colors.focused.child_border, 0x285577); + + set_color(config->border_colors.focused_inactive.border, 0x333333); + set_color(config->border_colors.focused_inactive.background, 0x5F676A); + set_color(config->border_colors.focused_inactive.text, 0xFFFFFF); + set_color(config->border_colors.focused_inactive.indicator, 0x484E50); + set_color(config->border_colors.focused_inactive.child_border, 0x5F676A); + + set_color(config->border_colors.unfocused.border, 0x333333); + set_color(config->border_colors.unfocused.background, 0x222222); + set_color(config->border_colors.unfocused.text, 0x888888); + set_color(config->border_colors.unfocused.indicator, 0x292D2E); + set_color(config->border_colors.unfocused.child_border, 0x222222); + + set_color(config->border_colors.urgent.border, 0x2F343A); + set_color(config->border_colors.urgent.background, 0x900000); + set_color(config->border_colors.urgent.text, 0xFFFFFF); + set_color(config->border_colors.urgent.indicator, 0x900000); + set_color(config->border_colors.urgent.child_border, 0x900000); + + set_color(config->border_colors.placeholder.border, 0x000000); + set_color(config->border_colors.placeholder.background, 0x0C0C0C); + set_color(config->border_colors.placeholder.text, 0xFFFFFF); + set_color(config->border_colors.placeholder.indicator, 0x000000); + set_color(config->border_colors.placeholder.child_border, 0x0C0C0C); + + set_color(config->border_colors.background, 0xFFFFFF); // Security if (!(config->command_policies = create_list())) goto cleanup; -- cgit v1.2.3