|
|
|
@ -336,6 +336,43 @@ static void handle_view_state_request(wlc_handle view, enum wlc_view_state_bit s
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool handle_bindsym(struct sway_binding *binding) {
|
|
|
|
|
bool match = false;
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < binding->keys->length; ++i) {
|
|
|
|
|
xkb_keysym_t *key = binding->keys->items[i];
|
|
|
|
|
if ((match = check_key(*key, 0)) == false) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (match) {
|
|
|
|
|
struct cmd_results *res = handle_command(binding->command);
|
|
|
|
|
if (res->status != CMD_SUCCESS) {
|
|
|
|
|
sway_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error);
|
|
|
|
|
}
|
|
|
|
|
free_cmd_results(res);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool handle_bindsym_release(struct sway_binding *binding) {
|
|
|
|
|
if (binding->keys->length == 1) {
|
|
|
|
|
xkb_keysym_t *key = binding->keys->items[0];
|
|
|
|
|
if (check_released_key(*key)) {
|
|
|
|
|
struct cmd_results *res = handle_command(binding->command);
|
|
|
|
|
if (res->status != CMD_SUCCESS) {
|
|
|
|
|
sway_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error);
|
|
|
|
|
}
|
|
|
|
|
free_cmd_results(res);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifiers *modifiers,
|
|
|
|
|
uint32_t key, enum wlc_key_state state) {
|
|
|
|
@ -366,33 +403,6 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier
|
|
|
|
|
release_key(sym, key);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < mode->bindings->length; ++i) {
|
|
|
|
|
struct sway_binding *binding = mode->bindings->items[i];
|
|
|
|
|
|
|
|
|
|
if ((modifiers->mods ^ binding->modifiers) == 0) {
|
|
|
|
|
bool match = false;
|
|
|
|
|
int j;
|
|
|
|
|
for (j = 0; j < binding->keys->length; ++j) {
|
|
|
|
|
xkb_keysym_t *key = binding->keys->items[j];
|
|
|
|
|
if ((match = check_key(*key, 0)) == false) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (match) {
|
|
|
|
|
if (state == WLC_KEY_STATE_PRESSED) {
|
|
|
|
|
struct cmd_results *res = handle_command(binding->command);
|
|
|
|
|
if (res->status != CMD_SUCCESS) {
|
|
|
|
|
sway_log(L_ERROR, "Command '%s' failed: %s", res->input, res->error);
|
|
|
|
|
}
|
|
|
|
|
free_cmd_results(res);
|
|
|
|
|
return EVENT_HANDLED;
|
|
|
|
|
} else if (state == WLC_KEY_STATE_RELEASED) {
|
|
|
|
|
// TODO: --released
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// handle bar modifiers pressed/released
|
|
|
|
|
uint32_t modifier;
|
|
|
|
|
for (i = 0; i < config->active_bar_modifiers->length; ++i) {
|
|
|
|
@ -409,6 +419,27 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier
|
|
|
|
|
}
|
|
|
|
|
// update modifiers state
|
|
|
|
|
modifiers_state_update(modifiers->mods);
|
|
|
|
|
|
|
|
|
|
// handle bindings
|
|
|
|
|
for (i = 0; i < mode->bindings->length; ++i) {
|
|
|
|
|
struct sway_binding *binding = mode->bindings->items[i];
|
|
|
|
|
if ((modifiers->mods ^ binding->modifiers) == 0) {
|
|
|
|
|
switch (state) {
|
|
|
|
|
case WLC_KEY_STATE_PRESSED: {
|
|
|
|
|
if (!binding->release && handle_bindsym(binding)) {
|
|
|
|
|
return EVENT_HANDLED;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case WLC_KEY_STATE_RELEASED:
|
|
|
|
|
if (binding->release && handle_bindsym_release(binding)) {
|
|
|
|
|
return EVENT_HANDLED;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return EVENT_PASSTHROUGH;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|