home *** CD-ROM | disk | FTP | other *** search
/ Media Share 9 / MEDIASHARE_09.ISO / progmisc / tttsrc51.zip / KEYTTT5.PAS < prev    next >
Pascal/Delphi Source File  |  1993-03-08  |  18KB  |  625 lines

  1. {--------------------------------------------------------------------------}
  2. {                         TechnoJock's Turbo Toolkit                       }
  3. {                                                                          }
  4. {                              Version   5.10                              }
  5. {                                                                          }
  6. {                                                                          }
  7. {               Copyright 1986-1993 TechnoJock Software, Inc.              }
  8. {                           All Rights Reserved                            }
  9. {                          Restricted by License                           }
  10. {--------------------------------------------------------------------------}
  11.  
  12.                      {--------------------------------}                                       
  13.                      {       Unit:   KeyTTT5          }
  14.                      {--------------------------------}
  15.  
  16. {Update history:     5.01a  Removed references to VER50 and added DEBUG
  17.                             compiler directive
  18.                      5.02a  (1/23/89) add a Vert_Sensitivity for mouse
  19.                      5.02b  (10/16/90) Corrected hardware cursor mask
  20.                      5.02c  Accepts European Characters
  21.           01/04/93   5.10   DPMI compatible version
  22. }
  23.  
  24. {$S-,R-,V-} 
  25. {$IFNDEF DEBUG}
  26. {$D-}
  27. {$ENDIF}      
  28.  
  29. unit KeyTTT5;
  30.  
  31. (*
  32. {$DEFINE K_FULL}
  33. *)
  34. Interface
  35.  
  36. uses CRT, DOS;
  37.  
  38. type
  39.   Button = (NoB,LeftB,RightB,BothB);
  40.  
  41. {$IFNDEF VER40}
  42.       Key_Idle_Type = procedure;
  43.       Key_Pressed_Type = procedure(var Ch:char);
  44. {$ENDIF}
  45.  
  46.           Key_Hooks = record
  47. {$IFNDEF VER40}
  48.                            Idle_Hook:    Key_Idle_Type;
  49.                            Pressed_Hook: Key_Pressed_Type;
  50. {$ENDIF}
  51.                            Click       : Boolean;           {tactile keyboard click}
  52.                       end;
  53.  
  54.  
  55. var
  56.   Moused : boolean;
  57.   Vert_Sensitivity,           {5.02a}
  58.   Horiz_Sensitivity : integer;
  59.   KTTT : Key_Hooks;      {used in getkey to jump to external procedure}
  60.   Extended: boolean;
  61.  
  62. {$IFDEF VER40}
  63.   Idle_Hook   : pointer;
  64.   Pressed_Hook: pointer;
  65. {$ENDIF}
  66.  
  67. {$IFDEF K_FULL}
  68. {if}
  69. {if}           CONST
  70. {if}           BackSp  = #8;       PgUp  = #201;      CtrlPgUp = #138;
  71. {if}           Tab     = #9;       PgDn  = #209;      CtrlPgDn = #246;
  72. {if}           Enter   = #13;      Endkey= #207;      CtrlEnd  = #245;
  73. {if}           Esc     = #27;      Home  = #199;      CtrlHome = #247;
  74. {if}           STab    = #143;     Ins   = #210;      Del      = #211;
  75. {if}
  76. {if}           LArr    = #203;      CtrlLArr    = #243;    CtrlPrtsc = #242;
  77. {if}           RArr    = #205;      CtrlRArr    = #244;
  78. {if}           UArr    = #200;
  79. {if}           DArr    = #208;
  80. {if}
  81. {if}
  82. {if}           CtrlA  = #1;          AltA  = #158;        Alt1 = #248;
  83. {if}           CtrlB  = #2;          AltB  = #176;        Alt2 = #249;
  84. {if}           CtrlC  = #3;          AltC  = #174;        Alt3 = #250;
  85. {if}           CtrlD  = #4;          AltD  = #160;        Alt4 = #251;
  86. {if}           CtrlE  = #5;          AltE  = #146;        Alt5 = #252;
  87. {if}           CtrlF  = #6;          AltF  = #161;        Alt6 = #253;
  88. {if}           CtrlG  = #7;          AltG  = #162;        Alt7 = #254;
  89. {if}           CtrlH  = #8;          AltH  = #163;        Alt8 = #255;
  90. {if}           CtrlI  = #9;          AltI  = #151;        Alt9 = #134;
  91. {if}           CtrlJ  = #10;         AltJ  = #164;        Alt0 = #135;
  92. {if}           CtrlK  = #11;         AltK  = #165;        Altminus  = #136;
  93. {if}           CtrlL  = #12;         AltL  = #166;        Altequals = #137;
  94. {if}           CtrlM  = #13;         AltM  = #178;
  95. {if}           CtrlN  = #14;         AltN  = #177;
  96. {if}           CtrlO  = #15;         AltO  = #152;
  97. {if}           CtrlP  = #16;         AltP  = #153;
  98. {if}           CtrlQ  = #17;         AltQ  = #144;
  99. {if}           CtrlR  = #18;         AltR  = #147;
  100. {if}           CtrlS  = #19;         AltS  = #159;
  101. {if}           CtrlT  = #20;         AltT  = #148;
  102. {if}           CtrlU  = #21;         AltU  = #150;
  103. {if}           CtrlV  = #22;         AltV  = #175;
  104. {if}           CtrlW  = #23;         AltW  = #145;
  105. {if}           CtrlX  = #24;         AltX  = #173;
  106. {if}           CtrlY  = #25;         AltY  = #149;
  107. {if}           CtrlZ  = #26;         AltZ  = #172;
  108. {if}
  109. {if}           F1  = #187;              sF1  = #212;
  110. {if}           F2  = #188;              sF2  = #213;
  111. {if}           F3  = #189;              sF3  = #214;
  112. {if}           F4  = #190;              sF4  = #215;
  113. {if}           F5  = #191;              sF5  = #216;
  114. {if}           F6  = #192;              sF6  = #217;
  115. {if}           F7  = #193;              sF7  = #218;
  116. {if}           F8  = #194;              sF8  = #219;
  117. {if}           F9  = #195;              sF9  = #220;
  118. {if}           F10 = #196;              sF10 = #221;
  119. {if}           F11 = #139;              sF11 = #141;
  120. {if}           F12 = #140;              sF12 = #142;
  121. {if}
  122. {if}           CtrlF1  = #222;          AltF1  = #232;
  123. {if}           CtrlF2  = #223;          AltF2  = #233;
  124. {if}           CtrlF3  = #224;          AltF3  = #234;
  125. {if}           CtrlF4  = #225;          AltF4  = #235;
  126. {if}           CtrlF5  = #226;          AltF5  = #236;
  127. {if}           CtrlF6  = #227;          AltF6  = #237;
  128. {if}           CtrlF7  = #228;          AltF7  = #238;
  129. {if}           CtrlF8  = #229;          AltF8  = #239;
  130. {if}           CtrlF9  = #230;          AltF9  = #240;
  131. {if}           CtrlF10 = #231;          AltF10 = #241;
  132. {if}           CtrlF11 = #154;          AltF11 = #156;
  133. {if}           CtrlF12 = #155;          AltF12 = #157;
  134. {if}
  135. {if}          {now the TTT mouse keys}
  136. {if}
  137. {if}           MUp     = #128;
  138. {if}           MDown   = #129;
  139. {if}           MLeft   = #130;
  140. {if}           MRight  = #131;
  141. {if}           MLeftB  = #133;
  142. {if}           MEnter  = #133;
  143. {if}           MEsc    = #132;
  144. {if}           MRightB = #132;
  145. {if}
  146. {$ENDIF}  {def K_Const}
  147. {$IFNDEF VER40}
  148. Procedure No_Idle_Hook;
  149. Procedure No_Pressed_Hook(var Ch:char);
  150. Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  151. Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  152. {$ENDIF}
  153. Procedure Set_Clicking(Clicking : boolean);
  154. Procedure Default_Settings;
  155. Function  Mouse_Installed:Boolean;
  156. Procedure Show_Mouse_Cursor;
  157. Procedure Hide_Mouse_Cursor;
  158. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  159. Procedure Move_Mouse(Hor,Ver: integer);
  160. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  161. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  162. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  163. Function  Alt_Pressed:Boolean;
  164. Function  Ctrl_Pressed:Boolean;
  165. Function  LeftShift_Pressed: Boolean;
  166. Function  RightShift_Pressed: Boolean;
  167. Function  Shift_Pressed: Boolean;
  168. Function  CapsOn: Boolean;
  169. Function  NumOn: Boolean;
  170. Function  ScrollOn: Boolean;
  171. Procedure Set_Caps(On : boolean);
  172. Procedure Set_Num(On : boolean);
  173. Procedure Set_Scroll(On : boolean);
  174. Function  GetKey : Char;
  175. Procedure DelayKey(Time : integer);
  176.  
  177. Implementation
  178.  
  179. var
  180.    Key_Status_Bits : ^word;
  181.  
  182. {$IFDEF VER40}
  183.    Procedure Call_Idle_Hook;
  184.           Inline($FF/$1E/Idle_Hook);
  185.  
  186.    Procedure Call_Pressed_Hook(Var CH : char);
  187.           Inline($FF/$1E/Pressed_Hook);
  188.  
  189. {$ENDIF}
  190.  
  191. {$F+}
  192.  Procedure No_Idle_Hook;
  193.  {empty procs}
  194.  begin
  195.  end; {of proc No_Idle_Hook}
  196.  
  197.  Procedure No_Pressed_Hook(var Ch:char);
  198.  {empty procs}
  199.  begin
  200.  end; {of proc No_Pressed_Hook}
  201. {$F-}
  202.  
  203. {$IFNDEF VER40}
  204.  Procedure Assign_Pressed_Hook(PassedProc : Key_pressed_Type);
  205.  begin
  206.      KTTT.Pressed_Hook := PassedProc;
  207.  end;
  208.  
  209.  Procedure Assign_Idle_Hook(PassedProc : Key_Idle_Type);
  210.  begin
  211.      KTTT.Idle_Hook := PassedProc;
  212.  end;
  213. {$ENDIF}
  214.  
  215.  Procedure Set_Clicking(Clicking : boolean);
  216.  begin
  217.      KTTT.Click := Clicking;
  218.  end;
  219.  
  220.  
  221.     Procedure Default_Settings;
  222.     begin
  223.          With KTTT do
  224.          begin
  225. {$IFNDEF VER40}
  226.              Idle_Hook    := No_Idle_Hook;
  227.              Pressed_Hook := No_Pressed_Hook;
  228. {$ELSE}
  229.              Idle_Hook    := Nil;
  230.              Pressed_Hook := Nil;
  231. {$ENDIF}
  232.              Click := false;
  233.          end;
  234.    end; {of proc Default_Settings}
  235.  
  236. function Mouse_Installed:boolean;
  237. {}
  238. var
  239.   MouseInterruptPtr : pointer;
  240.  
  241.     Function InterruptLoaded:boolean;
  242.     var
  243.       Reg: registers;
  244.     begin
  245.        Reg.Ax := 0;
  246.        Intr($33,Reg);
  247.        InterruptLoaded :=  Reg.Ax <> 0;
  248.     end;
  249.  
  250. begin
  251.    MouseInterruptPtr := ptr($0000,$00CC);
  252.    if (MouseInterruptPtr = nil)
  253.    or (byte(MouseInterruptPtr) = $CF) then
  254.       Mouse_Installed := false          {don't call interrupt if vector is zero}
  255.    else
  256.       Mouse_Installed := Interruptloaded;
  257. end; {Mouse_Installed}
  258.  
  259. Procedure Show_Mouse_Cursor;
  260. var
  261.   Reg: registers;
  262. begin
  263.     Reg.Ax := 1;
  264.     Intr($33,Reg);
  265. end; {Proc Show_Mouse_Cursor}
  266.  
  267. Procedure Hide_Mouse_Cursor;
  268. var
  269.   Reg : registers;
  270. begin
  271.     Reg.Ax := 2;
  272.     Intr($33,Reg);
  273. end; {Proc Hide_Mouse_Cursor}
  274.  
  275. Procedure Get_Mouse_Action(var But: button; var Hor,Ver: integer);
  276. var
  277.   Reg: registers;
  278. begin
  279.     with Reg do
  280.     begin
  281.         Ax := 3;
  282.         Intr($33,Reg);
  283.         Hor := Cx div 8;
  284.         Ver := Dx div 8;
  285.         {$B+}
  286.         If ((Bx and $1) <> $1)  and  ((Bx and $2) <> $2) then
  287.         begin
  288.             But := NoB;
  289.             exit;
  290.         end;
  291.         If ((Bx and $1) = $1)  and   ((Bx and $2) = $2) then
  292.            But := BothB
  293.         else
  294.         begin
  295.             If (Bx and $1) = $1 then
  296.                But := LeftB
  297.             else
  298.                But := RightB;
  299.         end;
  300.         {$B-}
  301.     end; {with}
  302. end;   {Get_Mouse_Action}
  303.  
  304. Procedure Move_Mouse(Hor,Ver: integer);
  305. var
  306.   Reg: registers;
  307. begin
  308.     Reg.Ax := 4;
  309.     Reg.Cx := pred(Hor*8);
  310.     Reg.Dx := pred(ver*8);
  311.     Intr($33,Reg);
  312. end; {Proc Move_mouse}
  313.  
  314. Procedure Confine_Mouse_Horiz(Left,Right:integer);
  315. var
  316.  Reg: registers;
  317. begin
  318.     Reg.Ax := 7;
  319.     Reg.Cx := pred(Left*8);
  320.     Reg.Dx := pred(Right*8);
  321.     Intr($33,Reg);
  322. end;
  323.  
  324. Procedure Confine_Mouse_Vert(Top,Bot:integer);
  325. var
  326.  Reg: registers;
  327. begin
  328.     Reg.Ax := 8;
  329.     Reg.Cx := pred(Top*8);
  330.     Reg.Dx := pred(Bot*8);
  331.     Intr($33,Reg);
  332. end;
  333.  
  334. Procedure Set_Mouse_Cursor_Style(OrdChar: integer);
  335. var
  336.   Reg: registers;
  337. begin
  338.    Reg.Ax := 10;
  339.    Reg.Bx := 0;        {software text cursor}
  340.    Reg.Cx := $7700;
  341.    Reg.Dx := OrdChar;
  342.    Intr($33,Reg);
  343. end;
  344.  
  345.  Function Mouse_Released(Button:integer):boolean;
  346.  {}
  347.  var Reg : Registers;
  348.  begin
  349.      Reg.Ax := 6;
  350.      Reg.Bx := Button;
  351.      Intr($33,Reg);
  352.      Mouse_Released := (Reg.BX > 0);
  353.  end; {of proc Mouse_Released}
  354.  
  355.  Function Mouse_Pressed(Button:integer):boolean;
  356.  {}
  357.  var Reg : Registers;
  358.  begin
  359.      Reg.Ax := 5;
  360.      Reg.Bx := Button;
  361.      Intr($33,Reg);
  362.      Mouse_Pressed := (Reg.BX > 0);
  363.  end; {of proc Mouse_Released}
  364.  
  365.  
  366.  
  367. {++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  368.  
  369.  Function Alt_Pressed:Boolean;
  370.  var
  371.    AltW : word;
  372.  begin
  373.      AltW := swap(Key_Status_Bits^);
  374.      Alt_Pressed := (AltW and $0800) <> 0;
  375.  end;
  376.  
  377.  Function Ctrl_Pressed:Boolean;
  378.  var
  379.    CtrlW : word;
  380.  begin
  381.      CtrlW := swap(Key_Status_Bits^ );
  382.      Ctrl_Pressed := (CtrlW and $0400) <> 0;
  383.  end;
  384.  
  385.  Function LeftShift_Pressed: Boolean;
  386.  {}
  387.  var LSW : word;
  388.  begin
  389.      LSW := swap(Key_Status_Bits^ );
  390.      LeftShift_Pressed := (LSW and $0200) <> 0;
  391.  end; {of func LeftShift_Pressed}
  392.  
  393.  Function RightShift_Pressed: Boolean;
  394.  {}
  395.  var RSW : word;
  396.  begin
  397.      RSW := swap(Key_Status_Bits^ );
  398.      RightShift_Pressed := (RSW and $0100) <> 0;
  399.  end; {of func RightShift_Pressed}
  400.  
  401.  Function Shift_Pressed: Boolean;
  402.  {}
  403.  var SW : word;
  404.  begin
  405.      SW := swap(Key_Status_Bits^ );
  406.      Shift_Pressed := ((SW and $0200) <> 0) or ((SW and $0100) <> 0);
  407.  end; {of func LeftShift_Pressed}
  408.  
  409.  Function CapsOn: Boolean;
  410.  {}
  411.  var CapsOnW : word;
  412.  begin
  413.      CapsOnW := swap(Key_Status_Bits^ );
  414.      CapsOn := (CapsOnW and $4000) <> 0;
  415.  end; {of func CapsOn}
  416.  
  417.  Function NumOn: Boolean;
  418.  {}
  419.  var NumOnW : word;
  420.  begin
  421.      NumOnW := swap(Key_Status_Bits^ );
  422.      NumOn := (NumOnW and $2000) <> 0;
  423.  end; {of func NumOn}
  424.  
  425.  Function ScrollOn: Boolean;
  426.  {}
  427.  var ScrollOnW : word;
  428.  begin
  429.      ScrollOnW := swap(Key_Status_Bits^ );
  430.      ScrollOn := (ScrollOnW and $1000) <> 0;
  431.  end; {of func ScrollOn}
  432.  
  433.  Procedure Set_Caps(On : boolean);
  434.  {}
  435.  begin
  436.      If On then
  437.         Key_Status_Bits^  := (Key_Status_Bits^  or $40)
  438.      else
  439.         Key_Status_Bits^  := (Key_Status_Bits^  and $BF);
  440.  end; {of proc Set_Caps}
  441.  
  442.  Procedure Set_Num(On : boolean);
  443.  {}
  444.  begin
  445.      If On then
  446.         Key_Status_Bits^  := (Key_Status_Bits^  or $20)
  447.      else
  448.         Key_Status_Bits^  := (Key_Status_Bits^  and $DF);
  449.  end; {of proc Set_Num}
  450.  
  451.  Procedure Set_Scroll(On : boolean);
  452.  {}
  453.  begin
  454.      If On then
  455.         Key_Status_Bits^  := (Key_Status_Bits^  or $10)
  456.      else
  457.         Key_Status_Bits^  := (Key_Status_Bits^  and $EF);
  458.  end; {of proc Set_Scroll}
  459.  
  460. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  461.  
  462.    Procedure KeyClick;
  463.    begin
  464.        If KTTT.Click then
  465.        begin
  466.            Sound(1000);
  467.            Sound(50);
  468.            delay(5);
  469.            nosound;
  470.        end;
  471.    end; {of proc KeyClick}
  472.  
  473. Function GetKey:char;
  474. {waits for keypress or mouse activity}
  475.  
  476. {Note that if an extended key is pressed e.g. F1, then a value of 128 is
  477.  added to the Char value. Also if a mouse is active the trapped mouse
  478.  activity is returned as follows:
  479.  
  480. }
  481.  
  482. Const
  483.  H = 40;
  484.  V = 13;
  485.  MouseUp    =  #128;
  486.  MouseDown  =  #129;
  487.  MouseLeft  =  #130;
  488.  MouseRight =  #131;
  489.  MouseEsc   =  #132;
  490.  MouseEnter =  #133;
  491. var
  492.   Action,
  493.   Finished : boolean;
  494.   Hor, Ver : integer;
  495.   B : button;
  496.   Ch : char;
  497. begin
  498.     Finished := false;
  499.     Action := false;
  500.     B := NoB;
  501.     If Moused then Move_Mouse(H,V);     {logically put mouse in middle of screen}
  502.     Repeat                      {keep checking Mouse for activity until keypressed}
  503. {$IFNDEF VER40}
  504.          KTTT.Idle_Hook;
  505. {$ELSE}
  506.          If Idle_Hook <> Nil then
  507.             Call_Idle_Hook;
  508. {$ENDIF}
  509.          If Moused then
  510.          begin
  511.              Get_Mouse_Action(B,Hor,Ver);
  512.              Case B of
  513.              LeftB : begin
  514.                          Ch := MouseEnter;
  515.                          Finished := true;
  516.                          Delay(200);
  517.                          Repeat
  518.                          Until Mouse_Pressed(0) = false; {absorb}
  519.                      end;
  520.              RightB: begin
  521.                          Ch := MouseEsc;
  522.                          Finished := true;
  523.                          Delay(200);
  524.                          Repeat
  525.                          Until Mouse_Pressed(1) = false; {absorb}
  526.                      end;
  527.              end; {case}
  528.  
  529.              If (Ver - V) > Vert_Sensitivity then {5.02a}
  530.              begin
  531.                  Ch := MouseDown;
  532.                  Finished := true;
  533.              end
  534.              else
  535.                 If (V - Ver) > Vert_Sensitivity then {5.02a}
  536.                 begin
  537.                     Ch := MouseUp;
  538.                     Finished := true;
  539.                 end
  540.                 else
  541.                    If (Hor - H) > Horiz_Sensitivity then
  542.                    begin
  543.                        Ch := MouseRight;
  544.                        Finished := true;
  545.                    end
  546.                    else
  547.                       If (H - Hor) > Horiz_Sensitivity then
  548.                       begin
  549.                           Ch := MouseLeft;
  550.                           Finished := true;
  551.                       end;
  552.          end;
  553.          If Keypressed or finished then Action := true;
  554.          if Finished then Extended := true;
  555.     until Action;
  556.     While not finished do
  557.     begin
  558.         Finished := true;
  559.         Ch := ReadKey;
  560.         KeyClick;
  561.         if Ch = #0 then
  562.         begin
  563.             Ch := ReadKey;
  564.             Extended := true;
  565.             Case ord(Ch) of    {set to TTT value}
  566.             15,
  567.             16..25,
  568.             30..38,
  569.             44..50,
  570.             59..68,
  571.             71..73,
  572.             75,77,
  573.             79..127 : Ch := chr(ord(Ch) + 128);
  574.             128..140: Ch := chr(ord(Ch) + 6);
  575.             else      Finished := false;
  576.             end;  {case}
  577.         end
  578.         else
  579.            Extended := false;
  580.     end;
  581. {$IFNDEF VER40}
  582.       KTTT.Pressed_Hook(Ch);
  583. {$ELSE}
  584.       If Pressed_Hook <> Nil then
  585.          Call_Pressed_Hook(Ch);
  586. {$ENDIF}
  587.     GetKey := Ch;
  588. end;
  589.  
  590.  
  591.  
  592. Procedure DelayKey(Time : integer);
  593. var
  594.   I : Integer;
  595.   ChD : char;
  596. begin
  597.     I := 1;
  598.     While I < Time DIV 100 do
  599.     begin
  600.         Delay(100);
  601.         I := succ(I);
  602.         If Keypressed then
  603.         begin
  604.             I := MaxInt;
  605.             ChD := GetKey;           {absorb the keypress}
  606.         end;
  607.     end;
  608. end; {DelayKey}
  609.  
  610. begin   {unit initialization code}
  611. {$IFDEF DPMI}
  612.     Key_Status_Bits := ptr(seg0040,$0017);
  613. {$ELSE}
  614.     Key_Status_Bits := ptr($0040,$0017);
  615. {$ENDIF}
  616.     Moused := Mouse_Installed;
  617.     If Moused then
  618.     begin
  619.        Horiz_Sensitivity := 1;
  620.        Vert_Sensitivity := 1;
  621.     end;
  622.     Default_Settings;
  623. end.
  624.  
  625.