1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

X11: Ignore ConfigureNotify events containing stale information

This commit is contained in:
reuk 2025-09-23 19:35:30 +01:00
parent 89d019b5da
commit 6648e13fa6
No known key found for this signature in database
3 changed files with 18 additions and 3 deletions

View file

@ -116,7 +116,7 @@ public:
// ConfigureNotify events, many of which has stale size information. By not calling
// XWindowSystem::setBounds we are not actualising these old, incorrect sizes.
if (! inConfigureNotifyHandler)
XWindowSystem::getInstance()->setBounds (windowH, physicalBounds, isNowFullScreen);
moveResizeSerial = jmax (moveResizeSerial, XWindowSystem::getInstance()->setBounds (windowH, physicalBounds, isNowFullScreen).value_or (0));
fullScreen = isNowFullScreen;
@ -429,6 +429,11 @@ public:
bool focused = false;
bool inConfigureNotifyHandler = false;
unsigned long getMoveResizeSerial() const
{
return moveResizeSerial;
}
private:
//==============================================================================
class LinuxRepaintManager
@ -605,6 +610,7 @@ private:
double currentScaleFactor = 1.0;
Array<Component*> glRepaintListeners;
ScopedWindowAssociation association;
unsigned long moveResizeSerial = 0;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LinuxComponentPeer)

View file

@ -1736,7 +1736,7 @@ void XWindowSystem::setVisible (::Window windowH, bool shouldBeVisible) const
X11Symbols::getInstance()->xUnmapWindow (display, windowH);
}
void XWindowSystem::setBounds (::Window windowH, Rectangle<int> newBounds, bool isFullScreen) const
std::optional<unsigned long> XWindowSystem::setBounds (::Window windowH, Rectangle<int> newBounds, bool isFullScreen) const
{
jassert (windowH != 0);
@ -1792,12 +1792,16 @@ void XWindowSystem::setBounds (::Window windowH, Rectangle<int> newBounds, bool
return {};
}();
const auto serial = X11Symbols::getInstance()->xNextRequest (display);
X11Symbols::getInstance()->xMoveResizeWindow (display, windowH,
newBounds.getX() - nativeWindowBorder.getLeft(),
newBounds.getY() - nativeWindowBorder.getTop(),
(unsigned int) newBounds.getWidth(),
(unsigned int) newBounds.getHeight());
return serial;
}
return std::nullopt;
}
void XWindowSystem::startHostManagedResize (::Window windowH,
@ -3780,6 +3784,11 @@ void XWindowSystem::dismissBlockingModals (LinuxComponentPeer* peer) const
void XWindowSystem::handleConfigureNotifyEvent (LinuxComponentPeer* peer, XConfigureEvent& confEvent) const
{
// If the incoming event serial is smaller than the serial of a move/resize request we sent previously,
// then we should ignore the incoming event because it will conflict with the pending request.
if (confEvent.serial < peer->getMoveResizeSerial())
return;
const ScopedValueSetter<bool> scope { peer->inConfigureNotifyHandler, true };
peer->updateWindowBounds();

View file

@ -187,7 +187,7 @@ public:
void setTitle (::Window, const String&) const;
void setIcon (::Window , const Image&) const;
void setVisible (::Window, bool shouldBeVisible) const;
void setBounds (::Window, Rectangle<int>, bool fullScreen) const;
[[nodiscard]] std::optional<unsigned long> setBounds (::Window, Rectangle<int>, bool fullScreen) const;
void updateConstraints (::Window) const;
ComponentPeer::OptionalBorderSize getBorderSize (::Window) const;