spiegel-keyman/windows/src/support/kdebug/kdebug.cpp
Marc Durdin b65b982584 Keyman Desktop and Keyman Developer open source 10.0 alpha seed (#121)
* 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)
2017-07-25 10:53:06 +07:00

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)();
}