--- /dev/null
+# s-lang output for DCT, by Shiar
+
+# 1.12.0 200411032145 - define main loop
+# - use slang key reading functions
+# 1.11.0 200410291300 -
+
+use strict;
+use warnings;
+
+use Term::Slang qw(:all);
+
+push @{$hook{init}}, sub {
+ SLtt_get_terminfo and exit;
+ SLang_init_tty(-1, 0, 1);
+ SLsmg_init_smg;
+
+ END { SLsmg_reset_smg; SLang_reset_tty; } # shutdown display system
+
+ # where are $SLtt_Screen_Rows and $SLtt_Screen_Cols?
+ ($set{height}, $set{width}) = SLtt_get_screen_size;
+ $set{height} -= 2;
+}; # init
+
+push @{$hook{showerror}}, sub {
+ my $error = shift;
+ SLsmg_draw_box(0, 0, 3, length($error)+4);
+ SLsmg_gotorc(1, 1);
+ SLsmg_write_string(" $error ");
+ SLsmg_refresh;
+
+ SLang_getkey; # wait for confirm
+ SLang_getkey while SLang_input_pending(0)==1; # clear key buffer
+}; # showerror
+
+push @{$hook{showstack}}, sub {
+ for (0..@stack-1) {
+ SLsmg_gotorc($set{height}-$_, 1);
+ SLsmg_write_string("$_: ".showval($stack[$_], $set{base})); # prompt
+ SLsmg_erase_eol;
+ } # show stack
+ SLsmg_gotorc($set{height}-@stack, 1);
+ SLsmg_erase_eol;
+}; # showstack
+
+push @{$hook{refresh}}, sub {
+ SLsmg_cls;
+ SLsmg_gotorc($set{height}+1, 0);
+ SLsmg_write_string("> "); # prompt
+}; # refresh
+
+push @{$hook{showentry}}, sub {
+ SLsmg_gotorc($set{height}+1, 2);
+ SLsmg_write_string($_[0]);
+ SLsmg_erase_eol;
+ SLsmg_refresh;
+}; # showentry
+
+$hook{main} = sub {
+ while (1) {
+ draw();
+
+ my $key = chr SLang_getkey; # wait for user input
+ if ($key eq chr 27) {
+ $key .= chr SLang_getkey while SLang_input_pending(0)==1; # read additional keys
+ } # escape sequence
+# error(join " ", map ord, split //, $key); #debug
+ onkey($key);
+ } # input loop
+}; # main
+
+return {
+ author => "Shiar",
+ title => "slang output",
+ version => "1.12",
+};
+