231 lines
4.6 KiB
JavaScript
231 lines
4.6 KiB
JavaScript
const Bytes = imports.byteArray
|
|
const Gio = imports.gi.Gio
|
|
const GLib = imports.gi.GLib
|
|
const St = imports.gi.St
|
|
const Unite = imports.misc.extensionUtils.getCurrentExtension()
|
|
const Convenience = Unite.imports.convenience
|
|
|
|
const SETTINGS = Convenience.getSettings()
|
|
const WM_PREFS = Convenience.getPreferences()
|
|
|
|
const USER_CONFIG = GLib.get_user_config_dir()
|
|
const USER_STYLES = `${USER_CONFIG}/gtk-3.0/gtk.css`
|
|
|
|
function fileExists(path) {
|
|
return GLib.file_test(path, GLib.FileTest.EXISTS)
|
|
}
|
|
|
|
function getGioFile(path) {
|
|
const absPath = GLib.build_filenamev([Unite.path, path])
|
|
|
|
if (fileExists(absPath)) {
|
|
return Gio.file_new_for_path(absPath)
|
|
}
|
|
}
|
|
|
|
function getFileContents(path) {
|
|
if (fileExists(path)) {
|
|
const contents = GLib.file_get_contents(path)
|
|
return Bytes.toString(contents[1])
|
|
} else {
|
|
return ''
|
|
}
|
|
}
|
|
|
|
function setFileContents(path, contents) {
|
|
GLib.file_set_contents(path, contents)
|
|
}
|
|
|
|
function resetGtkStyles() {
|
|
let style = getFileContents(USER_STYLES)
|
|
|
|
style = style.replace(/\/\* UNITE ([\s\S]*?) UNITE \*\/\n/g, '')
|
|
style = style.replace(/@import.*unite@hardpixel\.eu.*css['"]\);\n/g, '')
|
|
|
|
setFileContents(USER_STYLES, style)
|
|
}
|
|
|
|
var Signals = class Signals {
|
|
constructor() {
|
|
this.signals = new Map()
|
|
}
|
|
|
|
registerHandler(object, name, callback) {
|
|
const key = `${object}[${name}]`
|
|
|
|
if (!this.hasSignal(key)) {
|
|
this.signals.set(key, {
|
|
object: object,
|
|
signalId: object.connect(name, callback)
|
|
})
|
|
}
|
|
|
|
return key
|
|
}
|
|
|
|
hasSignal(key) {
|
|
return this.signals.has(key)
|
|
}
|
|
|
|
connect(object, name, callback) {
|
|
return this.registerHandler(object, name, callback)
|
|
}
|
|
|
|
disconnect(key) {
|
|
if (this.hasSignal(key)) {
|
|
const data = this.signals.get(key)
|
|
data.object.disconnect(data.signalId)
|
|
|
|
this.signals.delete(key)
|
|
}
|
|
}
|
|
|
|
disconnectMany(keys) {
|
|
keys.forEach(this.disconnect.bind(this))
|
|
}
|
|
|
|
disconnectAll() {
|
|
for (const key of this.signals.keys()) {
|
|
this.disconnect(key)
|
|
}
|
|
}
|
|
}
|
|
|
|
var Settings = class Settings extends Signals {
|
|
getSettingObject(key) {
|
|
if (SETTINGS.exists(key)) {
|
|
return SETTINGS
|
|
} else {
|
|
return WM_PREFS
|
|
}
|
|
}
|
|
|
|
connect(name, callback) {
|
|
const object = this.getSettingObject(name)
|
|
return this.registerHandler(object, `changed::${name}`, callback)
|
|
}
|
|
|
|
get(key) {
|
|
const object = this.getSettingObject(key)
|
|
return object.getSetting(key)
|
|
}
|
|
}
|
|
|
|
var ShellStyle = class ShellStyle {
|
|
constructor(path) {
|
|
this.file = getGioFile(path)
|
|
}
|
|
|
|
get context() {
|
|
return St.ThemeContext.get_for_stage(global.stage)
|
|
}
|
|
|
|
get theme() {
|
|
return this.context.get_theme()
|
|
}
|
|
|
|
load() {
|
|
this.theme.load_stylesheet(this.file)
|
|
}
|
|
|
|
unload() {
|
|
this.theme.unload_stylesheet(this.file)
|
|
}
|
|
}
|
|
|
|
var WidgetStyle = class WidgetStyle {
|
|
constructor(widget, style) {
|
|
this.widget = widget
|
|
this.style = style
|
|
}
|
|
|
|
get existing() {
|
|
return this.widget.get_style() || ''
|
|
}
|
|
|
|
load() {
|
|
const style = this.existing + this.style
|
|
this.widget.set_style(style)
|
|
}
|
|
|
|
unload() {
|
|
const style = this.existing.replace(this.style, '')
|
|
this.widget.set_style(style)
|
|
}
|
|
}
|
|
|
|
var GtkStyle = class GtkStyle {
|
|
constructor(name, contents) {
|
|
this.contents = `/* UNITE ${name} */\n${contents}\n/* ${name} UNITE */\n`
|
|
}
|
|
|
|
get existing() {
|
|
return getFileContents(USER_STYLES)
|
|
}
|
|
|
|
load() {
|
|
const style = this.contents + this.existing
|
|
setFileContents(USER_STYLES, style)
|
|
}
|
|
|
|
unload() {
|
|
const style = this.existing.replace(this.contents, '')
|
|
setFileContents(USER_STYLES, style)
|
|
}
|
|
}
|
|
|
|
var Styles = class Styles {
|
|
constructor() {
|
|
this.styles = new Map()
|
|
}
|
|
|
|
hasStyle(name) {
|
|
return name && this.styles.has(name)
|
|
}
|
|
|
|
getStyle(name) {
|
|
return name && this.styles.get(name)
|
|
}
|
|
|
|
setStyle(name, object, ...args) {
|
|
if (!this.hasStyle(name)) {
|
|
const style = new object(...args)
|
|
style.load()
|
|
|
|
this.styles.set(name, style)
|
|
}
|
|
}
|
|
|
|
deleteStyle(name) {
|
|
if (this.hasStyle(name)) {
|
|
const style = this.getStyle(name)
|
|
style.unload()
|
|
|
|
this.styles.delete(name)
|
|
}
|
|
}
|
|
|
|
addShellStyle(name, path) {
|
|
this.deleteStyle(name)
|
|
this.setStyle(name, ShellStyle, path)
|
|
}
|
|
|
|
addWidgetStyle(name, widget, styles) {
|
|
this.deleteStyle(name)
|
|
this.setStyle(name, WidgetStyle, widget, styles)
|
|
}
|
|
|
|
addGtkStyle(name, contents) {
|
|
this.deleteStyle(name)
|
|
this.setStyle(name, GtkStyle, name, contents)
|
|
}
|
|
|
|
removeAll() {
|
|
for (const key of this.styles.keys()) {
|
|
this.deleteStyle(key)
|
|
}
|
|
}
|
|
}
|
|
|
|
resetGtkStyles()
|