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
75{
76 Q_D(const QWaylandInputMethodControl);
77
78 return d->enabled;
79}
80
82{
83 Q_D(QWaylandInputMethodControl);
84
85 if (d->enabled == enabled)
86 return;
87
88 d->enabled = enabled;
89 emit enabledChanged(enabled);
90 emit updateInputMethod(Qt::ImQueryInput);
91}
92
93void QWaylandInputMethodControl::surfaceEnabled(QWaylandSurface *surface)
94{
95 Q_D(QWaylandInputMethodControl);
96
97 if (surface == d->surface)
98 setEnabled(true);
99}
100
101void QWaylandInputMethodControl::surfaceDisabled(QWaylandSurface *surface)
102{
103 Q_D(QWaylandInputMethodControl);
104
105 if (surface == d->surface)
106 setEnabled(false);
107}
108
109void QWaylandInputMethodControl::setSurface(QWaylandSurface *surface)
110{
111 Q_D(QWaylandInputMethodControl);
112
113 if (d->surface == surface)
114 return;
115
116 d->surface = surface;
117
118 QWaylandTextInput *textInput = d->textInput();
119 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
120 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
121 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
122 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
123 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
124}
125
127{
128 QWaylandTextInput *textInput = d_func()->textInput();
129
130 if (textInput) {
131 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled, Qt::UniqueConnection);
132 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled, Qt::UniqueConnection);
133 connect(textInput, &QWaylandTextInput::updateInputMethod, this, &QWaylandInputMethodControl::updateInputMethod, Qt::UniqueConnection);
134 }
135}
136
137void QWaylandInputMethodControl::defaultSeatChanged()
138{
139 Q_D(QWaylandInputMethodControl);
140
141 disconnect(d->textInput(), nullptr, this, nullptr);
142 disconnect(d->textInputV3(), nullptr, this, nullptr);
143 disconnect(d->textInputMethod(), nullptr, this, nullptr);
144
145 d->seat = d->compositor->defaultSeat();
146 QWaylandTextInput *textInput = d->textInput();
147 QWaylandTextInputV3 *textInputV3 = d->textInputV3();
148 QWaylandQtTextInputMethod *textInputMethod = d->textInputMethod();
149
150 if (textInput) {
151 connect(textInput, &QWaylandTextInput::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
152 connect(textInput, &QWaylandTextInput::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
153 }
154
155 if (textInputV3) {
156 connect(textInputV3, &QWaylandTextInputV3::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
157 connect(textInputV3, &QWaylandTextInputV3::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
158 }
159
160 if (textInputMethod) {
161 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceEnabled, this, &QWaylandInputMethodControl::surfaceEnabled);
162 connect(textInputMethod, &QWaylandQtTextInputMethod::surfaceDisabled, this, &QWaylandInputMethodControl::surfaceDisabled);
163 }
164
165 setEnabled((textInput && textInput->isSurfaceEnabled(d->surface))
166 || (textInputV3 && textInputV3->isSurfaceEnabled(d->surface))
167 || (textInputMethod && textInputMethod->isSurfaceEnabled(d->surface)));
168}
169
170QWaylandInputMethodControlPrivate::QWaylandInputMethodControlPrivate(QWaylandSurface *surface)
171 : compositor(surface->compositor())
172 , seat(compositor->defaultSeat())
173 , surface(surface)
174{
175}
176
177QWaylandQtTextInputMethod *QWaylandInputMethodControlPrivate::textInputMethod() const
178{
179 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::QtTextInputMethodV1))
180 return nullptr;
181 return QWaylandQtTextInputMethod::findIn(seat);
182}
183
184QWaylandTextInput *QWaylandInputMethodControlPrivate::textInput() const
185{
186 if (!surface->client() || !surface->client()->textInputProtocols().testFlag(QWaylandClient::TextInputProtocol::TextInputV2))
187 return nullptr;
188 return QWaylandTextInput::findIn(seat);
189}
190
191QWaylandTextInputV3 *QWaylandInputMethodControlPrivate::textInputV3() const
192{
193 return QWaylandTextInputV3::findIn(seat);
194}
195
196#include "moc_qwaylandinputmethodcontrol.cpp"
QVariant inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const
void inputMethodEvent(QInputMethodEvent *event)
void setSurface(QWaylandSurface *surface)
void surfaceEnabled(QWaylandSurface *surface)
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
void surfaceEnabled(QWaylandSurface *surface)
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
void sendInputMethodEvent(QInputMethodEvent *event)
void surfaceDisabled(QWaylandSurface *surface)
void surfaceEnabled(QWaylandSurface *surface)