154 lines
4.8 KiB
JavaScript
154 lines
4.8 KiB
JavaScript
// tweaks-system-menu - Put Gnome Tweaks in the system menu.
|
|
// Copyright (C) 2019, 2020 Philippe Troin (F-i-f on Github)
|
|
//
|
|
// 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 3 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, see <https://www.gnu.org/licenses/>.
|
|
|
|
const BoxPointer = imports.ui.boxpointer;
|
|
const Main = imports.ui.main;
|
|
const PopupMenu = imports.ui.popupMenu;
|
|
const Shell = imports.gi.Shell;
|
|
|
|
const ExtensionUtils = imports.misc.extensionUtils;
|
|
const Me = ExtensionUtils.getCurrentExtension();
|
|
const Convenience = Me.imports.convenience;
|
|
|
|
const Logger = Me.imports.logger;
|
|
|
|
const TweaksSystemMenuExtension = class TweaksSystemMenuExtension {
|
|
constructor() {
|
|
this._logger = null;
|
|
|
|
this._settings = null;
|
|
this._debugSettingChangedConnection = null;
|
|
this._positionSettingChangedConnection = null;
|
|
this._systemMenu = null;
|
|
|
|
this._tweaksApp = null;
|
|
this._tweaksItem = null;
|
|
this._tweaksActivateConnection = null;
|
|
}
|
|
|
|
// Utilities
|
|
_findMenuItemPosition(item) {
|
|
let items = this._systemMenu.menu._getMenuItems();
|
|
for (let i=0; i < items.length; ++i) {
|
|
if (items[i] == item) {
|
|
this._logger.log_debug('_findMenuItemPosition('+item+') = '+i);
|
|
return i;
|
|
}
|
|
}
|
|
this._logger.log_debug('_findMenuItemPosition('+item+') = <null>');
|
|
return null;
|
|
}
|
|
|
|
// Enable/disable
|
|
enable() {
|
|
this._logger = new Logger.Logger('Tweaks-System-Menu');
|
|
this._settings = Convenience.getSettings();
|
|
|
|
this._on_debug_change();
|
|
|
|
this._logger.log_debug('enable()');
|
|
|
|
this._debugSettingChangedConnection = this._settings.connect('changed::debug',
|
|
this._on_debug_change.bind(this));
|
|
this._positionSettingChangedConnection = this._settings.connect('changed::position',
|
|
this._on_position_change.bind(this));
|
|
|
|
this._systemMenu = Main.panel.statusArea.aggregateMenu._system;
|
|
this._showItem();
|
|
|
|
this._logger.log_debug('extension enabled');
|
|
}
|
|
|
|
disable() {
|
|
this._logger.log_debug('disable()');
|
|
|
|
this._hideItem();
|
|
|
|
this._systemMenu = null;
|
|
|
|
this._settings.disconnect(this._debugSettingChangedConnection);
|
|
this._debugSettingChangedConnection = null;
|
|
this._settings.disconnect(this._positionSettingChangedConnection);
|
|
this._positionSettingChangedConnection = null;
|
|
|
|
this._settings = null;
|
|
|
|
this._logger.log_debug('extension disabled');
|
|
this._logger = null;
|
|
}
|
|
|
|
// Show/hide item
|
|
_showItem() {
|
|
this._logger.log_debug('_showItem()');
|
|
|
|
this._tweaksApp = Shell.AppSystem.get_default().lookup_app('org.gnome.tweaks.desktop');
|
|
if (this._tweaksApp) {
|
|
let [icon, name] = [this._tweaksApp.app_info.get_icon().names[0],
|
|
this._tweaksApp.get_name()];
|
|
this._tweaksItem = new PopupMenu.PopupImageMenuItem(name, icon);
|
|
this._tweaksActivateConnection = this._tweaksItem.connect('activate', this._on_activate.bind(this));
|
|
this._systemMenu.menu.addMenuItem(this._tweaksItem);
|
|
this._on_position_change();
|
|
} else {
|
|
this._logger.log('Missing Gnome Tweaks, expect trouble…');
|
|
}
|
|
}
|
|
|
|
_hideItem() {
|
|
this._logger.log_debug('_hideItem()');
|
|
if (this._tweaksItem !== null) {
|
|
this._tweaksItem.disconnect(this._tweaksActivateConnection);
|
|
this._tweaksActivateConnection = null;
|
|
|
|
this._systemMenu.menu._getMenuItems().splice(this._findMenuItemPosition(this._tweaksItem), 1);
|
|
this._tweaksItem.destroy();
|
|
this._tweaksItem = null;
|
|
}
|
|
this._tweaksApp = null;
|
|
}
|
|
|
|
// Event handlers
|
|
_on_debug_change() {
|
|
this._logger.set_debug(this._settings.get_boolean('debug'));
|
|
this._logger.log_debug('debug = '+this._logger.get_debug());
|
|
}
|
|
|
|
_on_position_change() {
|
|
let position = this._settings.get_int('position');
|
|
this._logger.log_debug('_on_position_change(): settings position=' + position);
|
|
if (position == -1) {
|
|
position = this._findMenuItemPosition(this._systemMenu._settingsItem);
|
|
let tweaksPosition = this._findMenuItemPosition(this._tweaksItem);
|
|
if (tweaksPosition > position) {
|
|
position += 1;
|
|
}
|
|
this._logger.log_debug('_on_position_change(): automatic position=' + position);
|
|
}
|
|
this._systemMenu.menu.moveMenuItem(this._tweaksItem, position);
|
|
}
|
|
|
|
_on_activate() {
|
|
this._logger.log_debug('_on_activate()');
|
|
this._systemMenu.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
|
Main.overview.hide();
|
|
this._tweaksApp.activate();
|
|
}
|
|
};
|
|
|
|
function init() {
|
|
return new TweaksSystemMenuExtension();
|
|
}
|