home *** CD-ROM | disk | FTP | other *** search
/ Caldera Network Desktop 1.0 / caldera-network-desktop-1.0.bin / images / ramdisk2-beta.img / usr / lib / perl / dialog < prev    next >
Text File  |  1995-12-04  |  12KB  |  471 lines

  1. # Functions that handle calling dialog(1) -*-perl-*-
  2.  
  3. # Return values are 1 for success and 0 for failure (or cancel)
  4. # Resultant text (if any) is in dialog_result
  5.  
  6. # Unfortunately, the gauge requires use of /bin/sh to get going.
  7. # I didn't bother to make the others shell-free, although it
  8. # would be simple to do.
  9.  
  10. # Note that dialog generally returns 0 for success, so I invert the
  11. # sense of the return code for more readable boolean expressions.
  12.  
  13. $scr_lines = 24;
  14.  
  15. require "flush.pl";
  16.  
  17. sub rhs_clear {
  18.     return system("dialog --clear");
  19. }
  20.  
  21. sub rhs_textbox {
  22.     local ( $title, $file, $width, $height ) = @_;
  23.  
  24.     system("dialog --title \"$title\" --textbox $file $height $width");
  25.  
  26.     return 1;
  27. }
  28.  
  29. sub rhs_msgbox {
  30.     local ( $title, $message, $width ) = @_;
  31.     local ( $tmp, $height, $message_len );
  32.  
  33.     $message = &rhs_wordwrap($message, $width);
  34.     $message_len = split(/^/, $message);
  35.     $tmp = $message;
  36.     if (chop($tmp) eq "\n") {
  37.     $message_len++;
  38.     }
  39.     $height = 4 + $message_len;
  40.  
  41.     $tmp = system("dialog --title \"$title\" --msgbox \"$message\" $height $width");
  42.     if ($tmp) {
  43.     return 0;
  44.     } else {
  45.     return 1;
  46.     }
  47. }
  48.  
  49. sub rhs_infobox {
  50.     local ( $title, $message, $width ) = @_;
  51.     local ( $tmp, $height, $message_len );
  52.  
  53.     $message = &rhs_wordwrap($message, $width);
  54.     $message_len = split(/^/, $message);
  55.     $tmp = $message;
  56.     if (chop($tmp) eq "\n") {
  57.     $message_len++;
  58.     }
  59.     $height = 2 + $message_len;
  60.  
  61.     return system("dialog --title \"$title\" --infobox \"$message\" $height $width");
  62. }
  63.  
  64. sub rhs_yesno {
  65.     local ( $title, $message, $width ) = @_;
  66.     local ( $tmp, $height, $message_len );
  67.  
  68.     $message = &rhs_wordwrap($message, $width);
  69.     $message_len = split(/^/, $message);
  70.     $tmp = $message;
  71.     if (chop($tmp) eq "\n") {
  72.     $message_len++;
  73.     }
  74.     $height = 4 + $message_len;
  75.  
  76.     $tmp = system("dialog --title \"$title\" --yesno \"$message\" $height $width");
  77.     # Dumb: dialog returns 0 for "yes" and 1 for "no"
  78.     if (! $tmp) {
  79.     return 1;
  80.     } else {
  81.     return 0;
  82.     }
  83. }
  84.  
  85. sub rhs_gauge {
  86.     local ( $title, $message, $width, $percent ) = @_;
  87.     local ( $tmp, $height, $message_len );
  88.  
  89.     $gauge_width = $width;
  90.  
  91.     $message = &rhs_wordwrap($message, $width);
  92.     $message_len = split(/^/, $message);
  93.     $tmp = $message;
  94.     if (chop($tmp) eq "\n") {
  95.     $message_len++;
  96.     }
  97.     $height = 5 + $message_len;
  98.  
  99.     open(GAUGE, "|dialog --title \"$title\" --gauge \"$message\" $height $width $percent");
  100. }
  101.  
  102. sub rhs_update_gauge {
  103.     local ( $percent ) = @_;
  104.  
  105.     &printflush(GAUGE, "$percent\n");
  106. }
  107.  
  108. sub rhs_update_gauge_and_message {
  109.     local ( $message, $percent ) = @_;
  110.  
  111.     $message = &rhs_wordwrap($message, $gauge_width);
  112.     $message =~ s/\n/\\n/g;
  113.     &printflush(GAUGE, "XXX\n$percent\n$message\nXXX\n");
  114. }
  115.  
  116. sub rhs_stop_gauge {
  117.     close GAUGE;
  118. }
  119.  
  120. sub rhs_inputbox {
  121.     local ( $title, $message, $width, $instr ) = @_;
  122.     local ( $tmp, $height, $message_len, $result);
  123.  
  124.     $message = &rhs_wordwrap($message, $width);
  125.     $message_len = split(/^/, $message);
  126.     $tmp = $message;
  127.     if (chop($tmp) eq "\n") {
  128.     $message_len++;
  129.     }
  130.     $height = 7 + $message_len;
  131.  
  132.     $result = &return_output(0, "dialog --title \"$title\" --inputbox \"$message\" $height $width \"$instr\"");
  133.     while (($dialog_result =~ /\"/) ||
  134.            ($dialog_result =~ /\'/) ||
  135.            ($dialog_result =~ /\`/) ||
  136.            ($dialog_result =~ /\|/) ||
  137.            ($dialog_result =~ /\;/) ||
  138.            ($dialog_result =~ /\&/) ||
  139.            ($dialog_result =~ /\>/) ||
  140.            ($dialog_result =~ /\</) ||
  141.            ($dialog_result =~ /\*/)) {
  142.     &rhs_msgbox("Malformed Input",
  143. <<EOM
  144. >
  145. Please do not enter text with of the following characters:
  146. >
  147. \' \\" \\` \| \; \& \> \< \*
  148. >
  149. EOM
  150.             , 50);
  151.     $result = &return_output(0, "dialog --title \"$title\" --inputbox \"$message\" $height $width \"$instr\"");
  152.     $_ = $result;
  153.     }
  154.  
  155.     return $result;
  156. }
  157.  
  158. sub rhs_menu {
  159.     local ( $title, $message, $width, $numitems ) = @_;
  160.     local ( $i, $tmp, $ent, $height, $menuheight, @list, $message_len );
  161.  
  162.     shift; shift; shift; shift;
  163.  
  164.     @list = ();
  165.     for ($i = 0; $i < $numitems; $i++) {
  166.         $ent = shift;
  167.         $list[@list] = "\"$ent\"";
  168.     $ent = shift;
  169.         $list[@list] = "\"$ent\"";
  170.     }
  171.  
  172.     $message = &rhs_wordwrap($message, $width);
  173.  
  174.     $message_len = split(/^/, $message);
  175.     $tmp = $message;
  176.     if (chop($tmp) eq "\n") {
  177.     $message_len++;
  178.     }
  179.     
  180.     $height = $message_len + 6 + $numitems;
  181.     if ($height <= $scr_lines) {
  182.         $menuheight = $numitems;
  183.     } else {
  184.         $height = $scr_lines;
  185.         $menuheight = $scr_lines - $message_len - 6;
  186.     }
  187.  
  188.     return &return_output(0, "dialog --title \"$title\" --menu \"$message\" $height $width $menuheight @list");
  189. }
  190.  
  191. sub rhs_menul {
  192.     local ( $title, $message, $width, $numitems ) = @_;
  193.     local ( $i, $tmp, $ent, $height, $menuheight, @list, $message_len );
  194.  
  195.     shift; shift; shift; shift;
  196.  
  197.     @list = ();
  198.     for ($i = 0; $i < $numitems; $i++) {
  199.         $ent = shift;
  200.         $list[@list] = "\"$ent\"";
  201.         $list[@list] = "\"\"";
  202.     }
  203.  
  204.     $message = &rhs_wordwrap($message, $width);
  205.  
  206.     $message_len = split(/^/, $message);
  207.     $tmp = $message;
  208.     if (chop($tmp) eq "\n") {
  209.     $message_len++;
  210.     }
  211.  
  212.     $height = $message_len + 6 + $numitems;
  213.     if ($height <= $scr_lines) {
  214.         $menuheight = $numitems;
  215.     } else {
  216.         $height = $scr_lines;
  217.         $menuheight = $scr_lines - $message_len - 6;
  218.     }
  219.  
  220.     return &return_output(0, "dialog --title \"$title\" --menu \"$message\" $height $width $menuheight @list");
  221. }
  222.  
  223. sub rhs_menua {
  224.     local ( $title, $message, $width, %items ) = @_;
  225.     local ( $tmp, $ent, $height, $menuheight, @list, $message_len );
  226.  
  227.     @list = ();
  228.     foreach $ent (sort keys (%items)) {
  229.         $list[@list] = "\"$ent\"";
  230.         $list[@list] = "\"$items{$ent}\"";
  231.     }
  232.  
  233.     $message = &rhs_wordwrap($message, $width);
  234.  
  235.     $message_len = split(/^/, $message);
  236.     $tmp = $message;
  237.     if (chop($tmp) eq "\n") {
  238.     $message_len++;
  239.     }
  240.  
  241.     $numitems = keys(%items);
  242.     $height = $message_len + 6 + $numitems;
  243.     if ($height <= $scr_lines) {
  244.         $menuheight = $numitems;
  245.     } else {
  246.         $height = $scr_lines;
  247.         $menuheight = $scr_lines - $message_len - 6;
  248.     }
  249.  
  250.     return &return_output(0, "dialog --title \"$title\" --menu \"$message\" $height $width $menuheight @list");
  251. }
  252.  
  253. sub rhs_checklist {
  254.     local ( $title, $message, $width, $numitems ) = @_;
  255.     local ( $i, $tmp, $ent, $height, $menuheight, @list, $message_len );
  256.  
  257.     shift; shift; shift; shift;
  258.  
  259.     @list = ();
  260.     for ($i = 0; $i < $numitems; $i++) {
  261.         $ent = shift;
  262.         $list[@list] = "\"$ent\"";
  263.         $ent = shift;
  264.         $list[@list] = "\"$ent\"";
  265.         $ent = shift;
  266.     if ($ent) {
  267.         $list[@list] = "ON";
  268.     } else {
  269.         $list[@list] = "OFF";
  270.     }
  271.     }
  272.  
  273.     $message = &rhs_wordwrap($message, $width);
  274.  
  275.     $message_len = split(/^/, $message);
  276.     $tmp = $message;
  277.     if (chop($tmp) eq "\n") {
  278.     $message_len++;
  279.     }
  280.     
  281.     $height = $message_len + 6 + $numitems;
  282.     if ($height <= $scr_lines) {
  283.         $menuheight = $numitems;
  284.     } else {
  285.         $height = $scr_lines;
  286.         $menuheight = $scr_lines - $message_len - 6;
  287.     }
  288.  
  289.     return &return_output("list", "dialog --title \"$title\" --separate-output --checklist \"$message\" $height $width $menuheight @list");
  290. }
  291.  
  292. sub rhs_checklistl {
  293.     local ( $title, $message, $width, $numitems ) = @_;
  294.     local ( $i, $tmp, $ent, $height, $menuheight, @list, $message_len );
  295.  
  296.     shift; shift; shift; shift;
  297.  
  298.     @list = ();
  299.     for ($i = 0; $i < $numitems; $i++) {
  300.         $ent = shift;
  301.         $list[@list] = "\"$ent\"";
  302.         $list[@list] = "\"\"";
  303.     $list[@list] = "OFF";
  304.     }
  305.  
  306.     $message = &rhs_wordwrap($message, $width);
  307.  
  308.     $message_len = split(/^/, $message);
  309.     $tmp = $message;
  310.     if (chop($tmp) eq "\n") {
  311.     $message_len++;
  312.     }
  313.     
  314.     $height = $message_len + 6 + $numitems;
  315.     if ($height <= $scr_lines) {
  316.         $menuheight = $numitems;
  317.     } else {
  318.         $height = $scr_lines;
  319.         $menuheight = $scr_lines - $message_len - 6;
  320.     }
  321.     return &return_output("list", "dialog --title \"$title\" --separate-output --checklist \"$message\" $height $width $menuheight @list");
  322. }
  323.  
  324. sub rhs_checklista {
  325.     local ( $title, $message, $width, %items ) = @_;
  326.     local ( $tmp, $ent, $height, $menuheight, @list, $message_len );
  327.  
  328.     shift; shift; shift; shift;
  329.  
  330.     @list = ();
  331.     foreach $ent (sort keys (%items)) {
  332.     $list[@list] = "\"$ent\"";
  333.     $list[@list] = "\"$items{$ent}\"";
  334.     $list[@list] = "OFF";
  335.     }
  336.  
  337.     $message = &rhs_wordwrap($message, $width);
  338.  
  339.     $message_len = split(/^/, $message);
  340.     $tmp = $message;
  341.     if (chop($tmp) eq "\n") {
  342.     $message_len++;
  343.     }
  344.     
  345.     $numitems = keys(%items);
  346.     $height = $message_len + 6 + $numitems;
  347.     if ($height <= $scr_lines) {
  348.         $menuheight = $numitems;
  349.     } else {
  350.         $height = $scr_lines;
  351.         $menuheight = $scr_lines - $message_len - 6;
  352.     }
  353.  
  354.     return &return_output("list", "dialog --title \"$title\" --separate-output --checklist \"$message\" $height $width $menuheight @list");
  355. }
  356.  
  357. sub rhs_radiolist {
  358.     local ( $title, $message, $width, $numitems ) = @_;
  359.     local ( $i, $tmp, $ent, $height, $menuheight, @list, $message_len );
  360.  
  361.     shift; shift; shift; shift;
  362.  
  363.     @list = ();
  364.     for ($i = 0; $i < $numitems; $i++) {
  365.         $ent = shift;
  366.         $list[@list] = "\"$ent\"";
  367.         $ent = shift;
  368.         $list[@list] = "\"$ent\"";
  369.         $ent = shift;
  370.     if ($ent) {
  371.         $list[@list] = "ON";
  372.     } else {
  373.         $list[@list] = "OFF";
  374.     }
  375.     }
  376.  
  377.     $message = &rhs_wordwrap($message, $width);
  378.  
  379.     $message_len = split(/^/, $message);
  380.     $tmp = $message;
  381.     if (chop($tmp) eq "\n") {
  382.     $message_len++;
  383.     }
  384.  
  385.     $height = $message_len + 6 + $numitems;
  386.     if ($height <= $scr_lines) {
  387.         $menuheight = $numitems;
  388.     } else {
  389.         $height = $scr_lines;
  390.         $menuheight = $scr_lines - $message_len - 6;
  391.     }
  392.  
  393.     return &return_output(0 , "dialog --title \"$title\" --radiolist \"$message\" $height $width $menuheight @list");
  394. }
  395.  
  396. sub return_output {
  397.     local ( $listp, $command ) = @_;
  398.     local ( $res );
  399.  
  400.     open(SAVESTDERR, ">&STDERR");
  401.     open(STDERR, ">/tmp/dialogout");
  402.     $res = system($command);
  403.     close(STDERR);
  404.     open(STDERR, ">&SAVESTDERR");
  405.     
  406.     open(IN, "/tmp/dialogout");
  407.     if ($listp) {
  408.     @dialog_result = ();
  409.     while (<IN>) {
  410.         chop;
  411.         $dialog_result[@dialog_result] = $_;
  412.     }
  413.     } else {
  414.     $dialog_result = <IN>;
  415.     }
  416.     close(IN);
  417.     unlink("/tmp/dialogout");
  418.  
  419.     # Again, dialog returns results backwards
  420.     if (! $res) {
  421.     return 1;
  422.     } else {
  423.     return 0;
  424.     }
  425. }
  426.  
  427. sub rhs_wordwrap {
  428.     local ( $intext, $width ) = @_;
  429.     local ( $outtext, $i, $j, @lines, $wrap, @words, $pos, $pad );
  430.  
  431.     $outtext = "";
  432.     $pad = 3;            # leave 3 spaces around each line
  433.     $pos = $pad;        # current insert position
  434.     $wrap = 0;            # 1 if we have been auto wraping
  435.     $insert_nl = 0;        # 1 if we just did an absolute
  436.                 # and we should preface any new text
  437.                 # with a new line
  438.     @lines = split(/\n/, $intext);
  439.     for ($i = 0; $i <= $#lines; $i++) {
  440.         if ($lines[$i] =~ /^>/) {
  441.         $outtext .= "\n" if ($insert_nl);
  442.             $outtext .= "\n" if ($wrap);
  443.         $lines[$i] =~ /^>(.*)$/;
  444.             $outtext .= $1;
  445.         $insert_nl = 1;
  446.             $wrap = 0;
  447.             $pos = $pad;
  448.         } else {
  449.             $wrap = 1;
  450.             @words = split(/\s+/,$lines[$i]);
  451.             for ($j = 0; $j <= $#words; $j++) {
  452.         if ($insert_nl) {
  453.             $outtext .= "\n";
  454.             $insert_nl = 0;
  455.         }
  456.                 if ((length($words[$j]) + $pos) > $width - $pad) {
  457.                     $outtext .= "\n";
  458.                     $pos = $pad;
  459.                 }
  460.                 $outtext .= $words[$j] . " ";
  461.                 $pos += length($words[$j]) + 1;
  462.             }
  463.         }
  464.     }
  465.  
  466.     return $outtext;
  467. }
  468.  
  469. ############
  470. 1;
  471.