File indexing completed on 2024-12-08 03:39:24
0001 /* 0002 This file is part of the KDE libraries 0003 SPDX-FileCopyrightText: 2001, 2002 Ellis Whitehead <ellis@kde.org> 0004 SPDX-FileCopyrightText: 2006 Hamish Rodda <rodda@kde.org> 0005 SPDX-FileCopyrightText: 2007 Andreas Hartmetz <ahartmetz@gmail.com> 0006 0007 SPDX-License-Identifier: LGPL-2.0-or-later 0008 */ 0009 0010 #ifndef KGLOBALACCEL_P_H 0011 #define KGLOBALACCEL_P_H 0012 0013 #include <QHash> 0014 #include <QKeySequence> 0015 #include <QList> 0016 #include <QStringList> 0017 0018 #include "kglobalaccel.h" 0019 #include "kglobalaccel_component_interface.h" 0020 #include "kglobalaccel_interface.h" 0021 0022 enum SetShortcutFlag { 0023 SetPresent = 2, 0024 NoAutoloading = 4, 0025 IsDefault = 8, 0026 }; 0027 0028 class KGlobalAccelPrivate 0029 { 0030 public: 0031 enum ShortcutType { 0032 /// The shortcut will immediately become active but may be reset to "default". 0033 ActiveShortcut = 0x1, 0034 /// The shortcut is a default shortcut - it becomes active when somebody decides to 0035 /// reset shortcuts to default. 0036 DefaultShortcut = 0x2, 0037 }; 0038 0039 Q_DECLARE_FLAGS(ShortcutTypes, ShortcutType) 0040 enum Removal { 0041 SetInactive = 0, ///< Forget the action in this class and mark it as not present in the KDED module 0042 UnRegister, ///< Remove any trace of the action in this class and in the KDED module 0043 }; 0044 KGlobalAccelPrivate(KGlobalAccel *); 0045 0046 /// Propagate any shortcut changes to the KDED module that does the bookkeeping 0047 /// and the key grabbing. 0048 ///@todo KF6 0049 void updateGlobalShortcut(/*const would be better*/ QAction *action, 0050 KGlobalAccelPrivate::ShortcutTypes actionFlags, 0051 KGlobalAccel::GlobalShortcutLoading globalFlags); 0052 0053 /// Register the action in this class and in the KDED module 0054 bool doRegister(QAction *action); //"register" is a C keyword :p 0055 /// cf. the RemoveAction enum 0056 void remove(QAction *action, Removal r); 0057 0058 //"private" helpers 0059 QString componentUniqueForAction(const QAction *action); 0060 QString componentFriendlyForAction(const QAction *action); 0061 QStringList makeActionId(const QAction *action); 0062 QList<int> intListFromShortcut(const QList<QKeySequence> &cut); 0063 QList<QKeySequence> shortcutFromIntList(const QList<int> &list); 0064 0065 void cleanup(); 0066 0067 // private slot implementations 0068 QAction *findAction(const QString &, const QString &); 0069 void invokeAction(const QString &, const QString &, qlonglong); 0070 void invokeDeactivate(const QString &, const QString &); 0071 void shortcutGotChanged(const QStringList &, const QList<int> &); 0072 void shortcutsChanged(const QStringList &, const QList<QKeySequence> &); 0073 void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); 0074 void reRegisterAll(); 0075 0076 // for all actions with (isEnabled() && globalShortcutAllowed()) 0077 QMultiHash<QString, QAction *> nameToAction; 0078 QSet<QAction *> actions; 0079 0080 org::kde::KGlobalAccel *iface(); 0081 0082 //! Get the component @p componentUnique. If @p remember is true the instance is cached and we 0083 //! subscribe to signals about changes to the component. 0084 org::kde::kglobalaccel::Component *getComponent(const QString &componentUnique, bool remember); 0085 0086 //! Our owner 0087 KGlobalAccel *q; 0088 0089 //! The components the application is using 0090 QHash<QString, org::kde::kglobalaccel::Component *> components; 0091 QMap<const QAction *, QList<QKeySequence>> actionDefaultShortcuts; 0092 QMap<const QAction *, QList<QKeySequence>> actionShortcuts; 0093 0094 bool setShortcutWithDefault(QAction *action, const QList<QKeySequence> &shortcut, KGlobalAccel::GlobalShortcutLoading loadFlag); 0095 0096 void unregister(const QStringList &actionId); 0097 void setInactive(const QStringList &actionId); 0098 0099 private: 0100 org::kde::KGlobalAccel *m_iface = nullptr; 0101 QPointer<QAction> m_lastActivatedAction; 0102 QDBusServiceWatcher *m_watcher; 0103 }; 0104 0105 Q_DECLARE_OPERATORS_FOR_FLAGS(KGlobalAccelPrivate::ShortcutTypes) 0106 0107 #endif