Merge pull request #5324 from orestisfl/5323/mode-in-binding-event

Add "mode" field in binding event
This commit is contained in:
Orestis Floros 2022-12-14 14:24:05 +01:00 committed by GitHub
commit ed690c7ba0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 41 additions and 4 deletions

View File

@ -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)::

View File

@ -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

View File

@ -0,0 +1 @@
add "mode" field in binding event

View File

@ -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;

View File

@ -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);

View File

@ -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);
} }