Browse Source

Fix Window for some resize oddities in pugl

gh-pages
falkTX 10 years ago
parent
commit
4fb91f3205
2 changed files with 32 additions and 22 deletions
  1. +28
    -17
      dgl/src/Window.cpp
  2. +4
    -5
      distrho/src/DistrhoUIInternal.hpp

+ 28
- 17
dgl/src/Window.cpp View File

@@ -67,6 +67,9 @@ struct Window::PrivateData {
fVisible(false), fVisible(false),
fResizable(true), fResizable(true),
fUsingEmbed(false), fUsingEmbed(false),
fWidth(1),
fHeight(1),
fModal(),
#if defined(DISTRHO_OS_WINDOWS) #if defined(DISTRHO_OS_WINDOWS)
hwnd(0), hwnd(0),
#elif defined(DISTRHO_OS_LINUX) #elif defined(DISTRHO_OS_LINUX)
@@ -90,6 +93,8 @@ struct Window::PrivateData {
fVisible(false), fVisible(false),
fResizable(true), fResizable(true),
fUsingEmbed(false), fUsingEmbed(false),
fWidth(1),
fHeight(1),
fModal(parent.pData), fModal(parent.pData),
#if defined(DISTRHO_OS_WINDOWS) #if defined(DISTRHO_OS_WINDOWS)
hwnd(0), hwnd(0),
@@ -120,6 +125,9 @@ struct Window::PrivateData {
fVisible(parentId != 0), fVisible(parentId != 0),
fResizable(parentId == 0), fResizable(parentId == 0),
fUsingEmbed(parentId != 0), fUsingEmbed(parentId != 0),
fWidth(1),
fHeight(1),
fModal(),
#if defined(DISTRHO_OS_WINDOWS) #if defined(DISTRHO_OS_WINDOWS)
hwnd(0), hwnd(0),
#elif defined(DISTRHO_OS_LINUX) #elif defined(DISTRHO_OS_LINUX)
@@ -161,6 +169,7 @@ struct Window::PrivateData {
} }


puglInitResizable(fView, fResizable); puglInitResizable(fView, fResizable);
puglInitWindowSize(fView, fWidth, fHeight);


puglSetHandle(fView, this); puglSetHandle(fView, this);
puglSetDisplayFunc(fView, onDisplayCallback); puglSetDisplayFunc(fView, onDisplayCallback);
@@ -358,7 +367,7 @@ struct Window::PrivateData {
fVisible = yesNo; fVisible = yesNo;


if (yesNo && fFirstInit) if (yesNo && fFirstInit)
setSize(static_cast<uint>(fView->width), static_cast<uint>(fView->height), true);
setSize(fWidth, fHeight, true);


#if defined(DISTRHO_OS_WINDOWS) #if defined(DISTRHO_OS_WINDOWS)
if (yesNo) if (yesNo)
@@ -412,7 +421,7 @@ struct Window::PrivateData {


fResizable = yesNo; fResizable = yesNo;


setSize(static_cast<uint>(fView->width), static_cast<uint>(fView->height), true);
setSize(fWidth, fHeight, true);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -425,14 +434,14 @@ struct Window::PrivateData {
return; return;
} }


if (fView->width == static_cast<int>(width) && fView->height == static_cast<int>(height) && ! forced)
if (fWidth == width && fHeight == height && ! forced)
{ {
DBGp("Window setSize matches current size, ignoring request (%i %i)\n", width, height); DBGp("Window setSize matches current size, ignoring request (%i %i)\n", width, height);
return; return;
} }


fView->width = static_cast<int>(width);
fView->height = static_cast<int>(height);
fWidth = width;
fHeight = height;


DBGp("Window setSize called %s, size %i %i\n", forced ? "(forced)" : "(not forced)", width, height); DBGp("Window setSize called %s, size %i %i\n", forced ? "(forced)" : "(not forced)", width, height);


@@ -580,15 +589,15 @@ struct Window::PrivateData {
// reset color // reset color
glColor4f(1.0f, 1.0f, 1.0f, 1.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f);


if (widget->fNeedsFullViewport || (widget->fAbsolutePos.isZero() && widget->fSize == Size<uint>(fView->width, fView->height)))
if (widget->fNeedsFullViewport || (widget->fAbsolutePos.isZero() && widget->fSize == Size<uint>(fWidth, fHeight)))
{ {
// full viewport size // full viewport size
glViewport(0, 0, fView->width, fView->height);
glViewport(0, 0, fWidth, fHeight);
} }
else if (! widget->fNeedsScaling) else if (! widget->fNeedsScaling)
{ {
// only set viewport pos // only set viewport pos
glViewport(widget->getAbsoluteX(), /*fView->height - widget->getHeight()*/ - widget->getAbsoluteY(), fView->width, fView->height);
glViewport(widget->getAbsoluteX(), /*fView->height - widget->getHeight()*/ - widget->getAbsoluteY(), fWidth, fHeight);


// then cut the outer bounds // then cut the outer bounds
glScissor(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight()); glScissor(widget->getAbsoluteX(), fView->height - widget->getHeight() - widget->getAbsoluteY(), widget->getWidth(), widget->getHeight());
@@ -732,6 +741,12 @@ struct Window::PrivateData {
{ {
DBGp("PUGL: onReshape : %i %i\n", width, height); DBGp("PUGL: onReshape : %i %i\n", width, height);


if (width == 1 && height == 1)
return;

fWidth = width;
fHeight = height;

fSelf->onReshape(width, height); fSelf->onReshape(width, height);


FOR_EACH_WIDGET(it) FOR_EACH_WIDGET(it)
@@ -768,6 +783,8 @@ struct Window::PrivateData {
bool fVisible; bool fVisible;
bool fResizable; bool fResizable;
bool fUsingEmbed; bool fUsingEmbed;
uint fWidth;
uint fHeight;
std::list<Widget*> fWidgets; std::list<Widget*> fWidgets;


struct Modal { struct Modal {
@@ -921,23 +938,17 @@ void Window::setResizable(bool yesNo)


uint Window::getWidth() const noexcept uint Window::getWidth() const noexcept
{ {
DISTRHO_SAFE_ASSERT_RETURN(pData->fView->width >= 0, 0);

return pData->fView->width;
return pData->fWidth;
} }


uint Window::getHeight() const noexcept uint Window::getHeight() const noexcept
{ {
DISTRHO_SAFE_ASSERT_RETURN(pData->fView->height >= 0, 0);

return pData->fView->height;
return pData->fHeight;
} }


Size<uint> Window::getSize() const noexcept Size<uint> Window::getSize() const noexcept
{ {
DISTRHO_SAFE_ASSERT_RETURN(pData->fView->width >= 0 && pData->fView->height >= 0, Size<uint>(0, 0));

return Size<uint>(pData->fView->width, pData->fView->height);
return Size<uint>(pData->fWidth, pData->fHeight);
} }


void Window::setSize(uint width, uint height) void Window::setSize(uint width, uint height)


+ 4
- 5
distrho/src/DistrhoUIInternal.hpp View File

@@ -298,6 +298,8 @@ public:
{ {
if (glWindow.isReady()) if (glWindow.isReady())
fUI->d_uiIdle(); fUI->d_uiIdle();

fChangingSize = false;
} }


bool idle() bool idle()
@@ -309,6 +311,8 @@ public:
if (glWindow.isReady()) if (glWindow.isReady())
fUI->d_uiIdle(); fUI->d_uiIdle();


fChangingSize = false;

return ! glApp.isQuiting(); return ! glApp.isQuiting();
} }


@@ -333,11 +337,6 @@ public:
fUI->setSize(width, height); fUI->setSize(width, height);


glWindow.setSize(width, height); glWindow.setSize(width, height);
glWindow.onReshape(width, height); // FIXME

glApp.idle();

fChangingSize = false;
} }


void setWindowTitle(const char* const uiTitle) void setWindowTitle(const char* const uiTitle)


Loading…
Cancel
Save