home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / mush6.4 / part06 / viewopts.c < prev   
C/C++ Source or Header  |  1989-03-12  |  13KB  |  349 lines

  1. /* @(#)viewopts.c    (c) copyright    10/18/86 (Dan Heller) */
  2.  
  3. #include "mush.h"
  4.  
  5. struct viewopts {
  6.     char *v_opt;
  7.     char *v_prompt;
  8.     int  v_usage;
  9. #define TOOL  01
  10. #define TEXT  02
  11.     char *v_description;
  12. };
  13.  
  14. /*
  15.  * struct contains the option, a prompt if it has a string value, whether
  16.  * or not it applies to non suntools, line mode, or both, and a
  17.  * string describing what the option does. If the prompt string starts
  18.  * with a minus sign, then the value can be set without a value. This
  19.  * is there to indicate to option_line to print a toggle (cycle) pixrect
  20.  * and to print TRUE/FALSE telling whether the value is on or off regardless
  21.  * of it's "string" value.
  22.  */
  23. struct viewopts viewopts[] = {
  24.     { "alwaysignore", NULL, TOOL | TEXT,
  25.     "Always ignore the message headers on the 'ignored' list." },
  26.     { "ask", NULL, TOOL | TEXT,
  27.     "Prompts for a subject on outgoing mail." },
  28.     { "askcc", NULL, TOOL | TEXT,
  29.     "Ask for list of Carbon Copy recipients whenever sending mail." },
  30.     { "autodelete", NULL, TOOL | TEXT,
  31.     "Automatically delete ALL READ messages whenever you update mail." },
  32.     { "autoedit", NULL, TOOL | TEXT,
  33.     "Automatically enter editor whenever you REPLY to mail." },
  34.     { "autoinclude", NULL, TOOL | TEXT,
  35.     "Include a copy of author's message each time you reply to mail." },
  36.     { "autoprint", NULL, TOOL | TEXT,
  37.     "Display the next message on the list when you delete a message." },
  38.     { "auto_route", NULL, TOOL | TEXT,
  39.     "Remove redundant uucp addresses when replying to messages." },
  40.     { "autosign", "-Filename", TOOL | TEXT,
  41.     "Add file (~/.signature if set but no value) at end of all letters." },
  42.     { "autosign2", "Address : Filename", TOOL | TEXT,
  43.     "Signature to use for specific addresses. \"addr, ... : <signature>\""},
  44.     { "cdpath", "Path", TEXT,
  45.     "Path to search for directories when the \"cd\" command is issued." },
  46.     { "crt", "Lines", TEXT,
  47.     "The number of lines a message must have for 'pager' to be invoked." },
  48.     { "date_received", NULL, TOOL | TEXT,
  49.     "Time displayed for message headers shows date received (or sent)." },
  50.     { "dead", "Filename", TOOL | TEXT,
  51.     "The name of the file to store dead mail (default = ~/dead.letter)." },
  52.     { "dot", NULL, TOOL | TEXT,
  53.     "Allow \".\" on a line by itself to send letter." },
  54.     { "editor", "Editor name/path", TOOL | TEXT,
  55.     "Editor for message editing (default = env EDITOR or \"vi\")." },
  56.     { "escape", "Character", TOOL | TEXT,
  57.     "Escape character for extended editing commands (default = ~)." },
  58.     { "folder", "Pathname", TOOL | TEXT,
  59.     "Full pathname to the directory where personal folders are kept." },
  60.     { "fortune", "-Flag", TOOL | TEXT,
  61.     "Add fortune to end of letters.  Flag to \"fortune\" is optional." },
  62.     { "fortunates", "Users", TOOL | TEXT,
  63.     "Those who will receive fortunes if fortune is set (default: All)." },
  64.     { "hdr_format", "Format", TOOL | TEXT,
  65.     "Formatting string for headers.  \"headers -?\" or help hdr_format." },
  66.     { "history", "Number", TEXT,
  67.     "How many commands to remember (like csh)." },
  68.     { "hold", NULL, TOOL | TEXT,
  69.     "Read but not deleted messages are saved in spool -- not mbox." },
  70.     { "home", "Directory", TOOL | TEXT,
  71.     "The user's home directory." },
  72.     { "hostname", "Hostname", TOOL | TEXT,
  73.     "User-definable name for the name of your machine." },
  74.     { "ignore_bang", NULL, TEXT,
  75.     "Ignore '!' as a history reference.  Otherwise, escape by: \\!" },
  76.     { "ignoreeof", "-Command", TEXT,
  77.     "Ignores ^D as exit, or (if set), execute \"command\"." },
  78.     { "indent_str", "String", TOOL | TEXT,
  79.     "String to offset included messages within your letters." },
  80.     { "in_reply_to", NULL, TOOL | TEXT,
  81.     "When responding to mail, add In-Reply-To: to message headers." },
  82.     { "keepsave", NULL, TOOL | TEXT,
  83.     "Prevents messages from being marked as `deleted' when you `save'." },
  84.     { "known_hosts", "Host list", TOOL | TEXT,
  85.     "List of hosts that your site is known to uucp mail to." },
  86.     { "lister", "Arguments", TOOL | TEXT,
  87.     "Arguments passed to the 'ls' command." },
  88.     { "logfile", "Filename", TOOL | TEXT,
  89.     "Log outgoing mail headers only.  Message text not logged." },
  90.     { "mbox", "Filename", TOOL | TEXT,
  91.     "Filename to use instead of ~/mbox for default mailbox." },
  92.     { "metoo", NULL, TOOL | TEXT,
  93.     "When replying to mail, metoo preserves your name on mailing list." },
  94.     { "mil_time", NULL, TOOL | TEXT,
  95.     "24-hour military time format is used whenever a time is printed. " },
  96.     { "newline", "-Command", TEXT,
  97.     "Ignore RETURN.  If set to a command, execute that command." },
  98.     { "no_expand", NULL, TEXT | TOOL,
  99.     "Prevents expansion of Mush aliases in outgoing mail headers." },
  100.     { "no_hdrs", NULL, TOOL | TEXT,
  101.     "If set, personalized headers are NOT inserted to outgoing mail." },
  102.     { "no_reverse", NULL, TOOL | TEXT,
  103.     "Disables reverse video in curses mode -- uses \"bold\" in tool mode."},
  104.     { "nonobang", NULL, TEXT,
  105.     "Suppresses errors from unsuccessful history references." },
  106.     { "nosave", NULL, TOOL | TEXT,
  107.     "Prevents aborted mail from being saved in $dead." },
  108.     { "pager", "Program", TEXT,
  109.     "Program name to be used as a pager for messages longer than crt." },
  110.     { "pre_indent_str", "String", TEXT | TOOL,
  111.     "String to precede message text interpolated into message body." },
  112.     { "post_indent_str", "String", TEXT | TOOL,
  113.     "String to succeed message text interpolated into message body." },
  114.     { "print_cmd", "Program", TOOL | TEXT,
  115.     "Alternate program to use to send messages to the printer." },
  116.     { "printer", "Printer", TOOL | TEXT,
  117.     "Printer to send messages to (default = environment PRINTER)." },
  118.     { "prompt", "String", TEXT,
  119.     "Your prompt.  \"help prompt\" for more information." },
  120.     { "quiet", NULL, TEXT,
  121.     "Don't print the version number of Mush on startup." },
  122.     { "realname", "Name:", TOOL | TEXT,
  123.     "Your real name." },
  124.     { "record", "Filename", TOOL | TEXT,
  125.     "Save all outgoing mail in specified filename." },
  126.     { "reply_to_hdr", "Headers", TOOL | TEXT,
  127.     "List of headers use to construct reply addresses from a message." },
  128.     { "save_empty", NULL, TOOL | TEXT,
  129.     "Folders which have all messages deleted are NOT removed on updates." },
  130.     { "screen", "Number of Headers", TEXT,
  131.     "Number of headers to print in non-suntools (text) mode." },
  132.     { "screen_win", "Number of Headers", TOOL,
  133.     "Set the size of the header window for the tool mode only." },
  134.     { "show_deleted", NULL, TOOL | TEXT,
  135.     "Show deleted messages in headers listings (unused in curses mode)." },
  136.     { "show_hdrs", "Headers", TOOL | TEXT,
  137.     "When displaying a message, show list of \"headers\" only." },
  138.     { "sendmail", "Program", TOOL | TEXT,
  139.     "Program to use to deliver mail instead of using the default."},
  140.     { "sort", "-Option", TOOL | TEXT,
  141.     "Pre-sorting of messages on mush startup (set to valid sort option)." },
  142.     { "squeeze", NULL, TOOL | TEXT,
  143.     "When reading messages, squeeze all blank lines into one." },
  144.     { "thisfolder", NULL, TEXT,
  145.     "This read-only variable gives the current folder name." },
  146.     { "toplines", "Lines", TOOL | TEXT,
  147.     "Number of lines to print of a message for the 'top' command."  },
  148.     { "tmpdir", "Directory", TOOL | TEXT,
  149.     "Directory to use for temporary files used by Mush." },
  150.     { "unix", NULL, TEXT,
  151.     "Non-mush commands are considered to be UNIX commands." },
  152.     { "verify", NULL, TEXT,
  153.     "Verify to send, re-edit, or abort letter after editing." },
  154.     { "visual", "Visual editor", TOOL | TEXT,
  155.     "Visual editor for messages (default = $editor or env VISUAL)."},
  156.     { "warning", NULL, TOOL | TEXT,
  157.     "Print warning messages for non-fatal errors." },
  158.     { "wrap", NULL, TOOL | TEXT,
  159.     "After referencing last message, message pointer wraps to start." },
  160.     { "wrapcolumn", "-Column to wrap [78]", TEXT,
  161.     "Column at which to wrap lines when composing messages." },
  162. };
  163.  
  164. #define total_opts (sizeof viewopts / sizeof (struct viewopts))
  165.  
  166. #ifdef SUNTOOL
  167.  
  168. static int start_cnt;
  169.  
  170. #define twenty     5 + 20*l_width(DEFAULT)
  171. #define forty     5 + 40*l_width(DEFAULT)
  172. #define image_at(x,y,image) pw_rop(msg_win, x, y, 16, 16, PIX_SRC, image, 0,0)
  173.  
  174. /* print in default text, but increment in large text segments */
  175. view_options()
  176. {
  177.     if (msg_rect.r_height < 80) {
  178.     print("Window not big enough to display options.");
  179.     return;
  180.     }
  181.     do_clear();
  182.     getting_opts = 1, start_cnt = 0;
  183.     win_setcursor(msg_sw->ts_windowfd, &checkmark);
  184.     highlight(msg_win, txt.x, txt.y, LARGE,
  185.         "    : Toggle Value       : Description       : Menu (Help)");
  186.     image_at(txt.x +  2 * l_width(DEFAULT), txt.y - 12, &mouse_left);
  187.     image_at(txt.x + 25 * l_width(DEFAULT), txt.y - 12, &mouse_middle);
  188.     image_at(txt.x + 48 * l_width(DEFAULT), txt.y - 12, &mouse_right);
  189.  
  190.     pw_vector(msg_win, 0, txt.y+6, msg_rect.r_width, txt.y+6, PIX_SRC, 1);
  191.     pw_vector(msg_win, 0, txt.y+8, msg_rect.r_width, txt.y+8, PIX_SRC, 1);
  192.  
  193.     txt.y += 24;
  194.  
  195.     pw_text(msg_win, 5,      txt.y, PIX_SRC, fonts[LARGE], "Option");
  196.     pw_text(msg_win, twenty, txt.y, PIX_SRC, fonts[LARGE], "On/Off");
  197.     pw_text(msg_win, forty,  txt.y, PIX_SRC, fonts[LARGE], "Values");
  198.  
  199.     pw_vector(msg_win, 0, txt.y+6, msg_rect.r_width, txt.y+6, PIX_SRC, 1);
  200.     pw_vector(msg_win, 0, txt.y+8, msg_rect.r_width, txt.y+8, PIX_SRC, 1);
  201.  
  202.     pw_text(msg_win, 59*l_width(DEFAULT),txt.y,PIX_SRC,fonts[LARGE],"Scroll:");
  203.     pw_rop(msg_win, 60*l_width(LARGE), txt.y-13,16,16,PIX_SRC, &dn_arrow,0,0);
  204.     pw_rop(msg_win, 60*l_width(LARGE)+20,txt.y-13,16,16,PIX_SRC, &up_arrow,0,0);
  205.  
  206.     display_opts(0); /* create the pixrect and all that */
  207. }
  208.  
  209. display_opts(count)
  210. register int count;
  211. {
  212.     register int total_displayable = (msg_rect.r_height - 60) / 20;
  213.  
  214.     if (count < 0 && start_cnt + count < 0) {
  215.     print("At the beginning");
  216.     return;
  217.     } else if (count && start_cnt + count + total_displayable > total_opts) {
  218.     print("At the end");
  219.     return;
  220.     }
  221.     start_cnt += count;
  222.     if (!msg_pix) {
  223.     register int x = (total_opts+1) * 20;
  224.     if (x < msg_rect.r_height)
  225.         x = msg_rect.r_height;
  226.     if (!(msg_pix = mem_create(msg_rect.r_width, x, 1))) {
  227.         error("mem_create");
  228.         return;
  229.     }
  230.     pr_rop(msg_pix,0,0, msg_rect.r_width-1, x-1, PIX_CLR,0,0,0);
  231.     for (count = 0; count < total_opts; count++)
  232.         option_line(count);
  233.     }
  234.     pw_rop(msg_win, 0, 50, msg_rect.r_width - 1, msg_rect.r_height - 50,
  235.        PIX_SRC, msg_pix, 0, start_cnt * 20);
  236. }
  237.  
  238. void
  239. toggle_opt(line)
  240. {
  241.     register char *p = viewopts[start_cnt+line].v_prompt;
  242.  
  243.     if (do_set(set_options, viewopts[start_cnt+line].v_opt))
  244.     un_set(&set_options, viewopts[start_cnt+line].v_opt);
  245.     else {
  246.     if (p) {
  247.         txt.x = 5 + 40 * l_width(DEFAULT) +
  248.             (1 + strlen(p) - (*p=='-')) * l_width(DEFAULT);
  249.         txt.y = 50 + line*20 + l_height(curfont);
  250.     }
  251.     if (!p || *p == '-') {
  252.         register char *argv[2];
  253.         argv[0] = viewopts[start_cnt+line].v_opt;
  254.         argv[1] = NULL;
  255.         (void) add_option(&set_options, argv);
  256.     }
  257.     }
  258.     option_line(line);
  259.     display_opts(0);
  260.     if (txt.x > 5)
  261.     type_cursor(PIX_SRC);
  262. }
  263.  
  264. void
  265. help_opt(line)
  266. {
  267.     print(viewopts[start_cnt+line].v_description);
  268. }
  269.  
  270. add_opt(p, line)
  271. register char *p;
  272. {
  273.     char buf[80], **argv;
  274.     int argc;
  275.     u_long save_bang = ison(glob_flags, IGN_BANG);
  276.  
  277.     (void) sprintf(buf, "set %s=\"%s\"", viewopts[start_cnt+line].v_opt, p);
  278.     turnon(glob_flags, IGN_BANG);
  279.     if (argv = make_command(buf, DUBL_NULL, &argc))
  280.     (void) do_command(argc, argv, msg_list);
  281.     if (!save_bang)
  282.     turnoff(glob_flags, IGN_BANG);
  283.     option_line(line); /* make sure new value is entered into database */
  284. }
  285.  
  286. option_line(count)
  287. register int count;
  288. {
  289.     register char *p, *v = do_set(set_options, viewopts[start_cnt+count].v_opt);
  290.     struct pr_prpos win;
  291.  
  292.     win.pr = msg_pix;
  293.     win.pos.y = (start_cnt + count) * 20 + 16;
  294.     win.pos.x = 5;
  295.  
  296.     pf_text(win, PIX_SRC, fonts[DEFAULT], blank);
  297.     pf_text(win, PIX_SRC, fonts[DEFAULT], viewopts[start_cnt+count].v_opt);
  298.     win.pos.x = twenty+20;
  299.  
  300.     if (!(p = viewopts[start_cnt+count].v_prompt) || *p == '-') {
  301.     pr_rop(msg_pix, twenty, win.pos.y-10, 16, 16, PIX_SRC, &cycle, 0, 0);
  302.     pf_text(win, PIX_SRC, fonts[DEFAULT], (v)? "TRUE  ": "FALSE");
  303.     win.pos.x++;
  304.     pf_text(win, PIX_SRC, fonts[DEFAULT], (v)? "TRUE  ": "FALSE");
  305.     }
  306.     if (p) {
  307.     if (*p == '-')
  308.         p++;
  309.     win.pos.x = forty;
  310.     /* highlight */
  311.     pf_text(win, PIX_SRC, fonts[DEFAULT], p);
  312.     win.pos.x++;
  313.     pf_text(win, PIX_SRC, fonts[DEFAULT], p);
  314.         win.pos.x = forty + strlen(p) * l_width(DEFAULT);
  315.     pf_text(win, PIX_SRC, fonts[DEFAULT], ":");
  316.     if (v) {
  317.         win.pos.x += (2 * l_width(DEFAULT));
  318.         pf_text(win, PIX_SRC, fonts[DEFAULT], v);
  319.     }
  320.     }
  321. }
  322.  
  323. #endif /* SUNTOOL */
  324.  
  325. /*
  326.  * return a string describing a variable.
  327.  * parameters: count, str, buf.
  328.  * If str != NULL, check str against ALL variables
  329.  * in viewopts array.  The one that matches, set count to it and 
  330.  * print up all the stuff from the viewopts[count] into the buffer
  331.  * space in "buf" and return it.
  332.  */
  333. char *
  334. variable_stuff(count, str, buf)
  335. register char *str, buf[];
  336. {
  337.     if (str)
  338.     for (count = 0; count < total_opts; count++)
  339.         if (!strcmp(str, viewopts[count].v_opt))
  340.         break;
  341.     if (count >= total_opts) {
  342.     (void) sprintf(buf, "%s: Not a default %s variable.",
  343.                str? str : itoa(count), prog_name);
  344.     return NULL;
  345.     }
  346.     return sprintf(buf, "%s: %s",
  347.     viewopts[count].v_opt, viewopts[count].v_description);
  348. }
  349.