TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
qglobalshortcut.cpp
Go to the documentation of this file.
1 #include "qglobalshortcut_p.h"
2 
5 
6 #if !TTK_QT_VERSION_CHECK(5,0,0)
7 QAbstractEventDispatcher::EventFilter QGlobalShortcutPrivate::m_prevEventFilter = 0;
8 #endif
9 
10 QHash<QPair<quint32, quint32>, QGlobalShortcut*> QGlobalShortcutPrivate::m_shortcuts;
11 
13  : m_enabled(true),
14  m_key(Qt::Key(0)),
15  m_mods(Qt::NoModifier)
16 {
17  if(!m_ref++)
18  {
19 #if !TTK_QT_VERSION_CHECK(5,0,0)
20  m_prevEventFilter = QAbstractEventDispatcher::instance()->setEventFilter(eventFilter);
21 #else
22  QAbstractEventDispatcher::instance()->installNativeEventFilter(this);
23 #endif
24  }
25 }
26 
28 {
29  if(!--m_ref && QAbstractEventDispatcher::instance())
30  {
31 #if !TTK_QT_VERSION_CHECK(5,0,0)
32  QAbstractEventDispatcher::instance()->setEventFilter(m_prevEventFilter);
33 #else
34  QAbstractEventDispatcher::instance()->removeNativeEventFilter(this);
35 #endif
36  }
37 }
38 
39 bool QGlobalShortcutPrivate::setShortcut(const QKeySequence &shortcut)
40 {
42  Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
43  m_key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((QtKeyCombine(shortcut[0]) ^ allMods) & QtKeyCombine(shortcut[0]));
44  m_mods = shortcut.isEmpty() ? Qt::KeyboardModifiers() : Qt::KeyboardModifiers(QtKeyCombine(shortcut[0]) & allMods);
45 
46  const quint32 nativeKey = nativeKeycode(m_key);
47  const quint32 nativeMods = nativeModifiers(m_mods);
48  const QPair<quint32, quint32> &key = qMakePair(nativeKey, nativeMods);
49 
50  if(m_shortcuts.contains(key))
51  {
52  return true;
53  }
54 
55  m_shortcuts.insert(key, q);
56  const bool res = registerShortcut(nativeKey, nativeMods);
57 
58  if(!res)
59  {
60  const QKeySequence sequence = QtKeySequence(m_key, m_mods);
61  qWarning() << "QGlobalShortcut failed to register:" << sequence.toString();
62  }
63  return res;
64 }
65 
67 {
68  const quint32 nativeKey = nativeKeycode(m_key);
69  const quint32 nativeMods = nativeModifiers(m_mods);
70  const QPair<quint32, quint32> &key = qMakePair(nativeKey, nativeMods);
71 
72  if(!m_shortcuts.contains(key))
73  {
74  m_key = Qt::Key(0);
75  m_mods = Qt::KeyboardModifiers();
76  return true;
77  }
78 
79  m_shortcuts.remove(key);
80  const bool res = unregisterShortcut(nativeKey, nativeMods);
81 
82  if(!res)
83  {
84  const QKeySequence sequence = QtKeySequence(m_key, m_mods);
85  qWarning() << "QGlobalShortcut failed to unregister:" << sequence.toString();
86  }
87 
88  m_key = Qt::Key(0);
89  m_mods = Qt::KeyboardModifiers();
90  return res;
91 }
92 
93 void QGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods)
94 {
95  QGlobalShortcut* shortcut = m_shortcuts.value(qMakePair(nativeKey, nativeMods));
96  if(shortcut && shortcut->isEnabled())
97  {
98  Q_EMIT shortcut->activated();
99  }
100 }
101 
103  : QObject(parent)
104 {
106 }
107 
108 QGlobalShortcut::QGlobalShortcut(const QKeySequence& shortcut, QObject* parent)
109  : QGlobalShortcut(parent)
110 {
111  setShortcut(shortcut);
112 }
113 
115 {
116  unsetShortcut();
117 }
118 
119 QKeySequence QGlobalShortcut::shortcut() const
120 {
121  TTK_D(const QGlobalShortcut);
122  return QKeySequence(d->m_key | d->m_mods);
123 }
124 
125 bool QGlobalShortcut::setShortcut(const QKeySequence& shortcut)
126 {
128  unsetShortcut();
129  return d->setShortcut(shortcut);
130 }
131 
133 {
135  if(d->m_key != 0)
136  {
137  d->unsetShortcut();
138  }
139 }
140 
142 {
143  TTK_D(const QGlobalShortcut);
144  return d->m_enabled;
145 }
146 
147 void QGlobalShortcut::setEnabled(bool enabled)
148 {
150  d->m_enabled = enabled;
151 }
152 
153 void QGlobalShortcut::setDisabled(bool disabled)
154 {
156  d->m_enabled = !disabled;
157 }
static quint32 nativeKeycode(Qt::Key keycode)
bool setShortcut(const QKeySequence &shortcut)
bool setShortcut(const QKeySequence &shortcut)
The namespace of the string literals.
Qt::KeyboardModifiers m_mods
static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers)
static constexpr wchar_t key[]
static QAbstractEventDispatcher::EventFilter m_prevEventFilter
void setEnabled(bool enabled=true)
QGlobalShortcut(QObject *parent=nullptr)
static bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods)
#define QtKeySequence(k, m)
KeySequence.
Definition: ttkqtcompat.h:174
The class of the qglobal shortcut.
static bool eventFilter(void *message)
static bool registerShortcut(quint32 nativeKey, quint32 nativeMods)
#define TTK_INIT_PRIVATE(Class)
Definition: ttkprivate.h:33
#define QtKeyCombine(p)
KeySequence data.
Definition: ttkqtcompat.h:181
void setDisabled(bool disabled=true)
QKeySequence shortcut() const
bool isEnabled() const
static QHash< QPair< quint32, quint32 >, QGlobalShortcut * > m_shortcuts
#define TTK_Q(Class)
Definition: ttkprivate.h:42
static void activateShortcut(quint32 nativeKey, quint32 nativeMods)
#define TTK_D(Class)
Definition: ttkprivate.h:41