File indexing completed on 2024-04-28 05:52:14

0001 // SPDX-License-Identifier: LGPL-2.1-only
0002 
0003 #pragma once
0004 
0005 #include <QObject>
0006 #include <QMultiHash>
0007 #include <QAbstractNativeEventFilter>
0008 #include <QKeySequence>
0009 
0010 class QGlobalShortcut : public QObject {
0011     Q_OBJECT
0012     Q_PROPERTY(QKeySequence key READ key WRITE setKey)
0013     //Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
0014 private:
0015 
0016     class QGlobalShortcutEventFilter : public QAbstractNativeEventFilter {
0017     public:
0018         bool nativeEventFilter(const QByteArray& eventType, void* message, long* result);
0019     };
0020 
0021 public:
0022     explicit QGlobalShortcut(QObject* parent = nullptr);
0023     explicit QGlobalShortcut(const QKeySequence& keyseq, QObject* parent = nullptr);
0024     ~QGlobalShortcut();
0025     bool nativeEventFilter(const QByteArray& event_type, void* message, long* result);
0026 
0027     QKeySequence key() const;
0028     void setKey(const QKeySequence& keyseq);
0029     //bool isEnabled() const;    void setEnabled(bool on);
0030 
0031 signals:
0032     void activated();
0033 
0034 private:
0035     QKeySequence keyseq_;
0036     void unsetKey();
0037     void initialize();
0038 
0039 private:
0040     static QGlobalShortcutEventFilter global_shortcut_event_;
0041     /* quint32           keyid
0042        QGlobalShortcut*  shortcut */
0043     static QMultiHash<quint32, QGlobalShortcut*> shortcuts_;
0044     static bool activate(quint32 id);
0045     static quint32 calcId(const QKeySequence& keyseq);
0046     static quint32 calcId(quint32 k, quint32 m);
0047     static Qt::Key getKey(const QKeySequence& keyseq);
0048     static Qt::KeyboardModifiers getMods(const QKeySequence& keyseq);
0049     static quint32 toNativeKeycode(Qt::Key k);
0050     static quint32 toNativeModifiers(Qt::KeyboardModifiers m);
0051     static void registerKey(quint32 k, quint32 m, quint32 id);
0052     static void unregisterKey(quint32 k, quint32 m, quint32 id);
0053 };