summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wendler <polynomial-c@gentoo.org>2018-06-02 14:54:08 +0200
committerLars Wendler <polynomial-c@gentoo.org>2018-06-02 14:54:33 +0200
commit987bac35e9eb0edf61387f4e42c1cb41f2df64e7 (patch)
treec64456153c2ca8c6695a654fb575c670a020879f /x11-themes/qtcurve
parentsys-kernel/linux-firmware: Remove old (diff)
downloadgentoo-987bac35e9eb0edf61387f4e42c1cb41f2df64e7.tar.gz
gentoo-987bac35e9eb0edf61387f4e42c1cb41f2df64e7.tar.bz2
gentoo-987bac35e9eb0edf61387f4e42c1cb41f2df64e7.zip
x11-themes/qtcurve: Revbump to add a fix against a rare crash/hang.
Thanks-to: Andreas Sturmlechner <asturm@gentoo.org> Package-Manager: Portage-2.3.40, Repoman-2.3.9
Diffstat (limited to 'x11-themes/qtcurve')
-rw-r--r--x11-themes/qtcurve/files/qtcurve-1.9.0-rare_crash_hang_fix.patch238
-rw-r--r--x11-themes/qtcurve/qtcurve-1.9.0_rc1-r2.ebuild94
2 files changed, 332 insertions, 0 deletions
diff --git a/x11-themes/qtcurve/files/qtcurve-1.9.0-rare_crash_hang_fix.patch b/x11-themes/qtcurve/files/qtcurve-1.9.0-rare_crash_hang_fix.patch
new file mode 100644
index 000000000000..921001f44544
--- /dev/null
+++ b/x11-themes/qtcurve/files/qtcurve-1.9.0-rare_crash_hang_fix.patch
@@ -0,0 +1,238 @@
+From b7da5ec7e2965332e3922dfb03a3d100aa203b94 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ren=C3=A9=20J=2EV=2E=20Bertin?= <rjvbertin@gmail.com>
+Date: Fri, 8 Dec 2017 10:10:47 +0100
+Subject: address a rare crash/hang on exit
+
+Under rare circumstances Qt would attempt to deliver signals to stale
+style instances, or leave orphaned style instances after unloading the
+plugin. This is addressed by disconnecting the (currently only) signal
+originating from an external application and the plugin now ensures it
+leaves no orphaned style instances behind.
+Also, moves the code handling pre-exit disconnection to a subclass.
+
+Differential Revision: https://phabricator.kde.org/D9229
+---
+ qt5/style/qtcurve.cpp | 72 ++++++++++++++++++++++++++++++++------------
+ qt5/style/qtcurve.h | 5 +--
+ qt5/style/qtcurve_plugin.cpp | 15 ++++++---
+ 3 files changed, 67 insertions(+), 25 deletions(-)
+
+diff --git a/qt5/style/qtcurve.cpp b/qt5/style/qtcurve.cpp
+index 1bf6e1d..07eca0f 100644
+--- a/qt5/style/qtcurve.cpp
++++ b/qt5/style/qtcurve.cpp
+@@ -101,6 +101,26 @@
+
+ namespace QtCurve {
+
++class Style::DBusHelper {
++public:
++ DBusHelper()
++ : m_dBus(0)
++ , m_dbusConnected(false)
++ {}
++ ~DBusHelper()
++ {
++ if (m_dBus) {
++ m_dBus->disconnect();
++ m_dBus->deleteLater();
++ m_dBus = 0;
++ }
++ }
++
++ std::once_flag m_aboutToQuitInit;
++ QDBusInterface *m_dBus;
++ bool m_dbusConnected;
++};
++
+ static inline void setPainterPen(QPainter *p, const QColor &col, const qreal width=1.0)
+ {
+ p->setPen(QPen(col, width));
+@@ -321,6 +341,7 @@ static void parseWindowLine(const QString &line, QList<int> &data)
+ #endif
+
+ Style::Style() :
++ m_dBusHelper(new DBusHelper()),
+ m_popupMenuCols(0L),
+ m_sliderCols(0L),
+ m_defBtnCols(0L),
+@@ -343,13 +364,11 @@ Style::Style() :
+ m_progressBarAnimateTimer(0),
+ m_animateStep(0),
+ m_titlebarHeight(0),
+- m_dBus(0),
+ m_shadowHelper(new ShadowHelper(this)),
+ m_sViewSBar(0L),
+ m_windowManager(new WindowManager(this)),
+ m_blurHelper(new BlurHelper(this)),
+- m_shortcutHandler(new ShortcutHandler(this)),
+- m_dbusConnected(false)
++ m_shortcutHandler(new ShortcutHandler(this))
+ {
+ const char *env = getenv(QTCURVE_PREVIEW_CONFIG);
+ #ifdef QTC_QT5_ENABLE_KDE
+@@ -394,6 +413,23 @@ void Style::init(bool initial)
+ #ifdef QTC_QT5_ENABLE_KDE
+ connect(KWindowSystem::self(), &KWindowSystem::compositingChanged, this, &Style::compositingToggled);
+ #endif
++ // prepare the cleanup handler
++ if (QCoreApplication::instance()) {
++ std::call_once(m_dBusHelper->m_aboutToQuitInit, [this] {
++ connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, [this] () {
++ // disconnect from the session DBus. We're no longer interested in the
++ // information it might send when the app we're serving is shutting down.
++ disconnectDBus();
++ // Stop listening to select signals. We shouldn't stop emitting signals
++ // (like QObject::destroyed) but we can reduce the likelihood that pending
++ // signals will be sent to us post-mortem.
++#ifdef QTC_QT5_ENABLE_KDE
++ disconnect(KWindowSystem::self(), &KWindowSystem::compositingChanged,
++ this, &Style::compositingToggled);
++#endif
++ } );
++ } );
++ }
+ }
+ }
+
+@@ -663,14 +699,11 @@ void Style::init(bool initial)
+
+ void Style::connectDBus()
+ {
+- if (m_dbusConnected)
++ if (m_dBusHelper->m_dbusConnected)
+ return;
+ auto bus = QDBusConnection::sessionBus();
+ if (bus.isConnected()) {
+- m_dbusConnected = true;
+- if (QCoreApplication::instance()) {
+- connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &Style::disconnectDBus);
+- }
++ m_dBusHelper->m_dbusConnected = true;
+ bus.connect(QString(), "/KGlobalSettings", "org.kde.KGlobalSettings",
+ "notifyChange", this, SLOT(kdeGlobalSettingsChange(int, int)));
+ #ifndef QTC_QT5_ENABLE_KDE
+@@ -699,12 +732,15 @@ void Style::connectDBus()
+
+ void Style::disconnectDBus()
+ {
+- if (!m_dbusConnected)
++ if (!m_dBusHelper->m_dbusConnected)
+ return;
+- m_dbusConnected = false;
+ auto bus = QDBusConnection::sessionBus();
++ if (!bus.isConnected())
++ return;
++ m_dBusHelper->m_dbusConnected = false;
+ if (getenv("QTCURVE_DEBUG")) {
+ qWarning() << Q_FUNC_INFO << this << "Disconnecting from" << bus.name() << "/" << bus.baseService();
++ dumpObjectInfo();
+ }
+ bus.disconnect(QString(), "/KGlobalSettings", "org.kde.KGlobalSettings",
+ "notifyChange",
+@@ -739,9 +775,7 @@ Style::~Style()
+ m_plugin->m_styleInstances.removeAll(this);
+ }
+ freeColors();
+- if (m_dBus) {
+- delete m_dBus;
+- }
++ delete m_dBusHelper;
+ }
+
+ void Style::freeColor(QSet<QColor *> &freedColors, QColor **cols)
+@@ -4467,10 +4501,10 @@ void Style::emitMenuSize(QWidget *w, unsigned short size, bool force)
+ if (oldSize != size) {
+ w->setProperty(constMenuSizeProperty, size);
+ qtcX11SetMenubarSize(wid, size);
+- if(!m_dBus)
+- m_dBus = new QDBusInterface("org.kde.kwin", "/QtCurve",
++ if(!m_dBusHelper->m_dBus)
++ m_dBusHelper->m_dBus = new QDBusInterface("org.kde.kwin", "/QtCurve",
+ "org.kde.QtCurve");
+- m_dBus->call(QDBus::NoBlock, "menuBarSize",
++ m_dBusHelper->m_dBus->call(QDBus::NoBlock, "menuBarSize",
+ (unsigned int)wid, (int)size);
+ }
+ }
+@@ -4479,10 +4513,10 @@ void Style::emitMenuSize(QWidget *w, unsigned short size, bool force)
+ void Style::emitStatusBarState(QStatusBar *sb)
+ {
+ if (opts.statusbarHiding & HIDE_KWIN) {
+- if (!m_dBus)
+- m_dBus = new QDBusInterface("org.kde.kwin", "/QtCurve",
++ if (!m_dBusHelper->m_dBus)
++ m_dBusHelper->m_dBus = new QDBusInterface("org.kde.kwin", "/QtCurve",
+ "org.kde.QtCurve");
+- m_dBus->call(QDBus::NoBlock, "statusBarState",
++ m_dBusHelper->m_dBus->call(QDBus::NoBlock, "statusBarState",
+ (unsigned int)qtcGetWid(sb->window()),
+ sb->isVisible());
+ }
+diff --git a/qt5/style/qtcurve.h b/qt5/style/qtcurve.h
+index 56960a5..ecfa2e7 100644
+--- a/qt5/style/qtcurve.h
++++ b/qt5/style/qtcurve.h
+@@ -522,6 +522,9 @@ private:
+ const QWidget *widget) const;
+
+ private:
++ class DBusHelper;
++ DBusHelper *m_dBusHelper;
++
+ mutable Options opts;
+ QColor m_highlightCols[TOTAL_SHADES + 1],
+ m_backgroundCols[TOTAL_SHADES + 1],
+@@ -564,14 +567,12 @@ private:
+ mutable QList<int> m_mdiButtons[2]; // 0=left, 1=right
+ mutable int m_titlebarHeight;
+
+- QDBusInterface *m_dBus;
+ ShadowHelper *m_shadowHelper;
+ mutable QScrollBar *m_sViewSBar;
+ mutable QMap<QWidget*, QSet<QWidget*> > m_sViewContainers;
+ WindowManager *m_windowManager;
+ BlurHelper *m_blurHelper;
+ ShortcutHandler *m_shortcutHandler;
+- bool m_dbusConnected;
+ #ifdef QTC_QT5_ENABLE_KDE
+ KSharedConfigPtr m_configFile;
+ KSharedConfigPtr m_kdeGlobals;
+diff --git a/qt5/style/qtcurve_plugin.cpp b/qt5/style/qtcurve_plugin.cpp
+index ce363ac..481fffc 100644
+--- a/qt5/style/qtcurve_plugin.cpp
++++ b/qt5/style/qtcurve_plugin.cpp
+@@ -129,6 +129,11 @@ StylePlugin::create(const QString &key)
+ if (key.toLower() == "qtcurve") {
+ qtc = new Style;
+ qtc->m_plugin = this;
++ // keep track of all style instances we allocate, for instance
++ // for KLineEdit widgets which apparently insist on overriding
++ // certain things (cf. KLineEditStyle). We want to be able to
++ // delete those instances as properly and as early as
++ // possible during the global destruction phase.
+ m_styleInstances << qtc;
+ } else {
+ qtc = nullptr;
+@@ -151,12 +156,14 @@ StylePlugin::~StylePlugin()
+ qtcInfo("Deleting QtCurve plugin (%p)\n", this);
+ if (!m_styleInstances.isEmpty()) {
+ qtcWarn("there remain(s) %d Style instance(s)\n", m_styleInstances.count());
+- QList<Style*>::Iterator it = m_styleInstances.begin();
+- while (it != m_styleInstances.end()) {
+- Style *that = *it;
+- it = m_styleInstances.erase(it);
++ foreach (Style *that, m_styleInstances) {
++ // don't let ~Style() touch m_styleInstances from here.
++ that->m_plugin = nullptr;
++ // each instance should already have disconnected from the D-Bus
++ // and disconnected from receiving select signals.
+ delete that;
+ }
++ m_styleInstances.clear();
+ }
+ if (firstPlInstance == this) {
+ firstPlInstance = nullptr;
+--
+cgit v0.11.2
+
diff --git a/x11-themes/qtcurve/qtcurve-1.9.0_rc1-r2.ebuild b/x11-themes/qtcurve/qtcurve-1.9.0_rc1-r2.ebuild
new file mode 100644
index 000000000000..08539806e18c
--- /dev/null
+++ b/x11-themes/qtcurve/qtcurve-1.9.0_rc1-r2.ebuild
@@ -0,0 +1,94 @@
+# Copyright 1999-2018 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+
+KDE_AUTODEPS="false"
+inherit kde5
+
+DESCRIPTION="Widget styles for Qt and GTK2"
+HOMEPAGE="https://cgit.kde.org/qtcurve.git"
+
+LICENSE="LGPL-2+"
+SLOT="0"
+IUSE="+X gtk nls plasma qt4 +qt5 test"
+
+if [[ "${PV}" != 9999 ]] ; then
+ SRC_URI="https://github.com/KDE/qtcurve/archive/${PV/_/-}.tar.gz -> ${P}.tar.gz"
+ KEYWORDS="~alpha ~amd64 ~hppa ~ppc ~ppc64 ~sparc ~x86"
+ S="${WORKDIR}/${P/_/-}"
+fi
+
+REQUIRED_USE="gtk? ( X )
+ || ( gtk qt4 qt5 )
+ plasma? ( qt5 )
+"
+
+COMMON_DEPEND="
+ gtk? ( x11-libs/gtk+:2 )
+ qt4? (
+ dev-qt/qtcore:4
+ dev-qt/qtdbus:4
+ dev-qt/qtgui:4
+ dev-qt/qtsvg:4
+ )
+ qt5? (
+ $(add_qt_dep qtdbus)
+ $(add_qt_dep qtgui)
+ $(add_qt_dep qtsvg)
+ $(add_qt_dep qtwidgets)
+ $(add_qt_dep qtx11extras)
+ )
+ plasma? (
+ $(add_frameworks_dep frameworkintegration)
+ $(add_frameworks_dep karchive)
+ $(add_frameworks_dep kcompletion)
+ $(add_frameworks_dep kconfig)
+ $(add_frameworks_dep kconfigwidgets)
+ $(add_frameworks_dep kcoreaddons)
+ $(add_frameworks_dep kdelibs4support)
+ $(add_frameworks_dep kguiaddons)
+ $(add_frameworks_dep ki18n)
+ $(add_frameworks_dep kiconthemes)
+ $(add_frameworks_dep kio)
+ $(add_frameworks_dep kwidgetsaddons)
+ $(add_frameworks_dep kwindowsystem)
+ $(add_frameworks_dep kxmlgui)
+ $(add_qt_dep qtprintsupport)
+ )
+ X? (
+ x11-libs/libX11
+ x11-libs/libxcb
+ )
+"
+DEPEND="${COMMON_DEPEND}
+ virtual/pkgconfig
+ nls? ( sys-devel/gettext )
+"
+RDEPEND="${COMMON_DEPEND}
+ !x11-themes/gtk-engines-qtcurve
+"
+
+DOCS=( AUTHORS ChangeLog.md README.md TODO.md )
+
+PATCHES=(
+ "${FILESDIR}/${PN}-1.9.0-rare_crash_hang_fix.patch"
+)
+
+src_configure() {
+ local mycmakeargs=(
+ -DLIB_INSTALL_DIR="$(get_libdir)"
+ -DQTC_QT4_ENABLE_KDE=OFF
+ -DQTC_QT4_ENABLE_KWIN=OFF
+ -DQTC_KDE4_DEFAULT_HOME=ON
+ -DENABLE_GTK2="$(usex gtk)"
+ -DENABLE_QT4="$(usex qt4)"
+ -DENABLE_QT5="$(usex qt5)"
+ -DENABLE_TEST="$(usex test)"
+ -DQTC_ENABLE_X11="$(usex X)"
+ -DQTC_INSTALL_PO="$(usex nls)"
+ -DQTC_QT5_ENABLE_KDE="$(usex plasma)"
+ )
+
+ kde5_src_configure
+}