182 lines
5.1 KiB
JavaScript
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)
|
||
|
}
|
||
|
}
|