ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/xim-onthespot
Revision: 1.7
Committed: Tue Sep 4 22:41:12 2012 UTC (11 years, 8 months ago) by root
Branch: MAIN
CVS Tags: rxvt-unicode-rel-9_29, rxvt-unicode-rel-9_26, rxvt-unicode-rel-9_25, rxvt-unicode-rel-9_22, rxvt-unicode-rel-9_20, rxvt-unicode-rel-9_21, rxvt-unicode-rel-9_19, rxvt-unicode-rel-9_18, rxvt-unicode-rel-9_17, rxvt-unicode-rel-9_16, rxvt-unicode-rel-9_30, HEAD
Changes since 1.6: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #! perl
2    
3 root 1.6 =head1 NAME
4    
5 root 1.7 xim-onthespot - implement XIM "on-the-spot" behaviour
6 root 1.6
7     =head1 DESCRIPTION
8    
9     This perl extension implements OnTheSpot editing. It does not work
10     perfectly, and some input methods don't seem to work well with OnTheSpot
11     editing in general, but it seems to work at least for SCIM and kinput2.
12    
13     You enable it by specifying this extension and a preedit style of
14     C<OnTheSpot>, i.e.:
15    
16     urxvt -pt OnTheSpot -pe xim-onthespot
17    
18     =cut
19    
20 root 1.1 #
21     # problems with this implementation include
22 sf-exg 1.5 #
23 sf-exg 1.4 # - primary, secondary, tertiary are NO different to other highlighting styles
24 root 1.3 # - if rend values are missing, they are not being interpolated
25 root 1.1 #
26    
27     my $SIZEOF_LONG = length pack "l!", 0;
28    
29     sub refresh {
30     my ($self) = @_;
31    
32     delete $self->{overlay};
33    
34     my $text = $self->{text};
35    
36     return unless length $text;
37    
38     my ($row, $col) = $self->screen_cur;
39    
40     my $idx = 0;
41    
42     my @rend = map {
43     my $rstyle = $self->{caret} == $idx ? urxvt::OVERLAY_RSTYLE : $self->rstyle;
44    
45     $rstyle |= urxvt::RS_Uline if $_ & (urxvt::XIMUnderline | urxvt::XIMPrimary);
46     $rstyle |= urxvt::RS_RVid if $_ & (urxvt::XIMReverse | urxvt::XIMSecondary);
47 root 1.2 $rstyle |= urxvt::RS_Italic if $_ & (urxvt::XIMHighlight | urxvt::XIMTertiary);
48 root 1.1
49     ($rstyle) x ($self->strwidth (substr $text, $idx++, 1))
50     } unpack "l!*", $self->{rend};
51    
52     if ($self->{caret} >= length $text) {
53     $text .= " ";
54     push @rend, urxvt::OVERLAY_RSTYLE;
55     }
56    
57     $self->{overlay} = $self->overlay ($col, $row, $self->strwidth ($text), 1, $self->rstyle, 0);
58     $self->{overlay}->set (0, 0, $self->special_encode ($text), \@rend);
59     }
60    
61     sub on_xim_preedit_start {
62     my ($self) = @_;
63    
64     ()
65     }
66    
67     sub on_xim_preedit_done {
68     my ($self) = @_;
69    
70     delete $self->{overlay};
71     delete $self->{text};
72     delete $self->{rend};
73    
74     ()
75     }
76    
77     sub on_xim_preedit_draw {
78     my ($self, $caret, $pos, $len, $feedback, $chars) = @_;
79    
80     $self->{caret} = $caret;
81    
82     substr $self->{rend}, $pos * $SIZEOF_LONG, $len * $SIZEOF_LONG, $feedback;
83     substr $self->{text}, $pos , $len , $chars if defined $feedback || !defined $chars;
84    
85     $self->refresh;
86    
87     ()
88     }
89    
90