Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kglobalacceld6 for openSUSE:Factory checked in at 2025-10-22 12:11:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kglobalacceld6 (Old) and /work/SRC/openSUSE:Factory/.kglobalacceld6.new.18484 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kglobalacceld6" Wed Oct 22 12:11:45 2025 rev:30 rq:1312754 version:6.5.0 Changes: -------- --- /work/SRC/openSUSE:Factory/kglobalacceld6/kglobalacceld6.changes 2025-09-11 14:38:11.388877536 +0200 +++ /work/SRC/openSUSE:Factory/.kglobalacceld6.new.18484/kglobalacceld6.changes 2025-10-22 12:12:27.289718674 +0200 @@ -1,0 +2,38 @@ +Thu Oct 16 18:13:01 UTC 2025 - Fabian Vogt <[email protected]> + +- Update to 6.5.0: + * New bugfix release + * For more details see https://kde.org/announcements/plasma/6/6.5.0 +- Changes since 6.4.91: + * Update version for new release 6.5.0 + +------------------------------------------------------------------- +Thu Oct 2 14:45:07 UTC 2025 - Fabian Vogt <[email protected]> + +- Update to 6.4.91: + * New bugfix release + * For more details see https://kde.org/announcements/plasma/6/6.4.91 +- Changes since 6.4.90: + * Update version for new release 6.4.91 + +------------------------------------------------------------------- +Tue Sep 23 06:38:50 UTC 2025 - Fabian Vogt <[email protected]> + +- Update to 6.4.90: + * New feature release + * For more details see https://kde.org/announcements/plasma/6/6.4.90 +- Changes since 6.4.5: + * Update version for new release 6.4.90 + * Bump kf ecm_set_disabled_deprecation_versions. Make sure that it compiles fine without kf 6.16 deprecated methods + * Drop KGlobalAccelInterface::setEnabled + * Expose KGlobalAccelInterface getter + * Make GlobalShortcutsRegistry not a singleton + * Port to ecm_qt_declare_logging_category + * Store the actual type and no need for invokeMethod anymore + * Allow distinguishing shortcut press from shortcut repeat + * Make Component::loadSettings() take config by a const reference + * Remove global shortcut contexts for desktop files + * Fix losing shortcuts when updating the system + * update version for new release + +------------------------------------------------------------------- Old: ---- kglobalacceld-6.4.5.tar.xz kglobalacceld-6.4.5.tar.xz.sig New: ---- kglobalacceld-6.5.0.tar.xz kglobalacceld-6.5.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kglobalacceld6.spec ++++++ --- /var/tmp/diff_new_pack.cM6RIc/_old 2025-10-22 12:12:29.173798109 +0200 +++ /var/tmp/diff_new_pack.cM6RIc/_new 2025-10-22 12:12:29.185798615 +0200 @@ -16,8 +16,8 @@ # -%global kf6_version 6.14.0 -%define qt6_version 6.8.0 +%define kf6_version 6.18.0 +%define qt6_version 6.9.0 %define rname kglobalacceld %bcond_without released @@ -26,14 +26,14 @@ # Latest ABI-stable Plasma (e.g. 6.0 in KF6, but 6.0.80 in KUF) %{!?_plasma6_version: %define _plasma6_version %(echo %{_plasma6_bugfix} | awk -F. '{print $1"."$2}')} Name: kglobalacceld6 -Version: 6.4.5 +Version: 6.5.0 Release: 0 Summary: Global keyboard shortcut daemon License: LGPL-2.0-or-later URL: https://www.kde.org -Source: https://download.kde.org/stable/plasma/%{version}/%{rname}-%{version}.tar.xz +Source: %{rname}-%{version}.tar.xz %if %{with released} -Source1: https://download.kde.org/stable/plasma/%{version}/%{rname}-%{version}.tar.xz.sig +Source1: %{rname}-%{version}.tar.xz.sig Source2: plasma.keyring %endif %if 0%{?suse_version} == 1500 @@ -113,6 +113,7 @@ %files %{_kf6_configdir}/autostart/kglobalacceld.desktop +%{_kf6_debugdir}/kglobalacceld.categories %dir %{_kf6_plugindir}/org.kde.kglobalacceld.platforms %{_kf6_plugindir}/org.kde.kglobalacceld.platforms/KGlobalAccelDXcb.so %{_libexecdir}/kglobalacceld ++++++ kglobalacceld-6.4.5.tar.xz -> kglobalacceld-6.5.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/CMakeLists.txt new/kglobalacceld-6.5.0/CMakeLists.txt --- old/kglobalacceld-6.4.5/CMakeLists.txt 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/CMakeLists.txt 2025-10-16 11:05:15.000000000 +0200 @@ -2,10 +2,10 @@ project(kglobalacceld) -set(PROJECT_VERSION "6.4.5") +set(PROJECT_VERSION "6.5.0") -set(QT_MIN_VERSION "6.8.0") -set(KF6_MIN_VERSION "6.14.0") +set(QT_MIN_VERSION "6.9.0") +set(KF6_MIN_VERSION "6.18.0") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -78,8 +78,8 @@ SOVERSION 0) ecm_set_disabled_deprecation_versions( - QT 6.8.0 - KF 6.12.0 + QT 6.9.0 + KF 6.16.0 ) add_subdirectory(src) @@ -109,6 +109,12 @@ install(FILES ${kglobalaccel_version_header} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KGlobalAccel COMPONENT Devel) +ecm_qt_install_logging_categories( + EXPORT KGLOBALACCELD + FILE kglobalacceld.categories + DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR} +) + feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h *.c) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/autotests/dummy.cpp new/kglobalacceld-6.5.0/autotests/dummy.cpp --- old/kglobalacceld-6.4.5/autotests/dummy.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/autotests/dummy.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -20,6 +20,7 @@ KGlobalAccelImpl::KGlobalAccelImpl(QObject *parent) : KGlobalAccelInterface(parent) { + s_interface = this; } KGlobalAccelImpl::~KGlobalAccelImpl() @@ -33,19 +34,9 @@ return true; } -void KGlobalAccelImpl::setEnabled(bool enable) +bool KGlobalAccelImpl::checkKeyEvent(int keyQt, ShortcutKeyState state) { - s_interface = enable ? this : nullptr; -} - -bool KGlobalAccelImpl::checkKeyPressed(int keyQt) -{ - return keyPressed(keyQt); -} - -bool KGlobalAccelImpl::checkKeyReleased(int keyQt) -{ - return keyReleased(keyQt); + return keyEvent(keyQt, state); } bool KGlobalAccelImpl::checkPointerPressed(Qt::MouseButtons button) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/autotests/dummy.h new/kglobalacceld-6.5.0/autotests/dummy.h --- old/kglobalacceld-6.4.5/autotests/dummy.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/autotests/dummy.h 2025-10-16 11:05:15.000000000 +0200 @@ -42,14 +42,10 @@ */ bool grabKey(int key, bool grab) override; - /// Enable/disable all shortcuts. There will not be any grabbed shortcuts at this point. - void setEnabled(bool) override; - static KGlobalAccelImpl *instance(); public Q_SLOTS: - bool checkKeyPressed(int keyQt); - bool checkKeyReleased(int keyQt); + bool checkKeyEvent(int keyQt, ShortcutKeyState state); bool checkPointerPressed(Qt::MouseButtons button); bool checkAxisTriggered(int axis); }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/autotests/shortcutstest.cpp new/kglobalacceld-6.5.0/autotests/shortcutstest.cpp --- old/kglobalacceld-6.4.5/autotests/shortcutstest.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/autotests/shortcutstest.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -26,7 +26,7 @@ private: std::unique_ptr<KGlobalAccelD> m_globalacceld; - KGlobalAccelInterface *m_interface; + KGlobalAccelImpl *m_interface; // implementation of KGlobalAccelInterface * for this test KGlobalAccel *m_globalaccel; }; @@ -155,19 +155,16 @@ for (const auto &event : events) { switch (event.first) { case QEvent::KeyPress: - QMetaObject::invokeMethod(m_interface, "checkKeyPressed", Qt::DirectConnection, Q_ARG(int, event.second)); + m_interface->checkKeyEvent(event.second, ShortcutKeyState::Pressed); break; case QEvent::KeyRelease: - QMetaObject::invokeMethod(m_interface, "checkKeyReleased", Qt::DirectConnection, Q_ARG(int, event.second)); + m_interface->checkKeyEvent(event.second, ShortcutKeyState::Released); break; case QEvent::MouseButtonPress: - QMetaObject::invokeMethod(m_interface, - "checkPointerPressed", - Qt::DirectConnection, - Q_ARG(Qt::MouseButtons, static_cast<Qt::MouseButtons>(event.second))); + m_interface->checkPointerPressed(static_cast<Qt::MouseButtons>(event.second)); break; case QEvent::Wheel: - QMetaObject::invokeMethod(m_interface, "checkAxisTriggered", Qt::DirectConnection, Q_ARG(int, event.second)); + m_interface->checkAxisTriggered(event.second); break; default: qFatal("Unknown event type"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/CMakeLists.txt new/kglobalacceld-6.5.0/src/CMakeLists.txt --- old/kglobalacceld-6.4.5/src/CMakeLists.txt 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/CMakeLists.txt 2025-10-16 11:05:15.000000000 +0200 @@ -3,7 +3,6 @@ kglobalaccel_interface.cpp kserviceactioncomponent.cpp component.cpp - logging.cpp globalshortcut.cpp globalshortcutsregistry.cpp globalshortcutcontext.cpp @@ -26,6 +25,15 @@ EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT} ) +ecm_qt_declare_logging_category(KGlobalAccelD + HEADER logging.h + IDENTIFIER KGLOBALACCELD + CATEGORY_NAME kf.globalaccel.kglobalacceld + DEFAULT_SEVERITY Warning + DESCRIPTION "KGlobalAccelD" + EXPORT KGLOBALACCELD + ) + target_include_directories(KGlobalAccelD INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR}/KGlobalAccelD>") target_link_libraries(KGlobalAccelD @@ -52,7 +60,7 @@ target_link_libraries(KGlobalAccelD PUBLIC Qt6::GuiPrivate) # qtx11extras_p.h endif() -add_executable(kglobalacceld main.cpp logging.cpp) +add_executable(kglobalacceld main.cpp) target_include_directories(kglobalacceld PRIVATE ${CMAKE_BINARY_DIR}) @@ -70,6 +78,7 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kglobalacceld_export.h + shortcutkeystate.h kglobalacceld.h kglobalaccel_interface.h DESTINATION ${KDE_INSTALL_INCLUDEDIR}/KGlobalAccelD/ COMPONENT Devel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/component.cpp new/kglobalacceld-6.5.0/src/component.cpp --- old/kglobalacceld-6.4.5/src/component.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/component.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -9,7 +9,7 @@ #include "globalshortcutcontext.h" #include "globalshortcutsregistry.h" #include "kglobalaccel_interface.h" -#include "logging_p.h" +#include "logging.h" #include <config-kglobalaccel.h> #include <QKeySequence> @@ -49,10 +49,10 @@ return ret; } -Component::Component(const QString &uniqueName, const QString &friendlyName) +Component::Component(const QString &uniqueName, const QString &friendlyName, GlobalShortcutsRegistry *registry) : _uniqueName(uniqueName) , _friendlyName(friendlyName) - , _registry(GlobalShortcutsRegistry::self()) + , _registry(registry) { // Make sure we do no get uniquenames still containing the context Q_ASSERT(uniqueName.indexOf(QLatin1Char('|')) == -1); @@ -171,7 +171,7 @@ } } -void Component::emitGlobalShortcutPressed(const GlobalShortcut &shortcut) +void Component::emitGlobalShortcutEvent(const GlobalShortcut &shortcut, ShortcutKeyState state) { #if HAVE_X11 // pass X11 timestamp @@ -184,30 +184,24 @@ return; } - Q_EMIT globalShortcutPressed(shortcut.context()->component()->uniqueName(), shortcut.uniqueName(), timestamp); -} - -void Component::emitGlobalShortcutReleased(const GlobalShortcut &shortcut) -{ -#if HAVE_X11 - // pass X11 timestamp - const long timestamp = QX11Info::appTime(); -#else - const long timestamp = 0; -#endif - - if (shortcut.context()->component() != this) { - return; + switch (state) { + case ShortcutKeyState::Pressed: + Q_EMIT globalShortcutPressed(shortcut.context()->component()->uniqueName(), shortcut.uniqueName(), timestamp); + break; + case ShortcutKeyState::Repeated: + Q_EMIT globalShortcutRepeated(shortcut.context()->component()->uniqueName(), shortcut.uniqueName(), timestamp); + break; + case ShortcutKeyState::Released: + Q_EMIT globalShortcutReleased(shortcut.context()->component()->uniqueName(), shortcut.uniqueName(), timestamp); + break; } - - Q_EMIT globalShortcutReleased(shortcut.context()->component()->uniqueName(), shortcut.uniqueName(), timestamp); } void Component::invokeShortcut(const QString &shortcutName, const QString &context) { GlobalShortcut *shortcut = getShortcutByName(shortcutName, context); if (shortcut) { - emitGlobalShortcutPressed(*shortcut); + emitGlobalShortcutEvent(*shortcut, ShortcutKeyState::Pressed); } } @@ -279,7 +273,7 @@ Component::registerShortcut(const QString &uniqueName, const QString &friendlyName, const QString &shortcutString, const QString &defaultShortcutString) { // The shortcut will register itself with us - GlobalShortcut *shortcut = new GlobalShortcut(uniqueName, friendlyName, currentContext()); + GlobalShortcut *shortcut = new GlobalShortcut(uniqueName, friendlyName, currentContext(), _registry); const QList<QKeySequence> keys = keysFromString(shortcutString); shortcut->setDefaultKeys(keysFromString(defaultShortcutString)); @@ -299,7 +293,7 @@ return shortcut; } -void Component::loadSettings(KConfigGroup &configGroup) +void Component::loadSettings(const KConfigGroup &configGroup) { // GlobalShortcutsRegistry::loadSettings handles contexts. const auto listKeys = configGroup.keyList(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/component.h new/kglobalacceld-6.5.0/src/component.h --- old/kglobalacceld-6.4.5/src/component.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/component.h 2025-10-16 11:05:15.000000000 +0200 @@ -16,6 +16,8 @@ #include <QHash> #include <QObject> +#include "shortcutkeystate.h" + class GlobalShortcut; class GlobalShortcutContext; class GlobalShortcutsRegistry; @@ -85,7 +87,7 @@ bool isShortcutAvailable(const QKeySequence &key, const QString &component, const QString &context) const; //! Load the settings from config group @p config - virtual void loadSettings(KConfigGroup &config); + virtual void loadSettings(const KConfigGroup &config); //! Sets the human readable name for this component. void setFriendlyName(const QString &); @@ -102,7 +104,7 @@ //! Constructs a component. This is a private constructor, to create a component //! use GlobalShortcutsRegistry::self()->createComponent(). - Component(const QString &uniqueName, const QString &friendlyName); + Component(const QString &uniqueName, const QString &friendlyName, GlobalShortcutsRegistry *registry); /** * Create a new globalShortcut by its name @@ -154,8 +156,7 @@ //! Returns the shortcut contexts available for the component. Q_SCRIPTABLE QStringList getShortcutContexts() const; - virtual void emitGlobalShortcutPressed(const GlobalShortcut &shortcut); - virtual void emitGlobalShortcutReleased(const GlobalShortcut &shortcut); + virtual void emitGlobalShortcutEvent(const GlobalShortcut &shortcut, ShortcutKeyState state); Q_SCRIPTABLE void invokeShortcut(const QString &shortcutName, const QString &context = QStringLiteral("default")); @@ -164,6 +165,9 @@ //! Signals that a action for this component was triggered Q_SCRIPTABLE void globalShortcutPressed(const QString &componentUnique, const QString &shortcutUnique, qlonglong timestamp); + //! Signals that a action for this component was held + Q_SCRIPTABLE void globalShortcutRepeated(const QString &componentUnique, const QString &shortcutUnique, qlonglong timestamp); + //! Signals that a action for this component is not triggered anymore Q_SCRIPTABLE void globalShortcutReleased(const QString &componentUnique, const QString &shortcutUnique, qlonglong timestamp); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/globalshortcut.cpp new/kglobalacceld-6.5.0/src/globalshortcut.cpp --- old/kglobalacceld-6.4.5/src/globalshortcut.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/globalshortcut.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -11,20 +11,15 @@ #include "component.h" #include "globalshortcutcontext.h" #include "globalshortcutsregistry.h" -#include "logging_p.h" +#include "logging.h" #include <QKeySequence> -GlobalShortcut::GlobalShortcut() - : GlobalShortcut(QString{}, QString{}, nullptr) -{ -} - -GlobalShortcut::GlobalShortcut(const QString &uniqueName, const QString &friendlyName, GlobalShortcutContext *context) +GlobalShortcut::GlobalShortcut(const QString &uniqueName, const QString &friendlyName, GlobalShortcutContext *context, GlobalShortcutsRegistry *registry) : _isPresent(false) , _isRegistered(false) , _isFresh(true) - , _registry(GlobalShortcutsRegistry::self()) + , _registry(registry) , _context(context) , _uniqueName(uniqueName) , _friendlyName(friendlyName) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/globalshortcut.h new/kglobalacceld-6.5.0/src/globalshortcut.h --- old/kglobalacceld-6.4.5/src/globalshortcut.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/globalshortcut.h 2025-10-16 11:05:15.000000000 +0200 @@ -26,8 +26,7 @@ class GlobalShortcut { public: - GlobalShortcut(const QString &uniqueName, const QString &friendlyName, GlobalShortcutContext *context); - GlobalShortcut(); + GlobalShortcut(const QString &uniqueName, const QString &friendlyName, GlobalShortcutContext *context, GlobalShortcutsRegistry *registry); ~GlobalShortcut(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/globalshortcutsregistry.cpp new/kglobalacceld-6.5.0/src/globalshortcutsregistry.cpp --- old/kglobalacceld-6.4.5/src/globalshortcutsregistry.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/globalshortcutsregistry.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -12,7 +12,7 @@ #include "kglobalaccel_interface.h" #include "kglobalshortcutinfo_p.h" #include "kserviceactioncomponent.h" -#include "logging_p.h" +#include "logging.h" #include "sequencehelpers_p.h" #include <config-kglobalaccel.h> @@ -277,10 +277,6 @@ migrateKHotkeys(); migrateConfig(); - if (_manager) { - _manager->setEnabled(true); - } - // ksycoca database can change while refreshServices() prunes orphan shortcuts. If that happens, // call refreshServices() as a followup in the next event loop cycle. connect(KSycoca::self(), &KSycoca::databaseChanged, this, &GlobalShortcutsRegistry::scheduleRefreshServices); @@ -295,8 +291,6 @@ m_components.clear(); if (_manager) { - _manager->setEnabled(false); - // Ungrab all keys. We don't go over GlobalShortcuts because // GlobalShortcutsRegistry::self() doesn't work anymore. const auto listKeys = _active_keys.keys(); @@ -405,12 +399,6 @@ }); } -Q_GLOBAL_STATIC(GlobalShortcutsRegistry, _self) -GlobalShortcutsRegistry *GlobalShortcutsRegistry::self() -{ - return _self; -} - static void correctKeyEvent(int &keyQt) { int keyMod = keyQt & Qt::KeyboardModifierMask; @@ -435,34 +423,61 @@ keyQt = keySym | keyMod; } -bool GlobalShortcutsRegistry::keyPressed(int keyQt) +bool GlobalShortcutsRegistry::keyEvent(int keyQt, ShortcutKeyState state) { correctKeyEvent(keyQt); const int key = keyQt & ~Qt::KeyboardModifierMask; const Qt::KeyboardModifiers modifiers = static_cast<Qt::KeyboardModifiers>(keyQt & Qt::KeyboardModifierMask); + bool handled = false; switch (key) { case 0: // Invalid key code m_state = Normal; - _active_sequence = QKeySequence(); - return false; + if (state != ShortcutKeyState::Released) { + _active_sequence = QKeySequence(); + } + break; case Qt::Key_Shift: case Qt::Key_Control: case Qt::Key_Alt: case Qt::Key_Super_L: case Qt::Key_Super_R: case Qt::Key_Meta: - m_state = PressingModifierOnly; - m_currentModifiers = Utils::keyToModifier(key) | modifiers; - return false; + if (state == ShortcutKeyState::Released) { + if (m_state == PressingModifierOnly) { + m_state = ReleasingModifierOnly; + handled = processKey(m_currentModifiers, ShortcutKeyState::Pressed); + } + m_currentModifiers = modifiers & ~Utils::keyToModifier(key); + if (m_state == ReleasingModifierOnly && !m_currentModifiers) { + m_state = Normal; + } + } else { + m_state = PressingModifierOnly; + m_currentModifiers = Utils::keyToModifier(key) | modifiers; + return false; + } + break; default: m_state = Normal; - m_currentModifiers = modifiers; - return processKey(keyQt); + if (state != ShortcutKeyState::Released) { + m_currentModifiers = modifiers; + handled = processKey(keyQt, state); + } + break; } + + if (state == ShortcutKeyState::Released) { + if (m_lastShortcut) { + m_lastShortcut->context()->component()->emitGlobalShortcutEvent(*m_lastShortcut, state); + m_lastShortcut = nullptr; + } + } + + return handled; } -bool GlobalShortcutsRegistry::processKey(int keyQt) +bool GlobalShortcutsRegistry::processKey(int keyQt, ShortcutKeyState state) { int keys[maxSequenceLength] = {0, 0, 0, 0}; int count = _active_sequence.count(); @@ -528,54 +543,16 @@ data.append(shortcut->friendlyName()); if (m_lastShortcut && m_lastShortcut != shortcut) { - m_lastShortcut->context()->component()->emitGlobalShortcutReleased(*m_lastShortcut); + m_lastShortcut->context()->component()->emitGlobalShortcutEvent(*m_lastShortcut, ShortcutKeyState::Released); } // Invoke the action - shortcut->context()->component()->emitGlobalShortcutPressed(*shortcut); + shortcut->context()->component()->emitGlobalShortcutEvent(*shortcut, state); m_lastShortcut = shortcut; return true; } -bool GlobalShortcutsRegistry::keyReleased(int keyQt) -{ - correctKeyEvent(keyQt); - bool handled = false; - const int key = keyQt & ~Qt::KeyboardModifierMask; - const Qt::KeyboardModifiers modifiers = static_cast<Qt::KeyboardModifiers>(keyQt & Qt::KeyboardModifierMask); - switch (key) { - case 0: - // Invalid key code - m_state = Normal; - break; - case Qt::Key_Super_L: - case Qt::Key_Super_R: - case Qt::Key_Meta: - case Qt::Key_Shift: - case Qt::Key_Control: - case Qt::Key_Alt: { - if (m_state == PressingModifierOnly) { - m_state = ReleasingModifierOnly; - handled = processKey(m_currentModifiers); - } - m_currentModifiers = modifiers & ~Utils::keyToModifier(key); - if (m_state == ReleasingModifierOnly && !m_currentModifiers) { - m_state = Normal; - } - break; - } - default: - m_state = Normal; - break; - } - if (m_lastShortcut) { - m_lastShortcut->context()->component()->emitGlobalShortcutReleased(*m_lastShortcut); - m_lastShortcut = nullptr; - } - return handled; -} - bool GlobalShortcutsRegistry::pointerPressed(Qt::MouseButtons pointerButtons) { Q_UNUSED(pointerButtons) @@ -600,7 +577,7 @@ return (*it).get(); } - auto *c = registerComponent(ComponentPtr(new Component(uniqueName, friendlyName), &unregisterComponent)); + auto *c = registerComponent(ComponentPtr(new Component(uniqueName, friendlyName, this), &unregisterComponent)); return c; } @@ -620,7 +597,7 @@ return static_cast<KServiceActionComponent *>((*it).get()); } - auto *c = registerComponent(ComponentPtr(new KServiceActionComponent(service), &unregisterComponent)); + auto *c = registerComponent(ComponentPtr(new KServiceActionComponent(service, this), &unregisterComponent)); return static_cast<KServiceActionComponent *>(c); } @@ -645,7 +622,7 @@ service = new KService(filePath); } - auto *c = registerComponent(ComponentPtr(new KServiceActionComponent(service), &unregisterComponent)); + auto *c = registerComponent(ComponentPtr(new KServiceActionComponent(service, this), &unregisterComponent)); return static_cast<KServiceActionComponent *>(c); } @@ -675,7 +652,7 @@ // beginning. Q_ASSERT(!getComponent(groupName)); - KConfigGroup configGroup(&_config, groupName); + const KConfigGroup configGroup(&_config, groupName); const QString friendlyName = configGroup.readEntry("_k_friendly_name"); @@ -689,7 +666,7 @@ continue; } - KConfigGroup contextGroup(&configGroup, context); + const KConfigGroup contextGroup(&configGroup, context); QString contextFriendlyName = contextGroup.readEntry("_k_friendly_name"); component->createGlobalShortcutContext(context, contextFriendlyName); component->activateGlobalShortcutContext(context); @@ -711,7 +688,7 @@ // beginning. Q_ASSERT(!getComponent(groupName)); - KConfigGroup configGroup = _config.group(QStringLiteral("services")).group(groupName); + const KConfigGroup configGroup = _config.group(QStringLiteral("services")).group(groupName); Component *component = createServiceActionComponent(groupName); @@ -720,23 +697,6 @@ continue; } Q_ASSERT(!component->uniqueName().isEmpty()); - - // Now load the contexts - const auto groupList = configGroup.groupList(); - for (const QString &context : groupList) { - // Skip the friendly name group, this was previously used instead of _k_friendly_name - if (context == QLatin1String("Friendly Name")) { - continue; - } - - KConfigGroup contextGroup(&configGroup, context); - QString contextFriendlyName = contextGroup.readEntry("_k_friendly_name"); - component->createGlobalShortcutContext(context, contextFriendlyName); - component->activateGlobalShortcutContext(context); - component->loadSettings(contextGroup); - } - - // Load the default context component->activateGlobalShortcutContext(QStringLiteral("default")); component->loadSettings(configGroup); } @@ -788,27 +748,11 @@ } auto *component = createServiceActionComponent(service); - if (KConfigGroup configGroup = _config.group(QStringLiteral("services")).group(component->uniqueName()); configGroup.exists()) { - // Now load the contexts - const auto groupList = configGroup.groupList(); - for (const QString &context : groupList) { - // Skip the friendly name group, this was previously used instead of _k_friendly_name - if (context == QLatin1String("Friendly Name")) { - continue; - } - - KConfigGroup contextGroup(&configGroup, context); - QString contextFriendlyName = contextGroup.readEntry("_k_friendly_name"); - component->createGlobalShortcutContext(context, contextFriendlyName); - component->activateGlobalShortcutContext(context); - component->loadSettings(contextGroup); - } + component->activateGlobalShortcutContext(QStringLiteral("default")); - // Load the default context - component->activateGlobalShortcutContext(QStringLiteral("default")); + if (const KConfigGroup configGroup = _config.group(QStringLiteral("services")).group(component->uniqueName()); configGroup.exists()) { component->loadSettings(configGroup); } else { - component->activateGlobalShortcutContext(QStringLiteral("default")); component->loadFromService(); } } @@ -912,7 +856,7 @@ } if (shortcut && shortcut == m_lastShortcut) { - m_lastShortcut->context()->component()->emitGlobalShortcutReleased(*m_lastShortcut); + m_lastShortcut->context()->component()->emitGlobalShortcutEvent(*m_lastShortcut, ShortcutKeyState::Released); m_lastShortcut = nullptr; } @@ -975,4 +919,9 @@ detectAppsWithShortcuts(); } +KGlobalAccelInterface *GlobalShortcutsRegistry::interface() const +{ + return _manager; +} + #include "moc_globalshortcutsregistry.cpp" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/globalshortcutsregistry.h new/kglobalacceld-6.5.0/src/globalshortcutsregistry.h --- old/kglobalacceld-6.4.5/src/globalshortcutsregistry.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/globalshortcutsregistry.h 2025-10-16 11:05:15.000000000 +0200 @@ -23,6 +23,7 @@ #include <chrono> #include "kglobalaccel_export.h" +#include "shortcutkeystate.h" class Component; class GlobalShortcut; @@ -50,11 +51,6 @@ Q_CLASSINFO("D-Bus Interface", "org.kde.KdedGlobalAccel.GlobalShortcutsRegistry") public: - /** - * Use GlobalShortcutsRegistry::self() - * - * @internal - */ GlobalShortcutsRegistry(); ~GlobalShortcutsRegistry() override; @@ -116,14 +112,14 @@ */ bool isShortcutAvailable(const QKeySequence &shortcut, const QString &component, const QString &context) const; - static GlobalShortcutsRegistry *self(); - bool registerKey(const QKeySequence &key, GlobalShortcut *shortcut); void setDBusPath(const QDBusObjectPath &path); bool unregisterKey(const QKeySequence &key, GlobalShortcut *shortcut); + KGlobalAccelInterface *interface() const; + public Q_SLOTS: void clear(); @@ -159,12 +155,11 @@ // called by the implementation to inform us about key presses // returns true if the key was handled - bool keyPressed(int keyQt); - bool keyReleased(int keyQt); + bool keyEvent(int keyQt, ShortcutKeyState state); bool pointerPressed(Qt::MouseButtons pointerButtons); bool axisTriggered(int axis); - bool processKey(int keyQt); + bool processKey(int keyQt, ShortcutKeyState state); QHash<QKeySequence, GlobalShortcut *> _active_keys; QKeySequence _active_sequence; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kglobalaccel_interface.cpp new/kglobalacceld-6.5.0/src/kglobalaccel_interface.cpp --- old/kglobalacceld-6.4.5/src/kglobalaccel_interface.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kglobalaccel_interface.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -32,9 +32,9 @@ d->owner = registry; } -bool KGlobalAccelInterface::keyPressed(int keyQt) +bool KGlobalAccelInterface::keyEvent(int keyQt, ShortcutKeyState state) { - return d->owner->keyPressed(keyQt); + return d->owner->keyEvent(keyQt, state); } void KGlobalAccelInterface::grabKeys() @@ -47,11 +47,6 @@ d->owner->ungrabKeys(); } -bool KGlobalAccelInterface::keyReleased(int keyQt) -{ - return d->owner->keyReleased(keyQt); -} - bool KGlobalAccelInterface::pointerPressed(Qt::MouseButtons buttons) { return d->owner->pointerPressed(buttons); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kglobalaccel_interface.h new/kglobalacceld-6.5.0/src/kglobalaccel_interface.h --- old/kglobalacceld-6.4.5/src/kglobalaccel_interface.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kglobalaccel_interface.h 2025-10-16 11:05:15.000000000 +0200 @@ -12,6 +12,7 @@ #include <QObject> #include "kglobalacceld_export.h" +#include "shortcutkeystate.h" class GlobalShortcutsRegistry; @@ -43,11 +44,6 @@ */ virtual bool grabKey(int key, bool grab) = 0; - /* - * Enable/disable all shortcuts. There will not be any grabbed shortcuts at this point. - */ - virtual void setEnabled(bool) = 0; - void setRegistry(GlobalShortcutsRegistry *registry); protected: @@ -55,18 +51,10 @@ * called by the implementation to inform us about key presses * @returns @c true if the key was handled **/ - bool keyPressed(int keyQt); + bool keyEvent(int keyQt, ShortcutKeyState state); void grabKeys(); void ungrabKeys(); /** - * Called by the implementation to inform us about key releases - * - * @param keyQt the key that was just released - * - * @returns @c true if the key was handled - **/ - bool keyReleased(int keyQt); - /** * Called by the implementation to inform us about pointer presses * Currently only used for clearing modifier only shortcuts * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kglobalacceld.cpp new/kglobalacceld-6.5.0/src/kglobalacceld.cpp --- old/kglobalacceld-6.4.5/src/kglobalacceld.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kglobalacceld.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -15,7 +15,7 @@ #include "globalshortcutsregistry.h" #include "kglobalaccel.h" #include "kserviceactioncomponent.h" -#include "logging_p.h" +#include "logging.h" #include <QDBusConnection> #include <QDBusMetaType> @@ -57,7 +57,7 @@ //! Our holder KGlobalAccelD *q; - GlobalShortcutsRegistry *m_registry = nullptr; + std::unique_ptr<GlobalShortcutsRegistry> m_registry = nullptr; }; GlobalShortcut *KGlobalAccelDPrivate::findAction(const QStringList &actionId) const @@ -126,6 +126,11 @@ } } +KGlobalAccelInterface * ::KGlobalAccelD::interface() const +{ + return d->m_registry->interface(); +} + GlobalShortcut *KGlobalAccelDPrivate::addAction(const QStringList &actionId) { Q_ASSERT(actionId.size() >= 4); @@ -150,7 +155,10 @@ Q_ASSERT(!component->getShortcutByName(componentUnique, contextUnique)); - return new GlobalShortcut(actionId.at(KGlobalAccel::ActionUnique), actionId.at(KGlobalAccel::ActionFriendly), component->shortcutContext(contextUnique)); + return new GlobalShortcut(actionId.at(KGlobalAccel::ActionUnique), + actionId.at(KGlobalAccel::ActionFriendly), + component->shortcutContext(contextUnique), + m_registry.get()); } Q_DECLARE_METATYPE(QStringList) @@ -172,11 +180,11 @@ qDBusRegisterMetaType<QList<KGlobalShortcutInfo>>(); qDBusRegisterMetaType<KGlobalAccel::MatchType>(); - d->m_registry = GlobalShortcutsRegistry::self(); + d->m_registry = std::make_unique<GlobalShortcutsRegistry>(); Q_ASSERT(d->m_registry); d->writeoutTimer.setSingleShot(true); - connect(&d->writeoutTimer, &QTimer::timeout, d->m_registry, &GlobalShortcutsRegistry::writeSettings); + connect(&d->writeoutTimer, &QTimer::timeout, d->m_registry.get(), &GlobalShortcutsRegistry::writeSettings); if (!QDBusConnection::sessionBus().registerService(QLatin1String("org.kde.kglobalaccel"))) { qCWarning(KGLOBALACCELD) << "Failed to register service org.kde.kglobalaccel"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kglobalacceld.h new/kglobalacceld-6.5.0/src/kglobalacceld.h --- old/kglobalacceld-6.4.5/src/kglobalacceld.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kglobalacceld.h 2025-10-16 11:05:15.000000000 +0200 @@ -11,6 +11,7 @@ #include "kglobalacceld_export.h" +#include "kglobalaccel_interface.h" #include <kglobalshortcutinfo.h> #include <KGlobalAccel> @@ -48,6 +49,8 @@ bool init(); + KGlobalAccelInterface *interface() const; + public Q_SLOTS: /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kserviceactioncomponent.cpp new/kglobalacceld-6.5.0/src/kserviceactioncomponent.cpp --- old/kglobalacceld-6.4.5/src/kserviceactioncomponent.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kserviceactioncomponent.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -8,7 +8,7 @@ #include "kserviceactioncomponent.h" #include "globalshortcutcontext.h" -#include "logging_p.h" +#include "logging.h" #include <QFileInfo> @@ -45,16 +45,20 @@ return service->storageId(); } -KServiceActionComponent::KServiceActionComponent(KService::Ptr service) - : Component(makeUniqueName(service), service->name()) +KServiceActionComponent::KServiceActionComponent(KService::Ptr service, GlobalShortcutsRegistry *registry) + : Component(makeUniqueName(service), service->name(), registry) , m_service(service) { } KServiceActionComponent::~KServiceActionComponent() = default; -void KServiceActionComponent::emitGlobalShortcutPressed(const GlobalShortcut &shortcut) +void KServiceActionComponent::emitGlobalShortcutEvent(const GlobalShortcut &shortcut, ShortcutKeyState state) { + if (state != ShortcutKeyState::Pressed) { + return; + } + KIO::ApplicationLauncherJob *job = nullptr; if (shortcut.uniqueName() == QLatin1String("_launch")) { @@ -151,7 +155,7 @@ } } -void KServiceActionComponent::loadSettings(KConfigGroup &configGroup) +void KServiceActionComponent::loadSettings(const KConfigGroup &configGroup) { // Action shortcuts const auto actions = m_service->actions(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/kserviceactioncomponent.h new/kglobalacceld-6.5.0/src/kserviceactioncomponent.h --- old/kglobalacceld-6.4.5/src/kserviceactioncomponent.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/kserviceactioncomponent.h 2025-10-16 11:05:15.000000000 +0200 @@ -25,16 +25,16 @@ ~KServiceActionComponent() override; void loadFromService(); - void emitGlobalShortcutPressed(const GlobalShortcut &shortcut) override; + void emitGlobalShortcutEvent(const GlobalShortcut &shortcut, ShortcutKeyState state) override; void writeSettings(KConfigGroup &config) const override; - void loadSettings(KConfigGroup &config) override; + void loadSettings(const KConfigGroup &config) override; bool cleanUp() override; private: friend class ::GlobalShortcutsRegistry; //! Constructs a KServiceActionComponent. This is a private constuctor, to create //! a KServiceActionComponent, use GlobalShortcutsRegistry::self()->createServiceActionComponent(). - KServiceActionComponent(KService::Ptr service); + KServiceActionComponent(KService::Ptr service, GlobalShortcutsRegistry *registry); KService::Ptr m_service; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/logging.cpp new/kglobalacceld-6.5.0/src/logging.cpp --- old/kglobalacceld-6.4.5/src/logging.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/logging.cpp 1970-01-01 01:00:00.000000000 +0100 @@ -1,10 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Martin Gräßlin <[email protected]> - - SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL -*/ - -#include "logging_p.h" - -// logging category for this framework, default: log stuff >= warning -Q_LOGGING_CATEGORY(KGLOBALACCELD, "kf.globalaccel.kglobalacceld", QtWarningMsg) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/logging_p.h new/kglobalacceld-6.5.0/src/logging_p.h --- old/kglobalacceld-6.4.5/src/logging_p.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/logging_p.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,12 +0,0 @@ -/* - SPDX-FileCopyrightText: 2015 Martin Gräßlin <[email protected]> - - SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL -*/ - -#ifndef KGLOBALACCELD_LOGGING_P_H -#define KGLOBALACCELD_LOGGING_P_H -#include <QLoggingCategory> -Q_DECLARE_LOGGING_CATEGORY(KGLOBALACCELD) - -#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/main.cpp new/kglobalacceld-6.5.0/src/main.cpp --- old/kglobalacceld-6.4.5/src/main.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/main.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -9,7 +9,6 @@ #include "kglobalaccel_version.h" #include "kglobalacceld.h" -#include "logging_p.h" #include <KAboutData> #include <KCrash> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/plugins/xcb/kglobalaccel_x11.cpp new/kglobalacceld-6.5.0/src/plugins/xcb/kglobalaccel_x11.cpp --- old/kglobalacceld-6.4.5/src/plugins/xcb/kglobalaccel_x11.cpp 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/plugins/xcb/kglobalaccel_x11.cpp 2025-10-16 11:05:15.000000000 +0200 @@ -8,7 +8,7 @@ #include "kglobalaccel_x11.h" -#include "logging_p.h" +#include "logging.h" #include <KKeyServer> #include <netwm.h> @@ -185,6 +185,8 @@ m_remapTimer = new QTimer(this); m_remapTimer->setSingleShot(true); connect(m_remapTimer, &QTimer::timeout, this, &KGlobalAccelImpl::x11MappingNotify); + + qApp->installNativeEventFilter(this); } KGlobalAccelImpl::~KGlobalAccelImpl() @@ -440,7 +442,7 @@ if (NET::timestampCompare(pEvent->time, QX11Info::appTime()) > 0) { QX11Info::setAppTime(pEvent->time); } - return keyPressed(keyQt); + return keyEvent(keyQt, ShortcutKeyState::Pressed); } bool KGlobalAccelImpl::x11KeyRelease(xcb_key_release_event_t *pEvent) @@ -453,7 +455,7 @@ if (!KKeyServer::xcbKeyPressEventToQt(pEvent, &keyQt)) { return false; } - return keyReleased(keyQt); + return keyEvent(keyQt, ShortcutKeyState::Released); } bool KGlobalAccelImpl::x11ButtonPress(xcb_button_press_event_t *event) @@ -463,13 +465,4 @@ return pointerPressed(Qt::NoButton); } -void KGlobalAccelImpl::setEnabled(bool enable) -{ - if (enable && qApp->platformName() == QLatin1String("xcb")) { - qApp->installNativeEventFilter(this); - } else { - qApp->removeNativeEventFilter(this); - } -} - #include "moc_kglobalaccel_x11.cpp" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/plugins/xcb/kglobalaccel_x11.h new/kglobalacceld-6.5.0/src/plugins/xcb/kglobalaccel_x11.h --- old/kglobalacceld-6.4.5/src/plugins/xcb/kglobalaccel_x11.h 2025-09-09 10:25:13.000000000 +0200 +++ new/kglobalacceld-6.5.0/src/plugins/xcb/kglobalaccel_x11.h 2025-10-16 11:05:15.000000000 +0200 @@ -50,9 +50,6 @@ */ bool grabKey(int key, bool grab) override; - /// Enable/disable all shortcuts. There will not be any grabbed shortcuts at this point. - void setEnabled(bool) override; - bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *) override; private: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kglobalacceld-6.4.5/src/shortcutkeystate.h new/kglobalacceld-6.5.0/src/shortcutkeystate.h --- old/kglobalacceld-6.4.5/src/shortcutkeystate.h 1970-01-01 01:00:00.000000000 +0100 +++ new/kglobalacceld-6.5.0/src/shortcutkeystate.h 2025-10-16 11:05:15.000000000 +0200 @@ -0,0 +1,18 @@ +/* +This file is part of the KDE libraries + SPDX-FileCopyrightText: 2025 Ritchie Frodomar <[email protected]> + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KEYBOARDKEYSTATE_H +#define KEYBOARDKEYSTATE_H + +enum class ShortcutKeyState +{ + Pressed, + Repeated, + Released +}; + +#endif \ No newline at end of file
