--- /dev/null
+# menu for DCT, by Shiar
+
+# 1.06.1 200409152332 - moved @menus from 1.6 main
+# 1.09.1 200410112150 - everything related to menus moved here
+# 1.10.1 200410122210 - @menus global; unit+math items added in those modules
+# .2 200410122345 - addmenu() function to add submenus
+# .3 200410150030 - don't show undefined menu entries (skippable)
+# .4 200410150030 - add quit at F10 in main menu (after running other modules)
+
+use strict;
+use warnings;
+
+my %falias = (
+ "\033" => 0, # esc
+ "\033\117\120" => 1, # f1
+ "\033\133\061\061\176" => 1, # f1
+ "\033\133\061\062\176" => 2, # f2
+ "\033\133\061\063\176" => 3, # f3
+ "\033\133\061\064\176" => 4, # f4
+ "\033\117\121" => 2, # f2
+ "\033\117\122" => 3, # f3
+ "\033\117\123" => 4, # f4
+ "\033\133\061\065\176" => 5, # f5
+ "\033\133\061\067\176" => 6, # f6
+ "\033\133\061\070\176" => 7, # f7
+ "\033\133\061\071\176" => 8, # f8
+ "\033\133\062\060\176" => 9, # f9
+ "\033\133\062\061\176" => 10, # f10
+ "\033\133\062\063\176" => 11, # f11/F1
+ "\033\133\062\064\176" => 12, # f12/F2
+ "\033\133\062\065\176" => 13, # F3
+ "\033\133\062\066\176" => 14, # F4
+ "\033\133\062\070\176" => 15, # F5
+ "\033\133\062\071\176" => 16, # F6
+ "\033\133\063\061\176" => 17, # F7
+ "\033\133\063\062\176" => 18, # F8
+ "\033\133\063\063\176" => 19, # F9
+ "\033\133\063\064\176" => 20, # F10
+ "\033\133\062\063\073\062\176" => 21, # F11
+ "\033\133\062\064\073\062\176" => 22, # F12
+ "\033\061" => 1, # alt+1
+ "\033\062" => 2, # alt+2
+ "\033\063" => 3, # alt+3
+ "\033\064" => 4, # alt+4
+ "\033\065" => 5, # alt+5
+ "\033\066" => 6, # alt+6
+ "\033\067" => 7, # alt+7
+ "\033\070" => 8, # alt+8
+ "\033\071" => 9, # alt+9
+ "\033\060" => 10, # alt+0
+); # %falias
+
+#our @menus = ([qw(refresh quit)]);
+our @menus = (
+ [qw(refresh prog> mode>1)], # main
+ [qw(main>0 number_format angle_measure coord_system)], #1 mode
+); # @menus
+
+sub addmenu {
+ my $parent = shift;
+ push @menus, ["$parent->[0]>$parent->[1]"]; # create new menu
+ my $menuthis = $#menus;
+ push @{$menus[$parent->[1]]}, shift(@_).">$menuthis"; # link from parent
+ ref $_ ? addmenu([$_->[0], $menuthis], @$_) # add subsubmenu
+ : push @{$menus[$menuthis]}, $_ for @_; # add menu items
+ return $menuthis;
+} # addmenu
+
+#my @menu = [];
+my @menu;
+my $menumin = 0;
+
+push @{$hook{init}}, sub {
+ $menus[0][10] = "quit";
+ @menu = @{$menus[0]};
+ $set{height}--; # make space for menubar
+ $set{menushow} = int($set{width}/(4+$set{width}/20))+1 # menu items to show simultaneously
+ unless defined $set{menushow};
+}; # init
+
+sub showmenu() {
+ clrtoeol($set{height}+2, 1);
+ my $nr = -1;
+ for (grep exists $menu[$_], $menumin+1..$menumin+$set{menushow}) {
+ $nr++;
+ next unless defined $menu[$_];
+ my $sub = (my $s = $menu[$_]) =~ s/>\d+$//;
+ addstr($set{height}+2, $set{width}/$set{menushow}*$nr, $_);
+ attron(A_REVERSE);
+ addstr($s);
+ attroff(A_REVERSE);
+ addch('>') if $sub; # indicate submenu
+ } # display menu txts
+} # showmenu
+
+$action{more} = [-1, sub {
+ $menumin += $set{menushow};
+ $menumin = 0 if $menumin>=$#menu;
+ showmenu();
+}]; # tab
+
+push @{$hook{refresh}}, sub {
+ showmenu();
+}; # refresh
+
+unshift @{$hook{precmd}}, sub {
+ return unless exists $falias{$_}; # not a function key
+ return if $_ = $menu[$falias{$_}]; # execute found menu item instead
+ error("* no such menu entry *");
+ goto DRAW;
+}; # precmd
+
+push @{$hook{precmd}}, sub {
+ return unless />(\d+)$/;
+ @menu = @{$menus[$1]}; # go to submenu
+ $menumin = 0; # reset to first item
+ showmenu(); # redraw
+ return 1;
+}; # precmd
+
+return {
+ author => "Shiar",
+ title => "menu",
+ version => "1.10.4",
+};
+