From e8861cb922b971a8f7d2f2fb7a88efa70b57d42a Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Thu, 3 Jun 2021 11:43:06 +0200 Subject: Store the labels and the matches together in a hash. --- reselect | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/reselect b/reselect index 92d5581..65e7ba8 100644 --- a/reselect +++ b/reselect @@ -48,12 +48,12 @@ sub build_overlays { my $label_rend = $self->get_rend("label", urxvt::OVERLAY_RSTYLE); my $num = 0; - my $labels = {}; - my $hrefs = {}; my @overlays = find_matches($pattern, $text, $rowmap); @overlays = reverse @overlays if ($self->{descending}); + my $results = {}; + for my $ov (@overlays) { my ($col, $row, $href) = @$ov; $num++; @@ -61,11 +61,10 @@ sub build_overlays { 1, $label_rend, 0); $overlay->set(0, 0, $num); - $labels->{$num} = $overlay; - $hrefs->{$num} = $href; + $results->{$num} = {label => $overlay, match => $href}; } - return ($num, $labels, $hrefs) + return $results; }; sub on_action { @@ -108,20 +107,20 @@ sub on_action { } } - my ($num, $labels, $hrefs) = $self->build_overlays($pattern, $text, $rowmap); + my $results = $self->build_overlays($pattern, $text, $rowmap); - if ($num < 1) { + if (keys %{$results} < 1) { my $desc = $issel ? "in visible selected text" : "on visible screen"; $self->status_msg("no matches found $desc"); } else { my $url_picker = {}; - $url_picker->{prompt} = $self->overlay( - 0, -1, 8, 1, $self->get_rend("prompt", urxvt::OVERLAY_RSTYLE), 0 - ); - $url_picker->{prompt}->set(0, 0, "Select match:"); - $url_picker->{labels} = $labels; - $url_picker->{hrefs} = $hrefs; - $url_picker->{num} = $num; + + my $prompt = "Select match:"; + $url_picker->{prompt} = $self->overlay(0, -1, length $prompt, 1, + $self->get_rend("prompt", urxvt::OVERLAY_RSTYLE), 0); + $url_picker->{prompt}->set(0, 0, $prompt); + + $url_picker->{results} = $results; $url_picker->{buffer} = ''; my ($crow,$ccol) = $self->screen_cur; $url_picker->{crow} = $crow; @@ -151,10 +150,10 @@ sub on_key_press { $self->update($p); } elsif ($keysym == 0xff0d) { # CR my $num = $p->{buffer}; - my $hrefs = $p->{hrefs}; - if (($num > 0) && ($num <= $p->{num})) { - my $href = $hrefs->{$num}; - $self->launch($href); + my $results = $p->{results}; + if (exists $results->{$num}) { + my $match = $results->{$num}->{match}; + $self->launch($match); } } return 1; @@ -169,17 +168,18 @@ sub update { ); $p->{typing}->set(0,0,$p->{buffer}); my $ndx = 0; - my $labels = $p->{labels}; - my $hrefs = $p->{hrefs}; + my $results = $p->{results}; + my $size = keys %{$results}; my $len = length($p->{buffer}); - my $size = $p->{num}; my @matches; while (++$ndx <= $size) { - my $overlay = $labels->{$ndx}; + my $result = $results->{$ndx}; + my $overlay = $result->{label}; + if (($len == 0) || - (($len <= length($ndx)) && (substr($ndx,0,$len) eq $p->{buffer}))) { + (($len <= length($ndx)) && (substr($ndx,0,$len) eq $p->{buffer}))) { $overlay->show; - unshift @matches,$hrefs->{$ndx}; + unshift @matches, $result->{match}; } else { $overlay->hide; } -- cgit v1.2.3