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:
Brian Ashworth 2019-01-31 22:58:52 -05:00
parent 204e1f4712
commit ebe5399ed6
10 changed files with 36 additions and 19 deletions

View file

@ -81,7 +81,6 @@ static struct cmd_handler handlers[] = {
{ "no_focus", cmd_no_focus },
{ "output", cmd_output },
{ "popup_during_fullscreen", cmd_popup_during_fullscreen },
{ "pointer_constraint", cmd_pointer_constraint },
{ "seat", cmd_seat },
{ "set", cmd_set },
{ "show_marks", cmd_show_marks },

View file

@ -11,6 +11,7 @@ static struct cmd_handler seat_handlers[] = {
{ "cursor", seat_cmd_cursor },
{ "fallback", seat_cmd_fallback },
{ "hide_cursor", seat_cmd_hide_cursor },
{ "pointer_constraint", seat_cmd_pointer_constraint },
};
struct cmd_results *cmd_seat(int argc, char **argv) {

View file

@ -12,11 +12,14 @@ enum operation {
};
// 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;
if ((error = checkarg(argc, "pointer_constraint", EXPECTED_EQUAL_TO, 1))) {
return error;
}
if (!config->handler_context.seat_config) {
return cmd_results_new(CMD_FAILURE, "No seat defined");
}
enum operation op;
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.");
}
struct sway_cursor *cursor = config->handler_context.seat->cursor;
struct seat_config *seat_config = seat_get_config(cursor->seat);
struct seat_config *seat_config = config->handler_context.seat_config;
switch (op) {
case OP_ENABLE:
seat_config->allow_constrain = true;
seat_config->allow_constrain = CONSTRAIN_ENABLE;
break;
case OP_DISABLE:
seat_config->allow_constrain = false;
seat_config->allow_constrain = CONSTRAIN_DISABLE;
/* fallthrough */
case OP_ESCAPE:
sway_cursor_constrain(cursor, NULL);
case OP_ESCAPE:;
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;
}
return cmd_results_new(CMD_SUCCESS, NULL);
}

View file

@ -26,7 +26,7 @@ struct seat_config *new_seat_config(const char* name) {
return NULL;
}
seat->hide_cursor_timeout = -1;
seat->allow_constrain = true;
seat->allow_constrain = CONSTRAIN_DEFAULT;
return seat;
}
@ -143,6 +143,10 @@ void merge_seat_config(struct seat_config *dest, struct seat_config *source) {
if (source->hide_cursor_timeout != -1) {
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) {

View file

@ -1458,7 +1458,7 @@ void handle_pointer_constraint(struct wl_listener *listener, void *data) {
void sway_cursor_constrain(struct sway_cursor *cursor,
struct wlr_pointer_constraint_v1 *constraint) {
struct seat_config *config = seat_get_config(cursor->seat);
if (!config->allow_constrain) {
if (config->allow_constrain == CONSTRAIN_DISABLE) {
return;
}

View file

@ -75,7 +75,6 @@ sway_sources = files(
'commands/nop.c',
'commands/output.c',
'commands/popup_during_fullscreen.c',
'commands/pointer_constraint.c',
'commands/reload.c',
'commands/rename.c',
'commands/resize.c',
@ -85,6 +84,7 @@ sway_sources = files(
'commands/seat/cursor.c',
'commands/seat/fallback.c',
'commands/seat/hide_cursor.c',
'commands/seat/pointer_constraint.c',
'commands/set.c',
'commands/show_marks.c',
'commands/smart_borders.c',

View file

@ -172,6 +172,11 @@ in their own "seat").
disables hiding the cursor. The minimal timeout is 100 and any value less
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
*sway*(5) *sway-output*(5)

View file

@ -552,11 +552,6 @@ The default colors are:
\* 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*.
*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
Determines what to do when a fullscreen view opens a dialog.
If _smart_ (the default), the dialog will be displayed. If _ignore_, the