Files
dotfiles/gnome/.local/share/gnome-shell/extensions/gsconnect@andyholmes.github.io/shell/utils.js

67 lines
2.1 KiB
JavaScript

// SPDX-FileCopyrightText: GSConnect Developers https://github.com/GSConnect
//
// SPDX-License-Identifier: GPL-2.0-or-later
import Gio from 'gi://Gio';
import Gtk from 'gi://Gtk';
import St from 'gi://St';
import {PACKAGE_VERSION} from 'resource:///org/gnome/shell/misc/config.js';
export const SHELL_MAJOR_VERSION = Number(PACKAGE_VERSION.split('.')[0]);
export const HAS_ST_ORIENTATION = SHELL_MAJOR_VERSION >= 48;
export const HAS_MESSAGELIST_NOTIFICATIONMESSAGE = SHELL_MAJOR_VERSION >= 48;
/**
* Get a themed icon, using fallbacks from GSConnect's GResource when necessary.
*
* @param {string} name - A themed icon name
* @returns {Gio.Icon} A themed icon
*/
export function getIcon(name) {
if (getIcon._resource === undefined) {
// Setup the desktop icons
const settings = St.Settings.get();
getIcon._desktop = new Gtk.IconTheme();
getIcon._desktop.set_theme_name(settings.gtk_icon_theme);
settings.connect('notify::gtk-icon-theme', (settings_, key_) => {
getIcon._desktop.set_theme_name(settings_.gtk_icon_theme);
});
// Preload our fallbacks
const iconPath = 'resource://org/gnome/Shell/Extensions/GSConnect/icons';
const iconNames = [
'org.gnome.Shell.Extensions.GSConnect',
'org.gnome.Shell.Extensions.GSConnect-symbolic',
'computer-symbolic',
'laptop-symbolic',
'smartphone-symbolic',
'tablet-symbolic',
'tv-symbolic',
'phonelink-ring-symbolic',
'sms-symbolic',
];
getIcon._resource = {};
for (const iconName of iconNames) {
getIcon._resource[iconName] = new Gio.FileIcon({
file: Gio.File.new_for_uri(`${iconPath}/${iconName}.svg`),
});
}
}
// Check the desktop icon theme
if (getIcon._desktop.has_icon(name))
return new Gio.ThemedIcon({name: name});
// Check our GResource
if (getIcon._resource[name] !== undefined)
return getIcon._resource[name];
// Fallback to hoping it's in the theme somewhere
return new Gio.ThemedIcon({name: name});
}