1 /*
2     SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
3     SPDX-FileCopyrightText: 2021 Roman Gilg <subdiff@gmail.com>
4 
5     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only
6 */
7 #pragma once
8 
9 #include "text_input_v2.h"
10 
11 #include "wayland_pointer_p.h"
12 
13 #include <QObject>
14 
15 #include <wayland-text-input-v2-client-protocol.h>
16 
17 namespace Wrapland::Client
18 {
19 
20 class Q_DECL_HIDDEN TextInputManagerV2::Private
21 {
22 public:
23     ~Private() = default;
24 
25     void release();
26     bool isValid();
27     void setupV2(zwp_text_input_manager_v2* manager);
28     TextInputV2* createTextInput(Seat* seat, QObject* parent = nullptr);
29 
30     operator zwp_text_input_manager_v2*()
31     {
32         return manager_ptr;
33     }
34     operator zwp_text_input_manager_v2*() const
35     {
36         return manager_ptr;
37     }
38 
39     WaylandPointer<zwp_text_input_manager_v2, zwp_text_input_manager_v2_destroy> manager_ptr;
40 
41     EventQueue* queue = nullptr;
42 };
43 
44 class Q_DECL_HIDDEN TextInputV2::Private
45 {
46 public:
47     Private(TextInputV2* q, Seat* seat);
48     virtual ~Private() = default;
49 
50     void setup(zwp_text_input_v2* ti);
51 
52     bool isValid() const;
53     void enable(Surface* surface);
54     void disable(Surface* surface);
55     void showInputPanel();
56     void hideInputPanel();
57     void setCursorRectangle(const QRect& rect);
58     void setPreferredLanguage(const QString& lang);
59     void setSurroundingText(const QString& text, quint32 cursor, quint32 anchor);
60     void reset();
61     void setContentType(ContentHints hint, ContentPurpose purpose);
62 
63     WaylandPointer<zwp_text_input_v2, zwp_text_input_v2_destroy> text_input_ptr;
64 
65     EventQueue* queue = nullptr;
66     Seat* seat;
67     Surface* enteredSurface = nullptr;
68     quint32 latestSerial = 0;
69     bool inputPanelVisible = false;
70     Qt::LayoutDirection textDirection = Qt::LayoutDirectionAuto;
71     QByteArray language;
72 
73     struct PreEdit {
74         QByteArray text;
75         QByteArray commitText;
76         qint32 cursor = 0;
77         bool cursorSet = false;
78     };
79     PreEdit currentPreEdit;
80     PreEdit pendingPreEdit;
81 
82     struct Commit {
83         QByteArray text;
84         qint32 cursor = 0;
85         qint32 anchor = 0;
86         DeleteSurroundingText deleteSurrounding;
87     };
88     Commit currentCommit;
89     Commit pendingCommit;
90 
91 private:
92     static void enterCallback(void* data,
93                               zwp_text_input_v2* zwp_text_input_v2,
94                               uint32_t serial,
95                               wl_surface* surface);
96     static void leaveCallback(void* data,
97                               zwp_text_input_v2* zwp_text_input_v2,
98                               uint32_t serial,
99                               wl_surface* surface);
100     static void inputPanelStateCallback(void* data,
101                                         zwp_text_input_v2* zwp_text_input_v2,
102                                         uint32_t state,
103                                         int32_t x,
104                                         int32_t y,
105                                         int32_t width,
106                                         int32_t height);
107     static void preeditStringCallback(void* data,
108                                       zwp_text_input_v2* zwp_text_input_v2,
109                                       const char* text,
110                                       const char* commit);
111     static void preeditStylingCallback(void* data,
112                                        zwp_text_input_v2* zwp_text_input_v2,
113                                        uint32_t index,
114                                        uint32_t length,
115                                        uint32_t style);
116     static void
117     preeditCursorCallback(void* data, zwp_text_input_v2* zwp_text_input_v2, int32_t index);
118     static void
119     commitStringCallback(void* data, zwp_text_input_v2* zwp_text_input_v2, const char* text);
120     static void cursorPositionCallback(void* data,
121                                        zwp_text_input_v2* zwp_text_input_v2,
122                                        int32_t index,
123                                        int32_t anchor);
124     static void deleteSurroundingTextCallback(void* data,
125                                               zwp_text_input_v2* zwp_text_input_v2,
126                                               uint32_t before_length,
127                                               uint32_t after_length);
128     static void
129     modifiersMapCallback(void* data, zwp_text_input_v2* zwp_text_input_v2, wl_array* map);
130     static void keysymCallback(void* data,
131                                zwp_text_input_v2* zwp_text_input_v2,
132                                uint32_t time,
133                                uint32_t sym,
134                                uint32_t state,
135                                uint32_t modifiers);
136     static void
137     languageCallback(void* data, zwp_text_input_v2* zwp_text_input_v2, const char* language);
138     static void
139     textDirectionCallback(void* data, zwp_text_input_v2* zwp_text_input_v2, uint32_t direction);
140     static void configureSurroundingTextCallback(void* data,
141                                                  zwp_text_input_v2* zwp_text_input_v2,
142                                                  int32_t before_cursor,
143                                                  int32_t after_cursor);
144     static void inputMethodChangedCallback(void* data,
145                                            zwp_text_input_v2* zwp_text_input_v2,
146                                            uint32_t serial,
147                                            uint32_t flags);
148 
149     TextInputV2* q;
150 
151     static const zwp_text_input_v2_listener s_listener;
152 };
153 
154 }
155