mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-09 10:25:32 +00:00
* Keyman for Windows 10.0 Open Source * Squashed 'windows/src/ext/jedi/jedi/' content from commit f444ad2 git-subtree-dir: windows/src/ext/jedi/jedi git-subtree-split: f444ad2da4693851e523f1ea6bd541f701904c24 * Squashed 'windows/src/ext/jedi/jcl/' content from commit d63d3c9fd git-subtree-dir: windows/src/ext/jedi/jcl git-subtree-split: d63d3c9fd9ff84efdd8159084ec6a60313644243 * Squashed 'windows/src/ext/jedi/jvcl/' content from commit bee19f3b4 git-subtree-dir: windows/src/ext/jedi/jvcl git-subtree-split: bee19f3b46909fde2fa92c06cd2706f41d99f6c3 * Add required .res files * Add required .res files * Add docbook files (forced) * Add required libxslt * Add required jedi files * Add installation files * Tweak .gitignore for open * CI * Remove KMW from Developer source (#122) * Remove KMW from Developer source (copies during build) * Remove KMW from Developer source (copies during build) * Remove KMW from Developer source (copies during build) * Fixup release build and copy license, readme from kmw during build * Remove obsolete build help documentation * Keyman Engine 10 on Windows regression for shift states (#129) * Improve #128 -- cleaner debug messages * Fixes #127, shift state now resets correctly; and more work for #128 * Fixes #130 (#131)
235 lines
5.3 KiB
C++
235 lines
5.3 KiB
C++
#define STRICT
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
HWND hwnd;
|
|
HINSTANCE hinst;
|
|
LPSTR prm;
|
|
|
|
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
BOOL Keyman_Initialise(HWND hwnd, BOOL FSingleApp);
|
|
BOOL Keyman_Exit();
|
|
BOOL Keyman_ForceKeyboard(PSTR s);
|
|
BOOL Keyman_StopForcingKeyboard();
|
|
|
|
/************************************************************************************************************
|
|
* DLL entry functions
|
|
************************************************************************************************************/
|
|
|
|
int PASCAL WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPSTR cmdline, int nCmdShow)
|
|
{
|
|
WNDCLASSW wc;
|
|
|
|
hinst = hinstance;
|
|
prm = cmdline;
|
|
|
|
wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
|
|
wc.lpfnWndProc = (WNDPROC) MainWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hinst;
|
|
wc.hIcon = NULL;
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = L"KeymanDebug";
|
|
if(!RegisterClassW(&wc)) return FALSE;
|
|
|
|
hwnd = CreateWindowW(L"KeymanDebug", L"Keyman Debugger",
|
|
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
|
|
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, NULL, hinst, NULL);
|
|
if(!hwnd) return FALSE;
|
|
|
|
MSG msg;
|
|
|
|
while(GetMessageW(&msg, NULL, NULL, NULL))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessageW(&msg);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#define MAXBUF 1024
|
|
WCHAR buf[MAXBUF];
|
|
HFONT hFont;
|
|
|
|
void CreateFont()
|
|
{
|
|
HDC hDC = GetDC(GetDesktopWindow());
|
|
SetMapMode(hDC, MM_TEXT);
|
|
int lfpixelsy = GetDeviceCaps(hDC, LOGPIXELSY);
|
|
ReleaseDC(GetDesktopWindow(), hDC);
|
|
|
|
LOGFONT font;
|
|
|
|
font.lfHeight = -MulDiv(36, lfpixelsy, 72);
|
|
font.lfWidth = 0;
|
|
font.lfEscapement = 0;
|
|
font.lfOrientation = 0;
|
|
font.lfWeight = FW_NORMAL;
|
|
font.lfItalic = FALSE;
|
|
font.lfUnderline = FALSE;
|
|
font.lfStrikeOut = FALSE;
|
|
font.lfCharSet = DEFAULT_CHARSET;
|
|
font.lfOutPrecision = OUT_DEFAULT_PRECIS;
|
|
font.lfClipPrecision = CLIP_DEFAULT_PRECIS;
|
|
font.lfQuality = DEFAULT_QUALITY;
|
|
font.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
|
|
strcpy(font.lfFaceName, "SIL Yi");
|
|
|
|
hFont = CreateFontIndirect(&font);
|
|
}
|
|
|
|
|
|
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(msg)
|
|
{
|
|
case WM_DESTROY:
|
|
Keyman_StopForcingKeyboard();
|
|
Keyman_Exit();
|
|
DeleteObject(hFont);
|
|
|
|
PostQuitMessage(0);
|
|
return 0;
|
|
|
|
case WM_CREATE:
|
|
if(!Keyman_Initialise(hwnd, TRUE)) return -1;
|
|
return 0;
|
|
|
|
case WM_SHOWWINDOW:
|
|
PostMessage(hwnd, WM_USER+100, 0, 0);
|
|
break;
|
|
|
|
case WM_USER+100:
|
|
|
|
if(!Keyman_ForceKeyboard(prm)) DestroyWindow(hwnd);
|
|
CreateFont();
|
|
return 0;
|
|
|
|
case WM_KEYDOWN:
|
|
if(wParam == VK_ESCAPE)
|
|
*buf = 0;
|
|
else break;
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
return 0;
|
|
case WM_CHAR:
|
|
if(*buf != 0 && wParam == 8)
|
|
{
|
|
WCHAR *p = wcschr(buf, 0) - 1;
|
|
*p = 0;
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
}
|
|
else if(wcslen(buf) < MAXBUF-1)
|
|
{
|
|
WCHAR *p = wcschr(buf, 0);
|
|
*p++ = wParam;
|
|
*p = 0;
|
|
InvalidateRect(hwnd, NULL, TRUE);
|
|
}
|
|
else MessageBeep(0);
|
|
return 0;
|
|
case WM_PAINT:
|
|
{
|
|
RECT rect;
|
|
PAINTSTRUCT ps;
|
|
HFONT hOldFont;
|
|
HDC hDC = BeginPaint(hwnd, &ps);
|
|
hOldFont = (HFONT) SelectObject(hDC, hFont);
|
|
GetClientRect(hwnd, &rect);
|
|
rect.left++; rect.top++; rect.right--; rect.bottom--;
|
|
DrawTextW(hDC, buf, wcslen(buf), &rect, DT_WORDBREAK);
|
|
SelectObject(hDC, hOldFont);
|
|
EndPaint(hwnd, &ps);
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
return DefWindowProc(hwnd, msg, wParam, lParam);
|
|
}
|
|
|
|
|
|
typedef BOOL (WINAPI *Keyman_ForceKeyboardProc)(PSTR s);
|
|
typedef BOOL (WINAPI *Keyman_StopForcingKeyboardProc)();
|
|
typedef BOOL (WINAPI *Keyman_InitialiseProc)(HWND hwnd, BOOL FSingleApp);
|
|
typedef BOOL (WINAPI *Keyman_ExitProc)();
|
|
|
|
BOOL FLoad = FALSE, FInitKeyman = FALSE;
|
|
char FKeyman32Path[260] = "";
|
|
|
|
BOOL Keyman_Initialise(HWND hwnd, BOOL FSingleApp)
|
|
{
|
|
HINSTANCE hkeyman;
|
|
Keyman_InitialiseProc ki;
|
|
|
|
FLoad = FALSE;
|
|
|
|
hkeyman = GetModuleHandle("keyman32.dll");
|
|
if(!hkeyman)
|
|
{
|
|
hkeyman = LoadLibrary("c:\\keyman\\5.0\\bin\\dist\\keyman32.dll");
|
|
if(!hkeyman) return FALSE;
|
|
FLoad = TRUE;
|
|
}
|
|
|
|
ki = (Keyman_InitialiseProc) GetProcAddress(hkeyman, "Keyman_Initialise");
|
|
if(!ki) return FALSE;
|
|
if(!(*ki)(hwnd, FSingleApp))
|
|
{
|
|
if(FLoad) FreeLibrary(hkeyman);
|
|
return FALSE;
|
|
}
|
|
|
|
FInitKeyman = TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL Keyman_Exit()
|
|
{
|
|
HINSTANCE hkeyman;
|
|
Keyman_ExitProc ke;
|
|
|
|
if(!FInitKeyman) return TRUE;
|
|
hkeyman = GetModuleHandle("keyman32.dll");
|
|
if(!hkeyman) return FALSE;
|
|
|
|
ke = (Keyman_ExitProc) GetProcAddress(hkeyman, "Keyman_Exit");
|
|
if(!ke) return FALSE;
|
|
if(!(*ke)()) return FALSE;
|
|
if(FLoad) FreeLibrary(hkeyman);
|
|
FInitKeyman = FALSE;
|
|
FLoad = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL Keyman_ForceKeyboard(PSTR s)
|
|
{
|
|
HINSTANCE hkeyman;
|
|
Keyman_ForceKeyboardProc fk;
|
|
|
|
hkeyman = GetModuleHandle("keyman32.dll");
|
|
if(!hkeyman) return FALSE;
|
|
|
|
fk = (Keyman_ForceKeyboardProc) GetProcAddress(hkeyman, "Keyman_ForceKeyboard");
|
|
if(!fk) return FALSE;
|
|
|
|
return (*fk)(s);
|
|
}
|
|
|
|
BOOL Keyman_StopForcingKeyboard()
|
|
{
|
|
HINSTANCE hkeyman;
|
|
Keyman_StopForcingKeyboardProc sfk;
|
|
|
|
hkeyman = GetModuleHandle("keyman32.dll");
|
|
if(!hkeyman) return FALSE;
|
|
|
|
sfk = (Keyman_StopForcingKeyboardProc) GetProcAddress(hkeyman, "Keyman_StopForcingKeyboard");
|
|
if(!sfk) return FALSE;
|
|
return (*sfk)();
|
|
}
|