Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

xwayland: add hidpi support via xwayland scale command #5090

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/sway/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ sway_cmd seat_cmd_pointer_constraint;
sway_cmd seat_cmd_shortcuts_inhibitor;
sway_cmd seat_cmd_xcursor_theme;

sway_cmd xwayland_cmd_enable;
sway_cmd xwayland_cmd_disable;
sway_cmd xwayland_cmd_force;
sway_cmd xwayland_cmd_scale;

sway_cmd cmd_ipc_cmd;
sway_cmd cmd_ipc_events;
sway_cmd cmd_ipc_event_cmd;
Expand Down
1 change: 1 addition & 0 deletions include/sway/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,7 @@ struct sway_config {
enum sway_fowa focus_on_window_activation;
enum sway_popup_during_fullscreen popup_during_fullscreen;
enum xwayland_mode xwayland;
int32_t xwayland_scale;

// swaybg
char *swaybg_command;
Expand Down
2 changes: 1 addition & 1 deletion sway/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ static struct cmd_handler handlers[] = {
{ "unbindsym", cmd_unbindsym },
{ "workspace", cmd_workspace },
{ "workspace_auto_back_and_forth", cmd_ws_auto_back_and_forth },
{ "xwayland", cmd_xwayland },
};

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

/* Runtime-only commands. Keep alphabetized */
Expand Down
46 changes: 29 additions & 17 deletions sway/commands/xwayland.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,39 @@
#include "sway/server.h"
#include "util.h"

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

struct cmd_results *cmd_xwayland(int argc, char **argv) {
#ifdef HAVE_XWAYLAND
enum xwayland_mode xwayland;
if (strcmp(argv[0], "force") == 0) {
xwayland = XWAYLAND_MODE_IMMEDIATE;
} else if (parse_boolean(argv[0], true)) {
xwayland = XWAYLAND_MODE_LAZY;
} else {
xwayland = XWAYLAND_MODE_DISABLED;
}
struct cmd_results *error;
while (argc > 0) {
config->handler_context.leftovers.argc = 0;
config->handler_context.leftovers.argv = NULL;

if (config->reloading && config->xwayland != xwayland) {
return cmd_results_new(CMD_FAILURE,
"xwayland can only be enabled/disabled at launch");
if (find_handler(*argv, xwayland_handlers, sizeof(xwayland_handlers))) {
error = config_subcommand(argv, argc, xwayland_handlers,
sizeof(xwayland_handlers));
} else {
error = cmd_results_new(CMD_INVALID,
"Invalid output subcommand: %s.", *argv);
}

if (error != NULL) {
return error;
}

argc = config->handler_context.leftovers.argc;
argv = config->handler_context.leftovers.argv;
}
config->xwayland = xwayland;

config->handler_context.leftovers.argc = 0;
config->handler_context.leftovers.argv = NULL;
#else
sway_log(SWAY_INFO, "Ignoring `xwayland` command, "
"sway hasn't been built with Xwayland support");
Expand Down
15 changes: 15 additions & 0 deletions sway/commands/xwayland/disable.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "sway/commands.h"
#include "sway/config.h"

struct cmd_results *xwayland_cmd_disable(int argc, char **argv) {
if (config->reloading && config->xwayland != XWAYLAND_MODE_DISABLED) {
return cmd_results_new(CMD_FAILURE,
"xwayland can only be enabled/disabled at launch");
}

config->xwayland = XWAYLAND_MODE_DISABLED;

config->handler_context.leftovers.argc = argc;
config->handler_context.leftovers.argv = argv;
return NULL;
}
15 changes: 15 additions & 0 deletions sway/commands/xwayland/enable.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "sway/commands.h"
#include "sway/config.h"

struct cmd_results *xwayland_cmd_enable(int argc, char **argv) {
if (config->reloading && config->xwayland != XWAYLAND_MODE_LAZY) {
return cmd_results_new(CMD_FAILURE,
"xwayland can only be enabled/disabled at launch");
}
config->xwayland = XWAYLAND_MODE_LAZY;

config->handler_context.leftovers.argc = argc;
config->handler_context.leftovers.argv = argv;
return NULL;
}

15 changes: 15 additions & 0 deletions sway/commands/xwayland/force.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#include "sway/commands.h"
#include "sway/config.h"

struct cmd_results *xwayland_cmd_force(int argc, char **argv) {
if (config->reloading && config->xwayland != XWAYLAND_MODE_IMMEDIATE) {
return cmd_results_new(CMD_FAILURE,
"xwayland can only be enabled/disabled at launch");
}
config->xwayland = XWAYLAND_MODE_IMMEDIATE;

config->handler_context.leftovers.argc = argc;
config->handler_context.leftovers.argv = argv;
return NULL;
}

31 changes: 31 additions & 0 deletions sway/commands/xwayland/scale.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <strings.h>
#include "sway/commands.h"
#include "sway/config.h"
#include "sway/server.h"
#include "log.h"

struct cmd_results *xwayland_cmd_scale(int argc, char **argv) {
if (!argc) {
return cmd_results_new(CMD_INVALID, "Missing scale argument.");
}

char *end;
int32_t scale = strtol(*argv, &end, 10);
if (*end) {
return cmd_results_new(CMD_INVALID, "Invalid scale.");
}
if(scale < 1) {
return cmd_results_new(CMD_INVALID, "Invalid scale: must be 1 or higher");
}

config->xwayland_scale = scale;

if(server.xwayland.wlr_xwayland != NULL) {
wlr_xwayland_set_scale(server.xwayland.wlr_xwayland, scale);
}

config->handler_context.leftovers.argc = argc - 1;
config->handler_context.leftovers.argv = argv + 1;

return NULL;
}
1 change: 1 addition & 0 deletions sway/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ static void config_defaults(struct sway_config *config) {
config->focus_on_window_activation = FOWA_URGENT;
config->popup_during_fullscreen = POPUP_SMART;
config->xwayland = XWAYLAND_MODE_LAZY;
config->xwayland_scale = 1;

config->titlebar_border_thickness = 1;
config->titlebar_h_padding = 5;
Expand Down
2 changes: 2 additions & 0 deletions sway/desktop/xwayland.c
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,8 @@ void handle_xwayland_ready(struct wl_listener *listener, void *data) {
wl_container_of(listener, server, xwayland_ready);
struct sway_xwayland *xwayland = &server->xwayland;

wlr_xwayland_set_scale(xwayland->wlr_xwayland, config->xwayland_scale);

xcb_connection_t *xcb_conn = xcb_connect(NULL, NULL);
int err = xcb_connection_has_error(xcb_conn);
if (err) {
Expand Down
5 changes: 5 additions & 0 deletions sway/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,11 @@ sway_sources = files(
'commands/output/toggle.c',
'commands/output/transform.c',

'commands/xwayland/enable.c',
'commands/xwayland/disable.c',
'commands/xwayland/force.c',
'commands/xwayland/scale.c',

'tree/arrange.c',
'tree/container.c',
'tree/node.c',
Expand Down