( keys )

needs #define toolkit
needs EventType events
needs event os_events
needs case case

#define keyBitPower       0x0001  
#define keyBitPageUp      0x0002  
#define keyBitPageDown    0x0004  
#define keyBitHard1       0x0008  
#define keyBitHard2       0x0010  
#define keyBitHard3       0x0020  
#define keyBitHard4       0x0040  
#define keyBitCradle      0x0080  
#define keyBitAntenna     0x0100  
#define keyBitContrast    0x0200  

variable oldKeyMask
api: KeySetMask

keyBitPageUp    
keyBitPageDown or  
keyBitHard1    or
keyBitHard2    or 
keyBitHard3    or 
keyBitHard4    or constant usualKeys

#define vchrPageUp      0x000B 
#define vchrPageDown    0x000C
#define vchrHard1       0x0204
#define vchrHard2       0x0205
#define vchrHard3       0x0206
#define vchrHard4       0x0207

8
2 -- chr.w
2 -- keyCode.w
2 -- modifiers.w
drop

#define poweredOnKeyMask  0x0100

: TxtCharIsHardKey ( -- f )
   event chr.w w@ ( chr)
   dup vchrHard1 <
   swap vchrHard4 > or 0=
   event modifiers.w w@
   poweredOnKeyMask and \ must be zero
   0= and
;

0x0200 0x0400 or 
or 0x0008 
constant virtualKeyMask

: EvtKeydownIsVirtual ( -- f )
   event modifiers.w w@
   virtualKeyMask and 0 <>
;

\   
vect vectPageUp
vect vectPageDown  
vect vectHard1     
vect vectHard2     
vect vectHard3     
vect vectHard4     

: KeysHandler ( -- f )
   event eType
   keyDownEvent = 
   if
     TxtCharIsHardKey
     if
       event chr.w w@ 
       case
         vchrHard2 of vectHard2 endof
         vchrHard3 of vectHard3 endof
         vchrHard1 of vectHard1 endof
         vectHard4
       endcase
       -1 exit
     then 
     EvtKeydownIsVirtual 
     if
       event chr.w w@ 
       case
         vchrPageUp   of vectPageUp endof
         vchrPageDown of vectPageDown endof
         drop 0 exit
       endcase
       -1 exit
     then 0
   else 0
   then
;

\ ' KeysHandler to PreprocessEvent