From 02b523bad09aab062355e46771889b0f3709692f Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Sat, 12 Jan 2019 18:39:33 +0100 Subject: Make KCheckAccelerators less invasive for apps that don't directly link to KXmlGui Summary: BUGS: 337491 Test Plan: Ran qtcreator and it no longer has the & in Details Added some debug and checked that okular still gets the code called Reviewers: anthonyfieroni Reviewed By: anthonyfieroni Subscribers: davidedmundson, anthonyfieroni, kde-frameworks-devel Tags: #frameworks Differential Revision: https://phabricator.kde.org/D18204 --- src/kcheckaccelerators.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/kcheckaccelerators.cpp b/src/kcheckaccelerators.cpp index 13fc012..e08447d 100644 --- a/src/kcheckaccelerators.cpp +++ b/src/kcheckaccelerators.cpp @@ -80,10 +80,44 @@ public Q_SLOTS: static void startupFunc() { - // Call initiateIfNeeded once we're in the event loop - // This is to prevent using KSharedConfig before main() can set the app name + // Static because in some cases this is called multiple times + // but if an application had any of the bad cases we always want + // to skip the check + static bool doCheckAccelerators = true; + + if (!doCheckAccelerators) { + return; + } + QCoreApplication *app = QCoreApplication::instance(); + if (!app) { + // We're being loaded by something that doesn't have a QCoreApplication + // this would probably crash at some later point since we do use qApp-> + // quite a lot, so skip the magic + doCheckAccelerators = false; + return; + } + + if (!QCoreApplication::startingUp()) { + // If the app has already started, this means we're not being run as part of + // qt_call_pre_routines, which most probably means that we're being run as part + // of KXmlGui being loaded as part of some plugin of the app, so don't + // do any magic + doCheckAccelerators = false; + return; + } + + if (!QCoreApplication::eventDispatcher()) { + // We are called with event dispatcher being null when KXmlGui is being loaded + // through plasma-integration instead of being linked to the app (i.e. QtCreator vs Okular) + // For apps that don't link directly to KXmlGui do not do the accelerator magic + doCheckAccelerators = false; + return; + } + KCheckAcceleratorsInitializer *initializer = new KCheckAcceleratorsInitializer(app); + // Call initiateIfNeeded once we're in the event loop + // This is to prevent using KSharedConfig before main() can set the app name QMetaObject::invokeMethod(initializer, "initiateIfNeeded", Qt::QueuedConnection); } -- cgit v1.1