#!/usr/bin/perl # # Copyright (C) 2009 Mandriva # Pascal Terjan # # This program 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 2, or (at your option) # any later version. # # This program 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 this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. use lib qw(/usr/lib/libDrakX); use MDK::Common; use common; use standalone; use mygtk2; use interactive; use ugtk2 qw(:create :helpers :wrappers); use Gtk2::SimpleList; my $title = N("DVB"); $ugtk2::wm_icon = "/usr/share/mcc/themes/default/tv-mdk.png"; my $w = ugtk2->new($title); $w->{window}->signal_connect('destroy' => \&exitapp); $::main_window = $w->{real_window}; my $in = 'interactive'->vnew; my $config_file = "$ENV{HOME}/.mplayer/channels.conf"; my $channel_list = Gtk2::SimpleList->new(N("Channel") => "text", "id" => "hidden"); my %buttons; my $pid; my $wait; sub get_selected_channel() { my ($index) = $channel_list->get_selected_indices; defined $index && $channel_list->{data}[$index][1]; } sub exitapp() { local $SIG{TERM} = 'IGNORE'; kill TERM => -$$; Gtk2->main_quit; } sub detect_channels() { if (-s $config_file) { $in->ask_okcancel(N("Warning"), N("%s already exists and its contents will be lost", $config_file)) or return; } gtkset_mousecursor_wait($w->{window}->window); $channel_list->set_sensitive(0); $_->set_sensitive(0) foreach values %buttons; gtkflush(); $SIG{CHLD} = sub { $SIG{CHLD} = 'IGNORE'; $wait->{window}->hide; waitpid($pid, 0); if (($? >> 8) == 0) { load_channels(); } else { $in->ask_warn(N("Error"), N("Could not get the list of available channels")); } gtkset_mousecursor_normal($w->{window}->window); $buttons{detect}->set_sensitive(1); $channel_list->set_sensitive(1); }; $wait = ugtk2->new(N("Please wait"), grab => 1); $wait->{window}->signal_connect('destroy' => \&exitapp); if ($pid = fork()) { gtkadd($wait->{window}, gtkpack($wait->create_box_with_title(N("Detecting DVB channels, this will take a few minutes")), gtknew('Button', text => N("Cancel"), clicked => \&exitapp), ) ); $wait->main; } else { $SIG{CHLD} = 'DEFAULT'; mkdir_p(dirname($config_file)); my $ret = system("w_scan -X > $config_file"); sleep(1); POSIX::_exit($ret >> 8); } } sub load_channels() { @{$channel_list->{data}} = (); open(my $CHANNELCONF, "<$config_file"); local $_; while (<$CHANNELCONF>) { my $line = $_; if ($line =~ /^([^:]*?)(\([^(:]*\))?:/) { push @{$channel_list->{data}}, [ $1, $1 . $2 ]; } } close($CHANNELCONF); if (defined @{$channel_list->{data}}[0]) { $channel_list->select(0); } } sub launch_tv() { system('mplayer "dvb://' . get_selected_channel() . '"&'); } gtkadd($w->{window}, gtknew('VBox', spacing => 5, children => [ $::isEmbedded ? () : (0, Gtk2::Banner->new($ugtk2::wm_icon, $title)), 1, gtknew('ScrolledWindow', width => 300, height => 400, child => $channel_list), 0, gtknew('HButtonBox', layout => 'end', children_loose => [ $buttons{detect} = gtknew('Button', text => N("Detect Channels"), clicked => \&detect_channels), gtknew('Button', text => N("Quit"), clicked => \&exitapp), $buttons{view} = gtknew('Button', text => N("View Channel"), clicked => \&launch_tv), ]), ]), ); $buttons{view}->set_sensitive(0); $channel_list->get_selection->signal_connect('changed' => sub { my ($index) = $channel_list->get_selected_indices; $buttons{view}->set_sensitive(defined $index); }); $channel_list->signal_connect('row-activated' => sub { launch_tv(); }); load_channels(); $w->main;