From 0131408c0d381c00a289048e00f0fff370e88209 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 26 Jan 2024 17:20:00 +0100 Subject: [PATCH] keyboard: Keep OSK widgetry for a single group Keep enough widgetry in memory for just the current group, this means we more eagerly destroy and re-create actors on language changes. Part-of: --- js/ui/keyboard.js | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js index 6896fad9c..7089609a0 100644 --- a/js/ui/keyboard.js +++ b/js/ui/keyboard.js @@ -1380,7 +1380,6 @@ export const Keyboard = GObject.registerClass({ this._keyboardController = new KeyboardController(); - this._groups = {}; this._currentPage = null; this._suggestions = new Suggestions(); @@ -1461,10 +1460,15 @@ export const Keyboard = GObject.registerClass({ } } - _createLayersForGroup(groupName) { + _updateLayoutForGroup(groupName) { let keyboardModel = new KeyboardModel(groupName); - let layers = {}; let levels = keyboardModel.getLevels(); + let layers = {}; + let layout = new Clutter.Actor({ + layout_manager: new Clutter.BinLayout(), + x_expand: true, + y_expand: true, + }); for (let i = 0; i < levels.length; i++) { let currentLevel = levels[i]; /* There are keyboard maps which consist of 3 levels (no uppercase, @@ -1473,19 +1477,21 @@ export const Keyboard = GObject.registerClass({ */ let level = i >= 1 && levels.length === 3 ? i + 1 : i; - let layout = new KeyContainer(); - layout.shiftKeys = []; - layout.mode = currentLevel.mode; + let levelLayout = new KeyContainer(); + levelLayout.shiftKeys = []; + levelLayout.mode = currentLevel.mode; - this._loadRows(currentLevel, level, levels.length, layout); - layers[level] = layout; - this._aspectContainer.add_child(layout); - layout.layoutButtons(); - - layout.hide(); + this._loadRows(currentLevel, level, levels.length, levelLayout); + layers[level] = levelLayout; + layout.add_child(levelLayout); + levelLayout.layoutButtons(); + levelLayout.hide(); } - return layers; + this._aspectContainer.add_child(layout); + this._currentLayout?.destroy(); + this._currentLayout = layout; + this._layers = layers; } _ensureKeys() { @@ -1495,8 +1501,7 @@ export const Keyboard = GObject.registerClass({ else group = this._keyboardController.getCurrentGroup(); - if (!this._groups[group]) - this._groups[group] = this._createLayersForGroup(group); + this._updateLayoutForGroup(group); } _addRowKeys(keys, layout) { @@ -1805,12 +1810,6 @@ export const Keyboard = GObject.registerClass({ } _onKeyboardGroupsChanged() { - let nonGroupActors = [this._emojiSelection, this._keypad]; - this._aspectContainer.get_children().filter(c => !nonGroupActors.includes(c)).forEach(c => { - c.destroy(); - }); - - this._groups = {}; this._onGroupChanged(); } @@ -1850,8 +1849,7 @@ export const Keyboard = GObject.registerClass({ } _setActiveLayer(activeLevel) { - let activeGroupName = this._keyboardController.getCurrentGroup(); - let layers = this._groups[activeGroupName]; + const layers = this._layers; let currentPage = layers[activeLevel]; if (this._currentPage === currentPage) {