====== Gnome - Extensions - prefs.js ====== **prefs.js** is used to build a Gtk widget that will be inserted into a window and be used as the preferences dialog for your extension. * If this file is not present, there will simply be no preferences button in GNOME Extensions or on https://extensions.gnome.org/local/. ---- const {Adw, GLib, Gtk} = imports.gi; // It is common practice to keep GNOME API and JS imports in separate blocks const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); /** * Like `extension.js` this is used for any one-time setup like translations. * * @param {ExtensionMeta} meta - An extension meta object, described below. */ function init(meta) { log(`initializing ${meta.metadata.name} Preferences`); } /** * This function is called when the preferences window is first created to build * and return a GTK widget. * * As of GNOME 42, the preferences window will be a `Adw.PreferencesWindow`. * Intermediate `Adw.PreferencesPage` and `Adw.PreferencesGroup` widgets will be * used to wrap the returned widget if necessary. * * @returns {Gtk.Widget} the preferences widget */ function buildPrefsWidget() { // This could be any GtkWidget subclass, although usually you would choose // something like a GtkGrid, GtkBox or GtkNotebook const prefsWidget = new Gtk.Label({ label: Me.metadata.name, visible: true, }); // Add a widget to the group. This could be any GtkWidget subclass, // although usually you would choose preferences rows such as AdwActionRow, // AdwComboRow or AdwRevealerRow. const label = new Gtk.Label({ label: `${Me.metadata.name}` }); group.add(label); window.add(page); } /** * This function is called when the preferences window is first created to fill * the `Adw.PreferencesWindow`. * * This function will only be called by GNOME 42 and later. If this function is * present, `buildPrefsWidget()` will never be called. * * @param {Adw.PreferencesWindow} window - The preferences window */ function fillPreferencesWindow(window) { const prefsPage = new Adw.PreferencesPage({ name: 'general', title: 'General', icon_name: 'dialog-information-symbolic', }); window.add(prefsPage); const prefsGroup = new Adw.PreferencesGroup({ title: 'Appearance', description: `Configure the appearance of ${Me.metadata.name}`, }); prefsPage.add(prefsGroup); const showIndicatorRow = new Adw.ActionRow({ title: 'Show Indicator', subtitle: 'Whether to show the panel indicator', }); prefsGroup.add(showIndicatorRow); const showIndicatorSwitch = new Gtk.Switch(); showIndicatorRow.add_suffix(showIndicatorSwitch); showIndicatorRow.set_activatable_widget(showIndicatorSwitch); } **NOTE:** The code in **prefs.js** will be executed in a separate Gtk process. * Here you will not have access to code running in GNOME Shell, but fatal errors or mistakes will be contained within that process. * In this process you will be using the Gtk toolkit, not Clutter. * You can open the preferences dialog for your extension manually with gnome-extensions prefs: gnome-extensions prefs example@gjs.guide ---- ===== stylesheet.css ===== **stylesheet.css** is CSS stylesheet which can apply custom styles to your St widgets in extension.js or GNOME Shell as a whole. For example, if you had the following widgets: // A standard StLabel let label = new St.Label({ text: 'LabelText', style_class: 'example-style' }); // An StLabel subclass with `CssName` set to "ExampleLabel" var ExampleLabel = GObject.registerClass({ GTypeName: 'ExampleLabel', CssName: 'ExampleLabel' }, class ExampleLabel extends St.Label { }); let exampleLabel = new ExampleLabel({ text: 'Label Text' }); You could have this in your stylesheet.css: /* This will change the color of all StLabel elements */ StLabel { color: red; } /* This will change the color of all elements with the "example-style" class */ .example-style { color: green; } /* This will change the color of StLabel elements with the "example-style" class */ StLabel.example-style { color: blue; } /* This will change the color of your StLabel subclass with the custom CssName */ ExampleLabel { color: yellow; } ---- ===== Preferences ===== https://gjs.guide/extensions/overview/anatomy.html#prefs-js https://gjs.guide/extensions/development/preferences.html#preferences-window