TTKMusicPlayer  3.7.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 {
41  Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
42  m_key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((QtKeyCombine(shortcut[0]) ^ allMods) & QtKeyCombine(shortcut[0]));
43  m_mods = shortcut.isEmpty() ? Qt::KeyboardModifiers() : Qt::KeyboardModifiers(QtKeyCombine(shortcut[0]) & allMods);
44 
45  const quint32 nativeKey = nativeKeycode(m_key);
46  const quint32 nativeMods = nativeModifiers(m_mods);
47  const QPair<quint32, quint32> &key = qMakePair(nativeKey, nativeMods);
48 
49  if(m_shortcuts.contains(key))
50  {
51  return true;
52  }
53 
54  m_shortcuts.insert(key, ttk_q());
55  const bool res = registerShortcut(nativeKey, nativeMods);
56 
57  if(!res)
58  {
59  const QKeySequence sequence = QtKeySequence(m_key, m_mods);
60  qWarning() << "QGlobalShortcut failed to register:" << sequence.toString();
61  }
62  return res;
63 }
64 
66 {
67  const quint32 nativeKey = nativeKeycode(m_key);
68  const quint32 nativeMods = nativeModifiers(m_mods);
69  const QPair<quint32, quint32> &key = qMakePair(nativeKey, nativeMods);
70 
71  if(!m_shortcuts.contains(key))
72  {
73  m_key = Qt::Key(0);
74  m_mods = Qt::KeyboardModifiers();
75  return true;
76  }
77 
78  m_shortcuts.remove(key);
79  const bool res = unregisterShortcut(nativeKey, nativeMods);
80 
81  if(!res)
82  {
83  const QKeySequence sequence = QtKeySequence(m_key, m_mods);
84  qWarning() << "QGlobalShortcut failed to unregister:" << sequence.toString();
85  }
86 
87  m_key = Qt::Key(0);
88  m_mods = Qt::KeyboardModifiers();
89  return res;
90 }
91 
92 void QGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods)
93 {
94  QGlobalShortcut* shortcut = m_shortcuts.value(qMakePair(nativeKey, nativeMods));
95  if(shortcut && shortcut->isEnabled())
96  {
97  Q_EMIT shortcut->activated();
98  }
99 }
100 
102  : QObject(parent)
103 {
105 }
106 
107 QGlobalShortcut::QGlobalShortcut(const QKeySequence& shortcut, QObject* parent)
108  : QGlobalShortcut(parent)
109 {
110  setShortcut(shortcut);
111 }
112 
114 {
115  unsetShortcut();
116 }
117 
118 QKeySequence QGlobalShortcut::shortcut() const
119 {
121  return QKeySequence(d->m_key | d->m_mods);
122 }
123 
124 bool QGlobalShortcut::setShortcut(const QKeySequence& shortcut)
125 {
127  unsetShortcut();
128  return d->setShortcut(shortcut);
129 }
130 
132 {
134  if(d->m_key != 0)
135  {
136  d->unsetShortcut();
137  }
138 }
139 
141 {
143  return d->m_enabled;
144 }
145 
146 void QGlobalShortcut::setEnabled(bool enabled)
147 {
149  d->m_enabled = enabled;
150 }
151 
152 void QGlobalShortcut::setDisabled(bool disabled)
153 {
155  d->m_enabled = !disabled;
156 }
static quint32 nativeKeycode(Qt::Key keycode)
QGlobalShortcut * ttk_q() const
Definition: ttkprivate.h:77
bool setShortcut(const QKeySequence &shortcut)
bool setShortcut(const QKeySequence &shortcut)
static constexpr wchar_t key[]
Qt::KeyboardModifiers m_mods
static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers)
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
static void activateShortcut(quint32 nativeKey, quint32 nativeMods)
#define TTK_D(Class)
Definition: ttkprivate.h:41