Files
cinnamon-dynamic-wallpaper/cinnamon-dynamic-wallpaper@TobiZog/extension.js

191 lines
4.6 KiB
JavaScript

/**
* @name Cinnamon-Dynamic-Wallpaper
* @alias TobiZog
* @since 2023
*/
/******************** Imports ********************/
const MessageTray = imports.ui.messageTray;
const St = imports.gi.St;
const Main = imports.ui.main;
const Util = imports.misc.util;
const Settings = imports.ui.settings;
const { find_program_in_path } = imports.gi.GLib;
const Gio = imports.gi.Gio;
/******************** Constants ********************/
const UUID = "cinnamon-dynamic-wallpaper@TobiZog";
const APPNAME = "Cinnamon Dynamic Wallpaper"
const DIRECTORY = imports.ui.extensionSystem.extensionMeta[UUID];
/******************** Global Variables ********************/
// The extension object
let extension;
/******************** Objects ********************/
function CinnamonDynamicWallpaperExtension(uuid) {
this._init(uuid);
}
CinnamonDynamicWallpaperExtension.prototype = {
/**
* Initialization
*
* @param {string} uuid Universally Unique Identifier
*/
_init: function(uuid) {
this.settings = new Settings.ExtensionSettings(this, uuid);
this.bindSettings("sw_auto_location", "autolocation")
this.bindSettings("sc_location_refresh_time", "locationRefreshTime")
this.bindSettings("etr_latitude", "latitude")
this.bindSettings("etr_longitude", "longitude")
this.bindSettings("etr_img_morning_twilight", "img_morning_twilight")
this.bindSettings("etr_img_sunrise", "img_sunrise")
this.bindSettings("etr_img_morning", "img_morning")
this.bindSettings("etr_img_noon", "img_noon")
this.bindSettings("etr_img_afternoon", "img_afternoon")
this.bindSettings("etr_img_evening", "img_evening")
this.bindSettings("etr_img_sunset", "img_sunset")
this.bindSettings("etr_img_night_twilight", "img_night_twilight")
this.bindSettings("etr_img_night", "img_night")
},
bindSettings: function (ui_name, js_name, func = this.on_settings_changed) {
this.settings.bindProperty(
Settings.BindingDirection.IN,
ui_name,
js_name,
func
)
},
/**
* Displaying a desktop notification
*
* @param {string} title The Title in the notification
* @param {string} text The text in the notification
* @param {boolean} showOpenSettings Display the "Open settings" button in the notification, defaults to false
*/
showNotification: function (title, text, showOpenSettings = false) {
let source = new MessageTray.Source(this.uuid);
// Parameter
let params = {
icon: new St.Icon({
icon_name: "icon",
icon_type: St.IconType.FULLCOLOR,
icon_size: source.ICON_SIZE
})
};
// The notification itself
let notification = new MessageTray.Notification(source, title, text, params);
// Display the "Open settings" button, if showOpenSettings
if (showOpenSettings) {
notification.addButton("open-settings", _("Open settings"));
notification.connect("action-invoked", () =>
Util.spawnCommandLine("xlet-settings extension " + UUID));
}
// Put all together
Main.messageTray.add(source);
// Display it
source.notify(notification);
},
/**
* Changes the desktop background image
*
* @param {jpg} imageURI The new desktop image
*/
changeWallpaper: function(imageURI) {
let gSetting = new Gio.Settings({schema: 'org.cinnamon.desktop.background'});
gSetting.set_string('picture-uri', imageURI);
Gio.Settings.sync();
gSetting.apply();
},
/******************** UI Callbacks ********************/
on_settings_changed: function () {
// todo
},
/**
* Callback for settings-schema
* Opens the external heic-importer window
*/
openImageConfigurator: function() {
Util.spawnCommandLine("/usr/bin/env python3 " + DIRECTORY.path + "/image-configurator/image-configurator.py");
},
/**
* Callback for settings-schema
* Opens the browser and navigate to the URL of the respository
*/
openRepoWebsite: function() {
Util.spawnCommandLine("xdg-open https://github.com/TobiZog/cinnamon-dynamic-wallpaper");
}
}
/******************** Lifecycle ********************/
/**
* Lifecycle function on initialization
*
* @param {*} extensionMeta Metadata of the extension
*/
function init(extensionMeta) {
extension = new CinnamonDynamicWallpaperExtension(extensionMeta.uuid);
}
/**
* Lifecycle function on enable
*
* @returns The extension object
*/
function enable() {
// Check for necessary software
if (!find_program_in_path('heif-convert')) {
Util.spawnCommandLine("apturl apt://libheif-examples");
}
// Display the welcome notification on activation
extension.showNotification(
APPNAME,
"Welcome to " + APPNAME + "! Open the settings and configure the extensions.",
true
);
return extension;
}
/**
* Lifecycle function on disable
*/
function disable() {
// todo
}