summaryrefslogtreecommitdiffstats
path: root/src/perl/option-popup
blob: d15aa1e638595679c565ab6864461601e0d7496f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#! perl

=head1 NAME

option-popup - option menu (enabled by default)

=head1 DESCRIPTION

Binds a popup menu to Ctrl-Button2 that lets you toggle (some) options at
runtime.

Other extensions can extend this popup menu by pushing a code reference
onto C<< @{ $term->{option_popup_hook} } >>, which gets called whenever
the popup is being displayed.

Its sole argument is the popup menu, which can be modified.  It should
either return nothing or a string, the initial boolean value and a code
reference. The string will be used as button text and the code reference
will be called when the toggle changes, with the new boolean value as
first argument.

The following will add an entry C<myoption> that changes
C<< $self->{myoption} >>:

   push @{ $self->{term}{option_popup_hook} }, sub {
      ("my option" => $myoption, sub { $self->{myoption} = $_[0] })
   };

=cut

sub on_start {
   my ($self) = @_;

   $self->grab_button (2, urxvt::ControlMask);

   ()
}

sub on_button_press {
   my ($self, $event) = @_;

   if ($event->{button} == 2 && $event->{state} & urxvt::ControlMask) {
      my $popup = $self->popup ($event)
         or return 1;

      $popup->add_title ("Options");
      $popup->add_separator;

      my %unsafe = map +($_ => 1),
         qw(borderLess console iconic loginShell reverseVideo
            scrollBar scrollBar_floating scrollBar_right
            secondaryScreen transparent utmpInhibit meta8
            override_redirect);

      for my $name (sort keys %urxvt::OPTION) {
         next if $unsafe{$name};

         my $optval = $urxvt::OPTION{$name};

         $popup->add_toggle ($name => $self->option ($optval),
                             sub { $self->option ($optval, $_[0]) });
      }

      for my $hook (@{ $self->{term}{option_popup_hook} || [] }) {
         if (my ($name, $value, $cb) = $hook->($popup)) {
            $popup->add_toggle ($name => $value, sub { $cb->($_[0]) });
         }
      }

      {
         $popup->add_separator;
         my $locale = $self->locale;
         $locale =~ y/\x20-\x7e//cd;
         $popup->add_title ("Locale: $locale");
      }

      $popup->show;

      return 1;
   }

   ()
}