home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / df3os2.zip / KEYBOARD.CPP < prev    next >
C/C++ Source or Header  |  1993-10-30  |  3KB  |  140 lines

  1. // ----------- keyboard.cpp
  2. //
  3. // modified for OS/2 operation - jw21sep93
  4.  
  5. #include <stdio.h>
  6. #include "desktop.h"
  7.  
  8. /* ----- table of alt keys for finding shortcut keys ----- */
  9. static int altconvert[] = 
  10.     {
  11.     ALT_A,ALT_B,ALT_C,ALT_D,ALT_E,ALT_F,ALT_G,ALT_H,
  12.     ALT_I,ALT_J,ALT_K,ALT_L,ALT_M,ALT_N,ALT_O,ALT_P,
  13.     ALT_Q,ALT_R,ALT_S,ALT_T,ALT_U,ALT_V,ALT_W,ALT_X,
  14.     ALT_Y,ALT_Z,ALT_0,ALT_1,ALT_2,ALT_3,ALT_4,ALT_5,
  15.     ALT_6,ALT_7,ALT_8,ALT_9
  16.     };
  17.  
  18.  
  19. Keyboard::Keyboard()
  20.     {
  21.     hKbd = 0;
  22.  
  23.     KbdOpen(&hKbd);
  24.     KbdGetFocus(IO_WAIT, hKbd);
  25.     ki.cb = sizeof(ki);
  26.     ki.fsMask = KEYBOARD_BINARY_MODE | KEYBOARD_SHIFT_REPORT;
  27.     KbdSetStatus(&ki, hKbd);
  28.  
  29.     shift = GetShift();         // initialise shift state
  30.     insert = True;
  31.     }
  32.  
  33.  
  34. /* ---- Test for keystroke ---- */
  35. Bool Keyboard::KeyHit()
  36.     {
  37.     KbdPeek(&kki, hKbd);
  38.     return (kki.fbStatus & ZEROFLAG) ? True : False;
  39.     }
  40.  
  41. /* ---- Read a keystroke ---- */
  42. int Keyboard::GetKey()
  43.     {
  44.     int c;
  45.  
  46.     KbdCharIn(&kki, IO_WAIT, hKbd);
  47.     if (kki.chChar == 0x00 || kki.chChar == 0xE0)
  48.         {
  49.         c = kki.chScan | 0x1080;
  50.         }
  51.     else
  52.         {
  53.         c = kki.chChar & 0xff;
  54.         }
  55.     return c & 0x10ff;
  56.     }
  57.  
  58. /* ---------- read the keyboard shift status --------- */
  59.  
  60. int Keyboard::GetShift()
  61.     {
  62.     register int os2State;
  63.     register int state = 0;
  64.  
  65.     KbdGetStatus(&ki, hKbd);
  66.     os2State = ki.fsState;
  67.  
  68.     if(os2State & KBDSTF_INSERT_ON) {state  = INSERTKEY; }
  69.     if(os2State & KBDSTF_CAPSLOCK)  {state |= CAPSLOCK;  }
  70.     if(os2State & KBDSTF_NUMLOCK)   {state |= NUMLOCK;   }
  71.     if(os2State & KBDSTF_SCROLLLOCK){state |= SCROLLLOCK;}
  72.     if(os2State & KBDSTF_ALT)       {state |= ALTKEY;    }
  73.     if(os2State & KBDSTF_CONTROL)   {state |= CTRLKEY;   }
  74.     if(os2State & KBDSTF_LEFTSHIFT) {state |= LEFTSHIFT; }
  75.     if(os2State & KBDSTF_RIGHTSHIFT){state |= RIGHTSHIFT;}
  76.  
  77.     return state;
  78.     }
  79.  
  80. /* ------ convert an Alt+ key to its letter equivalent ----- */
  81. int Keyboard::AltConvert(int c)
  82.     {
  83.     int i = 0;
  84.     int a = 0;
  85.  
  86.     for (i = 0; i < 36; i++)
  87.         {
  88.         if (c == altconvert[i])
  89.             {
  90.             break;
  91.             }
  92.         }
  93.  
  94.     if (i < 26)
  95.         {
  96.         a = 'a' + i;
  97.         }
  98.     else if (i < 36)
  99.         {
  100.         a = '0' + i - 26;
  101.         }
  102.  
  103.     return a;
  104.     }
  105.  
  106. Bool Keyboard::ShiftChanged()
  107.     {
  108.     int  sk  = GetShift();
  109.     Bool rtn = (Bool) (sk != shift);
  110.     shift    = sk;
  111.     return rtn;
  112.     }
  113.  
  114. // ------ dispatch keyboard events
  115. void Keyboard::DispatchEvent()
  116.     {
  117.     DFWindow *Kwnd = desktop.InFocus();
  118.  
  119.     if (Kwnd == 0)
  120.         {
  121.         Kwnd = (DFWindow *) desktop.ApplWnd();
  122.         }
  123.  
  124.     if (ShiftChanged())
  125.         {
  126.         // ---- the shift status changed
  127.         Kwnd->ShiftChanged(GetShift());
  128.         }
  129.  
  130.     if (KeyHit())    
  131.         {
  132.         // --- a key was pressed
  133.         Kwnd->Keyboard(GetKey());
  134.         Kwnd->KeyReleased();
  135.         }
  136.     }
  137.  
  138.  
  139.  
  140.