mirror of
https://github.com/edu4rdshl/gnome-shell.git
synced 2026-07-18 07:34:54 +00:00
keyboard: Plug a leak of KeyboardControllers
To make sure the GC really disposes the KeyboardController object we need to remove all references to the object, which means we have to disconnect signals the object connects to, too. This also fixes a bug where keys remain pressed forever and thus also break that key on real keyboards. It happens if the OSK gets destroyed during an OSK-key is being held so the StButton of the key is not released. That means the key remains pressed in the MetaVirtualInputDevice that we are now leaking because KeyboardController isn't garbage collected. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1015
This commit is contained in:
parent
fbfe5a1988
commit
45bc8ae292
1 changed files with 15 additions and 12 deletions
|
|
@ -1255,11 +1255,7 @@ class Keyboard extends St.BoxLayout {
|
|||
|
||||
this._clearShowIdle();
|
||||
|
||||
this._keyboardController = null;
|
||||
this._suggestions = null;
|
||||
this._aspectContainer = null;
|
||||
this._emojiSelection = null;
|
||||
this._keypad = null;
|
||||
this._keyboardController.destroy();
|
||||
|
||||
Main.layoutManager.untrackChrome(this);
|
||||
Main.layoutManager.keyboardBox.remove_actor(this);
|
||||
|
|
@ -1844,13 +1840,20 @@ var KeyboardController = class {
|
|||
this._onSourcesModified.bind(this));
|
||||
this._currentSource = this._inputSourceManager.currentSource;
|
||||
|
||||
Main.inputMethod.connect('notify::content-purpose',
|
||||
this._onContentPurposeHintsChanged.bind(this));
|
||||
Main.inputMethod.connect('notify::content-hints',
|
||||
this._onContentPurposeHintsChanged.bind(this));
|
||||
Main.inputMethod.connect('input-panel-state', (o, state) => {
|
||||
this.emit('panel-state', state);
|
||||
});
|
||||
this._notifyContentPurposeId = Main.inputMethod.connect(
|
||||
'notify::content-purpose', this._onContentPurposeHintsChanged.bind(this));
|
||||
this._notifyContentHintsId = Main.inputMethod.connect(
|
||||
'notify::content-hints', this._onContentPurposeHintsChanged.bind(this));
|
||||
this._notifyInputPanelStateId = Main.inputMethod.connect(
|
||||
'input-panel-state', (o, state) => this.emit('panel-state', state));
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this._inputSourceManager.disconnect(this._sourceChangedId);
|
||||
this._inputSourceManager.disconnect(this._sourcesModifiedId);
|
||||
Main.inputMethod.disconnect(this._notifyContentPurposeId);
|
||||
Main.inputMethod.disconnect(this._notifyContentHintsId);
|
||||
Main.inputMethod.disconnect(this._notifyInputPanelStateId);
|
||||
}
|
||||
|
||||
_onSourcesModified() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue