63 lines
1.7 KiB
JavaScript
63 lines
1.7 KiB
JavaScript
|
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
|
||
|
// Load shell theme from ~/.local/share/themes/name/gnome-shell
|
||
|
/* exported init */
|
||
|
|
||
|
const { Gio, GLib } = imports.gi;
|
||
|
|
||
|
const ExtensionUtils = imports.misc.extensionUtils;
|
||
|
const Main = imports.ui.main;
|
||
|
|
||
|
const SETTINGS_KEY = 'name';
|
||
|
|
||
|
class ThemeManager {
|
||
|
constructor() {
|
||
|
this._settings = ExtensionUtils.getSettings();
|
||
|
}
|
||
|
|
||
|
enable() {
|
||
|
this._changedId = this._settings.connect(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this));
|
||
|
this._changeTheme();
|
||
|
}
|
||
|
|
||
|
disable() {
|
||
|
if (this._changedId) {
|
||
|
this._settings.disconnect(this._changedId);
|
||
|
this._changedId = 0;
|
||
|
}
|
||
|
|
||
|
Main.setThemeStylesheet(null);
|
||
|
Main.loadTheme();
|
||
|
}
|
||
|
|
||
|
_changeTheme() {
|
||
|
let stylesheet = null;
|
||
|
let themeName = this._settings.get_string(SETTINGS_KEY);
|
||
|
|
||
|
if (themeName) {
|
||
|
let stylesheetPaths = [
|
||
|
[GLib.get_home_dir(), '.themes'],
|
||
|
[GLib.get_user_data_dir(), 'themes'],
|
||
|
...GLib.get_system_data_dirs().map(dir => [dir, 'themes']),
|
||
|
].map(themeDir => GLib.build_filenamev([
|
||
|
...themeDir, themeName, 'gnome-shell', 'gnome-shell.css',
|
||
|
]));
|
||
|
|
||
|
stylesheet = stylesheetPaths.find(path => {
|
||
|
let file = Gio.file_new_for_path(path);
|
||
|
return file.query_exists(null);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (stylesheet)
|
||
|
global.log(`loading user theme: ${stylesheet}`);
|
||
|
else
|
||
|
global.log('loading default theme (Adwaita)');
|
||
|
Main.setThemeStylesheet(stylesheet);
|
||
|
Main.loadTheme();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function init() {
|
||
|
return new ThemeManager();
|
||
|
}
|