summaryrefslogtreecommitdiff
path: root/new/newcontrol_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'new/newcontrol_windows.c')
-rw-r--r--new/newcontrol_windows.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/new/newcontrol_windows.c b/new/newcontrol_windows.c
new file mode 100644
index 0000000..0a46c0a
--- /dev/null
+++ b/new/newcontrol_windows.c
@@ -0,0 +1,71 @@
+// 6 april 2015
+#include "uipriv_windows.h"
+
+typedef struct uiSingleHWNDControl uiSingleHWNDControl;
+
+struct uiSingleHWNDControl {
+ uiControl control;
+ HWND hwnd;
+ BOOL (*onWM_COMMAND)(uiControl *, WPARAM, LPARAM, void *, LRESULT *);
+ BOOL (*onWM_NOTIFY)(uiControl *, WPARAM, LPARAM, void *, LRESULT *);
+ void *onCommandNotifyData;
+};
+
+#define S(c) ((uiSingleHWNDControl *) (c))
+
+static uintptr_t singleHandle(uiControl *c)
+{
+ return (uintptr_t) (S(c)->hwnd);
+}
+
+void singleSetParent(uiControl *c, uintptr_t parentHWND)
+{
+ if (SetParent(S(c)->hwnd, (HWND) parentHWND) == NULL)
+ logLastError("error changing control parent in singleSetParent()");
+}
+
+// TODO preferred size
+
+static void singleResize(uiControl *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d)
+{
+ if (MoveWindow(S(c)->hwnd, x, y, width, height, TRUE) == 0)
+ logLastError("error moving control in singleResize()");
+}
+
+static void singleContainerShow(uiControl *c)
+{
+ ShowWindow(S(c)->hwnd, SW_SHOW);
+}
+
+static void singleContainerHide(uiControl *c)
+{
+ ShowWindow(S(c)->hwnd, SW_HIDE);
+}
+
+uiControl *uiWindowsNewControl(uiWindowsNewControlParams *p)
+{
+ uiSingleHWNDControl *c;
+
+ c = uiNew(uiSingleHWNDControl);
+ c->hwnd = CreateWindowExW(p->dwExStyle,
+ p->lpClassName, L"",
+ p->dwStyle | WS_CHILD | WS_VISIBLE,
+ 0, 0,
+ 100, 100,
+ // TODO specify control IDs properly
+ initialParent, NULL, p->hInstance, NULL);
+ if (c->hwnd == NULL)
+ logLastError("error creating control in newSingleHWNDControl()");
+
+ c->control.handle = singleHandle;
+ c->control.setParent = singleSetParent;
+ c->control.resize = singleResize;
+ c->control.containerShow = singleContainerShow;
+ c->control.containerHide = singleContainerHide;
+
+ c->onWM_COMMAND = p->onWM_COMMAND;
+ c->onWM_NOTIFY = p->onWM_NOTIFY;
+ c->onCommandNotifyData = p->onCommandNotifyData;
+
+ return (uiControl *) c;
+}