From a64bdac272a1f37474576b33a7d72988e3efe80d Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sun, 8 Jul 2018 12:30:55 +0000 Subject: hotkey: fixed windows support git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8119 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/hotkey/hotkeymanager.h | 32 ++-- src/plugins/General/hotkey/hotkeymanager_win.cpp | 225 +++++++++++------------ src/plugins/General/hotkey/hotkeymanager_x11.cpp | 11 +- 3 files changed, 119 insertions(+), 149 deletions(-) (limited to 'src/plugins/General') diff --git a/src/plugins/General/hotkey/hotkeymanager.h b/src/plugins/General/hotkey/hotkeymanager.h index 16176bfe6..ec5278982 100644 --- a/src/plugins/General/hotkey/hotkeymanager.h +++ b/src/plugins/General/hotkey/hotkeymanager.h @@ -25,11 +25,11 @@ #include #include #include +#ifdef Q_OS_WIN +#include +#endif #include -class QEvent; -class QWidget; - /** @author Ilya Kotov */ @@ -54,18 +54,14 @@ public: VOLUME_MUTE }; - Hotkey() - { - action = PLAY; - key = 0; - mod = 0; - code = 0; - } - - quint32 mod; - quint32 key; - int action; - int code; + quint32 mod = 0; + quint32 key = 0; + int action = PLAY; + int code = 0; +#ifdef Q_OS_WIN + UINT mods = 0; + WPARAM id = 0; +#endif quint32 defaultKey(); static quint32 defaultKey(int act); }; @@ -84,13 +80,7 @@ public: private: bool nativeEventFilter(const QByteArray &eventType, void *message, long *result); -#ifdef QMMP_WS_X11 QList m_grabbedKeys; -#endif - -#ifdef Q_OS_WIN - QList m_filters; -#endif }; #endif diff --git a/src/plugins/General/hotkey/hotkeymanager_win.cpp b/src/plugins/General/hotkey/hotkeymanager_win.cpp index 3992c14b9..2338690d7 100644 --- a/src/plugins/General/hotkey/hotkeymanager_win.cpp +++ b/src/plugins/General/hotkey/hotkeymanager_win.cpp @@ -21,10 +21,6 @@ #include #ifdef Q_OS_WIN #include -#include -#include -#include -#include #include #include #include @@ -97,117 +93,9 @@ quint32 Hotkey::defaultKey(int act) return keyMap[act]; } -class KeyFilter : public QAbstractNativeEventFilter -{ -public: - KeyFilter(const Hotkey &hotkey) : QAbstractNativeEventFilter() - { - m_hotkey = hotkey; - m_mods = 0; - m_id = 0; - - if(m_hotkey.mod & HOTKEYF_CONTROL) - m_mods |= MOD_CONTROL; - if(m_hotkey.mod & HOTKEYF_SHIFT) - m_mods |= MOD_SHIFT; - if(m_hotkey.mod & HOTKEYF_ALT) - m_mods |= MOD_ALT; - if(m_hotkey.mod & HOTKEYF_EXT) - m_mods |= MOD_WIN; - - - if(RegisterHotKey(NULL, m_mods^m_hotkey.key, m_mods, m_hotkey.key)) - { - m_id = m_mods^m_hotkey.key; - qDebug("KeyFilterWidget: registered key=0x%x, mod=0x%x", hotkey.key, m_mods); - } - else - qWarning("KeyFilterWidget: unable to register key=0x%x, mod=0x%x", hotkey.key, m_mods); - - qApp->installNativeEventFilter(this); - } - - virtual ~KeyFilter() - { - qApp->removeNativeEventFilter(this); - if(m_id) - UnregisterHotKey(NULL, m_id); - } - - bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) - { - Q_UNUSED(eventType); - Q_UNUSED(result); - MSG* m = static_cast(message); - if (m->message == WM_HOTKEY && m->wParam == m_id) - { - SoundCore *core = SoundCore::instance(); - MediaPlayer *player = MediaPlayer::instance(); - qDebug("KeyFilterWidget: [%s] pressed", - qPrintable(HotkeyManager::getKeyString(m_hotkey.key, m_hotkey.mod))); - - switch (m_hotkey.action) - { - case Hotkey::PLAY: - player->play(); - break; - case Hotkey::STOP: - player->stop(); - break; - case Hotkey::PAUSE: - core->pause(); - break; - case Hotkey::PLAY_PAUSE: - if (core->state() == Qmmp::Stopped) - player->play(); - else if (core->state() != Qmmp::FatalError) - core->pause(); - break; - case Hotkey::NEXT: - player->next(); - break; - case Hotkey::PREVIOUS: - player->previous(); - break; - case Hotkey::SHOW_HIDE: - UiHelper::instance()->toggleVisibility(); - break; - case Hotkey::VOLUME_UP: - core->volumeUp(); - break; - case Hotkey::VOLUME_DOWN: - core->volumeDown(); - break; - case Hotkey::FORWARD: - core->seek(core->elapsed() + 5000); - break; - case Hotkey::REWIND: - core->seek(qMax(qint64(0), core->elapsed() - 5000)); - break; - case Hotkey::JUMP_TO_TRACK: - UiHelper::instance()->jumpToTrack(); - break; - case Hotkey::VOLUME_MUTE: - SoundCore::instance()->setMuted(!SoundCore::instance()->isMuted()); - break; - } - qApp->processEvents(); - return true; - } - return false; - } - -private: - Hotkey m_hotkey; - UINT m_mods; - WPARAM m_id; -}; - HotkeyManager::HotkeyManager(QObject *parent) : QObject(parent) { - QCoreApplication::instance()->installEventFilter(this); - - + qApp->installNativeEventFilter(this); QSettings settings(Qmmp::configFile(), QSettings::IniFormat); //load settings settings.beginGroup("Hotkey"); for (int i = Hotkey::PLAY; i <= Hotkey::JUMP_TO_TRACK; ++i) @@ -217,14 +105,34 @@ HotkeyManager::HotkeyManager(QObject *parent) : QObject(parent) if (key) { - Hotkey hotkey; - hotkey.action = i; - hotkey.key = key; - hotkey.code = MapVirtualKey(key, 0); - hotkey.mod = mod; + Hotkey *hotkey = new Hotkey; + hotkey->action = i; + hotkey->key = key; + hotkey->code = MapVirtualKey(key, 0); + hotkey->mod = mod; + + if(hotkey->mod & HOTKEYF_CONTROL) + hotkey->mods |= MOD_CONTROL; + if(hotkey->mod & HOTKEYF_SHIFT) + hotkey->mods |= MOD_SHIFT; + if(hotkey->mod & HOTKEYF_ALT) + hotkey->mods |= MOD_ALT; + if(hotkey->mod & HOTKEYF_EXT) + hotkey->mods |= MOD_WIN; + + hotkey->id = hotkey->mods^hotkey->key; + + if(RegisterHotKey(NULL, hotkey->id, hotkey->mods, hotkey->key)) + { + qDebug("HotkeyManager: registered key=0x%x, mod=0x%x", hotkey->key, hotkey->mods); + } + else + { + hotkey->id = 0; + qWarning("HotkeyManager: unable to register key=0x%x, mod=0x%x", hotkey->key, hotkey->mods); + } - KeyFilter *filerWidget = new KeyFilter(hotkey); - m_filters << filerWidget; + m_grabbedKeys << hotkey; } } settings.endGroup(); @@ -232,7 +140,14 @@ HotkeyManager::HotkeyManager(QObject *parent) : QObject(parent) HotkeyManager::~HotkeyManager() { - qDeleteAll(m_filters); + qApp->removeNativeEventFilter(this); + while(!m_grabbedKeys.isEmpty()) + { + Hotkey *key = m_grabbedKeys.takeFirst (); + if(key->id) + UnregisterHotKey(NULL, key->id); + delete key; + } } const QString HotkeyManager::getKeyString(quint32 key, quint32 modifiers) @@ -302,6 +217,74 @@ quint32 HotkeyManager::keycodeToKeysym(quint32 keycode) return MapVirtualKey(keycode, 1); } +bool HotkeyManager::nativeEventFilter(const QByteArray &eventType, void *message, long *result) +{ + Q_UNUSED(eventType); + Q_UNUSED(result); + MSG *m = static_cast(message); + if (m->message == WM_HOTKEY) + { + qDebug("++"); + SoundCore *core = SoundCore::instance(); + MediaPlayer *player = MediaPlayer::instance(); + foreach(Hotkey *hotkey, m_grabbedKeys) + { + if(hotkey->id != m->wParam) + continue; + + qDebug("KeyFilterWidget: [%s] pressed", + qPrintable(HotkeyManager::getKeyString(hotkey->key, hotkey->mod))); + + switch (hotkey->action) + { + case Hotkey::PLAY: + player->play(); + break; + case Hotkey::STOP: + player->stop(); + break; + case Hotkey::PAUSE: + core->pause(); + break; + case Hotkey::PLAY_PAUSE: + if (core->state() == Qmmp::Stopped) + player->play(); + else if (core->state() != Qmmp::FatalError) + core->pause(); + break; + case Hotkey::NEXT: + player->next(); + break; + case Hotkey::PREVIOUS: + player->previous(); + break; + case Hotkey::SHOW_HIDE: + UiHelper::instance()->toggleVisibility(); + break; + case Hotkey::VOLUME_UP: + core->volumeUp(); + break; + case Hotkey::VOLUME_DOWN: + core->volumeDown(); + break; + case Hotkey::FORWARD: + core->seek(core->elapsed() + 5000); + break; + case Hotkey::REWIND: + core->seek(qMax(qint64(0), core->elapsed() - 5000)); + break; + case Hotkey::JUMP_TO_TRACK: + UiHelper::instance()->jumpToTrack(); + break; + case Hotkey::VOLUME_MUTE: + SoundCore::instance()->setMuted(!SoundCore::instance()->isMuted()); + break; + } + } + } + return false; +} + #include "moc_hotkeymanager.cpp" #endif diff --git a/src/plugins/General/hotkey/hotkeymanager_x11.cpp b/src/plugins/General/hotkey/hotkeymanager_x11.cpp index 0e1fab263..4775102df 100644 --- a/src/plugins/General/hotkey/hotkeymanager_x11.cpp +++ b/src/plugins/General/hotkey/hotkeymanager_x11.cpp @@ -112,15 +112,14 @@ HotkeyManager::HotkeyManager(QObject *parent) : QObject(parent) HotkeyManager::~HotkeyManager() { - if(qApp && qApp->eventDispatcher()) - qApp->removeNativeEventFilter(this); - foreach(Hotkey *key, m_grabbedKeys) + qApp->removeNativeEventFilter(this); + while(!m_grabbedKeys.isEmpty()) { + Hotkey *key = m_grabbedKeys.takeFirst (); if(key->code) XUngrabKey(QX11Info::display(), key->code, key->mod, QX11Info::appRootWindow()); + delete key; } - while (!m_grabbedKeys.isEmpty()) - delete m_grabbedKeys.takeFirst (); } const QString HotkeyManager::getKeyString(quint32 key, quint32 modifiers) @@ -200,9 +199,7 @@ bool HotkeyManager::nativeEventFilter(const QByteArray &eventType, void *message case Hotkey::VOLUME_MUTE: SoundCore::instance()->setMuted(!SoundCore::instance()->isMuted()); break; - } - } } return false; -- cgit v1.2.3-13-gbd6f