home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / gnu / foo123 / curses.doc next >
Text File  |  1993-07-29  |  95KB  |  2,461 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                Screen Updating and Cursor Movement Optimization:
  10.                                A Library Package
  11.  
  12.                             _✓K_✓e_✓n_✓n_✓e_✓t_✓h _✓C. _✓R. _✓C. _✓A_✓r_✓n_✓o_✓l_✓d
  13.  
  14.                            Computer Science Division
  15.            Department of Electrical Engineering and Computer Science
  16.                        University of California, Berkeley
  17.                           Berkeley, California  94720
  18.  
  19.  
  20.  
  21.                                     _✓A_✓B_✓S_✓T_✓R_✓A_✓C_✓T
  22.  
  23.  
  24.  
  25.  
  26.  
  27.                This document describes  a  package  of  C  library
  28.           functions which allow the user to:
  29.  
  30.           1)   update a screen with reasonable optimization,
  31.  
  32.           2)   get input from the terminal  in  a  screen-oriented
  33.                fashion, and
  34.  
  35.           3)   independent from the above,  move  the  cursor  op-
  36.                timally from one point to another.
  37.  
  38.                These routines all use the _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5)  database  to
  39.           describe the capabilities of the terminal.
  40.  
  41.           _✓A_✓c_✓k_✓n_✓o_✓w_✓l_✓e_✓d_✓g_✓e_✓m_✓e_✓n_✓t_✓s
  42.  
  43.                This package would not exist without the work  of  Bill
  44.           Joy,  who,  in writing his editor, created the capability to
  45.           generally describe terminals, wrote the routines which  read
  46.           this  database, and, most importantly, those which implement
  47.           optimal cursor movement, which routines I have simply lifted
  48.           nearly  intact.   Doug Merritt and Kurt Shoens also were ex-
  49.           tremely important,  as  were  both  willing  to  waste  time
  50.           listening  to  me rant and rave.  The help and/or support of
  51.           Ken Abrams, Alan Char, Mark Horton, and Joe Kalash, was, and
  52.           is, also greatly appreciated.
  53.  
  54.  
  55.           Revised 16 April 1986
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.           Screen Package                                      PS1:18-3
  72.  
  73.  
  74.           _✓1.  _✓O_✓v_✓e_✓r_✓v_✓i_✓e_✓w
  75.  
  76.                In making available the generalized  terminal  descrip-
  77.           tions  in _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5), much information was made available to
  78.           the programmer, but little  work  was  taken  out  of  one's
  79.           hands.   The  purpose of this package is to allow the C pro-
  80.           grammer to do the most common  type  of  terminal  dependent
  81.           functions, those of movement optimization and optimal screen
  82.           updating, without doing any of the dirty work, and (hopeful-
  83.           ly) with nearly as much ease as is necessary to simply print
  84.           or read things.
  85.  
  86.                The package is split into three parts: (1)  Screen  up-
  87.           dating;  (2) Screen updating with user input; and (3) Cursor
  88.           motion optimization.
  89.  
  90.                It is possible to use the motion  optimization  without
  91.           using either of the other two, and screen updating and input
  92.           can be done without any programmer knowledge of  the  motion
  93.           optimization, or indeed the  database itself.
  94.  
  95.           _✓1._✓1.  _✓T_✓e_✓r_✓m_✓i_✓n_✓o_✓l_✓o_✓g_✓y (_✓o_✓r, _✓W_✓o_✓r_✓d_✓s _✓Y_✓o_✓u _✓C_✓a_✓n _✓S_✓a_✓y  _✓t_✓o  _✓S_✓o_✓u_✓n_✓d  _✓B_✓r_✓i_✓l_✓l_✓i_✓-
  96.           _✓a_✓n_✓t)
  97.  
  98.                In this document, the following terminology is kept  to
  99.           with reasonable consistency:
  100.  
  101.           _✓w_✓i_✓n_✓d_✓o_✓w: An internal representation containing  an  image  of
  102.                what  a section of the terminal screen may look like at
  103.                some point in time.  This subsection can either  encom-
  104.                pass the entire terminal screen, or any smaller portion
  105.                down to a single character within that screen.
  106.  
  107.           _✓t_✓e_✓r_✓m_✓i_✓n_✓a_✓l: Sometimes called _✓t_✓e_✓r_✓m_✓i_✓n_✓a_✓l _✓s_✓c_✓r_✓e_✓e_✓n.   The  package's
  108.                idea  of  what  the  terminal's  screen currently looks
  109.                like, _✓i._✓e., what the user sees now.  This is a  special
  110.                _✓s_✓c_✓r_✓e_✓e_✓n:
  111.  
  112.           _✓s_✓c_✓r_✓e_✓e_✓n: This is a subset of windows which are  as  large  as
  113.                the terminal screen, _✓i._✓e., they start at the upper left
  114.                hand corner and encompass the lower right hand  corner.
  115.                One of these, _✓s_✓t_✓d_✓s_✓c_✓r, is automatically provided for the
  116.                programmer.
  117.  
  118.           _✓1._✓2.  _✓C_✓o_✓m_✓p_✓i_✓l_✓i_✓n_✓g _✓T_✓h_✓i_✓n_✓g_✓s
  119.  
  120.                In order to use the library, it is  necessary  to  have
  121.           certain  types  and  variables defined.  Therefore, the pro-
  122.           grammer must have a line:
  123.  
  124.               #_✓i_✓n_✓c_✓l_✓u_✓d_✓e <_✓c_✓u_✓r_✓s_✓e_✓s._✓h>
  125.  
  126.           at  the  top  of  the  program  source.   The  header   file
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.           PS1:18-4                                      Screen Package
  138.  
  139.  
  140.           <_✓c_✓u_✓r_✓s_✓e_✓s._✓h> needs to include <_✓s_✓g_✓t_✓t_✓y._✓h>, so the one should not
  141.           do so oneself[1].  Also, compilations should have  the  fol-
  142.           lowing form:
  143.  
  144.               _✓c_✓c [ flags ] file ... -_✓l_✓c_✓u_✓r_✓s_✓e_✓s -_✓l_✓t_✓e_✓r_✓m_✓c_✓a_✓p
  145.  
  146.  
  147.           _✓1._✓3.  _✓S_✓c_✓r_✓e_✓e_✓n _✓U_✓p_✓d_✓a_✓t_✓i_✓n_✓g
  148.  
  149.                In order to update the screen optimally, it  is  neces-
  150.           sary  for  the  routines  to  know what the screen currently
  151.           looks like and what the programmer wants  it  to  look  like
  152.           next.   For this purpose, a data type (structure) named _✓W_✓I_✓N_✓-
  153.           _✓D_✓O_✓W is defined which describes a window image  to  the  rou-
  154.           tines,  including  its  starting position on the screen (the
  155.           (y, x) co-ordinates of the upper left hand corner)  and  its
  156.           size.   One of these (called _✓c_✓u_✓r_✓s_✓c_✓r for _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓s_✓c_✓r_✓e_✓e_✓n) is a
  157.           screen image of what  the  terminal  currently  looks  like.
  158.           Another  screen (called _✓s_✓t_✓d_✓s_✓c_✓r, for _✓s_✓t_✓a_✓n_✓d_✓a_✓r_✓d _✓s_✓c_✓r_✓e_✓e_✓n) is pro-
  159.           vided by default to make changes on.
  160.  
  161.                A window is a purely internal  representation.   It  is
  162.           used  to  build  and store a potential image of a portion of
  163.           the terminal.  It doesn't bear  any  necessary  relation  to
  164.           what  is  really on the terminal screen.  It is more like an
  165.           array of characters on which to make changes.
  166.  
  167.                When one has a window which describes  what  some  part
  168.           the  terminal  should  look  like, the routine _✓r_✓e_✓f_✓r_✓e_✓s_✓h() (or
  169.           _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h() if the window is  not  _✓s_✓t_✓d_✓s_✓c_✓r)  is  called.   _✓r_✓e_✓-
  170.           _✓f_✓r_✓e_✓s_✓h()  makes the terminal, in the area covered by the win-
  171.           dow, look like that window.  Note, therefore, that  changing
  172.           something  on a window _✓d_✓o_✓e_✓s _✓n_✓o_✓t _✓c_✓h_✓a_✓n_✓g_✓e _✓t_✓h_✓e _✓t_✓e_✓r_✓m_✓i_✓n_✓a_✓l.  Actual
  173.           updates to the terminal screen are made only by calling  _✓r_✓e_✓-
  174.           _✓f_✓r_✓e_✓s_✓h()  or _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h().  This allows the programmer to main-
  175.           tain several different ideas of what a portion of the termi-
  176.           nal  screen  should look like.  Also, changes can be made to
  177.           windows in any order, without regard to  motion  efficiency.
  178.           Then,  at  will, the programmer can effectively say "make it
  179.           look like this", and let the package worry  about  the  best
  180.           way to do this.
  181.  
  182.           _✓1._✓4.  _✓N_✓a_✓m_✓i_✓n_✓g _✓C_✓o_✓n_✓v_✓e_✓n_✓t_✓i_✓o_✓n_✓s
  183.  
  184.                As hinted above, the routines can use several  windows,
  185.           but  two  are  automatically given: _✓c_✓u_✓r_✓s_✓c_✓r, which knows what
  186.           the terminal looks like, and _✓s_✓t_✓d_✓s_✓c_✓r, which is what the  pro-
  187.           ____________________
  188.              [1] The screen package also uses  the  Standard  I/O  li-
  189.           brary,  so  <_✓c_✓u_✓r_✓s_✓e_✓s._✓h>  includes <_✓s_✓t_✓d_✓i_✓o._✓h>.  It is redundant
  190.           (but harmless) for the programmer to do it, too.
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.           Screen Package                                      PS1:18-5
  204.  
  205.  
  206.           grammer wants the terminal to  look  like  next.   The  user
  207.           should  never really access _✓c_✓u_✓r_✓s_✓c_✓r directly.  Changes should
  208.           be made to the appropriate screen, and then the routine  _✓r_✓e_✓-
  209.           _✓f_✓r_✓e_✓s_✓h() (or _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h()) should be called.
  210.  
  211.                Many functions are set up to deal with _✓s_✓t_✓d_✓s_✓c_✓r as a  de-
  212.           fault  screen.   For  example, to add a character to _✓s_✓t_✓d_✓s_✓c_✓r,
  213.           one calls _✓a_✓d_✓d_✓c_✓h() with the desired  character.   If  a  dif-
  214.           ferent  window  is  to  be  used,  the routine _✓w_✓a_✓d_✓d_✓c_✓h() (for
  215.           _✓window-specific _✓a_✓d_✓d_✓c_✓h()) is provided[2].  This convention of
  216.           prepending function names with a "_✓w" when they are to be ap-
  217.           plied to specific windows is consistent.  The only  routines
  218.           which do _✓n_✓o_✓t do this are those to which a window must always
  219.           be specified.
  220.  
  221.                In order to move the current (y, x)  co-ordinates  from
  222.           one  point  to  another, the routines _✓m_✓o_✓v_✓e() and _✓w_✓m_✓o_✓v_✓e() are
  223.           provided.  However, it is often desirable to first move  and
  224.           then  perform some I/O operation.  In order to avoid clumsy-
  225.           ness, most I/O routines can be preceded by the  prefix  "_✓m_✓v"
  226.           and the desired (y, x) co-ordinates then can be added to the
  227.           arguments to the function.  For example, the calls
  228.  
  229.               move(y, x);
  230.               addch(ch);
  231.  
  232.           can be replaced by
  233.  
  234.               mvaddch(y, x, ch);
  235.  
  236.           and
  237.  
  238.               wmove(win, y, x);
  239.               waddch(win, ch);
  240.  
  241.           can be replaced by
  242.  
  243.               mvwaddch(win, y, x, ch);
  244.  
  245.           Note that the window description pointer (_✓w_✓i_✓n) comes  before
  246.           the  added  (y, x) co-ordinates.  If such pointers are need,
  247.           they are always the first parameters passed.
  248.  
  249.           _✓2.  _✓V_✓a_✓r_✓i_✓a_✓b_✓l_✓e_✓s
  250.  
  251.                Many variables which are used to describe the  terminal
  252.           environment are available to the programmer. They are:
  253.           ____________________
  254.              [2] Actually, _✓a_✓d_✓d_✓c_✓h() is really a  "#define"  macro  with
  255.           arguments,  as  are  most of the "functions" which deal with
  256.           _✓s_✓t_✓d_✓s_✓c_✓r as a default.
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.           PS1:18-6                                      Screen Package
  270.  
  271.  
  272.           type       name       description
  273.           ________________________________________________________________________
  274.           WINDOW *   curscr
  275.  
  276.                                 current version of the screen (terminal screen).
  277.           WINDOW *   stdscr
  278.  
  279.                                 standard screen.  Most updates  are  usually  done
  280.                                 here.
  281.           char *     Def_term
  282.  
  283.                                 default terminal type if type cannot be determined
  284.           bool       My_term
  285.  
  286.                                 use the terminal specification in _✓D_✓e_✓f__✓t_✓e_✓r_✓m as ter-
  287.                                 minal, irrelevant of real terminal type
  288.           char *     ttytype
  289.  
  290.                                 full name of the current terminal.
  291.           int        LINES
  292.  
  293.                                 number of lines on the terminal
  294.           int        COLS
  295.  
  296.                                 number of columns on the terminal
  297.           int        ERR
  298.  
  299.                                 error flag returned by routines on a fail.
  300.           int        OK
  301.  
  302.                                 error flag returned by  routines  when  things  go
  303.                                 right.
  304.  
  305.  
  306.                There are also several "#define"  constants  and  types
  307.           which are of general usefulness:
  308.  
  309.  
  310.           reg        storage class ``register'' (_✓e._✓g., _✓r_✓e_✓g _✓i_✓n_✓t _✓i;)
  311.           bool       boolean type, actually a ``char'' (_✓e._✓g., _✓b_✓o_✓o_✓l _✓d_✓o_✓n_✓e_✓i_✓t;)
  312.           TRUE       boolean ``true'' flag (1).
  313.           FALSE      boolean ``false'' flag (0).
  314.  
  315.  
  316.           _✓3.  _✓U_✓s_✓a_✓g_✓e
  317.  
  318.                This is a description of how to actually use the screen
  319.           package.   In  it, we assume all updating, reading, etc.  is
  320.           applied to _✓s_✓t_✓d_✓s_✓c_✓r.  All instructions will work on  any  win-
  321.           dow,  with changing the function name and parameters as men-
  322.           tioned above.
  323.  
  324.           _✓3._✓1.  _✓S_✓t_✓a_✓r_✓t_✓i_✓n_✓g _✓u_✓p
  325.  
  326.                In order to use the screen package, the  routines  must
  327.           know  about  terminal  characteristics,  and  the  space for
  328.           _✓c_✓u_✓r_✓s_✓c_✓r and _✓s_✓t_✓d_✓s_✓c_✓r must be allocated.   These  functions  are
  329.           performed  by  _✓i_✓n_✓i_✓t_✓s_✓c_✓r().   Since it must allocate space for
  330.           the windows, it can overflow core when attempting to do  so.
  331.           On  this  rather  rare occasion, _✓i_✓n_✓i_✓t_✓s_✓c_✓r() returns ERR.  _✓i_✓n_✓-
  332.           _✓i_✓t_✓s_✓c_✓r() must _✓a_✓l_✓w_✓a_✓y_✓s be called before  any  of  the  routines
  333.           which  affect  windows  are used.  If it is not, the program
  334.           will core dump as soon as either _✓c_✓u_✓r_✓s_✓c_✓r or _✓s_✓t_✓d_✓s_✓c_✓r are refer-
  335.           enced.  However, it is usually best to wait to call it until
  336.           after you are sure you will need it, like after checking for
  337.           startup errors.  Terminal status changing routines like _✓n_✓l()
  338.           and _✓c_✓b_✓r_✓e_✓a_✓k() should be called after _✓i_✓n_✓i_✓t_✓s_✓c_✓r().
  339.  
  340.                Now that the screen windows have  been  allocated,  you
  341.           can set them up for the run.  If you want to, say, allow the
  342.           window to scroll, use _✓s_✓c_✓r_✓o_✓l_✓l_✓o_✓k().  If you want the cursor to
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.           Screen Package                                      PS1:18-7
  354.  
  355.  
  356.           be left after the last change, use _✓l_✓e_✓a_✓v_✓e_✓o_✓k().  If this isn't
  357.           done, _✓r_✓e_✓f_✓r_✓e_✓s_✓h() will move the cursor to the window's current
  358.           (y, x)  co-ordinates after updating it.  New windows of your
  359.           own can be created, too, by using the functions _✓n_✓e_✓w_✓w_✓i_✓n() and
  360.           _✓s_✓u_✓b_✓w_✓i_✓n().   _✓d_✓e_✓l_✓w_✓i_✓n()  will  allow you to get rid of old win-
  361.           dows.  If you wish to change the official size of the termi-
  362.           nal  by  hand,  just  set the variables _✓L_✓I_✓N_✓E_✓S and _✓C_✓O_✓L_✓S to be
  363.           what you want, and then call _✓i_✓n_✓i_✓t_✓s_✓c_✓r().  This is  best  done
  364.           before,  but  can  be done either before or after, the first
  365.           call to _✓i_✓n_✓i_✓t_✓s_✓c_✓r(), as it will  always  delete  any  existing
  366.           _✓s_✓t_✓d_✓s_✓c_✓r and/or _✓c_✓u_✓r_✓s_✓c_✓r before creating new ones.
  367.  
  368.           _✓3._✓2.  _✓T_✓h_✓e _✓N_✓i_✓t_✓t_✓y-_✓G_✓r_✓i_✓t_✓t_✓y
  369.  
  370.           _✓3._✓2._✓1.  _✓O_✓u_✓t_✓p_✓u_✓t
  371.  
  372.                Now that we have set things up, we will want to actual-
  373.           ly  update the terminal.  The basic functions used to change
  374.           what will go on a window are _✓a_✓d_✓d_✓c_✓h()  and  _✓m_✓o_✓v_✓e().   _✓a_✓d_✓d_✓c_✓h()
  375.           adds a character at the current (y, x) co-ordinates, return-
  376.           ing ERR if it would cause the window  to  illegally  scroll,
  377.           _✓i._✓e., printing a character in the lower right-hand corner of
  378.           a terminal which automatically scrolls if scrolling  is  not
  379.           allowed.   _✓m_✓o_✓v_✓e() changes the current (y, x) co-ordinates to
  380.           whatever you want them to be.  It returns ERR if you try  to
  381.           move  off the window when scrolling is not allowed.  As men-
  382.           tioned above, you can combine the two into _✓m_✓v_✓a_✓d_✓d_✓c_✓h()  to  do
  383.           both things in one fell swoop.
  384.  
  385.                The  other  output  functions,  such  as  _✓a_✓d_✓d_✓s_✓t_✓r()  and
  386.           _✓p_✓r_✓i_✓n_✓t_✓w(), all call _✓a_✓d_✓d_✓c_✓h() to add characters to the window.
  387.  
  388.                After you have put on the window what you  want  there,
  389.           when  you  want  the  portion of the terminal covered by the
  390.           window to be made to look like it, you must call  _✓r_✓e_✓f_✓r_✓e_✓s_✓h().
  391.           In order to optimize finding changes, _✓r_✓e_✓f_✓r_✓e_✓s_✓h() assumes that
  392.           any part of the window not changed since the last  _✓r_✓e_✓f_✓r_✓e_✓s_✓h()
  393.           of  that  window has not been changed on the terminal, _✓i._✓e.,
  394.           that you have not refreshed a portion of the  terminal  with
  395.           an  overlapping  window.   If this is not the case, the rou-
  396.           tines _✓t_✓o_✓u_✓c_✓h_✓w_✓i_✓n(), _✓t_✓o_✓u_✓c_✓h_✓l_✓i_✓n_✓e(), and _✓t_✓o_✓u_✓c_✓h_✓o_✓v_✓e_✓r_✓l_✓a_✓p()  are  pro-
  397.           vided to make it look like a desired part of window has been
  398.           changed, thus forcing _✓r_✓e_✓f_✓r_✓e_✓s_✓h() check that whole  subsection
  399.           of the terminal for changes.
  400.  
  401.                If you call _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h() with _✓c_✓u_✓r_✓s_✓c_✓r, it  will  make  the
  402.           screen  look like _✓c_✓u_✓r_✓s_✓c_✓r thinks it looks like.  This is use-
  403.           ful for implementing a command which would redraw the screen
  404.           in case it get messed up.
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.           PS1:18-8                                      Screen Package
  420.  
  421.  
  422.           _✓3._✓2._✓2.  _✓I_✓n_✓p_✓u_✓t
  423.  
  424.                Input is essentially a mirror  image  of  output.   The
  425.           complementary  function to _✓a_✓d_✓d_✓c_✓h() is _✓g_✓e_✓t_✓c_✓h() which, if echo
  426.           is set, will call _✓a_✓d_✓d_✓c_✓h() to echo the character.  Since  the
  427.           screen  package needs to know what is on the terminal at all
  428.           times, if characters are to be echoed, the tty  must  be  in
  429.           raw  or  cbreak  mode.   If it is not, _✓g_✓e_✓t_✓c_✓h() sets it to be
  430.           cbreak, and then reads in the character.
  431.  
  432.           _✓3._✓2._✓3.  _✓M_✓i_✓s_✓c_✓e_✓l_✓l_✓a_✓n_✓e_✓o_✓u_✓s
  433.  
  434.                All sorts of fun functions exists for  maintaining  and
  435.           changing  information about the windows.  For the most part,
  436.           the descriptions in section 5.4. should suffice.
  437.  
  438.           _✓3._✓3.  _✓F_✓i_✓n_✓i_✓s_✓h_✓i_✓n_✓g _✓u_✓p
  439.  
  440.                In order to do certain optimizations, and, on some ter-
  441.           minals,  to work at all, some things must be done before the
  442.           screen routines start up.  These functions are performed  in
  443.           _✓g_✓e_✓t_✓t_✓t_✓m_✓o_✓d_✓e()  and  _✓s_✓e_✓t_✓t_✓e_✓r_✓m(),  which are called by _✓i_✓n_✓i_✓t_✓s_✓c_✓r().
  444.           In order  to  clean  up  after  the  routines,  the  routine
  445.           _✓e_✓n_✓d_✓w_✓i_✓n()  is  provided.   It restores tty modes to what they
  446.           were when _✓i_✓n_✓i_✓t_✓s_✓c_✓r() was first called.  Thus,  anytime  after
  447.           the  call to initscr, _✓e_✓n_✓d_✓w_✓i_✓n() should be called before exit-
  448.           ing.
  449.  
  450.           _✓4.  _✓C_✓u_✓r_✓s_✓o_✓r _✓M_✓o_✓t_✓i_✓o_✓n _✓O_✓p_✓t_✓i_✓m_✓i_✓z_✓a_✓t_✓i_✓o_✓n: _✓S_✓t_✓a_✓n_✓d_✓i_✓n_✓g _✓A_✓l_✓o_✓n_✓e
  451.  
  452.                It is possible to use the cursor optimization functions
  453.           of  this  screen package without the overhead and additional
  454.           size of the screen updating functions.  The screen  updating
  455.           functions  are  designed  for uses where parts of the screen
  456.           are changed, but the overall image remains the  same.   This
  457.           includes such programs as _✓r_✓o_✓g_✓u_✓e and  _✓v_✓i[3].   Certain  other
  458.           programs  will  find  it difficult to use these functions in
  459.           this manner without considerable unnecessary  program  over-
  460.           head.  For such applications, such as  some  "_✓c_✓r_✓t  _✓h_✓a_✓c_✓k_✓s"[4]
  461.           and  optimizing _✓m_✓o_✓r_✓e(1)-type programs, all that is needed is
  462.           the motion optimizations.  This, therefore, is a description
  463.           of  what  some  of  what goes on at the lower levels of this
  464.           screen package.  The descriptions assume a certain amount of
  465.           familiarity  with programming problems and some finer points
  466.           of C.  None of it is terribly difficult, but you  should  be
  467.           ____________________
  468.              [3] _✓r_✓o_✓g_✓u_✓e actually uses these functions, _✓v_✓i does not.
  469.              [4]  Graphics  programs  designed  to  run  on character-
  470.           oriented terminals.  I could name many, but  they  come  and
  471.           go,  so  the  list  would be quickly out of date.  Recently,
  472.           there have been programs such as _✓r_✓a_✓i_✓n, _✓r_✓o_✓c_✓k_✓e_✓t, and _✓g_✓u_✓n.
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.           Screen Package                                      PS1:18-9
  486.  
  487.  
  488.           forewarned.
  489.  
  490.           _✓4._✓1.  _✓T_✓e_✓r_✓m_✓i_✓n_✓a_✓l _✓I_✓n_✓f_✓o_✓r_✓m_✓a_✓t_✓i_✓o_✓n
  491.  
  492.                In order to use a terminal's features to the best of  a
  493.           program's abilities, it must first know  what  they  are[5].
  494.           The  _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5)  database  describes  these,  but  a certain
  495.           amount of decoding is necessary, and there are,  of  course,
  496.           both efficient and inefficient ways of reading them in.  The
  497.           algorithm that the uses is taken from _✓v_✓i  and  is  hideously
  498.           efficient.   It  reads  them  in  a tight loop into a set of
  499.           variables whose names are two uppercase  letters  with  some
  500.           mnemonic value.  For example, _✓H_✓O is a string which moves the
  501.           cursor to the "home" position[6].  As there are two types of
  502.           variables  involving  ttys,  there  are  two  routines.  The
  503.           first, _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e(), sets some variables based  upon  the  tty
  504.           modes accessed by _✓g_✓t_✓t_✓y(2) and _✓s_✓t_✓t_✓y(2) The second, _✓s_✓e_✓t_✓t_✓e_✓r_✓m(),
  505.           a larger task  by  reading  in  the  descriptions  from  the
  506.           _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5)  database.   This  is  the way these routines are
  507.           used by _✓i_✓n_✓i_✓t_✓s_✓c_✓r():
  508.  
  509.  
  510.                   _✓i_✓f (isatty(0)) {
  511.                          gettmode();
  512.                          _✓i_✓f ((sp=getenv("TERM")) != NULL)
  513.                                  setterm(sp);
  514.                              _✓e_✓l_✓s_✓e
  515.                                     setterm(Def_term);
  516.                   }
  517.                   _✓e_✓l_✓s_✓e
  518.                          setterm(Def_term);
  519.                   _puts(TI);
  520.                   _puts(VS);
  521.  
  522.  
  523.  
  524.                _✓i_✓s_✓a_✓t_✓t_✓y() checks to see if file descriptor 0 is a termi-
  525.           nal[7].  If it is, _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e() sets the terminal  description
  526.           modes from a _✓g_✓t_✓t_✓y(2) _✓g_✓e_✓t_✓e_✓n_✓v() is then called to get the name
  527.           of the terminal, and that value (if there is one) is  passed
  528.           ____________________
  529.              [5] If this comes as any surprise to  you,  there's  this
  530.           tower  in  Paris  they're thinking of junking that I can let
  531.           you have for a song.
  532.              [6] These names are identical to those variables used  in
  533.           the  _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5)  database  to describe each capability.  See
  534.           Appendix A for a  complete  list  of  those  read,  and  the
  535.           _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5) manual page for a full description.
  536.              [7] _✓i_✓s_✓a_✓t_✓t_✓y() is defined in the default C library function
  537.           routines.  It does a _✓g_✓t_✓t_✓y(2) on the  descriptor  and  checks
  538.           the return value.
  539.  
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.  
  548.  
  549.  
  550.  
  551.           PS1:18-10                                     Screen Package
  552.  
  553.  
  554.           to _✓s_✓e_✓t_✓t_✓e_✓r_✓m(), which reads in the variables  from  _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5)
  555.           associated  with that terminal.  (_✓g_✓e_✓t_✓e_✓n_✓v() returns a pointer
  556.           to a string containing the name of the  terminal,  which  we
  557.           save  in  the  character  pointer  _✓s_✓p.)  If _✓i_✓s_✓a_✓t_✓t_✓y() returns
  558.           false, the default terminal _✓D_✓e_✓f__✓t_✓e_✓r_✓m is used.  The _✓T_✓I and _✓V_✓S
  559.           sequences  initialize the terminal (__✓p_✓u_✓t_✓s() is a macro which
  560.           uses _✓t_✓p_✓u_✓t_✓s() (see _✓t_✓e_✓r_✓m_✓c_✓a_✓p(3)) and __✓p_✓u_✓t_✓c_✓h_✓a_✓r() to  put  out  a
  561.           string).  _✓e_✓n_✓d_✓w_✓i_✓n() undoes these things.
  562.  
  563.           _✓4._✓2.  _✓M_✓o_✓v_✓e_✓m_✓e_✓n_✓t _✓O_✓p_✓t_✓i_✓m_✓i_✓z_✓a_✓t_✓i_✓o_✓n_✓s, _✓o_✓r, _✓G_✓e_✓t_✓t_✓i_✓n_✓g _✓O_✓v_✓e_✓r _✓Y_✓o_✓n_✓d_✓e_✓r
  564.  
  565.                Now that we have all this useful information, it  would
  566.           be nice to do something  with  it[8].   The  most  difficult
  567.           thing  to do properly is motion optimization.  When you con-
  568.           sider how many different  features  various  terminals  have
  569.           (tabs,  backtabs, non-destructive space, home sequences, ab-
  570.           solute tabs, .....) you can see that  deciding  how  to  get
  571.           from here to there can be a decidedly non-trivial task.  The
  572.           editor _✓v_✓i uses many of these features, and the  routines  it
  573.           uses  to do this take up many pages of code.  Fortunately, I
  574.           was able to liberate them with the author's permission,  and
  575.           use them here.
  576.  
  577.                After using _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e() and _✓s_✓e_✓t_✓t_✓e_✓r_✓m() to get the  termi-
  578.           nal descriptions, the function _✓m_✓v_✓c_✓u_✓r() deals with this task.
  579.           It usage is simple: you simply tell it where you are now and
  580.           where you want to go.  For example
  581.  
  582.               mvcur(0, 0, LINES/2, COLS/2)
  583.  
  584.  
  585.           would move the cursor from the home position (0, 0)  to  the
  586.           middle  of  the  screen.   If you wish to force absolute ad-
  587.           dressing, you can use the function _✓t_✓g_✓o_✓t_✓o()  from  the  _✓t_✓e_✓r_✓m_✓-
  588.           _✓l_✓i_✓b(7) routines, or you can tell _✓m_✓v_✓c_✓u_✓r() that you are impos-
  589.           sibly far away, like Cleveland.  For example, to  absolutely
  590.           address  the  lower left hand corner of the screen from any-
  591.           where just claim that  you  are  in  the  upper  right  hand
  592.           corner:
  593.  
  594.               mvcur(0, COLS-1, LINES-1, 0)
  595.  
  596.  
  597.           _✓5.  _✓T_✓h_✓e _✓F_✓u_✓n_✓c_✓t_✓i_✓o_✓n_✓s
  598.  
  599.                In the following  definitions,  "[*]"  means  that  the
  600.           "function" is really a "#define" macro with arguments.  This
  601.           ____________________
  602.              [8] Actually, it _✓c_✓a_✓n be emotionally  fulfilling  just  to
  603.           get the information.  This is usually only true, however, if
  604.           you have the social life of a kumquat.
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.           Screen Package                                     PS1:18-11
  618.  
  619.  
  620.           means that it will not show up in stack traces  in  the  de-
  621.           bugger,  or,  in  the  case of such functions as _✓a_✓d_✓d_✓c_✓h(), it
  622.           will show up as it's "_✓w"  counterpart.   The  arguments  are
  623.           given  to  show the order and type of each.  Their names are
  624.           not mandatory, just suggestive.
  625.  
  626.           _✓5._✓1.  _✓O_✓u_✓t_✓p_✓u_✓t _✓F_✓u_✓n_✓c_✓t_✓i_✓o_✓n_✓s
  627.  
  628.  
  629.  
  630.           _✓a_✓d_✓d_✓c_✓h(_✓c_✓h) [*]
  631.           _✓c_✓h_✓a_✓r       _✓c_✓h;
  632.  
  633.           _✓w_✓a_✓d_✓d_✓c_✓h(_✓w_✓i_✓n, _✓c_✓h)
  634.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  635.           _✓c_✓h_✓a_✓r       _✓c_✓h;
  636.  
  637.                Add the character _✓c_✓h  on  the  window  at  the  current
  638.                (y, x)  co-ordinates.   If  the  character is a newline
  639.                ('\n') the line will be cleared to  the  end,  and  the
  640.                current  (y, x) co-ordinates will be changed to the be-
  641.                ginning off the next line if newline mapping is on,  or
  642.                to  the  next  line  at the same x co-ordinate if it is
  643.                off.  A return ('\r') will move to the beginning of the
  644.                line  on the window.  Tabs ('\t') will be expanded into
  645.                spaces in the normal tabstop positions of  every  eight
  646.                characters.   This  returns  ERR  if it would cause the
  647.                screen to scroll illegally.
  648.  
  649.  
  650.  
  651.           _✓a_✓d_✓d_✓s_✓t_✓r(_✓s_✓t_✓r) [*]
  652.           _✓c_✓h_✓a_✓r       *_✓s_✓t_✓r;
  653.  
  654.           _✓w_✓a_✓d_✓d_✓s_✓t_✓r(_✓w_✓i_✓n, _✓s_✓t_✓r)
  655.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  656.           _✓c_✓h_✓a_✓r       *_✓s_✓t_✓r;
  657.  
  658.                Add the string pointed to by _✓s_✓t_✓r on the window  at  the
  659.                current  (y, x)  co-ordinates.   This returns ERR if it
  660.                would cause the screen to scroll  illegally.   In  this
  661.                case, it will put on as much as it can.
  662.  
  663.  
  664.  
  665.           _✓b_✓o_✓x(_✓w_✓i_✓n, _✓v_✓e_✓r_✓t, _✓h_✓o_✓r)
  666.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  667.           _✓c_✓h_✓a_✓r       _✓v_✓e_✓r_✓t, _✓h_✓o_✓r;
  668.  
  669.                Draws a box around the window using _✓v_✓e_✓r_✓t as the charac-
  670.                ter for drawing the vertical sides, and _✓h_✓o_✓r for drawing
  671.                the horizontal lines.  If scrolling is not allowed, and
  672.                the  window  encompasses the lower right-hand corner of
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.           PS1:18-12                                     Screen Package
  684.  
  685.  
  686.                the terminal, the corners are left  blank  to  avoid  a
  687.                scroll.
  688.  
  689.  
  690.  
  691.           _✓c_✓l_✓e_✓a_✓r() [*]
  692.  
  693.           _✓w_✓c_✓l_✓e_✓a_✓r(_✓w_✓i_✓n)
  694.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  695.  
  696.                Resets the entire  window  to  blanks.   If  _✓w_✓i_✓n  is  a
  697.                screen,  this  sets  the clear flag, which will cause a
  698.                clear-screen sequence to be sent on the next  _✓r_✓e_✓f_✓r_✓e_✓s_✓h()
  699.                call.   This also moves the current (y, x) co-ordinates
  700.                to (0, 0).
  701.  
  702.  
  703.  
  704.           _✓c_✓l_✓e_✓a_✓r_✓o_✓k(_✓s_✓c_✓r, _✓b_✓o_✓o_✓l_✓f) [*]
  705.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓s_✓c_✓r;
  706.           _✓b_✓o_✓o_✓l       _✓b_✓o_✓o_✓l_✓f;
  707.  
  708.                Sets the clear flag for the screen _✓s_✓c_✓r.   If  _✓b_✓o_✓o_✓l_✓f  is
  709.                TRUE,  this  will force a clear-screen to be printed on
  710.                the next _✓r_✓e_✓f_✓r_✓e_✓s_✓h(), or stop it from doing so  if  _✓b_✓o_✓o_✓l_✓f
  711.                is  FALSE.   This  only  works  on screens, and, unlike
  712.                _✓c_✓l_✓e_✓a_✓r(), does not alter the contents of the screen.  If
  713.                _✓s_✓c_✓r  is  _✓c_✓u_✓r_✓s_✓c_✓r,  the  next _✓r_✓e_✓f_✓r_✓e_✓s_✓h() call will cause a
  714.                clear-screen, even if the window passed to _✓r_✓e_✓f_✓r_✓e_✓s_✓h() is
  715.                not a screen.
  716.  
  717.  
  718.  
  719.           _✓c_✓l_✓r_✓t_✓o_✓b_✓o_✓t() [*]
  720.  
  721.           _✓w_✓c_✓l_✓r_✓t_✓o_✓b_✓o_✓t(_✓w_✓i_✓n)
  722.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  723.  
  724.                Wipes the window clear  from  the  current  (y, x)  co-
  725.                ordinates  to the bottom.  This does not force a clear-
  726.                screen sequence on the  next  refresh  under  any  cir-
  727.                cumstances.  This has no associated "mv" command.
  728.  
  729.  
  730.  
  731.           _✓c_✓l_✓r_✓t_✓o_✓e_✓o_✓l() [*]
  732.  
  733.           _✓w_✓c_✓l_✓r_✓t_✓o_✓e_✓o_✓l(_✓w_✓i_✓n)
  734.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  735.  
  736.                Wipes the window clear  from  the  current  (y, x)  co-
  737.                ordinates  to the end of the line.  This has no associ-
  738.                ated "mv" command.
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.           Screen Package                                     PS1:18-13
  750.  
  751.  
  752.  
  753.           _✓d_✓e_✓l_✓c_✓h()
  754.  
  755.           _✓w_✓d_✓e_✓l_✓c_✓h(_✓w_✓i_✓n)
  756.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  757.  
  758.                Delete  the  character  at  the  current   (y, x)   co-
  759.                ordinates.   Each character after it on the line shifts
  760.                to the left, and the last character becomes blank.
  761.  
  762.  
  763.  
  764.           _✓d_✓e_✓l_✓e_✓t_✓e_✓l_✓n()
  765.  
  766.           _✓w_✓d_✓e_✓l_✓e_✓t_✓e_✓l_✓n(_✓w_✓i_✓n)
  767.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  768.  
  769.                Delete the current line.  Every line below the  current
  770.                one  will  move  up,  and  the  bottom line will become
  771.                blank.  The current (y, x) co-ordinates will remain un-
  772.                changed.
  773.  
  774.  
  775.  
  776.           _✓e_✓r_✓a_✓s_✓e() [*]
  777.  
  778.           _✓w_✓e_✓r_✓a_✓s_✓e(_✓w_✓i_✓n)
  779.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  780.  
  781.                Erases the window to blanks without setting  the  clear
  782.                flag.   This  is  analagous  to _✓c_✓l_✓e_✓a_✓r(), except that it
  783.                never causes a clear-screen sequence to be generated on
  784.                a _✓r_✓e_✓f_✓r_✓e_✓s_✓h().  This has no associated "mv" command.
  785.  
  786.  
  787.  
  788.           _✓f_✓l_✓u_✓s_✓h_✓o_✓k(_✓w_✓i_✓n, _✓b_✓o_✓o_✓l_✓f) [*]
  789.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  790.           _✓b_✓o_✓o_✓l       _✓b_✓o_✓o_✓l_✓f;
  791.  
  792.                Normally, _✓r_✓e_✓f_✓r_✓e_✓s_✓h() _✓f_✓f_✓l_✓u_✓s_✓h()'s _✓s_✓t_✓d_✓o_✓u_✓t when it  is  fin-
  793.                ished.  _✓f_✓l_✓u_✓s_✓h_✓o_✓k() allows you to control this.  if _✓b_✓o_✓o_✓l_✓f
  794.                is TRUE (_✓i._✓e., non-zero) it will do the _✓f_✓f_✓l_✓u_✓s_✓h(); if it
  795.                is FALSE.  it will not.
  796.  
  797.  
  798.  
  799.           _✓i_✓d_✓l_✓o_✓k(_✓w_✓i_✓n, _✓b_✓o_✓o_✓l_✓f)
  800.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  801.           _✓b_✓o_✓o_✓l       _✓b_✓o_✓o_✓l_✓f;
  802.  
  803.                Reserved for future use.  This will  eventually  signal
  804.                to _✓r_✓e_✓f_✓r_✓e_✓s_✓h() that it is all right to use the insert and
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.           PS1:18-14                                     Screen Package
  816.  
  817.  
  818.                delete line sequences when updating the window.
  819.  
  820.  
  821.  
  822.           _✓i_✓n_✓s_✓c_✓h(_✓c)
  823.           _✓c_✓h_✓a_✓r       _✓c;
  824.  
  825.           _✓w_✓i_✓n_✓s_✓c_✓h(_✓w_✓i_✓n, _✓c)
  826.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  827.           _✓c_✓h_✓a_✓r       _✓c;
  828.  
  829.                Insert _✓c at the current (y, x) co-ordinates Each  char-
  830.                acter  after it shifts to the right, and the last char-
  831.                acter disappears.  This returns ERR if it  would  cause
  832.                the screen to scroll illegally.
  833.  
  834.  
  835.  
  836.           _✓i_✓n_✓s_✓e_✓r_✓t_✓l_✓n()
  837.  
  838.           _✓w_✓i_✓n_✓s_✓e_✓r_✓t_✓l_✓n(_✓w_✓i_✓n)
  839.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  840.  
  841.                Insert a line above the current one.  Every line  below
  842.                the  current  line will be shifted down, and the bottom
  843.                line will disappear.   The  current  line  will  become
  844.                blank,  and the current (y, x) co-ordinates will remain
  845.                unchanged.
  846.  
  847.  
  848.  
  849.           _✓m_✓o_✓v_✓e(_✓y, _✓x) [*]
  850.           _✓i_✓n_✓t        _✓y, _✓x;
  851.  
  852.           _✓w_✓m_✓o_✓v_✓e(_✓w_✓i_✓n, _✓y, _✓x)
  853.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  854.           _✓i_✓n_✓t        _✓y, _✓x;
  855.  
  856.                Change the current (y, x) co-ordinates of the window to
  857.                (_✓y, _✓x).   This returns ERR if it would cause the screen
  858.                to scroll illegally.
  859.  
  860.  
  861.  
  862.           _✓o_✓v_✓e_✓r_✓l_✓a_✓y(_✓w_✓i_✓n_✓1, _✓w_✓i_✓n_✓2)
  863.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n_✓1, *_✓w_✓i_✓n_✓2;
  864.  
  865.                Overlay _✓w_✓i_✓n_✓1 on _✓w_✓i_✓n_✓2.  The contents of _✓w_✓i_✓n_✓1, insofar as
  866.                they  fit,  are placed on _✓w_✓i_✓n_✓2 at their starting (y, x)
  867.                co-ordinates.  This is  done  non-destructively,  i.e.,
  868.                blanks  on _✓w_✓i_✓n_✓1 leave the contents of the space on _✓w_✓i_✓n_✓2
  869.                untouched.
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.           Screen Package                                     PS1:18-15
  882.  
  883.  
  884.  
  885.           _✓o_✓v_✓e_✓r_✓w_✓r_✓i_✓t_✓e(_✓w_✓i_✓n_✓1, _✓w_✓i_✓n_✓2)
  886.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n_✓1, *_✓w_✓i_✓n_✓2;
  887.  
  888.                Overwrite _✓w_✓i_✓n_✓1 on _✓w_✓i_✓n_✓2.  The contents of _✓w_✓i_✓n_✓1,  insofar
  889.                as  they  fit,  are  placed  on  _✓w_✓i_✓n_✓2 at their starting
  890.                (y, x) co-ordinates.  This is done destructively, _✓i._✓e.,
  891.                blanks on _✓w_✓i_✓n_✓1 become blank on _✓w_✓i_✓n_✓2.
  892.  
  893.  
  894.  
  895.           _✓p_✓r_✓i_✓n_✓t_✓w(_✓f_✓m_✓t, _✓a_✓r_✓g_✓1, _✓a_✓r_✓g_✓2, ...)
  896.           _✓c_✓h_✓a_✓r       *_✓f_✓m_✓t;
  897.  
  898.           _✓w_✓p_✓r_✓i_✓n_✓t_✓w(_✓w_✓i_✓n, _✓f_✓m_✓t, _✓a_✓r_✓g_✓1, _✓a_✓r_✓g_✓2, ...)
  899.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  900.           _✓c_✓h_✓a_✓r       *_✓f_✓m_✓t;
  901.  
  902.                Performs a _✓p_✓r_✓i_✓n_✓t_✓f()  on  the  window  starting  at  the
  903.                current  (y, x)  co-ordinates.  It uses _✓a_✓d_✓d_✓s_✓t_✓r() to add
  904.                the string on the window.  It is often advisable to use
  905.                the  field  width  options of _✓p_✓r_✓i_✓n_✓t_✓f() to avoid leaving
  906.                things on the window from earlier calls.  This  returns
  907.                ERR if it would cause the screen to scroll illegally.
  908.  
  909.  
  910.  
  911.           _✓r_✓e_✓f_✓r_✓e_✓s_✓h() [*]
  912.  
  913.           _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h(_✓w_✓i_✓n)
  914.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  915.  
  916.                Synchronize the terminal screen with the  desired  win-
  917.                dow.   If  the  window  is not a screen, only that part
  918.                covered by it is updated.  This returns ERR if it would
  919.                cause the screen to scroll illegally.  In this case, it
  920.                will update whatever it can without causing the scroll.
  921.  
  922.                As a special case, if _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h()  is  called  with  the
  923.                window _✓c_✓u_✓r_✓s_✓c_✓r the screen is cleared and repainted as it
  924.                is currently.  This is very  useful  for  allowing  the
  925.                redrawing  of  the  screen  when  the  user has garbage
  926.                dumped on his terminal.
  927.  
  928.  
  929.  
  930.           _✓s_✓t_✓a_✓n_✓d_✓o_✓u_✓t() [*]
  931.  
  932.           _✓w_✓s_✓t_✓a_✓n_✓d_✓o_✓u_✓t(_✓w_✓i_✓n)
  933.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  934.  
  935.           _✓s_✓t_✓a_✓n_✓d_✓e_✓n_✓d() [*]
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.           PS1:18-16                                     Screen Package
  948.  
  949.  
  950.           _✓w_✓s_✓t_✓a_✓n_✓d_✓e_✓n_✓d(_✓w_✓i_✓n)
  951.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  952.  
  953.                Start and stop putting characters onto _✓w_✓i_✓n in  standout
  954.                mode.   _✓s_✓t_✓a_✓n_✓d_✓o_✓u_✓t()  causes  any characters added to the
  955.                window to be put in standout mode on the  terminal  (if
  956.                it  has  that capability).  _✓s_✓t_✓a_✓n_✓d_✓e_✓n_✓d() stops this.  The
  957.                sequences _✓S_✓O and _✓S_✓E (or _✓U_✓S and _✓U_✓E if they are  not  de-
  958.                fined) are used (see Appendix A).
  959.  
  960.           _✓5._✓2.  _✓I_✓n_✓p_✓u_✓t _✓F_✓u_✓n_✓c_✓t_✓i_✓o_✓n_✓s
  961.  
  962.  
  963.  
  964.           _✓c_✓b_✓r_✓e_✓a_✓k() [*]
  965.  
  966.           _✓n_✓o_✓c_✓b_✓r_✓e_✓a_✓k() [*]
  967.  
  968.           _✓c_✓r_✓m_✓o_✓d_✓e() [*]
  969.  
  970.           _✓n_✓o_✓c_✓r_✓m_✓o_✓d_✓e() [*]
  971.  
  972.                Set or unset the terminal  to/from  cbreak  mode.   The
  973.                misnamed  macros  _✓c_✓r_✓m_✓o_✓d_✓e()  and _✓n_✓o_✓c_✓r_✓m_✓o_✓d_✓e() are retained
  974.                for backwards compatibility with ealier versions of the
  975.                library.
  976.  
  977.  
  978.  
  979.           _✓e_✓c_✓h_✓o() [*]
  980.  
  981.           _✓n_✓o_✓e_✓c_✓h_✓o() [*]
  982.  
  983.                Sets the terminal to echo or not echo characters.
  984.  
  985.  
  986.  
  987.           _✓g_✓e_✓t_✓c_✓h() [*]
  988.  
  989.           _✓w_✓g_✓e_✓t_✓c_✓h(_✓w_✓i_✓n)
  990.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  991.  
  992.                Gets a character from the terminal and  (if  necessary)
  993.                echos  it  on the window.  This returns ERR if it would
  994.                cause the screen to scroll illegally.   Otherwise,  the
  995.                character  gotten is returned.  If _✓n_✓o_✓e_✓c_✓h_✓o has been set,
  996.                then the window is left unaltered.  In order to  retain
  997.                control of the terminal, it is necessary to have one of
  998.                _✓n_✓o_✓e_✓c_✓h_✓o, _✓c_✓b_✓r_✓e_✓a_✓k, or _✓r_✓a_✓w_✓m_✓o_✓d_✓e set.  If you do not set one,
  999.                whatever  routine  you call to read characters will set
  1000.                _✓c_✓b_✓r_✓e_✓a_✓k for you, and then reset  to  the  original  mode
  1001.                when finished.
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.           Screen Package                                     PS1:18-17
  1014.  
  1015.  
  1016.  
  1017.           _✓g_✓e_✓t_✓s_✓t_✓r(_✓s_✓t_✓r) [*]
  1018.           _✓c_✓h_✓a_✓r       *_✓s_✓t_✓r;
  1019.  
  1020.           _✓w_✓g_✓e_✓t_✓s_✓t_✓r(_✓w_✓i_✓n, _✓s_✓t_✓r)
  1021.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1022.           _✓c_✓h_✓a_✓r       *_✓s_✓t_✓r;
  1023.  
  1024.                Get a string through the window and put it in the loca-
  1025.                tion  pointed  to  by _✓s_✓t_✓r, which is assumed to be large
  1026.                enough to handle it.  It sets tty modes  if  necessary,
  1027.                and  then  calls  _✓g_✓e_✓t_✓c_✓h()  (or  _✓w_✓g_✓e_✓t_✓c_✓h(_✓w_✓i_✓n)) to get the
  1028.                characters needed to fill in the string until a newline
  1029.                or  EOF  is  encountered.  The newline stripped off the
  1030.                string.  This returns ERR if it would cause the  screen
  1031.                to scroll illegally.
  1032.  
  1033.  
  1034.  
  1035.           __✓p_✓u_✓t_✓c_✓h_✓a_✓r(_✓c)
  1036.           _✓c_✓h_✓a_✓r       _✓c;
  1037.  
  1038.                Put out a character using the  _✓p_✓u_✓t_✓c_✓h_✓a_✓r()  macro.   This
  1039.                function  is used to output every character that _✓c_✓u_✓r_✓s_✓e_✓s
  1040.                generates.  Thus, it can be redefined by the  user  who
  1041.                wants to do non-standard things with the output.  It is
  1042.                named with an initial "_" because it usually should  be
  1043.                invisible to the programmer.
  1044.  
  1045.  
  1046.  
  1047.           _✓r_✓a_✓w() [*]
  1048.  
  1049.           _✓n_✓o_✓r_✓a_✓w() [*]
  1050.  
  1051.                Set or unset the terminal to/from raw mode.  On version
  1052.                7 _✓U_✓N_✓I_✓X[_✓9] this  also  turns  of  newline  mapping  (see
  1053.                _✓n_✓l()).
  1054.  
  1055.  
  1056.  
  1057.           _✓s_✓c_✓a_✓n_✓w(_✓f_✓m_✓t, _✓a_✓r_✓g_✓1, _✓a_✓r_✓g_✓2, ...)
  1058.           _✓c_✓h_✓a_✓r       *_✓f_✓m_✓t;
  1059.  
  1060.           _✓w_✓s_✓c_✓a_✓n_✓w(_✓w_✓i_✓n, _✓f_✓m_✓t, _✓a_✓r_✓g_✓1, _✓a_✓r_✓g_✓2, ...)
  1061.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1062.           _✓c_✓h_✓a_✓r       *_✓f_✓m_✓t;
  1063.  
  1064.  
  1065.           ____________________
  1066.              [9] _✓U_✓N_✓I_✓X is a trademark of Bell Laboratories.
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.           PS1:18-18                                     Screen Package
  1080.  
  1081.  
  1082.                Perform a _✓s_✓c_✓a_✓n_✓f() through the  window  using  _✓f_✓m_✓t.   It
  1083.                does    this    using    consecutive    _✓g_✓e_✓t_✓c_✓h()'s   (or
  1084.                _✓w_✓g_✓e_✓t_✓c_✓h(_✓w_✓i_✓n)'s).  This returns ERR if it would cause the
  1085.                screen to scroll illegally.
  1086.  
  1087.           _✓5._✓3.  _✓M_✓i_✓s_✓c_✓e_✓l_✓l_✓a_✓n_✓e_✓o_✓u_✓s _✓F_✓u_✓n_✓c_✓t_✓i_✓o_✓n_✓s
  1088.  
  1089.  
  1090.  
  1091.           _✓b_✓a_✓u_✓d_✓r_✓a_✓t_✓e() [*]
  1092.  
  1093.                Returns the output baud rate of the terminal.  This  is
  1094.                a  system dependent constant (defined in <_✓s_✓y_✓s/_✓t_✓t_✓y._✓h> on
  1095.                BSD systems, which is included by <_✓c_✓u_✓r_✓s_✓e_✓s._✓h>).
  1096.  
  1097.  
  1098.  
  1099.           _✓d_✓e_✓l_✓w_✓i_✓n(_✓w_✓i_✓n)
  1100.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1101.  
  1102.                Deletes the window from existence.  All  resources  are
  1103.                freed  for  future use by _✓c_✓a_✓l_✓l_✓o_✓c(3).  If a window has a
  1104.                _✓s_✓u_✓b_✓w_✓i_✓n() allocated window inside of  it,  deleting  the
  1105.                outer window the subwindow is not affected, even though
  1106.                this does invalidate it.  Therefore, subwindows  should
  1107.                be deleted before their outer windows are.
  1108.  
  1109.  
  1110.  
  1111.           _✓e_✓n_✓d_✓w_✓i_✓n()
  1112.  
  1113.                Finish up window routines before exit.   This  restores
  1114.                the  terminal  to the state it was before _✓i_✓n_✓i_✓t_✓s_✓c_✓r() (or
  1115.                _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e() and _✓s_✓e_✓t_✓t_✓e_✓r_✓m()) was called.  It should always
  1116.                be  called  before exiting.  It does not exit.  This is
  1117.                especially useful for resetting tty stats when trapping
  1118.                rubouts via _✓s_✓i_✓g_✓n_✓a_✓l(2).
  1119.  
  1120.  
  1121.  
  1122.           _✓e_✓r_✓a_✓s_✓e_✓c_✓h_✓a_✓r() [*]
  1123.  
  1124.                Returns the erase character for the terminal, _✓i._✓e., the
  1125.                character  used by the user to erase a single character
  1126.                from the input.
  1127.  
  1128.  
  1129.           _✓c_✓h_✓a_✓r *
  1130.           _✓g_✓e_✓t_✓c_✓a_✓p(_✓s_✓t_✓r)
  1131.           _✓c_✓h_✓a_✓r       *_✓s_✓t_✓r;
  1132.  
  1133.                Return a pointer to the _✓t_✓e_✓r_✓m_✓c_✓a_✓p capability described by
  1134.                _✓s_✓t_✓r (see _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5) for details).
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.           Screen Package                                     PS1:18-19
  1146.  
  1147.  
  1148.  
  1149.           _✓g_✓e_✓t_✓y_✓x(_✓w_✓i_✓n, _✓y, _✓x) [*]
  1150.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1151.           _✓i_✓n_✓t        _✓y, _✓x;
  1152.  
  1153.                Puts the current (y, x)  co-ordinates  of  _✓w_✓i_✓n  in  the
  1154.                variables  _✓y  and  _✓x.  Since it is a macro, not a func-
  1155.                tion, you do not pass the address of _✓y and _✓x.
  1156.  
  1157.  
  1158.  
  1159.           _✓i_✓n_✓c_✓h() [*]
  1160.  
  1161.           _✓w_✓i_✓n_✓c_✓h(_✓w_✓i_✓n) [*]
  1162.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1163.  
  1164.                Returns  the  character  at  the  current  (y, x)   co-
  1165.                ordinates  on the given window.  This does not make any
  1166.                changes to the window.
  1167.  
  1168.  
  1169.  
  1170.           _✓i_✓n_✓i_✓t_✓s_✓c_✓r()
  1171.  
  1172.                Initialize the screen routines.  This  must  be  called
  1173.                before  any  of  the screen routines are used.  It ini-
  1174.                tializes the terminal-type data and such,  and  without
  1175.                it none of the routines can operate.  If standard input
  1176.                is not a tty, it sets the specifications to the  termi-
  1177.                nal  whose  name  is  pointed  to by _✓D_✓e_✓f__✓t_✓e_✓r_✓m (initialy
  1178.                "dumb").  If the boolean _✓M_✓y__✓t_✓e_✓r_✓m is true,  _✓D_✓e_✓f__✓t_✓e_✓r_✓m  is
  1179.                always  used.   If  the  system supports the _✓T_✓I_✓O_✓C_✓G_✓W_✓I_✓N_✓S_✓Z
  1180.                _✓i_✓o_✓c_✓t_✓l(_✓2) call, it is used to get the  number  of  lines
  1181.                and  columns  for  the  terminal, otherwise it is taken
  1182.                from the _✓t_✓e_✓r_✓m_✓c_✓a_✓p description.
  1183.  
  1184.  
  1185.  
  1186.           _✓k_✓i_✓l_✓l_✓c_✓h_✓a_✓r() [*]
  1187.  
  1188.                Returns the line kill character for the terminal, _✓i._✓e.,
  1189.                the  character used by the user to erase an entire line
  1190.                from the input.
  1191.  
  1192.  
  1193.  
  1194.           _✓l_✓e_✓a_✓v_✓e_✓o_✓k(_✓w_✓i_✓n, _✓b_✓o_✓o_✓l_✓f) [*]
  1195.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1196.           _✓b_✓o_✓o_✓l       _✓b_✓o_✓o_✓l_✓f;
  1197.  
  1198.                Sets the boolean flag for leaving the cursor after  the
  1199.                last change.  If _✓b_✓o_✓o_✓l_✓f is TRUE, the cursor will be left
  1200.                after the last update on the terminal, and the  current
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.           PS1:18-20                                     Screen Package
  1212.  
  1213.  
  1214.                (y, x)  co-ordinates for _✓w_✓i_✓n will be changed according-
  1215.                ly.  If it is FALSE, it will be moved  to  the  current
  1216.                (y, x)  co-ordinates.   This  flag (initialy FALSE) re-
  1217.                tains its value until changed by the user.
  1218.  
  1219.  
  1220.  
  1221.           _✓l_✓o_✓n_✓g_✓n_✓a_✓m_✓e(_✓t_✓e_✓r_✓m_✓b_✓u_✓f, _✓n_✓a_✓m_✓e)
  1222.           _✓c_✓h_✓a_✓r       *_✓t_✓e_✓r_✓m_✓b_✓u_✓f, *_✓n_✓a_✓m_✓e;
  1223.  
  1224.           _✓f_✓u_✓l_✓l_✓n_✓a_✓m_✓e(_✓t_✓e_✓r_✓m_✓b_✓u_✓f, _✓n_✓a_✓m_✓e)
  1225.           _✓c_✓h_✓a_✓r       *_✓t_✓e_✓r_✓m_✓b_✓u_✓f, *_✓n_✓a_✓m_✓e;
  1226.  
  1227.                _✓l_✓o_✓n_✓g_✓n_✓a_✓m_✓e() fills in _✓n_✓a_✓m_✓e with the long name of the ter-
  1228.                minal described by the _✓t_✓e_✓r_✓m_✓c_✓a_✓p entry in _✓t_✓e_✓r_✓m_✓b_✓u_✓f.  It is
  1229.                generally of little use, but is nice  for  telling  the
  1230.                user  in  a  readable  format what terminal we think he
  1231.                has.  This is available in the global variable _✓t_✓t_✓y_✓t_✓y_✓p_✓e.
  1232.                _✓t_✓e_✓r_✓m_✓b_✓u_✓f   is   usually  set  via  the  termlib  routine
  1233.                _✓t_✓g_✓e_✓t_✓e_✓n_✓t().  _✓f_✓u_✓l_✓l_✓n_✓a_✓m_✓e() is the same as  _✓l_✓o_✓n_✓g_✓n_✓a_✓m_✓e(),  ex-
  1234.                cept that it gives the fullest name given in the entry,
  1235.                which can be quite verbose.
  1236.  
  1237.  
  1238.  
  1239.           _✓m_✓v_✓w_✓i_✓n(_✓w_✓i_✓n, _✓y, _✓x)
  1240.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1241.           _✓i_✓n_✓t        _✓y, _✓x;
  1242.  
  1243.                Move the home position  of  the  window  _✓w_✓i_✓n  from  its
  1244.                current  starting coordinates to (_✓y, _✓x).  If that would
  1245.                put part or all of the window off the edge of the  ter-
  1246.                minal  screen,  _✓m_✓v_✓w_✓i_✓n() returns ERR and does not change
  1247.                anything.  For subwindows, _✓m_✓v_✓w_✓i_✓n() also returns ERR  if
  1248.                you  attempt  to  move  it off its main window.  If you
  1249.                move a main window, all subwindows are moved along with
  1250.                it.
  1251.  
  1252.  
  1253.           _✓W_✓I_✓N_✓D_✓O_✓W *
  1254.           _✓n_✓e_✓w_✓w_✓i_✓n(_✓l_✓i_✓n_✓e_✓s, _✓c_✓o_✓l_✓s, _✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x)
  1255.           _✓i_✓n_✓t        _✓l_✓i_✓n_✓e_✓s, _✓c_✓o_✓l_✓s, _✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x;
  1256.  
  1257.                Create a new window with _✓l_✓i_✓n_✓e_✓s lines and  _✓c_✓o_✓l_✓s  columns
  1258.                starting  at  position  (_✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x).   If either
  1259.                _✓l_✓i_✓n_✓e_✓s or _✓c_✓o_✓l_✓s is 0 (zero), that dimension will  be  set
  1260.                to  (_✓L_✓I_✓N_✓E_✓S - _✓b_✓e_✓g_✓i_✓n__✓y) or (_✓C_✓O_✓L_✓S - _✓b_✓e_✓g_✓i_✓n__✓x) respectively.
  1261.                Thus, to get a new window of dimensions _✓L_✓I_✓N_✓E_✓S  x  _✓C_✓O_✓L_✓S,
  1262.                use _✓n_✓e_✓w_✓w_✓i_✓n(_✓0, _✓0, _✓0, _✓0).
  1263.  
  1264.  
  1265.  
  1266.           _✓n_✓l() [*]
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.           Screen Package                                     PS1:18-21
  1278.  
  1279.  
  1280.  
  1281.           _✓n_✓o_✓n_✓l() [*]
  1282.  
  1283.                Set or  unset  the  terminal  to/from  nl  mode,  _✓i._✓e.,
  1284.                start/stop  the  system from mapping <_✓R_✓E_✓T_✓U_✓R_✓N> to <_✓L_✓I_✓N_✓E-
  1285.                _✓F_✓E_✓E_✓D>.  If the mapping is not done,  _✓r_✓e_✓f_✓r_✓e_✓s_✓h()  can  do
  1286.                more  optimization,  so  it is recommended, but not re-
  1287.                quired, to turn it off.
  1288.  
  1289.  
  1290.  
  1291.           _✓s_✓c_✓r_✓o_✓l_✓l_✓o_✓k(_✓w_✓i_✓n, _✓b_✓o_✓o_✓l_✓f) [*]
  1292.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1293.           _✓b_✓o_✓o_✓l       _✓b_✓o_✓o_✓l_✓f;
  1294.  
  1295.                Set the scroll flag for the given window.  If _✓b_✓o_✓o_✓l_✓f  is
  1296.                FALSE,  scrolling  is not allowed.  This is its default
  1297.                setting.
  1298.  
  1299.  
  1300.  
  1301.           _✓t_✓o_✓u_✓c_✓h_✓l_✓i_✓n_✓e(_✓w_✓i_✓n, _✓y, _✓s_✓t_✓a_✓r_✓t_✓x, _✓e_✓n_✓d_✓x)
  1302.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1303.           _✓i_✓n_✓t        _✓y, _✓s_✓t_✓a_✓r_✓t_✓x, _✓e_✓n_✓d_✓x;
  1304.  
  1305.                This function performs a function similar to _✓t_✓o_✓u_✓c_✓h_✓w_✓i_✓n()
  1306.                on  a  single  line.  It marks the first change for the
  1307.                given line to be _✓s_✓t_✓a_✓r_✓t_✓x, if it is  before  the  current
  1308.                first  change  mark, and the last change mark is set to
  1309.                be _✓e_✓n_✓d_✓x if it is currently less than _✓e_✓n_✓d_✓x.
  1310.  
  1311.  
  1312.  
  1313.           _✓t_✓o_✓u_✓c_✓h_✓o_✓v_✓e_✓r_✓l_✓a_✓p(_✓w_✓i_✓n_✓1, _✓w_✓i_✓n_✓2)
  1314.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n_✓1, *_✓w_✓i_✓n_✓2;
  1315.  
  1316.                Touch the window _✓w_✓i_✓n_✓2 in the area which  overlaps  with
  1317.                _✓w_✓i_✓n_✓1.  If they do not overlap, no changes are made.
  1318.  
  1319.  
  1320.  
  1321.           _✓t_✓o_✓u_✓c_✓h_✓w_✓i_✓n(_✓w_✓i_✓n)
  1322.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1323.  
  1324.                Make it appear that the every location  on  the  window
  1325.                has  been changed.  This is usually only needed for re-
  1326.                freshes with overlapping windows.
  1327.  
  1328.  
  1329.           _✓W_✓I_✓N_✓D_✓O_✓W *
  1330.           _✓s_✓u_✓b_✓w_✓i_✓n(_✓w_✓i_✓n, _✓l_✓i_✓n_✓e_✓s, _✓c_✓o_✓l_✓s, _✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x)
  1331.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1332.           _✓i_✓n_✓t        _✓l_✓i_✓n_✓e_✓s, _✓c_✓o_✓l_✓s, _✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x;
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.           PS1:18-22                                     Screen Package
  1344.  
  1345.  
  1346.                Create a new window with _✓l_✓i_✓n_✓e_✓s lines and  _✓c_✓o_✓l_✓s  columns
  1347.                starting at position (_✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x) inside the win-
  1348.                dow _✓w_✓i_✓n.  This means that any  change  made  to  either
  1349.                window  in  the  area  covered by the subwindow will be
  1350.                made on both windows.  _✓b_✓e_✓g_✓i_✓n__✓y, _✓b_✓e_✓g_✓i_✓n__✓x  are  specified
  1351.                relative to the overall screen, not the relative (0, 0)
  1352.                of _✓w_✓i_✓n.  If either _✓l_✓i_✓n_✓e_✓s or _✓c_✓o_✓l_✓s is 0 (zero), that  di-
  1353.                mension  will  be  set  to (_✓L_✓I_✓N_✓E_✓S - _✓b_✓e_✓g_✓i_✓n__✓y) or (_✓C_✓O_✓L_✓S -
  1354.                _✓b_✓e_✓g_✓i_✓n__✓x) respectively.
  1355.  
  1356.  
  1357.  
  1358.           _✓u_✓n_✓c_✓t_✓r_✓l(_✓c_✓h) [*]
  1359.           _✓c_✓h_✓a_✓r       _✓c_✓h;
  1360.  
  1361.                This is actually a debug function for the library,  but
  1362.                it is of general usefulness.  It returns a string which
  1363.                is a representation of _✓c_✓h.  Control  characters  become
  1364.                their  upper-case equivalents preceded by a "^".  Other
  1365.                letters stay just as they are.  To  use  _✓u_✓n_✓c_✓t_✓r_✓l(),  you
  1366.                may have to have #_✓i_✓n_✓c_✓l_✓u_✓d_✓e <_✓u_✓n_✓c_✓t_✓r_✓l._✓h> in your file.
  1367.  
  1368.           _✓5._✓4.  _✓D_✓e_✓t_✓a_✓i_✓l_✓s
  1369.  
  1370.  
  1371.  
  1372.           _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e()
  1373.  
  1374.                Get the tty stats.  This  is  normally  called  by  _✓i_✓n_✓-
  1375.                _✓i_✓t_✓s_✓c_✓r().
  1376.  
  1377.  
  1378.  
  1379.           _✓m_✓v_✓c_✓u_✓r(_✓l_✓a_✓s_✓t_✓y, _✓l_✓a_✓s_✓t_✓x, _✓n_✓e_✓w_✓y, _✓n_✓e_✓w_✓x)
  1380.           _✓i_✓n_✓t        _✓l_✓a_✓s_✓t_✓y, _✓l_✓a_✓s_✓t_✓x, _✓n_✓e_✓w_✓y, _✓n_✓e_✓w_✓x;
  1381.  
  1382.                Moves the  terminal's  cursor  from  (_✓l_✓a_✓s_✓t_✓y, _✓l_✓a_✓s_✓t_✓x)  to
  1383.                (_✓n_✓e_✓w_✓y, _✓n_✓e_✓w_✓x)  in  an  approximation of optimal fashion.
  1384.                This routine uses the functions borrowed from  _✓e_✓x  ver-
  1385.                sion  2.6.   It  is  possible  to use this optimization
  1386.                without the benefit of the screen routines.   With  the
  1387.                screen routines, this should not be called by the user.
  1388.                _✓m_✓o_✓v_✓e() and _✓r_✓e_✓f_✓r_✓e_✓s_✓h() should be used to move the  cursor
  1389.                position, so that the routines know what's going on.
  1390.  
  1391.  
  1392.  
  1393.           _✓s_✓c_✓r_✓o_✓l_✓l(_✓w_✓i_✓n)
  1394.           _✓W_✓I_✓N_✓D_✓O_✓W     *_✓w_✓i_✓n;
  1395.  
  1396.                Scroll the window upward one line.   This  is  normally
  1397.                not used by the user.
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.           Screen Package                                     PS1:18-23
  1410.  
  1411.  
  1412.  
  1413.           _✓s_✓a_✓v_✓e_✓t_✓t_✓y() [*]
  1414.  
  1415.           _✓r_✓e_✓s_✓e_✓t_✓t_✓y() [*]
  1416.  
  1417.                _✓s_✓a_✓v_✓e_✓t_✓t_✓y() saves the current tty  characteristic  flags.
  1418.                _✓r_✓e_✓s_✓e_✓t_✓t_✓y()  restores  them  to  what  _✓s_✓a_✓v_✓e_✓t_✓t_✓y()  stored.
  1419.                These functions  are  performed  automatically  by  _✓i_✓n_✓-
  1420.                _✓i_✓t_✓s_✓c_✓r() and _✓e_✓n_✓d_✓w_✓i_✓n().
  1421.  
  1422.  
  1423.  
  1424.           _✓s_✓e_✓t_✓t_✓e_✓r_✓m(_✓n_✓a_✓m_✓e)
  1425.           _✓c_✓h_✓a_✓r       *_✓n_✓a_✓m_✓e;
  1426.  
  1427.                Set the terminal characteristics to  be  those  of  the
  1428.                terminal named _✓n_✓a_✓m_✓e, getting the terminal size from the
  1429.                _✓T_✓I_✓O_✓C_✓G_✓W_✓I_✓N_✓S_✓Z _✓i_✓o_✓c_✓t_✓l(_✓2) if it exists,  otherwise  from  the
  1430.                environment.  This is normally called by _✓i_✓n_✓i_✓t_✓s_✓c_✓r().
  1431.  
  1432.  
  1433.  
  1434.           _✓t_✓s_✓t_✓p()
  1435.  
  1436.                If the new _✓t_✓t_✓y(4) driver is in use, this function  will
  1437.                save  the current tty state and then put the process to
  1438.                sleep.  When the process gets  restarted,  it  restores
  1439.                the tty state and then calls _✓w_✓r_✓e_✓f_✓r_✓e_✓s_✓h(_✓c_✓u_✓r_✓s_✓c_✓r) to redraw
  1440.                the screen.  _✓i_✓n_✓i_✓t_✓s_✓c_✓r() sets the signal SIGTSTP to  trap
  1441.                to this routine.
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓A
  1476.  
  1477.  
  1478.           _✓1.  _✓C_✓a_✓p_✓a_✓b_✓i_✓l_✓i_✓t_✓i_✓e_✓s _✓f_✓r_✓o_✓m _✓t_✓e_✓r_✓m_✓c_✓a_✓p
  1479.  
  1480.           _✓1._✓1.  _✓D_✓i_✓s_✓c_✓l_✓a_✓i_✓m_✓e_✓r
  1481.  
  1482.                The description of terminals is a  difficult  business,
  1483.           and  we only attempt to summarize the capabilities here: for
  1484.           a full description see _✓t_✓e_✓r_✓m_✓c_✓a_✓p(5).
  1485.  
  1486.           _✓1._✓2.  _✓O_✓v_✓e_✓r_✓v_✓i_✓e_✓w
  1487.  
  1488.                Capabilities from _✓t_✓e_✓r_✓m_✓c_✓a_✓p are of  three  kinds:  string
  1489.           valued options, numeric valued options, and boolean options.
  1490.           The string valued options are the  most  complicated,  since
  1491.           they may include padding information, which we describe now.
  1492.  
  1493.                Intelligent terminals often require padding on intelli-
  1494.           gent  operations  at  high  (and  sometimes even low) speed.
  1495.           This is specified by a number before the string in the capa-
  1496.           bility,  and has meaning for the capabilities which have a _✓P
  1497.           at the front of their comment.  This normally is a number of
  1498.           milliseconds  to  pad  the operation.  In the current system
  1499.           which has no true programmable delays, we do this by sending
  1500.           a  sequence  of  pad  characters (normally nulls, but can be
  1501.           changed (specified by _✓P_✓C)).   In  some  cases,  the  pad  is
  1502.           better  computed  as  some  number of milliseconds times the
  1503.           number of affected lines (to the bottom of the screen usual-
  1504.           ly, except when terminals have insert modes which will shift
  1505.           several lines.) This is specified as, i e.g. , _✓1_✓2*.   before
  1506.           the capability, to say 12 milliseconds per affected whatever
  1507.           (currently always  line).   Capabilities  where  this  makes
  1508.           sense say _✓P*.
  1509.  
  1510.  
  1511.           _✓1._✓3.  _✓V_✓a_✓r_✓i_✓a_✓b_✓l_✓e_✓s _✓S_✓e_✓t _✓B_✓y _✓s_✓e_✓t_✓t_✓e_✓r_✓m()
  1512.  
  1513.                            variables set by _✓s_✓e_✓t_✓t_✓e_✓r_✓m()
  1514.  
  1515.           Type     Name   Pad   Description
  1516.           _____________________________________________________________
  1517.           char *   AL     P*    Add new blank Line
  1518.           bool     AM           Automatic Margins
  1519.           char *   BC           Back Cursor movement
  1520.           bool     BS           BackSpace works
  1521.           char *   BT     P     Back Tab
  1522.           bool     CA           Cursor Addressable
  1523.           char *   CD     P*    Clear to end of Display
  1524.           char *   CE     P     Clear to End of line
  1525.           char *   CL     P*    CLear screen
  1526.           char *   CM     P     Cursor Motion
  1527.           char *   DC     P*    Delete Character
  1528.           char *   DL     P*    Delete Line sequence
  1529.           char *   DM           Delete Mode (enter)
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.  
  1539.  
  1540.  
  1541.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓A
  1542.  
  1543.  
  1544.                            variables set by _✓s_✓e_✓t_✓t_✓e_✓r_✓m()
  1545.  
  1546.           Type     Name   Pad   Description
  1547.           _____________________________________________________________
  1548.           char *   DO           DOwn line sequence
  1549.           char *   ED           End Delete mode
  1550.           bool     EO           can Erase Overstrikes with ' '
  1551.           char *   EI           End Insert mode
  1552.           char *   HO           HOme cursor
  1553.           bool     HZ           HaZeltine ~ braindamage
  1554.           char *   IC     P     Insert Character
  1555.           bool     IN           Insert-Null blessing
  1556.           char *   IM           enter Insert Mode (IC usually set, too)
  1557.           char *   IP     P*    Pad after char Inserted using IM+IE
  1558.           char *   LL           quick to Last Line, column 0
  1559.           char *   MA           ctrl character MAp for cmd mode
  1560.           bool     MI           can Move in Insert mode
  1561.           bool     NC           No Cr: \r sends \r\n then eats \n
  1562.           char *   ND           Non-Destructive space
  1563.           bool     OS           OverStrike works
  1564.           char     PC           Pad Character
  1565.           char *   SE           Standout End (may leave space)
  1566.           char *   SF     P     Scroll Forwards
  1567.           char *   SO           Stand Out begin (may leave space)
  1568.           char *   SR     P     Scroll in Reverse
  1569.           char *   TA     P     TAb (not ^I or with padding)
  1570.           char *   TE           Terminal address enable Ending sequence
  1571.           char *   TI           Terminal address enable Initialization
  1572.           char *   UC           Underline a single Character
  1573.           char *   UE           Underline Ending sequence
  1574.           bool     UL           UnderLining works even though !OS
  1575.           char *   UP           UPline
  1576.           char *   US           Underline Starting sequence
  1577.           char *   VB           Visible Bell
  1578.           char *   VE           Visual End sequence
  1579.           char *   VS           Visual Start sequence
  1580.           bool     XN           a Newline gets eaten after wrap
  1581.  
  1582.           Names starting with _✓X are  reserved  for  severely  nauseous
  1583.           glitches
  1584.  
  1585.                For purposes of _✓s_✓t_✓a_✓n_✓d_✓o_✓u_✓t(), if _✓S_✓G() is not 0,  _✓S_✓O()  is
  1586.           set  to  _✓N_✓U_✓L_✓L(),  and  if  _✓U_✓G()  is  not _✓0(), _✓U_✓S() is set to
  1587.           _✓N_✓U_✓L_✓L().  If, after this, _✓S_✓O() is _✓N_✓U_✓L_✓L(), and  _✓U_✓S()  is  not,
  1588.           _✓S_✓O() is set to be _✓U_✓S(), and _✓S_✓E() is set to be _✓U_✓E().
  1589.  
  1590.           _✓1._✓4.  _✓V_✓a_✓r_✓i_✓a_✓b_✓l_✓e_✓s _✓S_✓e_✓t _✓B_✓y _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e()
  1591.  
  1592.                           variables set by _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e()
  1593.  
  1594.           type   name        description
  1595.           ____________________________________________________________
  1596.  
  1597.  
  1598.  
  1599.  
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  
  1605.  
  1606.  
  1607.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓A
  1608.  
  1609.  
  1610.                           variables set by _✓g_✓e_✓t_✓t_✓m_✓o_✓d_✓e()
  1611.  
  1612.           type   name        description
  1613.           ____________________________________________________________
  1614.           bool   NONL        Term can't hack linefeeds doing a CR
  1615.           bool   GT          Gtty indicates Tabs
  1616.           bool   UPPERCASE   Terminal generates only uppercase letters
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662.  
  1663.  
  1664.  
  1665.  
  1666.  
  1667.  
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓B
  1674.  
  1675.  
  1676.           _✓1.
  1677.           _✓T_✓h_✓e _✓W_✓I_✓N_✓D_✓O_✓W _✓s_✓t_✓r_✓u_✓c_✓t_✓u_✓r_✓e
  1678.  
  1679.                The WINDOW structure is defined as follows:
  1680.  
  1681.               /*
  1682.                * _✓C_✓o_✓p_✓y_✓r_✓i_✓g_✓h_✓t _✓1_✓9_✓8_✓0 _✓K_✓e_✓n_✓n_✓e_✓t_✓h _✓C. _✓R. _✓C. _✓A_✓r_✓n_✓o_✓l_✓d _✓a_✓n_✓d _✓T_✓h_✓e _✓R_✓e_✓g_✓e_✓n_✓t_✓s _✓o_✓f _✓t_✓h_✓e
  1683.                * _✓U_✓n_✓i_✓v_✓e_✓r_✓s_✓i_✓t_✓y _✓o_✓f _✓C_✓a_✓l_✓i_✓f_✓o_✓r_✓n_✓i_✓a.  _✓P_✓e_✓r_✓m_✓i_✓s_✓s_✓i_✓o_✓n _✓i_✓s _✓g_✓r_✓a_✓n_✓t_✓e_✓d _✓t_✓o _✓f_✓r_✓e_✓e_✓l_✓y
  1684.                * _✓d_✓i_✓s_✓t_✓r_✓i_✓b_✓u_✓t_✓e _✓c_✓u_✓r_✓s_✓e_✓s _✓a_✓n_✓d _✓i_✓t_✓s _✓d_✓o_✓c_✓u_✓m_✓e_✓n_✓t_✓a_✓t_✓i_✓o_✓n _✓p_✓r_✓o_✓v_✓i_✓d_✓e_✓d _✓t_✓h_✓a_✓t _✓t_✓h_✓i_✓s
  1685.                * _✓n_✓o_✓t_✓i_✓c_✓e _✓i_✓s _✓l_✓e_✓f_✓t _✓i_✓n_✓t_✓a_✓c_✓t.
  1686.                *
  1687.                *         @(#)_✓w_✓i_✓n__✓s_✓t._✓c        _✓6._✓1 (_✓B_✓e_✓r_✓k_✓e_✓l_✓e_✓y) _✓4/_✓2_✓4/_✓8_✓6";
  1688.                */
  1689.  
  1690.               # _✓d_✓e_✓f_✓i_✓n_✓e             WINDOW    _✓s_✓t_✓r_✓u_✓c_✓t _win_st
  1691.  
  1692.               _✓s_✓t_✓r_✓u_✓c_✓t _win_st {
  1693.                          _✓s_✓h_✓o_✓r_✓t               _cury, _curx;
  1694.                          _✓s_✓h_✓o_✓r_✓t               _maxy, _maxx;
  1695.                          _✓s_✓h_✓o_✓r_✓t               _begy, _begx;
  1696.                          _✓s_✓h_✓o_✓r_✓t               _flags;
  1697.                          _✓s_✓h_✓o_✓r_✓t               _ch_off;
  1698.                          bool                _clear;
  1699.                          bool                _leave;
  1700.                          bool                _scroll;
  1701.                          _✓c_✓h_✓a_✓r                **_y;
  1702.                          _✓s_✓h_✓o_✓r_✓t               *_firstch;
  1703.                          _✓s_✓h_✓o_✓r_✓t               *_lastch;
  1704.                          _✓s_✓t_✓r_✓u_✓c_✓t _win_st      *_nextp, *_orig;
  1705.               };
  1706.  
  1707.               # _✓d_✓e_✓f_✓i_✓n_✓e             _ENDLINE            001
  1708.               # _✓d_✓e_✓f_✓i_✓n_✓e             _FULLWIN            002
  1709.               # _✓d_✓e_✓f_✓i_✓n_✓e             _SCROLLWIN          004
  1710.               # _✓d_✓e_✓f_✓i_✓n_✓e             _FLUSH              010
  1711.               # _✓d_✓e_✓f_✓i_✓n_✓e             _FULLLINE           020
  1712.               # _✓d_✓e_✓f_✓i_✓n_✓e             _IDLINE             040
  1713.               # _✓d_✓e_✓f_✓i_✓n_✓e             _STANDOUT           0200
  1714.               # _✓d_✓e_✓f_✓i_✓n_✓e             _NOCHANGE           -1
  1715.  
  1716.  
  1717.                __✓c_✓u_✓r_✓y and __✓c_✓u_✓r_✓x are the current (y, x) co-ordinates for
  1718.           the window.  New characters added to the screen are added at
  1719.           this point.  __✓m_✓a_✓x_✓y and __✓m_✓a_✓x_✓x are the maximum values  allowed
  1720.           for (__✓c_✓u_✓r_✓y, __✓c_✓u_✓r_✓x).  __✓b_✓e_✓g_✓y and __✓b_✓e_✓g_✓x are the starting (y, x)
  1721.           co-ordinates on the  terminal  for  the  window,  _✓i._✓e.,  the
  1722.           window's  home.  __✓c_✓u_✓r_✓y, __✓c_✓u_✓r_✓x, __✓m_✓a_✓x_✓y, and __✓m_✓a_✓x_✓x are measured
  1723.           ____________________
  1724.              [10] All variables not normally accessed directly by  the
  1725.           user  are  named with an initial "_" to avoid conflicts with
  1726.           the user's variables.
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓B
  1740.  
  1741.  
  1742.           relative to (__✓b_✓e_✓g_✓y, __✓b_✓e_✓g_✓x), not the terminal's home.
  1743.  
  1744.                __✓c_✓l_✓e_✓a_✓r tells if a clear-screen sequence is to  be  gen-
  1745.           erated  on the next _✓r_✓e_✓f_✓r_✓e_✓s_✓h() call.  This is only meaningful
  1746.           for screens.  The initial clear-screen  for  the  first  _✓r_✓e_✓-
  1747.           _✓f_✓r_✓e_✓s_✓h()  call  is generated by initially setting clear to be
  1748.           TRUE for _✓c_✓u_✓r_✓s_✓c_✓r, which always generates  a  clear-screen  if
  1749.           set,  irrelevant  of  the dimensions of the window involved.
  1750.           __✓l_✓e_✓a_✓v_✓e is TRUE if the current (y, x)  co-ordinates  and  the
  1751.           cursor  are  to  be left after the last character changed on
  1752.           the terminal, or not moved if there is no  change.   __✓s_✓c_✓r_✓o_✓l_✓l
  1753.           is TRUE if scrolling is allowed.
  1754.  
  1755.                __✓y is a pointer to an array of lines which describe the
  1756.           terminal.  Thus:
  1757.  
  1758.               _y[i]
  1759.  
  1760.  
  1761.           is a pointer to the _✓ith line, and
  1762.  
  1763.               _y[i][j]
  1764.  
  1765.  
  1766.           is the _✓jth character on the _✓ith line.  __✓f_✓l_✓a_✓g_✓s can  have  one
  1767.           or more values or'd into it.
  1768.  
  1769.                For windows that are not subwindows, __✓o_✓r_✓i_✓g  is  NULL  .
  1770.           For  subwindows,  it  points to the main window to which the
  1771.           window is subsidiary.  __✓n_✓e_✓x_✓t_✓p is a pointer in  a  circularly
  1772.           linked  list  of all the windows which are subwindows of the
  1773.           same main window, plus the main window itself.
  1774.  
  1775.                __✓f_✓i_✓r_✓s_✓t_✓c_✓h and __✓l_✓a_✓s_✓t_✓c_✓h are _✓m_✓a_✓l_✓l_✓o_✓c()ed arrays  which  con-
  1776.           tain  the  index of the first and last changed characters on
  1777.           the line.  __✓c_✓h__✓o_✓f_✓f is the x offset for  the  window  in  the
  1778.           __✓f_✓i_✓r_✓s_✓t_✓c_✓h  and __✓l_✓a_✓s_✓t_✓c_✓h arrays for this window.  For main win-
  1779.           dows, this is always 0; for subwindows it is the  difference
  1780.           between  the  starting  point of the main window and that of
  1781.           the subindow, so that change markers can be set relative  to
  1782.           the main window.  This makes these markers global in scope.
  1783.  
  1784.                All subwindows share the appropriate  portions  of  __✓y,
  1785.           __✓f_✓i_✓r_✓s_✓t_✓c_✓h, __✓l_✓a_✓s_✓t_✓c_✓h, and __✓i_✓n_✓s_✓d_✓e_✓l with their main window.
  1786.  
  1787.                __✓E_✓N_✓D_✓L_✓I_✓N_✓E says that the end of the line for this  window
  1788.           is also the end of a screen.  __✓F_✓U_✓L_✓L_✓W_✓I_✓N says that this window
  1789.           is a screen.  __✓S_✓C_✓R_✓O_✓L_✓L_✓W_✓I_✓N indicates that the  last  character
  1790.           of this screen is at the lower right-hand corner of the ter-
  1791.           minal; _✓i._✓e., if a character  was  put  there,  the  terminal
  1792.           would  scroll.   __✓F_✓U_✓L_✓L_✓L_✓I_✓N_✓E  says that the width of a line is
  1793.           the same as the width of the terminal.  If __✓F_✓L_✓U_✓S_✓H is set, it
  1794.           says that _✓f_✓f_✓l_✓u_✓s_✓h(_✓s_✓t_✓d_✓o_✓u_✓t) should be called at the end of each
  1795.  
  1796.  
  1797.  
  1798.  
  1799.  
  1800.  
  1801.  
  1802.  
  1803.  
  1804.  
  1805.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓B
  1806.  
  1807.  
  1808.           _✓r_✓e_✓f_✓r_✓e_✓s_✓h() __✓S_✓T_✓A_✓N_✓D_✓O_✓U_✓T says that all characters  added  to  the
  1809.           screen are in standout mode.  __✓I_✓N_✓S_✓D_✓E_✓L is reserved for future
  1810.           use, and is set by _✓i_✓d_✓l_✓o_✓k().  __✓f_✓i_✓r_✓s_✓t_✓c_✓h is  set  to  __✓N_✓O_✓C_✓H_✓A_✓N_✓G_✓E
  1811.           for  lines  on which there has been no change since the last
  1812.           _✓r_✓e_✓f_✓r_✓e_✓s_✓h().
  1813.  
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  
  1866.  
  1867.  
  1868.  
  1869.  
  1870.  
  1871.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  1872.  
  1873.  
  1874.           _✓1.  _✓E_✓x_✓a_✓m_✓p_✓l_✓e_✓s
  1875.  
  1876.                Here we present a few examples of how to use the  pack-
  1877.           age.    They   attempt  to  be  representative,  though  not
  1878.           comprehensive.
  1879.  
  1880.           _✓2.  _✓S_✓c_✓r_✓e_✓e_✓n _✓U_✓p_✓d_✓a_✓t_✓i_✓n_✓g
  1881.  
  1882.                The following examples are intended to demonstrate  the
  1883.           basic  structure of a program using the screen updating sec-
  1884.           tions of the package.  Several of the programs require  cal-
  1885.           culational  sections which are irrelevant of to the example,
  1886.           and are therefore usually not included.  It  is  hoped  that
  1887.           the data structure definitions give enough of an idea to al-
  1888.           low understanding of what the  relevant  portions  do.   The
  1889.           rest  is  left as an exercise to the reader, and will not be
  1890.           on the final.
  1891.  
  1892.           _✓2._✓1.  _✓T_✓w_✓i_✓n_✓k_✓l_✓e
  1893.  
  1894.                This is a moderately simple program which prints pretty
  1895.           patterns  on  the  screen that might even hold your interest
  1896.           for 30 seconds or more.  It switches between patterns of as-
  1897.           terisks,  putting  them  on  one by one in random order, and
  1898.           then taking them off in the same fashion.  It is more  effi-
  1899.           cient  to  write this using only the motion optimization, as
  1900.           is demonstrated below.
  1901.  
  1902.               /*
  1903.                * _✓C_✓o_✓p_✓y_✓r_✓i_✓g_✓h_✓t _✓1_✓9_✓8_✓0 _✓K_✓e_✓n_✓n_✓e_✓t_✓h _✓C. _✓R. _✓C. _✓A_✓r_✓n_✓o_✓l_✓d _✓a_✓n_✓d _✓T_✓h_✓e _✓R_✓e_✓g_✓e_✓n_✓t_✓s _✓o_✓f _✓t_✓h_✓e
  1904.                * _✓U_✓n_✓i_✓v_✓e_✓r_✓s_✓i_✓t_✓y _✓o_✓f _✓C_✓a_✓l_✓i_✓f_✓o_✓r_✓n_✓i_✓a.  _✓P_✓e_✓r_✓m_✓i_✓s_✓s_✓i_✓o_✓n _✓i_✓s _✓g_✓r_✓a_✓n_✓t_✓e_✓d _✓t_✓o _✓f_✓r_✓e_✓e_✓l_✓y
  1905.                * _✓d_✓i_✓s_✓t_✓r_✓i_✓b_✓u_✓t_✓e _✓c_✓u_✓r_✓s_✓e_✓s _✓a_✓n_✓d _✓i_✓t_✓s _✓d_✓o_✓c_✓u_✓m_✓e_✓n_✓t_✓a_✓t_✓i_✓o_✓n _✓p_✓r_✓o_✓v_✓i_✓d_✓e_✓d _✓t_✓h_✓a_✓t _✓t_✓h_✓i_✓s
  1906.                * _✓n_✓o_✓t_✓i_✓c_✓e _✓i_✓s _✓l_✓e_✓f_✓t _✓i_✓n_✓t_✓a_✓c_✓t.
  1907.                */
  1908.  
  1909.               #_✓i_✓f_✓n_✓d_✓e_✓f lint
  1910.               _✓s_✓t_✓a_✓t_✓i_✓c _✓c_✓h_✓a_✓r sccsid[] = "@(#)twinkle1.c             6.1 (Berkeley) 4/24/86";
  1911.               #_✓e_✓n_✓d_✓i_✓f not lint
  1912.  
  1913.               # _✓i_✓n_✓c_✓l_✓u_✓d_✓e            <curses.h>
  1914.               # _✓i_✓n_✓c_✓l_✓u_✓d_✓e            <signal.h>
  1915.  
  1916.               /*
  1917.                * _✓t_✓h_✓e _✓i_✓d_✓e_✓a _✓f_✓o_✓r _✓t_✓h_✓i_✓s _✓p_✓r_✓o_✓g_✓r_✓a_✓m _✓w_✓a_✓s _✓a _✓p_✓r_✓o_✓d_✓u_✓c_✓t _✓o_✓f _✓t_✓h_✓e _✓i_✓m_✓a_✓g_✓i_✓n_✓a_✓t_✓i_✓o_✓n _✓o_✓f
  1918.                * _✓K_✓u_✓r_✓t _✓S_✓c_✓h_✓o_✓e_✓n_✓s.  _✓N_✓o_✓t _✓r_✓e_✓s_✓p_✓o_✓n_✓s_✓i_✓b_✓l_✓e _✓f_✓o_✓r _✓m_✓i_✓n_✓d_✓s _✓l_✓o_✓s_✓t _✓o_✓r _✓s_✓t_✓o_✓l_✓e_✓n.
  1919.                */
  1920.  
  1921.               # _✓d_✓e_✓f_✓i_✓n_✓e             NCOLS     80
  1922.               # _✓d_✓e_✓f_✓i_✓n_✓e             NLINES    24
  1923.               # _✓d_✓e_✓f_✓i_✓n_✓e             MAXPATTERNS         4
  1924.  
  1925.               _✓t_✓y_✓p_✓e_✓d_✓e_✓f _✓s_✓t_✓r_✓u_✓c_✓t {
  1926.                          _✓i_✓n_✓t       y, x;
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  1938.  
  1939.  
  1940.               } LOCS;
  1941.  
  1942.               LOCS       Layout[NCOLS * NLINES];       /* _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓b_✓o_✓a_✓r_✓d _✓l_✓a_✓y_✓o_✓u_✓t */
  1943.  
  1944.               _✓i_✓n_✓t        Pattern,                      /* _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓p_✓a_✓t_✓t_✓e_✓r_✓n _✓n_✓u_✓m_✓b_✓e_✓r */
  1945.                          Numstars;                     /* _✓n_✓u_✓m_✓b_✓e_✓r _✓o_✓f _✓s_✓t_✓a_✓r_✓s _✓i_✓n _✓p_✓a_✓t_✓t_✓e_✓r_✓n */
  1946.  
  1947.               _✓c_✓h_✓a_✓r       *getenv();
  1948.  
  1949.               _✓i_✓n_✓t        die();
  1950.  
  1951.               main()
  1952.               {
  1953.                          srand(getpid());                        /* _✓i_✓n_✓i_✓t_✓i_✓a_✓l_✓i_✓z_✓e _✓r_✓a_✓n_✓d_✓o_✓m _✓s_✓e_✓q_✓u_✓e_✓n_✓c_✓e */
  1954.  
  1955.                          initscr();
  1956.                          signal(SIGINT, die);
  1957.                          noecho();
  1958.                          nonl();
  1959.                          leaveok(stdscr, TRUE);
  1960.                          scrollok(stdscr, FALSE);
  1961.  
  1962.                          _✓f_✓o_✓r (;;) {
  1963.                                    makeboard();                  /* _✓m_✓a_✓k_✓e _✓t_✓h_✓e _✓b_✓o_✓a_✓r_✓d _✓s_✓e_✓t_✓u_✓p */
  1964.                                    puton('*');                   /* _✓p_✓u_✓t _✓o_✓n '*'_✓s */
  1965.                                    puton(' ');                   /* _✓c_✓o_✓v_✓e_✓r _✓u_✓p _✓w_✓i_✓t_✓h ' '_✓s */
  1966.                          }
  1967.               }
  1968.  
  1969.               /*
  1970.                * _✓O_✓n _✓p_✓r_✓o_✓g_✓r_✓a_✓m _✓e_✓x_✓i_✓t, _✓m_✓o_✓v_✓e _✓t_✓h_✓e _✓c_✓u_✓r_✓s_✓o_✓r _✓t_✓o _✓t_✓h_✓e _✓l_✓o_✓w_✓e_✓r _✓l_✓e_✓f_✓t _✓c_✓o_✓r_✓n_✓e_✓r _✓b_✓y
  1971.                * _✓d_✓i_✓r_✓e_✓c_✓t _✓a_✓d_✓d_✓r_✓e_✓s_✓s_✓i_✓n_✓g, _✓s_✓i_✓n_✓c_✓e _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓l_✓o_✓c_✓a_✓t_✓i_✓o_✓n _✓i_✓s _✓n_✓o_✓t _✓g_✓u_✓a_✓r_✓a_✓n_✓t_✓e_✓e_✓d.
  1972.                * _✓W_✓e _✓l_✓i_✓e _✓a_✓n_✓d _✓s_✓a_✓y _✓w_✓e _✓u_✓s_✓e_✓d _✓t_✓o _✓b_✓e _✓a_✓t _✓t_✓h_✓e _✓u_✓p_✓p_✓e_✓r _✓r_✓i_✓g_✓h_✓t _✓c_✓o_✓r_✓n_✓e_✓r _✓t_✓o _✓g_✓u_✓a_✓r_✓a_✓n_✓t_✓e_✓e
  1973.                * _✓a_✓b_✓s_✓o_✓l_✓u_✓t_✓e _✓a_✓d_✓d_✓r_✓e_✓s_✓s_✓i_✓n_✓g.
  1974.                */
  1975.               die()
  1976.               {
  1977.                          signal(SIGINT, SIG_IGN);
  1978.                          mvcur(0, COLS - 1, LINES - 1, 0);
  1979.                          endwin();
  1980.                          exit(0);
  1981.               }
  1982.  
  1983.  
  1984.               /*
  1985.                * _✓M_✓a_✓k_✓e _✓t_✓h_✓e _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓b_✓o_✓a_✓r_✓d _✓s_✓e_✓t_✓u_✓p.  _✓I_✓t _✓p_✓i_✓c_✓k_✓s _✓a _✓r_✓a_✓n_✓d_✓o_✓m _✓p_✓a_✓t_✓t_✓e_✓r_✓n _✓a_✓n_✓d
  1986.                * _✓c_✓a_✓l_✓l_✓s _✓i_✓s_✓o_✓n() _✓t_✓o _✓d_✓e_✓t_✓e_✓r_✓m_✓i_✓n_✓e _✓i_✓f _✓t_✓h_✓e _✓c_✓h_✓a_✓r_✓a_✓c_✓t_✓e_✓r _✓i_✓s _✓o_✓n _✓t_✓h_✓a_✓t _✓p_✓a_✓t_✓t_✓e_✓r_✓n
  1987.                * _✓o_✓r _✓n_✓o_✓t.
  1988.                */
  1989.               makeboard()
  1990.               {
  1991.                          reg _✓i_✓n_✓t             y, x;
  1992.                          reg LOCS            *lp;
  1993.  
  1994.  
  1995.  
  1996.  
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.  
  2003.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2004.  
  2005.  
  2006.                          Pattern = rand() % MAXPATTERNS;
  2007.                          lp = Layout;
  2008.                          _✓f_✓o_✓r (y = 0; y < NLINES; y++)
  2009.                                    _✓f_✓o_✓r (x = 0; x < NCOLS; x++)
  2010.                                              _✓i_✓f (ison(y, x)) {
  2011.                                                        lp->y = y;
  2012.                                                        lp->x = x;
  2013.                                                        lp++;
  2014.                                              }
  2015.                          Numstars = lp - Layout;
  2016.               }
  2017.  
  2018.               /*
  2019.                * _✓R_✓e_✓t_✓u_✓r_✓n _✓T_✓R_✓U_✓E _✓i_✓f (_✓y, _✓x) _✓i_✓s _✓o_✓n _✓t_✓h_✓e _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓p_✓a_✓t_✓t_✓e_✓r_✓n.
  2020.                */
  2021.               ison(y, x)
  2022.               reg _✓i_✓n_✓t    y, x; {
  2023.  
  2024.                          _✓s_✓w_✓i_✓t_✓c_✓h (Pattern) {
  2025.                            _✓c_✓a_✓s_✓e 0:           /* _✓a_✓l_✓t_✓e_✓r_✓n_✓a_✓t_✓i_✓n_✓g _✓l_✓i_✓n_✓e_✓s */
  2026.                                    _✓r_✓e_✓t_✓u_✓r_✓n !(y & 01);
  2027.                            _✓c_✓a_✓s_✓e 1:           /* _✓b_✓o_✓x */
  2028.                                    _✓i_✓f (x >= LINES && y >= NCOLS)
  2029.                                              _✓r_✓e_✓t_✓u_✓r_✓n FALSE;
  2030.                                    _✓i_✓f (y < 3 || y >= NLINES - 3)
  2031.                                              _✓r_✓e_✓t_✓u_✓r_✓n TRUE;
  2032.                                    _✓r_✓e_✓t_✓u_✓r_✓n (x < 3 || x >= NCOLS - 3);
  2033.                            _✓c_✓a_✓s_✓e 2:           /* _✓h_✓o_✓l_✓y _✓p_✓a_✓t_✓t_✓e_✓r_✓n! */
  2034.                                    _✓r_✓e_✓t_✓u_✓r_✓n ((x + y) & 01);
  2035.                            _✓c_✓a_✓s_✓e 3:           /* _✓b_✓a_✓r _✓a_✓c_✓r_✓o_✓s_✓s _✓c_✓e_✓n_✓t_✓e_✓r */
  2036.                                    _✓r_✓e_✓t_✓u_✓r_✓n (y >= 9 && y <= 15);
  2037.                          }
  2038.                          /* _✓N_✓O_✓T_✓R_✓E_✓A_✓C_✓H_✓E_✓D */
  2039.               }
  2040.  
  2041.               puton(ch)
  2042.               reg _✓c_✓h_✓a_✓r             ch;
  2043.               {
  2044.                          reg LOCS            *lp;
  2045.                          reg _✓i_✓n_✓t             r;
  2046.                          reg LOCS            *end;
  2047.                          LOCS                temp;
  2048.  
  2049.                          end = &Layout[Numstars];
  2050.                          _✓f_✓o_✓r (lp = Layout; lp < end; lp++) {
  2051.                                    r = rand() % Numstars;
  2052.                                    temp = *lp;
  2053.                                    *lp = Layout[r];
  2054.                                    Layout[r] = temp;
  2055.                          }
  2056.  
  2057.                          _✓f_✓o_✓r (lp = Layout; lp < end; lp++) {
  2058.                                    mvaddch(lp->y, lp->x, ch);
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2070.  
  2071.  
  2072.                                    refresh();
  2073.                          }
  2074.               }
  2075.  
  2076.  
  2077.           _✓2._✓2.  _✓L_✓i_✓f_✓e
  2078.  
  2079.                This program fragment models the famous  computer  pat-
  2080.           tern  game  of  life  (Scientific American, May, 1974).  The
  2081.           calculational routines create a linked  list  of  structures
  2082.           defining where each piece is.  Nothing here claims to be op-
  2083.           timal, merely demonstrative.  This code, however, is a  very
  2084.           good place to use the screen updating routines, as it allows
  2085.           them to worry about what the last position looked  like,  so
  2086.           you  don't  have to.  It also demonstrates some of the input
  2087.           routines.
  2088.  
  2089.               /*
  2090.                * _✓C_✓o_✓p_✓y_✓r_✓i_✓g_✓h_✓t _✓1_✓9_✓8_✓0 _✓K_✓e_✓n_✓n_✓e_✓t_✓h _✓C. _✓R. _✓C. _✓A_✓r_✓n_✓o_✓l_✓d _✓a_✓n_✓d _✓T_✓h_✓e _✓R_✓e_✓g_✓e_✓n_✓t_✓s _✓o_✓f _✓t_✓h_✓e
  2091.                * _✓U_✓n_✓i_✓v_✓e_✓r_✓s_✓i_✓t_✓y _✓o_✓f _✓C_✓a_✓l_✓i_✓f_✓o_✓r_✓n_✓i_✓a.  _✓P_✓e_✓r_✓m_✓i_✓s_✓s_✓i_✓o_✓n _✓i_✓s _✓g_✓r_✓a_✓n_✓t_✓e_✓d _✓t_✓o _✓f_✓r_✓e_✓e_✓l_✓y
  2092.                * _✓d_✓i_✓s_✓t_✓r_✓i_✓b_✓u_✓t_✓e _✓c_✓u_✓r_✓s_✓e_✓s _✓a_✓n_✓d _✓i_✓t_✓s _✓d_✓o_✓c_✓u_✓m_✓e_✓n_✓t_✓a_✓t_✓i_✓o_✓n _✓p_✓r_✓o_✓v_✓i_✓d_✓e_✓d _✓t_✓h_✓a_✓t _✓t_✓h_✓i_✓s
  2093.                * _✓n_✓o_✓t_✓i_✓c_✓e _✓i_✓s _✓l_✓e_✓f_✓t _✓i_✓n_✓t_✓a_✓c_✓t.
  2094.                */
  2095.  
  2096.               #_✓i_✓f_✓n_✓d_✓e_✓f lint
  2097.               _✓s_✓t_✓a_✓t_✓i_✓c _✓c_✓h_✓a_✓r sccsid[] = "@(#)life.c                 6.1 (Berkeley) 4/23/86";
  2098.               #_✓e_✓n_✓d_✓i_✓f not lint
  2099.  
  2100.               # _✓i_✓n_✓c_✓l_✓u_✓d_✓e            <curses.h>
  2101.               # _✓i_✓n_✓c_✓l_✓u_✓d_✓e            <signal.h>
  2102.  
  2103.               /*
  2104.                *         _✓R_✓u_✓n _✓a _✓l_✓i_✓f_✓e _✓g_✓a_✓m_✓e.  _✓T_✓h_✓i_✓s _✓i_✓s _✓a _✓d_✓e_✓m_✓o_✓n_✓s_✓t_✓r_✓a_✓t_✓i_✓o_✓n _✓p_✓r_✓o_✓g_✓r_✓a_✓m _✓f_✓o_✓r
  2105.                * _✓t_✓h_✓e _✓S_✓c_✓r_✓e_✓e_✓n _✓U_✓p_✓d_✓a_✓t_✓i_✓n_✓g _✓s_✓e_✓c_✓t_✓i_✓o_✓n _✓o_✓f _✓t_✓h_✓e -_✓l_✓c_✓u_✓r_✓s_✓e_✓s _✓c_✓u_✓r_✓s_✓o_✓r _✓p_✓a_✓c_✓k_✓a_✓g_✓e.
  2106.                */
  2107.  
  2108.               _✓t_✓y_✓p_✓e_✓d_✓e_✓f _✓s_✓t_✓r_✓u_✓c_✓t lst_st {                            /* _✓l_✓i_✓n_✓k_✓e_✓d _✓l_✓i_✓s_✓t _✓e_✓l_✓e_✓m_✓e_✓n_✓t */
  2109.                          _✓i_✓n_✓t                 y, x;               /* (_✓y, _✓x) _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n _✓o_✓f _✓p_✓i_✓e_✓c_✓e */
  2110.                          _✓s_✓t_✓r_✓u_✓c_✓t lst_st       *next, *last;       /* _✓d_✓o_✓u_✓b_✓l_✓y _✓l_✓i_✓n_✓k_✓e_✓d */
  2111.               } LIST;
  2112.  
  2113.               LIST       *Head;                        /* _✓h_✓e_✓a_✓d _✓o_✓f _✓l_✓i_✓n_✓k_✓e_✓d _✓l_✓i_✓s_✓t */
  2114.  
  2115.               _✓i_✓n_✓t        die();
  2116.  
  2117.               main(ac, av)
  2118.               _✓i_✓n_✓t        ac;
  2119.               _✓c_✓h_✓a_✓r       *av[];
  2120.               {
  2121.                          evalargs(ac, av);                       /* _✓e_✓v_✓a_✓l_✓u_✓a_✓t_✓e _✓a_✓r_✓g_✓u_✓m_✓e_✓n_✓t_✓s */
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2136.  
  2137.  
  2138.                          initscr();                              /* _✓i_✓n_✓i_✓t_✓i_✓a_✓l_✓i_✓z_✓e _✓s_✓c_✓r_✓e_✓e_✓n _✓p_✓a_✓c_✓k_✓a_✓g_✓e */
  2139.                          signal(SIGINT, die);                    /* _✓s_✓e_✓t _✓t_✓o _✓r_✓e_✓s_✓t_✓o_✓r_✓e _✓t_✓t_✓y _✓s_✓t_✓a_✓t_✓s */
  2140.                          cbreak();                               /* _✓s_✓e_✓t _✓f_✓o_✓r _✓c_✓h_✓a_✓r-_✓b_✓y-_✓c_✓h_✓a_✓r */
  2141.                          noecho();                               /*                                                             _✓i_✓n_✓p_✓u_✓t */
  2142.                          nonl();                                 /* _✓f_✓o_✓r _✓o_✓p_✓t_✓i_✓m_✓i_✓z_✓a_✓t_✓i_✓o_✓n */
  2143.  
  2144.                          getstart();                             /* _✓g_✓e_✓t _✓s_✓t_✓a_✓r_✓t_✓i_✓n_✓g _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n */
  2145.                          _✓f_✓o_✓r (;;) {
  2146.                                    prboard();                    /* _✓p_✓r_✓i_✓n_✓t _✓o_✓u_✓t _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓b_✓o_✓a_✓r_✓d */
  2147.                                    update();                     /* _✓u_✓p_✓d_✓a_✓t_✓e _✓b_✓o_✓a_✓r_✓d _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n */
  2148.                          }
  2149.               }
  2150.  
  2151.               /*
  2152.                * _✓T_✓h_✓i_✓s _✓i_✓s _✓t_✓h_✓e _✓r_✓o_✓u_✓t_✓i_✓n_✓e _✓w_✓h_✓i_✓c_✓h _✓i_✓s _✓c_✓a_✓l_✓l_✓e_✓d _✓w_✓h_✓e_✓n _✓r_✓u_✓b_✓o_✓u_✓t _✓i_✓s _✓h_✓i_✓t.
  2153.                * _✓I_✓t _✓r_✓e_✓s_✓e_✓t_✓s _✓t_✓h_✓e _✓t_✓t_✓y _✓s_✓t_✓a_✓t_✓s _✓t_✓o _✓t_✓h_✓e_✓i_✓r _✓o_✓r_✓i_✓g_✓i_✓n_✓a_✓l _✓v_✓a_✓l_✓u_✓e_✓s.  _✓T_✓h_✓i_✓s
  2154.                * _✓i_✓s _✓t_✓h_✓e _✓n_✓o_✓r_✓m_✓a_✓l _✓w_✓a_✓y _✓o_✓f _✓l_✓e_✓a_✓v_✓i_✓n_✓g _✓t_✓h_✓e _✓p_✓r_✓o_✓g_✓r_✓a_✓m.
  2155.                */
  2156.               die()
  2157.               {
  2158.                          signal(SIGINT, SIG_IGN);                          /* _✓i_✓g_✓n_✓o_✓r_✓e _✓r_✓u_✓b_✓o_✓u_✓t_✓s */
  2159.                          mvcur(0, COLS - 1, LINES - 1, 0);                 /* _✓g_✓o _✓t_✓o _✓b_✓o_✓t_✓t_✓o_✓m _✓o_✓f _✓s_✓c_✓r_✓e_✓e_✓n */
  2160.                          endwin();                                         /* _✓s_✓e_✓t _✓t_✓e_✓r_✓m_✓i_✓n_✓a_✓l _✓t_✓o _✓g_✓o_✓o_✓d _✓s_✓t_✓a_✓t_✓e */
  2161.                          exit(0);
  2162.               }
  2163.  
  2164.               /*
  2165.                * _✓G_✓e_✓t _✓t_✓h_✓e _✓s_✓t_✓a_✓r_✓t_✓i_✓n_✓g _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n _✓f_✓r_✓o_✓m _✓t_✓h_✓e _✓u_✓s_✓e_✓r.  _✓T_✓h_✓e_✓y _✓k_✓e_✓y_✓s _✓u, _✓i, _✓o, _✓j, _✓l,
  2166.                * _✓m, ,, _✓a_✓n_✓d . _✓a_✓r_✓e _✓u_✓s_✓e_✓d _✓f_✓o_✓r _✓m_✓o_✓v_✓i_✓n_✓g _✓t_✓h_✓e_✓i_✓r _✓r_✓e_✓l_✓a_✓t_✓i_✓v_✓e _✓d_✓i_✓r_✓e_✓c_✓t_✓i_✓o_✓n_✓s _✓f_✓r_✓o_✓m _✓t_✓h_✓e
  2167.                * _✓k _✓k_✓e_✓y.  _✓T_✓h_✓u_✓s, _✓u _✓m_✓o_✓v_✓e _✓d_✓i_✓a_✓g_✓o_✓n_✓a_✓l_✓l_✓y _✓u_✓p _✓t_✓o _✓t_✓h_✓e _✓l_✓e_✓f_✓t, , _✓m_✓o_✓v_✓e_✓s _✓d_✓i_✓r_✓e_✓c_✓t_✓l_✓y _✓d_✓o_✓w_✓n,
  2168.                * _✓e_✓t_✓c.  _✓x _✓p_✓l_✓a_✓c_✓e_✓s _✓a _✓p_✓i_✓e_✓c_✓e _✓a_✓t _✓t_✓h_✓e _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n, " " _✓t_✓a_✓k_✓e_✓s _✓i_✓t _✓a_✓w_✓a_✓y.
  2169.                * _✓T_✓h_✓e _✓i_✓n_✓p_✓u_✓t _✓c_✓a_✓n _✓a_✓l_✓s_✓o _✓b_✓e _✓f_✓r_✓o_✓m _✓a _✓f_✓i_✓l_✓e.  _✓T_✓h_✓e _✓l_✓i_✓s_✓t _✓i_✓s _✓b_✓u_✓i_✓l_✓t _✓a_✓f_✓t_✓e_✓r _✓t_✓h_✓e
  2170.                * _✓b_✓o_✓a_✓r_✓d _✓s_✓e_✓t_✓u_✓p _✓i_✓s _✓r_✓e_✓a_✓d_✓y.
  2171.                */
  2172.               getstart()
  2173.               {
  2174.                          reg _✓c_✓h_✓a_✓r            c;
  2175.                          reg _✓i_✓n_✓t             x, y;
  2176.                          _✓a_✓u_✓t_✓o _✓c_✓h_✓a_✓r           buf[100];
  2177.  
  2178.                          box(stdscr, '|', '_');                  /* _✓b_✓o_✓x _✓i_✓n _✓t_✓h_✓e _✓s_✓c_✓r_✓e_✓e_✓n */
  2179.                          move(1, 1);                             /* _✓m_✓o_✓v_✓e _✓t_✓o _✓u_✓p_✓p_✓e_✓r _✓l_✓e_✓f_✓t _✓c_✓o_✓r_✓n_✓e_✓r */
  2180.  
  2181.                          _✓f_✓o_✓r (;;) {
  2182.                                    refresh();                    /* _✓p_✓r_✓i_✓n_✓t _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n */
  2183.                                    _✓i_✓f ((c = getch()) == 'q')
  2184.                                              _✓b_✓r_✓e_✓a_✓k;
  2185.                                    _✓s_✓w_✓i_✓t_✓c_✓h (c) {
  2186.                                      _✓c_✓a_✓s_✓e 'u':
  2187.                                      _✓c_✓a_✓s_✓e 'i':
  2188.                                      _✓c_✓a_✓s_✓e 'o':
  2189.                                      _✓c_✓a_✓s_✓e 'j':
  2190.                                      _✓c_✓a_✓s_✓e 'l':
  2191.  
  2192.  
  2193.  
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2202.  
  2203.  
  2204.                                      _✓c_✓a_✓s_✓e 'm':
  2205.                                      _✓c_✓a_✓s_✓e ',':
  2206.                                      _✓c_✓a_✓s_✓e '.':
  2207.                                              adjustyx(c);
  2208.                                              _✓b_✓r_✓e_✓a_✓k;
  2209.                                      _✓c_✓a_✓s_✓e 'f':
  2210.                                              mvaddstr(0, 0, "File name: ");
  2211.                                              getstr(buf);
  2212.                                              readfile(buf);
  2213.                                              _✓b_✓r_✓e_✓a_✓k;
  2214.                                      _✓c_✓a_✓s_✓e 'x':
  2215.                                              addch('X');
  2216.                                              _✓b_✓r_✓e_✓a_✓k;
  2217.                                      _✓c_✓a_✓s_✓e ' ':
  2218.                                              addch(' ');
  2219.                                              _✓b_✓r_✓e_✓a_✓k;
  2220.                                    }
  2221.                          }
  2222.  
  2223.                          _✓i_✓f (Head != NULL)                                 /* _✓s_✓t_✓a_✓r_✓t _✓n_✓e_✓w _✓l_✓i_✓s_✓t */
  2224.                                    dellist(Head);
  2225.                          Head = malloc(_✓s_✓i_✓z_✓e_✓o_✓f (LIST));
  2226.  
  2227.                          /*
  2228.                           * _✓l_✓o_✓o_✓p _✓t_✓h_✓r_✓o_✓u_✓g_✓h _✓t_✓h_✓e _✓s_✓c_✓r_✓e_✓e_✓n _✓l_✓o_✓o_✓k_✓i_✓n_✓g _✓f_✓o_✓r '_✓x'_✓s, _✓a_✓n_✓d _✓a_✓d_✓d _✓a _✓l_✓i_✓s_✓t
  2229.                           * _✓e_✓l_✓e_✓m_✓e_✓n_✓t _✓f_✓o_✓r _✓e_✓a_✓c_✓h _✓o_✓n_✓e
  2230.                           */
  2231.                          _✓f_✓o_✓r (y = 1; y < LINES - 1; y++)
  2232.                                    _✓f_✓o_✓r (x = 1; x < COLS - 1; x++) {
  2233.                                              move(y, x);
  2234.                                              _✓i_✓f (inch() == 'x')
  2235.                                                        addlist(y, x);
  2236.                                    }
  2237.               }
  2238.  
  2239.               /*
  2240.                * _✓P_✓r_✓i_✓n_✓t _✓o_✓u_✓t _✓t_✓h_✓e _✓c_✓u_✓r_✓r_✓e_✓n_✓t _✓b_✓o_✓a_✓r_✓d _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n _✓f_✓r_✓o_✓m _✓t_✓h_✓e _✓l_✓i_✓n_✓k_✓e_✓d _✓l_✓i_✓s_✓t
  2241.                */
  2242.               prboard() {
  2243.  
  2244.                          reg LIST            *hp;
  2245.  
  2246.                          erase();                                /* _✓c_✓l_✓e_✓a_✓r _✓o_✓u_✓t _✓l_✓a_✓s_✓t _✓p_✓o_✓s_✓i_✓t_✓i_✓o_✓n */
  2247.                          box(stdscr, '|', '_');                  /* _✓b_✓o_✓x _✓i_✓n _✓t_✓h_✓e _✓s_✓c_✓r_✓e_✓e_✓n */
  2248.  
  2249.                          /*
  2250.                           * _✓g_✓o _✓t_✓h_✓r_✓o_✓u_✓g_✓h _✓t_✓h_✓e _✓l_✓i_✓s_✓t _✓a_✓d_✓d_✓i_✓n_✓g _✓e_✓a_✓c_✓h _✓p_✓i_✓e_✓c_✓e _✓t_✓o _✓t_✓h_✓e _✓n_✓e_✓w_✓l_✓y
  2251.                           * _✓b_✓l_✓a_✓n_✓k _✓b_✓o_✓a_✓r_✓d
  2252.                           */
  2253.                          _✓f_✓o_✓r (hp = Head; hp; hp = hp->next)
  2254.                                    mvaddch(hp->y, hp->x, 'X');
  2255.  
  2256.                          refresh();
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2268.  
  2269.  
  2270.               }
  2271.  
  2272.  
  2273.           _✓3.  _✓M_✓o_✓t_✓i_✓o_✓n _✓o_✓p_✓t_✓i_✓m_✓i_✓z_✓a_✓t_✓i_✓o_✓n
  2274.  
  2275.                The following example shows how motion optimization  is
  2276.           written  on  its own.  Programs which flit from one place to
  2277.           another without regard for what is already there usually  do
  2278.           not need the overhead of both space and time associated with
  2279.           screen updating.  They should instead use  motion  optimiza-
  2280.           tion.
  2281.  
  2282.           _✓3._✓1.  _✓T_✓w_✓i_✓n_✓k_✓l_✓e
  2283.  
  2284.                The _✓t_✓w_✓i_✓n_✓k_✓l_✓e program is a good candidate for simple  mo-
  2285.           tion  optimization.   Here  is how it could be written (only
  2286.           the routines that have been changed are shown):
  2287.  
  2288.               /*
  2289.                * _✓C_✓o_✓p_✓y_✓r_✓i_✓g_✓h_✓t _✓1_✓9_✓8_✓0 _✓K_✓e_✓n_✓n_✓e_✓t_✓h _✓C. _✓R. _✓C. _✓A_✓r_✓n_✓o_✓l_✓d _✓a_✓n_✓d _✓T_✓h_✓e _✓R_✓e_✓g_✓e_✓n_✓t_✓s _✓o_✓f _✓t_✓h_✓e
  2290.                * _✓U_✓n_✓i_✓v_✓e_✓r_✓s_✓i_✓t_✓y _✓o_✓f _✓C_✓a_✓l_✓i_✓f_✓o_✓r_✓n_✓i_✓a.  _✓P_✓e_✓r_✓m_✓i_✓s_✓s_✓i_✓o_✓n _✓i_✓s _✓g_✓r_✓a_✓n_✓t_✓e_✓d _✓t_✓o _✓f_✓r_✓e_✓e_✓l_✓y
  2291.                * _✓d_✓i_✓s_✓t_✓r_✓i_✓b_✓u_✓t_✓e _✓c_✓u_✓r_✓s_✓e_✓s _✓a_✓n_✓d _✓i_✓t_✓s _✓d_✓o_✓c_✓u_✓m_✓e_✓n_✓t_✓a_✓t_✓i_✓o_✓n _✓p_✓r_✓o_✓v_✓i_✓d_✓e_✓d _✓t_✓h_✓a_✓t _✓t_✓h_✓i_✓s
  2292.                * _✓n_✓o_✓t_✓i_✓c_✓e _✓i_✓s _✓l_✓e_✓f_✓t _✓i_✓n_✓t_✓a_✓c_✓t.
  2293.                */
  2294.  
  2295.               #_✓i_✓f_✓n_✓d_✓e_✓f lint
  2296.               _✓s_✓t_✓a_✓t_✓i_✓c _✓c_✓h_✓a_✓r sccsid[] = "@(#)twinkle2.c             6.1 (Berkeley) 4/24/86";
  2297.               #_✓e_✓n_✓d_✓i_✓f not lint
  2298.  
  2299.               _✓e_✓x_✓t_✓e_✓r_✓n _✓i_✓n_✓t           _putchar();
  2300.  
  2301.               main()
  2302.               {
  2303.                          reg _✓c_✓h_✓a_✓r            *sp;
  2304.  
  2305.                          srand(getpid());                        /* _✓i_✓n_✓i_✓t_✓i_✓a_✓l_✓i_✓z_✓e _✓r_✓a_✓n_✓d_✓o_✓m _✓s_✓e_✓q_✓u_✓e_✓n_✓c_✓e */
  2306.  
  2307.                          _✓i_✓f (isatty(0)) {
  2308.                                 gettmode();
  2309.                                 _✓i_✓f ((sp = getenv("TERM")) != NULL)
  2310.                                           setterm(sp);
  2311.                                    signal(SIGINT, die);
  2312.                          }
  2313.                          _✓e_✓l_✓s_✓e {
  2314.                                    printf("Need a terminal on %d\n", _tty_ch);
  2315.                                    exit(1);
  2316.                          }
  2317.                          _puts(TI);
  2318.                          _puts(VS);
  2319.  
  2320.                          noecho();
  2321.                          nonl();
  2322.                          tputs(CL, NLINES, _putchar);
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.  
  2331.  
  2332.  
  2333.                                    _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C
  2334.  
  2335.  
  2336.                          _✓f_✓o_✓r (;;) {
  2337.                                    makeboard();                  /* _✓m_✓a_✓k_✓e _✓t_✓h_✓e _✓b_✓o_✓a_✓r_✓d _✓s_✓e_✓t_✓u_✓p */
  2338.                                    puton('*');                   /* _✓p_✓u_✓t _✓o_✓n '*'_✓s */
  2339.                                    puton(' ');                   /* _✓c_✓o_✓v_✓e_✓r _✓u_✓p _✓w_✓i_✓t_✓h ' '_✓s */
  2340.                          }
  2341.               }
  2342.  
  2343.               puton(ch)
  2344.               _✓c_✓h_✓a_✓r       ch;
  2345.               {
  2346.                          reg LOCS            *lp;
  2347.                          reg _✓i_✓n_✓t             r;
  2348.                          reg LOCS            *end;
  2349.                          LOCS                temp;
  2350.                          _✓s_✓t_✓a_✓t_✓i_✓c _✓i_✓n_✓t          lasty, lastx;
  2351.  
  2352.                          end = &Layout[Numstars];
  2353.                          _✓f_✓o_✓r (lp = Layout; lp < end; lp++) {
  2354.                                    r = rand() % Numstars;
  2355.                                    temp = *lp;
  2356.                                    *lp = Layout[r];
  2357.                                    Layout[r] = temp;
  2358.                          }
  2359.  
  2360.                          _✓f_✓o_✓r (lp = Layout; lp < end; lp++)
  2361.                                              /* _✓p_✓r_✓e_✓v_✓e_✓n_✓t _✓s_✓c_✓r_✓o_✓l_✓l_✓i_✓n_✓g */
  2362.                                    _✓i_✓f (!AM || (lp->y < NLINES - 1 || lp->x < NCOLS - 1)) {
  2363.                                              mvcur(lasty, lastx, lp->y, lp->x);
  2364.                                              putchar(ch);
  2365.                                              lasty = lp->y;
  2366.                                              _✓i_✓f ((lastx = lp->x + 1) >= NCOLS)
  2367.                                                        _✓i_✓f (AM) {
  2368.                                                                  lastx = 0;
  2369.                                                                  lasty++;
  2370.                                                        }
  2371.                                                        _✓e_✓l_✓s_✓e
  2372.                                                                  lastx = NCOLS - 1;
  2373.                                    }
  2374.               }
  2375.  
  2376.  
  2377.  
  2378.  
  2379.  
  2380.  
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.  
  2399.           PS1:18-2                                      Screen Package
  2400.  
  2401.  
  2402.           _✓C_✓o_✓n_✓t_✓e_✓n_✓t_✓s
  2403.  
  2404.           1 Overview ............................................    3
  2405.              1.1 Terminology (or, Words You Can Say  to  Sound
  2406.              Brilliant) .........................................    3
  2407.              1.2 Compiling Things ...............................    3
  2408.              1.3 Screen Updating ................................    4
  2409.              1.4 Naming Conventions .............................    4
  2410.           2 Variables ...........................................    5
  2411.           3 Usage ...............................................    6
  2412.              3.1 Starting up ....................................    6
  2413.              3.2 The Nitty-Gritty ...............................    7
  2414.                 3.2.1 Output ....................................    7
  2415.                 3.2.2 Input .....................................    8
  2416.                 3.2.3 Miscellaneous .............................    8
  2417.              3.3 Finishing up ...................................    8
  2418.           4 Cursor Motion Optimization: Standing Alone ..........    8
  2419.              4.1 Terminal Information ...........................    9
  2420.              4.2  Movement  Optimizations,  or,  Getting  Over
  2421.              Yonder .............................................   10
  2422.           5 The Functions .......................................   10
  2423.              5.1 Output Functions ...............................   11
  2424.              5.2 Input Functions ................................   16
  2425.              5.3 Miscellaneous Functions ........................   18
  2426.              5.4 Details ........................................   22
  2427.  
  2428.  
  2429.           _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x_✓e_✓s
  2430.  
  2431.           _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓A ............................................   24
  2432.           1 Capabilities from termcap ...........................   24
  2433.              1.1 Disclaimer .....................................   24
  2434.              1.2 Overview .......................................   24
  2435.              1.3 Variables Set By setterm() .....................   24
  2436.              1.4 Variables Set By gettmode() ....................   25
  2437.           _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓B ............................................   27
  2438.           1 The WINDOW structure ................................   27
  2439.           _✓A_✓p_✓p_✓e_✓n_✓d_✓i_✓x _✓C ............................................   30
  2440.           1 Examples ............................................   30
  2441.           2 Screen Updating .....................................   30
  2442.              2.1 Twinkle ........................................   30
  2443.              2.2 Life ...........................................   33
  2444.           3 Motion optimization .................................   36
  2445.              3.1 Twinkle ........................................   36
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461.