Restore pending input after reading the cursor position
This commit is contained in:
parent
a595d71cbd
commit
b9e5e65654
1 changed files with 35 additions and 16 deletions
51
gprompt.pl
51
gprompt.pl
|
@ -310,6 +310,35 @@ sub set_color
|
||||||
return tput_sequence( "seta$type $index" );
|
return tput_sequence( "seta$type $index" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub flush_term_and_read_pos($)
|
||||||
|
{
|
||||||
|
my $ttyIn = shift;
|
||||||
|
my ($input, $col, $line) = ("", "", "");
|
||||||
|
my @pending = ();
|
||||||
|
my $state = 0;
|
||||||
|
while (sysread $ttyIn, $input, 1) {
|
||||||
|
if ($state == 0) {
|
||||||
|
if ($input eq "\033") {
|
||||||
|
$state = 1;
|
||||||
|
} else {
|
||||||
|
push @pending, $input;
|
||||||
|
}
|
||||||
|
} elsif ($state == 1) {
|
||||||
|
$state = 2 if $input eq '[';
|
||||||
|
} elsif ($state == 2) {
|
||||||
|
if ($input eq ';') {
|
||||||
|
$state = 3;
|
||||||
|
} else {
|
||||||
|
$line .= $input;
|
||||||
|
}
|
||||||
|
} elsif ($state == 3) {
|
||||||
|
last if $input eq 'R';
|
||||||
|
$col .= $input;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $col, $line, @pending;
|
||||||
|
}
|
||||||
|
|
||||||
sub get_cursor_pos
|
sub get_cursor_pos
|
||||||
{
|
{
|
||||||
local $| = 1;
|
local $| = 1;
|
||||||
|
@ -327,23 +356,12 @@ sub get_cursor_pos
|
||||||
|
|
||||||
# Read position
|
# Read position
|
||||||
syswrite $ttyOut, "\033[6n", 4;
|
syswrite $ttyOut, "\033[6n", 4;
|
||||||
my ($input, $col, $line) = ("", "", "");
|
my ($col, $line, @pending) = flush_term_and_read_pos $ttyIn;
|
||||||
my $state = 0;
|
|
||||||
while (sysread $ttyIn, $input, 1) {
|
|
||||||
if ($state == 0) {
|
|
||||||
$state = 1 if $input eq '[';
|
|
||||||
} elsif ($state == 1) {
|
|
||||||
if ($input eq ';') {
|
|
||||||
$state = 2;
|
|
||||||
} else {
|
|
||||||
$line .= $input;
|
|
||||||
}
|
|
||||||
} elsif ($state == 2) {
|
|
||||||
last if $input eq 'R';
|
|
||||||
$col .= $input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# Restore input using TIOCSTI (0x5412)
|
||||||
|
foreach my $pByte (@pending) {
|
||||||
|
ioctl $ttyIn, 0x5412, $pByte;
|
||||||
|
}
|
||||||
# Enable cooked mode
|
# Enable cooked mode
|
||||||
$term->setlflag($oTerm);
|
$term->setlflag($oTerm);
|
||||||
$term->setcc(VTIME, 0);
|
$term->setcc(VTIME, 0);
|
||||||
|
@ -652,6 +670,7 @@ sub gen_empty_line
|
||||||
my $nl;
|
my $nl;
|
||||||
my $out = "";
|
my $out = "";
|
||||||
if ($lel > 1) {
|
if ($lel > 1) {
|
||||||
|
sleep 1;
|
||||||
my ($line, $col) = get_cursor_pos;
|
my ($line, $col) = get_cursor_pos;
|
||||||
$nl = ( $lel == 2 && $line != 1 ) || ( $lel == 3 && $col != 1 );
|
$nl = ( $lel == 2 && $line != 1 ) || ( $lel == 3 && $col != 1 );
|
||||||
if ( $lel == 3 && $col != 1 ) {
|
if ( $lel == 3 && $col != 1 ) {
|
||||||
|
|
Loading…
Reference in a new issue