From cba301abbc9af3b3a8d005c5e716349cdf877cc1 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Thu, 9 Apr 2015 17:46:26 -0400 Subject: [PATCH] More Windows conversion. Not done yet. --- new/button_windows.c | 38 +++++++++++++++++------------------- new/checkbox_windows.c | 43 +++++++++++++++++++---------------------- new/container_windows.c | 10 ++++++---- new/entry_windows.c | 30 ++++++++++++++-------------- 4 files changed, 58 insertions(+), 63 deletions(-) diff --git a/new/button_windows.c b/new/button_windows.c index 4a7620c..099fa6b 100644 --- a/new/button_windows.c +++ b/new/button_windows.c @@ -2,30 +2,29 @@ #include "uipriv_windows.h" struct button { - uiControl *c; void (*onClicked)(uiControl *, void *); void *onClickedData; }; -#define B(x) ((struct button *) (x)) - -static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, LRESULT *lResult) +static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, LRESULT *lResult) { + struct button *b = (struct button *) (c->data); + if (HIWORD(wParam) != BN_CLICKED) return FALSE; - (*(B(data)->onClicked))(c, B(data)->onClickedData); + (*(b->onClicked))(c, b->onClickedData); *lResult = 0; return TRUE; } -static BOOL onWM_NOTIFY(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, LRESULT *lResult) +static BOOL onWM_NOTIFY(uiControl *c, WPARAM wParam, LPARAM lParam, LRESULT *lResult) { return FALSE; } -static void onWM_DESTROY(uiControl *c, void *data) +static void onWM_DESTROY(uiControl *c) { - struct button *b = (struct button *) data; + struct button *b = (struct button *) (c->data); uiFree(b); } @@ -33,7 +32,7 @@ static void onWM_DESTROY(uiControl *c, void *data) // from http://msdn.microsoft.com/en-us/library/windows/desktop/dn742486.aspx#sizingandspacing #define buttonHeight 14 -static void preferredSize(uiControl *c, int baseX, int baseY, LONG internalLeading, intmax_t *width, intmax_t *height) +static void preferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height) { HWND hwnd; SIZE size; @@ -53,7 +52,7 @@ static void preferredSize(uiControl *c, int baseX, int baseY, LONG internalLeadi // Microsoft says to use a fixed width for all buttons; this isn't good enough // use the text width instead, with some edge padding *width = uiWindowsWindowTextWidth(hwnd) + (2 * GetSystemMetrics(SM_CXEDGE)); - *height = uiDlgUnitToY(buttonHeight, baseY); + *height = uiDlgUnitToY(buttonHeight, d->sys->baseY); } static void defaultOnClicked(uiControl *c, void *data) @@ -63,13 +62,12 @@ static void defaultOnClicked(uiControl *c, void *data) uiControl *uiNewButton(const char *text) { + uiControl *c; struct button *b; uiWindowsNewControlParams p; WCHAR *wtext; HWND hwnd; - b = uiNew(struct button); - p.dwExStyle = 0; p.lpClassName = L"button"; wtext = toUTF16(text); @@ -79,18 +77,19 @@ uiControl *uiNewButton(const char *text) p.onWM_COMMAND = onWM_COMMAND; p.onWM_NOTIFY = onWM_NOTIFY; p.onWM_DESTROY = onWM_DESTROY; - p.onCommandNotifyDestroyData = b; - p.preferredSize = preferredSize; - p.data = b; - b->c = uiWindowsNewControl(&p); + c = uiWindowsNewControl(&p); uiFree(wtext); - hwnd = (HWND) uiControlHandle(b->c); + c->preferredSize = preferredSize; + + hwnd = (HWND) uiControlHandle(c); SendMessageW(hwnd, WM_SETFONT, (WPARAM) hMessageFont, (LPARAM) TRUE); + b = uiNew(struct button); b->onClicked = defaultOnClicked; + c->data = b; - return b->c; + return c; } char *uiButtonText(uiControl *c) @@ -105,9 +104,8 @@ void uiButtonSetText(uiControl *c, const char *text) void uiButtonOnClicked(uiControl *c, void (*f)(uiControl *, void *), void *data) { - struct button *b; + struct button *b = (struct button *) (c->data); - b = (struct button *) uiWindowsControlData(c); b->onClicked = f; b->onClickedData = data; } diff --git a/new/checkbox_windows.c b/new/checkbox_windows.c index 8c04268..00981de 100644 --- a/new/checkbox_windows.c +++ b/new/checkbox_windows.c @@ -2,15 +2,13 @@ #include "uipriv_windows.h" struct checkbox { - uiControl *c; void (*onToggled)(uiControl *, void *); void *onToggledData; }; -#define C(x) ((struct checkbox *) (x)) - -static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, LRESULT *lResult) +static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, LRESULT *lResult) { + struct checkbox *cc = (struct checkbox *) (c->data); HWND hwnd; WPARAM check; @@ -24,19 +22,19 @@ static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, check = BST_UNCHECKED; SendMessage(hwnd, BM_SETCHECK, check, 0); - (*(C(data)->onToggled))(c, C(data)->onToggledData); + (*(cc->onToggled))(c, cc->onToggledData); *lResult = 0; return TRUE; } -static BOOL onWM_NOTIFY(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, LRESULT *lResult) +static BOOL onWM_NOTIFY(uiControl *c, WPARAM wParam, LPARAM lParam, LRESULT *lResult) { return FALSE; } -static void onWM_DESTROY(uiControl *c, void *data) +static void onWM_DESTROY(uiControl *c) { - struct checkbox *cc = (struct checkbox *) data; + struct checkbox *cc = (struct checkbox *) (c->data); uiFree(cc); } @@ -46,10 +44,10 @@ static void onWM_DESTROY(uiControl *c, void *data) // from http://msdn.microsoft.com/en-us/library/windows/desktop/bb226818%28v=vs.85%29.aspx #define checkboxXFromLeftOfBoxToLeftOfLabel 12 -static void preferredSize(uiControl *c, int baseX, int baseY, LONG internalLeading, intmax_t *width, intmax_t *height) +static void preferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height) { - *width = uiDlgUnitToX(checkboxXFromLeftOfBoxToLeftOfLabel, baseX) + uiWindowsWindowTextWidth((HWND) uiControlHandle(c)); - *height = uiDlgUnitToY(checkboxHeight, baseY); + *width = uiDlgUnitToX(checkboxXFromLeftOfBoxToLeftOfLabel, d->sys->baseX) + uiWindowsWindowTextWidth((HWND) uiControlHandle(c)); + *height = uiDlgUnitToY(checkboxHeight, d->sys->baseY); } static void defaultOnToggled(uiControl *c, void *data) @@ -59,13 +57,12 @@ static void defaultOnToggled(uiControl *c, void *data) uiControl *uiNewCheckbox(const char *text) { - struct checkbox *c; + uiControl *c; + struct checkbox *cc; uiWindowsNewControlParams p; WCHAR *wtext; HWND hwnd; - c = uiNew(struct checkbox); - p.dwExStyle = 0; p.lpClassName = L"button"; wtext = toUTF16(text); @@ -75,18 +72,19 @@ uiControl *uiNewCheckbox(const char *text) p.onWM_COMMAND = onWM_COMMAND; p.onWM_NOTIFY = onWM_NOTIFY; p.onWM_DESTROY = onWM_DESTROY; - p.onCommandNotifyDestroyData = c; - p.preferredSize = preferredSize; - p.data = c; - c->c = uiWindowsNewControl(&p); + c = uiWindowsNewControl(&p); uiFree(wtext); - hwnd = (HWND) uiControlHandle(c->c); + c->preferredSize = preferredSize; + + hwnd = (HWND) uiControlHandle(c); SendMessageW(hwnd, WM_SETFONT, (WPARAM) hMessageFont, (LPARAM) TRUE); - c->onToggled = defaultOnToggled; + cc = uiNew(struct checkbox); + cc->onToggled = defaultOnToggled; + c->data = cc; - return c->c; + return c; } char *uiCheckboxText(uiControl *c) @@ -101,9 +99,8 @@ void uiCheckboxSetText(uiControl *c, const char *text) void uiCheckboxOnToggled(uiControl *c, void (*f)(uiControl *, void *), void *data) { - struct checkbox *cc; + struct checkbox *cc = (struct checkbox *) (c->data); - cc = (struct checkbox *) uiWindowsControlData(c); cc->onToggled = f; cc->onToggledData = data; } diff --git a/new/container_windows.c b/new/container_windows.c index 8881c10..2f05711 100644 --- a/new/container_windows.c +++ b/new/container_windows.c @@ -62,6 +62,7 @@ BOOL sharedWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT * void resize(uiControl *control, HWND parent, RECT r, RECT margin) { uiSizing d; + uiSizingSys sys; HDC dc; HFONT prevfont; TEXTMETRICW tm; @@ -80,9 +81,9 @@ void resize(uiControl *control, HWND parent, RECT r, RECT margin) logLastError("error getting text metrics in resize()"); if (GetTextExtentPoint32W(dc, L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &size) == 0) logLastError("error getting text extent point in resize()"); - d.baseX = (int) ((size.cx / 26 + 1) / 2); - d.baseY = (int) tm.tmHeight; - d.internalLeading = tm.tmInternalLeading; + sys.baseX = (int) ((size.cx / 26 + 1) / 2); + sys.baseY = (int) tm.tmHeight; + sys.internalLeading = tm.tmInternalLeading; if (SelectObject(dc, prevfont) != hMessageFont) logLastError("error restoring previous font into device context in resize()"); if (ReleaseDC(parent, dc) == 0) @@ -93,7 +94,8 @@ void resize(uiControl *control, HWND parent, RECT r, RECT margin) r.bottom -= uiDlgUnitToY(margin.bottom, d.baseY); d.xPadding = uiDlgUnitToX(winXPadding, d.baseX); d.yPadding = uiDlgUnitToY(winYPadding, d.baseY); - (*(control->resize))(control, r.left, r.top, r.right - r.left, r.bottom - r.top, &d); + d.sys = &sys; + uiControlResize(control, r.left, r.top, r.right - r.left, r.bottom - r.top, &d); } void updateParent(uintptr_t h) diff --git a/new/entry_windows.c b/new/entry_windows.c index f147d5d..506df77 100644 --- a/new/entry_windows.c +++ b/new/entry_windows.c @@ -2,11 +2,8 @@ #include "uipriv_windows.h" struct entry { - uiControl *c; }; -#define E(x) ((struct entry *) (x)) - static BOOL onWM_COMMAND(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, LRESULT *lResult) { return FALSE; @@ -17,9 +14,9 @@ static BOOL onWM_NOTIFY(uiControl *c, WPARAM wParam, LPARAM lParam, void *data, return FALSE; } -static void onWM_DESTROY(uiControl *c, void *data) +static void onWM_DESTROY(uiControl *c) { - struct entry *e = (struct entry *) data; + struct entry *e = (struct entry *) (c->data); uiFree(e); } @@ -28,20 +25,19 @@ static void onWM_DESTROY(uiControl *c, void *data) #define entryWidth 107 /* this is actually the shorter progress bar width, but Microsoft only indicates as wide as necessary */ #define entryHeight 14 -static void preferredSize(uiControl *c, int baseX, int baseY, LONG internalLeading, intmax_t *width, intmax_t *height) +static void preferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height) { - *width = uiDlgUnitToX(entryWidth, baseX); - *height = uiDlgUnitToY(entryHeight, baseY); + *width = uiDlgUnitToX(entryWidth, d->sys->baseX); + *height = uiDlgUnitToY(entryHeight, d->sys->baseY); } uiControl *uiNewEntry(void) { + uiControl *c; struct entry *e; uiWindowsNewControlParams p; HWND hwnd; - e = uiNew(struct entry); - p.dwExStyle = WS_EX_CLIENTEDGE; p.lpClassName = L"edit"; p.lpWindowName = L""; @@ -51,15 +47,17 @@ uiControl *uiNewEntry(void) p.onWM_COMMAND = onWM_COMMAND; p.onWM_NOTIFY = onWM_NOTIFY; p.onWM_DESTROY = onWM_DESTROY; - p.onCommandNotifyDestroyData = e; - p.preferredSize = preferredSize; - p.data = e; - e->c = uiWindowsNewControl(&p); + c = uiWindowsNewControl(&p); - hwnd = (HWND) uiControlHandle(e->c); + c->preferredSize = preferredSize; + + hwnd = (HWND) uiControlHandle(c); SendMessageW(hwnd, WM_SETFONT, (WPARAM) hMessageFont, (LPARAM) TRUE); - return e->c; + e = uiNew(struct entry); + c->data = e; + + return c; } char *uiEntryText(uiControl *c)