diff options
| author | Pietro Gagliardi <[email protected]> | 2015-04-06 17:41:33 -0400 |
|---|---|---|
| committer | Pietro Gagliardi <[email protected]> | 2015-04-06 17:41:33 -0400 |
| commit | 9001ca34f73ad861c049f367e2ef8477d19e7432 (patch) | |
| tree | 464ee1262b8a8f7d11fcd6c35ae7c9d1226fae17 /new/init_windows.c | |
| parent | d1be6e3ce158384b62ffab3bb439683a2018099d (diff) | |
Implemented what we have so far, but on Windows.
Diffstat (limited to 'new/init_windows.c')
| -rw-r--r-- | new/init_windows.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/new/init_windows.c b/new/init_windows.c new file mode 100644 index 0000000..07031aa --- /dev/null +++ b/new/init_windows.c @@ -0,0 +1,87 @@ +// 6 april 2015 +#include "ui_windows.h" + +HINSTANCE hInstance; +int nCmdShow; + +HFONT hMessageFont; + +struct uiInitError { + char *msg; + char failbuf[256]; +}; + +static void loadLastError(uiInitError *err, char *message) +{ + DWORD le; + + le = GetLastError(); + // TODO FormatMessageW() it + _snprintf_s(err->failbuf, 256, _TRUNCATE, "error %s (last error %I32u)", message, le); + err->msg = err->failbuf; +} + +uiInitError *uiInit(uiInitOptions *o) +{ + uiInitError *err; + STARTUPINFOW si; + HICON hDefaultIcon; + HCURSOR hDefaultCursor; + NONCLIENTMETRICSW ncm; + + err = (uiInitError *) uiAlloc(sizeof (uiInitError)); + + hInstance = GetModuleHandle(NULL); + if (hInstance == NULL) { + loadLastError(err, "getting program HINSTANCE"); + return err; + } + + nCmdShow = SW_SHOWDEFAULT; + GetStartupInfoW(&si); + if ((si.dwFlags & STARTF_USESHOWWINDOW) != 0) + nCmdShow = si.wShowWindow; + + hDefaultIcon = LoadIconW(NULL, IDI_APPLICATION); + if (hDefaultIcon == NULL) { + loadLastError(err, "loading default icon for window classes"); + return err; + } + hDefaultCursor = LoadCursorW(NULL, IDC_ARROW); + if (hDefaultCursor == NULL) { + loadLastError(err, "loading default cursor for window classes"); + return err; + } + + if (registerWindowClass(hDefaultIcon, hDefaultCursor) == 0) { + loadLastError(err, "registering uiWindow window class"); + return err; + } + + ZeroMemory(&ncm, sizeof (NONCLIENTMETRICSW)); + ncm.cbSize = sizeof (NONCLIENTMETRICSW); + if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof (NONCLIENTMETRICSW), &ncm, sizeof (NONCLIENTMETRICSW)) == 0) { + loadLastError(err, "getting default fonts"); + return err; + } + hMessageFont = CreateFontIndirectW(&(ncm.lfMessageFont)); + if (hMessageFont == NULL) { + loadLastError(err, "loading default messagebox font; this is the default UI font"); + return err; + } + + uiFree(err); + return NULL; +} + +const char *uiInitErrorMessage(uiInitError *err) +{ + return err->msg; +} + +void uiInitErrorFree(uiInitError *err) +{ + if (err->msg != err->failbuf) + uiFree(err->msg); + uiFree(err); +} |
