1 |
#! perl |
2 |
|
3 |
=head1 NAME |
4 |
|
5 |
option-popup - option menu (enabled by default) |
6 |
|
7 |
=head1 DESCRIPTION |
8 |
|
9 |
Binds a popup menu to Ctrl-Button2 that lets you toggle (some) options at |
10 |
runtime. |
11 |
|
12 |
Other extensions can extend this popup menu by pushing a code reference |
13 |
onto C<< @{ $term->{option_popup_hook} } >>, which gets called whenever |
14 |
the popup is being displayed. |
15 |
|
16 |
Its sole argument is the popup menu, which can be modified. It should |
17 |
either return nothing or a string, the initial boolean value and a code |
18 |
reference. The string will be used as button text and the code reference |
19 |
will be called when the toggle changes, with the new boolean value as |
20 |
first argument. |
21 |
|
22 |
The following will add an entry C<myoption> that changes |
23 |
C<< $self->{myoption} >>: |
24 |
|
25 |
push @{ $self->{term}{option_popup_hook} }, sub { |
26 |
("my option" => $myoption, sub { $self->{myoption} = $_[0] }) |
27 |
}; |
28 |
|
29 |
=cut |
30 |
|
31 |
sub on_start { |
32 |
my ($self) = @_; |
33 |
|
34 |
$self->grab_button (2, urxvt::ControlMask); |
35 |
|
36 |
() |
37 |
} |
38 |
|
39 |
sub on_button_press { |
40 |
my ($self, $event) = @_; |
41 |
|
42 |
if ($event->{button} == 2 && $event->{state} & urxvt::ControlMask) { |
43 |
my $popup = $self->popup ($event) |
44 |
or return 1; |
45 |
|
46 |
$popup->add_title ("Options"); |
47 |
$popup->add_separator; |
48 |
|
49 |
my %unsafe = map +($_ => 1), |
50 |
qw(borderLess console iconic loginShell reverseVideo |
51 |
scrollBar scrollBar_floating scrollBar_right |
52 |
secondaryScreen transparent utmpInhibit meta8 |
53 |
override_redirect); |
54 |
|
55 |
for my $name (sort keys %urxvt::OPTION) { |
56 |
next if $unsafe{$name}; |
57 |
|
58 |
my $optval = $urxvt::OPTION{$name}; |
59 |
|
60 |
$popup->add_toggle ($name => $self->option ($optval), |
61 |
sub { $self->option ($optval, $_[0]) }); |
62 |
} |
63 |
|
64 |
for my $hook (@{ $self->{term}{option_popup_hook} || [] }) { |
65 |
if (my ($name, $value, $cb) = $hook->($popup)) { |
66 |
$popup->add_toggle ($name => $value, sub { $cb->($_[0]) }); |
67 |
} |
68 |
} |
69 |
|
70 |
{ |
71 |
$popup->add_separator; |
72 |
my $locale = $self->locale; |
73 |
$locale =~ y/\x20-\x7e//cd; |
74 |
$popup->add_title ("Locale: $locale"); |
75 |
} |
76 |
|
77 |
$popup->show; |
78 |
|
79 |
return 1; |
80 |
} |
81 |
|
82 |
() |
83 |
} |
84 |
|