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 };