diff --git a/_abort/windowevents/windows_window.cpp b/_abort/windowevents/windows_window.cpp new file mode 100644 index 00000000..769c6db9 --- /dev/null +++ b/_abort/windowevents/windows_window.cpp @@ -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 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); +} diff --git a/windows/window.cpp b/windows/window.cpp index 760702ba..e0961c28 100644 --- a/windows/window.cpp +++ b/windows/window.cpp @@ -14,9 +14,6 @@ struct uiWindow { void *onClosingData; int margined; BOOL hasMenubar; - void (*onPositionChanged)(uiWindow *, void *); - void *onPositionChangedData; - BOOL changingPosition; // to avoid triggering the above when programmatically doing this void (*onContentSizeChanged)(uiWindow *, void *); void *onContentSizeChangedData; BOOL changingSize; @@ -95,10 +92,6 @@ static LRESULT CALLBACK windowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA runMenuEvent(LOWORD(wParam), uiWindow(w)); return 0; 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) break; 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) } -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 // 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) @@ -335,36 +311,6 @@ static void windowMonitorRect(HWND hwnd, RECT *r) *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) { RECT r; @@ -541,7 +487,6 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar) setClientSize(w, width, height, hasMenubarBOOL, style, exstyle); uiWindowOnClosing(w, defaultOnClosing, NULL); - uiWindowOnPositionChanged(w, defaultOnPositionContentSizeChanged, NULL); uiWindowOnContentSizeChanged(w, defaultOnPositionContentSizeChanged, NULL); windows[w] = true;