]> Sergey Matveev's repositories - public-inbox.git/commitdiff
lei q: SIGWINCH process group with the terminal
authorEric Wong <e@80x24.org>
Mon, 8 Feb 2021 09:05:11 +0000 (23:05 -1000)
committerEric Wong <e@80x24.org>
Mon, 8 Feb 2021 22:07:42 +0000 (22:07 +0000)
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
lib/PublicInbox/LeiXSearch.pm
script/lei

index c36456989449e31739945c3ca5b8b073ca09a6f8..e95a674b16f59c30d4a29713c4d8e50150dce120 100644 (file)
@@ -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) = @_;
index 588df3a4b9db9934f1a7b075527bf0d40c1eff28..10485220a359976ebe6f88fad2ab3ce91c69eff0 100644 (file)
@@ -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");
index b7f21f1410fab4237054542cd2cdfbec72b0f8c1..0b0e2976435593d73dcd97a3cacce432679ddba6 100755 (executable)
@@ -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;