Add "mode" field in binding event
This does *not* go in the binding object to reflect the same hierarchy of the config file: a mode is a collection of bindings. Fixes #5323
This commit is contained in:
parent
1786b13f0d
commit
d5c8319b6c
2
docs/ipc
2
docs/ipc
@ -1099,6 +1099,8 @@ binding that ran a command because of user input. The +change (string)+ field
|
|||||||
indicates what sort of binding event was triggered (right now it will always be
|
indicates what sort of binding event was triggered (right now it will always be
|
||||||
+"run"+ but may be expanded in the future).
|
+"run"+ but may be expanded in the future).
|
||||||
|
|
||||||
|
The +mode (string)+ field contains the name of the mode the binding was run in.
|
||||||
|
|
||||||
The +binding (object)+ field contains details about the binding that was run:
|
The +binding (object)+ field contains details about the binding that was run:
|
||||||
|
|
||||||
command (string)::
|
command (string)::
|
||||||
|
@ -133,7 +133,7 @@ void ipc_send_barconfig_update_event(Barconfig *barconfig);
|
|||||||
/**
|
/**
|
||||||
* For the binding events, we send the serialized binding struct.
|
* For the binding events, we send the serialized binding struct.
|
||||||
*/
|
*/
|
||||||
void ipc_send_binding_event(const char *event_type, Binding *bind);
|
void ipc_send_binding_event(const char *event_type, Binding *bind, const char *modename);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the maximum duration that we allow for a connection with an unwriteable
|
* Set the maximum duration that we allow for a connection with an unwriteable
|
||||||
|
1
release-notes/changes/4-mode-in-binding-event
Normal file
1
release-notes/changes/4-mode-in-binding-event
Normal file
@ -0,0 +1 @@
|
|||||||
|
add "mode" field in binding event
|
@ -843,6 +843,10 @@ CommandResult *run_binding(Binding *bind, Con *con) {
|
|||||||
sasprintf(&command, "[con_id=\"%p\"] %s", con, bind->command);
|
sasprintf(&command, "[con_id=\"%p\"] %s", con, bind->command);
|
||||||
|
|
||||||
Binding *bind_cp = binding_copy(bind);
|
Binding *bind_cp = binding_copy(bind);
|
||||||
|
/* The "mode" command might change the current mode, so back it up to
|
||||||
|
* correctly produce an event later. */
|
||||||
|
const char *modename = current_binding_mode;
|
||||||
|
|
||||||
CommandResult *result = parse_command(command, NULL, NULL);
|
CommandResult *result = parse_command(command, NULL, NULL);
|
||||||
free(command);
|
free(command);
|
||||||
|
|
||||||
@ -868,7 +872,7 @@ CommandResult *run_binding(Binding *bind, Con *con) {
|
|||||||
free(pageraction);
|
free(pageraction);
|
||||||
}
|
}
|
||||||
|
|
||||||
ipc_send_binding_event("run", bind_cp);
|
ipc_send_binding_event("run", bind_cp, modename);
|
||||||
binding_free(bind_cp);
|
binding_free(bind_cp);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -1678,7 +1678,7 @@ void ipc_send_barconfig_update_event(Barconfig *barconfig) {
|
|||||||
/*
|
/*
|
||||||
* For the binding events, we send the serialized binding struct.
|
* For the binding events, we send the serialized binding struct.
|
||||||
*/
|
*/
|
||||||
void ipc_send_binding_event(const char *event_type, Binding *bind) {
|
void ipc_send_binding_event(const char *event_type, Binding *bind, const char *modename) {
|
||||||
DLOG("Issue IPC binding %s event (sym = %s, code = %d)\n", event_type, bind->symbol, bind->keycode);
|
DLOG("Issue IPC binding %s event (sym = %s, code = %d)\n", event_type, bind->symbol, bind->keycode);
|
||||||
|
|
||||||
setlocale(LC_NUMERIC, "C");
|
setlocale(LC_NUMERIC, "C");
|
||||||
@ -1690,6 +1690,13 @@ void ipc_send_binding_event(const char *event_type, Binding *bind) {
|
|||||||
ystr("change");
|
ystr("change");
|
||||||
ystr(event_type);
|
ystr(event_type);
|
||||||
|
|
||||||
|
ystr("mode");
|
||||||
|
if (modename == NULL) {
|
||||||
|
ystr("default");
|
||||||
|
} else {
|
||||||
|
ystr(modename);
|
||||||
|
}
|
||||||
|
|
||||||
ystr("binding");
|
ystr("binding");
|
||||||
dump_binding(gen, bind);
|
dump_binding(gen, bind);
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#
|
#
|
||||||
# Test that the binding event works properly
|
# Test that the binding event works properly
|
||||||
# Ticket: #1210
|
# Ticket: #1210
|
||||||
|
# Ticket: #5323
|
||||||
use i3test i3_autostart => 0;
|
use i3test i3_autostart => 0;
|
||||||
|
|
||||||
my $keysym = 't';
|
my $keysym = 't';
|
||||||
@ -28,6 +29,12 @@ my $config = <<EOT;
|
|||||||
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
|
||||||
bindsym $binding_symbol $command
|
bindsym $binding_symbol $command
|
||||||
|
|
||||||
|
bindsym m mode some-mode
|
||||||
|
mode some-mode {
|
||||||
|
bindsym a nop
|
||||||
|
bindsym b mode default
|
||||||
|
}
|
||||||
EOT
|
EOT
|
||||||
|
|
||||||
SKIP: {
|
SKIP: {
|
||||||
@ -46,12 +53,13 @@ SKIP: {
|
|||||||
qx(xdotool key $binding_symbol);
|
qx(xdotool key $binding_symbol);
|
||||||
},
|
},
|
||||||
'binding');
|
'binding');
|
||||||
|
|
||||||
is(scalar @events, 1, 'Received 1 event');
|
is(scalar @events, 1, 'Received 1 event');
|
||||||
|
|
||||||
is($events[0]->{change}, 'run',
|
is($events[0]->{change}, 'run',
|
||||||
'the `change` field should indicate this binding has run');
|
'the `change` field should indicate this binding has run');
|
||||||
|
|
||||||
|
is($events[0]->{mode}, 'default', 'the `mode` field should be "default"');
|
||||||
|
|
||||||
ok($events[0]->{binding},
|
ok($events[0]->{binding},
|
||||||
'the `binding` field should be a hash that contains information about the binding');
|
'the `binding` field should be a hash that contains information about the binding');
|
||||||
|
|
||||||
@ -69,6 +77,21 @@ SKIP: {
|
|||||||
is($events[0]->{binding}->{input_code}, 0,
|
is($events[0]->{binding}->{input_code}, 0,
|
||||||
'the input_code should be the specified code if the key was bound with bindcode, and otherwise zero');
|
'the input_code should be the specified code if the key was bound with bindcode, and otherwise zero');
|
||||||
|
|
||||||
|
# Test that the mode field is correct
|
||||||
|
# See #5323.
|
||||||
|
@events = events_for(
|
||||||
|
sub {
|
||||||
|
qx(xdotool key m);
|
||||||
|
qx(xdotool key a);
|
||||||
|
qx(xdotool key b);
|
||||||
|
},
|
||||||
|
'binding');
|
||||||
|
is(scalar @events, 3, 'Received 3 events');
|
||||||
|
|
||||||
|
is($events[0]->{mode}, 'default', 'Event for binding to enter new mode is atributed to default mode');
|
||||||
|
is($events[1]->{mode}, 'some-mode', 'Event for binding while in mode is attributed to the non-default mode');
|
||||||
|
is($events[2]->{mode}, 'some-mode', 'Event for binding exiting mode is attributed to the non-default mode');
|
||||||
|
|
||||||
exit_gracefully($pid);
|
exit_gracefully($pid);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user