More uiWindows cleanup.
This commit is contained in:
parent
6d796b5642
commit
edd70b9fa5
|
@ -0,0 +1,86 @@
|
||||||
|
struct uiWindow {
|
||||||
|
// BOOL hasMenubar;
|
||||||
|
void (*onPositionChanged)(uiWindow *, void *);
|
||||||
|
void *onPositionChangedData;
|
||||||
|
BOOL changingPosition; // to avoid triggering the above when programmatically doing this
|
||||||
|
// void (*onContentSizeChanged)(uiWindow *, void *);
|
||||||
|
};
|
||||||
|
|
||||||
|
static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
if ((wp->flags & SWP_NOMOVE) == 0)
|
||||||
|
if (!w->changingPosition)
|
||||||
|
(*(w->onPositionChanged))(w, w->onPositionChangedData);
|
||||||
|
// and continue anyway
|
||||||
|
// if ((wp->flags & SWP_NOSIZE) != 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// static int defaultOnClosing(uiWindow *w, void *data)
|
||||||
|
|
||||||
|
static void defaultOnPositionContentSizeChanged(uiWindow *w, void *data)
|
||||||
|
{
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
// static std::map<uiWindow *, bool> windows;
|
||||||
|
|
||||||
|
// void uiWindowSetTitle(uiWindow *w, const char *title)
|
||||||
|
|
||||||
|
void uiWindowPosition(uiWindow *w, int *x, int *y)
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
|
||||||
|
uiWindowsEnsureGetWindowRect(w->hwnd, &r);
|
||||||
|
*x = r.left;
|
||||||
|
*y = r.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiWindowSetPosition(uiWindow *w, int x, int y)
|
||||||
|
{
|
||||||
|
w->changingPosition = TRUE;
|
||||||
|
if (SetWindowPos(w->hwnd, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER) == 0)
|
||||||
|
logLastError(L"error moving window");
|
||||||
|
w->changingPosition = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// static void windowMonitorRect(HWND hwnd, RECT *r)
|
||||||
|
|
||||||
|
// TODO use the work rect instead?
|
||||||
|
void uiWindowCenter(uiWindow *w)
|
||||||
|
{
|
||||||
|
RECT wr, mr;
|
||||||
|
int x, y;
|
||||||
|
LONG wwid, mwid;
|
||||||
|
LONG wht, mht;
|
||||||
|
|
||||||
|
uiWindowsEnsureGetWindowRect(w->hwnd, &wr);
|
||||||
|
windowMonitorRect(w->hwnd, &mr);
|
||||||
|
wwid = wr.right - wr.left;
|
||||||
|
mwid = mr.right - mr.left;
|
||||||
|
x = (mwid - wwid) / 2;
|
||||||
|
wht = wr.bottom - wr.top;
|
||||||
|
mht = mr.bottom - mr.top;
|
||||||
|
y = (mht - wht) / 2;
|
||||||
|
// y is now evenly divided, however https://msdn.microsoft.com/en-us/library/windows/desktop/dn742502(v=vs.85).aspx says that 45% should go above and 55% should go below
|
||||||
|
// so just move 5% of the way up
|
||||||
|
// TODO should this be on the work area?
|
||||||
|
// TODO is this calculation correct?
|
||||||
|
y -= y / 20;
|
||||||
|
uiWindowSetPosition(w, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiWindowOnPositionChanged(uiWindow *w, void (*f)(uiWindow *, void *), void *data)
|
||||||
|
{
|
||||||
|
w->onPositionChanged = f;
|
||||||
|
w->onPositionChangedData = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// void uiWindowContentSize(uiWindow *w, int *width, int *height)
|
||||||
|
|
||||||
|
uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
|
||||||
|
{
|
||||||
|
// uiWindowOnClosing(w, defaultOnClosing, NULL);
|
||||||
|
uiWindowOnPositionChanged(w, defaultOnPositionContentSizeChanged, NULL);
|
||||||
|
// uiWindowOnContentSizeChanged(w, defaultOnPositionContentSizeChanged, NULL);
|
||||||
|
}
|
|
@ -14,9 +14,6 @@ struct uiWindow {
|
||||||
void *onClosingData;
|
void *onClosingData;
|
||||||
int margined;
|
int margined;
|
||||||
BOOL hasMenubar;
|
BOOL hasMenubar;
|
||||||
void (*onPositionChanged)(uiWindow *, void *);
|
|
||||||
void *onPositionChangedData;
|
|
||||||
BOOL changingPosition; // to avoid triggering the above when programmatically doing this
|
|
||||||
void (*onContentSizeChanged)(uiWindow *, void *);
|
void (*onContentSizeChanged)(uiWindow *, void *);
|
||||||
void *onContentSizeChangedData;
|
void *onContentSizeChangedData;
|
||||||
BOOL changingSize;
|
BOOL changingSize;
|
||||||
|
@ -95,10 +92,6 @@ static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA
|
||||||
runMenuEvent(LOWORD(wParam), uiWindow(w));
|
runMenuEvent(LOWORD(wParam), uiWindow(w));
|
||||||
return 0;
|
return 0;
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
if ((wp->flags & SWP_NOMOVE) == 0)
|
|
||||||
if (!w->changingPosition)
|
|
||||||
(*(w->onPositionChanged))(w, w->onPositionChangedData);
|
|
||||||
// and continue anyway
|
|
||||||
if ((wp->flags & SWP_NOSIZE) != 0)
|
if ((wp->flags & SWP_NOSIZE) != 0)
|
||||||
break;
|
break;
|
||||||
if (w->onContentSizeChanged != NULL) // TODO figure out why this is happening too early
|
if (w->onContentSizeChanged != NULL) // TODO figure out why this is happening too early
|
||||||
|
@ -296,23 +289,6 @@ void uiWindowSetTitle(uiWindow *w, const char *title)
|
||||||
// don't queue resize; the caption isn't part of what affects layout and sizing of the client area (it'll be ellipsized if too long)
|
// don't queue resize; the caption isn't part of what affects layout and sizing of the client area (it'll be ellipsized if too long)
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiWindowPosition(uiWindow *w, int *x, int *y)
|
|
||||||
{
|
|
||||||
RECT r;
|
|
||||||
|
|
||||||
uiWindowsEnsureGetWindowRect(w->hwnd, &r);
|
|
||||||
*x = r.left;
|
|
||||||
*y = r.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
void uiWindowSetPosition(uiWindow *w, int x, int y)
|
|
||||||
{
|
|
||||||
w->changingPosition = TRUE;
|
|
||||||
if (SetWindowPos(w->hwnd, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER) == 0)
|
|
||||||
logLastError(L"error moving window");
|
|
||||||
w->changingPosition = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is used for both fullscreening and centering
|
// this is used for both fullscreening and centering
|
||||||
// see also https://blogs.msdn.microsoft.com/oldnewthing/20100412-00/?p=14353 and https://blogs.msdn.microsoft.com/oldnewthing/20050505-04/?p=35703
|
// see also https://blogs.msdn.microsoft.com/oldnewthing/20100412-00/?p=14353 and https://blogs.msdn.microsoft.com/oldnewthing/20050505-04/?p=35703
|
||||||
static void windowMonitorRect(HWND hwnd, RECT *r)
|
static void windowMonitorRect(HWND hwnd, RECT *r)
|
||||||
|
@ -335,36 +311,6 @@ static void windowMonitorRect(HWND hwnd, RECT *r)
|
||||||
*r = mi.rcMonitor;
|
*r = mi.rcMonitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO use the work rect instead?
|
|
||||||
void uiWindowCenter(uiWindow *w)
|
|
||||||
{
|
|
||||||
RECT wr, mr;
|
|
||||||
int x, y;
|
|
||||||
LONG wwid, mwid;
|
|
||||||
LONG wht, mht;
|
|
||||||
|
|
||||||
uiWindowsEnsureGetWindowRect(w->hwnd, &wr);
|
|
||||||
windowMonitorRect(w->hwnd, &mr);
|
|
||||||
wwid = wr.right - wr.left;
|
|
||||||
mwid = mr.right - mr.left;
|
|
||||||
x = (mwid - wwid) / 2;
|
|
||||||
wht = wr.bottom - wr.top;
|
|
||||||
mht = mr.bottom - mr.top;
|
|
||||||
y = (mht - wht) / 2;
|
|
||||||
// y is now evenly divided, however https://msdn.microsoft.com/en-us/library/windows/desktop/dn742502(v=vs.85).aspx says that 45% should go above and 55% should go below
|
|
||||||
// so just move 5% of the way up
|
|
||||||
// TODO should this be on the work area?
|
|
||||||
// TODO is this calculation correct?
|
|
||||||
y -= y / 20;
|
|
||||||
uiWindowSetPosition(w, x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
void uiWindowOnPositionChanged(uiWindow *w, void (*f)(uiWindow *, void *), void *data)
|
|
||||||
{
|
|
||||||
w->onPositionChanged = f;
|
|
||||||
w->onPositionChangedData = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void uiWindowContentSize(uiWindow *w, int *width, int *height)
|
void uiWindowContentSize(uiWindow *w, int *width, int *height)
|
||||||
{
|
{
|
||||||
RECT r;
|
RECT r;
|
||||||
|
@ -541,7 +487,6 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar)
|
||||||
setClientSize(w, width, height, hasMenubarBOOL, style, exstyle);
|
setClientSize(w, width, height, hasMenubarBOOL, style, exstyle);
|
||||||
|
|
||||||
uiWindowOnClosing(w, defaultOnClosing, NULL);
|
uiWindowOnClosing(w, defaultOnClosing, NULL);
|
||||||
uiWindowOnPositionChanged(w, defaultOnPositionContentSizeChanged, NULL);
|
|
||||||
uiWindowOnContentSizeChanged(w, defaultOnPositionContentSizeChanged, NULL);
|
uiWindowOnContentSizeChanged(w, defaultOnPositionContentSizeChanged, NULL);
|
||||||
|
|
||||||
windows[w] = true;
|
windows[w] = true;
|
||||||
|
|
Loading…
Reference in New Issue