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.6 by root, Sun Jan 22 20:39:47 2006 UTC vs.
Revision 1.13 by root, Tue Sep 4 22:41:12 2012 UTC

1#! perl 1#! perl
2
3=head1 NAME
4
5readline - improve readline editing (enabled by default)
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
2 33
3use POSIX (); 34use POSIX ();
4 35
5my $termios = new POSIX::Termios; 36my $termios = new POSIX::Termios;
6 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}
49
7sub on_button_press { 50sub on_button_press {
8 my ($self, $event) = @_; 51 my ($self, $event) = @_;
9 52
10 return
11 if $self->current_screen || $self->hidden_cursor; 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;
12 61
13 $termios->getattr ($self->pty_fd) 62 $termios->getattr ($self->pty_fd)
14 or return; 63 or return;
15 64
16 return
17 if $termios->getlflag & &POSIX::ICANON; 65 $termios->getlflag & &POSIX::ICANON
66 and return;
18 67
19 my ($row, $col) = $self->screen_cur; 68 my ($row, $col) = $self->screen_cur;
20 my $line = $self->line ($row); 69 my $line = $self->line ($row);
21 my $cur = $line->offset_of ($row, $col); 70 my $cur = $line->offset_of ($row, $col);
22 my $ofs = $line->offset_of ($event->{row}, $event->{col}); 71 my $ofs = $line->offset_of ($event->{row}, $event->{col});
23 72
24 if ($ofs >= 0 && $ofs < $line->l) { 73 $ofs >= 0 && $ofs < $line->l
25 my $diff = $ofs - $cur; 74 or return;
26 my $move;
27 75
28 if ($diff < 0) { 76 my $diff = $ofs - $cur;
29 ($ofs, $cur) = ($cur, $ofs); 77 my $move;
30 $move = "\x1b[D";
31 } else {
32 $move = "\x1b[C";
33 }
34 78
35 my $skipped = substr $line->t, $cur, $ofs - $cur; 79 if ($diff < 0) {
36 $skipped =~ s/\x{ffff}//g; 80 ($ofs, $cur) = ($cur, $ofs);
37 81 $move = "\x1b[D";
38 $self->tt_write ($move x length $skipped); 82 } else {
83 $move = "\x1b[C";
39 } 84 }
40 85
41 () 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
42} 92}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines