--- rxvt-unicode/src/perl/urxvt-popup 2006/01/07 20:29:28 1.2 +++ rxvt-unicode/src/perl/urxvt-popup 2012/06/11 05:03:46 1.17 @@ -1,9 +1,7 @@ #! perl # this extension implements popup-menu functionality for urxvt. it works -# together with the urxvt::popup class. - -use List::Util; +# together with the urxvt::popup class - "no user serviceable parts inside". sub refresh { my ($self) = @_; @@ -12,13 +10,15 @@ my $row = 1; for my $item (@{ $self->{data}{item} }) { - my $rend = "\x1b[30;47m"; + my $rend = "normal"; if ($row == $self->{hover}) { - $rend = $self->{press} ? "\x1b[m" : "\x1b[30;46m"; + $rend = $self->{press} ? "active" : "hover"; } - $cmd .= "$rend\x1b[K" . $self->locale_encode ($item->{text}) . "\015\012"; + $cmd .= "$item->{rend}{$rend}\x1b[K"; + $cmd .= $self->locale_encode ($item->{render}->($item)); + $cmd .= "\015\012"; $row++; } @@ -29,8 +29,14 @@ sub on_motion_notify { my ($self, $event) = @_; - $self->{hover} = $event->{row} + 1; - refresh $self; + delete $self->{hover}; + + my ($row, $col) = ($event->{row}, $event->{col}); + if ($col >= 0 && $col < $self->ncol + && $row >= 0 && $row < @{ $self->{data}{item} }) { + $self->{hover} = $event->{row} + 1; + } + $self->refresh; 1 } @@ -39,7 +45,7 @@ my ($self, $event) = @_; $self->{press}[$event->{button}] = 1; - refresh $self; + $self->refresh; 1 } @@ -47,27 +53,22 @@ sub on_button_release { my ($self, $event) = @_; - my $row = $event->{row}; - my $col = $event->{col}; + $self->{press}[$event->{button}] = 0; + + my ($row, $col) = ($event->{row}, $event->{col}); + if ($col >= 0 && $col < $self->ncol + && $row >= 0 && $row < @{ $self->{data}{item} }) { + my $item = $self->{data}{item}[$row]; + $item->{activate}->($event, $item); + } + + $self->refresh; if ($event->{button} == $self->{data}{event}{button}) { $self->ungrab; $self->destroy; } - if ($event->{button} == 1) { - $self->{press}[$event->{button}] = 0; - refresh $self; - - warn "$event->{row} $event->{col}\n";#d# - - if ($col >= 0 && $col < $self->ncol - && $row >= 0 && $row < @{ $self->{data}{item} }) { - $self->{data}{item}[$row]{activate}->($event); - print "ok\n"; - } - } - 1 } @@ -75,7 +76,7 @@ my ($self) = @_; delete $self->{hover}; - refresh $self; + $self->refresh; () } @@ -88,6 +89,9 @@ $_->{width} = $self->strwidth ($_->{text}) for @{ $data->{item} }; + $self->resource (title => "URxvt Popup Menu"); + $self->resource (name => "URxvt.popup"); + $self->resource ($_ => $data->{term}->resource ($_)) for qw(font boldFont italicFont boldItalicFont color+0 color+1); @@ -99,27 +103,28 @@ if ($data->{event}) { my $x = int List::Util::max 0, $data->{event}{x_root} - $width * $data->{term}->fwidth * 0.5; my $y = int List::Util::max 0, $data->{event}{y_root} - $data->{term}->fheight * 0.5; - $pos = "+$x+$y"; } $self->resource (geometry => "${width}x${height}$pos"); + $self->{term}{urxvt_popup_init_done} = 1; + () } sub on_start { my ($self) = @_; + $self->cmd_parse ("\x1b[?25l\x1b[?7l"); + $self->refresh; + # might fail, but try anyways $self->grab ($self->{data}{event}{time}, 1) - and $self->allow_events_sync; + and $self->allow_events_async; on_button_press $self, $self->{data}{event} if $self->{data}{event}{button}; - $self->cmd_parse ("\x1b[?25l\x1b[?7l"); - refresh $self; - () } @@ -128,13 +133,7 @@ # should definitely not fail $self->grab ($self->{data}{event}{time}, 1) - and $self->allow_events_sync; + and $self->allow_events_async; } -sub on_destroy { -} - - - -