Migrated the Windows backend to the new bin.

This commit is contained in:
Pietro Gagliardi 2015-05-10 12:48:11 -04:00
parent a2cf4908a3
commit 24d63adb51
6 changed files with 26 additions and 30 deletions

6
bin.c
View File

@ -1,5 +1,6 @@
// 27 april 2015 // 27 april 2015
#include "uipriv_windows.h" #include "ui.h"
#include "uipriv.h"
struct bin { struct bin {
uiBin b; uiBin b;
@ -14,7 +15,6 @@ struct bin {
static void binDestroy(uiControl *c) static void binDestroy(uiControl *c)
{ {
struct bin *b = (struct bin *) c; struct bin *b = (struct bin *) c;
HWND hwnd;
// ensure clean removal by making sure the bin has no OS parent // ensure clean removal by making sure the bin has no OS parent
if (uiBinHasOSParent(uiBin(b))) if (uiBinHasOSParent(uiBin(b)))
@ -127,7 +127,7 @@ uiBin *newBin(void)
uiBin(b)->HasOSParent = binHasOSParent; uiBin(b)->HasOSParent = binHasOSParent;
uiBin(b)->SetOSParent = binSetOSParent; uiBin(b)->SetOSParent = binSetOSParent;
uiBin(b)->RemoveOSParent = binRemoveOSParent; uiBin(b)->RemoveOSParent = binRemoveOSParent;
uiBin(b)->ResizeRoot = binResizeRoot; uiBin(b)->ResizeRootAndUpdate = binResizeRootAndUpdate;
uiBin(b)->TranslateMargins = binTranslateMargins; uiBin(b)->TranslateMargins = binTranslateMargins;
return uiBin(b); return uiBin(b);

2
ui.idl
View File

@ -66,7 +66,7 @@ interface Bin from Container {
func HasOSParent(void) int; func HasOSParent(void) int;
func SetOSParent(parent uintptr_t); func SetOSParent(parent uintptr_t);
func RemoveOSParent(void); func RemoveOSParent(void);
func ResizeRoot(x intmax_t, y intmax_t, width intmax_t, height intmax_t); func ResizeRootAndUpdate(x intmax_t, y intmax_t, width intmax_t, height intmax_t);
func TranslateMargins(left *intmax_t, top *intmax_t, right *intmax_t, bottom *intmax_t, d *Sizing); func TranslateMargins(left *intmax_t, top *intmax_t, right *intmax_t, bottom *intmax_t, d *Sizing);
}; };

View File

@ -14,7 +14,7 @@ extern uiBin *newBin(void);
extern int binHasOSParent(uiBin *); extern int binHasOSParent(uiBin *);
extern void binSetOSParent(uiBin *, uintptr_t); extern void binSetOSParent(uiBin *, uintptr_t);
extern void binRemoveOSParent(uiBin *); extern void binRemoveOSParent(uiBin *);
extern void binResizeRoot(uiBin *, intmax_t, intmax_t, intmax_t, intmax_t); extern void binResizeRootAndUpdate(uiBin *, intmax_t, intmax_t, intmax_t, intmax_t);
extern void binTranslateMargins(uiBin *, intmax_t *, intmax_t *, intmax_t *, intmax_t *, uiSizing *); extern void binTranslateMargins(uiBin *, intmax_t *, intmax_t *, intmax_t *, intmax_t *, uiSizing *);
// array.c // array.c

View File

@ -24,7 +24,7 @@ void binRemoveOSParent(uiBin *b)
binSetOSParent(b, (uintptr_t) initialParent); binSetOSParent(b, (uintptr_t) initialParent);
} }
void binResizeRoot(uiBin *b, intmax_t x, intmax_t y, intmax_t width, intmax_t height) void binResizeRootAndUpdate(uiBin *b, intmax_t x, intmax_t y, intmax_t width, intmax_t height)
{ {
HWND hwnd; HWND hwnd;

View File

@ -11,7 +11,7 @@ struct tab {
}; };
struct tabPage { struct tabPage {
uiContainer *bin; uiBin *bin;
int margined; int margined;
}; };
@ -61,7 +61,7 @@ static void onDestroy(void *data)
while (t->pages->len != 0) { while (t->pages->len != 0) {
p = ptrArrayIndex(t->pages, struct tabPage *, 0); p = ptrArrayIndex(t->pages, struct tabPage *, 0);
// we do have to remove the page from the tab control, though // we do have to remove the page from the tab control, though
binSetParent(p->bin, 0); uiBinRemoveOSParent(p->bin);
uiControlDestroy(uiControl(p->bin)); uiControlDestroy(uiControl(p->bin));
ptrArrayDelete(t->pages, 0); ptrArrayDelete(t->pages, 0);
uiFree(p); uiFree(p);
@ -153,8 +153,7 @@ static void resizeTab(struct tab *t, LONG width, LONG height)
{ {
LRESULT n; LRESULT n;
RECT r; RECT r;
struct tabPage *p; struct tabPage *page;
HWND binHWND;
n = SendMessageW(t->hwnd, TCM_GETCURSEL, 0, 0); n = SendMessageW(t->hwnd, TCM_GETCURSEL, 0, 0);
if (n == (LRESULT) (-1)) // no child selected; do nothing if (n == (LRESULT) (-1)) // no child selected; do nothing
@ -169,9 +168,8 @@ static void resizeTab(struct tab *t, LONG width, LONG height)
// convert to the display rectangle // convert to the display rectangle
SendMessageW(t->hwnd, TCM_ADJUSTRECT, FALSE, (LPARAM) (&r)); SendMessageW(t->hwnd, TCM_ADJUSTRECT, FALSE, (LPARAM) (&r));
p = ptrArrayIndex(t->pages, struct tabPage *, n); page = ptrArrayIndex(t->pages, struct tabPage *, n);
binHWND = (HWND) uiControlHandle(uiControl(p->bin)); uiBinResizeRootAndUpdate(page->bin, r.left, r.top, r.right - r.left, r.bottom - r.top);
moveWindow(binHWND, r.left, r.top, r.right - r.left, r.bottom - r.top);
} }
// and finally, because we have to resize parents, we have to handle resizes and updates // and finally, because we have to resize parents, we have to handle resizes and updates
@ -232,8 +230,8 @@ static void tabAppendPage(uiTab *tt, const char *name, uiControl *child)
n = SendMessageW(t->hwnd, TCM_GETITEMCOUNT, 0, 0); n = SendMessageW(t->hwnd, TCM_GETITEMCOUNT, 0, 0);
page->bin = newBin(); page->bin = newBin();
binSetMainControl(page->bin, child); uiBinSetMainControl(page->bin, child);
binSetParent(page->bin, (uintptr_t) (t->hwnd)); uiBinSetOSParent(page->bin, (uintptr_t) (t->hwnd));
if (n != 0) // if this isn't the first page, we have to hide the other controls if (n != 0) // if this isn't the first page, we have to hide the other controls
uiControlHide(uiControl(page->bin)); uiControlHide(uiControl(page->bin));
@ -264,8 +262,8 @@ static void tabInsertPageBefore(uiTab *tt, const char *name, uintmax_t n, uiCont
page = uiNew(struct tabPage); page = uiNew(struct tabPage);
page->bin = newBin(); page->bin = newBin();
binSetMainControl(page->bin, child); uiBinSetMainControl(page->bin, child);
binSetParent(page->bin, (uintptr_t) (t->hwnd)); uiBinSetOSParent(page->bin, (uintptr_t) (t->hwnd));
// always hide; the current tab doesn't change // always hide; the current tab doesn't change
uiControlHide(uiControl(page->bin)); uiControlHide(uiControl(page->bin));
@ -295,10 +293,10 @@ static void tabDeletePage(uiTab *tt, uintmax_t n)
ptrArrayDelete(t->pages, n); ptrArrayDelete(t->pages, n);
// make sure the page's control isn't destroyed // make sure the page's control isn't destroyed
binSetMainControl(page->bin, NULL); uiBinSetMainControl(page->bin, NULL);
// see tabDestroy() above for details // see tabDestroy() above for details
binSetParent(page->bin, 0); uiBinRemoveOSParent(page->bin);
uiControlDestroy(uiControl(page->bin)); uiControlDestroy(uiControl(page->bin));
uiFree(page); uiFree(page);
} }
@ -330,9 +328,9 @@ static void tabSetMargined(uiTab *tt, uintmax_t n, int margined)
page = ptrArrayIndex(t->pages, struct tabPage *, n); page = ptrArrayIndex(t->pages, struct tabPage *, n);
page->margined = margined; page->margined = margined;
if (page->margined) if (page->margined)
binSetMargins(page->bin, tabMargin, tabMargin, tabMargin, tabMargin); uiBinSetMargins(page->bin, tabMargin, tabMargin, tabMargin, tabMargin);
else else
binSetMargins(page->bin, 0, 0, 0, 0); uiBinSetMargins(page->bin, 0, 0, 0, 0);
} }
uiTab *uiNewTab(void) uiTab *uiNewTab(void)

View File

@ -7,7 +7,7 @@ struct window {
uiWindow w; uiWindow w;
HWND hwnd; HWND hwnd;
HMENU menubar; HMENU menubar;
uiContainer *bin; uiBin *bin;
int hidden; int hidden;
BOOL shownOnce; BOOL shownOnce;
int (*onClosing)(uiWindow *, void *); int (*onClosing)(uiWindow *, void *);
@ -21,7 +21,6 @@ static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam; CREATESTRUCTW *cs = (CREATESTRUCTW *) lParam;
WINDOWPOS *wp = (WINDOWPOS *) lParam; WINDOWPOS *wp = (WINDOWPOS *) lParam;
RECT r; RECT r;
HWND binhwnd;
w = (struct window *) GetWindowLongPtrW(hwnd, GWLP_USERDATA); w = (struct window *) GetWindowLongPtrW(hwnd, GWLP_USERDATA);
if (w == NULL) { if (w == NULL) {
@ -46,8 +45,7 @@ static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
case msgUpdateChild: case msgUpdateChild:
if (GetClientRect(w->hwnd, &r) == 0) if (GetClientRect(w->hwnd, &r) == 0)
logLastError("error getting window client rect for resize in windowWndProc()"); logLastError("error getting window client rect for resize in windowWndProc()");
binhwnd = (HWND) uiControlHandle(uiControl(w->bin)); uiBinResizeRootAndUpdate(w->bin, r.left, r.top, r.right - r.left, r.bottom - r.top);
moveWindow(binhwnd, r.left, r.top, r.right - r.left, r.bottom - r.top);
return 0; return 0;
case WM_CLOSE: case WM_CLOSE:
if ((*(w->onClosing))(uiWindow(w), w->onClosingData)) if ((*(w->onClosing))(uiWindow(w), w->onClosingData))
@ -90,7 +88,7 @@ static void windowDestroy(uiControl *c)
ShowWindow(w->hwnd, SW_HIDE); ShowWindow(w->hwnd, SW_HIDE);
// now destroy the bin // now destroy the bin
// we need to remove the OS parent first // we need to remove the OS parent first
binSetParent(w->bin, 0); uiBinRemoveOSParent(w->bin);
uiControlDestroy(uiControl(w->bin)); uiControlDestroy(uiControl(w->bin));
// now free the menubar, if any // now free the menubar, if any
if (w->menubar != NULL) if (w->menubar != NULL)
@ -207,7 +205,7 @@ static void windowSetChild(uiWindow *ww, uiControl *child)
{ {
struct window *w = (struct window *) ww; struct window *w = (struct window *) ww;
binSetMainControl(w->bin, child); uiBinSetMainControl(w->bin, child);
} }
static int windowMargined(uiWindow *ww) static int windowMargined(uiWindow *ww)
@ -226,9 +224,9 @@ static void windowSetMargined(uiWindow *ww, int margined)
w->margined = margined; w->margined = margined;
if (w->margined) if (w->margined)
binSetMargins(w->bin, windowMargin, windowMargin, windowMargin, windowMargin); uiBinSetMargins(w->bin, windowMargin, windowMargin, windowMargin, windowMargin);
else else
binSetMargins(w->bin, 0, 0, 0, 0); uiBinSetMargins(w->bin, 0, 0, 0, 0);
} }
// see http://blogs.msdn.com/b/oldnewthing/archive/2003/09/11/54885.aspx and http://blogs.msdn.com/b/oldnewthing/archive/2003/09/13/54917.aspx // see http://blogs.msdn.com/b/oldnewthing/archive/2003/09/11/54885.aspx and http://blogs.msdn.com/b/oldnewthing/archive/2003/09/13/54917.aspx
@ -284,7 +282,7 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
uiFree(wtitle); uiFree(wtitle);
w->bin = newBin(); w->bin = newBin();
binSetParent(w->bin, (uintptr_t) (w->hwnd)); uiBinSetOSParent(w->bin, (uintptr_t) (w->hwnd));
if (hasMenubar) { if (hasMenubar) {
w->menubar = makeMenubar(); w->menubar = makeMenubar();