#!/usr/bin/perl -w
# Copyright 2007, 2008, 2009, 2010 Kevin Ryde
# This file is part of Gtk2-Ex-TickerView.
#
# Gtk2-Ex-TickerView is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3, or (at your option) any later
# version.
#
# Gtk2-Ex-TickerView is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with Gtk2-Ex-TickerView. If not, see .
# This is an example news ticker, using a Gtk2::ListStore as the underlying
# model. The first entry in the list is updated under a timer to show the
# current time and you can see it getting redrawn automatically on each
# change to the model (including updating during a user drag).
#
# There's two renderers, a pixbuf showing a yellow house icon, then a text
# renderer for the string from the model. The pixbuf could be made to vary
# with the model if desired, eg. a different icon for sports, weather, etc.
#
use strict;
use warnings;
use POSIX ();
use Gtk2 '-init';
use Gtk2::Ex::TickerView;
my @house_xpm = (
'32 32 2 1',
' c None',
'. c yellow',
' ',
' ',
' .. ',
' ........ ',
' .... .... ',
' .... .... ',
' .... .... ',
' .... .... ',
' ... ...................... ... ',
'... ...................... ...',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. .. ',
' .. ........ .. ',
' .. ........ .. ',
' .. .. .. .. ',
' .. .. .. .. ',
' .. .. .. .. ',
' .. .. .. .. ',
' .. .. .. .. ',
' .. .. .. .. ',
' ...................... ',
' ...................... ',
' ',
' ',
' ');
my $toplevel = Gtk2::Window->new('toplevel');
$toplevel->signal_connect (destroy => sub { Gtk2->main_quit; });
$toplevel->set_size_request (300, -1);
my $liststore = Gtk2::ListStore->new ('Glib::String');
foreach my $str ('News time 12:34:56',
'Barbers Union boycotts fringe festival',
'Scientists say space is big - really, really, big',
'Colonel Kurtz denies his methods are unsound',
'Norville Barnes appointed president of Hudsucker',
) {
$liststore->set_value ($liststore->append, 0, $str);
}
my $ticker = Gtk2::Ex::TickerView->new (model => $liststore);
$toplevel->add ($ticker);
my $renderer1 = Gtk2::CellRendererPixbuf->new;
$renderer1->set (pixbuf => Gtk2::Gdk::Pixbuf->new_from_xpm_data (@house_xpm),
xpad => 4);
$ticker->pack_start ($renderer1, 0);
my $renderer2 = Gtk2::CellRendererText->new;
$ticker->pack_start ($renderer2, 0);
$ticker->set_attributes ($renderer2, markup => 0);
sub timer_callback {
# note POSIX::strftime is locale bytes, so really ought to recode it to
# perl wide-char unicode here, but %H%M%S is only digits
my $str = POSIX::strftime ("News time %H:%M:%S",
localtime (time()));
$liststore->set_value ($liststore->get_iter_first, 0, $str);
return 1; # Glib::SOURCE_CONTINUE
}
timer_callback(); # initial time display
Glib::Timeout->add (1000, \&timer_callback); # periodic updates
# setup a couple of key bindings, space to toggle the run, Q to quit
$ticker->add_events (['key-press-mask']);
$ticker->set_flags ('can-focus');
$ticker->signal_connect
(key_press_event => sub {
my ($ticker, $event) = @_;
my $keyval = Gtk2::Gdk->keyval_to_upper ($event->keyval);
if ($keyval == Gtk2::Gdk->keyval_from_name ('space')) {
$ticker->set (run => ! $ticker->get('run'));
} elsif ($keyval == Gtk2::Gdk->keyval_from_name ('Q')) {
$toplevel->destroy;
}
return 0; # Gtk2::EVENT_PROPAGATE
});
$toplevel->show_all;
Gtk2->main;
exit 0;