3333#include < QDBusConnectionInterface>
3434#include < QDBusServiceWatcher>
3535#include < QGuiApplication>
36-
36+ # include < QTimer >
3737#include < QDebug>
3838
3939#include " dbusmenuimporter.h"
@@ -99,6 +99,7 @@ AppMenuModel::AppMenuModel(QObject *parent)
9999 if (serviceName == m_serviceName) {
100100 setMenuAvailable (false );
101101 emit modelNeedsUpdate ();
102+ emit menuParsed ();
102103 }
103104 });
104105}
@@ -302,6 +303,7 @@ void AppMenuModel::onActiveWindowChanged(WId id)
302303 if (!id) {
303304 setMenuAvailable (false );
304305 emit modelNeedsUpdate ();
306+ emit menuParsed ();
305307 return ;
306308 }
307309
@@ -401,6 +403,7 @@ void AppMenuModel::onActiveWindowChanged(WId id)
401403 // rekols: 切换到桌面时要隐藏menubar
402404 setMenuAvailable (false );
403405 emit modelNeedsUpdate ();
406+ emit menuParsed ();
404407 return ;
405408 }
406409
@@ -431,8 +434,11 @@ void AppMenuModel::onActiveWindowChanged(WId id)
431434 m_delayedMenuWindowId = id;
432435
433436 // no menu found, set it to unavailable
437+
434438 setMenuAvailable (false );
435439 emit modelNeedsUpdate ();
440+ emit menuParsed ();
441+
436442 }
437443}
438444
@@ -522,18 +528,21 @@ void AppMenuModel::updateApplicationMenu(const QString &serviceName, const QStri
522528 }
523529
524530 m_importer = new KDBusMenuImporter (serviceName, menuObjectPath, this );
531+ if (serviceName ==" org.kde.plasma.gmenu_dbusmenu_proxy" ) {
532+ QTimer::singleShot (200 ,this , [=](){m_importer->updateMenu ();});
533+ } else {
525534 QMetaObject::invokeMethod (m_importer, " updateMenu" , Qt::QueuedConnection);
535+ }
526536
537+ m_menu = m_importer->menu ();
527538
528539 connect (m_importer.data (), &DBusMenuImporter::menuUpdated, this , [=](QMenu *menu) {
529- m_menu = m_importer-> menu ();
540+ for (QAction *a : menu-> actions ()) {
530541
531- if (m_menu.isNull () || menu != m_menu) {
532- return ;
533- }
542+ if (a->menu ()) {
543+ m_importer->updateMenu (a->menu ());
534544
535- // cache first layer of sub menus, which we'll be popping up
536- for (QAction *a : m_menu->actions ()) {
545+ }
537546 // signal dataChanged when the action changes
538547 connect (a, &QAction::changed, this , [this , a] {
539548 if (m_menuAvailable && m_menu)
@@ -544,19 +553,18 @@ void AppMenuModel::updateApplicationMenu(const QString &serviceName, const QStri
544553 const QModelIndex modelIdx = index (actionIdx, 0 );
545554 emit dataChanged (modelIdx, modelIdx);
546555 }
547- emit modelNeedsUpdate ();
548556 }
549557 });
550558
551559 connect (a, &QAction::destroyed, this , &AppMenuModel::modelNeedsUpdate);
552560
553- if (a->menu ()) {
554- m_importer->updateMenu (a->menu ());
555- }
556561 }
557-
558- setMenuAvailable (true );
559- emit modelNeedsUpdate ();
562+
563+
564+ if (m_menu && !m_menu->actions ().isEmpty () && m_menu->actions ().last () == menu->menuAction ()) {
565+ setMenuAvailable (true );
566+ emit menuParsed ();
567+ }
560568 });
561569
562570 connect (m_importer.data (), &DBusMenuImporter::actionActivationRequested, this , [this ](QAction * action) {
0 commit comments