1 | #! perl |
1 | #! perl |
2 | |
2 | |
3 | # this creates a simple digital clock by overwriting the refresh hooks |
3 | # this creates a simple digital clock |
4 | |
4 | |
5 | sub on_init { |
5 | sub on_init { |
6 | my ($self) = @_; |
6 | my ($self) = @_; |
7 | |
7 | |
8 | # force a refresh every second |
8 | $self->{overlay} = $self->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0); |
9 | $self->{digital_clock_refresh} = urxvt::timer |
9 | $self->{timer} = urxvt::timer |
10 | ->new |
10 | ->new |
11 | ->start (urxvt::NOW) |
11 | ->start (int urxvt::NOW) # make sure we update "on" the second |
|
|
12 | ->interval (1) |
12 | ->cb (sub { |
13 | ->cb (sub { |
13 | $self->{digital_clock_refresh}->start ($self->{digital_clock_refresh}->at + 1); |
14 | $self->{overlay}->set (0, 0, |
14 | $self->want_refresh; |
15 | sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]); |
15 | }); |
16 | }); |
16 | |
17 | |
17 | () |
18 | () |
18 | } |
19 | } |
19 | |
20 | |
20 | # before refreshing: replace upper right with the clock display |
|
|
21 | sub on_refresh_begin { |
|
|
22 | my ($self) = @_; |
|
|
23 | |
21 | |
24 | my $time = sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2, 1, 0]; |
|
|
25 | my $xpos = $self->ncol - length $time; |
|
|
26 | |
|
|
27 | $xpos >= 0 |
|
|
28 | or return; |
|
|
29 | |
|
|
30 | $self->{digital_clock_rend} = $self->ROW_r (0, [(urxvt::DEFAULT_RSTYLE) x length $time], $xpos); |
|
|
31 | $self->{digital_clock_text} = $self->ROW_t (0, $time, $xpos); |
|
|
32 | |
|
|
33 | () |
|
|
34 | } |
|
|
35 | |
|
|
36 | # after refreshing: restore previous screen contents |
|
|
37 | sub on_refresh_end { |
|
|
38 | my ($self) = @_; |
|
|
39 | |
|
|
40 | exists $self->{digital_clock_text} |
|
|
41 | or return; |
|
|
42 | |
|
|
43 | $self->ROW_r (0, delete $self->{digital_clock_rend}); |
|
|
44 | $self->ROW_t (0, delete $self->{digital_clock_text}); |
|
|
45 | |
|
|
46 | () |
|
|
47 | } |
|
|
48 | |
|
|
49 | |
|
|