ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/urxvt-popup
Revision: 1.1
Committed: Sat Jan 7 20:23:53 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #! perl
2    
3     use List::Util;
4    
5     sub refresh {
6     my ($self) = @_;
7    
8     my $cmd = "\x1b[H";
9    
10     my $row = 1;
11     for my $item (@{ $self->{data}{item} }) {
12     my $rend = "\x1b[30;47m";
13    
14     if ($row == $self->{hover}) {
15     $rend = $self->{press} ? "\x1b[m" : "\x1b[30;46m";
16     }
17    
18     $cmd .= "$rend\x1b[K" . $self->locale_encode ($item->{text}) . "\015\012";
19    
20     $row++;
21     }
22    
23     $self->cmd_parse (substr $cmd, 0, -2);
24     }
25    
26     sub on_motion_notify {
27     my ($self, $event) = @_;
28    
29     $self->{hover} = $event->{row} + 1;
30     refresh $self;
31    
32     1
33     }
34    
35     sub on_button_press {
36     my ($self, $event) = @_;
37    
38     $self->{press}[$event->{button}] = 1;
39     refresh $self;
40    
41     1
42     }
43    
44     sub on_button_release {
45     my ($self, $event) = @_;
46    
47     my $row = $event->{row};
48     my $col = $event->{col};
49    
50     if ($event->{button} == $self->{data}{event}{button}) {
51     $self->ungrab;
52     $self->destroy;
53     }
54    
55     if ($event->{button} == 1) {
56     $self->{press}[$event->{button}] = 0;
57     refresh $self;
58    
59     warn "$event->{row} $event->{col}\n";#d#
60    
61     if ($col >= 0 && $col < $self->ncol
62     && $row >= 0 && $row < @{ $self->{data}{item} }) {
63     $self->{data}{item}[$row]{activate}->($event);
64     print "ok\n";
65     }
66     }
67    
68     1
69     }
70    
71     sub on_focus_out {
72     my ($self) = @_;
73    
74     delete $self->{hover};
75     refresh $self;
76    
77     ()
78     }
79    
80     sub on_init {
81     my ($self) = @_;
82    
83     my $data = $self->{data} = $urxvt::popup::self;
84    
85     $_->{width} = $self->strwidth ($_->{text})
86     for @{ $data->{item} };
87    
88     $self->resource ($_ => $data->{term}->resource ($_))
89     for qw(font boldFont italicFont boldItalicFont color+0 color+1);
90    
91     my $width = List::Util::max map $_->{width}, @{ $data->{item} };
92     my $height = @{ $data->{item} };
93    
94     my $pos = "";
95    
96     if ($data->{event}) {
97     my $x = int List::Util::max 0, $data->{event}{x_root} - $width * $data->{term}->fwidth * 0.5;
98     my $y = int List::Util::max 0, $data->{event}{y_root} - $data->{term}->fheight * 0.5;
99    
100     $pos = "+$x+$y";
101     }
102    
103     $self->resource (geometry => "${width}x${height}$pos");
104    
105     ()
106     }
107    
108     sub on_start {
109     my ($self) = @_;
110    
111     # might fail, but try anyways
112     $self->grab ($self->{data}{event}{time}, 1)
113     and $self->allow_events_sync;
114    
115     on_button_press $self, $self->{data}{event} if $self->{data}{event}{button};
116    
117     $self->cmd_parse ("\x1b[?25l\x1b[?7l");
118     refresh $self;
119    
120     ()
121     }
122    
123     sub on_map_notify {
124     my ($self, $event) = @_;
125    
126     # should definitely not fail
127     $self->grab ($self->{data}{event}{time}, 1)
128     and $self->allow_events_sync;
129     }
130    
131     sub on_destroy {
132     }
133    
134    
135    
136    
137