1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Fixed presentation window leak and eliminated unnecessary position changes

This commit is contained in:
narzoul 2020-05-28 00:20:35 +02:00
parent bff7253ecd
commit d8bf209d7a
3 changed files with 33 additions and 14 deletions

View File

@ -69,6 +69,13 @@ namespace Gdi
OffsetRgn(m_region, x, y); OffsetRgn(m_region, x, y);
} }
HRGN Region::release()
{
HRGN rgn = m_region;
m_region = nullptr;
return rgn;
}
Region::operator HRGN() const Region::operator HRGN() const
{ {
return m_region; return m_region;

View File

@ -17,6 +17,7 @@ namespace Gdi
bool isEmpty() const; bool isEmpty() const;
void offset(int x, int y); void offset(int x, int y);
HRGN release();
operator HRGN() const; operator HRGN() const;

View File

@ -5,6 +5,7 @@
#include <D3dDdi/ScopedCriticalSection.h> #include <D3dDdi/ScopedCriticalSection.h>
#include <DDraw/RealPrimarySurface.h> #include <DDraw/RealPrimarySurface.h>
#include <Gdi/Gdi.h> #include <Gdi/Gdi.h>
#include <Gdi/Region.h>
#include <Gdi/Window.h> #include <Gdi/Window.h>
namespace namespace
@ -42,7 +43,7 @@ namespace
nullptr, nullptr,
WS_DISABLED | WS_POPUP, WS_DISABLED | WS_POPUP,
0, 0, 1, 1, 0, 0, 1, 1,
nullptr, origWindow,
nullptr, nullptr,
nullptr, nullptr,
nullptr); nullptr);
@ -81,8 +82,6 @@ namespace
HWND owner = reinterpret_cast<HWND>(lParam); HWND owner = reinterpret_cast<HWND>(lParam);
if (IsWindowVisible(owner) && !IsIconic(owner)) if (IsWindowVisible(owner) && !IsIconic(owner))
{ {
RECT wr = {};
GetWindowRect(owner, &wr);
DWORD flags = SWP_SHOWWINDOW | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOSENDCHANGING | SWP_NOREDRAW; DWORD flags = SWP_SHOWWINDOW | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOSENDCHANGING | SWP_NOREDRAW;
HWND insertAfter = HWND_TOP; HWND insertAfter = HWND_TOP;
@ -99,21 +98,33 @@ namespace
} }
} }
CALL_ORIG_FUNC(SetWindowPos)( RECT wr = {};
hwnd, insertAfter, wr.left, wr.top, wr.right - wr.left, wr.bottom - wr.top, flags); GetWindowRect(owner, &wr);
RECT wrPres = {};
HRGN rgn = CreateRectRgn(0, 0, 0, 0); GetWindowRect(hwnd, &wrPres);
if (ERROR != GetWindowRgn(owner, rgn)) if (!(flags & SWP_NOZORDER) || !EqualRect(&wr, &wrPres) || !IsWindowVisible(hwnd))
{ {
SetWindowRgn(hwnd, rgn, FALSE); CALL_ORIG_FUNC(SetWindowPos)(
hwnd, insertAfter, wr.left, wr.top, wr.right - wr.left, wr.bottom - wr.top, flags);
} }
else
Gdi::Region rgn;
int rgnResult = GetWindowRgn(owner, rgn);
Gdi::Region rgnPres;
int rgnPresResult = GetWindowRgn(hwnd, rgnPres);
if (rgnResult != rgnPresResult || !EqualRgn(rgn, rgnPres))
{ {
SetWindowRgn(hwnd, nullptr, FALSE); if (ERROR != rgnResult)
DeleteObject(rgn); {
SetWindowRgn(hwnd, rgn.release(), FALSE);
}
else
{
SetWindowRgn(hwnd, nullptr, FALSE);
}
} }
} }
else else if (IsWindowVisible(hwnd))
{ {
ShowWindow(hwnd, SW_HIDE); ShowWindow(hwnd, SW_HIDE);
} }
@ -227,7 +238,7 @@ namespace Gdi
{ {
if (m_presentationWindow) if (m_presentationWindow)
{ {
DestroyWindow(m_presentationWindow); SendNotifyMessage(m_presentationWindow, WM_DESTROYPRESENTATIONWINDOW, 0, 0);
} }
} }