summaryrefslogtreecommitdiff
path: root/new/windows/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'new/windows/init.c')
-rw-r--r--new/windows/init.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/new/windows/init.c b/new/windows/init.c
new file mode 100644
index 0000000..9903934
--- /dev/null
+++ b/new/windows/init.c
@@ -0,0 +1,112 @@
+// 6 april 2015
+#include "uipriv_windows.h"
+
+HINSTANCE hInstance;
+int nCmdShow;
+
+HFONT hMessageFont;
+
+HBRUSH hollowBrush;
+
+struct uiInitError {
+ char *msg;
+ char failbuf[256];
+};
+
+#define initErrorFormat L"error %s: %s%sGetLastError() == %I32u%s"
+#define initErrorArgs wmessage, sysmsg, beforele, le, afterle
+
+static const char *loadLastError(const char *message)
+{
+ WCHAR *sysmsg;
+ BOOL hassysmsg;
+ WCHAR *beforele;
+ WCHAR *afterle;
+ int n;
+ WCHAR *wmessage;
+ WCHAR *wstr;
+ const char *str;
+ DWORD le;
+
+ le = GetLastError();
+ if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, le, 0, (LPWSTR) (&sysmsg), 0, NULL) != 0) {
+ hassysmsg = TRUE;
+ beforele = L" (";
+ afterle = L")";
+ } else {
+ hassysmsg = FALSE;
+ sysmsg = L"";
+ beforele = L"";
+ afterle = L"";
+ }
+ wmessage = toUTF16(message);
+ n = _scwprintf(initErrorFormat, initErrorArgs);
+ wstr = (WCHAR *) uiAlloc((n + 1) * sizeof (WCHAR), "WCHAR[]");
+ snwprintf(wstr, n + 1, initErrorFormat, initErrorArgs);
+ str = toUTF8(wstr);
+ uiFree(wstr);
+ if (hassysmsg)
+ if (LocalFree(sysmsg) != NULL)
+ logLastError("error freeing system message in loadLastError()");
+ uiFree(wmessage);
+ return str;
+}
+
+uiInitOptions options;
+
+const char *uiInit(uiInitOptions *o)
+{
+ STARTUPINFOW si;
+ const char *ce;
+ HICON hDefaultIcon;
+ HCURSOR hDefaultCursor;
+ NONCLIENTMETRICSW ncm;
+
+ options = *o;
+
+ hInstance = GetModuleHandle(NULL);
+ if (hInstance == NULL)
+ return loadLastError("getting program HINSTANCE");
+
+ nCmdShow = SW_SHOWDEFAULT;
+ GetStartupInfoW(&si);
+ if ((si.dwFlags & STARTF_USESHOWWINDOW) != 0)
+ nCmdShow = si.wShowWindow;
+
+ ce = initCommonControls();
+ if (ce != NULL)
+ return loadLastError(ce);
+
+ hDefaultIcon = LoadIconW(NULL, IDI_APPLICATION);
+ if (hDefaultIcon == NULL)
+ return loadLastError("loading default icon for window classes");
+ hDefaultCursor = LoadCursorW(NULL, IDC_ARROW);
+ if (hDefaultCursor == NULL)
+ return loadLastError("loading default cursor for window classes");
+
+ if (registerWindowClass(hDefaultIcon, hDefaultCursor) == 0)
+ return loadLastError("registering uiWindow window class");
+
+ ZeroMemory(&ncm, sizeof (NONCLIENTMETRICSW));
+ ncm.cbSize = sizeof (NONCLIENTMETRICSW);
+ if (SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof (NONCLIENTMETRICSW), &ncm, sizeof (NONCLIENTMETRICSW)) == 0)
+ return loadLastError("getting default fonts");
+ hMessageFont = CreateFontIndirectW(&(ncm.lfMessageFont));
+ if (hMessageFont == NULL)
+ return loadLastError("loading default messagebox font; this is the default UI font");
+
+ ce = initParent(hDefaultIcon, hDefaultCursor);
+ if (ce != NULL)
+ return loadLastError(ce);
+
+ hollowBrush = (HBRUSH) GetStockObject(HOLLOW_BRUSH);
+ if (hollowBrush == NULL)
+ return loadLastError("getting hollow brush");
+
+ return NULL;
+}
+
+void uiFreeInitError(const char *err)
+{
+ uiFree((void *) err);
+}