1 /*
2     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6 #ifndef KWAYLAND_SERVER_TEXTINPUT_INTERFACE_P_H
7 #define KWAYLAND_SERVER_TEXTINPUT_INTERFACE_P_H
8 #include "global_p.h"
9 #include "resource_p.h"
10 #include "textinput_interface.h"
11 
12 #include <QPointer>
13 #include <QRect>
14 #include <QVector>
15 
16 namespace KWayland
17 {
18 namespace Server
19 {
20 class TextInputManagerUnstableV0Interface;
21 class TextInputManagerUnstableV2Interface;
22 
23 class TextInputManagerInterface::Private : public Global::Private
24 {
25 public:
26     QVector<TextInputInterface *> inputs;
27     TextInputInterfaceVersion interfaceVersion;
28 
29 protected:
30     Private(TextInputInterfaceVersion interfaceVersion, TextInputManagerInterface *q, Display *d, const wl_interface *interface, quint32 version);
31     TextInputManagerInterface *q;
32 };
33 
34 class TextInputInterface::Private : public Resource::Private
35 {
36 public:
37     ~Private() override;
38 
39     virtual void sendEnter(SurfaceInterface *surface, quint32 serial) = 0;
40     virtual void sendLeave(quint32 serial, SurfaceInterface *surface) = 0;
41 
42     virtual void preEdit(const QByteArray &text, const QByteArray &commit) = 0;
43     virtual void commit(const QByteArray &text) = 0;
44     virtual void deleteSurroundingText(quint32 beforeLength, quint32 afterLength) = 0;
45     virtual void setTextDirection(Qt::LayoutDirection direction) = 0;
46     virtual void setPreEditCursor(qint32 index) = 0;
47     virtual void setCursorPosition(qint32 index, qint32 anchor) = 0;
48     virtual void keysymPressed(quint32 keysym, Qt::KeyboardModifiers modifiers) = 0;
49     virtual void keysymReleased(quint32 keysym, Qt::KeyboardModifiers modifiers) = 0;
50     virtual TextInputInterfaceVersion interfaceVersion() const = 0;
51     virtual void sendInputPanelState() = 0;
52     virtual void sendLanguage() = 0;
53 
54     virtual TextInputInterface::ContentHints convertContentHint(uint32_t hint) const = 0;
55     virtual TextInputInterface::ContentPurpose convertContentPurpose(uint32_t purpose) const = 0;
56 
57     QByteArray preferredLanguage;
58     QRect cursorRectangle;
59     TextInputInterface::ContentHints contentHints = TextInputInterface::ContentHint::None;
60     TextInputInterface::ContentPurpose contentPurpose = TextInputInterface::ContentPurpose::Normal;
61     SeatInterface *seat = nullptr;
62     QPointer<SurfaceInterface> surface;
63     bool enabled = false;
64     QByteArray surroundingText;
65     qint32 surroundingTextCursorPosition = 0;
66     qint32 surroundingTextSelectionAnchor = 0;
67     bool inputPanelVisible = false;
68     QRect overlappedSurfaceArea;
69     QByteArray language;
70 
71 protected:
72     Private(TextInputInterface *q, Global *c, wl_resource *parentResource, const wl_interface *interface, const void *implementation);
73 
74     static void showInputPanelCallback(wl_client *client, wl_resource *resource);
75     static void hideInputPanelCallback(wl_client *client, wl_resource *resource);
76     static void setSurroundingTextCallback(wl_client *client, wl_resource *resource, const char *text, int32_t cursor, int32_t anchor);
77     static void setContentTypeCallback(wl_client *client, wl_resource *resource, uint32_t hint, uint32_t purpose);
78     static void setCursorRectangleCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height);
79     static void setPreferredLanguageCallback(wl_client *client, wl_resource *resource, const char *language);
80 
81 private:
q_func()82     TextInputInterface *q_func()
83     {
84         return reinterpret_cast<TextInputInterface *>(q);
85     }
86 };
87 
88 class TextInputUnstableV0Interface : public TextInputInterface
89 {
90     Q_OBJECT
91 public:
92     ~TextInputUnstableV0Interface() override;
93 
94 Q_SIGNALS:
95     /**
96      * @internal
97      **/
98     void requestActivate(KWayland::Server::SeatInterface *seat, KWayland::Server::SurfaceInterface *surface);
99 
100 private:
101     explicit TextInputUnstableV0Interface(TextInputManagerUnstableV0Interface *parent, wl_resource *parentResource);
102     friend class TextInputManagerUnstableV0Interface;
103     class Private;
104 };
105 
106 class TextInputUnstableV2Interface : public TextInputInterface
107 {
108     Q_OBJECT
109 public:
110     ~TextInputUnstableV2Interface() override;
111 
112 private:
113     explicit TextInputUnstableV2Interface(TextInputManagerUnstableV2Interface *parent, wl_resource *parentResource);
114     friend class TextInputManagerUnstableV2Interface;
115     class Private;
116 };
117 
118 class TextInputManagerUnstableV0Interface : public TextInputManagerInterface
119 {
120     Q_OBJECT
121 public:
122     explicit TextInputManagerUnstableV0Interface(Display *display, QObject *parent = nullptr);
123     ~TextInputManagerUnstableV0Interface() override;
124 
125 private:
126     class Private;
127 };
128 
129 class TextInputManagerUnstableV2Interface : public TextInputManagerInterface
130 {
131     Q_OBJECT
132 public:
133     explicit TextInputManagerUnstableV2Interface(Display *display, QObject *parent = nullptr);
134     ~TextInputManagerUnstableV2Interface() override;
135 
136 private:
137     class Private;
138 };
139 
140 }
141 }
142 
143 #endif
144