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.8 by root, Sun Feb 12 05:31:53 2006 UTC vs.
Revision 1.12 by root, Sun Jun 10 17:31:53 2012 UTC

1#! perl 1#! perl
2
3=head1 NAME
4
5 readline - 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
22 $self->current_screen || $self->hidden_cursor || !$self->{enabled} 53 $self->current_screen || $self->hidden_cursor || !$self->{enabled}
23 and return; 54 and return;
24 55
25 my $mask = $self->ModLevel3Mask | $self->ModMetaMask 56 my $mask = $self->ModLevel3Mask | $self->ModMetaMask
26 | urxvt::ShiftMask | urxvt::ControlMask; 57 | urxvt::ShiftMask | urxvt::ControlMask;
27 58
28 ($event->{state} & $mask) == urxvt::ShiftMask 59 ($event->{state} & $mask) == urxvt::ShiftMask
29 or return; 60 or return;
30 61
31 $termios->getattr ($self->pty_fd) 62 $termios->getattr ($self->pty_fd)
32 or return; 63 or return;
37 my ($row, $col) = $self->screen_cur; 68 my ($row, $col) = $self->screen_cur;
38 my $line = $self->line ($row); 69 my $line = $self->line ($row);
39 my $cur = $line->offset_of ($row, $col); 70 my $cur = $line->offset_of ($row, $col);
40 my $ofs = $line->offset_of ($event->{row}, $event->{col}); 71 my $ofs = $line->offset_of ($event->{row}, $event->{col});
41 72
42 if ($ofs >= 0 && $ofs < $line->l) { 73 $ofs >= 0 && $ofs < $line->l
43 my $diff = $ofs - $cur; 74 or return;
44 my $move;
45 75
46 if ($diff < 0) { 76 my $diff = $ofs - $cur;
47 ($ofs, $cur) = ($cur, $ofs); 77 my $move;
48 $move = "\x1b[D";
49 } else {
50 $move = "\x1b[C";
51 }
52 78
53 my $skipped = substr $line->t, $cur, $ofs - $cur; 79 if ($diff < 0) {
54 $skipped =~ s/\x{ffff}//g; 80 ($ofs, $cur) = ($cur, $ofs);
55 81 $move = "\x1b[D";
56 $self->tt_write ($move x length $skipped); 82 } else {
83 $move = "\x1b[C";
57 } 84 }
58 85
59 () 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
60} 92}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines