mirror of
https://github.com/keymanapp/keyman.git
synced 2026-10-13 01:17:29 +00:00
277 lines
9 KiB
C
277 lines
9 KiB
C
/*
|
|
* Keyman is copyright (C) SIL International. MIT License.
|
|
*
|
|
* Name: KeymanEngine
|
|
* Description: Main header file for windows engine
|
|
*
|
|
*/
|
|
/***************************************************************************/ // I4006 // I4169
|
|
|
|
#ifndef _KEYMANENGINE_H
|
|
#define _KEYMANENGINE_H
|
|
|
|
#ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
|
|
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
|
|
#endif
|
|
|
|
#ifndef _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT
|
|
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1
|
|
#endif
|
|
|
|
// For keyman_core_api_bits.h
|
|
#ifndef KM_CORE_LIBRARY_STATIC
|
|
#define KM_CORE_LIBRARY_STATIC
|
|
#endif
|
|
// For keyman_core_api_bits.h
|
|
#ifndef _WIN32
|
|
#define _WIN32 1
|
|
#endif
|
|
|
|
#ifndef _WIN32_WINNT
|
|
#define _WIN32_WINNT 0x0600
|
|
#endif
|
|
|
|
#ifndef STRICT
|
|
#define STRICT
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
#include <assert.h>
|
|
#include <msctf.h>
|
|
#include "../../../../common/include/kmx_file.h"
|
|
#include <keyman/keyman_core_api.h>
|
|
#include <keyman/keyman_core_api_actions.h> // for imx integration
|
|
#include <keyman/keyman_core_api_context.h> // for intermediate context
|
|
#include <keyman/keyman_core_api_consts.h>
|
|
|
|
/***************************************************************************/
|
|
|
|
typedef BOOL(WINAPI* IMDLLHOOKProc)(HWND hwndFocus, WORD KeyStroke, WCHAR KeyChar, DWORD shiftFlags);
|
|
|
|
typedef struct tagIMDLLHOOK
|
|
{
|
|
char name[32];
|
|
DWORD storeno;
|
|
IMDLLHOOKProc function;
|
|
} IMDLLHOOK, * LPIMDLLHOOK;
|
|
|
|
typedef struct tagIMDLL
|
|
{
|
|
char Filename[256];
|
|
HMODULE hModule;
|
|
DWORD nHooks;
|
|
LPIMDLLHOOK Hooks;
|
|
} IMDLL, * LPIMDLL;
|
|
|
|
typedef struct tagINTKEYBOARDOPTIONS
|
|
{
|
|
PWCHAR Value;
|
|
PWCHAR OriginalStore;
|
|
} INTKEYBOARDOPTIONS, * LPINTKEYBOARDOPTIONS;
|
|
|
|
typedef struct tagINTKEYBOARDPROFILE
|
|
{
|
|
//WCHAR Locale[LOCALE_NAME_MAX_LENGTH]; This is not currently used in keyman32/64 so we won't load it
|
|
LANGID LangID;
|
|
GUID Guid;
|
|
} INTKEYBOARDPROFILE, * LPINTKEYBOARDPROFILE;
|
|
|
|
// The members of this structure, from first through to IMDLLs, must match KEYBOARDINFO from keymanapi.h
|
|
typedef struct tagINTKEYBOARDINFO
|
|
{
|
|
DWORD KeymanID;
|
|
DWORD __filler_Hotkey;
|
|
DWORD __filler; // makes same as KEYBOARDINFO // I4462
|
|
char Name[256];
|
|
DWORD nIMDLLs;
|
|
LPIMDLL IMDLLs;
|
|
int __filler2; // makes same as KEYBOARDINFO
|
|
int nProfiles;
|
|
LPINTKEYBOARDPROFILE Profiles;
|
|
km_core_keyboard* lpCoreKeyboard;
|
|
km_core_option_item* lpCoreKeyboardOptions;
|
|
km_core_state* lpCoreKeyboardState;
|
|
km_core_keyboard_imx* lpIMXList;
|
|
} INTKEYBOARDINFO, * LPINTKEYBOARDINFO;
|
|
|
|
typedef struct tagKMSTATE
|
|
{
|
|
BOOL NoMatches;
|
|
WORD vkey; // I934
|
|
WCHAR charCode; // I4582
|
|
BOOL windowunicode; // I4287
|
|
BOOL isDown;
|
|
km_core_keyboard* lpCoreKb; // future use with IMDLL
|
|
} KMSTATE;
|
|
|
|
// I3616
|
|
enum ProcessStringReturn { psrPostMessages, psrCheckMatches };
|
|
|
|
LRESULT WINAPI kmnGetMessageProc(int nCode, WPARAM wParam, LPARAM lParam);
|
|
LRESULT WINAPI kmnCallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
|
|
LRESULT CALLBACK kmnLowLevelKeyboardProc( // I4124
|
|
_In_ int nCode,
|
|
_In_ WPARAM wParam,
|
|
_In_ LPARAM lParam
|
|
);
|
|
|
|
BOOL ReleaseStateMemoryCore(km_core_state** state);
|
|
BOOL ReleaseKeyboardMemoryCore(km_core_keyboard** kbd);
|
|
|
|
BOOL ProcessHook(); // returns FALSE on error or key not matched [only for AITip]
|
|
|
|
BOOL IsSysTrayWindow(HWND hwnd);
|
|
|
|
#define ShowDlgItem(hdlg, id, fShow ) ShowWindow( GetDlgItem( (hdlg), (id) ), (fShow) ? SW_SHOW : SW_HIDE )
|
|
#define EnableDlgItem(hdlg, id, fEnable ) EnableWindow( GetDlgItem( (hdlg), (id) ), (fEnable) )
|
|
|
|
BOOL InitialiseProcess();
|
|
BOOL UninitialiseProcess(BOOL Lock);
|
|
|
|
BOOL IsFocusedThread();
|
|
|
|
BOOL SelectKeyboard(DWORD KeymanID);
|
|
|
|
extern "C" DWORD _declspec(dllexport) WINAPI GetActiveKeymanID();
|
|
|
|
BOOL GetKeyboardFileName(LPSTR kbname, LPSTR buf, int nbuf);
|
|
BOOL LoadlpKeyboard(int i);
|
|
|
|
PSTR wstrtostr(PCWSTR in);
|
|
PWSTR strtowstr(PSTR in);
|
|
|
|
void SelectApplicationIntegration(); // I4287
|
|
|
|
void PostDummyKeyEvent(); // I3301 - Handle I3250 regression with inadvertent menu activation with Alt keys // I3534 // I4844
|
|
|
|
/* Debugging functions */
|
|
|
|
BOOL IsDebugAssertEnabled();
|
|
|
|
#ifndef SendDebugMessage
|
|
// I4379
|
|
typedef enum ATSDMState { sdmInternat, sdmAIDefault, sdmMessage, sdmKeyboard, sdmGlobal, sdmMenu, sdmDebug, sdmLoad, sdmOther } TSDMState;
|
|
|
|
void InitDebugging();
|
|
void UninitDebugging();
|
|
|
|
extern "C" void _declspec(dllexport) WINAPI Keyman_WriteDebugEvent(char* file, int line, PWCHAR msg);
|
|
extern "C" void _declspec(dllexport) WINAPI Keyman_WriteDebugEventW(PWCHAR file, int line, PWCHAR msg);
|
|
extern "C" void _declspec(dllexport) WINAPI Keyman_WriteDebugEvent2W(PWCHAR file, int line, PWCHAR function, PWCHAR msg);
|
|
extern "C" void _declspec(dllexport) WINAPI Keyman_SendDebugEntry(PWCHAR file, int line, PWCHAR function);
|
|
extern "C" void _declspec(dllexport) WINAPI Keyman_SendDebugExit(PWCHAR file, int line, PWCHAR function);
|
|
|
|
// Following macros widen a constant string, ugly it is true
|
|
#define __WIDEN2__(m) L ## m
|
|
#define __WIDEN1__(m) __WIDEN2__(m)
|
|
|
|
#define __WIDEN__(m) __WIDEN1__(m)
|
|
#define __WFILE__ __WIDEN1__(__FILE__)
|
|
#define __WFUNCTION__ __WIDEN1__(__FUNCTION__)
|
|
|
|
#define SendDebugEntry() (ShouldDebug() ? SendDebugEntry_1(__WFILE__, __LINE__, __WFUNCTION__) : 0)
|
|
#define SendDebugExit() (ShouldDebug() ? SendDebugExit_1(__WFILE__, __LINE__, __WFUNCTION__) : 0)
|
|
#define return_SendDebugExit(v) { SendDebugExit(); return v; }
|
|
|
|
#define SendDebugMessageW(msg) (ShouldDebug() ? SendDebugMessageW_1(__WFILE__, __LINE__, __WFUNCTION__, (msg)) : 0)
|
|
#define SendDebugMessageFormatW(msg,...) (ShouldDebug() ? SendDebugMessageFormatW_1(__WFILE__, __LINE__, __WFUNCTION__, (msg),__VA_ARGS__) : 0)
|
|
|
|
#define SendDebugMessage(msg) (ShouldDebug() ? SendDebugMessage_1(__WFILE__, __LINE__, __WFUNCTION__, (msg)) : 0)
|
|
#define SendDebugMessageFormat(msg,...) (ShouldDebug() ? SendDebugMessageFormat_1(__WFILE__, __LINE__, __WFUNCTION__, (msg),__VA_ARGS__) : 0)
|
|
#define ShouldDebug() ShouldDebug_1()
|
|
#define DebugLastError(context) (DebugLastError_1(GetLastError(), (context), __WFILE__, __LINE__, __WFUNCTION__))
|
|
#define DebugLastError0(error, context) (DebugLastError_1((error), (context), __WFILE__, __LINE__, __WFUNCTION__))
|
|
|
|
int SendDebugMessage_1(wchar_t* file, int line, wchar_t* function, char* msg);
|
|
int SendDebugMessageFormat_1(wchar_t* file, int line, wchar_t* function, char* fmt, ...);
|
|
int SendDebugMessageW_1(wchar_t* file, int line, wchar_t* function, wchar_t* msg);
|
|
int SendDebugMessageFormatW_1(wchar_t* file, int line, wchar_t* function, wchar_t* fmt, ...);
|
|
void DebugLastError_1(DWORD err, char* context, wchar_t* file, int line, wchar_t* function);
|
|
void DebugMessage(LPMSG msg, WPARAM wParam);
|
|
char* Debug_VirtualKey(WORD vk);
|
|
char* Debug_UnicodeString(PWSTR s, int x = 0);
|
|
BOOL ShouldDebug_1(); // TSDMState state);
|
|
|
|
int SendDebugEntry_1(wchar_t* file, int line, wchar_t* function);
|
|
int SendDebugExit_1(wchar_t* file, int line, wchar_t* function);
|
|
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
#define OutputThreadDebugString(s) _OutputThreadDebugString(s)
|
|
void _OutputThreadDebugString(char* s);
|
|
#else
|
|
#define OutputThreadDebugString(s)
|
|
#endif
|
|
|
|
/* Keyboard selection functions */
|
|
|
|
void HandleRefresh(int code, LONG tag);
|
|
void RefreshKeyboards(BOOL Initialising);
|
|
void CheckScheduledRefresh();
|
|
void ScheduleRefresh();
|
|
void ReleaseKeyboards(BOOL Lock);
|
|
void CheckScheduledRefresh();
|
|
void ScheduleRefresh();
|
|
|
|
/* Glossary conversion functions */
|
|
|
|
HKL ForceKeymanIDToHKL(DWORD KeymanID); // sign extends DWORD to HKL on Win64
|
|
DWORD ForceHKLToKeymanID(HKL hkl); // truncates HKL to DWORD on Win64
|
|
// I4220
|
|
DWORD HKLToKeyboardID(HKL hkl);
|
|
WORD HKLToLanguageID(HKL hkl);
|
|
WORD HKLToLayoutNumber(HKL hkl);
|
|
WORD HKLToLayoutID(HKL hkl);
|
|
|
|
PWSTR GetSystemStore(LPKEYBOARD kb, DWORD SystemID);
|
|
|
|
DWORD ExceptionMessage(LPSTR Proc, LPEXCEPTION_POINTERS ep);
|
|
|
|
void keybd_shift(LPINPUT pInputs, int* n, BOOL isReset, LPBYTE const kbd);
|
|
|
|
//#define KEYEVENT_EXTRAINFO_KEYMAN 0xF00F0000 // I4370
|
|
|
|
#ifndef _WIN64 // I4326
|
|
#include "hotkeys.h"
|
|
#endif
|
|
|
|
#include "appint\appint.h"
|
|
#include "appint\aitip.h"
|
|
#include "appint\aiwin2000unicode.h"
|
|
#include "globals.h"
|
|
|
|
#include "capsstate.h"
|
|
#include "keystate.h"
|
|
|
|
#include "calldll.h"
|
|
#include "keymancontrol.h"
|
|
#include "keyboardoptions.h"
|
|
#include "kmprocessactions.h"
|
|
#include "appcontext.h"
|
|
|
|
#include "syskbd.h"
|
|
#include "vkscancodes.h"
|
|
|
|
#include "testkeymanfunctioning.h"
|
|
#include "..\..\..\..\common\windows\cpp\include\keynames.h"
|
|
#include "..\..\..\include\kmtip_guids.h"
|
|
|
|
#include "..\..\..\..\common\windows\cpp\include\crc32.h"
|
|
|
|
#include "k32_tsf.h"
|
|
#include "k32_visualkeyboardinterface.h"
|
|
#include "LowLevelHookWatchDog.h"
|
|
|
|
void ReportActiveKeyboard(WORD wCommand); // I3933 // I3949
|
|
void SelectKeyboardHKL(DWORD hkl, BOOL foreground); // I3933 // I3949 // I4271
|
|
BOOL SelectKeyboardTSF(DWORD KeymanID, BOOL foreground); // I3933 // I3949 // I4271
|
|
BOOL ReportKeyboardChanged(WORD wCommand, DWORD dwProfileType, UINT langid, HKL hkl, GUID clsid, GUID guidProfile);
|
|
void ProcessModifierChange(UINT key, BOOL isUp, BOOL isExtended); // I4793
|
|
|
|
BOOL SetupCoreEnvironment(km_core_option_item **test_env_opts);
|
|
void DeleteCoreEnvironment(km_core_option_item *test_env_opts);
|
|
|
|
BOOL RestartLowLevelHook();
|
|
|
|
#endif // _KEYMANENGINE_H
|