krunnerglobalshortcuts: Prevent actions from becoming inactive

If a QAction is destroyed, KGlobalAccel will automaticaly set it
to inactive. To prevent this put them on the heap and intentionally
leak them as it did before.
CCBUG:437364
wilder-5.24
David Redondo 5 years ago committed by Nate Graham
parent f17fce78ea
commit 6502f798fe
  1. 24
      krunner/update/krunnerglobalshortcuts.cpp

@ -49,10 +49,12 @@ int main(int argc, char **argv)
KActionCollection shortCutActions(nullptr, oldDesktopFile); KActionCollection shortCutActions(nullptr, oldDesktopFile);
shortCutActions.setComponentDisplayName(displayName); shortCutActions.setComponentDisplayName(displayName);
QAction runCommandAction(displayName); // The actions are intentionally allocated and never cleaned up, because otherwise KGlobalAccel
shortCutActions.addAction(QStringLiteral("_launch"), &runCommandAction); // will mark them as inactive
QAction runClipboardAction(clipboardActionName); auto runCommandAction = new QAction(displayName);
shortCutActions.addAction(QStringLiteral("RunClipboard"), &runClipboardAction); shortCutActions.addAction(QStringLiteral("_launch"), runCommandAction);
auto runClipboardAction = new QAction(clipboardActionName);
shortCutActions.addAction(QStringLiteral("RunClipboard"), runClipboardAction);
QList<QKeySequence> oldRunCommand; QList<QKeySequence> oldRunCommand;
QList<QKeySequence> oldRunClipboard; QList<QKeySequence> oldRunClipboard;
@ -61,23 +63,23 @@ int main(int argc, char **argv)
oldRunClipboard = KGlobalAccel::self()->globalShortcut(oldCompomentName, QStringLiteral("run command on clipboard contents")); oldRunClipboard = KGlobalAccel::self()->globalShortcut(oldCompomentName, QStringLiteral("run command on clipboard contents"));
KGlobalAccel::self()->cleanComponent(oldCompomentName); KGlobalAccel::self()->cleanComponent(oldCompomentName);
} else if (KGlobalAccel::isComponentActive(oldDesktopFile)) { } else if (KGlobalAccel::isComponentActive(oldDesktopFile)) {
oldRunCommand = KGlobalAccel::self()->globalShortcut(oldDesktopFile, runCommandAction.objectName()); oldRunCommand = KGlobalAccel::self()->globalShortcut(oldDesktopFile, runCommandAction->objectName());
oldRunClipboard = KGlobalAccel::self()->globalShortcut(oldDesktopFile, runClipboardAction.objectName()); oldRunClipboard = KGlobalAccel::self()->globalShortcut(oldDesktopFile, runClipboardAction->objectName());
KGlobalAccel::self()->cleanComponent(oldDesktopFile); KGlobalAccel::self()->cleanComponent(oldDesktopFile);
} else { } else {
return 0; return 0;
} }
shortCutActions.takeAction(&runCommandAction); shortCutActions.takeAction(runCommandAction);
shortCutActions.takeAction(&runClipboardAction); shortCutActions.takeAction(runClipboardAction);
shortCutActions.setComponentName(newDesktopFile); shortCutActions.setComponentName(newDesktopFile);
shortCutActions.addActions({&runCommandAction, &runClipboardAction}); shortCutActions.addActions({runCommandAction, runClipboardAction});
if (!oldRunCommand.isEmpty()) { if (!oldRunCommand.isEmpty()) {
KGlobalAccel::self()->setShortcut(&runCommandAction, oldRunCommand, KGlobalAccel::NoAutoloading); KGlobalAccel::self()->setShortcut(runCommandAction, oldRunCommand, KGlobalAccel::NoAutoloading);
} }
if (!oldRunClipboard.isEmpty()) { if (!oldRunClipboard.isEmpty()) {
KGlobalAccel::self()->setShortcut(&runClipboardAction, oldRunClipboard, KGlobalAccel::NoAutoloading); KGlobalAccel::self()->setShortcut(runClipboardAction, oldRunClipboard, KGlobalAccel::NoAutoloading);
} }
return 0; return 0;

Loading…
Cancel
Save