// KBMAIN.H      KEYBOARD MAIN HEADER FILE


/**************************************************************************/
/* GLOBAL DEFINES  */
/**************************************************************************/
// WINDOW TYPES
#define KB_MAIN_WND    	1
#define KB_KEY_WND	  	2
#define KB_MODIFIER_WND 3
#define KB_DEAD_WND		4
#define KB_NUMBASE_WND 	5
#define KB_NUMKEY_WND  	6
#define DESKTOP_ACCESSDENIED 0
#define DESKTOP_DEFAULT      1
#define DESKTOP_SCREENSAVER  2
#define DESKTOP_WINLOGON     3
#define DESKTOP_TESTDISPLAY  4
#define DESKTOP_OTHER        5

// KEYBOARD MARGINS
//The smallest width (pixel) you can get for KB
//#define KB_SMALLRMARGIN  152//137     //for width(smallKB).  152 - Block, 137 - Actual  (Moved to kbmain, WM_SIZE) 
#define KB_LARGERMARGIN  202     //for width
#define KB_CHARBMARGIN   57        //for height


#define KB_NUMRMARGIN
#define KB_NUMBMARGIN

// KEYBOARD NUMBERKEY
#define KB_HOWMANYKEY	 130    // IT HAS TO INCLUDE THE NUMERIC KEYBOARD 

// SOUND TYPES
#define SND_UP 		1
#define SND_DOWN 		2

// TIMERS
#define TIMER_HELPTOOLTIP 1014

#include "door.h"

LRESULT WINAPI kbMainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT WINAPI kbKeyWndProc(HWND hwndKey, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK KeybdInputProc(WPARAM  wParam, LPARAM  lParam);
void RelocateDialog(HWND hDlg);

#define CAPLOCK_SCANCODE 0x3A
#define LSHIFT_SCANCODE  0x2A
#define RSHIFT_SCANCODE  0x36
#define TAB_SCANCODE     0x0f
#define BREAK_SCANCODE   0xE1
#define LMENU_SCANCODE   0x38
#define RMENU_SCANCODE   0x38 // extended 0xE0
#define CONTROL_SCANCODE 0x1D

#define RGB_KEYBGHIGHLIGHT COLOR_HIGHLIGHT /*RGB(0,0,0)*/

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) sizeof(x)/sizeof(x[0])
#endif

/**************************************************************************/
/* GLOBAL VARIABLES  */
/**************************************************************************/

extern LPKBPREFINFO lpkbPref;				// Pointer to KB structure
extern LPKBPREFINFO lpkbDefault;			// ditto Default
extern HINSTANCE 	hInst;					// iinstance of keyboard process
extern HWND   	   *lpkeyhwnd;				// ptr to array of HWND
extern HWND 		numBasehwnd;			// HWND to the num base window
extern HWND			g_hwndOSK;				// HWND to the kbmain window
extern int 			lenKBkey;				// How Many Keys?
extern int          scrCY;					// Screen Height
extern int 			scrCX;					// Screen Width
extern int 			captionCY;				// Caption Bar Height
extern HHOOK		hkJRec;					// HHOOK to the Journal Record
extern int 			g_margin;         		// Margin between rows and columns
extern BOOL			smallKb;				// TRUE when working with Small Keyboard
extern COLORREF	PrefTextKeyColor;   		// Prefered Color for text in keys
extern COLORREF 	PrefCharKeyColor; 		// ditto normal key
extern COLORREF 	PrefModifierKeyColor;	// ditto modifier key
extern COLORREF 	PrefDeadKeyColor;       // ditto dead key
extern COLORREF	PrefBackgroundColor;        // ditto Keyboard backgraund
extern BOOL			PrefAlwaysontop;			// Always on Top control
extern int			PrefDeltakeysize;			// Preference increment in key size
extern BOOL			PrefshowActivekey;		// Show cap letters in keys
extern int			KBLayout;				// 101, 102, 106, KB layout
extern BOOL			Prefusesound;				// Use click sound
extern BOOL			newFont;						// Font is changed
extern LOGFONT		*plf;            			// pointer to the actual char font
extern HGDIOBJ 	oldFontHdle;     			// Old object handle
extern COLORREF	InvertTextColor; 			//Font color on inversion
extern COLORREF	InvertBKGColor;			//BKG color on inversion
extern BOOL			Prefhilitekey;				// True for hilite eky under cursor

// Dwelling time control variables
extern BOOL			PrefDwellinkey;			// use dwelling system
extern UINT			PrefDwellTime;		    // Dwell time preference

extern BOOL         PrefScanning;           //use scanning
extern UINT         PrefScanTime;           //Prefer scan time

extern BOOL		    g_fShowWarningAgain;		// Show initial warning dialog again

extern HWND			Dwellwindow;	  		// dwelling window

extern int	 		stopPaint;				// stop the bucket paint
extern 				UINT_PTR timerK1;       // timer id for keyboard
extern 				UINT_PTR timerK2;		// timer for print line on key
/*****************************************************************************/

extern BOOL g_fDrawCapital;
extern BOOL g_fCapsLockOn;
extern BOOL g_fShiftKeyDn;
extern BOOL g_fRAltKey;			// TRUE if the RALT key is down
extern BOOL	g_fLAltKey;			// TRUE if the left ALT key is down
extern BOOL g_fLCtlKey;         // TRUE if the left CTRL key is donw
extern HWND g_hwndInputFocus;   // the window we are inputting to


//
// These are the different 'modified' states a key can have. Note that shifted,
// caps-lock, and shifted-caps-lock are all different states, since alphabetic
// numbers and symbols behave differently in these states.
//
typedef enum {
    KEYMOD_NORMAL,
    KEYMOD_SHIFTED,
    KEYMOD_CAPSLOCK,
    KEYMOD_SHIFTEDCAPSLOCK,
    KEYMOD_ALTGR,
    KEYMOD_STATES
} KEYMODSTATE;



__inline BOOL AltGrKeyPressed()	
{ 
    // this check is relaxed because the OS sets LCTRL toggled when LALT key is pressed
    return (g_fRAltKey || (g_fLAltKey && g_fLCtlKey))? TRUE:FALSE; 
}

__inline BOOL CapsLockIsOn() 
{ 
	return (g_fCapsLockOn)?TRUE:FALSE; 
}

__inline KEYMODSTATE GetModifierState()
{
	// The order of keyboard state checking is important; ALTGR takes
	// precedence over the shift/capslock variants, which takes precedence
    // over normal.
    if( AltGrKeyPressed() )
        return KEYMOD_ALTGR;

    if( g_fCapsLockOn && g_fShiftKeyDn )
        return KEYMOD_SHIFTEDCAPSLOCK;

    if( g_fCapsLockOn )
        return KEYMOD_CAPSLOCK;

    if( g_fShiftKeyDn )
        return KEYMOD_SHIFTED;

    return KEYMOD_NORMAL;
}


__inline HWND OurInputTarget() 
{ 
	if (!IsWindow(g_hwndInputFocus))
	{
		g_hwndInputFocus = NULL;
	}
	return g_hwndInputFocus; 
}

__inline HKL GetCurrentHKL()
{
    DWORD dwProcessId;
    HWND hwnd = OurInputTarget();
	return GetKeyboardLayout(GetWindowThreadProcessId((hwnd)?hwnd:g_hwndOSK, &dwProcessId));
}

__inline void SetBackgroundColor(HWND hwnd, unsigned long ulColor)
{
    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG)(ulColor+1));
}

BOOL OSKRunSecure();

