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.

Reply via email to