pointer_constraint: change to a seat subcommand
This changes the `pointer_constraint` command to be a subcommand of seat to allow for per-seat settings. The current implementation that is not a seat subcommand will only operate on the current seat and will segfault in the config due to `config->handler_context.seat` only being set at runtime. This also allows for the wildcard identifier to be used to alter the pointer constraint settings on all seats and allows for the setting to be merged with the rest of the seat config.
This commit is contained in:
parent
204e1f4712
commit
ebe5399ed6
|
@ -153,7 +153,6 @@ sway_cmd cmd_new_window;
|
||||||
sway_cmd cmd_no_focus;
|
sway_cmd cmd_no_focus;
|
||||||
sway_cmd cmd_output;
|
sway_cmd cmd_output;
|
||||||
sway_cmd cmd_permit;
|
sway_cmd cmd_permit;
|
||||||
sway_cmd cmd_pointer_constraint;
|
|
||||||
sway_cmd cmd_popup_during_fullscreen;
|
sway_cmd cmd_popup_during_fullscreen;
|
||||||
sway_cmd cmd_reject;
|
sway_cmd cmd_reject;
|
||||||
sway_cmd cmd_reload;
|
sway_cmd cmd_reload;
|
||||||
|
@ -268,6 +267,7 @@ sway_cmd seat_cmd_attach;
|
||||||
sway_cmd seat_cmd_cursor;
|
sway_cmd seat_cmd_cursor;
|
||||||
sway_cmd seat_cmd_fallback;
|
sway_cmd seat_cmd_fallback;
|
||||||
sway_cmd seat_cmd_hide_cursor;
|
sway_cmd seat_cmd_hide_cursor;
|
||||||
|
sway_cmd seat_cmd_pointer_constraint;
|
||||||
|
|
||||||
sway_cmd cmd_ipc_cmd;
|
sway_cmd cmd_ipc_cmd;
|
||||||
sway_cmd cmd_ipc_events;
|
sway_cmd cmd_ipc_events;
|
||||||
|
|
|
@ -135,6 +135,12 @@ struct seat_attachment_config {
|
||||||
// TODO other things are configured here for some reason
|
// TODO other things are configured here for some reason
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum seat_config_allow_constrain {
|
||||||
|
CONSTRAIN_DEFAULT, // the default is currently enabled
|
||||||
|
CONSTRAIN_ENABLE,
|
||||||
|
CONSTRAIN_DISABLE
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options for multiseat and other misc device configurations
|
* Options for multiseat and other misc device configurations
|
||||||
*/
|
*/
|
||||||
|
@ -143,7 +149,7 @@ struct seat_config {
|
||||||
int fallback; // -1 means not set
|
int fallback; // -1 means not set
|
||||||
list_t *attachments; // list of seat_attachment configs
|
list_t *attachments; // list of seat_attachment configs
|
||||||
int hide_cursor_timeout;
|
int hide_cursor_timeout;
|
||||||
bool allow_constrain;
|
enum seat_config_allow_constrain allow_constrain;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum config_dpms {
|
enum config_dpms {
|
||||||
|
|
|
@ -81,7 +81,6 @@ static struct cmd_handler handlers[] = {
|
||||||
{ "no_focus", cmd_no_focus },
|
{ "no_focus", cmd_no_focus },
|
||||||
{ "output", cmd_output },
|
{ "output", cmd_output },
|
||||||
{ "popup_during_fullscreen", cmd_popup_during_fullscreen },
|
{ "popup_during_fullscreen", cmd_popup_during_fullscreen },
|
||||||
{ "pointer_constraint", cmd_pointer_constraint },
|
|
||||||
{ "seat", cmd_seat },
|
{ "seat", cmd_seat },
|
||||||
{ "set", cmd_set },
|
{ "set", cmd_set },
|
||||||
{ "show_marks", cmd_show_marks },
|
{ "show_marks", cmd_show_marks },
|
||||||
|
|
|
@ -11,6 +11,7 @@ static struct cmd_handler seat_handlers[] = {
|
||||||
{ "cursor", seat_cmd_cursor },
|
{ "cursor", seat_cmd_cursor },
|
||||||
{ "fallback", seat_cmd_fallback },
|
{ "fallback", seat_cmd_fallback },
|
||||||
{ "hide_cursor", seat_cmd_hide_cursor },
|
{ "hide_cursor", seat_cmd_hide_cursor },
|
||||||
|
{ "pointer_constraint", seat_cmd_pointer_constraint },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cmd_results *cmd_seat(int argc, char **argv) {
|
struct cmd_results *cmd_seat(int argc, char **argv) {
|
||||||
|
|
|
@ -12,11 +12,14 @@ enum operation {
|
||||||
};
|
};
|
||||||
|
|
||||||
// pointer_constraint [enable|disable|escape]
|
// pointer_constraint [enable|disable|escape]
|
||||||
struct cmd_results *cmd_pointer_constraint(int argc, char **argv) {
|
struct cmd_results *seat_cmd_pointer_constraint(int argc, char **argv) {
|
||||||
struct cmd_results *error = NULL;
|
struct cmd_results *error = NULL;
|
||||||
if ((error = checkarg(argc, "pointer_constraint", EXPECTED_EQUAL_TO, 1))) {
|
if ((error = checkarg(argc, "pointer_constraint", EXPECTED_EQUAL_TO, 1))) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
if (!config->handler_context.seat_config) {
|
||||||
|
return cmd_results_new(CMD_FAILURE, "No seat defined");
|
||||||
|
}
|
||||||
|
|
||||||
enum operation op;
|
enum operation op;
|
||||||
if (strcmp(argv[0], "enable") == 0) {
|
if (strcmp(argv[0], "enable") == 0) {
|
||||||
|
@ -33,19 +36,23 @@ struct cmd_results *cmd_pointer_constraint(int argc, char **argv) {
|
||||||
return cmd_results_new(CMD_FAILURE, "Can only escape at runtime.");
|
return cmd_results_new(CMD_FAILURE, "Can only escape at runtime.");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sway_cursor *cursor = config->handler_context.seat->cursor;
|
struct seat_config *seat_config = config->handler_context.seat_config;
|
||||||
struct seat_config *seat_config = seat_get_config(cursor->seat);
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OP_ENABLE:
|
case OP_ENABLE:
|
||||||
seat_config->allow_constrain = true;
|
seat_config->allow_constrain = CONSTRAIN_ENABLE;
|
||||||
break;
|
break;
|
||||||
case OP_DISABLE:
|
case OP_DISABLE:
|
||||||
seat_config->allow_constrain = false;
|
seat_config->allow_constrain = CONSTRAIN_DISABLE;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case OP_ESCAPE:
|
case OP_ESCAPE:;
|
||||||
sway_cursor_constrain(cursor, NULL);
|
bool wildcard = !strcmp(seat_config->name, "*");
|
||||||
|
struct sway_seat *seat = NULL;
|
||||||
|
wl_list_for_each(seat, &server.input->seats, link) {
|
||||||
|
if (wildcard || !strcmp(seat->wlr_seat->name, seat_config->name)) {
|
||||||
|
sway_cursor_constrain(seat->cursor, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmd_results_new(CMD_SUCCESS, NULL);
|
return cmd_results_new(CMD_SUCCESS, NULL);
|
||||||
}
|
}
|
|
@ -26,7 +26,7 @@ struct seat_config *new_seat_config(const char* name) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
seat->hide_cursor_timeout = -1;
|
seat->hide_cursor_timeout = -1;
|
||||||
seat->allow_constrain = true;
|
seat->allow_constrain = CONSTRAIN_DEFAULT;
|
||||||
|
|
||||||
return seat;
|
return seat;
|
||||||
}
|
}
|
||||||
|
@ -143,6 +143,10 @@ void merge_seat_config(struct seat_config *dest, struct seat_config *source) {
|
||||||
if (source->hide_cursor_timeout != -1) {
|
if (source->hide_cursor_timeout != -1) {
|
||||||
dest->hide_cursor_timeout = source->hide_cursor_timeout;
|
dest->hide_cursor_timeout = source->hide_cursor_timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (source->allow_constrain != CONSTRAIN_DEFAULT) {
|
||||||
|
dest->allow_constrain = source->allow_constrain;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct seat_config *copy_seat_config(struct seat_config *seat) {
|
struct seat_config *copy_seat_config(struct seat_config *seat) {
|
||||||
|
|
|
@ -1458,7 +1458,7 @@ void handle_pointer_constraint(struct wl_listener *listener, void *data) {
|
||||||
void sway_cursor_constrain(struct sway_cursor *cursor,
|
void sway_cursor_constrain(struct sway_cursor *cursor,
|
||||||
struct wlr_pointer_constraint_v1 *constraint) {
|
struct wlr_pointer_constraint_v1 *constraint) {
|
||||||
struct seat_config *config = seat_get_config(cursor->seat);
|
struct seat_config *config = seat_get_config(cursor->seat);
|
||||||
if (!config->allow_constrain) {
|
if (config->allow_constrain == CONSTRAIN_DISABLE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,6 @@ sway_sources = files(
|
||||||
'commands/nop.c',
|
'commands/nop.c',
|
||||||
'commands/output.c',
|
'commands/output.c',
|
||||||
'commands/popup_during_fullscreen.c',
|
'commands/popup_during_fullscreen.c',
|
||||||
'commands/pointer_constraint.c',
|
|
||||||
'commands/reload.c',
|
'commands/reload.c',
|
||||||
'commands/rename.c',
|
'commands/rename.c',
|
||||||
'commands/resize.c',
|
'commands/resize.c',
|
||||||
|
@ -85,6 +84,7 @@ sway_sources = files(
|
||||||
'commands/seat/cursor.c',
|
'commands/seat/cursor.c',
|
||||||
'commands/seat/fallback.c',
|
'commands/seat/fallback.c',
|
||||||
'commands/seat/hide_cursor.c',
|
'commands/seat/hide_cursor.c',
|
||||||
|
'commands/seat/pointer_constraint.c',
|
||||||
'commands/set.c',
|
'commands/set.c',
|
||||||
'commands/show_marks.c',
|
'commands/show_marks.c',
|
||||||
'commands/smart_borders.c',
|
'commands/smart_borders.c',
|
||||||
|
|
|
@ -172,6 +172,11 @@ in their own "seat").
|
||||||
disables hiding the cursor. The minimal timeout is 100 and any value less
|
disables hiding the cursor. The minimal timeout is 100 and any value less
|
||||||
than that (aside from 0), will be increased to 100.
|
than that (aside from 0), will be increased to 100.
|
||||||
|
|
||||||
|
*seat* <name> pointer_constraint enable|disable|escape
|
||||||
|
Enables or disables the ability for clients to capture the cursor (enabled
|
||||||
|
by default) for the seat. This is primarily useful for video games. The
|
||||||
|
"escape" command can be used at runtime to escape from a captured client.
|
||||||
|
|
||||||
# SEE ALSO
|
# SEE ALSO
|
||||||
|
|
||||||
*sway*(5) *sway-output*(5)
|
*sway*(5) *sway-output*(5)
|
||||||
|
|
|
@ -552,11 +552,6 @@ The default colors are:
|
||||||
\* may be used in lieu of a specific output name to configure all outputs.
|
\* may be used in lieu of a specific output name to configure all outputs.
|
||||||
A list of output names may be obtained via *swaymsg -t get_outputs*.
|
A list of output names may be obtained via *swaymsg -t get_outputs*.
|
||||||
|
|
||||||
*pointer_constraint* enable|disable|escape
|
|
||||||
Enables or disables the ability for clients to capture the cursor (enabled
|
|
||||||
by default). This is primarily useful for video games. The "escape" command
|
|
||||||
can be used at runtime to escape from a captured client.
|
|
||||||
|
|
||||||
*popup_during_fullscreen* smart|ignore|leave_fullscreen
|
*popup_during_fullscreen* smart|ignore|leave_fullscreen
|
||||||
Determines what to do when a fullscreen view opens a dialog.
|
Determines what to do when a fullscreen view opens a dialog.
|
||||||
If _smart_ (the default), the dialog will be displayed. If _ignore_, the
|
If _smart_ (the default), the dialog will be displayed. If _ignore_, the
|
||||||
|
|
Loading…
Reference in a new issue