diff --git a/krunner/CMakeLists.txt b/krunner/CMakeLists.txt --- a/krunner/CMakeLists.txt +++ b/krunner/CMakeLists.txt @@ -33,6 +33,9 @@ configure_file(krunner.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/krunner.desktop @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/krunner.desktop DESTINATION ${DATA_INSTALL_DIR}/kglobalaccel) +configure_file(krunner-daemon.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/krunner-daemon.desktop @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/krunner-daemon.desktop DESTINATION ${AUTOSTART_INSTALL_DIR}) + set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KRunnerAppDBusInterface") configure_package_config_file(KRunnerAppDBusInterfaceConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/KRunnerAppDBusInterfaceConfig.cmake" diff --git a/krunner/dbus/org.kde.krunner.service.in b/krunner/dbus/org.kde.krunner.service.in --- a/krunner/dbus/org.kde.krunner.service.in +++ b/krunner/dbus/org.kde.krunner.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=org.kde.krunner -Exec=@KDE_INSTALL_FULL_BINDIR@/krunner +Exec=@KDE_INSTALL_FULL_BINDIR@/krunner --daemon diff --git a/krunner/krunner-daemon.desktop.cmake b/krunner/krunner-daemon.desktop.cmake new file mode 100644 --- /dev/null +++ b/krunner/krunner-daemon.desktop.cmake @@ -0,0 +1,55 @@ +[Desktop Entry] +Exec=@CMAKE_INSTALL_PREFIX@/bin/krunner --daemon +Name=KRunner +Name[ar]=مشغّل.ك +Name[ast]=KRunner +Name[bs]=KPokretač +Name[ca]=KRunner +Name[ca@valencia]=KRunner +Name[cs]=KRunner +Name[da]=KRunner +Name[de]=KRunner +Name[el]=KRunner +Name[en_GB]=KRunner +Name[es]=KRunner +Name[et]=KRunner +Name[eu]=KRunner +Name[fi]=KRunner +Name[fr]=KRunner +Name[gl]=KRunner +Name[hu]=KRunner +Name[id]=KRunner +Name[is]=KRunner +Name[it]=KRunner +Name[ja]=KRunner +Name[ko]=KRunner +Name[lt]=KRunner +Name[nb]=KRunner +Name[nds]=KRunner +Name[nl]=KRunner +Name[nn]=KRunner +Name[pa]=ਕੇਰਨਰ +Name[pl]=KRunner +Name[pt]=KRunner +Name[pt_BR]=KRunner +Name[ru]=KRunner +Name[sk]=KRunner +Name[sl]=KRunner +Name[sr]=К‑извођач +Name[sr@ijekavian]=К‑извођач +Name[sr@ijekavianlatin]=K‑izvođač +Name[sr@latin]=K‑izvođač +Name[sv]=Kör program +Name[tr]=KRunner +Name[uk]=KRunner +Name[x-test]=xxKRunnerxx +Name[zh_CN]=KRunner +Name[zh_TW]=KRunner +OnlyShowIn=KDE; +Type=Application +X-DBUS-StartupType=Unique +X-DBUS-ServiceName=org.kde.krunner +X-KDE-StartupNotify=false +X-KDE-autostart-phase=2 +X-KDE-autostart-after=plasmashell +X-KDE-autostart-condition=krunnerrc:General:AutoStart:true diff --git a/shell/desktopview.h b/shell/desktopview.h --- a/shell/desktopview.h +++ b/shell/desktopview.h @@ -101,12 +101,14 @@ void coronaPackageChanged(const KPackage::Package &package); void ensureWindowType(); void setupWaylandIntegration(); + bool handleKRunnerTextInput(QKeyEvent *e); QPointer m_configView; QPointer m_oldScreen; QPointer m_screenToFollow; WindowType m_windowType; KWayland::Client::PlasmaShellSurface *m_shellSurface; + QString m_krunnerText; }; #endif // DESKTOPVIEW_H diff --git a/shell/desktopview.cpp b/shell/desktopview.cpp --- a/shell/desktopview.cpp +++ b/shell/desktopview.cpp @@ -236,11 +236,41 @@ m_shellSurface = nullptr; break; } + } else if (e->type() == QEvent::FocusOut) { + m_krunnerText.clear(); } return PlasmaQuick::ContainmentView::event(e); } +bool DesktopView::handleKRunnerTextInput(QKeyEvent *e) { + // allow only Shift and GroupSwitch modifiers + if (e->modifiers() & ~Qt::ShiftModifier & ~Qt::GroupSwitchModifier) { + return false; + } + bool krunnerTextChanged = false; + for (QChar ch : e->text()) { + if (!ch.isPrint()) { + continue; + } + if (ch.isSpace() && m_krunnerText.isEmpty()) { + continue; + } + m_krunnerText += ch; + krunnerTextChanged = true; + } + if (krunnerTextChanged) { + const QString interface(QStringLiteral("org.kde.krunner")); + if (!KAuthorized::authorize(QStringLiteral("run_command"))) { + return false; + } + org::kde::krunner::App krunner(interface, QStringLiteral("/App"), QDBusConnection::sessionBus()); + krunner.query(m_krunnerText); + return true; + } + return false; +} + void DesktopView::keyPressEvent(QKeyEvent *e) { ContainmentView::keyPressEvent(e); @@ -256,18 +286,9 @@ } // When a key is pressed on desktop when nothing else is active forward the key to krunner - if (!e->modifiers() || e->modifiers() == Qt::ShiftModifier) { - const QString text = e->text().trimmed(); - if (!text.isEmpty() && text[0].isPrint()) { - const QString interface(QStringLiteral("org.kde.krunner")); - if (!KAuthorized::authorize(QStringLiteral("run_command"))) { - return; - } - org::kde::krunner::App krunner(interface, QStringLiteral("/App"), QDBusConnection::sessionBus()); - krunner.query(text); - e->accept(); - return; - } + if (handleKRunnerTextInput(e)) { + e->accept(); + return; } }