File JUCE8-revert-2727a2b1.patch of Package JUCE8_10
diff --git a/modules/juce_gui_extra/native/juce_XEmbedComponent_linux.cpp b/modules/juce_gui_extra/native/juce_XEmbedComponent_linux.cpp
index 47a8d14b..d656407a 100644
--- a/modules/juce_gui_extra/native/juce_XEmbedComponent_linux.cpp
+++ b/modules/juce_gui_extra/native/juce_XEmbedComponent_linux.cpp
@@ -288,76 +288,15 @@ public:
private:
//==============================================================================
- class ComponentIsShowingListener : private ComponentMovementWatcher
- {
- public:
- ComponentIsShowingListener (Component& componentIn, std::function<void()> callbackIn)
- : ComponentMovementWatcher (&componentIn),
- callback (std::move (callbackIn))
- {}
-
- private:
- void componentMovedOrResized (bool, bool) override {}
- void componentPeerChanged() override {}
- void componentVisibilityChanged() override { NullCheckedInvocation::invoke (callback); }
-
- using ComponentMovementWatcher::componentMovedOrResized;
- using ComponentMovementWatcher::componentVisibilityChanged;
-
- std::function<void()> callback;
- };
-
- class WindowMapper
- {
- public:
- WindowMapper (Pimpl& pimplIn, Window& windowIn)
- : pimpl (pimplIn),
- window (windowIn)
- {}
-
- void update()
- {
- if (window == 0)
- return;
-
- const auto shouldBeMapped = pimpl.getXEmbedMappedFlag()
- && pimpl.owner.isShowing()
- && pimpl.lastPeer != nullptr;
-
- if (std::exchange (mapped, shouldBeMapped) != shouldBeMapped)
- {
- if (shouldBeMapped)
- X11Symbols::getInstance()->xMapWindow (pimpl.getDisplay(), window);
- else
- X11Symbols::getInstance()->xUnmapWindow (pimpl.getDisplay(), window);
- }
- }
-
- void unmap()
- {
- if (window == 0)
- return;
-
- X11Symbols::getInstance()->xUnmapWindow (pimpl.getDisplay(), window);
- mapped = false;
- }
-
- private:
- Pimpl& pimpl;
- Window& window;
- bool mapped = false;
- };
-
XEmbedComponent& owner;
- ComponentIsShowingListener isShowingListener { owner, [this] { updateMapping(); } };
Window client = 0, host = 0;
- WindowMapper clientMapper { *this, client }, hostMapper { *this, host };
Atom infoAtom, messageTypeAtom;
bool clientInitiated;
bool wantsFocus = false;
bool allowResize = false;
bool supportsXembed = false;
+ bool hasBeenMapped = false;
int xembedVersion = maxXEmbedVersionToSupport;
ComponentPeer* lastPeer = nullptr;
@@ -430,8 +369,11 @@ private:
int defaultScreen = X11Symbols::getInstance()->xDefaultScreen (dpy);
Window root = X11Symbols::getInstance()->xRootWindow (dpy, defaultScreen);
- hostMapper.unmap();
- clientMapper.unmap();
+ if (hasBeenMapped)
+ {
+ X11Symbols::getInstance()->xUnmapWindow (dpy, client);
+ hasBeenMapped = false;
+ }
X11Symbols::getInstance()->xReparentWindow (dpy, client, root, 0, 0);
client = 0;
@@ -442,8 +384,20 @@ private:
void updateMapping()
{
- hostMapper.update();
- clientMapper.update();
+ if (client != 0)
+ {
+ const bool shouldBeMapped = getXEmbedMappedFlag();
+
+ if (shouldBeMapped != hasBeenMapped)
+ {
+ hasBeenMapped = shouldBeMapped;
+
+ if (shouldBeMapped)
+ X11Symbols::getInstance()->xMapWindow (getDisplay(), client);
+ else
+ X11Symbols::getInstance()->xUnmapWindow (getDisplay(), client);
+ }
+ }
}
Window getParentX11Window()
@@ -545,7 +499,7 @@ private:
Rectangle<int> newBounds = getX11BoundsFromJuce();
if (newPeer == nullptr)
- hostMapper.unmap();
+ X11Symbols::getInstance()->xUnmapWindow (dpy, host);
Window newParent = (newPeer != nullptr ? getParentX11Window() : rootWindow);
X11Symbols::getInstance()->xReparentWindow (dpy, host, newParent, newBounds.getX(), newBounds.getY());
@@ -561,7 +515,7 @@ private:
}
componentMovedOrResized (owner, true, true);
- updateMapping();
+ X11Symbols::getInstance()->xMapWindow (dpy, host);
broughtToFront();
}