Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwaylandinputmethodcontrol.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
6
8#include "qwaylandseat.h"
10#include "qwaylandview.h"
14
15#include <QtGui/QInputMethodEvent>
16
17QWaylandInputMethodControl::QWaylandInputMethodControl(QWaylandSurface *surface)
18 : QObject(*new QWaylandInputMethodControlPrivate(surface), surface)
19{
20 connect(d_func()->compositor, &QWaylandCompositor::defaultSeatChanged,
21 this, &QWaylandInputMethodControl::defaultSeatChanged);
22
23 updateTextInput();
24
25 QWaylandTextInputV3 *textInputV3 = d_func()->textInputV3();
26 if (textInputV3) {
27 connect(textInputV3, &QWaylandTextInputV3::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
28 connect(textInputV3, &QWaylandTextInputV3::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
29 connect(textInputV3, &QWaylandTextInputV3::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod);
30 }
31
32 QWaylandQtTextInputMethod *textInputMethod = d_func()->textInputMethod();
33 if (textInputMethod) {
34 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
35 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
36 connect(textInputMethod, &QWaylandQtTextInputMethod::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod);
37 }
38}
39
40QVariant QWaylandInputMethodControl::inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const
41{
42 Q_D(const QWaylandInputMethodControl);
43
44 QWaylandTextInput *textInput = d->textInput();
45 if (textInput != nullptr && textInput->focus() == d->surface)
46 return textInput->inputMethodQuery(query, argument);
47
48 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
49 if (textInputV3 != nullptr && textInputV3->focus() == d->surface)
50 return textInputV3->inputMethodQuery(query, argument);
51
52 QWaylandQtTextInputMethod *textInputMethod = d_func()->textInputMethod();
53 if (textInputMethod && textInputMethod->focusedSurface() == d->surface)
54 return textInputMethod->inputMethodQuery(query, argument);
55
56 return QVariant();
57}
58
59void QWaylandInputMethodControl::inputMethodEvent(QInputMethodEvent *event)
60{
61 Q_D(QWaylandInputMethodControl);
62
63 if (QWaylandTextInput *textInput = d->textInput()) {
64 textInput->sendInputMethodEvent(event);
65 } else if (QWaylandTextInputV3 *textInputV3 = d->textInputV3()) {
66 textInputV3->sendInputMethodEvent(event);
67 } else if (QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod()) {
68 textInputMethod->sendInputMethodEvent(event);
69 } else {
70 event->ignore();
71 }
72}
73
74/*!
75 * \property QWaylandInputMethodControl::enabled
76 *
77 * This property indicates whether the input method control is enabled for the
78 * surface.
79 *
80 * The property is \c true when text input is enabled for the associated
81 * surface; otherwise \c false.
82 */
84{
85 Q_D(const QWaylandInputMethodControl);
86
87 return d->enabled;
88}
89
91{
92 Q_D(QWaylandInputMethodControl);
93
94 if (d->enabled == enabled)
95 return;
96
97 d->enabled = enabled;
98 emit enabledChanged(enabled);
99 emit updateInputMethod(Qt::ImQueryInput);
100}
101
102void QWaylandInputMethodControl::surfaceEnabled(QWaylandSurface *surface)
103{
104 Q_D(QWaylandInputMethodControl);
105
106 if (surface == d->surface)
107 setEnabled(true);
108}
109
110void QWaylandInputMethodControl::surfaceDisabled(QWaylandSurface *surface)
111{
112 Q_D(QWaylandInputMethodControl);
113
114 if (surface == d->surface)
115 setEnabled(false);
116}
117
118void QWaylandInputMethodControl::setSurface(QWaylandSurface *surface)
119{
120 Q_D(QWaylandInputMethodControl);
121
122 if (d->surface == surface)
123 return;
124
125 d->surface = surface;
126
127 QWaylandTextInput *textInput = d->textInput();
128 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
129 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
130 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
131 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
132 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
133}
134
136{
137 QWaylandTextInput *textInput = d_func()->textInput();
138
139 if (textInput) {
140 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled, Qt::UniqueConnection);
141 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled, Qt::UniqueConnection);
142 connect(textInput, &QWaylandTextInput::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod, Qt::UniqueConnection);
143 }
144}
145
146void QWaylandInputMethodControl::defaultSeatChanged()
147{
148 Q_D(QWaylandInputMethodControl);
149
150 disconnect(d->textInput(), nullptr, this, nullptr);
151 disconnect(d->textInputV3(), nullptr, this, nullptr);
152 disconnect(d->textInputMethod(), nullptr, this, nullptr);
153
154 d->seat = d->compositor->defaultSeat();
155 QWaylandTextInput *textInput = d->textInput();
156 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
157 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
158
159 if (textInput) {
160 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
161 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
162 }
163
164 if (textInputV3) {
165 connect(textInputV3, &QWaylandTextInputV3::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
166 connect(textInputV3, &QWaylandTextInputV3::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
167 }
168
169 if (textInputMethod) {
170 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
171 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
172 }
173
174 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
175 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
176 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
177}
178
179QWaylandInputMethodControlPrivate::QWaylandInputMethodControlPrivate(QWaylandSurface *surface)
180 : compositor(surface->compositor())
181 , seat(compositor->defaultSeat())
182 , surface(surface)
183{
184}
185
186QWaylandQtTextInputMethod *QWaylandInputMethodControlPrivate::textInputMethod() const
187{
188 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::QtTextInputMethodV1))
189 return nullptr;
190 return QWaylandQtTextInputMethod::findIn(seat);
191}
192
193QWaylandTextInput *QWaylandInputMethodControlPrivate::textInput() const
194{
195 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::TextInputV2))
196 return nullptr;
197 return QWaylandTextInput::findIn(seat);
198}
199
200QWaylandTextInputV3 *QWaylandInputMethodControlPrivate::textInputV3() const
201{
202 return QWaylandTextInputV3::findIn(seat);
203}
204
205#include "moc_qwaylandinputmethodcontrol.cpp"
QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const
void inputMethodEvent(QInputMethodEvent *event)
void setSurface(QWaylandSurface *surface)
bool isSurfaceEnabled(QWaylandSurface *surface) const
void surfaceEnabled(QWaylandSurface *surface)
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
void surfaceEnabled(QWaylandSurface *surface)
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
bool isSurfaceEnabled(QWaylandSurface *surface) const
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
bool isSurfaceEnabled(QWaylandSurface *surface) const
void surfaceEnabled(QWaylandSurface *surface)