Skip to content

Commit 8454c80

Browse files
committed
Make xwayland scale factor configurable via xwayland scale command.
1 parent 28e3187 commit 8454c80

File tree

11 files changed

+120
-18
lines changed

11 files changed

+120
-18
lines changed

include/sway/commands.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,11 @@ sway_cmd seat_cmd_keyboard_grouping;
290290
sway_cmd seat_cmd_pointer_constraint;
291291
sway_cmd seat_cmd_xcursor_theme;
292292

293+
sway_cmd xwayland_cmd_enable;
294+
sway_cmd xwayland_cmd_disable;
295+
sway_cmd xwayland_cmd_force;
296+
sway_cmd xwayland_cmd_scale;
297+
293298
sway_cmd cmd_ipc_cmd;
294299
sway_cmd cmd_ipc_events;
295300
sway_cmd cmd_ipc_event_cmd;

include/sway/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@ struct sway_config {
513513
enum sway_fowa focus_on_window_activation;
514514
enum sway_popup_during_fullscreen popup_during_fullscreen;
515515
enum xwayland_mode xwayland;
516+
int32_t xwayland_scale;
516517

517518
// swaybg
518519
char *swaybg_command;

sway/commands.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ static struct cmd_handler handlers[] = {
9797
{ "unbindsym", cmd_unbindsym },
9898
{ "workspace", cmd_workspace },
9999
{ "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth },
100+
{ "xwayland", cmd_xwayland },
100101
};
101102

102103
/* Config-time only commands. Keep alphabetized */
@@ -105,7 +106,6 @@ static struct cmd_handler config_handlers[] = {
105106
{ "swaybg_command", cmd_swaybg_command },
106107
{ "swaynag_command", cmd_swaynag_command },
107108
{ "workspace_layout", cmd_workspace_layout },
108-
{ "xwayland", cmd_xwayland },
109109
};
110110

111111
/* Runtime-only commands. Keep alphabetized */

sway/commands/xwayland.c

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,39 @@
44
#include "sway/server.h"
55
#include "util.h"
66

7-
struct cmd_results *cmd_xwayland(int argc, char **argv) {
8-
struct cmd_results *error = NULL;
9-
if ((error = checkarg(argc, "xwayland", EXPECTED_EQUAL_TO, 1))) {
10-
return error;
11-
}
7+
// must be in order for the bsearch
8+
static struct cmd_handler xwayland_handlers[] = {
9+
{ "enable", xwayland_cmd_enable },
10+
{ "disable", xwayland_cmd_disable },
11+
{ "force", xwayland_cmd_force },
12+
{ "scale", xwayland_cmd_scale },
13+
};
1214

15+
struct cmd_results *cmd_xwayland(int argc, char **argv) {
1316
#ifdef HAVE_XWAYLAND
14-
enum xwayland_mode xwayland;
15-
if (strcmp(argv[0], "force") == 0) {
16-
xwayland = XWAYLAND_MODE_IMMEDIATE;
17-
} else if (parse_boolean(argv[0], true)) {
18-
xwayland = XWAYLAND_MODE_LAZY;
19-
} else {
20-
xwayland = XWAYLAND_MODE_DISABLED;
21-
}
17+
struct cmd_results *error;
18+
while (argc > 0) {
19+
config->handler_context.leftovers.argc = 0;
20+
config->handler_context.leftovers.argv = NULL;
2221

23-
if (config->reloading && config->xwayland != xwayland) {
24-
return cmd_results_new(CMD_FAILURE,
25-
"xwayland can only be enabled/disabled at launch");
22+
if (find_handler(*argv, xwayland_handlers, sizeof(xwayland_handlers))) {
23+
error = config_subcommand(argv, argc, xwayland_handlers,
24+
sizeof(xwayland_handlers));
25+
} else {
26+
error = cmd_results_new(CMD_INVALID,
27+
"Invalid output subcommand: %s.", *argv);
28+
}
29+
30+
if (error != NULL) {
31+
return error;
32+
}
33+
34+
argc = config->handler_context.leftovers.argc;
35+
argv = config->handler_context.leftovers.argv;
2636
}
27-
config->xwayland = xwayland;
37+
38+
config->handler_context.leftovers.argc = 0;
39+
config->handler_context.leftovers.argv = NULL;
2840
#else
2941
sway_log(SWAY_INFO, "Ignoring `xwayland` command, "
3042
"sway hasn't been built with Xwayland support");

sway/commands/xwayland/disable.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "sway/commands.h"
2+
#include "sway/config.h"
3+
4+
struct cmd_results *xwayland_cmd_disable(int argc, char **argv) {
5+
if (config->reloading && config->xwayland != XWAYLAND_MODE_DISABLED) {
6+
return cmd_results_new(CMD_FAILURE,
7+
"xwayland can only be enabled/disabled at launch");
8+
}
9+
10+
config->xwayland = XWAYLAND_MODE_DISABLED;
11+
12+
config->handler_context.leftovers.argc = argc;
13+
config->handler_context.leftovers.argv = argv;
14+
return NULL;
15+
}

sway/commands/xwayland/enable.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "sway/commands.h"
2+
#include "sway/config.h"
3+
4+
struct cmd_results *xwayland_cmd_enable(int argc, char **argv) {
5+
if (config->reloading && config->xwayland != XWAYLAND_MODE_LAZY) {
6+
return cmd_results_new(CMD_FAILURE,
7+
"xwayland can only be enabled/disabled at launch");
8+
}
9+
config->xwayland = XWAYLAND_MODE_LAZY;
10+
11+
config->handler_context.leftovers.argc = argc;
12+
config->handler_context.leftovers.argv = argv;
13+
return NULL;
14+
}
15+

sway/commands/xwayland/force.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "sway/commands.h"
2+
#include "sway/config.h"
3+
4+
struct cmd_results *xwayland_cmd_force(int argc, char **argv) {
5+
if (config->reloading && config->xwayland != XWAYLAND_MODE_IMMEDIATE) {
6+
return cmd_results_new(CMD_FAILURE,
7+
"xwayland can only be enabled/disabled at launch");
8+
}
9+
config->xwayland = XWAYLAND_MODE_IMMEDIATE;
10+
11+
config->handler_context.leftovers.argc = argc;
12+
config->handler_context.leftovers.argv = argv;
13+
return NULL;
14+
}
15+

sway/commands/xwayland/scale.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include <strings.h>
2+
#include "sway/commands.h"
3+
#include "sway/config.h"
4+
#include "sway/server.h"
5+
#include "log.h"
6+
7+
struct cmd_results *xwayland_cmd_scale(int argc, char **argv) {
8+
if (!argc) {
9+
return cmd_results_new(CMD_INVALID, "Missing scale argument.");
10+
}
11+
12+
char *end;
13+
int32_t scale = strtol(*argv, &end, 10);
14+
if (*end) {
15+
return cmd_results_new(CMD_INVALID, "Invalid scale.");
16+
}
17+
if(scale < 1) {
18+
return cmd_results_new(CMD_INVALID, "Invalid scale: must be 1 or higher");
19+
}
20+
21+
config->xwayland_scale = scale;
22+
23+
if(server.xwayland.wlr_xwayland != NULL) {
24+
wlr_xwayland_set_scale(server.xwayland.wlr_xwayland, scale);
25+
}
26+
27+
config->handler_context.leftovers.argc = argc - 1;
28+
config->handler_context.leftovers.argv = argv + 1;
29+
30+
return NULL;
31+
}

sway/config.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ static void config_defaults(struct sway_config *config) {
243243
config->urgent_timeout = 500;
244244
config->popup_during_fullscreen = POPUP_SMART;
245245
config->xwayland = XWAYLAND_MODE_LAZY;
246+
config->xwayland_scale = 1;
246247

247248
config->titlebar_border_thickness = 1;
248249
config->titlebar_h_padding = 5;

sway/desktop/xwayland.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,8 @@ void handle_xwayland_ready(struct wl_listener *listener, void *data) {
680680
wl_container_of(listener, server, xwayland_ready);
681681
struct sway_xwayland *xwayland = &server->xwayland;
682682

683+
wlr_xwayland_set_scale(xwayland->wlr_xwayland, config->xwayland_scale);
684+
683685
xcb_connection_t *xcb_conn = xcb_connect(NULL, NULL);
684686
int err = xcb_connection_has_error(xcb_conn);
685687
if (err) {

0 commit comments

Comments
 (0)