home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / visionix / vinu.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-28  |  21.7 KB  |  1,350 lines

  1. {
  2.  ════════════════════════════════════════════════════════════════════════════
  3.  
  4.  Visionix Input Unit (VIN)
  5.    Version 0.6
  6.  Copyright 1991,92,93 Visionix
  7.  ALL RIGHTS RESERVED
  8.  
  9.  ────────────────────────────────────────────────────────────────────────────
  10.  
  11.  Revision history in reverse chronological order:
  12.  
  13.  Initials  Date      Comment
  14.  ────────  ────────  ────────────────────────────────────────────────────────
  15.  
  16.  lpg       03/15/93  Added Source Documentation
  17.  
  18.  mep       02/11/93  Cleaned up code for beta release
  19.  
  20.  jrt       02/08/93  Sync with beta 0.12 release
  21.  
  22.  jrt       12/07/92  Sync with beta 0.11 release
  23.  
  24.  jrt       11/21/92  Sync with beta 0.08
  25.  
  26.  jrt       09/01/92  First logged revision.
  27.  
  28.  ════════════════════════════════════════════════════════════════════════════
  29.  
  30. }
  31.  
  32.  
  33. (*-
  34.  
  35. [TEXT]
  36.  
  37. <Overview>
  38.  
  39. The VINu unit implements the input functions for the VisionTools
  40. text-stream input/output architecture.
  41.  
  42. The present implementation of VIN is an extremely simplified, one
  43. channel, no sub-channel version of VOUT.  This unit has been rewritten
  44. and will be replaced with the full multi-channel unit in the next
  45. BETA release.
  46.  
  47. <Interface>
  48.  
  49. -*)
  50.  
  51.  
  52. {$V-}
  53.  
  54. Unit VInu;
  55.  
  56. Interface
  57.  
  58. Uses
  59.  
  60.   VTypesu,
  61.   VMultiu;
  62.  
  63. {────────────────────────────────────────────────────────────────────────────}
  64.  
  65. Const
  66.  
  67.   Key_Tab       = 9;
  68.   Key_ESC       = 27;
  69.   Key_CR        = 13;
  70.  
  71.   Key_ShiftTab  = 15;
  72.   Key_PgDn      = 81;
  73.   Key_PgUp      = 73;
  74.   Key_Home      = 71;
  75.   Key_End       = 79;
  76.   Key_Down      = 80;
  77.   Key_Up        = 72;
  78.   Key_Right     = 77;
  79.   Key_Left      = 75;
  80.  
  81.   Key_Ins       = 82;
  82.   Key_Del       = 83;
  83.  
  84.   Key_F1        = 59;
  85.   Key_F2        = 60;
  86.   Key_F3        = 61;
  87.   Key_F4        = 62;
  88.   Key_F5        = 63;
  89.   Key_F6        = 64;
  90.   Key_F7        = 65;
  91.   Key_F8        = 66;
  92.   Key_F9        = 67;
  93.   Key_F10       = 68;
  94.  
  95.   IDF_DriverNew      = 1;
  96.   IDF_DriverOff      = 2;
  97.   IDF_DriverOn       = 3;
  98.   IDF_DriverDispose  = 4;
  99.   IDF_Look           = 5;
  100.   IDF_Read           = 6;
  101.   IDF_Write          = 7;
  102.   IDF_State          = 8;
  103.   IDF_Flush          = 9;
  104.   IDF_Pressed        = 10;
  105.  
  106.   IDS_Changed        = 1;
  107.   IDS_Install        = 2;
  108.   IDS_Sequence       = 4;
  109.  
  110.   KDP_New            = 1;
  111.   KDP_Do             = 2;
  112.   KDP_Dispose        = 3;
  113.  
  114. Type
  115.  
  116.   PInDriverPacket=^TInDriverPacket;
  117.  
  118.   TInDriverProc = Procedure( IDPacket : PInDriverPacket );
  119.  
  120.   TProcName = String[20];
  121.  
  122.   PProcName = ^TProcName;
  123.  
  124.   {----}
  125.  
  126.   TInDriverPacket = Record
  127.  
  128.     Func          : WORD;
  129.     ID            : Pointer;
  130.     InDriverProc  : TInDriverProc;
  131.     SysKeyBuff    : Pointer;
  132.     Name          : PProcName;
  133.     DriverInfo    : Pointer;
  134.     Key           : CHAR;
  135.     State         : BYTE;
  136.     KeysToWrite   : PString;
  137.     Pressed       : BOOLEAN;
  138.  
  139.     Status        : WORD;
  140.  
  141.   End;
  142.  
  143.   PInDriverProc = ^TInDriverProc;
  144.  
  145.   {----}
  146.  
  147.   PInDriverList = ^TInDriverList;
  148.  
  149.   TInDriverList = Record
  150.  
  151.     Proc      : TInDriverProc;
  152.     ID        : Pointer;
  153.     Next      : PInDriverList;
  154.  
  155.   End;
  156.  
  157.   {----}
  158.  
  159.  
  160.   TKeyProc = Procedure( Status     : BYTE;
  161.                         Key1, Key2 : CHAR   );
  162.  
  163.   PKeyProcList = ^TKeyProcList;
  164.  
  165.   TKeyProcList = RECORD
  166.  
  167.     Key1       : CHAR;
  168.     Key2       : CHAR;
  169.     Proc       : TKeyProc;
  170.     Name       : TProcName;
  171.     ProcInfo   : Pointer;
  172.     Off        : WORD;
  173.     Next       : PKeyProcList;
  174.  
  175.   END;
  176.  
  177.   {----}
  178.  
  179.   TInDriverIData = Record
  180.  
  181.     KeyBuff : PString;
  182.     Off     : WORD;
  183.     Name    : TProcName;
  184.  
  185.   END;
  186.  
  187.   PInDriverIData = ^TInDriverIData;
  188.  
  189.   {----}
  190.  
  191. {────────────────────────────────────────────────────────────────────────────}
  192.  
  193. Procedure VInDriverNew(              Proc        : TInDriverProc;
  194.                                      Name        : TProcName;
  195.                                      DriverInfo  : Pointer;
  196.                                  Var Err         : WORD       );
  197.  
  198. Procedure VInDriverOff(              Name        : TProcName  );
  199.  
  200. Procedure VInDriverOn(               Name        : TProcName  );
  201.  
  202. Procedure VInDriverDispose(          Name        : TProcName  );
  203.  
  204. Function  VInLook    : CHAR;
  205.  
  206. Function  VInRead    : CHAR;
  207.  
  208. Function  VInState   : BYTE;
  209.  
  210. Procedure VInWrite( Keys : String );
  211.  
  212. Function  VInPressed : BOOLEAN;
  213.  
  214. Procedure VInFlush;
  215.  
  216. Procedure VKeyProcNew(                Key1        : CHAR;
  217.                                       Key2        : CHAR;
  218.                                       Proc        : TKeyProc;
  219.                                       Name        : TProcName;
  220.                                       ProcInfo    : Pointer;
  221.                                   Var Err         : WORD       );
  222.  
  223. Procedure VKeyProcOff(                Name        : TProcName  );
  224.  
  225. Procedure VKeyProcOn(                 Name        : TProcName  );
  226.  
  227. Procedure VKeyProcDispose(            Name        : TProcName  );
  228.  
  229. {Procedure DefaultInDriverProc( IDP : PInDriverPacket );}
  230.  
  231. {────────────────────────────────────────────────────────────────────────────}
  232.  
  233. Implementation
  234.  
  235. Type
  236.  
  237.   TDefKdInstanceData = Record
  238.  
  239.     KeyBuff : PString;
  240.     Off     : WORD;
  241.     Name    : TProcName;
  242.  
  243.   END;
  244.  
  245.   PDefKDInstanceData = ^TDefKDInstanceData;
  246.  
  247.   TChanInfo = Record
  248.  
  249.     IDP              : TInDriverPacket;
  250.  
  251.     KeyBuff          : String;
  252.  
  253.     InDriverListHead : PInDriverList;
  254.     InDriverListTail : PInDriverList;
  255.     InDriverListCurr : Array[1..20] of PInDriverList;
  256.  
  257.     KeyProcList      : PKeyProcList;
  258.  
  259.   END;
  260.  
  261. Var
  262.  
  263.   C : TChanInfo;
  264.  
  265. {────────────────────────────────────────────────────────────────────────────}
  266.  
  267. (*
  268. Procedure DefaultInDriverProc( IDP : PInDriverPacket );
  269.  
  270. Var
  271.  
  272.    KeyBufHead : INTEGER absolute $0000:$041A;
  273.    KeyBufTail : INTEGER absolute $0000:$041C;
  274.  
  275.    IData      : PDefKDInstanceData;
  276.  
  277. BEGIN
  278.  
  279.   IData := IDP^.ID;
  280.  
  281.   If IDP^.Status = 0 Then
  282.   BEGIN
  283.  
  284.     Case IDP^.Func Of
  285.  
  286.       IDF_DriverNew:
  287.       BEGIN
  288.  
  289.         IF @IDP^.InDriverProc = @DefaultInDriverProc Then
  290.         BEGIN
  291.  
  292.           New( Idata );
  293.  
  294.           IData^.Name    := IDP^.Name^;
  295.           IData^.KeyBuff := IDP^.SysKeyBuff;
  296.           IData^.Off     := 0;
  297.  
  298.           IDP^.Status := IDS_Install+IDS_Changed;
  299.  
  300.           IDP^.ID := IData;
  301.  
  302.         END;
  303.  
  304.       END;
  305.  
  306.       {----}
  307.  
  308.       IDF_DriverOff:
  309.       BEGIN
  310.  
  311.         If IDP^.Name^ = IData^.Name Then
  312.         BEGIN
  313.  
  314.           Inc( Idata^.Off );
  315.  
  316.         END;
  317.  
  318.       END;
  319.  
  320.       {----}
  321.  
  322.       IDF_DriverOn:
  323.       BEGIN
  324.  
  325.         If IDP^.Name^ = IData^.Name Then
  326.         BEGIN
  327.  
  328.           If Idata^.Off <> 0 Then
  329.             Dec( Idata^.Off );
  330.  
  331.         END;
  332.  
  333.       END;
  334.  
  335.       {----}
  336.  
  337.       IDF_DriverDispose:
  338.       BEGIN
  339.  
  340.         If IDP^.Name^ = IData^.Name Then
  341.         BEGIN
  342.  
  343.           {RemoveFromInDriverStack }
  344.  
  345.           Dispose( IData );
  346.  
  347.         END;
  348.  
  349.       END;
  350.  
  351.       {----}
  352.  
  353.       IDF_Look:
  354.       If IData^.Off=0 Then
  355.       BEGIN
  356.  
  357.         If Idata^.KeyBuff^<>'' Then
  358.         BEGIN
  359.  
  360.           IDP^.Key := IData^.KeyBuff^[1];
  361.  
  362.           IDP^.Status := IDS_Changed;
  363.  
  364.         END
  365.         Else
  366.         BEGIN
  367.  
  368.           If KeyPressed Then
  369.           BEGIN
  370.  
  371.             IDP^.Key := ReadKey;
  372.  
  373.             IData^.KeyBuff^ := IData^.KeyBuff^ + IDP^.Key;
  374.  
  375.             IDP^.Status := IDS_Changed;
  376.  
  377.           END;
  378.  
  379.         END;
  380.  
  381.       END;
  382.  
  383.       {----}
  384.  
  385.       IDF_Read:
  386.       If IData^.Off=0 Then
  387.       BEGIN
  388.  
  389.         If IData^.KeyBuff^<>'' Then
  390.         BEGIN
  391.  
  392.           IDP^.Key := IData^.KeyBuff^[1];
  393.  
  394.           Delete( IData^.KeyBuff^, 1, 1 );
  395.  
  396.           IDP^.Status := IDS_Changed;
  397.  
  398.           If IDP^.Key=#0 Then
  399.             IDP^.Status := IDP^.Status + IDS_Sequence;
  400.  
  401.         END
  402.         Else
  403.         BEGIN
  404.  
  405.           If KeyPressed Then
  406.           BEGIN
  407.  
  408.             IDP^.Key := ReadKey;
  409.  
  410.             IDP^.Status := IDS_Changed;
  411.  
  412.             If IDP^.Key = #0 Then
  413.               IDP^.Status := IDP^.Status + IDS_Sequence;
  414.  
  415.           END;
  416.  
  417.         END;
  418.  
  419.       END;
  420.  
  421.       {----}
  422.  
  423.       IDF_Write:
  424.       BEGIN
  425.  
  426.         IData^.KeyBuff^ := IData^.KeyBuff^ + IDP^.KeysToWrite^;
  427.  
  428.         IDP^.Status := IDS_Changed;
  429.  
  430.       END;
  431.  
  432.       {----}
  433.  
  434.       IDF_State:
  435.       BEGIN
  436.  
  437.         { Read Shift/Ctrl/Alt State }
  438.  
  439.       END;
  440.  
  441.       {----}
  442.  
  443.       IDF_Flush:
  444.       IF Idata^.Off=0 Then
  445.       BEGIN
  446.  
  447.         IData^.KeyBuff^ := '';
  448.  
  449.         KeyBufTail := KeyBufHead;
  450.  
  451.         IDP^.Status := IDS_Changed;
  452.  
  453.       END;
  454.  
  455.       {----}
  456.  
  457.       IDF_Pressed:
  458.       IF IData^.Off=0 Then
  459.       BEGIN
  460.  
  461.         IDP^.Pressed := ( KeyPressed ) Or ( IData^.KeyBuff^[0]<>#0 );
  462.  
  463.         If IDP^.Pressed=TRUE Then
  464.           IDP^.Status := IDS_Changed;
  465.  
  466.       END;
  467.  
  468.     Else { Case Func Of }
  469.  
  470.     END;
  471.  
  472.   END; { If IDP^.Status = 0 }
  473.  
  474. END;
  475.  
  476. *)
  477.  
  478. {────────────────────────────────────────────────────────────────────────────}
  479.  
  480. (*-
  481.  
  482. [FUNCTION]
  483.  
  484. Procedure CallInDrivers(          IDP       : PInDriverPacket );
  485.  
  486. [PARAMETERS]
  487.  
  488. IDP         Pointer to In-Data Driver Packet
  489.  
  490. [RETURNS]
  491.  
  492. (None)
  493.  
  494. [DESCRIPTION]
  495.  
  496. [SEE-ALSO]
  497.  
  498. [EXAMPLE]
  499.  
  500. -*)
  501.  
  502. Procedure CallInDrivers(          IDP       : PInDriverPacket );
  503.  
  504. Var
  505.  
  506.   KDN           : PInDriverList;
  507.  
  508.   NextCurrProc  : PInDriverList;
  509.  
  510.  
  511. BEGIN
  512.  
  513.   KDN := C.InDriverListCurr[ IDP^.Func ];
  514.  
  515.   NextCurrProc := C.InDriverListCurr[ IDP^.Func ]^.Next;
  516.  
  517.   IDP^.Status := 0;
  518.  
  519.   If KDN<>NIL Then
  520.   BEGIN
  521.  
  522.     Repeat
  523.  
  524.       IDP^.ID := KDN^.ID;
  525.  
  526.       KDN^.Proc( IDP );
  527.  
  528.       If IDP^.Status and IDS_Sequence>0 Then
  529.       BEGIN
  530.  
  531.         NextCurrProc := KDN;
  532.         IDP^.Status  := IDP^.Status - IDS_Sequence;
  533.  
  534.       END;
  535.  
  536.       KDN := KDN^.Next;
  537.  
  538.     Until KDN=C.InDriverListCurr[ IDP^.Func ];
  539.  
  540.     C.InDriverListCurr[ IDP^.Func ] := NextCurrProc;
  541.  
  542.   END;
  543.  
  544. END;
  545.  
  546. {────────────────────────────────────────────────────────────────────────────}
  547.  
  548. (*-
  549.  
  550. [FUNCTION]
  551.  
  552. Procedure VInDriverNew(              Proc        : TInDriverProc;
  553.                                      Name        : TProcName;
  554.                                      DriverInfo  : Pointer;
  555.                                  Var Err         : WORD       );
  556.  
  557. [PARAMETERS]
  558.  
  559. Proc        ?
  560. Name        ?
  561. DriverInfo  ?
  562. Err         VAR Returned ?
  563.  
  564. [RETURNS]
  565.  
  566. Function : None
  567. (VAR     : [Err] ?)
  568.  
  569. [DESCRIPTION]
  570.  
  571. [SEE-ALSO]
  572.  
  573. [EXAMPLE]
  574.  
  575. -*)
  576.  
  577. Procedure VInDriverNew(              Proc        : TInDriverProc;
  578.                                      Name        : TProcName;
  579.                                      DriverInfo  : Pointer;
  580.                                  Var Err         : WORD       );
  581.  
  582. Var
  583.  
  584.   DLN : PInDriverList;
  585.   Z   : INTEGER;
  586.  
  587. BEGIN
  588.  
  589.   With C Do
  590.   BEGIN
  591.  
  592.     {-----------------------------------}
  593.     { Build the InDriverPacket for the }
  594.     { "New" function                    }
  595.     {-----------------------------------}
  596.  
  597.     IDP.Func          := IDF_DriverNew;
  598.  
  599.     IDP.ID            := NIL;
  600.     IDP.InDriverProc  := Proc;
  601.     IDP.Name          := @Name;
  602.     IDP.DriverInfo    := DriverInfo;
  603.     IDP.SysKeyBuff    := @C.KeyBuff;
  604.     IDP.Status        := 0;
  605.  
  606.     { call da oder drivers }
  607.  
  608.     {---------------------------}
  609.     { Call the "New" In Driver }
  610.     {---------------------------}
  611.  
  612.     Proc( @IDP );
  613.  
  614.     {---------------------------------------}
  615.     { Was the InDriverPacket returned with }
  616.     { the install bit set?                  }
  617.     {---------------------------------------}
  618.  
  619.     If IDP.Status and IDS_Install <>0 Then
  620.     BEGIN
  621.  
  622.       {---------------------------------}
  623.       { Create a new InDriverList node }
  624.       {---------------------------------}
  625.  
  626.       New( DLN );
  627.  
  628.       {-------------------------------}
  629.       { Is this the first In driver? }
  630.       {-------------------------------}
  631.  
  632.       If C.InDriverListHead = NIL Then
  633.       BEGIN
  634.  
  635.         C.InDriverListHead := DLN;
  636.         C.InDriverListTail := DLN;
  637.  
  638.         For Z := 1 to 20 Do
  639.           C.InDriverListCurr[ Z ] := DLN;
  640.  
  641.       END;
  642.  
  643.       {-----------------------}
  644.       { Fill out the new node }
  645.       {-----------------------}
  646.  
  647.       DLN^.Proc := Proc;
  648.       DLN^.ID   := IDP.ID;
  649.       DLN^.Next := C.InDriverListHead;
  650.  
  651.       {---------------------------------}
  652.       { and put it in the InDriverList }
  653.       {---------------------------------}
  654.  
  655.       C.InDriverListTail^.Next := DLN;
  656.  
  657.       C.InDriverListTail := DLN;
  658.  
  659.     END; { If IDP^.Status = Install }
  660.  
  661.   END; { With C }
  662.  
  663. END; { Procedure }
  664.  
  665. {────────────────────────────────────────────────────────────────────────────}
  666.  
  667. (*-
  668.  
  669. [FUNCTION]
  670.  
  671. Procedure VInDriverOff(              Name        : TProcName  );
  672.  
  673. [PARAMETERS]
  674.  
  675. Name        ?
  676.  
  677. [RETURNS]
  678.  
  679. (None)
  680.  
  681. [DESCRIPTION]
  682.  
  683. [SEE-ALSO]
  684.  
  685. [EXAMPLE]
  686.  
  687. -*)
  688.  
  689. Procedure VInDriverOff(              Name        : TProcName  );
  690.  
  691. BEGIN
  692.  
  693.   With C Do
  694.   BEGIN
  695.  
  696.     IDP.Func := IDF_DriverOff;
  697.     IDP.Name := @Name;
  698.  
  699.     CallInDrivers( @IDP );
  700.  
  701.   END;
  702.  
  703. END;
  704.  
  705. {────────────────────────────────────────────────────────────────────────────}
  706.  
  707. (*-
  708.  
  709. [FUNCTION]
  710.  
  711. Procedure VInDriverOn(               Name        : TProcName  );
  712.  
  713. [PARAMETERS]
  714.  
  715. Name        ?
  716.  
  717. [RETURNS]
  718.  
  719. (None)
  720.  
  721. [DESCRIPTION]
  722.  
  723. [SEE-ALSO]
  724.  
  725. [EXAMPLE]
  726.  
  727. -*)
  728.  
  729. Procedure VInDriverOn(               Name        : TProcName  );
  730.  
  731. BEGIN
  732.  
  733.   With C Do
  734.   BEGIN
  735.  
  736.     IDP.Func := IDF_DriverOn;
  737.     IDP.Name := @Name;
  738.  
  739.     CallInDrivers( @IDP );
  740.  
  741.   END;
  742.  
  743. END;
  744.  
  745. {────────────────────────────────────────────────────────────────────────────}
  746.  
  747. (*-
  748.  
  749. [FUNCTION]
  750.  
  751. Procedure VInDriverDispose(          Name        : TProcName  );
  752.  
  753. [PARAMETERS]
  754.  
  755. Name        ?
  756.  
  757. [RETURNS]
  758.  
  759. (None)
  760.  
  761. [DESCRIPTION]
  762.  
  763. [SEE-ALSO]
  764.  
  765. [EXAMPLE]
  766.  
  767. -*)
  768.  
  769. Procedure VInDriverDispose(          Name        : TProcName  );
  770.  
  771. BEGIN
  772.  
  773.   With C Do
  774.   BEGIN
  775.  
  776.     IDP.Func := IDF_DriverDispose;
  777.     IDP.Name := @Name;
  778.  
  779.     CallInDrivers( @IDP );
  780.  
  781.   END;
  782.  
  783. END;
  784.  
  785. {────────────────────────────────────────────────────────────────────────────}
  786.  
  787. (*-
  788.  
  789. [FUNCTION]
  790.  
  791. Function  VInLook                                            : CHAR;
  792.  
  793. [PARAMETERS]
  794.  
  795. (None)
  796.  
  797. [RETURNS]
  798.  
  799. [DESCRIPTION]
  800.  
  801. [SEE-ALSO]
  802.  
  803. [EXAMPLE]
  804.  
  805. -*)
  806.  
  807. Function  VInLook                                            : CHAR;
  808.  
  809. BEGIN
  810.  
  811.   With C Do
  812.   BEGIN
  813.  
  814.     IDP.Func := IDF_Look;
  815.  
  816.     CallInDrivers( @IDP );
  817.  
  818.     VInLook := IDP.Key;
  819.  
  820.     VMultiDo( 0 );
  821.  
  822.   END;
  823.  
  824. END;
  825.  
  826. {────────────────────────────────────────────────────────────────────────────}
  827.  
  828. (*-
  829.  
  830. [FUNCTION]
  831.  
  832. Function CallKeyProcList(         Key1      : CHAR;
  833.                                   Key2      : CHAR           ) : BOOLEAN;
  834.  
  835. [PARAMETERS]
  836.  
  837. Key1        ?
  838. Key2        ?
  839.  
  840. [RETURNS]
  841.  
  842. [DESCRIPTION]
  843.  
  844. [SEE-ALSO]
  845.  
  846. [EXAMPLE]
  847.  
  848. -*)
  849.  
  850. Function CallKeyProcList(         Key1      : CHAR;
  851.                                   Key2      : CHAR           ) : BOOLEAN;
  852.  
  853. Var
  854.  
  855.   KDPN      : PKeyProcList;
  856.  
  857.   CalledOne : BOOLEAN;
  858.  
  859. BEGIN
  860.  
  861.   CalledOne := FALSE;
  862.  
  863.   KDPN := C.KeyProcList;
  864.  
  865.   While KDPN<>NIL Do
  866.   BEGIN
  867.  
  868.     If (KDPN^.Off = 0  )   and
  869.        (KDPN^.Key1=Key1) and
  870.        ( (Key1<>#0) or (KDPN^.Key2=Key2) ) Then
  871.     BEGIN
  872.  
  873.       KDPN^.Proc( KDP_Do, Key1, Key2 );
  874.  
  875.       CalledOne := TRUE;
  876.  
  877.     END; { If kdpn^.off = 0, etc... etc...  }
  878.  
  879.     KDPN := KDPN^.Next;
  880.  
  881.   END;
  882.  
  883.   CallKeyProcList := CalledOne;
  884.  
  885. END;
  886.  
  887. {────────────────────────────────────────────────────────────────────────────}
  888.  
  889. (*-
  890.  
  891. [FUNCTION]
  892.  
  893. Function  VInRead                                            : CHAR;
  894.  
  895. [PARAMETERS]
  896.  
  897. (None)
  898.  
  899. [RETURNS]
  900.  
  901. [DESCRIPTION]
  902.  
  903. [SEE-ALSO]
  904.  
  905. [EXAMPLE]
  906.  
  907. -*)
  908.  
  909. Function  VInRead                                            : CHAR;
  910.  
  911. Var
  912.  
  913.   S : String[5];
  914.  
  915.   ZDP : TInDriverPacket;
  916.  
  917. BEGIN
  918.  
  919.   With C Do
  920.   BEGIN
  921.  
  922.     Repeat
  923.  
  924.       ZDP.Func := IDF_Read;
  925.  
  926.       Repeat
  927.  
  928.         CallInDrivers( @ZDP );
  929.  
  930.         VMultiDo( 0 );
  931.  
  932.       Until (ZDP.Status and IDS_Changed >0 );
  933.  
  934.       If ZDP.Key=#0 Then
  935.       BEGIN
  936.  
  937.         Repeat
  938.  
  939.           CallInDrivers( @ZDP );
  940.           VMultiDo( 0 );
  941.  
  942.         Until (ZDP.Status and IDS_Changed>0 );
  943.  
  944.  
  945.         If CallKeyProcList( #0, ZDP.Key )=FALSE Then
  946.         BEGIN
  947.  
  948.           ZDP.Func        := IDF_Write;
  949.           S               := ZDP.Key;
  950.  
  951.           ZDP.KeysToWrite := @S;
  952.  
  953.           CallInDrivers( @ZDP );
  954.  
  955.           ZDP.Key        := #0;
  956.  
  957.         END;  { If CallKeyProcList }
  958.  
  959.       END  { If ZDP.Key }
  960.  
  961.       Else
  962.       BEGIN
  963.  
  964.         If CallKeyProcList( ZDP.Key, #0 )=TRUE Then
  965.         BEGIN
  966.  
  967.           ZDP.Key := #255;
  968.  
  969.         END  { If CallKeyProcList }
  970.  
  971.         ELSE
  972.         BEGIN
  973.  
  974.  
  975.         END;  { If CallKeyProcList / Else }
  976.  
  977.       END; { If IDP.Key=#0 }
  978.  
  979.     Until ZDP.Key<>#255;
  980.  
  981.     VInRead := ZDP.Key;
  982.  
  983.     { Call Key procs here }
  984.  
  985.   END;  { With C }
  986.  
  987. END;  { VInRead }
  988.  
  989. {────────────────────────────────────────────────────────────────────────────}
  990.  
  991. (*-
  992.  
  993. [FUNCTION]
  994.  
  995. Function  VInState                                           : BYTE;
  996.  
  997. [PARAMETERS]
  998.  
  999. (None)
  1000.  
  1001. [RETURNS]
  1002.  
  1003. [DESCRIPTION]
  1004.  
  1005. [SEE-ALSO]
  1006.  
  1007. [EXAMPLE]
  1008.  
  1009. -*)
  1010.  
  1011. Function  VInState                                           : BYTE;
  1012.  
  1013. BEGIN
  1014.  
  1015.   With C Do
  1016.   BEGIN
  1017.  
  1018.     IDP.Func := IDF_State;
  1019.  
  1020.     CallInDrivers( @IDP );
  1021.  
  1022.     VInState := IDP.State;
  1023.  
  1024.   END;
  1025.  
  1026. END;
  1027.  
  1028. {────────────────────────────────────────────────────────────────────────────}
  1029.  
  1030. (*-
  1031.  
  1032. [FUNCTION]
  1033.  
  1034. Procedure VInWrite( Keys : String );
  1035.  
  1036. [PARAMETERS]
  1037.  
  1038. Keys        ?
  1039.  
  1040. [RETURNS]
  1041.  
  1042. [DESCRIPTION]
  1043.  
  1044. [SEE-ALSO]
  1045.  
  1046. [EXAMPLE]
  1047.  
  1048. -*)
  1049.  
  1050. Procedure VInWrite( Keys : String );
  1051.  
  1052. BEGIN
  1053.  
  1054.   With C Do
  1055.   BEGIN
  1056.  
  1057.     IDP.Func        := IDF_Write;
  1058.     IDP.KeysToWrite := @Keys;
  1059.  
  1060.     CallInDrivers( @IDP );
  1061.  
  1062.   END;
  1063.  
  1064. END;
  1065.  
  1066. {────────────────────────────────────────────────────────────────────────────}
  1067.  
  1068. (*-
  1069.  
  1070. [FUNCTION]
  1071.  
  1072. Function  VInPressed                                         : BOOLEAN;
  1073.  
  1074. [PARAMETERS]
  1075.  
  1076. (None)
  1077.  
  1078. [RETURNS]
  1079.  
  1080. [DESCRIPTION]
  1081.  
  1082. [SEE-ALSO]
  1083.  
  1084. [EXAMPLE]
  1085.  
  1086. -*)
  1087.  
  1088. Function  VInPressed                                         : BOOLEAN;
  1089.  
  1090. BEGIN
  1091.  
  1092.   With C Do
  1093.   BEGIN
  1094.  
  1095.     IDP.Func    := IDF_Pressed;
  1096.     IDP.Pressed := FALSE;
  1097.  
  1098.     CallInDrivers( @IDP );
  1099.  
  1100.     VInPressed := IDP.Pressed;
  1101.  
  1102.     VMultiDo( 0 );
  1103.  
  1104.   END;
  1105.  
  1106. END;
  1107.  
  1108. {────────────────────────────────────────────────────────────────────────────}
  1109.  
  1110. (*-
  1111.  
  1112. [FUNCTION]
  1113.  
  1114. Procedure VInFlush;
  1115.  
  1116. [PARAMETERS]
  1117.  
  1118. (None)
  1119.  
  1120. [RETURNS]
  1121.  
  1122. (None)
  1123.  
  1124. [DESCRIPTION]
  1125.  
  1126. [SEE-ALSO]
  1127.  
  1128. [EXAMPLE]
  1129.  
  1130. -*)
  1131.  
  1132. Procedure VInFlush;
  1133.  
  1134. BEGIN
  1135.  
  1136.   With C Do
  1137.   BEGIN
  1138.  
  1139.     IDP.Func := IDF_Flush;
  1140.  
  1141.     CallInDrivers( @IDP );
  1142.  
  1143.   END;
  1144.  
  1145. END;
  1146.  
  1147. {────────────────────────────────────────────────────────────────────────────}
  1148.  
  1149. (*-
  1150.  
  1151. [FUNCTION]
  1152.  
  1153. Procedure VKeyProcNew(                Key1        : CHAR;
  1154.                                       Key2        : CHAR;
  1155.                                       Proc        : TKeyProc;
  1156.                                       Name        : TProcName;
  1157.                                       ProcInfo    : Pointer;
  1158.                                   Var Err         : WORD       );
  1159.  
  1160. [PARAMETERS]
  1161.  
  1162. Key1        ?
  1163. Key2        ?
  1164. Proc        ?
  1165. Name        ?
  1166. ProcInfo    ?
  1167. Err         VAR Returned ?
  1168.  
  1169. [RETURNS]
  1170.  
  1171. Function : None
  1172. (VAR     : [Err] ?)
  1173.  
  1174. [DESCRIPTION]
  1175.  
  1176. [SEE-ALSO]
  1177.  
  1178. [EXAMPLE]
  1179.  
  1180. -*)
  1181.  
  1182. Procedure VKeyProcNew(                Key1        : CHAR;
  1183.                                       Key2        : CHAR;
  1184.                                       Proc        : TKeyProc;
  1185.                                       Name        : TProcName;
  1186.                                       ProcInfo    : Pointer;
  1187.                                   Var Err         : WORD       );
  1188.  
  1189. Var
  1190.  
  1191.   KPN : PKeyProcList;
  1192.  
  1193. BEGIN
  1194.  
  1195.   New( KPN );
  1196.  
  1197.   KPN^.Key1     := Key1;
  1198.   KPN^.Key2     := Key2;
  1199.   KPN^.Proc     := Proc;
  1200.   KPN^.Name     := Name;
  1201.   KPN^.ProcInfo := ProcInfo;
  1202.   KPN^.Off      := 0;
  1203.  
  1204.   KPN^.Next := C.KeyProcList;
  1205.  
  1206.   C.KeyProcList := KPN;
  1207.  
  1208.   Proc( KDP_New, Key1, Key2 );
  1209.  
  1210. END;
  1211.  
  1212. {────────────────────────────────────────────────────────────────────────────}
  1213.  
  1214. (*-
  1215.  
  1216. [FUNCTION]
  1217.  
  1218. Procedure VKeyProcOff(                Name        : TProcName  );
  1219.  
  1220. [PARAMETERS]
  1221.  
  1222. Name        ?
  1223.  
  1224. [RETURNS]
  1225.  
  1226. (None)
  1227.  
  1228. [DESCRIPTION]
  1229.  
  1230. [SEE-ALSO]
  1231.  
  1232. [EXAMPLE]
  1233.  
  1234. -*)
  1235.  
  1236. Procedure VKeyProcOff(                Name        : TProcName  );
  1237.  
  1238. Var
  1239.  
  1240.   KPN : PKeyProcList;
  1241.  
  1242. BEGIN
  1243.  
  1244.   KPN := C.KeyProcList;
  1245.  
  1246.   While (KPN<>NIL) and (KPN^.Name<>Name ) Do
  1247.     KPN := KPN^.Next;
  1248.  
  1249.   If KPN<>NIL Then
  1250.   BEGIN
  1251.  
  1252.     Inc( KPN^.Off );
  1253.  
  1254.   END;
  1255.  
  1256. END;
  1257.  
  1258. {────────────────────────────────────────────────────────────────────────────}
  1259.  
  1260. (*-
  1261.  
  1262. [FUNCTION]
  1263.  
  1264. Procedure VKeyProcOn(                 Name        : TProcName  );
  1265.  
  1266. [PARAMETERS]
  1267.  
  1268. Name        ?
  1269.  
  1270. [RETURNS]
  1271.  
  1272. (None)
  1273.  
  1274. [DESCRIPTION]
  1275.  
  1276. [SEE-ALSO]
  1277.  
  1278. [EXAMPLE]
  1279.  
  1280. -*)
  1281.  
  1282. Procedure VKeyProcOn(                 Name        : TProcName  );
  1283.  
  1284. Var
  1285.  
  1286.   KPN : PKeyProcList;
  1287.  
  1288. BEGIN
  1289.  
  1290.   KPN := C.KeyProcList;
  1291.  
  1292.   While (KPN<>NIL) and (KPN^.Name<>Name ) Do
  1293.     KPN := KPN^.Next;
  1294.  
  1295.   If KPN<>NIL Then
  1296.   BEGIN
  1297.  
  1298.     If KPN^.Off >0 Then
  1299.       Dec( KPN^.Off );
  1300.  
  1301.   END;
  1302.  
  1303. END;
  1304.  
  1305. {────────────────────────────────────────────────────────────────────────────}
  1306.  
  1307. (*-
  1308.  
  1309. [FUNCTION]
  1310.  
  1311. Procedure VKeyProcDispose(            Name        : TProcName  );
  1312.  
  1313. [PARAMETERS]
  1314.  
  1315. Name        ?
  1316.  
  1317. [RETURNS]
  1318.  
  1319. (None)
  1320.  
  1321. [DESCRIPTION]
  1322.  
  1323. [SEE-ALSO]
  1324.  
  1325. [EXAMPLE]
  1326.  
  1327. -*)
  1328.  
  1329. Procedure VKeyProcDispose(            Name        : TProcName  );
  1330.  
  1331. BEGIN
  1332.  
  1333. END;
  1334.  
  1335. {────────────────────────────────────────────────────────────────────────────}
  1336. {────────────────────────────────────────────────────────────────────────────}
  1337. {────────────────────────────────────────────────────────────────────────────}
  1338.  
  1339. BEGIN
  1340.  
  1341.   C.KeyBuff             := '';
  1342.  
  1343.   C.InDriverListHead    := NIL;
  1344.   C.InDriverListTail    := NIL;
  1345.   C.InDriverListCurr[1] := NIL;
  1346.  
  1347.   C.KeyProcList         := NIL;
  1348.  
  1349. END.
  1350.