home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 10.ddi / TVSRC.ZIP / TEVENT.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  5.4 KB  |  209 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       tevent.cpp                                */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  TEvent member functions                   */
  6. /*------------------------------------------------------------*/
  7.  
  8. /*------------------------------------------------------------*/
  9. /*                                                            */
  10. /*    Turbo Vision -  Version 1.0                             */
  11. /*                                                            */
  12. /*                                                            */
  13. /*    Copyright (c) 1991 by Borland International             */
  14. /*    All Rights Reserved.                                    */
  15. /*                                                            */
  16. /*------------------------------------------------------------*/
  17.  
  18. #define Uses_TEventQueue
  19. #define Uses_TEvent
  20. #define Uses_TScreen
  21. #include <tv.h>
  22.  
  23. #if !defined( __DOS_H )
  24. #ifndef __DOS_H
  25. #include <dos.h>
  26. #endif
  27. #endif  // __DOS_H
  28.  
  29. #if !defined( __BIOS_H )
  30. #ifndef __BIOS_H
  31. #include <bios.h>
  32. #endif
  33. #endif  // __BIOS_H
  34.  
  35.  
  36. TEvent near TEventQueue::eventQueue[ eventQSize ] = { {0} };
  37. TEvent *near TEventQueue::eventQHead = TEventQueue::eventQueue;
  38. TEvent *near TEventQueue::eventQTail = TEventQueue::eventQueue;
  39. Boolean near TEventQueue::mouseIntFlag = False;
  40.  
  41. #ifdef PROTECT
  42. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( biosSeg, 0x006c );
  43. #else
  44. ushort far * near TEventQueue::Ticks = (ushort far *)MK_FP( 0x0040, 0x006c );
  45. #endif
  46.  
  47. ushort near TEventQueue::eventCount = 0;
  48. Boolean near TEventQueue::mouseEvents = False;
  49. Boolean near TEventQueue::mouseReverse = False;
  50. ushort near TEventQueue::doubleDelay = 8;
  51. ushort near TEventQueue::repeatDelay = 8;
  52. ushort near TEventQueue::autoTicks = 0;
  53. ushort near TEventQueue::autoDelay = 0;
  54.  
  55. MouseEventType near TEventQueue::lastMouse;
  56. MouseEventType near TEventQueue::curMouse;
  57. MouseEventType near TEventQueue::downMouse;
  58. ushort near TEventQueue::downTicks = 0;
  59.  
  60. TEventQueue::TEventQueue()
  61. {
  62.     resume();
  63. }
  64.  
  65. void TEventQueue::resume()
  66. {
  67.     if( mouse.present() == False )
  68.         mouse.resume();
  69.     if( mouse.present() == False )
  70.         return;
  71.     mouse.getEvent( curMouse );
  72.     lastMouse = curMouse;
  73.     mouse.registerHandler( 0xFFFF, mouseInt );
  74.     mouseEvents = True;
  75.     mouse.show();
  76.     TMouse::setRange( TScreen::screenWidth-1, TScreen::screenHeight-1 );
  77. }
  78.  
  79. void TEventQueue::suspend()
  80. {
  81.     mouse.suspend();
  82. }
  83.  
  84. TEventQueue::~TEventQueue()
  85. {
  86.     suspend();
  87. }
  88.  
  89. void TEventQueue::getMouseEvent( TEvent& ev )
  90. {
  91.     if( mouseEvents == True )
  92.         {
  93.  
  94.         getMouseState( ev );
  95.  
  96.         if( ev.mouse.buttons == 0 && lastMouse.buttons != 0 )
  97.             {
  98.             ev.what = evMouseUp;
  99.             lastMouse = ev.mouse;
  100.             return;
  101.             }
  102.  
  103.         if( ev.mouse.buttons != 0 && lastMouse.buttons == 0 )
  104.             {
  105.             if( ev.mouse.buttons == downMouse.buttons &&
  106.                 ev.mouse.where == downMouse.where &&
  107.                 ev.what - downTicks <= doubleDelay )
  108.                     ev.mouse.doubleClick = True;
  109.  
  110.             downMouse = ev.mouse;
  111.             autoTicks = downTicks = ev.what;
  112.             autoDelay = repeatDelay;
  113.             ev.what = evMouseDown;
  114.             lastMouse = ev.mouse;
  115.             return;
  116.             }
  117.  
  118.         ev.mouse.buttons = lastMouse.buttons;
  119.  
  120.         if( ev.mouse.where != lastMouse.where )
  121.             {
  122.             ev.what = evMouseMove;
  123.             lastMouse = ev.mouse;
  124.             return;
  125.             }
  126.  
  127.         if( ev.mouse.buttons != 0 && ev.what - autoTicks > autoDelay )
  128.             {
  129.             autoTicks = ev.what;
  130.             autoDelay = 1;
  131.             ev.what = evMouseAuto;
  132.             lastMouse = ev.mouse;
  133.             return;
  134.             }
  135.         }
  136.  
  137.     ev.what = evNothing;
  138. }
  139.  
  140. void TEventQueue::getMouseState( TEvent & ev )
  141. {
  142.     disable();
  143.     if( eventCount == 0 )
  144.         {
  145.         ev.what = *Ticks;
  146.         ev.mouse = curMouse;
  147.         }
  148.     else
  149.         {
  150.         ev = *eventQHead;
  151.         if( ++eventQHead >= eventQueue + eventQSize )
  152.             eventQHead = eventQueue;
  153.         eventCount--;
  154.         }
  155.     enable();
  156.     if( mouseReverse != False && ev.mouse.buttons != 0 && ev.mouse.buttons != 3 )
  157.         ev.mouse.buttons ^= 3;
  158. }
  159.  
  160. #pragma saveregs
  161.  
  162. void huge TEventQueue::mouseInt()
  163. {
  164.     unsigned flag = _AX;
  165.     MouseEventType tempMouse;
  166.  
  167.     tempMouse.buttons = _BL;
  168.     tempMouse.doubleClick = False;
  169.     tempMouse.where.x = _CX >> 3;
  170.     tempMouse.where.y = _DX >> 3;
  171.  
  172.     if( (flag & 0x1e) != 0 && eventCount < eventQSize )
  173.         {
  174.         eventQTail->what = *Ticks;
  175.         eventQTail->mouse = curMouse;
  176.         if( ++eventQTail >= eventQueue + eventQSize )
  177.             eventQTail = eventQueue;
  178.         eventCount++;
  179.         }
  180.  
  181.     curMouse = tempMouse;
  182.     mouseIntFlag = True;
  183. }
  184.  
  185. #pragma warn -asc
  186.  
  187. void TEvent::getKeyEvent()
  188. {
  189.     asm {
  190.         MOV AH,1;
  191.         INT 16h;
  192.         JNZ keyWaiting;
  193.         };
  194.     what = evNothing;
  195.     return;
  196.  
  197. keyWaiting:
  198.  
  199.     what = evKeyDown;
  200.     asm {
  201.         MOV AH,0;
  202.         INT 16h;
  203.         };
  204.     keyDown.keyCode = _AX;
  205.     return;
  206. }
  207.  
  208. #pragma warn .asc
  209.