keyboard: Properly destroy focus manager when destroying keyboard
We're currently leaking this object, so make sure to disconnect everything properly and plug the leak. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1728>
This commit is contained in:
parent
6f39d76a3e
commit
d8adeba6b6
@ -553,39 +553,50 @@ var FocusTracker = class {
|
|||||||
this._currentWindow = null;
|
this._currentWindow = null;
|
||||||
this._rect = null;
|
this._rect = null;
|
||||||
|
|
||||||
global.display.connect('notify::focus-window', () => {
|
this._notifyFocusId = global.display.connect('notify::focus-window', () => {
|
||||||
this._setCurrentWindow(global.display.focus_window);
|
this._setCurrentWindow(global.display.focus_window);
|
||||||
this.emit('window-changed', this._currentWindow);
|
this.emit('window-changed', this._currentWindow);
|
||||||
});
|
});
|
||||||
|
|
||||||
global.display.connect('grab-op-begin', (display, window, op) => {
|
this._grabOpBeginId = global.display.connect('grab-op-begin', (display, window, op) => {
|
||||||
if (window == this._currentWindow &&
|
if (window == this._currentWindow &&
|
||||||
(op == Meta.GrabOp.MOVING || op == Meta.GrabOp.KEYBOARD_MOVING))
|
(op == Meta.GrabOp.MOVING || op == Meta.GrabOp.KEYBOARD_MOVING))
|
||||||
this.emit('window-grabbed');
|
this.emit('window-grabbed');
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Valid for wayland clients */
|
/* Valid for wayland clients */
|
||||||
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
|
this._cursorLocationChangedId =
|
||||||
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
|
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
|
||||||
this._setCurrentRect(newRect);
|
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
|
||||||
});
|
this._setCurrentRect(newRect);
|
||||||
|
});
|
||||||
|
|
||||||
this._ibusManager = IBusManager.getIBusManager();
|
this._ibusManager = IBusManager.getIBusManager();
|
||||||
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
|
this._setCursorLocationId =
|
||||||
/* Valid for X11 clients only */
|
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
|
||||||
if (Main.inputMethod.currentFocus)
|
/* Valid for X11 clients only */
|
||||||
return;
|
if (Main.inputMethod.currentFocus)
|
||||||
|
return;
|
||||||
|
|
||||||
this._setCurrentRect(rect);
|
this._setCurrentRect(rect);
|
||||||
});
|
});
|
||||||
this._ibusManager.connect('focus-in', () => {
|
this._focusInId = this._ibusManager.connect('focus-in', () => {
|
||||||
this.emit('focus-changed', true);
|
this.emit('focus-changed', true);
|
||||||
});
|
});
|
||||||
this._ibusManager.connect('focus-out', () => {
|
this._focusOutId = this._ibusManager.connect('focus-out', () => {
|
||||||
this.emit('focus-changed', false);
|
this.emit('focus-changed', false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destroy() {
|
||||||
|
global.display.disconnect(this._notifyFocusId);
|
||||||
|
global.display.disconnect(this._grabOpBeginId);
|
||||||
|
Main.inputMethod.disconnect(this._cursorLocationChangedId);
|
||||||
|
this._ibusManager.disconnect(this._setCursorLocationId);
|
||||||
|
this._ibusManager.disconnect(this._focusInId);
|
||||||
|
this._ibusManager.disconnect(this._focusOutId);
|
||||||
|
}
|
||||||
|
|
||||||
get currentWindow() {
|
get currentWindow() {
|
||||||
return this._currentWindow;
|
return this._currentWindow;
|
||||||
}
|
}
|
||||||
@ -1304,6 +1315,11 @@ var Keyboard = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
_onDestroy() {
|
_onDestroy() {
|
||||||
|
if (this._focusTracker) {
|
||||||
|
this._focusTracker.destroy();
|
||||||
|
delete this._focusTracker;
|
||||||
|
}
|
||||||
|
|
||||||
for (let [obj, id] of this._connectionsIDs)
|
for (let [obj, id] of this._connectionsIDs)
|
||||||
obj.disconnect(id);
|
obj.disconnect(id);
|
||||||
delete this._connectionsIDs;
|
delete this._connectionsIDs;
|
||||||
|
Loading…
Reference in New Issue
Block a user