https://bugs.kde.org/show_bug.cgi?id=503813
--- Comment #26 from ulte...@gmail.com --- - I forgot to mention before, but I checked the keyboard input using libinput and it was working fine. Not sticky keys/double presses > GitPlugin::additionalMenuEntries() invoked only once when you right-click? Yes, in case of a right-click, it is invoked only once, while in case of the Menu key, it gets invoked twice. Furthermore, I added a connect to KTextEditor::View::contextMenuAboutToShow, which shows me that the signal is called twice when I use the Menu key, while only one when I use the RMB. ___ Just recently logged into an X11 session to reproduce the same and: The error output of: > kdevplatform.shell: populateContextMenu() called while we still handled > another menu. was not displayed and the rest worked just fine. So I will go by considering that the double context menu is something coming from some Wayland related thing. ___ On the KDevelop side though, I see that in a normal case (Right Mouse Button), I get: virtual void GitPlugin::additionalMenuEntries(QMenu*, const QList<QUrl>&) virtual void KDevelop::DVcsJob::start() "2025-05-08T22:45:05.561" Unlocked 135532689649032 virtual void KDevelop::DVcsJob::start() "2025-05-08T22:45:08.787" Unlocked 135532689649032 despite having other (other than git) vcs plugins deactivated. Corresponding code: static QMutex xtex; QMutexLocker c (&xtex); qDebug() << __PRETTY_FUNCTION__ << QDateTime::currentDateTime().toString (Qt::ISODateWithMs) << "Unlocked" << (long) ((void *) &xtex); ___ So, the DVcsJob is called twice, in case of normal operation. This becomes 4 times in case the Menu Key is used: virtual void KDevelop::DVcsJob::start() "2025-05-08T22:56:38.418" Unlocked 128381549084040 kdevplatform.shell: populateContextMenu() called while we still handled another menu. virtual void KDevelop::DVcsJob::start() "2025-05-08T22:56:38.420" Unlocked 128381549084040 virtual void GitPlugin::additionalMenuEntries(QMenu*, const QList<QUrl>&) virtual void KDevelop::DVcsJob::start() "2025-05-08T22:56:38.423" Unlocked 128381549084040 virtual void GitPlugin::additionalMenuEntries(QMenu*, const QList<QUrl>&) virtual void KDevelop::DVcsJob::start() "2025-05-08T22:56:38.430" Unlocked 128381549084040 KCrash: Application 'kdevelop' crashing... crashRecursionCounter = 2 zsh: segmentation fault (core dumped) bin/kdevelop ___ I also loaded core dumps in QtCreator and : First it crashed in the additionalMenuEntries function as you expected. On adding the menu guard, next it crashed in the SwitchToBuddyPlugin::contextMenuExtension at auto* action = new QAction(i18nc("@action:inmenu", "Switch to '%1'", url.fileName()), parent); I bypassed the function: Next try, got a crash at ContextMenuExtension::populateMenu in function populateMenuWithGroup(menu, extensions, VcsGroup); [line 138] at groupMenu->addAction(action); with only 1 item in the __for_range of for (QAction* action : std::as_const(groupActions)) ___ Diff for the final try on top of edd57f491d32f4fed360bfc2a1f25c02464dc3c0: diff --git a/kdevplatform/shell/plugincontroller.cpp b/kdevplatform/shell/plugincontroller.cpp index 177581bdb9..e50a876cee 100644 --- a/kdevplatform/shell/plugincontroller.cpp +++ b/kdevplatform/shell/plugincontroller.cpp @@ -776,20 +776,24 @@ QList<ContextMenuExtension> PluginController::queryPluginsForContextMenuExtensio // 1) "Cppcheck" actions, "Vera++" actions - first run // 2) "Vera++" actions, "Cppcheck" actions - some other run. QMultiMap<QString, IPlugin*> sortedPlugins; - for (auto it = d->loadedPlugins.constBegin(); it != d->loadedPlugins.constEnd(); ++it) { - sortedPlugins.insert(it.key().name(), it.value()); - } + for (auto it = d->loadedPlugins.constBegin(); it != d->loadedPlugins.constEnd(); ++it) + { + sortedPlugins.insert (it.key().name(), it.value()); + } - QList<ContextMenuExtension> exts; - exts.reserve(sortedPlugins.size()); + QList<ContextMenuExtension> exts; + exts.reserve(sortedPlugins.size()); for (IPlugin* plugin : std::as_const(sortedPlugins)) { - exts << plugin->contextMenuExtension(context, parent); - } + qDebug() << "Calling contextMenuExtension of: " << plugin->objectName() << plugin->componentName() + << "Error?: " << plugin->hasError(); + + exts << plugin->contextMenuExtension (context, parent); + } - exts << Core::self()->debugControllerInternal()->contextMenuExtension(context, parent); - exts << Core::self()->documentationControllerInternal()->contextMenuExtension(context, parent); - exts << Core::self()->sourceFormatterControllerInternal()->contextMenuExtension(context, parent); - exts << Core::self()->runControllerInternal()->contextMenuExtension(context, parent); + exts << Core::self()->debugControllerInternal()->contextMenuExtension (context, parent); + exts << Core::self()->documentationControllerInternal()->contextMenuExtension (context, parent); + exts << Core::self()->sourceFormatterControllerInternal()->contextMenuExtension (context, parent); + exts << Core::self()->runControllerInternal()->contextMenuExtension(context, parent); exts << Core::self()->projectControllerInternal()->contextMenuExtension(context, parent); return exts; diff --git a/kdevplatform/vcs/dvcs/dvcsjob.cpp b/kdevplatform/vcs/dvcs/dvcsjob.cpp index 3f33d27090..c024477a93 100644 --- a/kdevplatform/vcs/dvcs/dvcsjob.cpp +++ b/kdevplatform/vcs/dvcs/dvcsjob.cpp @@ -18,6 +18,7 @@ #include <QStringList> #include <QDir> #include <QUrl> +#include <QMutexLocker> #include <KLocalizedString> #include <KShell> @@ -165,30 +166,35 @@ QVariant DVcsJob::fetchResults() void DVcsJob::start() { Q_D(DVcsJob); - - Q_ASSERT_X(d->status != JobRunning, "DVCSjob::start", "Another process was started using this job class"); - - const QDir& workingdir = directory(); - if( !workingdir.exists() ) { - QString error = i18n( "Working Directory does not exist: %1", d->childproc->workingDirectory() ); - d->model->appendLine(error); + static QMutex xtex; + QMutexLocker c (&xtex); + qDebug() << __PRETTY_FUNCTION__ << QDateTime::currentDateTime().toString (Qt::ISODateWithMs) << "Unlocked" + << (long) ((void *) &xtex); + Q_ASSERT_X (d->status != JobRunning, "DVCSjob::start", "Another process was started using this job class"); + + const QDir &workingdir = directory(); + if (!workingdir.exists()) + { + QString error = i18n ("Working Directory does not exist: %1", d->childproc->workingDirectory()); + d->model->appendLine(error); setError( 255 ); setErrorText(error); d->status = JobFailed; emitResult(); return; - } - if( !workingdir.isAbsolute() ) { - QString error = i18n( "Working Directory is not absolute: %1", d->childproc->workingDirectory() ); + } + if (!workingdir.isAbsolute()) + { + QString error = i18n( "Working Directory is not absolute: %1", d->childproc->workingDirectory() ); d->model->appendLine(error); setError( 255 ); setErrorText(error); d->status = JobFailed; emitResult(); return; - } + } - QString commandDisplay = KShell::joinArgs(dvcsCommand()); + QString commandDisplay = KShell::joinArgs(dvcsCommand()); qCDebug(VCS) << "Execute dvcs command:" << commandDisplay; QString service; diff --git a/plugins/git/gitplugin.cpp b/plugins/git/gitplugin.cpp index 2adaf07c62..6d42e5f80a 100644 --- a/plugins/git/gitplugin.cpp +++ b/plugins/git/gitplugin.cpp @@ -243,16 +243,30 @@ bool GitPlugin::hasModifications(const QDir& repo, const QUrl& file) void GitPlugin::additionalMenuEntries(QMenu* menu, const QList<QUrl>& urls) { - m_urls = urls; - - QDir dir=urlDir(urls); - bool hasSt = hasStashes(dir); - - menu->addAction(i18nc("@action:inmenu", "Rebase"), this, SLOT(ctxRebase())); - menu->addSeparator()->setText(i18nc("@title:menu", "Git Stashes")); - menu->addAction(i18nc("@action:inmenu", "Stash Manager"), this, SLOT(ctxStashManager()))->setEnabled(hasSt); - menu->addAction(QIcon::fromTheme(QStringLiteral("vcs-stash")), i18nc("@action:inmenu", "Push Stash"), this, SLOT(ctxPushStash())); - menu->addAction(QIcon::fromTheme(QStringLiteral("vcs-stash-pop")), i18nc("@action:inmenu", "Pop Stash"), this, SLOT(ctxPopStash()))->setEnabled(hasSt); + qDebug() << __PRETTY_FUNCTION__; + QPointer menu_g (menu); + m_urls = urls; + + QDir dir = urlDir (urls); + bool hasSt = hasStashes (dir); + + if (menu_g.isNull()) + { + qDebug() << __PRETTY_FUNCTION__ << (long) ((void *) menu_g) << " Gone. "; + return; + } + menu->addAction (i18nc ("@action:inmenu", "Rebase"), this, &GitPlugin::ctxRebase); + menu->addSeparator()->setText (i18nc ("@title:menu", "Git Stashes")); + menu->addAction (i18nc ("@action:inmenu", "Stash Manager"), this, &GitPlugin::ctxStashManager)->setEnabled (hasSt); + menu->addAction (QIcon::fromTheme (QStringLiteral ("vcs-stash")), + i18nc ("@action:inmenu", "Push Stash"), + this, + &GitPlugin::ctxPushStash); + menu->addAction (QIcon::fromTheme (QStringLiteral ("vcs-stash-pop")), + i18nc ("@action:inmenu", "Pop Stash"), + this, + &GitPlugin::ctxPopStash) + ->setEnabled (hasSt); } void GitPlugin::ctxRebase() diff --git a/plugins/switchtobuddy/switchtobuddyplugin.cpp b/plugins/switchtobuddy/switchtobuddyplugin.cpp index f74bcccd92..9e773b2147 100644 --- a/plugins/switchtobuddy/switchtobuddyplugin.cpp +++ b/plugins/switchtobuddy/switchtobuddyplugin.cpp @@ -89,7 +89,8 @@ SwitchToBuddyPlugin::~SwitchToBuddyPlugin() ContextMenuExtension SwitchToBuddyPlugin::contextMenuExtension(Context* context, QWidget* parent) { - auto* ctx = dynamic_cast<EditorContext*>(context); + return ContextMenuExtension(); + auto* ctx = dynamic_cast<EditorContext*>(context); if (!ctx) { return ContextMenuExtension(); } Attaching the core dump too -- You are receiving this mail because: You are watching all bug changes.