// SPDX-FileCopyrightText: 2011 John Stowers // SPDX-FileCopyrightText: 2011 Giovanni Campagna // SPDX-FileCopyrightText: 2011 Elad Alfassa // SPDX-FileCopyrightText: 2014 Florian Müllner // // SPDX-License-Identifier: GPL-2.0-or-later // -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- // Load shell theme from ~/.local/share/themes/name/gnome-shell import Gio from 'gi://Gio'; import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; import * as Main from 'resource:///org/gnome/shell/ui/main.js'; import {getThemeDirs, getModeThemeDirs} from './util.js'; const SETTINGS_KEY = 'name'; export default class ThemeManager extends Extension { enable() { this._settings = this.getSettings(); this._settings.connectObject(`changed::${SETTINGS_KEY}`, this._changeTheme.bind(this), this); this._changeTheme(); } disable() { this._settings?.disconnectObject(); this._settings = null; Main.setThemeStylesheet(null); Main.loadTheme(); } _changeTheme() { let stylesheet = null; let themeName = this._settings.get_string(SETTINGS_KEY); if (themeName) { const stylesheetPaths = getThemeDirs() .map(dir => `${dir}/${themeName}/gnome-shell/gnome-shell.css`); stylesheetPaths.push(...getModeThemeDirs() .map(dir => `${dir}/${themeName}.css`)); stylesheet = stylesheetPaths.find(path => { let file = Gio.file_new_for_path(path); return file.query_exists(null); }); } if (stylesheet) log(`loading user theme: ${stylesheet}`); else log('loading default theme (Adwaita)'); Main.setThemeStylesheet(stylesheet); Main.loadTheme(); } }