ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/perl/urxvt-popup
(Generate patch)

Comparing rxvt-unicode/src/perl/urxvt-popup (file contents):
Revision 1.3 by root, Sat Jan 7 20:50:43 2006 UTC vs.
Revision 1.12 by root, Sun Jan 8 22:58:13 2006 UTC

1#! perl 1#! perl
2 2
3# this extension implements popup-menu functionality for urxvt. it works 3# this extension implements popup-menu functionality for urxvt. it works
4# together with the urxvt::popup class. 4# together with the urxvt::popup class.
5
6use List::Util;
7 5
8sub refresh { 6sub refresh {
9 my ($self) = @_; 7 my ($self) = @_;
10 8
11 my $cmd = "\x1b[H"; 9 my $cmd = "\x1b[H";
12 10
13 my $row = 1; 11 my $row = 1;
14 for my $item (@{ $self->{data}{item} }) { 12 for my $item (@{ $self->{data}{item} }) {
15 my $rend = "\x1b[30;47m"; 13 my $rend = "normal";
16 14
17 if ($row == $self->{hover}) { 15 if ($row == $self->{hover}) {
18 $rend = $self->{press} ? "\x1b[m" : "\x1b[30;46m"; 16 $rend = $self->{press} ? "active" : "hover";
19 } 17 }
20 18
21 $cmd .= "$rend\x1b[K" . $self->locale_encode ($item->{text}) . "\015\012"; 19 $cmd .= "$item->{rend}{$rend}\x1b[K";
20 $cmd .= $self->locale_encode ($item->{render}->($item));
21 $cmd .= "\015\012";
22 22
23 $row++; 23 $row++;
24 } 24 }
25 25
26 $self->cmd_parse (substr $cmd, 0, -2); 26 $self->cmd_parse (substr $cmd, 0, -2);
27} 27}
28 28
29sub on_motion_notify { 29sub on_motion_notify {
30 my ($self, $event) = @_; 30 my ($self, $event) = @_;
31 31
32 delete $self->{hover};
33
34 my ($row, $col) = ($event->{row}, $event->{col});
35 if ($col >= 0 && $col < $self->ncol
36 && $row >= 0 && $row < @{ $self->{data}{item} }) {
32 $self->{hover} = $event->{row} + 1; 37 $self->{hover} = $event->{row} + 1;
33 refresh $self; 38 }
39 $self->refresh;
34 40
35 1 41 1
36} 42}
37 43
38sub on_button_press { 44sub on_button_press {
39 my ($self, $event) = @_; 45 my ($self, $event) = @_;
40 46
41 $self->{press}[$event->{button}] = 1; 47 $self->{press}[$event->{button}] = 1;
42 refresh $self; 48 $self->refresh;
43 49
44 1 50 1
45} 51}
46 52
47sub on_button_release { 53sub on_button_release {
48 my ($self, $event) = @_; 54 my ($self, $event) = @_;
49
50 my $row = $event->{row};
51 my $col = $event->{col};
52 55
53 if ($event->{button} == $self->{data}{event}{button}) { 56 if ($event->{button} == $self->{data}{event}{button}) {
54 $self->ungrab; 57 $self->ungrab;
55 $self->destroy; 58 $self->destroy;
56 } 59 }
57 60
58 $self->{press}[$event->{button}] = 0; 61 $self->{press}[$event->{button}] = 0;
59 62
60 if ($event->{button} == 1) { 63 my ($row, $col) = ($event->{row}, $event->{col});
61 refresh $self; 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);
68 }
62 69
63 warn "$event->{row} $event->{col}\n";#d# 70 $self->refresh;
64
65 if ($col >= 0 && $col < $self->ncol
66 && $row >= 0 && $row < @{ $self->{data}{item} }) {
67 $self->{data}{item}[$row]{activate}->($event);
68 print "ok\n";
69 }
70 }
71 71
72 1 72 1
73} 73}
74 74
75sub on_focus_out { 75sub on_focus_out {
76 my ($self) = @_; 76 my ($self) = @_;
77 77
78 delete $self->{hover}; 78 delete $self->{hover};
79 refresh $self; 79 $self->refresh;
80 80
81 () 81 ()
82} 82}
83 83
84sub on_init { 84sub on_init {
98 my $pos = ""; 98 my $pos = "";
99 99
100 if ($data->{event}) { 100 if ($data->{event}) {
101 my $x = int List::Util::max 0, $data->{event}{x_root} - $width * $data->{term}->fwidth * 0.5; 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; 102 my $y = int List::Util::max 0, $data->{event}{y_root} - $data->{term}->fheight * 0.5;
103
104 $pos = "+$x+$y"; 103 $pos = "+$x+$y";
105 } 104 }
106 105
107 $self->resource (geometry => "${width}x${height}$pos"); 106 $self->resource (geometry => "${width}x${height}$pos");
108 107
110} 109}
111 110
112sub on_start { 111sub on_start {
113 my ($self) = @_; 112 my ($self) = @_;
114 113
114 $self->cmd_parse ("\x1b[?25l\x1b[?7l");
115 $self->refresh;
116
115 # might fail, but try anyways 117 # might fail, but try anyways
116 $self->grab ($self->{data}{event}{time}, 1) 118 $self->grab ($self->{data}{event}{time}, 1)
117 and $self->allow_events_async; 119 and $self->allow_events_async;
118 120
119 on_button_press $self, $self->{data}{event} if $self->{data}{event}{button}; 121 on_button_press $self, $self->{data}{event} if $self->{data}{event}{button};
120
121 $self->cmd_parse ("\x1b[?25l\x1b[?7l");
122 refresh $self;
123 122
124 () 123 ()
125} 124}
126 125
127sub on_map_notify { 126sub on_map_notify {
130 # should definitely not fail 129 # should definitely not fail
131 $self->grab ($self->{data}{event}{time}, 1) 130 $self->grab ($self->{data}{event}{time}, 1)
132 and $self->allow_events_async; 131 and $self->allow_events_async;
133} 132}
134 133
135sub on_destroy {
136}
137 134
138
139
140
141

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines