inputMethod: Check return value when letting IM handle virtual keys
When propagating keys from the OSK, we usually feed these directly to the IBusInputContext and let the IM handle the effects of this virtual key event (which may also include feeding a key event back to us). But these functions may also return a FALSE value if the key was "let through" by the IM, which means the ball is in our yard again, and we are responsible of letting this event get to its destination. If that happens, just fall through, so the string is committed to the client as an UTF-8 string, or propagated through keyboard events. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5930 Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2508>
This commit is contained in:
parent
766314acb2
commit
76090c14eb
@ -7,6 +7,8 @@ const Main = imports.ui.main;
|
||||
|
||||
Gio._promisify(IBus.Bus.prototype,
|
||||
'create_input_context_async', 'create_input_context_async_finish');
|
||||
Gio._promisify(IBus.InputContext.prototype,
|
||||
'process_key_event_async', 'process_key_event_async_finish');
|
||||
|
||||
var HIDE_PANEL_TIME = 50;
|
||||
|
||||
@ -332,10 +334,17 @@ var InputMethod = GObject.registerClass({
|
||||
return this._preeditVisible && this._preeditStr !== '' && this._preeditStr !== null;
|
||||
}
|
||||
|
||||
handleVirtualKey(keyval) {
|
||||
this._context.process_key_event_async(
|
||||
keyval, 0, 0, -1, null, null);
|
||||
this._context.process_key_event_async(
|
||||
keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null, null);
|
||||
async handleVirtualKey(keyval) {
|
||||
try {
|
||||
if (!await this._context.process_key_event_async(
|
||||
keyval, 0, 0, -1, null))
|
||||
return false;
|
||||
|
||||
await this._context.process_key_event_async(
|
||||
keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null);
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1569,11 +1569,11 @@ var Keyboard = GObject.registerClass({
|
||||
}
|
||||
}
|
||||
|
||||
_commitAction(keyval, str) {
|
||||
async _commitAction(keyval, str) {
|
||||
if (this._modifiers.size === 0 && str !== '' &&
|
||||
keyval && this._oskCompletionEnabled) {
|
||||
Main.inputMethod.handleVirtualKey(keyval);
|
||||
return;
|
||||
if (await Main.inputMethod.handleVirtualKey(keyval))
|
||||
return;
|
||||
}
|
||||
|
||||
if (str === '' || !Main.inputMethod.currentFocus ||
|
||||
|
Loading…
Reference in New Issue
Block a user