ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/readline
(Generate patch)

Comparing rxvt-unicode/src/perl/readline (file contents):
Revision 1.1 by root, Fri Jan 20 22:05:41 2006 UTC vs.
Revision 1.14 by root, Wed Jun 23 12:45:30 2021 UTC

1#! perl 1#! perl
2
3=head1 NAME
4
5readline - improve readline editing
6
7=head1 DESCRIPTION
8
9A support package that tries to make editing with readline easier. At
10the moment, it reacts to clicking shift-left mouse button by trying to
11move the text cursor to this position. It does so by generating as many
12cursor-left or cursor-right keypresses as required (this only works
13for programs that correctly support wide characters).
14
15To avoid too many false positives, this is only done when:
16
17=over 4
18
19=item - the tty is in ICANON state.
20
21=item - the text cursor is visible.
22
23=item - the primary screen is currently being displayed.
24
25=item - the mouse is on the same (multi-row-) line as the text cursor.
26
27=back
28
29The normal selection mechanism isn't disabled, so quick successive clicks
30might interfere with selection creation in harmless ways.
31
32=cut
33
34use POSIX ();
35
36my $termios = new POSIX::Termios;
37
38sub on_init {
39 my ($self) = @_;
40
41 $self->{enabled} = 1;
42
43 push @{ $self->{term}{option_popup_hook} }, sub {
44 ("readline" => $self->{enabled}, sub { $self->{enabled} = shift })
45 };
46
47 ()
48}
2 49
3sub on_button_press { 50sub on_button_press {
4 my ($self, $event) = @_; 51 my ($self, $event) = @_;
52
53 $self->current_screen || $self->hidden_cursor || !$self->{enabled}
54 and return;
55
56 my $mask = $self->ModLevel3Mask | $self->ModMetaMask
57 | urxvt::ShiftMask | urxvt::ControlMask;
58
59 ($event->{state} & $mask) == urxvt::ShiftMask
60 or return;
61
62 $termios->getattr ($self->pty_fd)
63 or return;
64
65 $termios->getlflag & &POSIX::ICANON
66 and return;
5 67
6 my ($row, $col) = $self->screen_cur; 68 my ($row, $col) = $self->screen_cur;
7 my $line = $self->line ($row); 69 my $line = $self->line ($row);
8 my $cur = $line->offset_of ($row, $col); 70 my $cur = $line->offset_of ($row, $col);
9 my $ofs = $line->offset_of ($event->{row}, $event->{col}); 71 my $ofs = $line->offset_of ($event->{row}, $event->{col});
10 72
11 if ($ofs >= 0 && $ofs < $line->l) { 73 $ofs >= 0 && $ofs < $line->l
12 my $diff = $ofs - $cur; 74 or return;
13 75
14 $self->tt_write ($diff < 0 ? "\x1b[D" x -$diff 76 my $diff = $ofs - $cur;
15 : "\x1b[C" x $diff); 77 my $move;
16 78
17 return 1; 79 if ($diff < 0) {
80 ($ofs, $cur) = ($cur, $ofs);
81 $move = "\x1b[D";
82 } else {
83 $move = "\x1b[C";
18 } 84 }
19 85
20 () 86 my $skipped = substr $line->t, $cur, $ofs - $cur;
87 $skipped =~ s/\x{ffff}//g;
88
89 $self->tt_write ($move x length $skipped);
90
91 1
21} 92}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines