From 80ba871c557eb5ba79c73150519ce9ea5225d695 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 7 Feb 2021 23:05:11 -1000 Subject: [PATCH] lei q: SIGWINCH process group with the terminal While using utime on the destination Maildir is enough for mutt to eventually notice new mail, "eventually" isn't good enough. Send a SIGWINCH to wake mutt (and likely other MUAs) immediately. This is more portable than relying on MUAs to support inotify or EVFILT_VNODE. --- lib/PublicInbox/LEI.pm | 11 +++++++++++ lib/PublicInbox/LeiXSearch.pm | 7 ++++++- script/lei | 8 +++++--- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index c3645698..e95a674b 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -746,6 +746,17 @@ sub start_mua { } } +sub poke_mua { # forces terminal MUAs to wake up and hopefully notice new mail + my ($self) = @_; + return unless $self->{opt}->{mua} && -t $self->{1}; + # hit the process group that started the MUA + if (my $s = $self->{sock}) { + send($s, '-WINCH', MSG_EOR); + } elsif ($self->{oneshot}) { + kill('-WINCH', $$); + } +} + # caller needs to "-t $self->{1}" to check if tty sub start_pager { my ($self) = @_; diff --git a/lib/PublicInbox/LeiXSearch.pm b/lib/PublicInbox/LeiXSearch.pm index 588df3a4..10485220 100644 --- a/lib/PublicInbox/LeiXSearch.pm +++ b/lib/PublicInbox/LeiXSearch.pm @@ -317,7 +317,12 @@ Error closing $lei->{ovv}->{dst}: $! } $lei->{1} = $out; } - $l2m->lock_free ? $l2m->poke_dst : $lei->start_mua; + if ($l2m->lock_free) { + $l2m->poke_dst; + $lei->poke_mua; + } else { # mbox users + $lei->start_mua; + } } $lei->{-progress} and $lei->err('# ', $lei->{-mset_total} // 0, " matches"); diff --git a/script/lei b/script/lei index b7f21f14..0b0e2976 100755 --- a/script/lei +++ b/script/lei @@ -105,13 +105,15 @@ Falling back to (slow) one-shot mode die "recvmsg: $!"; } last if $buf eq ''; - if ($buf =~ /\Ax_it ([0-9]+)\z/) { + if ($buf =~ /\Aexec (.+)\z/) { + $exec_cmd->(\@fds, split(/\0/, $1)); + } elsif ($buf eq '-WINCH') { + kill($buf, $$); # for MUA + } elsif ($buf =~ /\Ax_it ([0-9]+)\z/) { $x_it_code = $1 + 0; last; } elsif ($buf =~ /\Achild_error ([0-9]+)\z/) { $x_it_code = $1 + 0; - } elsif ($buf =~ /\Aexec (.+)\z/) { - $exec_cmd->(\@fds, split(/\0/, $1)); } else { $sigchld->(); die $buf; -- 2.44.0