Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qwaylandinputcontext.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
6
#
include
"qwaylandinputcontext_p.h"
7
8
#
include
<
QtGui
/
QGuiApplication
>
9
#
include
<
QtGui
/
QTextCharFormat
>
10
#
include
<
QtGui
/
QWindow
>
11
#
include
<
QtCore
/
QVarLengthArray
>
12
13
#
include
"qwaylanddisplay_p.h"
14
#
include
"qwaylandinputdevice_p.h"
15
#
include
"qwaylandwindow_p.h"
16
17
#
if
QT_CONFIG
(
xkbcommon
)
18
#
include
<
locale
.
h
>
19
#
endif
20
21
QT_BEGIN_NAMESPACE
22
23
Q_LOGGING_CATEGORY(qLcQpaInputMethods,
"qt.qpa.input.methods"
)
24
25
namespace
QtWaylandClient
{
26
27
QWaylandInputContext
::QWaylandInputContext(QWaylandDisplay *display)
28
: mDisplay(display)
29
{
30
}
31
32
QWaylandInputContext
::~
QWaylandInputContext
()
33
{
34
#
if
QT_CONFIG
(
xkbcommon
)
35
xkb_compose_state_unref(m_composeState);
36
xkb_compose_table_unref(m_composeTable);
37
#
endif
38
}
39
40
bool
QWaylandInputContext
::
isValid
()
const
41
{
42
return
mDisplay->textInputManagerv2() !=
nullptr
|| mDisplay->textInputManagerv1() !=
nullptr
|| mDisplay->textInputManagerv3() !=
nullptr
;
43
}
44
45
void
QWaylandInputContext
::
reset
()
46
{
47
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
48
#
if
QT_CONFIG
(
xkbcommon
)
49
if
(m_composeState)
50
xkb_compose_state_reset(m_composeState);
51
#
endif
52
53
QPlatformInputContext::reset();
54
55
QWaylandTextInputInterface
*inputInterface = textInput();
56
if
(!inputInterface)
57
return
;
58
59
inputInterface
->
reset
(
)
;
60
}
61
62
void
QWaylandInputContext
::
commit
()
63
{
64
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
65
66
QWaylandTextInputInterface
*inputInterface = textInput();
67
if
(!inputInterface)
68
return
;
69
70
inputInterface
->
commit
(
)
;
71
}
72
73
static
::wl_surface *
surfaceForWindow
(QWindow *window)
74
{
75
if
(!window || !window->handle())
76
return
nullptr
;
77
78
auto
*waylandWindow =
static_cast
<QWaylandWindow *>(window->handle());
79
return
waylandWindow->wlSurface();
80
}
81
82
void
QWaylandInputContext
::
update
(Qt::InputMethodQueries queries)
83
{
84
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO << queries;
85
86
QWaylandTextInputInterface
*inputInterface = textInput();
87
88
// When a client changing focusObject, update could be called
89
// before setFocusObject, but it will not be processed.
90
if
((m_focusObject != QGuiApplication::focusObject()) || !inputInterface)
91
return
;
92
93
inputInterface->updateState(queries,
QWaylandTextInputInterface
::
update_state_change
);
94
}
95
96
void
QWaylandInputContext
::
invokeAction
(QInputMethod::Action action,
int
cursorPostion)
97
{
98
QWaylandTextInputInterface
*inputInterface = textInput();
99
if
(!inputInterface)
100
return
;
101
102
if
(action == QInputMethod::Click)
103
inputInterface
->
setCursorInsidePreedit
(
cursorPostion
)
;
104
}
105
106
void
QWaylandInputContext
::
showInputPanel
()
107
{
108
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
109
110
QWaylandTextInputInterface
*inputInterface = textInput();
111
if
(!inputInterface)
112
return
;
113
114
inputInterface
->
showInputPanel
(
)
;
115
}
116
117
void
QWaylandInputContext
::
hideInputPanel
()
118
{
119
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
120
121
QWaylandTextInputInterface
*inputInterface = textInput();
122
if
(!inputInterface)
123
return
;
124
125
inputInterface
->
hideInputPanel
(
)
;
126
}
127
128
bool
QWaylandInputContext
::
isInputPanelVisible
()
const
129
{
130
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
131
132
QWaylandTextInputInterface
*inputInterface = textInput();
133
if
(!inputInterface)
134
return
QPlatformInputContext::isInputPanelVisible();
135
136
return
inputInterface
->
isInputPanelVisible
(
)
;
137
}
138
139
QRectF
QWaylandInputContext
::
keyboardRect
()
const
140
{
141
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
142
143
QWaylandTextInputInterface
*inputInterface = textInput();
144
if
(!inputInterface)
145
return
QPlatformInputContext::keyboardRect();
146
147
return
inputInterface->keyboardRect();
148
}
149
150
QLocale
QWaylandInputContext
::
locale
()
const
151
{
152
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
153
154
QWaylandTextInputInterface
*inputInterface = textInput();
155
if
(!inputInterface)
156
return
QPlatformInputContext::locale();
157
158
return
inputInterface->locale();
159
}
160
161
Qt
::
LayoutDirection
QWaylandInputContext
::
inputDirection
()
const
162
{
163
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
164
165
QWaylandTextInputInterface
*inputInterface = textInput();
166
if
(!inputInterface)
167
return
QPlatformInputContext::inputDirection();
168
169
return
inputInterface->inputDirection();
170
}
171
172
void
QWaylandInputContext
::
setFocusObject
(QObject *object)
173
{
174
qCDebug(qLcQpaInputMethods) << Q_FUNC_INFO;
175
176
QWaylandTextInputInterface
*inputInterface = textInput();
177
if
(!inputInterface)
178
return
;
179
180
if
(m_focusObject == object)
181
return
;
182
183
if
(mCurrentWindow) {
184
if
(
auto
currentSurface = surfaceForWindow(mCurrentWindow))
185
inputInterface
->
disableSurface
(
currentSurface
)
;
186
mCurrentWindow.clear();
187
}
188
189
if
(object && inputMethodAccepted()) {
190
mCurrentWindow = QGuiApplication::focusWindow();
191
if
(
auto
currentSurface = surfaceForWindow(mCurrentWindow)) {
192
inputInterface
->
enableSurface
(
currentSurface
)
;
193
inputInterface->updateState(Qt::ImQueryAll,
QWaylandTextInputInterface
::
update_state_enter
);
194
}
195
}
196
m_focusObject = object;
197
}
198
199
QWaylandTextInputInterface
*
QWaylandInputContext
::textInput()
const
200
{
201
return
mDisplay->defaultInputDevice() ? mDisplay->defaultInputDevice()->textInput() :
nullptr
;
202
}
203
204
#
if
QT_CONFIG
(
xkbcommon
)
205
206
void
QWaylandInputContext
::
ensureInitialized
()
207
{
208
if
(
m_initialized
)
209
return
;
210
211
if
(!
m_XkbContext
) {
212
qCWarning
(
qLcQpaInputMethods
) <<
"error: xkb context has not been set on"
<<
metaObject
()->
className
();
213
return
;
214
}
215
216
m_initialized
=
true
;
217
const
char
*
const
locale
=
setlocale
(
LC_CTYPE
,
nullptr
);
218
qCDebug
(
qLcQpaInputMethods
) <<
"detected locale (LC_CTYPE):"
<<
locale
;
219
220
m_composeTable
=
xkb_compose_table_new_from_locale
(
m_XkbContext
,
locale
,
XKB_COMPOSE_COMPILE_NO_FLAGS
);
221
if
(
m_composeTable
)
222
m_composeState
=
xkb_compose_state_new
(
m_composeTable
,
XKB_COMPOSE_STATE_NO_FLAGS
);
223
224
if
(!
m_composeTable
) {
225
qCWarning
(
qLcQpaInputMethods
,
"failed to create compose table"
);
226
return
;
227
}
228
if
(!
m_composeState
) {
229
qCWarning
(
qLcQpaInputMethods
,
"failed to create compose state"
);
230
return
;
231
}
232
}
233
234
bool
QWaylandInputContext
::
filterEvent
(
const
QEvent
*
event
)
235
{
236
auto
keyEvent
=
static_cast
<
const
QKeyEvent
*>(
event
);
237
if
(
keyEvent
->
type
() !=
QEvent
::
KeyPress
)
238
return
false
;
239
240
if
(!
inputMethodAccepted
())
241
return
false
;
242
243
// lazy initialization - we don't want to do this on an app startup
244
ensureInitialized
();
245
246
if
(!
m_composeTable
|| !
m_composeState
)
247
return
false
;
248
249
xkb_compose_state_feed
(
m_composeState
,
keyEvent
->
nativeVirtualKey
());
250
251
switch
(
xkb_compose_state_get_status
(
m_composeState
)) {
252
case
XKB_COMPOSE_COMPOSING
:
253
return
true
;
254
case
XKB_COMPOSE_CANCELLED
:
255
reset
();
256
return
false
;
257
case
XKB_COMPOSE_COMPOSED
:
258
{
259
const
int
size
=
xkb_compose_state_get_utf8
(
m_composeState
,
nullptr
, 0);
260
QVarLengthArray
<
char
, 32>
buffer
(
size
+ 1);
261
xkb_compose_state_get_utf8
(
m_composeState
,
buffer
.
data
(),
buffer
.
size
());
262
QString
composedText
=
QString
::
fromUtf8
(
buffer
.
constData
());
263
264
QInputMethodEvent
event
;
265
event
.
setCommitString
(
composedText
);
266
267
if
(!
m_focusObject
&&
qApp
)
268
m_focusObject
=
qApp
->
focusObject
();
269
270
if
(
m_focusObject
)
271
QCoreApplication
::
sendEvent
(
m_focusObject
, &
event
);
272
else
273
qCWarning
(
qLcQpaInputMethods
,
"no focus object"
);
274
275
reset
();
276
return
true
;
277
}
278
case
XKB_COMPOSE_NOTHING
:
279
return
false
;
280
default
:
281
Q_UNREACHABLE_RETURN
(
false
);
282
}
283
}
284
285
#
endif
286
287
}
288
289
QT_END_NAMESPACE
290
291
#
include
"moc_qwaylandinputcontext_p.cpp"
QtWaylandClient::QWaylandInputContext
Definition
qwaylandinputcontext_p.h:43
QtWaylandClient::QWaylandInputContext::hideInputPanel
void hideInputPanel() override
Request to hide input panel.
Definition
qwaylandinputcontext.cpp:117
QtWaylandClient::QWaylandInputContext::keyboardRect
QRectF keyboardRect() const override
This function can be reimplemented to return virtual keyboard rectangle in currently active window co...
Definition
qwaylandinputcontext.cpp:139
QtWaylandClient::QWaylandInputContext::reset
void reset() override
Method to be called when input method needs to be reset.
Definition
qwaylandinputcontext.cpp:45
QtWaylandClient::QWaylandInputContext::commit
void commit() override
Definition
qwaylandinputcontext.cpp:62
QtWaylandClient::QWaylandInputContext::~QWaylandInputContext
~QWaylandInputContext() override
Definition
qwaylandinputcontext.cpp:32
QtWaylandClient::QWaylandInputContext::showInputPanel
void showInputPanel() override
Request to show input panel.
Definition
qwaylandinputcontext.cpp:106
QtWaylandClient::QWaylandInputContext::inputDirection
Qt::LayoutDirection inputDirection() const override
Definition
qwaylandinputcontext.cpp:161
QtWaylandClient::QWaylandInputContext::invokeAction
void invokeAction(QInputMethod::Action, int cursorPosition) override
Called when the word currently being composed in the input item is tapped by the user.
Definition
qwaylandinputcontext.cpp:96
QtWaylandClient::QWaylandInputContext::setFocusObject
void setFocusObject(QObject *object) override
This virtual method gets called to notify updated focus to object.
Definition
qwaylandinputcontext.cpp:172
QtWaylandClient::QWaylandInputContext::isValid
bool isValid() const override
Returns input context validity.
Definition
qwaylandinputcontext.cpp:40
QtWaylandClient::QWaylandInputContext::isInputPanelVisible
bool isInputPanelVisible() const override
Returns input panel visibility status.
Definition
qwaylandinputcontext.cpp:128
QtWaylandClient::QWaylandInputContext::update
void update(Qt::InputMethodQueries) override
Notification on editor updates.
Definition
qwaylandinputcontext.cpp:82
QtWaylandClient::QWaylandInputContext::locale
QLocale locale() const override
Definition
qwaylandinputcontext.cpp:150
QtWaylandClient::QWaylandTextInputInterface
Definition
qwaylandtextinputinterface_p.h:30
QtWaylandClient::QWaylandTextInputInterface::enableSurface
virtual void enableSurface(::wl_surface *surface)=0
QtWaylandClient::QWaylandTextInputInterface::isInputPanelVisible
virtual bool isInputPanelVisible() const =0
QtWaylandClient::QWaylandTextInputInterface::hideInputPanel
virtual void hideInputPanel()
Definition
qwaylandtextinputinterface_p.h:39
QtWaylandClient::QWaylandTextInputInterface::setCursorInsidePreedit
virtual void setCursorInsidePreedit(int cursor)=0
QtWaylandClient::QWaylandTextInputInterface::showInputPanel
virtual void showInputPanel()
Definition
qwaylandtextinputinterface_p.h:38
QtWaylandClient::QWaylandTextInputInterface::disableSurface
virtual void disableSurface(::wl_surface *surface)=0
QtWaylandClient::QWaylandTextInputInterface::update_state_enter
@ update_state_enter
Definition
qwaylandtextinputinterface_p.h:53
QtWaylandClient::QWaylandTextInputInterface::update_state_change
@ update_state_change
Definition
qwaylandtextinputinterface_p.h:50
QtWaylandClient::QWaylandTextInputInterface::reset
virtual void reset()=0
QtWaylandClient::QWaylandTextInputInterface::commit
virtual void commit()=0
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtWaylandClient
Definition
qwaylandclientextension.h:16
QtWaylandClient::surfaceForWindow
::wl_surface * surfaceForWindow(QWindow *window)
Definition
qwaylandinputcontext.cpp:73
qtbase
src
plugins
platforms
wayland
qwaylandinputcontext.cpp
Generated on
for Qt by
1.18.0