diff options
Diffstat (limited to 'redo/area_windows.c')
| -rw-r--r-- | redo/area_windows.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/redo/area_windows.c b/redo/area_windows.c index 7e49bff..8985c04 100644 --- a/redo/area_windows.c +++ b/redo/area_windows.c @@ -438,3 +438,37 @@ HWND newArea(void *data) xpanic("container creation failed", GetLastError()); return hwnd; } + +static LRESULT CALLBACK areaTextFieldSubProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR id, DWORD_PTR data) +{ + switch (uMsg) { + case WM_KILLFOCUS: + ShowWindow(hwnd, SW_HIDE); + return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); + case WM_NCDESTROY: + if ((*fv_RemoveWindowSubclass)(hwnd, areaTextFieldSubProc, id) == FALSE) + xpanic("error removing Area TextField subclass (which was for handling WM_KILLFOCUS)", GetLastError()); + return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); + default: + return (*fv_DefSubclassProc)(hwnd, uMsg, wParam, lParam); + } + xmissedmsg("Area TextField", "areaTextFieldSubProc()", uMsg); + return 0; // unreached +} + +HWND newAreaTextField(HWND area) +{ + HWND tf; + + tf = CreateWindowExW(textfieldExtStyle | WS_EX_TOOLWINDOW, + L"edit", L"", + textfieldStyle | WS_POPUP, + 0, 0, 0, 0, + area, // owner window + NULL, hInstance, NULL); + if (tf == NULL) + xpanic("error making Area TextField", GetLastError()); + if ((*fv_SetWindowSubclass)(tf, areaTextFieldSubProc, 0, (DWORD_PTR) NULL) == FALSE) + xpanic("error subclassing Area TextField to give it its own WM_KILLFOCUS handler", GetLastError()); + return tf; +} |
