From b2cb05b53e61d162044f71227e0ffeacbf59a4bb Mon Sep 17 00:00:00 2001 From: Loong Wang Date: Mon, 11 Apr 2022 06:56:08 +0800 Subject: [PATCH] feat(events): support SIGWINCH for Signal event #18029 closes #15411 --- runtime/doc/autocmd.txt | 2 +- src/nvim/os/signal.c | 24 +++++++++++++++++++++++- test/functional/autocmd/signal_spec.lua | 6 ++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index 7cfac4b5d1..e3cd28e353 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -870,7 +870,7 @@ ShellCmdPost After executing a shell command with |:!cmd|, *Signal* Signal After Nvim receives a signal. The pattern is matched against the signal name. Only - "SIGUSR1" is supported. Example: > + "SIGUSR1" and "SIGWINCH" are supported. Example: > autocmd Signal SIGUSR1 call some#func() < *ShellFilterPost* ShellFilterPost After executing a shell command with diff --git a/src/nvim/os/signal.c b/src/nvim/os/signal.c index 327ab6bc48..79e042b8a5 100644 --- a/src/nvim/os/signal.c +++ b/src/nvim/os/signal.c @@ -21,7 +21,7 @@ #include "nvim/os/signal.h" #include "nvim/vim.h" -static SignalWatcher spipe, shup, squit, sterm, susr1; +static SignalWatcher spipe, shup, squit, sterm, susr1, swinch; #ifdef SIGPWR static SignalWatcher spwr; #endif @@ -53,6 +53,9 @@ void signal_init(void) #endif #ifdef SIGUSR1 signal_watcher_init(&main_loop, &susr1, NULL); +#endif +#ifdef SIGWINCH + signal_watcher_init(&main_loop, &swinch, NULL); #endif signal_start(); } @@ -70,6 +73,9 @@ void signal_teardown(void) #ifdef SIGUSR1 signal_watcher_close(&susr1, NULL); #endif +#ifdef SIGWINCH + signal_watcher_close(&swinch, NULL); +#endif } void signal_start(void) @@ -88,6 +94,9 @@ void signal_start(void) #ifdef SIGUSR1 signal_watcher_start(&susr1, on_signal, SIGUSR1); #endif +#ifdef SIGWINCH + signal_watcher_start(&swinch, on_signal, SIGWINCH); +#endif } void signal_stop(void) @@ -106,6 +115,9 @@ void signal_stop(void) #ifdef SIGUSR1 signal_watcher_stop(&susr1); #endif +#ifdef SIGWINCH + signal_watcher_stop(&swinch); +#endif } void signal_reject_deadly(void) @@ -140,6 +152,10 @@ static char *signal_name(int signum) #ifdef SIGUSR1 case SIGUSR1: return "SIGUSR1"; +#endif +#ifdef SIGWINCH + case SIGWINCH: + return "SIGWINCH"; #endif default: return "Unknown"; @@ -197,6 +213,12 @@ static void on_signal(SignalWatcher *handle, int signum, void *data) apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGUSR1", curbuf->b_fname, true, curbuf); break; +#endif +#ifdef SIGWINCH + case SIGWINCH: + apply_autocmds(EVENT_SIGNAL, (char_u *)"SIGWINCH", curbuf->b_fname, true, + curbuf); + break; #endif default: ELOG("invalid signal: %d", signum); diff --git a/test/functional/autocmd/signal_spec.lua b/test/functional/autocmd/signal_spec.lua index 719adeaf1b..d4f65cc61d 100644 --- a/test/functional/autocmd/signal_spec.lua +++ b/test/functional/autocmd/signal_spec.lua @@ -30,6 +30,12 @@ describe('autocmd Signal', function() eq({'notification', 'foo', {}}, next_msg()) end) + it('matches SIGWINCH', function() + command('autocmd Signal SIGWINCH call rpcnotify(1, "foo")') + posix_kill('WINCH', funcs.getpid()) + eq({'notification', 'foo', {}}, next_msg()) + end) + it('does not match unknown patterns', function() command('autocmd Signal SIGUSR2 call rpcnotify(1, "foo")') posix_kill('USR1', funcs.getpid())