From: martin f. krafft Date: Sun, 19 Sep 2021 23:08:36 +0000 (+0200) Subject: Remove signal handlers on UNLOAD X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=a37d7e76409f619c03d9cc5467028ab6bd14a131;p=irssi-scripts.irssi.org.git Remove signal handlers on UNLOAD If the script is unloaded, we must remove all signal handlers, or else Irssi gets very unhappy. Signed-off-by: martin f. krafft --- diff --git a/scripts/print_signals.pl b/scripts/print_signals.pl index dadd9eb..29b3a4e 100644 --- a/scripts/print_signals.pl +++ b/scripts/print_signals.pl @@ -270,11 +270,23 @@ my $signals = <<_END; "gui textbuffer line removed", TEXTBUFFER_VIEW_REC *view, LINE_REC *line, LINE_REC *prev_line _END -foreach my $sigline (split(/\n/, $signals)) { - my ($sig, @args) = split(/, /, $sigline); - $sig =~ y/"//d; - Irssi::signal_add_first($sig, sub { - signal_handler($sig, \@args, \@_); - } - ); -}; +my %handlers = (); + +sub load { + foreach my $sigline (split(/\n/, $signals)) { + my ($sig, @args) = split(/, /, $sigline); + $sig =~ y/"//d; + my $handler = sub { signal_handler($sig, \@args, \@_); }; + Irssi::signal_add_first($sig, $handler); + $handlers{$sig} = $handler; + } +} + +sub UNLOAD { + while (my ($sig, $handler) = each %handlers) { + Irssi::signal_remove($sig, $handler); + } + %handlers = (); +} + +load();