diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/extension.js b/cinnamon-dynamic-wallpaper@TobiZog/5.4/extension.js index 9f21799..a759311 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/extension.js +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/extension.js @@ -1,14 +1,13 @@ /** * @name Cinnamon-Dynamic-Wallpaper * @alias TobiZog - * @since 2023 + * @since 2023-05-17 + * + * @description Main application file */ /******************** 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 Mainloop = imports.mainloop; @@ -18,6 +17,7 @@ const Gio = imports.gi.Gio; let suntimes = require('./scripts/suntimes') let location = require('./scripts/location') +let communication = require('./scripts/communication') /******************** Constants ********************/ @@ -39,6 +39,7 @@ let lastLocationUpdate = new Date() // The last calculated suntime of the day let lastDayTime = suntimes.DAYPERIOD.NONE +// Loop state let looping = true @@ -50,14 +51,18 @@ function CinnamonDynamicWallpaperExtension(uuid) { CinnamonDynamicWallpaperExtension.prototype = { + + /******************** Lifecycle ********************/ + /** * Initialization * * @param {string} uuid Universally Unique Identifier */ - _init: function(uuid) { + _init: function(uuid) { this.settings = new Settings.ExtensionSettings(this, uuid); + /** Configuration */ // Image set this.bindSettings("sw_image_stretch", "imageStretch", this.settingsUpdated) @@ -67,8 +72,14 @@ CinnamonDynamicWallpaperExtension.prototype = { this.bindSettings("etr_latitude", "latitude", this.settingsUpdated) this.bindSettings("etr_longitude", "longitude", this.settingsUpdated) + // Time periods this.bindSettings("tv_times", "tvTimes") + + /** Debugging */ + // Logs + this.bindSettings("tv_logs", "tvLogs") + // Image Configurator this.bindSettings("etr_img_morning_twilight", "img_morning_twilight", this.settingsUpdated) @@ -81,12 +92,14 @@ CinnamonDynamicWallpaperExtension.prototype = { this.bindSettings("etr_img_night_twilight", "img_night_twilight", this.settingsUpdated) this.bindSettings("etr_img_night", "img_night", this.settingsUpdated) - + // Check for the first startup if (this.settings.getValue("first_start")) { + this.writeToLogs("First time start") + // Welcome notification - this.showNotification("Welcome to Cinnamon Dynamic Wallpaper", - "Check the preferences to choose a dynamic wallpaper", true) + communication.showNotification("Welcome to Cinnamon Dynamic Wallpaper", + "Check the preferences to choose a dynamic wallpaper", true) // Hide the notification on system restart this.settings.setValue("first_start", false) @@ -102,6 +115,7 @@ CinnamonDynamicWallpaperExtension.prototype = { } } + this.writeToLogs("Initialization completed") // Set image initial at desktop wallpaper this.setImageToTime() @@ -114,9 +128,9 @@ CinnamonDynamicWallpaperExtension.prototype = { /** * Binding the settings objects * - * @param {*} ui_name Name of preference in settings-schema.json - * @param {*} js_name Name of preference in JavaScript - * @param {*} func Function to call on change + * @param {string} ui_name Name of preference in settings-schema.json + * @param {string} js_name Name of preference in JavaScript + * @param {Function} func Function to call on change */ bindSettings: function (ui_name, js_name, func = this.on_settings_changed) { this.settings.bindProperty( @@ -128,6 +142,27 @@ CinnamonDynamicWallpaperExtension.prototype = { }, + /** + * Main loop + */ + _loop: function () { + if (looping) { + this.setImageToTime() + + if (lastLocationUpdate < new Date().getTime() - this.locationRefreshTime * 1000) { + this.updateLocation() + lastLocationUpdate = new Date() + } + + // Refresh every 60 seconds + Mainloop.timeout_add_seconds(60, Lang.bind(this, this._loop)); + this.writeToLogs("Main loop runs...") + } + }, + + + /******************** Settings handling ********************/ + /** * Handles changes in settings */ @@ -138,43 +173,40 @@ CinnamonDynamicWallpaperExtension.prototype = { this.setImageToTime() }, + /** + * Callback for settings-schema + * Opens the external image configurator window + */ + openImageConfigurator: function () { + Util.spawnCommandLine("/usr/bin/env python3 " + + DIRECTORY.path + "/image-configurator/image-configurator.py"); + }, + /** - * 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 + * Callback for settings-schema + * Opens the browser and navigates to the URL of the respository */ - showNotification: function (title, text, showOpenSettings = false) { - let source = new MessageTray.Source(this.uuid); + openRepoWebsite: function () { + Util.spawnCommandLine("xdg-open https://github.com/TobiZog/cinnamon-dynamic-wallpaper"); + }, - // 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); + /** + * Callback for settings-schema + * Opens the browser and navigates to the URL of the Cinnamon Spices extension + */ + openSpicesWebsite: function () { + Util.spawnCommandLine("xdg-open https://cinnamon-spices.linuxmint.com/extensions/view/97") + }, - // 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); + /** + * Callback for settings-schema + * Opens the browser and navigates to the GitHub issue page + */ + openIssueWebsite: function () { + Util.spawnCommandLine("xdg-open https://github.com/TobiZog/cinnamon-dynamic-wallpaper/issues/new") }, @@ -197,6 +229,8 @@ CinnamonDynamicWallpaperExtension.prototype = { Gio.Settings.sync(); gSetting.apply(); + + this.writeToLogs("Set new image: " + imageURI) }, @@ -227,7 +261,6 @@ CinnamonDynamicWallpaperExtension.prototype = { break } } - function convertToTimeString(time) { return time.getHours().toString().padStart(2, "0") + ":" + time.getMinutes().toString().padStart(2, "0") @@ -261,63 +294,17 @@ CinnamonDynamicWallpaperExtension.prototype = { // Update the update information lastLocationUpdate = new Date() + + this.writeToLogs("Location updated") }, - /** - * Main loop + * Adding text to the logs + * + * @param {string} msg New message string */ - _loop: function () { - if (looping) { - this.setImageToTime() - - if (lastLocationUpdate < new Date().getTime() - this.locationRefreshTime * 1000) { - this.updateLocation() - lastLocationUpdate = new Date() - } - - // Refresh every 60 seconds - Mainloop.timeout_add_seconds(60, Lang.bind(this, this._loop)); - } - }, - - - /******************** UI Callbacks ********************/ - - /** - * Callback for settings-schema - * Opens the external image configurator window - */ - openImageConfigurator: function() { - Util.spawnCommandLine("/usr/bin/env python3 " + - DIRECTORY.path + "/image-configurator/image-configurator.py"); - }, - - - /** - * Callback for settings-schema - * Opens the browser and navigates to the URL of the respository - */ - openRepoWebsite: function() { - Util.spawnCommandLine("xdg-open https://github.com/TobiZog/cinnamon-dynamic-wallpaper"); - }, - - - /** - * Callback for settings-schema - * Opens the browser and navigates to the URL of the Cinnamon Spices extension - */ - openSpicesWebsite: function() { - Util.spawnCommandLine("xdg-open https://cinnamon-spices.linuxmint.com/extensions/view/97") - }, - - - /** - * Callback for settings-schema - * Opens the browser and navigates to the GitHub issue page - */ - openIssueWebsite: function() { - Util.spawnCommandLine("xdg-open https://github.com/TobiZog/cinnamon-dynamic-wallpaper/issues/new") + writeToLogs: function(msg) { + this.tvLogs = communication.createLogs(this.tvLogs, msg) } } diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/communication.js b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/communication.js new file mode 100644 index 0000000..5fb644a --- /dev/null +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/communication.js @@ -0,0 +1,84 @@ +/** + * @name Cinnamon-Dynamic-Wallpaper + * @alias TobiZog + * @since 2023-08-25 + * + * @description Handles communications with the user (notifications, logs) + */ + +/******************** Imports ********************/ + +const St = imports.gi.St; +const Main = imports.ui.main; +const Util = imports.misc.util; +const MessageTray = imports.ui.messageTray; + + + + +/******************** Functions ********************/ + +/** + * 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 + */ +function showNotification(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); +} + + +/** + * Adding a message to the logs + * + * @param {string} logMsg New log message to add + */ +function createLogs(tvLogs, logMsg) { + /** + * Pad a number with leading zeros + * + * @param {number} num Number to format + * @param {number} size Final string length + * + * @returns String with defined length + */ + function pad(num, size) { + var s = "00" + num + return s.substring(s.length - size) + } + + // Estimate date and time + let date = new Date() + let formattedDate = pad(date.getHours(), 2) + ":" + pad(date.getMinutes(), 2) + ":" + pad(date.getSeconds(), 2) + + // Add the the logs + return formattedDate + "\t" + logMsg + "\n" + tvLogs +} \ No newline at end of file diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.js b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.js index 0b63285..bd9f1ff 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.js +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/location.js @@ -1,6 +1,23 @@ +/** + * @name Cinnamon-Dynamic-Wallpaper + * @alias TobiZog + * @since 2023 + * + * @description Functions to estimate the user location + */ + +/******************** Imports ********************/ + const Soup = imports.gi.Soup; +/******************** Functions ********************/ + +/** + * Estimate the location of the user + * + * @returns Location data if succeded or -1 if failed + */ function estimateLocation() { let sessionSync = new Soup.SessionSync(); let msg = Soup.Message.new('GET', "https://get.geojs.io/v1/ip/geo.json"); diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.js b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.js index ab664f9..7138199 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.js +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/scripts/suntimes.js @@ -2,8 +2,12 @@ * @name Cinnamon-Dynamic-Wallpaper * @alias TobiZog * @since 2023 + * + * @description Functions to calculate sun time periods */ +/******************** Constants ********************/ + const DAYPERIOD = { MTWILIGHT: 0, SUNRISE: 1, @@ -22,6 +26,9 @@ const J1970 = 2440588 const J2000 = 2451545 +/******************** Functions ********************/ + + function fromJulian(j) { let ms_date = (j + 0.5 - J1970) * DAYMS return new Date(ms_date) @@ -83,6 +90,14 @@ function subTimesToMinutes(date1, date2) { } +/** + * Calculating the start and end time of all time periods of the day + * + * @param {float} latitude Location latitude + * @param {float} longitude Location longitude + * + * @returns JSON of time periods + */ function calcTimePeriod(latitude, longitude) { let todaySunEventsDay = sunEventsOfDay(latitude, longitude, Date.now()) let tomorrowSunEventsDay = sunEventsOfDay(latitude, longitude, addMinutesToTime(new Date(), 1440)) diff --git a/cinnamon-dynamic-wallpaper@TobiZog/5.4/settings-schema.json b/cinnamon-dynamic-wallpaper@TobiZog/5.4/settings-schema.json index ac698b8..19260fd 100644 --- a/cinnamon-dynamic-wallpaper@TobiZog/5.4/settings-schema.json +++ b/cinnamon-dynamic-wallpaper@TobiZog/5.4/settings-schema.json @@ -3,8 +3,12 @@ "type": "layout", "pages": [ "pg_config", + "pg_logs", "pg_about" ], + + + "pg_config": { "type": "page", "title": "Configuration", @@ -14,17 +18,25 @@ "sec_times" ] }, + "pg_logs": { + "type": "page", + "title": "Debugging", + "sections": [ + "sec_logs", + "sec_report_issue" + ] + }, "pg_about": { "type": "page", "title": "About", "sections": [ "sec_project", - "sec_github", - "sec_report_issue" + "sec_github" ] }, + "sec_image_configuration": { "type": "section", "title": "Image set", @@ -43,7 +55,7 @@ "etr_latitude", "etr_longitude" ] - }, + }, "sec_times": { "type": "section", "title": "Time periods", @@ -51,6 +63,26 @@ "tv_times" ] }, + + + "sec_logs": { + "type": "section", + "title": "Logs", + "keys": [ + "tv_log_description", + "tv_logs" + ] + }, + "sec_report_issue": { + "type": "section", + "title": "Report an issue", + "keys": [ + "lb_report_issue", + "btn_report_issue" + ] + }, + + "sec_project": { "type": "section", "title": "About the project", @@ -68,18 +100,11 @@ "lb_repository", "btn_open_repository" ] - }, - "sec_report_issue": { - "type": "section", - "title": "Report an issue", - "keys": [ - "lb_report_issue", - "btn_report_issue" - ] } }, + "lb_image_configuration": { "type": "label", "description": "Choose an included image set or import a heic-file with the Image Configurator" @@ -92,8 +117,9 @@ "sw_image_stretch": { "type": "switch", "description": "Expand image over all displays", - "default": true + "default": false }, + "sw_auto_location": { "type": "switch", "default": true, @@ -120,12 +146,35 @@ "description": "Longitude", "dependency": "!sw_auto_location" }, + "tv_times": { "type": "textview", "description": "Time sections today", "default": "" }, + + "tv_log_description": { + "type": "label", + "description": "Logs contains informations about time, date and successful or failed operations of the extension.", + "default": "" + }, + "tv_logs": { + "type": "textview", + "description": "See all logs", + "default": "" + }, + + "lb_report_issue": { + "type": "label", + "description": "Do you find an issue? Or want a new feature? Go to the GitHub repository and create a new issue. If you find an error message in the logs above, add it to the issue report." + }, + "btn_report_issue": { + "type": "button", + "description": "Submit an Issue", + "callback": "openIssueWebsite" + }, + "lb_about": { "type": "label", @@ -155,16 +204,7 @@ "callback": "openRepoWebsite" }, - "lb_report_issue": { - "type": "label", - "description": "Do you find an issue? Or want a new feature? Go to the GitHub repository and create a new issue." - }, - - "btn_report_issue": { - "type": "button", - "description": "Submit an Issue", - "callback": "openIssueWebsite" - }, + "etr_choosen_image_set": {