Make resized() lock platform-dependent

This commit is contained in:
Jack Andersen 2017-02-15 13:13:05 -10:00
parent 5982a3825d
commit f9ed2ba5b8
5 changed files with 14 additions and 9 deletions

View File

@ -24,12 +24,13 @@ struct DeferredWindowEvents : public IWindowCallback
bool m_hasResize = false;
SWindowRect m_latestResize;
void resized(const SWindowRect& rect)
void resized(const SWindowRect& rect, bool sync)
{
std::unique_lock<std::mutex> lk(m_mt);
m_latestResize = rect;
m_hasResize = true;
m_resizeCv.wait_for(lk, std::chrono::milliseconds(500));
if (sync)
m_resizeCv.wait_for(lk, std::chrono::milliseconds(500));
}
struct Command

View File

@ -173,7 +173,7 @@ struct ITextInputCallback
class IWindowCallback
{
public:
virtual void resized(const SWindowRect& rect)
virtual void resized(const SWindowRect& rect, bool sync)
{(void)rect;}
virtual void mouseDown(const SWindowCoord& coord, EMouseButton button, EModifierKey mods)
{(void)coord;(void)button;(void)mods;}

View File

@ -8,8 +8,7 @@
#include "boo/IWindow.hpp"
#include "boo/IGraphicsContext.hpp"
#include "boo/audiodev/IAudioVoiceEngine.hpp"
#include <LogVisor/LogVisor.hpp>
#include "logvisor/logvisor.hpp"
#if !__has_feature(objc_arc)
#error ARC Required
@ -1146,7 +1145,7 @@ static boo::ESpecialKey translateKeycode(short code)
boo::SWindowRect rect = {int(frame.origin.x), int(frame.origin.y),
int(frame.size.width), int(frame.size.height)};
if (resp->booContext->m_callback)
resp->booContext->m_callback->resized(rect);
resp->booContext->m_callback->resized(rect, true);
[super reshape];
}
@ -1224,7 +1223,7 @@ static boo::ESpecialKey translateKeycode(short code)
boo::MetalContext::Window& w = m_ctx->m_windows[m_window];
std::unique_lock<std::mutex> lk(w.m_resizeLock);
if (resp->booContext->m_callback)
resp->booContext->m_callback->resized(rect);
resp->booContext->m_callback->resized(rect, false);
w.m_size = CGSizeMake(rect.size[0], rect.size[1]);
w.m_needsResize = YES;
}

View File

@ -934,6 +934,7 @@ class WindowWin32 : public IWindow
IWindowCallback* m_callback = nullptr;
EMouseCursor m_cursor = EMouseCursor::None;
bool m_cursorWait = false;
bool m_openGL = false;
static HCURSOR GetWin32Cursor(EMouseCursor cur)
{
switch (cur)
@ -971,6 +972,7 @@ public:
{
m_gfxCtx.reset(new GraphicsContextWin32GL(IGraphicsContext::EGraphicsAPI::OpenGL3_3,
this, m_hwnd, b3dCtx, sampleCount));
m_openGL = true;
return;
}
#if BOO_HAS_VULKAN
@ -1289,7 +1291,7 @@ public:
return;
m_gfxCtx->m_3dCtx.resize(this, rect.size[0], rect.size[1]);
if (m_callback)
m_callback->resized(rect);
m_callback->resized(rect, m_openGL);
return;
}
case WM_MOVING:

View File

@ -911,6 +911,8 @@ class WindowXlib : public IWindow
return X_CURSORS.m_pointer;
}
bool m_openGL = false;
public:
WindowXlib(const std::string& title,
Display* display, void* xcbConn,
@ -936,6 +938,7 @@ public:
i = 0;
m_gfxCtx.reset(new GraphicsContextXlibGLX(IGraphicsContext::EGraphicsAPI::OpenGL3_3,
this, display, defaultScreen, lastCtx, m_visualId, drawSamples));
m_openGL = true;
}
/* Default screen */
@ -1601,7 +1604,7 @@ public:
{
XUnlockDisplay(m_xDisp);
m_gfxCtx->resized(m_wrect);
m_callback->resized(m_wrect);
m_callback->resized(m_wrect, m_openGL);
XLockDisplay(m_xDisp);
}
return;