home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / clipper / lankey2.zip / LANKEY.PRG < prev    next >
Text File  |  1993-06-09  |  2KB  |  53 lines

  1. FUNCTION P_INKEY(pTime,pIfNoHotKeys)
  2.   //
  3.   // SYNTAX : P_INKEY([nTime],[lIfNoHotKeysAllowed]) => nKeyHit
  4.   //
  5.   // - THIS IS THE SAME AS CLIPPER'S INKEY() BUT IT IS ALSO A WAIT STATE
  6.   // - ALSO AUTOMATICALLY PROVIDES TIME SLICING BETWEEN CLIPPER AND C SO
  7.   //   THAT A NON-DEDICATED NOVELL SERVER CAN GET TIME TO PRINT FROM THE
  8.   //   SPOOLER
  9.   //
  10.   // COMPILE COMMAND:  CLIPPER LANKEY /N
  11.   //
  12.   // AUTHOR: Shawn B. Lipscomb, Intelligent Decisions, Inc.
  13.   //
  14.   LOCAL mKeyBlock,mKey,mEvaled,mCounter,mKeybdTailPtr,;
  15.         mRow:=ROW(),;
  16.         mCol:=COL()
  17.   WHILE TRUE
  18.     IF (pTime == NIL)
  19.       mKey:=INKEY()
  20.     ELSE
  21.       // THIS SECTION OF CODE HANDLES HALF SECOND TIME SLICING TO A C
  22.       // FUNCTION SO THAT, ON A NON-DEDICATED NOVELL SERVER, A PRINT SPOOLING
  23.       // JOB WILL GET SOME TIME AS OFTEN AS POSSIBLE, WHILE STILL PRESERVING
  24.       // A HALF SECOND FOR CLIPPER TO DO GARBAGE COLLECTION.  TO FURTHER
  25.       // COMPLICATE MATTERS, DOS 3.3 HAS A BUG THAT MAKES IT HARD TO
  26.       // REALIZE THAT AN ENHANCED KEYBOARD KEY HAS BEEN HIT FROM C.  SO WE
  27.       // SAVE THE POINTER TO THE KEYBOARD BUFFER'S TAIL AND SEND IT TO
  28.       // C_INKEY SO THAT C CAN SEE IF IT MOVES.  EVEN WITH DOS 3.3'S BUG, THE
  29.       // KEYBOARD POINTER TAIL STILL MOVES.
  30.       mCounter:=0
  31.       mKeybdTailPtr:=C_PEEK(28)             // 0040:001C, LINEAR ADDRESS 1052
  32.       WHILE ((pTime = 0) .OR. (mCounter++ < pTime))
  33.         IF EMPTY(mKey:=INKEY(0.5))
  34.           C_INKEY(mKeybdTailPtr)
  35.         ELSE
  36.           EXIT
  37.         ENDIF
  38.       ENDDO
  39.     ENDIF
  40.  
  41.     // DELETE THE FOLLOWING IF...THEN...ELSE...ENDIF IF YOU DON'T
  42.     // WANT P_INKEY() TO BE A WAIT STATE.
  43.     IF (pIfNoHotKeys == NIL) .AND. ((mKeyBlock:=SETKEY(mKey)) # NIL)
  44.       mEvaled:=EVAL(mKeyBlock)
  45.       // RESTORE CURSOR POSITION BECAUSE THE SETKEY BLOCK MAY HAVE MOVED IT
  46.       DEVPOS(mRow,mCol)
  47.       LOOP
  48.     ELSE
  49.       EXIT
  50.     ENDIF
  51.   ENDDO
  52.   RETURN mKey
  53.