X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fbindings.c;h=8f9767e69943e26a6df3b9cb091cfd38e5f47bf6;hb=dd5be77d1dcc7e7eb40ce1c33f985816fc0b8f79;hp=cd91a3989c452c4d45189f474c39ea8994507b53;hpb=c937f768f92b74dfa662b174cf6e6fc6f4871234;p=i3%2Fi3 diff --git a/src/bindings.c b/src/bindings.c index cd91a398..8f9767e6 100644 --- a/src/bindings.c +++ b/src/bindings.c @@ -49,10 +49,11 @@ static struct Mode *mode_from_name(const char *name) { * */ Binding *configure_binding(const char *bindtype, const char *modifiers, const char *input_code, - const char *release, const char *command, const char *modename) { + const char *release, const char *whole_window, const char *command, const char *modename) { Binding *new_binding = scalloc(sizeof(Binding)); DLOG("bindtype %s, modifiers %s, input code %s, release %s\n", bindtype, modifiers, input_code, release); new_binding->release = (release != NULL ? B_UPON_KEYRELEASE : B_UPON_KEYPRESS); + new_binding->whole_window = (whole_window != NULL); if (strcmp(bindtype, "bindsym") == 0) { new_binding->input_type = (strncasecmp(input_code, "button", (sizeof("button") - 1)) == 0 ? B_MOUSE @@ -380,6 +381,37 @@ void check_for_duplicate_bindings(struct context *context) { } } +/* + * Creates a dynamically allocated copy of bind. + */ +static Binding *binding_copy(Binding *bind) { + Binding *ret = smalloc(sizeof(Binding)); + *ret = *bind; + if (bind->symbol != NULL) + ret->symbol = strdup(bind->symbol); + if (bind->command != NULL) + ret->command = strdup(bind->command); + if (bind->translated_to != NULL) { + ret->translated_to = smalloc(sizeof(xcb_keycode_t) * bind->number_keycodes); + memcpy(ret->translated_to, bind->translated_to, sizeof(xcb_keycode_t) * bind->number_keycodes); + } + return ret; +} + +/* + * Frees the binding. If bind is null, it simply returns. + */ +void binding_free(Binding *bind) { + if (bind == NULL) { + return; + } + + FREE(bind->symbol); + FREE(bind->translated_to); + FREE(bind->command); + FREE(bind); +} + /* * Runs the given binding and handles parse errors. If con is passed, it will * execute the command binding with that container selected by criteria. @@ -390,14 +422,15 @@ void check_for_duplicate_bindings(struct context *context) { CommandResult *run_binding(Binding *bind, Con *con) { char *command; - /* We need to copy the command since “reload” may be part of the command, - * and then the memory that bind->command points to may not contain the + /* We need to copy the binding and command since “reload” may be part of + * the command, and then the memory that bind points to may not contain the * same data anymore. */ if (con == NULL) command = sstrdup(bind->command); else sasprintf(&command, "[con_id=\"%d\"] %s", con, bind->command); + Binding *bind_cp = binding_copy(bind); CommandResult *result = parse_command(command, NULL); free(command); @@ -423,7 +456,8 @@ CommandResult *run_binding(Binding *bind, Con *con) { free(pageraction); } - /* TODO: emit event for running a binding */ + ipc_send_binding_event("run", bind_cp); + binding_free(bind_cp); return result; }