summaryrefslogtreecommitdiff
path: root/redo/uitask_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'redo/uitask_windows.c')
-rw-r--r--redo/uitask_windows.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/redo/uitask_windows.c b/redo/uitask_windows.c
new file mode 100644
index 0000000..9177e19
--- /dev/null
+++ b/redo/uitask_windows.c
@@ -0,0 +1,78 @@
+/* 17 july 2014 */
+
+#include "winapi_windows.h"
+#include "_cgo_export.h"
+
+void uimsgloop(void)
+{
+ MSG msg;
+ int res;
+
+ for (;;) {
+ SetLastError(0);
+ res = GetMessage(&msg, NULL, 0, 0);
+ if (res < 0)
+ xpanic("error calling GetMessage()", GetLastError());
+ if (res == 0) /* WM_QUIT */
+ break;
+ /* TODO IsDialogMessage() */
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+void issue(void *request)
+{
+ SetLastError(0);
+ if (PostMessage(msgwin, msgRequested, 0, (LPARAM) request) == 0)
+ xpanic("error issuing request", GetLastError());
+}
+
+HWND msgwin;
+
+#define msgwinclass L"gouimsgwin"
+
+static LRESULT CALLBACK msgwinproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg) {
+ case WM_COMMAND:
+ return forwardCommand(hwnd, uMsg, wParam, lParam);
+ case msgRequested:
+ xperform((void *) lParam);
+ return 0;
+ default:
+ return DefWindowProc(hwnd, uMsg, wParam, lParam);
+ }
+ xmissedmsg("message-only", "msgwinproc()", uMsg);
+ return 0; /* unreachable */
+}
+
+DWORD makemsgwin(char **errmsg)
+{
+ WNDCLASS wc;
+ HWND hwnd;
+
+ ZeroMemory(&wc, sizeof (WNDCLASS));
+ wc.lpfnWndProc = msgwinproc;
+ wc.hInstance = hInstance;
+ wc.hIcon = hDefaultIcon;
+ wc.hCursor = hArrowCursor;
+ wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
+ wc.lpszClassName = msgwinclass;
+ if (RegisterClass(&wc) == 0) {
+ *errmsg = "error registering message-only window classs";
+ return GetLastError();
+ }
+ msgwin = CreateWindowEx(
+ 0,
+ msgwinclass, L"package ui message-only window",
+ 0,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ HWND_MESSAGE, NULL, hInstance, NULL);
+ if (msgwin == NULL) {
+ *errmsg = "error creating message-only window";
+ return GetLastError();
+ }
+ return 0;
+}