ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/readline
Revision: 1.15
Committed: Sat Jul 24 09:48:43 2021 UTC (2 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rxvt-unicode-rel-9_29, rxvt-unicode-rel-9_30, HEAD
Changes since 1.14: +1 -1 lines
Log Message:
remove =over identation

File Contents

# Content
1 #! perl
2
3 =head1 NAME
4
5 readline - improve readline editing
6
7 =head1 DESCRIPTION
8
9 A support package that tries to make editing with readline easier. At
10 the moment, it reacts to clicking shift-left mouse button by trying to
11 move the text cursor to this position. It does so by generating as many
12 cursor-left or cursor-right keypresses as required (this only works
13 for programs that correctly support wide characters).
14
15 To avoid too many false positives, this is only done when:
16
17 =over
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
29 The normal selection mechanism isn't disabled, so quick successive clicks
30 might interfere with selection creation in harmless ways.
31
32 =cut
33
34 use POSIX ();
35
36 my $termios = new POSIX::Termios;
37
38 sub 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 }
49
50 sub on_button_press {
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;
67
68 my ($row, $col) = $self->screen_cur;
69 my $line = $self->line ($row);
70 my $cur = $line->offset_of ($row, $col);
71 my $ofs = $line->offset_of ($event->{row}, $event->{col});
72
73 $ofs >= 0 && $ofs < $line->l
74 or return;
75
76 my $diff = $ofs - $cur;
77 my $move;
78
79 if ($diff < 0) {
80 ($ofs, $cur) = ($cur, $ofs);
81 $move = "\x1b[D";
82 } else {
83 $move = "\x1b[C";
84 }
85
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
92 }