#!/usr/bin/perl -w

use strict;
use Extutils::testlib;
use Term::Slang;

if (!defined $ARGV[0]) {
	printf "Usage: $0 [FILENAME]\n";
	exit;
}

my $last_line;
my @data = ();
open IN, $ARGV[0] or die $!;
while(<IN>) {
	push @data,$_;
}
close IN;
my $num_lines = scalar @data;

	File_Line_Type *line, *last_line;
	
	memset ((char *)&Line_Window, 0, sizeof (SLscroll_Window_Type));
	
	Line_Window.current_line = (SLscroll_Type *) File_Lines;
	Line_Window.lines = (SLscroll_Type *) File_Lines;
	Line_Window.line_num = 1;
	Line_Window.num_lines = num_lines;

my $sl = Term::Slang->new;
$sl->init_smg;
$sl->SLang_init_tty(-1,0,1);
$sl->smg_init_smg;
$sl->SLkp_init();

#$sl->SLkp_define_keysym("\033>",0x1001);
#$sl->SLkp_define_keysym("\033<",0x1002);

	while (1)
	 {
	update_display ();
	switch (SLkp_getkey ())
	  {
	   case SL_KEY_ERR:
	   case 'q':
	   case 'Q':
	     demolib_exit (0);
	     break;
	     
	   case SL_KEY_RIGHT:
	     Screen_Start += 1;
	     screen_start = Screen_Start;
	     $sl->smg_set_screen_start (NULL, &screen_start);
	     break;
	     
	   case SL_KEY_LEFT:
	     Screen_Start -= 1;
	     if (Screen_Start < 0) Screen_Start = 0;
	     screen_start = Screen_Start;
	     $sl->smg_set_screen_start (NULL, &screen_start);
	     break;

	   case SL_KEY_UP:
	     SLscroll_prev_n (&Line_Window, 1);
	     Line_Window.top_window_line = Line_Window.current_line;
	     break;
	     
	   case '\r':
	   case SL_KEY_DOWN:
	     SLscroll_next_n (&Line_Window, 1);
	     Line_Window.top_window_line = Line_Window.current_line;
	     break;
	     
	   case SL_KEY_NPAGE:
	   case ' ': case 4:
	     SLscroll_pagedown (&Line_Window);
	     break;

	   case SL_KEY_PPAGE:
	   case 127: case 21:
	     SLscroll_pageup (&Line_Window);
	     break;

	   case APP_KEY_BOB:
	     while (-1 != SLscroll_pageup (&Line_Window))
	       ;
	     break;
	     
	   case APP_KEY_EOB:
	     while (-1 != SLscroll_pagedown (&Line_Window))
	       ;
	     break;
	     
	   default:
	     SLtt_beep ();
	  }
	 }

sub update {
	$sl->sig_block_signals;
	my ($row,$nrows);

	Line_Window.nrows = nrows = SLtt_Screen_Rows - 1;

	if (Line_Window.top_window_line != NULL) {
		Line_Window.current_line = Line_Window.top_window_line;
	}

	SLscroll_find_top (&Line_Window);
	
	$row = 0;
	my $line = (File_Line_Type *) Line_Window.top_window_line;
	
	$sl->smg_normal_video;
	
	while($row < Line_Window.nrows) {
	
		$sl->smg_gotorc($row,0);
	
		if (defined $line and $line !~ /^\s*$/) {
			$sl->smg_write_string($line->data);
			$line = line->next;
		}

		$sl->smg_erase_eol;
		$row++;
	}
	
	$sl->smg_gotorc($row,0);
	$sl->smg_reverse_video;
	$sl->smg_printf ("%s", (File_Name == NULL) ? "<stdin>" : File_Name);
	$sl->smg_erase_eol;
	$sl->smg_refresh;
	
	$sl->SLsig_unblock_signals;
}
