summaryrefslogtreecommitdiffhomepage
path: root/qxt-mini/qxtglobalshortcut_x11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qxt-mini/qxtglobalshortcut_x11.cpp')
-rw-r--r--qxt-mini/qxtglobalshortcut_x11.cpp67
1 files changed, 38 insertions, 29 deletions
diff --git a/qxt-mini/qxtglobalshortcut_x11.cpp b/qxt-mini/qxtglobalshortcut_x11.cpp
index 2609aa7c..01894cfc 100644
--- a/qxt-mini/qxtglobalshortcut_x11.cpp
+++ b/qxt-mini/qxtglobalshortcut_x11.cpp
@@ -37,7 +37,7 @@
#include <QPair>
#include <QKeyEvent>
#include <QApplication>
-#include "qplatformnativeinterface.h"
+#include <qpa/qplatformnativeinterface.h>
#include "x11-keymap.hpp"
@@ -69,6 +69,9 @@ using pair = QPair<quint32, quint32>;
struct keybinding final
{
+ keybinding(const keybinding&) = default;
+ keybinding& operator=(const keybinding&) = default;
+
quint32 code, mods;
int refcnt;
@@ -93,7 +96,7 @@ public:
static int qxtX11ErrorHandler(Display *display, XErrorEvent *event)
{
- Q_UNUSED(display);
+ Q_UNUSED(display)
switch (event->error_code)
{
case BadAccess:
@@ -135,7 +138,7 @@ public:
bool isValid()
{
- return m_display != 0;
+ return m_display;
}
Display *display()
@@ -154,13 +157,12 @@ public:
const std::vector<pair> keycodes = native_key(Qt::Key(code), Qt::KeyboardModifiers(mods));
bool ret = true;
- for (pair x : keycodes)
+ for (const pair& x : keycodes)
{
- int native_code = x.first, native_mods = x.second;
-
- native_code = XKeysymToKeycode(display(), native_code);
+ auto [ native_sym, native_mods ] = x;
+ int native_code = XKeysymToKeycode(display(), native_sym);
- if (keybinding::incf(native_code, native_mods))
+ if (keybinding::incf((unsigned)native_code, native_mods))
{
QxtX11ErrorHandler errorHandler;
@@ -170,8 +172,8 @@ public:
{
quint32 m = native_mods;
- for (auto value : set)
- m |= value;
+ for (int value : set)
+ m |= (unsigned)value;
XGrabKey(display(), native_code, m, rootWindow(), True, GrabModeAsync, GrabModeAsync);
}
@@ -179,7 +181,15 @@ public:
if (errorHandler.error)
{
qDebug() << "qxt-mini: error while binding to" << code << mods;
- ungrabKey(code, mods);
+ for (const auto& set : evil_mods.sets())
+ {
+ quint32 m = mods;
+
+ for (int value : set)
+ m |= (unsigned)value;
+
+ XUngrabKey(display(), native_code, m, rootWindow());
+ }
ret = false;
}
}
@@ -193,12 +203,12 @@ public:
const std::vector<pair> keycodes = native_key(Qt::Key(code), Qt::KeyboardModifiers(mods));
bool ret = true;
- for (pair x : keycodes)
+ for (const pair& x : keycodes)
{
- int native_code = x.first, native_mods = x.second;
- native_code = XKeysymToKeycode(display(), native_code);
+ auto [ native_sym, native_mods ] = x;
+ int native_code = XKeysymToKeycode(display(), native_sym);
- if (keybinding::decf(native_code, native_mods))
+ if (keybinding::decf((unsigned)native_code, native_mods))
{
QxtX11ErrorHandler errorHandler;
XUngrabKey(display(), native_code, native_mods, rootWindow());
@@ -207,10 +217,10 @@ public:
{
quint32 m = mods;
- for (auto value : set)
- m |= value;
+ for (int value : set)
+ m |= (unsigned)value;
- XUngrabKey(display(), code, m, rootWindow());
+ XUngrabKey(display(), native_code, m, rootWindow());
}
if (errorHandler.error)
@@ -345,26 +355,27 @@ bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType,
(void) XkbSetDetectableAutoRepeat(x11.display(), True, &val);
- if (val)
- qDebug() << "qxt-mini: fixed x11 autorepeat";
- else
+ if (!val)
qDebug() << "qxt-mini: can't fix x11 autorepeat";
}
}
bool is_release = false;
- xcb_key_press_event_t *kev = 0;
+ static_assert(std::is_same_v<xcb_key_press_event_t, xcb_key_release_event_t>);
+
+ xcb_key_press_event_t *kev = nullptr;
if (eventType == "xcb_generic_event_t") {
xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
switch (ev->response_type & 127)
{
case XCB_KEY_RELEASE:
is_release = true;
- /*FALLTHROUGH*/
+ [[fallthrough]];
case XCB_KEY_PRESS:
kev = static_cast<xcb_key_press_event_t *>(message);
- /*FALLTHROUGH*/
+ break;
+
default:
break;
}
@@ -400,21 +411,19 @@ bool QxtGlobalShortcutPrivate::nativeEventFilter(const QByteArray & eventType,
keystate = filter_evil_mods(keystate);
- QPair<KeySym, KeySym> sym_ = keycode_to_keysym(x11.display(), keycode, keystate, kev);
- KeySym sym = sym_.first, sym2 = sym_.second;
+ auto [ sym, sym2 ] = keycode_to_keysym(x11.display(), keycode, keystate, kev);
Qt::Key k; Qt::KeyboardModifiers mods;
-
{
- std::tie(k, mods) = x11_key_to_qt(x11.display(), sym, keystate);
+ std::tie(k, mods) = x11_key_to_qt(x11.display(), (quint32)sym, keystate);
if (k != 0)
activateShortcut(k, mods, !is_release);
}
{
- std::tie(k, mods) = x11_key_to_qt(x11.display(), sym2, keystate);
+ std::tie(k, mods) = x11_key_to_qt(x11.display(), (quint32)sym2, keystate);
if (k != 0)
activateShortcut(k, mods, !is_release);