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// Qt-Security score:significant reason:default
4
7
9#include "qwaylandseat.h"
11#include "qwaylandview.h"
15
16#include <QtGui/QInputMethodEvent>
17
18QWaylandInputMethodControl::QWaylandInputMethodControl(QWaylandSurface *surface)
19 : QObject(*new QWaylandInputMethodControlPrivate(surface), surface)
20{
21 connect(d_func()->compositor, &QWaylandCompositor::defaultSeatChanged,
22 this, &QWaylandInputMethodControl::defaultSeatChanged);
23
24 updateTextInput();
25
26 QWaylandTextInputV3 *textInputV3 = d_func()->textInputV3();
27 if (textInputV3) {
28 connect(textInputV3, &QWaylandTextInputV3::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
29 connect(textInputV3, &QWaylandTextInputV3::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
30 connect(textInputV3, &QWaylandTextInputV3::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod);
31 }
32
33 QWaylandQtTextInputMethod *textInputMethod = d_func()->textInputMethod();
34 if (textInputMethod) {
35 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
36 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
37 connect(textInputMethod, &QWaylandQtTextInputMethod::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod);
38 }
39}
40
41QVariant QWaylandInputMethodControl::inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const
42{
43 Q_D(const QWaylandInputMethodControl);
44
45 QWaylandTextInput *textInput = d->textInput();
46 if (textInput != nullptr && textInput->focus() == d->surface)
47 return textInput->inputMethodQuery(query, argument);
48
49 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
50 if (textInputV3 != nullptr && textInputV3->focus() == d->surface)
51 return textInputV3->inputMethodQuery(query, argument);
52
53 QWaylandQtTextInputMethod *textInputMethod = d_func()->textInputMethod();
54 if (textInputMethod && textInputMethod->focusedSurface() == d->surface)
55 return textInputMethod->inputMethodQuery(query, argument);
56
57 return QVariant();
58}
59
60void QWaylandInputMethodControl::inputMethodEvent(QInputMethodEvent *event)
61{
62 Q_D(QWaylandInputMethodControl);
63
64 if (QWaylandTextInput *textInput = d->textInput()) {
65 textInput->sendInputMethodEvent(event);
66 } else if (QWaylandTextInputV3 *textInputV3 = d->textInputV3()) {
67 textInputV3->sendInputMethodEvent(event);
68 } else if (QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod()) {
69 textInputMethod->sendInputMethodEvent(event);
70 } else {
71 event->ignore();
72 }
73}
74
75/*!
76 * \property QWaylandInputMethodControl::enabled
77 *
78 * This property indicates whether the input method control is enabled for the
79 * surface.
80 *
81 * The property is \c true when text input is enabled for the associated
82 * surface; otherwise \c false.
83 */
85{
86 Q_D(const QWaylandInputMethodControl);
87
88 return d->enabled;
89}
90
92{
93 Q_D(QWaylandInputMethodControl);
94
95 if (d->enabled == enabled)
96 return;
97
98 d->enabled = enabled;
99 emit enabledChanged(enabled);
100 emit updateInputMethod(Qt::ImQueryInput);
101}
102
103void QWaylandInputMethodControl::surfaceEnabled(QWaylandSurface *surface)
104{
105 Q_D(QWaylandInputMethodControl);
106
107 if (surface == d->surface)
108 setEnabled(true);
109}
110
111void QWaylandInputMethodControl::surfaceDisabled(QWaylandSurface *surface)
112{
113 Q_D(QWaylandInputMethodControl);
114
115 if (surface == d->surface)
116 setEnabled(false);
117}
118
119void QWaylandInputMethodControl::setSurface(QWaylandSurface *surface)
120{
121 Q_D(QWaylandInputMethodControl);
122
123 if (d->surface == surface)
124 return;
125
126 d->surface = surface;
127
128 QWaylandTextInput *textInput = d->textInput();
129 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
130 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
131 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
132 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
133 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
134}
135
137{
138 QWaylandTextInput *textInput = d_func()->textInput();
139
140 if (textInput) {
141 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled, Qt::UniqueConnection);
142 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled, Qt::UniqueConnection);
143 connect(textInput, &QWaylandTextInput::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod, Qt::UniqueConnection);
144 }
145}
146
147void QWaylandInputMethodControl::defaultSeatChanged()
148{
149 Q_D(QWaylandInputMethodControl);
150
151 disconnect(d->textInput(), nullptr, this, nullptr);
152 disconnect(d->textInputV3(), nullptr, this, nullptr);
153 disconnect(d->textInputMethod(), nullptr, this, nullptr);
154
155 d->seat = d->compositor->defaultSeat();
156 QWaylandTextInput *textInput = d->textInput();
157 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
158 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
159
160 if (textInput) {
161 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
162 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
163 }
164
165 if (textInputV3) {
166 connect(textInputV3, &QWaylandTextInputV3::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
167 connect(textInputV3, &QWaylandTextInputV3::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
168 }
169
170 if (textInputMethod) {
171 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
172 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
173 }
174
175 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
176 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
177 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
178}
179
180QWaylandInputMethodControlPrivate::QWaylandInputMethodControlPrivate(QWaylandSurface *surface)
181 : compositor(surface->compositor())
182 , seat(compositor->defaultSeat())
183 , surface(surface)
184{
185}
186
187QWaylandQtTextInputMethod *QWaylandInputMethodControlPrivate::textInputMethod() const
188{
189 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::QtTextInputMethodV1))
190 return nullptr;
191 return QWaylandQtTextInputMethod::findIn(seat);
192}
193
194QWaylandTextInput *QWaylandInputMethodControlPrivate::textInput() const
195{
196 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::TextInputV2))
197 return nullptr;
198 return QWaylandTextInput::findIn(seat);
199}
200
201QWaylandTextInputV3 *QWaylandInputMethodControlPrivate::textInputV3() const
202{
203 return QWaylandTextInputV3::findIn(seat);
204}
205
206#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)