Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F104035
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
27 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/hotkeymap.h b/hotkeymap.h
index 868c7b7..9e1de50 100644
--- a/hotkeymap.h
+++ b/hotkeymap.h
@@ -1,149 +1,271 @@
#include <QtCore>
#if defined(Q_OS_WIN)
-inline size_t QtKeyToWin(size_t key) {
- // TODO: other maping or full keys list
+inline size_t QtKeyToWin(Qt::Key key)
+{
+ switch ((Qt::Key)key) {
+ case Qt::Key_Escape:
+ return VK_ESCAPE;
+ case Qt::Key_Tab:
+ case Qt::Key_Backtab:
+ return VK_TAB;
+ case Qt::Key_Backspace:
+ return VK_BACK;
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ return VK_RETURN;
+ case Qt::Key_Insert:
+ return VK_INSERT;
+ case Qt::Key_Delete:
+ return VK_DELETE;
+ case Qt::Key_Pause:
+ return VK_PAUSE;
+ case Qt::Key_Print:
+ return VK_SNAPSHOT;
+ case Qt::Key_Clear:
+ return VK_CLEAR;
+ case Qt::Key_Home:
+ return VK_HOME;
+ case Qt::Key_End:
+ return VK_END;
+ case Qt::Key_Left:
+ return VK_LEFT;
+ case Qt::Key_Up:
+ return VK_UP;
+ case Qt::Key_Right:
+ return VK_RIGHT;
+ case Qt::Key_Down:
+ return VK_DOWN;
+ case Qt::Key_PageUp:
+ return VK_PRIOR;
+ case Qt::Key_PageDown:
+ return VK_NEXT;
+ case Qt::Key_F1:
+ return VK_F1;
+ case Qt::Key_F2:
+ return VK_F2;
+ case Qt::Key_F3:
+ return VK_F3;
+ case Qt::Key_F4:
+ return VK_F4;
+ case Qt::Key_F5:
+ return VK_F5;
+ case Qt::Key_F6:
+ return VK_F6;
+ case Qt::Key_F7:
+ return VK_F7;
+ case Qt::Key_F8:
+ return VK_F8;
+ case Qt::Key_F9:
+ return VK_F9;
+ case Qt::Key_F10:
+ return VK_F10;
+ case Qt::Key_F11:
+ return VK_F11;
+ case Qt::Key_F12:
+ return VK_F12;
+ case Qt::Key_F13:
+ return VK_F13;
+ case Qt::Key_F14:
+ return VK_F14;
+ case Qt::Key_F15:
+ return VK_F15;
+ case Qt::Key_F16:
+ return VK_F16;
+ case Qt::Key_F17:
+ return VK_F17;
+ case Qt::Key_F18:
+ return VK_F18;
+ case Qt::Key_F19:
+ return VK_F19;
+ case Qt::Key_F20:
+ return VK_F20;
+ case Qt::Key_F21:
+ return VK_F21;
+ case Qt::Key_F22:
+ return VK_F22;
+ case Qt::Key_F23:
+ return VK_F23;
+ case Qt::Key_F24:
+ return VK_F24;
+ case Qt::Key_Space:
+ return VK_SPACE;
+ case Qt::Key_Asterisk:
+ return VK_MULTIPLY;
+ case Qt::Key_Plus:
+ return VK_ADD;
+ case Qt::Key_Comma:
+ return VK_SEPARATOR;
+ case Qt::Key_Minus:
+ return VK_SUBTRACT;
+ case Qt::Key_Slash:
+ return VK_DIVIDE;
+ case Qt::Key_MediaNext:
+ return VK_MEDIA_NEXT_TRACK;
+ case Qt::Key_MediaPrevious:
+ return VK_MEDIA_PREV_TRACK;
+ case Qt::Key_MediaPlay:
+ return VK_MEDIA_PLAY_PAUSE;
+ case Qt::Key_MediaStop:
+ return VK_MEDIA_STOP;
+ case Qt::Key_VolumeDown:
+ return VK_VOLUME_DOWN;
+ case Qt::Key_VolumeUp:
+ return VK_VOLUME_UP;
+ case Qt::Key_VolumeMute:
+ return VK_VOLUME_MUTE;
+ }
if (key >= 0x01000030 && key <= 0x01000047) {
return VK_F1 + (key - Qt::Key_F1);
}
return key;
}
#elif defined(Q_OS_LINUX)
#include "ukeysequence.h"
#include "xcb/xcb.h"
#include "xcb/xcb_keysyms.h"
#include "X11/keysym.h"
struct UKeyData {
int key;
int mods;
};
inline UKeyData QtKeyToLinux(const UKeySequence &keySeq)
{
UKeyData data = {0, 0};
auto key = keySeq.GetSimpleKeys();
- if (key.size() > 0)
+ if (key.size() > 0) {
data.key = key[0];
- else
- throw UException("Invalid hotkey");
+ } else {
+ qWarning() << "Invalid hotkey";
+ return data;
+ }
// Key conversion
// Qt's F keys need conversion
if (data.key >= Qt::Key_F1 && data.key <= Qt::Key_F35) {
const size_t DIFF = Qt::Key_F1 - XK_F1;
data.key -= DIFF;
} else if (data.key >= Qt::Key_Space && data.key <= Qt::Key_QuoteLeft) {
// conversion is not necessary, if the value in the range Qt::Key_Space - Qt::Key_QuoteLeft
} else {
- throw UException("Invalid hotkey: key conversion is not defined");
+ qWarning() << "Invalid hotkey: key conversion is not defined");
+ return data;
}
// Modifiers conversion
auto mods = keySeq.GetModifiers();
for (auto i : mods) {
if (i == Qt::Key_Shift)
data.mods |= XCB_MOD_MASK_SHIFT;
else if (i == Qt::Key_Control)
data.mods |= XCB_MOD_MASK_CONTROL;
else if (i == Qt::Key_Alt)
data.mods |= XCB_MOD_MASK_1;
else if (i == Qt::Key_Meta)
data.mods |= XCB_MOD_MASK_4; // !
}
return data;
}
#elif defined(Q_OS_MAC)
#include "ukeysequence.h"
#include <Carbon/Carbon.h>
#include <unordered_map>
struct UKeyData {
uint32_t key;
uint32_t mods;
};
static std::unordered_map<uint32_t, uint32_t> KEY_MAP = {
{Qt::Key_A, kVK_ANSI_A},
{Qt::Key_B, kVK_ANSI_B},
{Qt::Key_C, kVK_ANSI_C},
{Qt::Key_D, kVK_ANSI_D},
{Qt::Key_E, kVK_ANSI_E},
{Qt::Key_F, kVK_ANSI_F},
{Qt::Key_G, kVK_ANSI_G},
{Qt::Key_H, kVK_ANSI_H},
{Qt::Key_I, kVK_ANSI_I},
{Qt::Key_J, kVK_ANSI_J},
{Qt::Key_K, kVK_ANSI_K},
{Qt::Key_L, kVK_ANSI_L},
{Qt::Key_M, kVK_ANSI_M},
{Qt::Key_N, kVK_ANSI_N},
{Qt::Key_O, kVK_ANSI_O},
{Qt::Key_P, kVK_ANSI_P},
{Qt::Key_Q, kVK_ANSI_Q},
{Qt::Key_R, kVK_ANSI_R},
{Qt::Key_S, kVK_ANSI_S},
{Qt::Key_T, kVK_ANSI_T},
{Qt::Key_U, kVK_ANSI_U},
{Qt::Key_V, kVK_ANSI_V},
{Qt::Key_W, kVK_ANSI_W},
{Qt::Key_X, kVK_ANSI_X},
{Qt::Key_Y, kVK_ANSI_Y},
{Qt::Key_Z, kVK_ANSI_Z},
{Qt::Key_0, kVK_ANSI_0},
{Qt::Key_1, kVK_ANSI_1},
{Qt::Key_2, kVK_ANSI_2},
{Qt::Key_3, kVK_ANSI_3},
{Qt::Key_4, kVK_ANSI_4},
{Qt::Key_5, kVK_ANSI_5},
{Qt::Key_6, kVK_ANSI_6},
{Qt::Key_7, kVK_ANSI_7},
{Qt::Key_8, kVK_ANSI_8},
{Qt::Key_9, kVK_ANSI_9},
{Qt::Key_F1, kVK_F1},
{Qt::Key_F2, kVK_F2},
{Qt::Key_F3, kVK_F3},
{Qt::Key_F4, kVK_F4},
{Qt::Key_F5, kVK_F5},
{Qt::Key_F6, kVK_F6},
{Qt::Key_F7, kVK_F7},
{Qt::Key_F8, kVK_F8},
{Qt::Key_F9, kVK_F9},
{Qt::Key_F10, kVK_F10},
{Qt::Key_F11, kVK_F11},
{Qt::Key_F12, kVK_F12},
{Qt::Key_F13, kVK_F13},
{Qt::Key_F14, kVK_F14},
+ {Qt::Key_Print, kVK_F14},
};
static std::unordered_map<uint32_t, uint32_t> MOD_MAP = {
{Qt::Key_Shift, shiftKey},
{Qt::Key_Alt, optionKey},
{Qt::Key_Control, controlKey},
{Qt::Key_Option, optionKey},
{Qt::Key_Meta, cmdKey},
};
-inline UKeyData QtKeyToMac(const UKeySequence &keySeq) {
+inline UKeyData QtKeyToMac(const UKeySequence &keySeq)
+{
UKeyData data = {0, 0};
auto key = keySeq.GetSimpleKeys();
auto mods = keySeq.GetModifiers();
- if (key.size() == 1 && KEY_MAP.find(key[0]) != KEY_MAP.end())
+
+ if (key.size() == 1 && KEY_MAP.find(key[0]) != KEY_MAP.end()) {
data.key = KEY_MAP[key[0]];
- else
- throw UException("Invalid hotkey");
- for (auto&& mod: mods) {
+ } else {
+ qWarning() << "Invalid hotkey";
+ return data;
+ }
+
+ for (auto && mod : mods) {
if (MOD_MAP.find(mod) == MOD_MAP.end())
- throw UException("Invalid hotkey");
+ return data;
+
data.mods += MOD_MAP[mod];
}
return data;
}
#endif
diff --git a/uexception.cpp b/uexception.cpp
deleted file mode 100644
index e29107a..0000000
--- a/uexception.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-#include "uexception.h"
-
-UException::UException(const QString& message) throw()
- : Message(message.toLocal8Bit())
-{
-}
-
-UException::~UException() throw () {
-}
-
-const char* UException::what() const throw () {
- return Message.data();
-}
diff --git a/uexception.h b/uexception.h
deleted file mode 100644
index c580b90..0000000
--- a/uexception.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#pragma once
-
-#include <exception>
-#include <QString>
-#include <QByteArray>
-#include "uglobal.h"
-
-class UGLOBALHOTKEY_EXPORT UException : public std::exception
-{
-public:
- UException(const QString& message) throw();
- const char* what() const throw();
- ~UException() throw ();
-private:
- QByteArray Message;
-};
diff --git a/uglobalhotkey-headers.pri b/uglobalhotkey-headers.pri
index 113f3d5..ac9698a 100644
--- a/uglobalhotkey-headers.pri
+++ b/uglobalhotkey-headers.pri
@@ -1,8 +1,7 @@
INCLUDEPATH += $$PWD/
HEADERS += \
$$PWD/ukeysequence.h \
$$PWD/uglobalhotkeys.h \
- $$PWD/uexception.h \
$$PWD/hotkeymap.h \
$$PWD/uglobal.h
diff --git a/uglobalhotkey-sources.pri b/uglobalhotkey-sources.pri
index d58826c..1cf5dfd 100644
--- a/uglobalhotkey-sources.pri
+++ b/uglobalhotkey-sources.pri
@@ -1,10 +1,11 @@
INCLUDEPATH += $$PWD/
-QT += gui-private
+linux {
+ QT += gui-private
+}
SOURCES += \
$$PWD/ukeysequence.cpp \
- $$PWD/uglobalhotkeys.cpp \
- $$PWD/uexception.cpp
+ $$PWD/uglobalhotkeys.cpp
diff --git a/uglobalhotkeys.cpp b/uglobalhotkeys.cpp
index 7f7a6d9..645d482 100644
--- a/uglobalhotkeys.cpp
+++ b/uglobalhotkeys.cpp
@@ -1,213 +1,224 @@
#include <QtCore>
#if defined(Q_OS_WIN)
#include <windows.h>
#elif defined(Q_OS_LINUX)
#include <QWindow>
#include <qpa/qplatformnativeinterface.h>
#include <QApplication>
#endif
#include "hotkeymap.h"
#include "uglobalhotkeys.h"
UGlobalHotkeys::UGlobalHotkeys(QWidget *parent)
: QWidget(parent)
{
- #if defined(Q_OS_LINUX)
+#if defined(Q_OS_LINUX)
qApp->installNativeEventFilter(this);
QWindow wndw;
- void* v = qApp->platformNativeInterface()->nativeResourceForWindow("connection", &wndw);
- X11Connection = (xcb_connection_t*)v;
+ void *v = qApp->platformNativeInterface()->nativeResourceForWindow("connection", &wndw);
+ X11Connection = (xcb_connection_t *)v;
X11Wid = xcb_setup_roots_iterator(xcb_get_setup(X11Connection)).data->root;
X11KeySymbs = xcb_key_symbols_alloc(X11Connection);
- #endif
+#endif
}
-void UGlobalHotkeys::registerHotkey(const QString& keySeq, size_t id) {
- registerHotkey(UKeySequence(keySeq), id);
+bool UGlobalHotkeys::registerHotkey(const QString &keySeq, size_t id)
+{
+ return registerHotkey(UKeySequence(keySeq), id);
}
#if defined(Q_OS_MAC)
-OSStatus macHotkeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) {
+OSStatus macHotkeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData)
+{
Q_UNUSED(nextHandler);
EventHotKeyID hkCom;
- GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,NULL,
- sizeof(hkCom),NULL,&hkCom);
+ GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL,
+ sizeof(hkCom), NULL, &hkCom);
size_t id = hkCom.id;
- UGlobalHotkeys* caller = (UGlobalHotkeys*)userData;
+ UGlobalHotkeys *caller = (UGlobalHotkeys *)userData;
caller->onHotkeyPressed(id);
return noErr;
}
#endif
-void UGlobalHotkeys::registerHotkey(const UKeySequence& keySeq, size_t id) {
- if (keySeq.Size() == 0) {
- throw UException("Empty hotkeys");
+bool UGlobalHotkeys::registerHotkey(const UKeySequence &keySeq, size_t id)
+{
+ if (keySeq.size() == 0) {
+ return false;
}
- #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
+#if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
if (Registered.find(id) != Registered.end()) {
unregisterHotkey(id);
}
- #endif
- #if defined(Q_OS_WIN)
+#endif
+#if defined(Q_OS_WIN)
size_t winMod = 0;
size_t key = VK_F2;
- for (size_t i = 0; i != keySeq.Size(); i++) {
+ for (size_t i = 0; i != keySeq.size(); i++) {
if (keySeq[i] == Qt::Key_Control) {
winMod |= MOD_CONTROL;
} else if (keySeq[i] == Qt::Key_Alt) {
winMod |= MOD_ALT;
} else if (keySeq[i] == Qt::Key_Shift) {
winMod |= MOD_SHIFT;
} else if (keySeq[i] == Qt::Key_Meta) {
winMod |= MOD_WIN;
} else {
key = QtKeyToWin(keySeq[i]);
}
}
if (!RegisterHotKey((HWND)winId(), id, winMod, key)) {
- qDebug() << "Error activating hotkey!";
+ return false;
} else {
Registered.insert(id);
}
- #elif defined(Q_OS_LINUX)
+#elif defined(Q_OS_LINUX)
regLinuxHotkey(keySeq, id);
- #endif
- #if defined(Q_OS_MAC)
+#endif
+#if defined(Q_OS_MAC)
unregisterHotkey(id);
EventHotKeyRef gMyHotKeyRef;
EventHotKeyID gMyHotKeyID;
EventTypeSpec eventType;
- eventType.eventClass=kEventClassKeyboard;
- eventType.eventKind=kEventHotKeyPressed;
+ eventType.eventClass = kEventClassKeyboard;
+ eventType.eventKind = kEventHotKeyPressed;
InstallApplicationEventHandler(&macHotkeyHandler, 1, &eventType, this, NULL);
gMyHotKeyID.signature = uint32_t(id);
- gMyHotKeyID.id=uint32_t(id);
+ gMyHotKeyID.id = uint32_t(id);
UKeyData macKey = QtKeyToMac(keySeq);
RegisterEventHotKey(macKey.key, macKey.mods, gMyHotKeyID,
- GetApplicationEventTarget(), 0, &gMyHotKeyRef);
+ GetApplicationEventTarget(), 0, &gMyHotKeyRef);
HotkeyRefs[id] = gMyHotKeyRef;
+#endif
- #endif
+ return true;
}
-void UGlobalHotkeys::unregisterHotkey(size_t id) {
- #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
+void UGlobalHotkeys::unregisterHotkey(size_t id)
+{
+#if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
Q_ASSERT(Registered.find(id) != Registered.end() && "Unregistered hotkey");
- #endif
- #if defined(Q_OS_WIN)
+#endif
+#if defined(Q_OS_WIN)
UnregisterHotKey((HWND)winId(), id);
- #elif defined(Q_OS_LINUX)
+#elif defined(Q_OS_LINUX)
unregLinuxHotkey(id);
- #endif
- #if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
+#endif
+#if defined(Q_OS_WIN) || defined(Q_OS_LINUX)
Registered.remove(id);
- #endif
- #if defined(Q_OS_MAC)
+#endif
+#if defined(Q_OS_MAC)
if (HotkeyRefs.find(id) != HotkeyRefs.end()) {
UnregisterEventHotKey(HotkeyRefs[id]);
}
- #endif
+#endif
}
void UGlobalHotkeys::unregisterAllHotkeys()
{
#ifdef Q_OS_WIN
- for (size_t id : Registered)
+ foreach (const size_t id, Registered) {
this->unregisterHotkey(id);
+ }
#elif defined(Q_OS_LINUX)
- for (size_t id :Registered.keys())
+ foreach (const size_t id, Registered.keys()) {
this->unregisterHotkey(id);
+ }
#endif
}
-UGlobalHotkeys::~UGlobalHotkeys() {
- #if defined(Q_OS_WIN)
+UGlobalHotkeys::~UGlobalHotkeys()
+{
+#if defined(Q_OS_WIN)
for (QSet<size_t>::iterator i = Registered.begin(); i != Registered.end(); i++) {
UnregisterHotKey((HWND)winId(), *i);
}
- #elif defined(Q_OS_LINUX)
+#elif defined(Q_OS_LINUX)
xcb_key_symbols_free(X11KeySymbs);
- #endif
+#endif
}
#if defined(Q_OS_MAC)
-void UGlobalHotkeys::onHotkeyPressed(size_t id) {
+void UGlobalHotkeys::onHotkeyPressed(size_t id)
+{
emit activated(id);
}
#endif
#if defined(Q_OS_WIN)
-bool UGlobalHotkeys::winEvent(MSG * message, long * result) {
+bool UGlobalHotkeys::winEvent(MSG *message, long *result)
+{
Q_UNUSED(result);
if (message->message == WM_HOTKEY) {
size_t id = message->wParam;
Q_ASSERT(Registered.find(id) != Registered.end() && "Unregistered hotkey");
emit activated(id);
}
return false;
}
bool UGlobalHotkeys::nativeEvent(const QByteArray &eventType,
- void *message, long *result)
+ void *message, long *result)
{
Q_UNUSED(eventType);
- return winEvent((MSG*)message, result);
+ return winEvent((MSG *)message, result);
}
#elif defined(Q_OS_LINUX)
-bool UGlobalHotkeys::nativeEventFilter(const QByteArray &eventType, void *message, long *result) {
+bool UGlobalHotkeys::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
+{
Q_UNUSED(eventType);
Q_UNUSED(result);
- return linuxEvent(static_cast<xcb_generic_event_t*>(message));
+ return linuxEvent(static_cast<xcb_generic_event_t *>(message));
}
bool UGlobalHotkeys::linuxEvent(xcb_generic_event_t *message)
{
- if ( (message->response_type & ~0x80) == XCB_KEY_PRESS ) {
- xcb_key_press_event_t *ev = (xcb_key_press_event_t*)message;
- auto ind = Registered.key( {ev->detail, (ev->state & ~XCB_MOD_MASK_2)} );
+ if ((message->response_type & ~0x80) == XCB_KEY_PRESS) {
+ xcb_key_press_event_t *ev = (xcb_key_press_event_t *)message;
+ auto ind = Registered.key({ev->detail, (ev->state & ~XCB_MOD_MASK_2)});
if (ind == 0) // this is not hotkeys
return false;
emit activated(ind);
return true;
}
return false;
}
void UGlobalHotkeys::regLinuxHotkey(const UKeySequence &keySeq, size_t id)
{
UHotkeyData data;
UKeyData keyData = QtKeyToLinux(keySeq);
xcb_keycode_t *keyC = xcb_key_symbols_get_keycode(X11KeySymbs, keyData.key);
data.keyCode = *keyC;
data.mods = keyData.mods;
xcb_grab_key(X11Connection, 1, X11Wid, data.mods, data.keyCode, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
// NumLk
- xcb_grab_key(X11Connection, 1, X11Wid, data.mods | XCB_MOD_MASK_2, data.keyCode,XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
+ xcb_grab_key(X11Connection, 1, X11Wid, data.mods | XCB_MOD_MASK_2, data.keyCode, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
Registered.insert(id, data);
}
void UGlobalHotkeys::unregLinuxHotkey(size_t id)
{
UHotkeyData data = Registered.take(id);
xcb_ungrab_key(X11Connection, data.keyCode, X11Wid, data.mods);
xcb_ungrab_key(X11Connection, data.keyCode, X11Wid, data.mods | XCB_MOD_MASK_2);
}
#endif
diff --git a/uglobalhotkeys.h b/uglobalhotkeys.h
index 07c6c18..48b3681 100644
--- a/uglobalhotkeys.h
+++ b/uglobalhotkeys.h
@@ -1,68 +1,72 @@
#pragma once
#include <QWidget>
#include <QAbstractNativeEventFilter>
#include <QSet>
#if defined(Q_OS_LINUX)
#include "xcb/xcb.h"
#include "xcb/xcb_keysyms.h"
#elif defined(Q_OS_MAC)
#include <Carbon/Carbon.h>
#endif
#include "ukeysequence.h"
-#include "uexception.h"
#include "uglobal.h"
#if defined(Q_OS_LINUX)
struct UHotkeyData {
xcb_keycode_t keyCode;
int mods;
- bool operator ==(const UHotkeyData& data) const {
+ bool operator ==(const UHotkeyData &data) const
+ {
return data.keyCode == this->keyCode && data.mods == this->mods;
}
};
#endif
class UGLOBALHOTKEY_EXPORT UGlobalHotkeys : public QWidget
- #if defined(Q_OS_LINUX)
- , public QAbstractNativeEventFilter
- #endif
+#if defined(Q_OS_LINUX)
+ , public QAbstractNativeEventFilter
+#endif
{
Q_OBJECT
+
public:
explicit UGlobalHotkeys(QWidget *parent = 0);
- void registerHotkey(const QString& keySeq, size_t id = 1);
- void registerHotkey(const UKeySequence& keySeq, size_t id = 1);
+ bool registerHotkey(const QString &keySeq, size_t id = 1);
+ bool registerHotkey(const UKeySequence &keySeq, size_t id = 1);
void unregisterHotkey(size_t id = 1);
void unregisterAllHotkeys();
~UGlobalHotkeys();
+
protected:
- #if defined(Q_OS_WIN)
- bool winEvent (MSG * message, long * result);
+#if defined(Q_OS_WIN)
+ bool winEvent(MSG *message, long *result);
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
- #elif defined(Q_OS_LINUX)
+#elif defined(Q_OS_LINUX)
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
bool linuxEvent(xcb_generic_event_t *message);
- void regLinuxHotkey(const UKeySequence& keySeq, size_t id);
+ void regLinuxHotkey(const UKeySequence &keySeq, size_t id);
void unregLinuxHotkey(size_t id);
- #endif
+#endif
+
public:
- #if defined (Q_OS_MAC)
+#if defined (Q_OS_MAC)
void onHotkeyPressed(size_t id);
- #endif
+#endif
signals:
void activated(size_t id);
+
private:
- #if defined(Q_OS_WIN)
+#if defined(Q_OS_WIN)
QSet<size_t> Registered;
- #elif defined(Q_OS_LINUX)
+#elif defined(Q_OS_LINUX)
QHash<size_t, UHotkeyData> Registered;
- xcb_connection_t* X11Connection;
+ xcb_connection_t *X11Connection;
xcb_window_t X11Wid;
- xcb_key_symbols_t* X11KeySymbs;
- #elif defined(Q_OS_MAC)
+ xcb_key_symbols_t *X11KeySymbs;
+#elif defined(Q_OS_MAC)
QHash<size_t, EventHotKeyRef> HotkeyRefs;
- #endif
+#endif
};
diff --git a/ukeysequence.cpp b/ukeysequence.cpp
index 321df1f..a05fc93 100644
--- a/ukeysequence.cpp
+++ b/ukeysequence.cpp
@@ -1,144 +1,130 @@
#include "ukeysequence.h"
#include <QDebug>
UKeySequence::UKeySequence(QObject *parent)
: QObject(parent)
{
}
-UKeySequence::UKeySequence(const QString& str, QObject *parent)
+UKeySequence::UKeySequence(const QString &str, QObject *parent)
: QObject(parent)
{
- FromString(str);
+ fromString(str);
}
-bool IsModifier(int key) {
- return (key == Qt::Key_Shift ||
- key == Qt::Key_Control ||
- key == Qt::Key_Alt ||
- key == Qt::Key_Meta);
-}
-
-static QString KeyToStr(int key) {
- if (key == Qt::Key_Shift) {
- return "Shift";
- }
- if (key == Qt::Key_Control) {
- return "Ctrl";
- }
- if (key == Qt::Key_Alt) {
- return "Alt";
- }
- if (key == Qt::Key_Meta) {
- return "Meta";
- }
- QKeySequence seq(key);
- return seq.toString();
-}
-
-void UKeySequence::FromString(const QString& str) {
+void UKeySequence::fromString(const QString &str)
+{
QStringList keys = str.split('+');
for (int i = 0; i < keys.size(); i++) {
- AddKey(keys[i]);
+ addKey(keys[i]);
}
}
-QString UKeySequence::ToString() {
- QVector<int> simpleKeys = GetSimpleKeys();
- QVector<int> modifiers = GetModifiers();
+QString UKeySequence::toString()
+{
+ QVector<Qt::Key> simpleKeys = getSimpleKeys();
+ QVector<Qt::Key> modifiers = getModifiers();
QStringList result;
for (int i = 0; i < modifiers.size(); i++) {
- result.push_back(KeyToStr(modifiers[i]));
+ result.push_back(keyToStr(modifiers[i]));
}
for (int i = 0; i < simpleKeys.size(); i++) {
- result.push_back(KeyToStr(simpleKeys[i]));
+ result.push_back(keyToStr(simpleKeys[i]));
}
return result.join('+');
}
-QVector<int> UKeySequence::GetSimpleKeys() const {
- QVector<int> result;
- for (int i = 0; i < Keys.size(); i++) {
- if (!IsModifier(Keys[i])) {
- result.push_back(Keys[i]);
+QVector<Qt::Key> UKeySequence::getSimpleKeys() const
+{
+ QVector<Qt::Key> result;
+ for (int i = 0; i < mKeys.size(); i++) {
+ if (!isModifier(mKeys[i])) {
+ result.push_back(mKeys[i]);
}
}
return result;
}
-QVector<int> UKeySequence::GetModifiers() const {
- QVector<int> result;
- for (int i = 0; i < Keys.size(); i++) {
- if (IsModifier(Keys[i])) {
- result.push_back(Keys[i]);
+QVector<Qt::Key> UKeySequence::getModifiers() const
+{
+ QVector<Qt::Key> result;
+ for (int i = 0; i < mKeys.size(); i++) {
+ if (isModifier(mKeys[i])) {
+ result.push_back(mKeys[i]);
}
}
return result;
}
-void UKeySequence::AddModifiers(Qt::KeyboardModifiers mod) {
+void UKeySequence::addModifiers(Qt::KeyboardModifiers mod)
+{
if (mod == Qt::NoModifier) {
return;
}
if (mod & Qt::ShiftModifier) {
- AddKey(Qt::Key_Shift);
+ addKey(Qt::Key_Shift);
}
if (mod & Qt::ControlModifier) {
- AddKey(Qt::Key_Control);
+ addKey(Qt::Key_Control);
}
if (mod & Qt::AltModifier) {
- AddKey(Qt::Key_Alt);
+ addKey(Qt::Key_Alt);
}
if (mod & Qt::MetaModifier) {
- AddKey(Qt::Key_Meta);
+ addKey(Qt::Key_Meta);
}
}
-void UKeySequence::AddKey(const QString& key) {
+void UKeySequence::addKey(const QString &key)
+{
if (key.contains("+") || key.contains(",")) {
- throw UException("Wrong key");
+ qWarning() << "Wrong key";
+ return;
}
QString mod = key.toLower();
qDebug() << "mod: " << mod;
if (mod == "alt") {
- AddKey(Qt::Key_Alt);
+ addKey(Qt::Key_Alt);
return;
}
if (mod == "shift" || mod == "shft") {
- AddKey(Qt::Key_Shift);
+ addKey(Qt::Key_Shift);
return;
}
if (mod == "control" || mod == "ctrl") {
- AddKey(Qt::Key_Control);
+ addKey(Qt::Key_Control);
return;
}
if (mod == "win" || mod == "meta") {
- AddKey(Qt::Key_Meta);
+ addKey(Qt::Key_Meta);
return;
}
QKeySequence seq(key);
if (seq.count() != 1) {
- throw UException("Wrong key");
+ qWarning() << "Wrong key";
+ return;
}
- AddKey(seq[0]);
+ addKey((Qt::Key) seq[0]);
}
-void UKeySequence::AddKey(int key) {
+void UKeySequence::addKey(Qt::Key key)
+{
if (key <= 0) {
return;
}
- for (int i = 0; i < Keys.size(); i++) {
- if (Keys[i] == key) {
+ for (int i = 0; i < mKeys.size(); i++) {
+ if (mKeys[i] == key) {
return;
}
}
qDebug() << "Key added: " << key;
- Keys.push_back(key);
+ mKeys.push_back(key);
}
-void UKeySequence::AddKey(const QKeyEvent* event) {
- AddKey(event->key());
- AddModifiers(event->modifiers());
+void UKeySequence::addKey(const QKeyEvent *event)
+{
+ addKey((Qt::Key) event->key());
+ addModifiers(event->modifiers());
}
diff --git a/ukeysequence.h b/ukeysequence.h
index 9e5939a..725ec5a 100644
--- a/ukeysequence.h
+++ b/ukeysequence.h
@@ -1,38 +1,73 @@
#pragma once
#include <QObject>
#include <QString>
#include <QVector>
#include <QStringList>
#include <QKeyEvent>
-#include "uexception.h"
#include "uglobal.h"
class UGLOBALHOTKEY_EXPORT UKeySequence : public QObject
{
Q_OBJECT
+
public:
explicit UKeySequence(QObject *parent = 0);
- explicit UKeySequence(const QString& str, QObject *parent = 0);
- void FromString(const QString& str);
- QString ToString();
- void AddKey(int key);
- void AddKey(const QString& key);
- void AddModifiers(Qt::KeyboardModifiers mod);
- void AddKey(const QKeyEvent* event);
- inline size_t Size() const {
- return Keys.size();
+ explicit UKeySequence(const QString &str, QObject *parent = 0);
+
+ void fromString(const QString &str);
+ QString toString();
+ void addKey(Qt::Key key);
+ void addKey(const QString &key);
+ void addModifiers(Qt::KeyboardModifiers mod);
+ void addKey(const QKeyEvent *event);
+
+ inline size_t size() const
+ {
+ return mKeys.size();
}
- inline int operator [] (size_t n) const {
- if ((int)n > Keys.size()) {
- throw UException("Out of bounds");
+ inline Qt::Key operator [](size_t n) const
+ {
+ if ((int)n > mKeys.size()) {
+ return Qt::Key_unknown;
}
- return Keys[n];
+
+ return mKeys[n];
}
- QVector<int> GetSimpleKeys() const;
- QVector<int> GetModifiers() const;
+
+ QVector<Qt::Key> getSimpleKeys() const;
+ QVector<Qt::Key> getModifiers() const;
+
private:
- QVector<int> Keys;
+ QVector<Qt::Key> mKeys;
+
+ inline static bool isModifier(Qt::Key key)
+ {
+ return (key == Qt::Key_Shift ||
+ key == Qt::Key_Control ||
+ key == Qt::Key_Alt ||
+ key == Qt::Key_Meta);
+ }
+
+ inline static QString keyToStr(int key)
+ {
+ if (key == Qt::Key_Shift) {
+ return "Shift";
+ }
+ if (key == Qt::Key_Control) {
+ return "Ctrl";
+ }
+ if (key == Qt::Key_Alt) {
+ return "Alt";
+ }
+ if (key == Qt::Key_Meta) {
+ return "Meta";
+ }
+
+ QKeySequence seq(key);
+ return seq.toString();
+ }
+
};
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Feb 7, 2:28 PM (11 h, 41 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
56029
Default Alt Text
(27 KB)
Attached To
Mode
R65 cKaiser's UGlobalHotKey
Attached
Detach File
Event Timeline
Log In to Comment