diff --git a/include/sway/config.h b/include/sway/config.h index 4ee8c3c28..6024f0f60 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -31,10 +31,11 @@ enum binding_input_type { enum binding_flags { BINDING_RELEASE=1, - BINDING_LOCKED=2, // keyboard only - BINDING_BORDER=4, // mouse only; trigger on container border - BINDING_CONTENTS=8, // mouse only; trigger on container contents - BINDING_TITLEBAR=16 // mouse only; trigger on container titlebar + BINDING_LOCKED=2, // keyboard only + BINDING_BORDER=4, // mouse only; trigger on container border + BINDING_CONTENTS=8, // mouse only; trigger on container contents + BINDING_TITLEBAR=16, // mouse only; trigger on container titlebar + BINDING_RELOAD=32, // the binding runs the reload command }; /** diff --git a/sway/commands/bind.c b/sway/commands/bind.c index b134c92f9..5b56ba309 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -214,6 +214,9 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, } binding->command = join_args(argv + 1, argc - 1); + if (strcasestr(binding->command, "reload")) { + binding->flags |= BINDING_RELOAD; + } list_t *split = split_string(argv[0], "+"); for (int i = 0; i < split->length; ++i) { @@ -307,11 +310,9 @@ void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding) binding->command); struct sway_binding *binding_copy = binding; - bool reload = false; // if this is a reload command we need to make a duplicate of the // binding since it will be gone after the reload has completed. - if (strcasestr(binding->command, "reload")) { - reload = true; + if (binding->flags & BINDING_RELOAD) { binding_copy = sway_binding_dup(binding); if (!binding_copy) { wlr_log(WLR_ERROR, "Failed to duplicate binding during reload"); @@ -328,7 +329,7 @@ void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding) binding->command, results->error); } - if (reload) { // free the binding if we made a copy + if (binding->flags & BINDING_RELOAD) { // free the binding if we made a copy free_sway_binding(binding_copy); } free_cmd_results(results); diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 160ef10b9..0d2a62b52 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -280,7 +280,10 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { if (binding_pressed) { seat_execute_command(seat, binding_pressed); handled = true; - next_repeat_binding = binding_pressed; + + if ((binding_pressed->flags & BINDING_RELOAD) == 0) { + next_repeat_binding = binding_pressed; + } } }