3
# this extension implements popup-menu functionality for urxvt. it works
4
# together with the urxvt::popup class.
12
for my $item (@{ $self->{data}{item} }) {
15
if ($row == $self->{hover}) {
16
$rend = $self->{press} ? "active" : "hover";
19
$cmd .= "$item->{rend}{$rend}\x1b[K";
20
$cmd .= $self->locale_encode ($item->{render}->($item));
26
$self->cmd_parse (substr $cmd, 0, -2);
29
sub on_motion_notify {
30
my ($self, $event) = @_;
32
delete $self->{hover};
34
my ($row, $col) = ($event->{row}, $event->{col});
35
if ($col >= 0 && $col < $self->ncol
36
&& $row >= 0 && $row < @{ $self->{data}{item} }) {
37
$self->{hover} = $event->{row} + 1;
45
my ($self, $event) = @_;
47
$self->{press}[$event->{button}] = 1;
53
sub on_button_release {
54
my ($self, $event) = @_;
56
if ($event->{button} == $self->{data}{event}{button}) {
61
$self->{press}[$event->{button}] = 0;
63
my ($row, $col) = ($event->{row}, $event->{col});
64
if ($col >= 0 && $col < $self->ncol
65
&& $row >= 0 && $row < @{ $self->{data}{item} }) {
66
my $item = $self->{data}{item}[$row];
67
$item->{activate}->($event, $item);
78
delete $self->{hover};
87
my $data = $self->{data} = $urxvt::popup::self;
89
$_->{width} = $self->strwidth ($_->{text})
90
for @{ $data->{item} };
92
$self->resource ($_ => $data->{term}->resource ($_))
93
for qw(font boldFont italicFont boldItalicFont color+0 color+1);
95
my $width = List::Util::max map $_->{width}, @{ $data->{item} };
96
my $height = @{ $data->{item} };
100
if ($data->{event}) {
101
my $x = int List::Util::max 0, $data->{event}{x_root} - $width * $data->{term}->fwidth * 0.5;
102
my $y = int List::Util::max 0, $data->{event}{y_root} - $data->{term}->fheight * 0.5;
106
$self->resource (geometry => "${width}x${height}$pos");
114
$self->cmd_parse ("\x1b[?25l\x1b[?7l");
117
# might fail, but try anyways
118
$self->grab ($self->{data}{event}{time}, 1)
119
and $self->allow_events_async;
121
on_button_press $self, $self->{data}{event} if $self->{data}{event}{button};
127
my ($self, $event) = @_;
129
# should definitely not fail
130
$self->grab ($self->{data}{event}{time}, 1)
131
and $self->allow_events_async;