File indexing completed on 2025-02-16 05:06:33
0001 /* 0002 SPDX-FileCopyrightText: 2014 Weng Xuetian <wengxt@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 #pragma once 0008 #include <ibus.h> 0009 #include <xcb/xcb.h> 0010 #include <xcb/xcb_keysyms.h> 0011 0012 #include "panel.h" 0013 #include <QAbstractNativeEventFilter> 0014 #include <QByteArray> 0015 #include <QGuiApplication> 0016 #include <QMap> 0017 #include <QPair> 0018 #include <memory> 0019 class QDBusServiceWatcher; 0020 0021 class XcbEventFilter : public QAbstractNativeEventFilter 0022 { 0023 public: 0024 bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override; 0025 }; 0026 0027 class App : public QGuiApplication 0028 { 0029 Q_OBJECT 0030 public: 0031 typedef QPair<uint, uint> TriggerKey; 0032 App(int &argc, char *argv[]); 0033 ~App() override; 0034 void setTriggerKeys(QList<TriggerKey> triggersList); 0035 void setDoGrab(bool doGrab); 0036 bool keyboardGrabbed() 0037 { 0038 return m_keyboardGrabbed; 0039 } 0040 bool nativeEvent(xcb_generic_event_t *event); 0041 void nameAcquired(); 0042 void nameLost(); 0043 QByteArray normalizeIconName(const QByteArray &icon) const; 0044 public Q_SLOTS: 0045 void init(); 0046 void finalize(); 0047 void clean(); 0048 void grabKey(); 0049 void ungrabKey(); 0050 uint getPrimaryModifier(uint state); 0051 void keyRelease(const xcb_key_release_event_t *event); 0052 void accept(); 0053 void ungrabXKeyboard(); 0054 bool grabXKeyboard(); 0055 0056 private: 0057 std::unique_ptr<XcbEventFilter> m_eventFilter; 0058 bool m_init; 0059 IBusBus *m_bus; 0060 IBusPanelImpanel *m_impanel; 0061 QList<QPair<uint, uint>> m_triggersList; 0062 bool m_keyboardGrabbed; 0063 bool m_doGrab; 0064 xcb_key_symbols_t *m_syms; 0065 QMap<QByteArray, QByteArray> m_iconMap; 0066 QDBusServiceWatcher *m_watcher; 0067 };