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, 5 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# Content
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