gconf-settings/skel/.local/share/gnome-shell/extensions/unite@hardpixel.eu/modules/windowButtons.js

182 lines
5.1 KiB
JavaScript

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 = class WindowButtons extends Base {
_onSetup() {
this._enableKey = 'show-window-buttons'
this._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('window-buttons-placement', '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 place = this._settings.get('window-buttons-placement')
let index = side == 'left' ? 1 : -1
if (!buttons || this._controls) return
if ((place == 'right' || place == 'last') && side == 'left') {
buttons = buttons.reverse()
}
if (place == 'left' || place == 'first') {
side = 'left'
index = 0
}
if (place == 'right' || place == 'last') {
side = 'right'
index = -1
}
this._controls = new WindowControls()
this._controls.addButtons(buttons, (actor, event) => {
this._onButtonClick(actor, event)
})
Main.panel.addToStatusArea('uniteWindowControls', this._controls, index, side)
const widget = this._controls.get_parent()
const appMenu = Main.panel.statusArea.appMenu.get_parent()
const aggMenu = Main.panel.statusArea.aggregateMenu.get_parent()
if (side == 'left' && place != 'first') {
Main.panel._leftBox.set_child_below_sibling(widget, appMenu)
}
if (side == 'right' && place != 'last') {
Main.panel._rightBox.set_child_below_sibling(widget, aggMenu)
}
}
_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.add_style_class_name(`${this._themeName}-buttons`)
}
_unloadTheme() {
if (!this._themeFile || !this._controls) return
this._controls.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)
}
}