%PDF- %PDF-
Direktori : /usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/ |
Current File : //usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/trayIconsManager.js |
// This file is part of the AppIndicator/KStatusNotifierItem GNOME Shell extension // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. import Shell from 'gi://Shell'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import * as Signals from 'resource:///org/gnome/shell/misc/signals.js'; import * as IndicatorStatusIcon from './indicatorStatusIcon.js'; import * as Util from './util.js'; import * as SettingsManager from './settingsManager.js'; let trayIconsManager; export class TrayIconsManager extends Signals.EventEmitter { static initialize() { if (!trayIconsManager) trayIconsManager = new TrayIconsManager(); return trayIconsManager; } static destroy() { trayIconsManager.destroy(); } constructor() { super(); if (trayIconsManager) throw new Error('TrayIconsManager is already constructed'); this._changedId = SettingsManager.getDefaultGSettings().connect( 'changed::legacy-tray-enabled', () => this._toggle()); this._toggle(); } _toggle() { if (SettingsManager.getDefaultGSettings().get_boolean('legacy-tray-enabled')) this._enable(); else this._disable(); } _enable() { if (this._tray) return; this._tray = new Shell.TrayManager(); Util.connectSmart(this._tray, 'tray-icon-added', this, this.onTrayIconAdded); Util.connectSmart(this._tray, 'tray-icon-removed', this, this.onTrayIconRemoved); this._tray.manage_screen(Main.panel); } _disable() { if (!this._tray) return; IndicatorStatusIcon.getTrayIcons().forEach(i => i.destroy()); if (this._tray.unmanage_screen) { this._tray.unmanage_screen(); this._tray = null; } else { // FIXME: This is very ugly, but it's needed by old shell versions this._tray = null; imports.system.gc(); // force finalizing tray to unmanage screen } } onTrayIconAdded(_tray, icon) { const trayIcon = new IndicatorStatusIcon.IndicatorStatusTrayIcon(icon); IndicatorStatusIcon.addIconToPanel(trayIcon); } onTrayIconRemoved(_tray, icon) { try { const [trayIcon] = IndicatorStatusIcon.getTrayIcons().filter(i => i.icon === icon); trayIcon.destroy(); } catch (e) { Util.Logger.warning(`No icon container found for ${icon.title} (${icon})`); } } destroy() { this.emit('destroy'); SettingsManager.getDefaultGSettings().disconnect(this._changedId); this._disable(); trayIconsManager = null; } }