You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
316 lines
11 KiB
316 lines
11 KiB
/**************************************************************************\
|
|
* Module Name: softkbdc.h
|
|
*
|
|
* Copyright (c) 1985 - 2000, Microsoft Corporation
|
|
*
|
|
* Declaration of CSoftKbd
|
|
*
|
|
* History:
|
|
* 28-March-2000 weibz Created
|
|
\**************************************************************************/
|
|
|
|
#ifndef __SOFTKBDC_H_
|
|
#define __SOFTKBDC_H_
|
|
|
|
#include "resource.h"
|
|
|
|
#include <windows.h>
|
|
#include "globals.h"
|
|
#include "SoftKbd.h"
|
|
#include "msxml.h"
|
|
#include "helpers.h"
|
|
|
|
#define MAX_KEY_NUM 256
|
|
|
|
#define NON_KEYBOARD -1
|
|
|
|
#define IdTimer_MonitorMouse 0x1000
|
|
#define MONITORMOUSE_ELAPSE 8000
|
|
|
|
// we assume no keyboard has more than 256 keys
|
|
|
|
#define KID_ICON 0x100
|
|
#define KID_CLOSE 0x101
|
|
|
|
#define DWCOOKIE_SFTKBDWNDES 0x2000
|
|
|
|
extern HINSTANCE g_hInst;
|
|
|
|
#define LABEL_TEXT 1
|
|
#define LABEL_PICTURE 2
|
|
|
|
#define LABEL_DISP_ACTIVE 1
|
|
#define LABEL_DISP_GRAY 2
|
|
|
|
typedef struct tagActiveLabel { // label for current active state.
|
|
KEYID keyId;
|
|
WCHAR *lpLabelText;
|
|
WORD LabelType;
|
|
WORD LabelDisp;
|
|
} ACTIVELABEL, *PACTIVELABEL;
|
|
|
|
typedef struct tagKeyLabels { // labels for all states.
|
|
KEYID keyId;
|
|
WORD wNumModComb; // number of modifier combination states.
|
|
BSTR *lppLabelText;
|
|
WORD *lpLabelType;
|
|
WORD *lpLabelDisp;
|
|
// Every lppLabelText maps to one lpLabelType
|
|
} KEYLABELS, *PKEYLABELS, FAR * LPKEYLABELS;
|
|
|
|
typedef struct tagKeyMap {
|
|
|
|
WORD wNumModComb; // number of modifier combination states.
|
|
WORD wNumOfKeys;
|
|
WCHAR wszResource[MAX_PATH]; // Keep the resource file path if
|
|
// any key has picture as its label
|
|
//
|
|
KEYLABELS lpKeyLabels[MAX_KEY_NUM];
|
|
|
|
HKL hKl;
|
|
struct tagKeyMap *pNext;
|
|
|
|
} KEYMAP, *PKEYMAP, FAR * LPKEYMAP;
|
|
|
|
typedef struct tagKEYDES {
|
|
|
|
KEYID keyId;
|
|
WORD wLeft; // relative to the left-top point of the layout window described in KEYBOARD.
|
|
WORD wTop;
|
|
WORD wWidth;
|
|
WORD wHeight;
|
|
MODIFYTYPE tModifier;
|
|
} KEYDES, FAR * LPKEYDES;
|
|
|
|
typedef struct tagKbdLayout {
|
|
|
|
WORD wLeft;
|
|
WORD wTop;
|
|
WORD wWidth;
|
|
WORD wHeight;
|
|
WORD wMarginWidth;
|
|
WORD wMarginHeight;
|
|
BOOL fStandard; // TRUE means this is a standard keyboard;
|
|
// FALSE means a user-defined keyboard layout.
|
|
|
|
WORD wNumberOfKeys;
|
|
KEYDES lpKeyDes[MAX_KEY_NUM];
|
|
|
|
} KBDLAYOUT, *PKBDLAYOUT, FAR * LPKBDLAYOUT;
|
|
|
|
|
|
typedef struct tagKbdLayoutDes {
|
|
|
|
DWORD wKbdLayoutID;
|
|
WCHAR KbdLayoutDesFile[MAX_PATH];
|
|
ISoftKeyboardEventSink *pskbes;
|
|
// Soft Keyboard Event Sink should be per Soft Keyboard.
|
|
WORD ModifierStatus; // Every bit stands for one modifier's status
|
|
//
|
|
// CapsLock bit 1
|
|
// Shift bit 2
|
|
// Ctrl bit 3
|
|
// Alt bit 4
|
|
// Kana bit 5
|
|
// NumLock bit 6
|
|
//
|
|
// Etc.
|
|
KBDLAYOUT kbdLayout;
|
|
|
|
KEYMAP *lpKeyMapList;
|
|
|
|
DWORD CurModiState;
|
|
HKL CurhKl;
|
|
|
|
struct tagKbdLayoutDes *pNext;
|
|
|
|
} KBDLAYOUTDES, * PKBDLAYOUTDES, FAR * LPKBDLAYOUTDES;
|
|
|
|
|
|
class CSoftkbdUIWnd;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSoftKbd
|
|
class CSoftKbd :
|
|
public CComObjectRoot_CreateInstance<CSoftKbd>,
|
|
public ISoftKbd
|
|
{
|
|
public:
|
|
CSoftKbd();
|
|
~CSoftKbd();
|
|
|
|
BEGIN_COM_MAP_IMMX(CSoftKbd)
|
|
COM_INTERFACE_ENTRY(ISoftKbd)
|
|
END_COM_MAP_IMMX()
|
|
|
|
// ISoftKbd
|
|
public:
|
|
|
|
STDMETHOD(Initialize)();
|
|
STDMETHOD(EnumSoftKeyBoard)(/*[in]*/ LANGID langid, /*[out]*/ DWORD *lpdwKeyboard);
|
|
STDMETHOD(SelectSoftKeyboard)(/*[in]*/ DWORD dwKeyboardId);
|
|
STDMETHOD(CreateSoftKeyboardLayoutFromXMLFile)(/*[in, string]*/ WCHAR *lpszKeyboardDesFile, /*[in]*/ INT szFileStrLen, /*[out]*/ DWORD *pdwLayoutCookie);
|
|
STDMETHOD(CreateSoftKeyboardLayoutFromResource)(/*[in]*/ WCHAR *lpszResFile, /*[in, string] */ WCHAR *lpszResType, /*[in, string] */ WCHAR *lpszXMLResString, /*[out] */ DWORD *lpdwLayoutCookie);
|
|
STDMETHOD(ShowSoftKeyboard)(/*[in]*/ INT iShow);
|
|
STDMETHOD(SetKeyboardLabelText)(/*[in]*/ HKL hKl );
|
|
STDMETHOD(SetKeyboardLabelTextCombination)(/*[in]*/ DWORD nModifierCombination);
|
|
STDMETHOD(CreateSoftKeyboardWindow)(/*[in]*/ HWND hOwner, /*in*/ TITLEBAR_TYPE Titlebar_type, /*[in]*/ INT xPos, /*[in]*/ INT yPos, /*[in]*/ INT width, /*[in]*/ INT height );
|
|
STDMETHOD(DestroySoftKeyboardWindow)();
|
|
STDMETHOD(GetSoftKeyboardPosSize)(/*[out]*/ POINT *lpStartPoint, /*[out]*/ WORD *lpwidth, /*[out]*/ WORD *lpheight);
|
|
STDMETHOD(GetSoftKeyboardColors)(/*[in]*/ COLORTYPE colorType, /*[out]*/ COLORREF *lpColor);
|
|
STDMETHOD(GetSoftKeyboardTypeMode)(/*[out]*/ TYPEMODE *lpTypeMode);
|
|
STDMETHOD(GetSoftKeyboardTextFont)(/*[out]*/ LOGFONTW *pLogFont);
|
|
STDMETHOD(SetSoftKeyboardPosSize)(/*[in]*/ POINT StartPoint, /*[in]*/ WORD width, /*[in]*/ WORD height);
|
|
STDMETHOD(SetSoftKeyboardColors)(/*[in]*/ COLORTYPE colorType, /*[in]*/ COLORREF Color);
|
|
STDMETHOD(SetSoftKeyboardTypeMode)(/*[in]*/ TYPEMODE TypeMode);
|
|
STDMETHOD(SetSoftKeyboardTextFont)(/*[in]*/ LOGFONTW *pLogFont);
|
|
STDMETHOD(ShowKeysForKeyScanMode)(/*[in]*/ KEYID *lpKeyID, /*[in]*/ INT iKeyNum, /*[in]*/ BOOL fHighL);
|
|
STDMETHOD(AdviseSoftKeyboardEventSink)(/* [in]*/DWORD dwKeyboardId,/*[in] */REFIID riid, /*[in, iid_is(riid)] */IUnknown *punk, /*[out] */DWORD *pdwCookie);
|
|
STDMETHOD(UnadviseSoftKeyboardEventSink)(/*[in] */DWORD dwCookie);
|
|
|
|
// Following public functions will be called by CSoftkbdUIWnd.
|
|
|
|
HRESULT _HandleKeySelection(KEYID keyId);
|
|
HRESULT _HandleTitleBarEvent( DWORD dwId );
|
|
|
|
KBDLAYOUTDES *_GetCurKbdLayout( ) { return _lpCurKbdLayout; }
|
|
DWORD _GetCurKbdLayoutID( ) { return _wCurKbdLayoutID; }
|
|
ACTIVELABEL *_GetCurLabel( ) { return _CurLabel; }
|
|
RECT *_GetTitleBarRect( ) { return &_TitleBarRect; }
|
|
ISoftKbdWindowEventSink *_GetSoftKbdWndES( ) { return _pskbdwndes; }
|
|
|
|
private:
|
|
KBDLAYOUTDES *_lpKbdLayoutDesList;
|
|
KBDLAYOUTDES *_lpCurKbdLayout;
|
|
DWORD _wCurKbdLayoutID;
|
|
ACTIVELABEL _CurLabel[MAX_KEY_NUM];
|
|
HWND _hOwner;
|
|
CSoftkbdUIWnd *_pSoftkbdUIWnd;
|
|
int _xReal;
|
|
int _yReal;
|
|
int _widthReal;
|
|
int _heightReal;
|
|
IXMLDOMDocument *_pDoc;
|
|
|
|
COLORREF _color[Max_color_Type];
|
|
INT _iShow;
|
|
LOGFONTW *_plfTextFont;
|
|
|
|
WORD _TitleButtonWidth;
|
|
RECT _TitleBarRect;
|
|
TITLEBAR_TYPE _TitleBar_Type;
|
|
|
|
ISoftKbdWindowEventSink *_pskbdwndes;
|
|
|
|
HRESULT _CreateStandardSoftKbdLayout(DWORD dwStdSoftKbdID, WCHAR *wszStdResStr );
|
|
HRESULT _GenerateRealKbdLayout( );
|
|
HRESULT _SetStandardLabelText(LPBYTE pKeyState, KBDLAYOUT *realKbdLayut,
|
|
KEYMAP *lpKeyMapList, int iState);
|
|
HRESULT _GenerateUSStandardLabel( );
|
|
HRESULT _GenerateUSEnhanceLabel( );
|
|
HRESULT _GenerateEuroStandardLabel( );
|
|
HRESULT _GenerateEuroEnhanceLabel( );
|
|
HRESULT _GenerateJpnStandardLabel( );
|
|
HRESULT _GenerateJpnEnhanceLabel( );
|
|
|
|
HRESULT _GenerateCurModiState(WORD *ModifierStatus, DWORD *CurModiState);
|
|
|
|
HRESULT _GenerateMapDesFromSKD(BYTE *pMapTable, KEYMAP *lpKeyMapList);
|
|
HRESULT _GenerateKeyboardLayoutFromSKD(BYTE *lpszKeyboardDes, DWORD dwKbdLayoutID, KBDLAYOUTDES **lppKbdLayout);
|
|
|
|
HRESULT _LoadDocumentSync(BSTR pBURL, BOOL fFileName);
|
|
HRESULT _ParseKeyboardLayout(BOOL fFileName, WCHAR *lpszKeyboardDesFile, DWORD dwKbdLayoutID, KBDLAYOUTDES **lppKbdLayout);
|
|
HRESULT _ParseLayoutDescription(IXMLDOMNode *pLayoutChild, KBDLAYOUT *pLayout);
|
|
HRESULT _ParseMappingDescription(IXMLDOMNode *pLabelChild, KEYMAP *lpKeyMapList);
|
|
HRESULT _GetXMLNodeValueWORD(IXMLDOMNode *pNode, WORD *lpWord);
|
|
HRESULT _ParseOneKeyInLayout(IXMLDOMNode *pNode, KEYDES *lpKeyDes);
|
|
HRESULT _ParseOneKeyInLabel(IXMLDOMNode *pNode, KEYLABELS *lpKeyLabels);
|
|
|
|
DWORD _UnicodeToUtf8(PWCHAR pwUnicode, DWORD cchUnicode, PCHAR pchResult, DWORD cchResult);
|
|
DWORD _Utf8ToUnicode(PCHAR pchUtf8, DWORD cchUtf8, PWCHAR pwResult, DWORD cwResult);
|
|
};
|
|
|
|
|
|
//
|
|
// Following are the definition for some XML node and attribute names.
|
|
//
|
|
|
|
#define xSOFTKBDDES L"softKbdDes"
|
|
|
|
#define xSOFTKBDTYPE L"softkbdtype"
|
|
#define xTCUSTOMIZED L"customized"
|
|
#define xTSTANDARD L"standard"
|
|
|
|
#define xWIDTH L"width"
|
|
#define xHEIGHT L"height"
|
|
#define xMARGIN_WIDTH L"margin_width"
|
|
#define xMARGIN_HEIGHT L"margin_height"
|
|
#define xKEYNUMBER L"keynumber"
|
|
#define xKEY L"key"
|
|
|
|
#define xMODIFIER L"modifier"
|
|
#define xNONE L"none"
|
|
#define xCAPSLOCK L"CapsLock"
|
|
#define xSHIFT L"Shift"
|
|
#define xCTRL L"Ctrl"
|
|
#define xATL L"Alt"
|
|
#define xKANA L"Kana"
|
|
#define xALTGR L"AltGr"
|
|
#define xNUMLOCK L"NumLock"
|
|
|
|
#define xKEYID L"keyid"
|
|
#define xLEFT L"left"
|
|
#define xTOP L"top"
|
|
|
|
|
|
#define xVALIDSTATES L"validstates"
|
|
#define xKEYLABEL L"keylabel"
|
|
#define xLABELTEXT L"labeltext"
|
|
#define xLABELTYPE L"labeltype"
|
|
#define xTEXT L"text"
|
|
|
|
#define xLABELDISP L"labeldisp"
|
|
#define xGRAY L"gray"
|
|
#define xRESOURCEFILE L"resourcefile"
|
|
|
|
|
|
//
|
|
// Macros to simplify UTF8 conversions
|
|
//
|
|
|
|
#define UTF8_1ST_OF_2 0xc0 // 110x xxxx
|
|
#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx
|
|
#define UTF8_1ST_OF_4 0xf0 // 1111 xxxx
|
|
#define UTF8_TRAIL 0x80 // 10xx xxxx
|
|
|
|
#define UTF8_2_MAX 0x07ff // max unicode character representable in
|
|
// in two byte UTF8
|
|
|
|
#define BIT7(ch) ((ch) & 0x80)
|
|
#define BIT6(ch) ((ch) & 0x40)
|
|
#define BIT5(ch) ((ch) & 0x20)
|
|
#define BIT4(ch) ((ch) & 0x10)
|
|
#define BIT3(ch) ((ch) & 0x08)
|
|
|
|
#define LOW6BITS(ch) ((ch) & 0x3f)
|
|
#define LOW5BITS(ch) ((ch) & 0x1f)
|
|
#define LOW4BITS(ch) ((ch) & 0x0f)
|
|
|
|
|
|
//
|
|
// Surrogate pair support
|
|
// Two unicode characters may be linked to form a surrogate pair.
|
|
// And for some totally unknown reason, some person thought they
|
|
// should travel in UTF8 as four bytes instead of six.
|
|
// No one has any idea why this is true other than to complicate
|
|
// the code.
|
|
//
|
|
|
|
#define HIGH_SURROGATE_START 0xd800
|
|
#define HIGH_SURROGATE_END 0xdbff
|
|
#define LOW_SURROGATE_START 0xdc00
|
|
#define LOW_SURROGATE_END 0xdfff
|
|
|
|
|
|
|
|
#endif //__SOFTKBDC_H_
|