diff options
| author | emersion <contact@emersion.fr> | 2018-08-02 08:11:10 +0100 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-08-02 08:11:10 +0100 | 
| commit | 47bf4ed0cbf104d09bba7f39acbf2ceb84c2c694 (patch) | |
| tree | 8f0085c1829ab97a920acd9d5116732779177631 /sway/commands/bind.c | |
| parent | d10ccc1eb144e4de2477398f6b11753f6b7df70b (diff) | |
| parent | 9564c73c0ddca9d7b45f0476fcaee8bd878d8345 (diff) | |
| download | sway-47bf4ed0cbf104d09bba7f39acbf2ceb84c2c694.tar.xz | |
Merge branch 'master' into fix-resize-wiggle
Diffstat (limited to 'sway/commands/bind.c')
| -rw-r--r-- | sway/commands/bind.c | 52 | 
1 files changed, 51 insertions, 1 deletions
| diff --git a/sway/commands/bind.c b/sway/commands/bind.c index 133fd089..8270b958 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c @@ -1,3 +1,4 @@ +#define _XOPEN_SOURCE 500  #ifdef __linux__  #include <linux/input-event-codes.h>  #elif __FreeBSD__ @@ -5,9 +6,11 @@  #endif  #include <xkbcommon/xkbcommon.h>  #include <xkbcommon/xkbcommon-names.h> +#include <string.h>  #include <strings.h>  #include "sway/commands.h"  #include "sway/config.h" +#include "sway/ipc-server.h"  #include "list.h"  #include "log.h"  #include "stringop.h" @@ -27,6 +30,33 @@ void free_sway_binding(struct sway_binding *binding) {  	free(binding);  } +static struct sway_binding *sway_binding_dup(struct sway_binding *sb) { +	struct sway_binding *new_sb = calloc(1, sizeof(struct sway_binding)); +	if (!new_sb) { +		return NULL; +	} + +	new_sb->type = sb->type; +	new_sb->order = sb->order; +	new_sb->flags = sb->flags; +	new_sb->modifiers = sb->modifiers; +	new_sb->command = strdup(sb->command); + +	new_sb->keys = create_list(); +	int i; +	for (i = 0; i < sb->keys->length; ++i) { +		xkb_keysym_t *key = malloc(sizeof(xkb_keysym_t)); +		if (!key) { +			free_sway_binding(new_sb); +			return NULL; +		} +		*key = *(xkb_keysym_t *)sb->keys->items[i]; +		list_add(new_sb->keys, key); +	} + +	return new_sb; +} +  /**   * Returns true if the bindings have the same key and modifier combinations.   * Note that keyboard layout is not considered, so the bindings might actually @@ -275,11 +305,31 @@ struct cmd_results *cmd_bindcode(int argc, char **argv) {  void seat_execute_command(struct sway_seat *seat, struct sway_binding *binding) {  	wlr_log(WLR_DEBUG, "running command for binding: %s",  		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 (strcasecmp(binding->command, "reload") == 0) { +		reload = true; +		binding_copy = sway_binding_dup(binding); +		if (!binding_copy) { +			wlr_log(WLR_ERROR, "Failed to duplicate binding during reload"); +			return; +		} +	} +  	config->handler_context.seat = seat;  	struct cmd_results *results = execute_command(binding->command, NULL); -	if (results->status != CMD_SUCCESS) { +	if (results->status == CMD_SUCCESS) { +		ipc_event_binding(binding_copy); +	} else {  		wlr_log(WLR_DEBUG, "could not run command for binding: %s (%s)",  			binding->command, results->error);  	} + +	if (reload) { // free the binding if we made a copy +		free_sway_binding(binding_copy); +	}  	free_cmd_results(results);  } | 
