diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-07-08 12:30:55 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2018-07-08 12:30:55 +0000 |
| commit | a64bdac272a1f37474576b33a7d72988e3efe80d (patch) | |
| tree | b04ea1c01bfdc60e91fc4588afb99287e8734840 /src/plugins/General | |
| parent | 4149f5a659c6ee7c150d1ed7176127a5518bce32 (diff) | |
| download | qmmp-a64bdac272a1f37474576b33a7d72988e3efe80d.tar.gz qmmp-a64bdac272a1f37474576b33a7d72988e3efe80d.tar.bz2 qmmp-a64bdac272a1f37474576b33a7d72988e3efe80d.zip | |
hotkey: fixed windows support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@8119 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General')
| -rw-r--r-- | src/plugins/General/hotkey/hotkeymanager.h | 32 | ||||
| -rw-r--r-- | src/plugins/General/hotkey/hotkeymanager_win.cpp | 225 | ||||
| -rw-r--r-- | src/plugins/General/hotkey/hotkeymanager_x11.cpp | 11 |
3 files changed, 119 insertions, 149 deletions
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 <QTableWidgetItem> #include <QList> #include <QAbstractNativeEventFilter> +#ifdef Q_OS_WIN +#include <windows.h> +#endif #include <qmmpui/general.h> -class QEvent; -class QWidget; - /** @author Ilya Kotov <forkotov02@ya.ru> */ @@ -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 <Hotkey *> m_grabbedKeys; -#endif - -#ifdef Q_OS_WIN - QList<QAbstractNativeEventFilter *> 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 <QtGlobal>
#ifdef Q_OS_WIN
#include <QSettings>
-#include <QEvent>
-#include <QKeyEvent>
-#include <QCoreApplication>
-#include <QAbstractNativeEventFilter>
#include <QApplication>
#include <windows.h>
#include <winuser.h>
@@ -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<MSG*>(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<MSG*>(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; |
