diff --git a/redo/windows/container.c b/redo/windows/container.c index 57e4765c..9869d756 100644 --- a/redo/windows/container.c +++ b/redo/windows/container.c @@ -57,7 +57,7 @@ void uninitContainer(void) logLastError("error unregistering container window class in uninitContainer()"); } -HWND makeContainer(void) +HWND newContainer(void) { return uiWindowsEnsureCreateControlHWND(WS_EX_CONTROLPARENT, containerClass, L"", diff --git a/redo/windows/control.c b/redo/windows/control.c index dd2a9acd..5ec6f074 100644 --- a/redo/windows/control.c +++ b/redo/windows/control.c @@ -1,6 +1,24 @@ // 16 august 2015 #include "uipriv_windows.h" +HWND uiWindowsEnsureCreateControlHWND(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, HINSTANCE hInstance, LPVOID lpParam, BOOL useStandardControlFont) +{ + HWND hwnd; + + hwnd = CreateWindowExW(dwExStyle, + lpClassName, lpWindowName, + dwStyle | WS_CHILD | WS_VISIBLE, + 0, 0, + // use a nonzero initial size just in case some control breaks with a zero initial size + 100, 100, + utilWindow, NULL, hInstance, lpParam); + if (hwnd == NULL) + logLastError("error creating window in uiWindowsUtilCreateControlHWND()"); + if (useStandardControlFont) + SendMessageW(hwnd, WM_SETFONT, (WPARAM) hMessageFont, (LPARAM) TRUE); + return hwnd; +} + static uintmax_t type_uiWindowsControl = 0; uintmax_t uiWindowsControlType(void) @@ -35,3 +53,24 @@ void uiWindowsFinishControl(uiControl *c) c->CommitShow = defaultCommitShow; c->CommitHide = defaultCommitHide; } + +char *uiWindowsUtilText(HWND hwnd) +{ + WCHAR *wtext; + char *text; + + wtext = windowText(hwnd); + text = toUTF8(wtext); + uiFree(wtext); + return text; +} + +void uiWindowsUtilSetText(HWND hwnd, const char *text) +{ + WCHAR *wtext; + + wtext = toUTF16(text); + if (SetWindowTextW(hwnd, wtext) == 0) + logLastError("error setting control text in uiWindowsControlSetText()"); + uiFree(wtext); +} diff --git a/redo/windows/radiobuttons.c b/redo/windows/radiobuttons.c index f502f962..2f3a2a8d 100644 --- a/redo/windows/radiobuttons.c +++ b/redo/windows/radiobuttons.c @@ -50,7 +50,7 @@ static void onDestroy(uiRadioButtons *r) hwnd = ptrArrayIndex(r->hwnds, HWND, 0); ptrArrayDelete(r->hwnds, 0); uiWindowsUnregisterWM_COMMANDHandler(hwnd); - uiWindowsUtilDestroy(hwnd); + uiWindowsEnsureDestroyWindow(hwnd); } ptrArrayDestroy(r->hwnds); } diff --git a/redo/windows/resize.c b/redo/windows/resize.c index 7366ac7e..95d54f87 100644 --- a/redo/windows/resize.c +++ b/redo/windows/resize.c @@ -15,18 +15,18 @@ void uninitResizes(void) ptrArrayDestroy(resizes); } -void queueResize(uiControl *c) +void uiWindowsControlQueueRelayout(uiWindowsControl *c) { uintmax_t i; - uiControl *d; + uiWindowsControl *d; // resizing a control requires us to reocmpute the sizes of everything in the top-level window - c = toplevelOwning(c); + c = uiWindowsControl(toplevelOwning(uiControl(c))); if (c == NULL) return; // make sure we're only queued once for (i = 0 ; i < resizes->len; i++) { - d = ptrArrayIndex(resizes, uiControl *, i); + d = ptrArrayIndex(resizes, uiWindowsControl *, i); if (c == d) return; } @@ -53,7 +53,7 @@ void doResizes(void) } } -void moveWindow(HWND hwnd, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiWindowsSizing *d) +void uiWindowsEnsureMoveWindow(HWND hwnd, intmax_t x, intmax_t y, intmax_t width, intmax_t height) { RECT r; diff --git a/redo/windows/util.c b/redo/windows/util.c index eb5a0e30..51b0603d 100644 --- a/redo/windows/util.c +++ b/redo/windows/util.c @@ -80,3 +80,15 @@ void setExStyle(HWND hwnd, DWORD exstyle) { SetWindowLongPtrW(hwnd, GWL_EXSTYLE, (LONG_PTR) exstyle); } + +void uiWindowsEnsureDestroyWindow(HWND hwnd) +{ + if (DestroyWindow(hwnd) == 0) + logLastError("error destroying window in uiWindowsEnsureDestroyWindow"); +} + +void uiWindowsEnsureSetParent(HWND hwnd, HWND parent) +{ + if (SetParent(hwnd, parent) == 0) + logLastError("error setting window parent in uiWindowsEnsureSetParent"); +}