#!/usr/bin/perl
# $Id: input-lirc 259 2008-04-27 19:07:10Z bd $

# Copyright 2004-2008 Bjorn Danielsson
# http://glotv.dax.nu/
#
# This file is part of GLOTV. GLOTV is free software; you can redistribute
# it and/or modify it under the terms of the GNU General Public License as
# published at this URL: http://www.gnu.org/licenses/gpl.html.

use vars qw(%config);
use Socket;
use Tk;
use Tk::CursorControl;			# Note: This is a separate CPAN module!
use Time::HiRes qw(time);
use strict;

my $PATHPREFIX = "/usr/local/glotv";
do "$PATHPREFIX/etc/glotv.conf" or die "Failed reading configuration file";

my $lirc_translations = $config{lirc_translations};
my $conv = undef;

my $emergency_exit = 0;

# Initialize Tk 
my $MW = MainWindow->new();
####$MW->geometry("+32000+32000");
$MW->bind('<Control-c>' => \&exit);
$MW->bind('<q>' => \&exit);
$MW->overrideredirect(1);
$MW->focusmodel('active');

my $cursor = $MW->CursorControl;

my $nothing = "*****";
my $irlabel = $nothing;

my $text = $MW->Label(-width => 10, -textvariable => \$irlabel);
$text->pack();

sub grab_console {
    $MW->grabGlobal();
    $cursor->warpto($MW);
    $MW->focusForce();
    $cursor->hide($MW);
}

my $sockname = "/dev/lircd";

socket(LIRC, PF_UNIX, SOCK_STREAM, 0) or die "Couldn't create socket: $!";
connect(LIRC, sockaddr_un($sockname)) or die "Connect to socket $sockname failed: $!";

my $timeout = 310;
my $key_pressed_time = 0;
my $key_pressed = undef;
my $skip = 0;

sub inputlirc {
    my $line = <LIRC>;
    $key_pressed_time = time;
    if (!defined($line)) {
	close LIRC;
    } else {
	my ($hex,$i,$irname,$devname) = split(/\s+/, $line);
	if (!defined($conv)) {
	    if ($lirc_translations) {
		$conv = $$lirc_translations{$devname};
	    }
	}
	my ($keyname,$debounce) = &lirc_translate($irname);
	if ($debounce) {
	    if (defined $key_pressed) {
		if ($key_pressed ne $keyname) {
		    print STDOUT "$key_pressed 0\n";
		    print STDOUT "$keyname 1\n";
		}
	    } else {
		print STDOUT "$keyname 1\n";
	    }
	    $key_pressed = $keyname;
	    $MW->after($debounce, [\&release,$keyname]);
	} else {
	    if ($skip) {
		$skip = 0;
	    } else {
		$skip = 1;
		print STDOUT "$keyname 1\n";
		print STDOUT "$keyname 0\n";
	    }
	}
    }
}

sub release {
    my $keyname = shift;
    if (1000*(time - $key_pressed_time) > $timeout) {
	if (defined $key_pressed) {
	    $key_pressed = undef;
	    print STDOUT "$keyname 0\n";
	}
    }
}

sub lirc_translate {
    my $irname = shift;
    my $i = shift;
    if ($conv) {
	my $keyname = $$conv{$irname};
	if (defined $keyname) {
	    if (substr($keyname,0,1) eq '-') {
		return (substr($keyname,1),0);
	    } else {
		return ($keyname,$timeout);
	    }
	}
    }
    return ($irname,$timeout);
}

$MW->fileevent(\*LIRC, readable => \&inputlirc);
$MW->bind('<Map>' => \&grab_console);

$|=1;

MainLoop();
