254 lines
6.4 KiB
JavaScript
254 lines
6.4 KiB
JavaScript
|
const GObject = imports.gi.GObject
|
||
|
const St = imports.gi.St
|
||
|
const Clutter = imports.gi.Clutter
|
||
|
const GtkSettings = imports.gi.Gtk.Settings.get_default()
|
||
|
const Main = imports.ui.main
|
||
|
const Config = imports.misc.config
|
||
|
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
||
|
const AppMenu = Main.panel.statusArea.appMenu
|
||
|
const AggMenu = Main.panel.statusArea.aggregateMenu
|
||
|
const Handlers = Unite.imports.handlers
|
||
|
|
||
|
const VERSION = parseInt(Config.PACKAGE_VERSION.split('.')[1])
|
||
|
|
||
|
function actorHasClass(actor, name) {
|
||
|
return actor.has_style_class_name && actor.has_style_class_name(name)
|
||
|
}
|
||
|
|
||
|
function getWidgetArrow(widget) {
|
||
|
let arrow = widget._arrow
|
||
|
|
||
|
if (!arrow) {
|
||
|
const last = widget.get_n_children() - 1
|
||
|
const actor = widget.get_children()[last]
|
||
|
|
||
|
if (actor) {
|
||
|
if (actorHasClass(actor, 'popup-menu-arrow')) {
|
||
|
arrow = actor
|
||
|
} else {
|
||
|
arrow = getWidgetArrow(actor)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (arrow && !widget.hasOwnProperty('_arrow')) {
|
||
|
widget._arrow = arrow
|
||
|
}
|
||
|
|
||
|
return arrow
|
||
|
}
|
||
|
|
||
|
function toggleWidgetArrow(widget, hide) {
|
||
|
const arrow = widget && getWidgetArrow(widget)
|
||
|
|
||
|
if (arrow) {
|
||
|
if (hide && !widget._arrowHandled) {
|
||
|
arrow.visible = false
|
||
|
widget._arrowHandled = true
|
||
|
}
|
||
|
|
||
|
if (!hide && widget._arrowHandled) {
|
||
|
arrow.visible = true
|
||
|
delete widget._arrowHandled
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var LayoutManager = GObject.registerClass(
|
||
|
class UniteLayoutManager extends GObject.Object {
|
||
|
_init() {
|
||
|
this.signals = new Handlers.Signals()
|
||
|
this.settings = new Handlers.Settings()
|
||
|
this.styles = new Handlers.Styles()
|
||
|
|
||
|
this.signals.connect(
|
||
|
Main.panel._leftBox, 'actor_added', this._onHideDropdownArrows.bind(this)
|
||
|
)
|
||
|
|
||
|
this.signals.connect(
|
||
|
Main.panel._centerBox, 'actor_added', this._onHideDropdownArrows.bind(this)
|
||
|
)
|
||
|
|
||
|
this.signals.connect(
|
||
|
Main.panel._rightBox, 'actor_added', this._onHideDropdownArrows.bind(this)
|
||
|
)
|
||
|
|
||
|
this.signals.connect(
|
||
|
GtkSettings, 'notify::gtk-font-name', this._onChangeStyles.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'notifications-position', this._onNotificationsChange.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'hide-app-menu-icon', this._onHideAppMenuIcon.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'hide-app-menu-arrow', this._onHideAppMenuArrow.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'hide-aggregate-menu-arrow', this._onHideAggMenuArrow.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'hide-dropdown-arrows', this._onHideDropdownArrows.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'use-system-fonts', this._onChangeStyles.bind(this)
|
||
|
)
|
||
|
|
||
|
this.settings.connect(
|
||
|
'reduce-panel-spacing', this._onChangeStyles.bind(this)
|
||
|
)
|
||
|
}
|
||
|
|
||
|
_onNotificationsChange() {
|
||
|
const setting = this.settings.get('notifications-position')
|
||
|
|
||
|
if (setting != 'center') {
|
||
|
const context = St.ThemeContext.get_for_stage(global.stage)
|
||
|
const banner = Main.messageTray._bannerBin
|
||
|
const mappings = { left: 'START', right: 'END' }
|
||
|
const position = mappings[setting]
|
||
|
|
||
|
banner.set_x_align(Clutter.ActorAlign[position])
|
||
|
banner.set_width(390 * context.scale_factor)
|
||
|
} else {
|
||
|
this._resetNotifications()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_onHideAppMenuIcon() {
|
||
|
const setting = this.settings.get('hide-app-menu-icon')
|
||
|
|
||
|
if (setting) {
|
||
|
AppMenu._iconBox.hide()
|
||
|
} else {
|
||
|
this._resetAppMenuIcon()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_onHideAppMenuArrow() {
|
||
|
const setting = this.settings.get('hide-app-menu-arrow')
|
||
|
|
||
|
if (setting) {
|
||
|
toggleWidgetArrow(AppMenu, true)
|
||
|
} else {
|
||
|
this._resetAppMenuArrow()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_onHideAggMenuArrow() {
|
||
|
const setting = this.settings.get('hide-aggregate-menu-arrow')
|
||
|
|
||
|
if (setting) {
|
||
|
toggleWidgetArrow(AggMenu, true)
|
||
|
} else {
|
||
|
this._resetAggMenuArrow()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_onHideDropdownArrows() {
|
||
|
const setting = this.settings.get('hide-dropdown-arrows')
|
||
|
|
||
|
if (setting) {
|
||
|
for (const [name, widget] of Object.entries(Main.panel.statusArea)) {
|
||
|
if (name != 'aggregateMenu' && name != 'appMenu') {
|
||
|
toggleWidgetArrow(widget, true)
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
this._resetDropdownArrows()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_onChangeStyles() {
|
||
|
const fonts = this.settings.get('use-system-fonts')
|
||
|
const space = this.settings.get('reduce-panel-spacing')
|
||
|
|
||
|
this._resetStyles()
|
||
|
|
||
|
if (fonts) {
|
||
|
const font = GtkSettings.gtk_font_name.replace(/\s\d+$/, '')
|
||
|
this.styles.addWidgetStyle('uiGroup', Main.uiGroup, `font-family: ${font};`)
|
||
|
|
||
|
Main.panel._addStyleClassName('system-fonts')
|
||
|
}
|
||
|
|
||
|
if (space) {
|
||
|
Main.panel._addStyleClassName('small-spacing')
|
||
|
}
|
||
|
|
||
|
if (VERSION < 34) {
|
||
|
Main.panel._addStyleClassName('extra-spacing')
|
||
|
}
|
||
|
|
||
|
if (fonts || space) {
|
||
|
this.styles.addWidgetStyle('panel', Main.panel, 'font-size: 11.25pt;')
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_resetNotifications() {
|
||
|
const banner = Main.messageTray._bannerBin
|
||
|
|
||
|
banner.set_x_align(Clutter.ActorAlign.CENTER)
|
||
|
banner.set_width(-1)
|
||
|
}
|
||
|
|
||
|
_resetAppMenuIcon() {
|
||
|
AppMenu._iconBox.show()
|
||
|
}
|
||
|
|
||
|
_resetAppMenuArrow() {
|
||
|
toggleWidgetArrow(AppMenu, false)
|
||
|
}
|
||
|
|
||
|
_resetAggMenuArrow() {
|
||
|
toggleWidgetArrow(AggMenu, false)
|
||
|
}
|
||
|
|
||
|
_resetDropdownArrows() {
|
||
|
for (const [name, widget] of Object.entries(Main.panel.statusArea)) {
|
||
|
if (name != 'aggregateMenu' && name != 'appMenu') {
|
||
|
toggleWidgetArrow(widget, false)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_resetStyles() {
|
||
|
Main.panel._removeStyleClassName('system-fonts')
|
||
|
Main.panel._removeStyleClassName('small-spacing')
|
||
|
Main.panel._removeStyleClassName('extra-spacing')
|
||
|
|
||
|
this.styles.deleteStyle('uiGroup')
|
||
|
this.styles.deleteStyle('panel')
|
||
|
}
|
||
|
|
||
|
activate() {
|
||
|
this._onNotificationsChange()
|
||
|
this._onHideAppMenuIcon()
|
||
|
this._onHideAppMenuArrow()
|
||
|
this._onHideAggMenuArrow()
|
||
|
this._onHideDropdownArrows()
|
||
|
this._onChangeStyles()
|
||
|
}
|
||
|
|
||
|
destroy() {
|
||
|
this._resetNotifications()
|
||
|
this._resetAppMenuIcon()
|
||
|
this._resetAppMenuArrow()
|
||
|
this._resetAggMenuArrow()
|
||
|
this._resetDropdownArrows()
|
||
|
this._resetStyles()
|
||
|
|
||
|
this.signals.disconnectAll()
|
||
|
this.settings.disconnectAll()
|
||
|
this.styles.removeAll()
|
||
|
}
|
||
|
}
|
||
|
)
|