aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/autocmd.txt2
-rw-r--r--src/nvim/os/signal.c24
-rw-r--r--test/functional/autocmd/signal_spec.lua6
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
@@ -54,6 +54,9 @@ void signal_init(void)
#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)
@@ -141,6 +153,10 @@ static char *signal_name(int signum)
case SIGUSR1:
return "SIGUSR1";
#endif
+#ifdef SIGWINCH
+ case SIGWINCH:
+ return "SIGWINCH";
+#endif
default:
return "Unknown";
}
@@ -198,6 +214,12 @@ static void on_signal(SignalWatcher *handle, int signum, void *data)
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);
break;
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())