163 lines
4.6 KiB
JavaScript
163 lines
4.6 KiB
JavaScript
const GObject = imports.gi.GObject;
|
|
const St = imports.gi.St;
|
|
const Shell = imports.gi.Shell;
|
|
const Meta = imports.gi.Meta;
|
|
const Main = imports.ui.main;
|
|
const Unite = imports.misc.extensionUtils.getCurrentExtension();
|
|
const Base = Unite.imports.module.BaseModule;
|
|
const WindowControls = Unite.imports.panel.WindowControls;
|
|
const isWindow = Unite.imports.helpers.isWindow;
|
|
const isMaximized = Unite.imports.helpers.isMaximized;
|
|
const loadStyles = Unite.imports.helpers.loadStyles;
|
|
const unloadStyles = Unite.imports.helpers.unloadStyles;
|
|
|
|
var WindowButtons = new GObject.Class({
|
|
Name: 'UniteWindowButtons',
|
|
Extends: Base,
|
|
|
|
_enableKey: 'show-window-buttons',
|
|
_disableValue: 'never',
|
|
|
|
_onInitialize() {
|
|
this.monitorManager = Meta.MonitorManager.get();
|
|
},
|
|
|
|
_onActivate() {
|
|
this._signals.connect(global.display, 'notify::focus-window', 'toggleButtons');
|
|
this._signals.connect(global.window_manager, 'size-change', 'toggleButtons');
|
|
this._signals.connect(global.window_manager, 'destroy', 'toggleButtons');
|
|
this._signals.connect(this.monitorManager, 'monitors-changed', 'toggleButtons');
|
|
|
|
this._signals.connect(Main.overview, 'showing', 'toggleButtons');
|
|
this._signals.connect(Main.overview, 'hiding', 'toggleButtons');
|
|
|
|
this._settings.connect('window-buttons-theme', 'updateTheme');
|
|
this._settings.connect('button-layout', 'updateButtons');
|
|
this._settings.connect('restrict-to-primary-screen', 'updateButtons');
|
|
|
|
this._createButtons();
|
|
this._toggleButtons();
|
|
this._loadTheme();
|
|
},
|
|
|
|
_onReset() {
|
|
this._toggleButtons();
|
|
},
|
|
|
|
_onDeactivate() {
|
|
this._unloadTheme();
|
|
this._destroyButtons();
|
|
},
|
|
|
|
_createButtons() {
|
|
let buttons = this._settings.get('window-buttons-layout');
|
|
let side = this._settings.get('window-buttons-position');
|
|
let index = side == 'left' ? 1 : -1;
|
|
|
|
if (!buttons || this._controls) return;
|
|
|
|
this._controls = new WindowControls();
|
|
|
|
this._controls.addButtons(buttons, (actor, event) => {
|
|
this._onButtonClick(actor, event);
|
|
});
|
|
|
|
Main.panel.addToStatusArea('uniteWindowControls', this._controls, index, side);
|
|
|
|
if (side == 'left') {
|
|
const appMenu = Main.panel.statusArea.appMenu.actor.get_parent();
|
|
const buttons = this._controls.actor.get_parent();
|
|
|
|
Main.panel._leftBox.set_child_below_sibling(buttons, appMenu);
|
|
}
|
|
},
|
|
|
|
_destroyButtons() {
|
|
if (!this._controls) return;
|
|
|
|
this._controls.destroy();
|
|
this._controls = null;
|
|
},
|
|
|
|
_updateButtons() {
|
|
this._destroyButtons();
|
|
this._createButtons();
|
|
},
|
|
|
|
_updateTheme() {
|
|
this._unloadTheme();
|
|
this._loadTheme();
|
|
},
|
|
|
|
_loadTheme() {
|
|
if (this._themeFile || !this._controls) return;
|
|
|
|
this._themeName = this._settings.get('window-buttons-theme');
|
|
this._themeFile = loadStyles(`themes/${this._themeName}/stylesheet.css`);
|
|
|
|
this._controls.actor.add_style_class_name(`${this._themeName}-buttons`);
|
|
},
|
|
|
|
_unloadTheme() {
|
|
if (!this._themeFile || !this._controls) return;
|
|
|
|
this._controls.actor.remove_style_class_name(`${this._themeName}-buttons`);
|
|
|
|
this._themeName = this._settings.get('window-buttons-theme');
|
|
this._themeFile = unloadStyles(this._themeFile);
|
|
},
|
|
|
|
_onButtonClick(actor, event) {
|
|
let focusWindow = global.display.focus_window;
|
|
if (!focusWindow) return;
|
|
|
|
switch (actor._windowAction) {
|
|
case 'minimize': return this._minimizeWindow(focusWindow);
|
|
case 'maximize': return this._maximizeWindow(focusWindow);
|
|
case 'close': return this._closeWindow(focusWindow);
|
|
}
|
|
},
|
|
|
|
_minimizeWindow(win) {
|
|
if (!win.minimized) win.minimize();
|
|
},
|
|
|
|
_maximizeWindow(win) {
|
|
let bothMaximized = Meta.MaximizeFlags.BOTH;
|
|
let maximizeState = win.get_maximized();
|
|
|
|
if (maximizeState === bothMaximized)
|
|
win.unmaximize(bothMaximized);
|
|
else
|
|
win.maximize(bothMaximized);
|
|
},
|
|
|
|
_closeWindow(win) {
|
|
win.delete(global.get_current_time());
|
|
},
|
|
|
|
_toggleButtons() {
|
|
if (!this._controls) return;
|
|
|
|
let focusWindow = global.display.focus_window;
|
|
let overview = Main.overview.visibleTarget;
|
|
let valid = isWindow(focusWindow);
|
|
let visible = false;
|
|
|
|
if (!overview && valid) {
|
|
let maxed = isMaximized(focusWindow, this._setting);
|
|
let always = this._setting == 'always' && focusWindow;
|
|
|
|
visible = always || maxed;
|
|
} else {
|
|
let target = Main.panel.statusArea.appMenu._targetApp;
|
|
let state = target != null && target.get_state();
|
|
let running = state == Shell.AppState.RUNNING;
|
|
|
|
visible = running && !overview;
|
|
}
|
|
|
|
this._controls.setVisible(visible);
|
|
}
|
|
});
|