diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index 9cdbc6c910..f9517ae9c8 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -1,6 +1,28 @@ JUCE breaking changes ===================== +develop +======= + +Change +------ +XWindowSystemUtilities::XSettings now has a private constructor. + +Possible Issues +--------------- +User code that uses XSettings::XSettings() will fail to build. + +Workaround +---------- +Use the XSettings::createXSettings() factory function. + +Rationale +--------- +The XSETTINGS facility is not available on all Linux distributions and the old +constructor would fail on such systems, potentially crashing the application. +The factory function will return nullptr in such situations instead. + + Version 6.1.3 ============= diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp index 384005f9f5..3911d1d59b 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp @@ -179,15 +179,21 @@ XWindowSystemUtilities::GetXProperty::~GetXProperty() } //============================================================================== -XWindowSystemUtilities::XSettings::XSettings (::Display* d) - : display (d) +std::unique_ptr XWindowSystemUtilities::XSettings::createXSettings (::Display* d) { - settingsAtom = Atoms::getCreating (display, "_XSETTINGS_SETTINGS"); + const auto settingsAtom = Atoms::getCreating (d, "_XSETTINGS_SETTINGS"); + const auto settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (d, + Atoms::getCreating (d, "_XSETTINGS_S0")); - settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (display, - Atoms::getCreating (display, "_XSETTINGS_S0")); + if (settingsWindow == None) + return {}; - jassert (settingsWindow != None); + return rawToUniquePtr (new XWindowSystemUtilities::XSettings (d, settingsWindow, settingsAtom)); +} + +XWindowSystemUtilities::XSettings::XSettings (::Display* d, ::Window settingsWindowIn, Atom settingsAtomIn) + : display (d), settingsWindow (settingsWindowIn), settingsAtom (settingsAtomIn) +{ update(); } @@ -3030,11 +3036,12 @@ long XWindowSystem::getUserTime (::Window windowH) const void XWindowSystem::initialiseXSettings() { - xSettings = std::make_unique (display); + xSettings = XWindowSystemUtilities::XSettings::createXSettings (display); - X11Symbols::getInstance()->xSelectInput (display, - xSettings->getSettingsWindow(), - StructureNotifyMask | PropertyChangeMask); + if (xSettings != nullptr) + X11Symbols::getInstance()->xSelectInput (display, + xSettings->getSettingsWindow(), + StructureNotifyMask | PropertyChangeMask); } XWindowSystem::DisplayVisuals::DisplayVisuals (::Display* xDisplay) diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h index 9bc284a407..9369f8244a 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h @@ -130,7 +130,7 @@ namespace XWindowSystemUtilities class XSettings { public: - explicit XSettings (::Display*); + static std::unique_ptr createXSettings (::Display*); //============================================================================== void update(); @@ -158,6 +158,8 @@ namespace XWindowSystemUtilities std::unordered_map settings; ListenerList listeners; + XSettings (::Display*, Atom, ::Window); + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XSettings) };