Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a5b9da3f34 | |||
| d433ab579d | |||
| 78a925ff8a | |||
| 5ca5b76d7c | |||
| 0d8fa6449c | |||
| 8aae370bf8 |
@@ -1,3 +1,12 @@
|
|||||||
|
# Version 1.4
|
||||||
|
- Log System
|
||||||
|
- Bugfixes
|
||||||
|
- Display times in Image Configurator
|
||||||
|
- Display time of last location update in Preferences
|
||||||
|
|
||||||
|
# Version 1.3
|
||||||
|
- Adding option to stretch the image over multiple displays
|
||||||
|
|
||||||
# Version 1.2
|
# Version 1.2
|
||||||
- Compatibility with Cinnamon 4.8 and higher
|
- Compatibility with Cinnamon 4.8 and higher
|
||||||
- Notification on first start
|
- Notification on first start
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -12,6 +12,7 @@ Based on a location, this extension calculates the periods of a day and switches
|
|||||||
- Image configuration assistent with simple one-click setup for image choose
|
- Image configuration assistent with simple one-click setup for image choose
|
||||||
- Online location estimation or offline with manual latitude and longitude input
|
- Online location estimation or offline with manual latitude and longitude input
|
||||||
- Offline sun angles estimation
|
- Offline sun angles estimation
|
||||||
|
- Image stretching over multiple displays or repeat image for every display
|
||||||
|
|
||||||
### Tested Cinnamon versions
|
### Tested Cinnamon versions
|
||||||
- 4.8 (Mint 20.1)
|
- 4.8 (Mint 20.1)
|
||||||
@@ -30,11 +31,6 @@ Based on a location, this extension calculates the periods of a day and switches
|
|||||||
- Image Configurator UI was written with `Glade`
|
- Image Configurator UI was written with `Glade`
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
### From the repo
|
|
||||||
1. Download the Repository
|
|
||||||
2. Extract the files
|
|
||||||
3. Copy the folder `cinnamon-dynamic-wallpaper@TobiZog` to `~/.local/share/cinnamon/extensions/`
|
|
||||||
|
|
||||||
### From Built-in Extension Manager
|
### From Built-in Extension Manager
|
||||||

|

|
||||||
|
|
||||||
@@ -42,6 +38,11 @@ Based on a location, this extension calculates the periods of a day and switches
|
|||||||
2. Click on "Download"
|
2. Click on "Download"
|
||||||
3. Search and download it
|
3. Search and download it
|
||||||
|
|
||||||
|
### From the repo
|
||||||
|
1. Download the Repository
|
||||||
|
2. Extract the files
|
||||||
|
3. Copy the folder `cinnamon-dynamic-wallpaper@TobiZog` to `~/.local/share/cinnamon/extensions/`
|
||||||
|
|
||||||
## How to use it
|
## How to use it
|
||||||
1. Active the Extension via Cinnamon Extension Manager
|
1. Active the Extension via Cinnamon Extension Manager
|
||||||
2. Open the settings
|
2. Open the settings
|
||||||
@@ -59,12 +60,12 @@ The image sets are from https://github.com/adi1090x/dynamic-wallpaper
|
|||||||
|
|
||||||
| Aurora | Beach | Bitday |
|
| Aurora | Beach | Bitday |
|
||||||
| ------ | ----- | ------ |
|
| ------ | ----- | ------ |
|
||||||
|  |  |  |
|
|  |  |  |
|
||||||
|
|
||||||
| Cliffs | Gradient | Lakeside |
|
| Cliffs | Gradient | Lakeside |
|
||||||
| -------- | --------- | ------ |
|
| -------- | --------- | ------ |
|
||||||
|  |  |  |
|
|  |  |  |
|
||||||
|
|
||||||
| Mountains | Sahara |
|
| Mountains | Sahara |
|
||||||
| --------- | ------ |
|
| --------- | ------ |
|
||||||
|  |  |
|
|  |  |
|
||||||
@@ -1 +0,0 @@
|
|||||||
../5.4/icon/
|
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* @name Cinnamon-Dynamic-Wallpaper
|
* @name Cinnamon-Dynamic-Wallpaper
|
||||||
* @alias TobiZog
|
* @alias TobiZog
|
||||||
* @since 2023
|
* @since 2023-05-17
|
||||||
|
*
|
||||||
|
* @description Main application file
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/******************** Imports ********************/
|
/******************** Imports ********************/
|
||||||
|
|
||||||
const MessageTray = imports.ui.messageTray;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const Util = imports.misc.util;
|
const Util = imports.misc.util;
|
||||||
const Settings = imports.ui.settings;
|
const Settings = imports.ui.settings;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
@@ -18,6 +17,7 @@ const Gio = imports.gi.Gio;
|
|||||||
|
|
||||||
let suntimes = require('./scripts/suntimes')
|
let suntimes = require('./scripts/suntimes')
|
||||||
let location = require('./scripts/location')
|
let location = require('./scripts/location')
|
||||||
|
let communication = require('./scripts/communication')
|
||||||
|
|
||||||
|
|
||||||
/******************** Constants ********************/
|
/******************** Constants ********************/
|
||||||
@@ -34,11 +34,12 @@ const PATH = DIRECTORY.path;
|
|||||||
let extension;
|
let extension;
|
||||||
|
|
||||||
// Time and date of the last location update
|
// Time and date of the last location update
|
||||||
let lastLocationUpdate = new Date()
|
let lastLocationUpdate = -1
|
||||||
|
|
||||||
// The last calculated suntime of the day
|
// The last calculated suntime of the day
|
||||||
let lastDayTime = suntimes.DAYPERIOD.NONE
|
let lastDayTime = suntimes.DAYPERIOD.NONE
|
||||||
|
|
||||||
|
// Loop state
|
||||||
let looping = true
|
let looping = true
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +51,9 @@ function CinnamonDynamicWallpaperExtension(uuid) {
|
|||||||
|
|
||||||
|
|
||||||
CinnamonDynamicWallpaperExtension.prototype = {
|
CinnamonDynamicWallpaperExtension.prototype = {
|
||||||
|
|
||||||
|
/******************** Lifecycle ********************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization
|
* Initialization
|
||||||
*
|
*
|
||||||
@@ -58,26 +62,55 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
_init: function(uuid) {
|
_init: function(uuid) {
|
||||||
this.settings = new Settings.ExtensionSettings(this, uuid);
|
this.settings = new Settings.ExtensionSettings(this, uuid);
|
||||||
|
|
||||||
this.bindSettings("sw_auto_location", "autolocation", this.updateLocation)
|
/** Configuration */
|
||||||
this.bindSettings("sc_location_refresh_time", "locationRefreshTime")
|
// Image set
|
||||||
this.bindSettings("etr_latitude", "latitude", this.updateLocation)
|
this.bindSettings("sw_image_stretch", "imageStretch", this.settingsUpdated)
|
||||||
this.bindSettings("etr_longitude", "longitude", this.updateLocation)
|
|
||||||
this.bindSettings("etr_img_morning_twilight", "img_morning_twilight", this.setImageToTime)
|
// Location estimation
|
||||||
this.bindSettings("etr_img_sunrise", "img_sunrise", this.setImageToTime)
|
this.bindSettings("sw_auto_location", "autolocation", this.settingsUpdated)
|
||||||
this.bindSettings("etr_img_morning", "img_morning", this.setImageToTime)
|
this.bindSettings("sc_location_refresh_time", "locationRefreshTime", this.settingsUpdated)
|
||||||
this.bindSettings("etr_img_noon", "img_noon", this.setImageToTime)
|
this.bindSettings("etr_last_update", "etrLastUpdate")
|
||||||
this.bindSettings("etr_img_afternoon", "img_afternoon", this.setImageToTime)
|
this.bindSettings("etr_latitude", "latitude", this.settingsUpdated)
|
||||||
this.bindSettings("etr_img_evening", "img_evening", this.setImageToTime)
|
this.bindSettings("etr_longitude", "longitude", this.settingsUpdated)
|
||||||
this.bindSettings("etr_img_sunset", "img_sunset", this.setImageToTime)
|
|
||||||
this.bindSettings("etr_img_night_twilight", "img_night_twilight", this.setImageToTime)
|
// Time periods
|
||||||
this.bindSettings("etr_img_night", "img_night", this.setImageToTime)
|
|
||||||
this.bindSettings("tv_times", "tvTimes")
|
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)
|
||||||
|
this.bindSettings("etr_img_sunrise", "img_sunrise", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_morning", "img_morning", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_noon", "img_noon", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_afternoon", "img_afternoon", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_evening", "img_evening", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_sunset", "img_sunset", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_night_twilight", "img_night_twilight", this.settingsUpdated)
|
||||||
|
this.bindSettings("etr_img_night", "img_night", this.settingsUpdated)
|
||||||
|
|
||||||
|
this.bindSettings("etr_morning_twilight_times", "img_morning_twilight_times")
|
||||||
|
this.bindSettings("etr_sunrise_times", "img_sunrise_times")
|
||||||
|
this.bindSettings("etr_morning_times", "img_morning_times")
|
||||||
|
this.bindSettings("etr_noon_times", "img_noon_times")
|
||||||
|
this.bindSettings("etr_afternoon_times", "img_afternoon_times")
|
||||||
|
this.bindSettings("etr_evening_times", "img_evening_times")
|
||||||
|
this.bindSettings("etr_sunset_times", "img_sunset_times")
|
||||||
|
this.bindSettings("etr_night_twilight_times", "img_night_twilight_times")
|
||||||
|
this.bindSettings("etr_night_times", "img_night_times")
|
||||||
|
|
||||||
|
|
||||||
// Check for the first startup
|
// Check for the first startup
|
||||||
if (this.settings.getValue("first_start")) {
|
if (this.settings.getValue("first_start")) {
|
||||||
|
this.writeToLogs("First time start")
|
||||||
|
|
||||||
// Welcome notification
|
// Welcome notification
|
||||||
this.showNotification("Welcome to Cinnamon Dynamic Wallpaper",
|
communication.showNotification("Welcome to Cinnamon Dynamic Wallpaper",
|
||||||
"Check the preferences to choose a dynamic wallpaper", true)
|
"Check the preferences to choose a dynamic wallpaper", true)
|
||||||
|
|
||||||
// Hide the notification on system restart
|
// Hide the notification on system restart
|
||||||
this.settings.setValue("first_start", false)
|
this.settings.setValue("first_start", false)
|
||||||
@@ -93,6 +126,7 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.writeToLogs("Initialization completed")
|
||||||
|
|
||||||
// Set image initial at desktop wallpaper
|
// Set image initial at desktop wallpaper
|
||||||
this.setImageToTime()
|
this.setImageToTime()
|
||||||
@@ -105,9 +139,9 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
/**
|
/**
|
||||||
* Binding the settings objects
|
* Binding the settings objects
|
||||||
*
|
*
|
||||||
* @param {*} ui_name Name of preference in settings-schema.json
|
* @param {string} ui_name Name of preference in settings-schema.json
|
||||||
* @param {*} js_name Name of preference in JavaScript
|
* @param {string} js_name Name of preference in JavaScript
|
||||||
* @param {*} func Function to call on change
|
* @param {Function} func Function to call on change
|
||||||
*/
|
*/
|
||||||
bindSettings: function (ui_name, js_name, func = this.on_settings_changed) {
|
bindSettings: function (ui_name, js_name, func = this.on_settings_changed) {
|
||||||
this.settings.bindProperty(
|
this.settings.bindProperty(
|
||||||
@@ -118,45 +152,81 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Displaying a desktop notification
|
* Main loop
|
||||||
*
|
|
||||||
* @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) {
|
_loop: function () {
|
||||||
let source = new MessageTray.Source(this.uuid);
|
if (looping) {
|
||||||
|
this.setImageToTime()
|
||||||
|
|
||||||
// Parameter
|
// Update the location, if the user choose "autoLocation" and the timer has expired
|
||||||
let params = {
|
if ((lastLocationUpdate == -1 ||
|
||||||
icon: new St.Icon({
|
lastLocationUpdate.getTime() < new Date().getTime() - this.locationRefreshTime * 60000) &&
|
||||||
icon_name: "icon",
|
this.autolocation)
|
||||||
icon_type: St.IconType.FULLCOLOR,
|
{
|
||||||
icon_size: source.ICON_SIZE
|
this.updateLocation()
|
||||||
})
|
lastLocationUpdate = new Date()
|
||||||
};
|
}
|
||||||
|
|
||||||
// The notification itself
|
// Refresh every 60 seconds
|
||||||
let notification = new MessageTray.Notification(source, title, text, params);
|
Mainloop.timeout_add_seconds(60, Lang.bind(this, this._loop));
|
||||||
|
this.writeToLogs("Main loop runs...")
|
||||||
// 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);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/******************** Settings handling ********************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles changes in settings
|
||||||
|
*/
|
||||||
|
settingsUpdated: function() {
|
||||||
|
lastDayTime = suntimes.DAYPERIOD.NONE
|
||||||
|
|
||||||
|
this.updateLocation()
|
||||||
|
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");
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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")
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/******************** Other functions ********************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the desktop background image
|
* Changes the desktop background image
|
||||||
*
|
*
|
||||||
@@ -165,8 +235,19 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
changeWallpaper: function(imageURI) {
|
changeWallpaper: function(imageURI) {
|
||||||
let gSetting = new Gio.Settings({schema: 'org.cinnamon.desktop.background'});
|
let gSetting = new Gio.Settings({schema: 'org.cinnamon.desktop.background'});
|
||||||
gSetting.set_string('picture-uri', imageURI);
|
gSetting.set_string('picture-uri', imageURI);
|
||||||
|
|
||||||
|
if (this.imageStretch) {
|
||||||
|
gSetting.set_string('picture-options', 'spanned')
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gSetting.set_string('picture-options', 'zoom')
|
||||||
|
}
|
||||||
|
|
||||||
Gio.Settings.sync();
|
Gio.Settings.sync();
|
||||||
gSetting.apply();
|
gSetting.apply();
|
||||||
|
|
||||||
|
this.writeToLogs("Set new image: " + imageURI)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@@ -198,11 +279,21 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function convertToTimeString(time) {
|
function convertToTimeString(time) {
|
||||||
return time.getHours().toString().padStart(2, "0") + ":" + time.getMinutes().toString().padStart(2, "0")
|
return time.getHours().toString().padStart(2, "0") + ":" + time.getMinutes().toString().padStart(2, "0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.img_morning_twilight_times = convertToTimeString(timesArray[0][0]) + " - " + convertToTimeString(timesArray[0][1])
|
||||||
|
this.img_sunrise_times = convertToTimeString(timesArray[1][0]) + " - " + convertToTimeString(timesArray[1][1])
|
||||||
|
this.img_morning_times = convertToTimeString(timesArray[2][0]) + " - " + convertToTimeString(timesArray[2][1])
|
||||||
|
this.img_noon_times = convertToTimeString(timesArray[3][0]) + " - " + convertToTimeString(timesArray[3][1])
|
||||||
|
this.img_afternoon_times = convertToTimeString(timesArray[4][0]) + " - " + convertToTimeString(timesArray[4][1])
|
||||||
|
this.img_evening_times = convertToTimeString(timesArray[5][0]) + " - " + convertToTimeString(timesArray[5][1])
|
||||||
|
this.img_sunset_times = convertToTimeString(timesArray[6][0]) + " - " + convertToTimeString(timesArray[6][1])
|
||||||
|
this.img_night_twilight_times = convertToTimeString(timesArray[7][0]) + " - " + convertToTimeString(timesArray[7][1])
|
||||||
|
this.img_night_times = convertToTimeString(timesArray[8][0]) + " - " + convertToTimeString(timesArray[8][1])
|
||||||
|
|
||||||
this.tvTimes =
|
this.tvTimes =
|
||||||
"Morning Twilight:\t\t" + convertToTimeString(timesArray[0][0]) + " - " + convertToTimeString(timesArray[0][1]) +
|
"Morning Twilight:\t\t" + convertToTimeString(timesArray[0][0]) + " - " + convertToTimeString(timesArray[0][1]) +
|
||||||
"\nSunrise:\t\t\t\t" + convertToTimeString(timesArray[1][0]) + " - " + convertToTimeString(timesArray[1][1]) +
|
"\nSunrise:\t\t\t\t" + convertToTimeString(timesArray[1][0]) + " - " + convertToTimeString(timesArray[1][1]) +
|
||||||
@@ -220,77 +311,27 @@ CinnamonDynamicWallpaperExtension.prototype = {
|
|||||||
* Callback for changes in preferences
|
* Callback for changes in preferences
|
||||||
*/
|
*/
|
||||||
updateLocation: function () {
|
updateLocation: function () {
|
||||||
|
// Update the update information
|
||||||
|
lastLocationUpdate = new Date()
|
||||||
|
|
||||||
if (this.autolocation) {
|
if (this.autolocation) {
|
||||||
let loc = location.estimateLocation()
|
let loc = location.estimateLocation()
|
||||||
this.latitude = loc["latitude"]
|
this.latitude = loc["latitude"]
|
||||||
this.longitude = loc["longitude"]
|
this.longitude = loc["longitude"]
|
||||||
} else {
|
|
||||||
this.latitude = this.latitude
|
this.etrLastUpdate = lastLocationUpdate.getHours() + ":" + lastLocationUpdate.getMinutes()
|
||||||
this.longitude = this.longitude
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh the image information, if it's necessary
|
this.writeToLogs("Location updated")
|
||||||
this.setImageToTime()
|
|
||||||
|
|
||||||
// Update the update information
|
|
||||||
lastLocationUpdate = new Date()
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main loop
|
* Adding text to the logs
|
||||||
|
*
|
||||||
|
* @param {string} msg New message string
|
||||||
*/
|
*/
|
||||||
_loop: function () {
|
writeToLogs: function(msg) {
|
||||||
if (looping) {
|
this.tvLogs = communication.createLogs(this.tvLogs, msg)
|
||||||
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")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -250,6 +250,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_1">
|
<object class="GtkImage" id="img_preview_1">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -263,7 +275,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -275,7 +287,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -317,6 +329,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_2">
|
<object class="GtkImage" id="img_preview_2">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -329,7 +353,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -340,7 +364,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -382,6 +406,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_3">
|
<object class="GtkImage" id="img_preview_3">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -394,7 +430,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -406,7 +442,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -448,6 +484,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_4">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_4">
|
<object class="GtkImage" id="img_preview_4">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -460,7 +508,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -471,7 +519,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -513,6 +561,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_5">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_5">
|
<object class="GtkImage" id="img_preview_5">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -525,7 +585,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -537,7 +597,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -579,6 +639,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_6">
|
<object class="GtkImage" id="img_preview_6">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -591,7 +663,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -603,7 +675,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -645,6 +717,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_7">
|
<object class="GtkImage" id="img_preview_7">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -657,7 +741,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -669,7 +753,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -711,6 +795,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_8">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_8">
|
<object class="GtkImage" id="img_preview_8">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -723,7 +819,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -735,7 +831,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
@@ -777,6 +873,18 @@
|
|||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
<property name="spacing">8</property>
|
<property name="spacing">8</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="lb_times_9">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">label</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkImage" id="img_preview_9">
|
<object class="GtkImage" id="img_preview_9">
|
||||||
<property name="width-request">300</property>
|
<property name="width-request">300</property>
|
||||||
@@ -789,7 +897,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">0</property>
|
<property name="position">1</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
@@ -801,7 +909,7 @@
|
|||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
<property name="position">1</property>
|
<property name="position">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ IMAGE_DIR = PROJECT_DIR + "images/"
|
|||||||
IMAGE_EXTRACT_DIR = IMAGE_DIR + "extracted/"
|
IMAGE_EXTRACT_DIR = IMAGE_DIR + "extracted/"
|
||||||
IMAGE_SETS_DIR = IMAGE_DIR + "included_image_sets/"
|
IMAGE_SETS_DIR = IMAGE_DIR + "included_image_sets/"
|
||||||
IMAGE_SELECTED_DIR = IMAGE_DIR + "selected/"
|
IMAGE_SELECTED_DIR = IMAGE_DIR + "selected/"
|
||||||
|
IMAGE_DEFAULT_DIR = IMAGE_DIR + "default/"
|
||||||
|
|
||||||
|
|
||||||
class WindowHandler:
|
class WindowHandler:
|
||||||
@@ -20,7 +21,19 @@ class WindowHandler:
|
|||||||
########### Class variables ###########
|
########### Class variables ###########
|
||||||
self.pref_path = pref_path
|
self.pref_path = pref_path
|
||||||
|
|
||||||
self.pref_vars = [
|
self.time_values = [
|
||||||
|
"etr_morning_twilight_times",
|
||||||
|
"etr_sunrise_times",
|
||||||
|
"etr_morning_times",
|
||||||
|
"etr_noon_times",
|
||||||
|
"etr_afternoon_times",
|
||||||
|
"etr_evening_times",
|
||||||
|
"etr_sunset_times",
|
||||||
|
"etr_night_twilight_times",
|
||||||
|
"etr_night_times"
|
||||||
|
]
|
||||||
|
|
||||||
|
self.img_values = [
|
||||||
"etr_img_morning_twilight",
|
"etr_img_morning_twilight",
|
||||||
"etr_img_sunrise",
|
"etr_img_sunrise",
|
||||||
"etr_img_morning",
|
"etr_img_morning",
|
||||||
@@ -69,6 +82,18 @@ class WindowHandler:
|
|||||||
self.lb_heic_file = self.builder.get_object("lb_heic_file")
|
self.lb_heic_file = self.builder.get_object("lb_heic_file")
|
||||||
self.fc_heic_file = self.builder.get_object("fc_heic_file")
|
self.fc_heic_file = self.builder.get_object("fc_heic_file")
|
||||||
|
|
||||||
|
self.lb_times = [
|
||||||
|
self.builder.get_object("lb_times_1"),
|
||||||
|
self.builder.get_object("lb_times_2"),
|
||||||
|
self.builder.get_object("lb_times_3"),
|
||||||
|
self.builder.get_object("lb_times_4"),
|
||||||
|
self.builder.get_object("lb_times_5"),
|
||||||
|
self.builder.get_object("lb_times_6"),
|
||||||
|
self.builder.get_object("lb_times_7"),
|
||||||
|
self.builder.get_object("lb_times_8"),
|
||||||
|
self.builder.get_object("lb_times_9")
|
||||||
|
]
|
||||||
|
|
||||||
self.img_previews = [
|
self.img_previews = [
|
||||||
self.builder.get_object("img_preview_1"),
|
self.builder.get_object("img_preview_1"),
|
||||||
self.builder.get_object("img_preview_2"),
|
self.builder.get_object("img_preview_2"),
|
||||||
@@ -147,21 +172,25 @@ class WindowHandler:
|
|||||||
self.cb_image_set.set_active(i)
|
self.cb_image_set.set_active(i)
|
||||||
|
|
||||||
|
|
||||||
for i, val in enumerate(self.pref_vars):
|
for i, val in enumerate(self.img_values):
|
||||||
# Set the preview image
|
# Bugfix: Load the images only, if there is choosen one
|
||||||
self.changePreviewImage(i, IMAGE_SELECTED_DIR + pref_data[val]['value'])
|
if pref_data[val]['value'] != None:
|
||||||
|
# Set the preview image
|
||||||
|
self.changePreviewImage(i, IMAGE_SELECTED_DIR + pref_data[val]['value'])
|
||||||
|
|
||||||
# Set the ComboBox selection
|
# Set the ComboBox selection
|
||||||
if pref_data["etr_choosen_image_set"]["value"] == "custom":
|
if pref_data["etr_choosen_image_set"]["value"] == "custom":
|
||||||
self.image_source = Source.EXTRACT
|
self.image_source = Source.EXTRACT
|
||||||
|
|
||||||
for j, set in enumerate(choosable_images):
|
for j, set in enumerate(choosable_images):
|
||||||
if set == pref_data[val]["value"]:
|
if set == pref_data[val]["value"]:
|
||||||
self.cb_previews[i].set_active(j)
|
self.cb_previews[i].set_active(j)
|
||||||
else:
|
else:
|
||||||
self.image_source = Source.SET
|
self.image_source = Source.SET
|
||||||
#except:
|
|
||||||
# pass
|
# Print the times of the day
|
||||||
|
for i, val in enumerate(self.time_values):
|
||||||
|
self.lb_times[i].set_text(pref_data[val]['value'])
|
||||||
|
|
||||||
|
|
||||||
def writeToSettings(self):
|
def writeToSettings(self):
|
||||||
@@ -176,13 +205,15 @@ class WindowHandler:
|
|||||||
if self.image_source == Source.SET:
|
if self.image_source == Source.SET:
|
||||||
pref_data["etr_choosen_image_set"]["value"] = self.cb_image_set.get_active_text()
|
pref_data["etr_choosen_image_set"]["value"] = self.cb_image_set.get_active_text()
|
||||||
|
|
||||||
for i, val in enumerate(self.pref_vars):
|
for i, val in enumerate(self.img_values):
|
||||||
pref_data[val]['value'] = str(i + 1) + ".jpg"
|
pref_data[val]['value'] = str(i + 1) + ".jpg"
|
||||||
else:
|
else:
|
||||||
pref_data["etr_choosen_image_set"]["value"] = "custom"
|
pref_data["etr_choosen_image_set"]["value"] = "custom"
|
||||||
|
|
||||||
for i, val in enumerate(self.pref_vars):
|
for i, val in enumerate(self.img_values):
|
||||||
pref_data[val]['value'] = self.cb_previews[i].get_active_text()
|
image_name = self.cb_previews[i].get_active_text()
|
||||||
|
|
||||||
|
pref_data[val]['value'] = image_name
|
||||||
|
|
||||||
|
|
||||||
# Write the settings
|
# Write the settings
|
||||||
@@ -219,7 +250,7 @@ class WindowHandler:
|
|||||||
self.image_source = Source.EXTRACT
|
self.image_source = Source.EXTRACT
|
||||||
|
|
||||||
self.wipeImages(Source.EXTRACT)
|
self.wipeImages(Source.EXTRACT)
|
||||||
os.system("heif-convert " + imageURI + " " + IMAGE_EXTRACT_DIR + "/" + filename + ".jpg")
|
os.system("heif-convert " + imageURI + " " + IMAGE_EXTRACT_DIR + filename + ".jpg")
|
||||||
|
|
||||||
self.createExtracted()
|
self.createExtracted()
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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;
|
const Soup = imports.gi.Soup;
|
||||||
|
|
||||||
|
|
||||||
|
/******************** Functions ********************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Estimate the location of the user
|
||||||
|
*
|
||||||
|
* @returns Location data if succeded or -1 if failed
|
||||||
|
*/
|
||||||
function estimateLocation() {
|
function estimateLocation() {
|
||||||
let sessionSync = new Soup.SessionSync();
|
let sessionSync = new Soup.SessionSync();
|
||||||
let msg = Soup.Message.new('GET', "https://get.geojs.io/v1/ip/geo.json");
|
let msg = Soup.Message.new('GET', "https://get.geojs.io/v1/ip/geo.json");
|
||||||
|
|||||||
@@ -2,8 +2,12 @@
|
|||||||
* @name Cinnamon-Dynamic-Wallpaper
|
* @name Cinnamon-Dynamic-Wallpaper
|
||||||
* @alias TobiZog
|
* @alias TobiZog
|
||||||
* @since 2023
|
* @since 2023
|
||||||
|
*
|
||||||
|
* @description Functions to calculate sun time periods
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/******************** Constants ********************/
|
||||||
|
|
||||||
const DAYPERIOD = {
|
const DAYPERIOD = {
|
||||||
MTWILIGHT: 0,
|
MTWILIGHT: 0,
|
||||||
SUNRISE: 1,
|
SUNRISE: 1,
|
||||||
@@ -22,6 +26,9 @@ const J1970 = 2440588
|
|||||||
const J2000 = 2451545
|
const J2000 = 2451545
|
||||||
|
|
||||||
|
|
||||||
|
/******************** Functions ********************/
|
||||||
|
|
||||||
|
|
||||||
function fromJulian(j) {
|
function fromJulian(j) {
|
||||||
let ms_date = (j + 0.5 - J1970) * DAYMS
|
let ms_date = (j + 0.5 - J1970) * DAYMS
|
||||||
return new Date(ms_date)
|
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) {
|
function calcTimePeriod(latitude, longitude) {
|
||||||
let todaySunEventsDay = sunEventsOfDay(latitude, longitude, Date.now())
|
let todaySunEventsDay = sunEventsOfDay(latitude, longitude, Date.now())
|
||||||
let tomorrowSunEventsDay = sunEventsOfDay(latitude, longitude, addMinutesToTime(new Date(), 1440))
|
let tomorrowSunEventsDay = sunEventsOfDay(latitude, longitude, addMinutesToTime(new Date(), 1440))
|
||||||
|
|||||||
@@ -3,8 +3,12 @@
|
|||||||
"type": "layout",
|
"type": "layout",
|
||||||
"pages": [
|
"pages": [
|
||||||
"pg_config",
|
"pg_config",
|
||||||
|
"pg_logs",
|
||||||
"pg_about"
|
"pg_about"
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"pg_config": {
|
"pg_config": {
|
||||||
"type": "page",
|
"type": "page",
|
||||||
"title": "Configuration",
|
"title": "Configuration",
|
||||||
@@ -14,23 +18,32 @@
|
|||||||
"sec_times"
|
"sec_times"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"pg_logs": {
|
||||||
|
"type": "page",
|
||||||
|
"title": "Debugging",
|
||||||
|
"sections": [
|
||||||
|
"sec_logs",
|
||||||
|
"sec_report_issue"
|
||||||
|
]
|
||||||
|
},
|
||||||
"pg_about": {
|
"pg_about": {
|
||||||
"type": "page",
|
"type": "page",
|
||||||
"title": "About",
|
"title": "About",
|
||||||
"sections": [
|
"sections": [
|
||||||
"sec_project",
|
"sec_project",
|
||||||
"sec_github",
|
"sec_github"
|
||||||
"sec_report_issue"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"sec_image_configuration": {
|
"sec_image_configuration": {
|
||||||
"type": "section",
|
"type": "section",
|
||||||
"title": "Image set",
|
"title": "Image set",
|
||||||
"keys": [
|
"keys": [
|
||||||
"lb_image_configuration",
|
"lb_image_configuration",
|
||||||
"btn_config_images"
|
"btn_config_images",
|
||||||
|
"sw_image_stretch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sec_location": {
|
"sec_location": {
|
||||||
@@ -39,6 +52,7 @@
|
|||||||
"keys": [
|
"keys": [
|
||||||
"sw_auto_location",
|
"sw_auto_location",
|
||||||
"sc_location_refresh_time",
|
"sc_location_refresh_time",
|
||||||
|
"etr_last_update",
|
||||||
"etr_latitude",
|
"etr_latitude",
|
||||||
"etr_longitude"
|
"etr_longitude"
|
||||||
]
|
]
|
||||||
@@ -50,6 +64,26 @@
|
|||||||
"tv_times"
|
"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": {
|
"sec_project": {
|
||||||
"type": "section",
|
"type": "section",
|
||||||
"title": "About the project",
|
"title": "About the project",
|
||||||
@@ -67,18 +101,11 @@
|
|||||||
"lb_repository",
|
"lb_repository",
|
||||||
"btn_open_repository"
|
"btn_open_repository"
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"sec_report_issue": {
|
|
||||||
"type": "section",
|
|
||||||
"title": "Report an issue",
|
|
||||||
"keys": [
|
|
||||||
"lb_report_issue",
|
|
||||||
"btn_report_issue"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"lb_image_configuration": {
|
"lb_image_configuration": {
|
||||||
"type": "label",
|
"type": "label",
|
||||||
"description": "Choose an included image set or import a heic-file with the Image Configurator"
|
"description": "Choose an included image set or import a heic-file with the Image Configurator"
|
||||||
@@ -88,6 +115,12 @@
|
|||||||
"description": "Image Configurator",
|
"description": "Image Configurator",
|
||||||
"callback": "openImageConfigurator"
|
"callback": "openImageConfigurator"
|
||||||
},
|
},
|
||||||
|
"sw_image_stretch": {
|
||||||
|
"type": "switch",
|
||||||
|
"description": "Expand image over all displays",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
|
||||||
"sw_auto_location": {
|
"sw_auto_location": {
|
||||||
"type": "switch",
|
"type": "switch",
|
||||||
"default": true,
|
"default": true,
|
||||||
@@ -102,6 +135,12 @@
|
|||||||
"description": "Interval time to refresh the location via network (min)",
|
"description": "Interval time to refresh the location via network (min)",
|
||||||
"dependency": "sw_auto_location"
|
"dependency": "sw_auto_location"
|
||||||
},
|
},
|
||||||
|
"etr_last_update": {
|
||||||
|
"type": "entry",
|
||||||
|
"description": "Last location update",
|
||||||
|
"default": "",
|
||||||
|
"dependency": "sw_auto_location"
|
||||||
|
},
|
||||||
"etr_latitude": {
|
"etr_latitude": {
|
||||||
"type": "entry",
|
"type": "entry",
|
||||||
"default": "",
|
"default": "",
|
||||||
@@ -114,6 +153,7 @@
|
|||||||
"description": "Longitude",
|
"description": "Longitude",
|
||||||
"dependency": "!sw_auto_location"
|
"dependency": "!sw_auto_location"
|
||||||
},
|
},
|
||||||
|
|
||||||
"tv_times": {
|
"tv_times": {
|
||||||
"type": "textview",
|
"type": "textview",
|
||||||
"description": "Time sections today",
|
"description": "Time sections today",
|
||||||
@@ -121,6 +161,28 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
"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": {
|
"lb_about": {
|
||||||
"type": "label",
|
"type": "label",
|
||||||
"description": "Based on a location, this extension calculates the periods of a day and switch the background image of your Cinnamon desktop. The extension offers the choice between a set of predownloaded wallpapers or to select a custom set of images."
|
"description": "Based on a location, this extension calculates the periods of a day and switch the background image of your Cinnamon desktop. The extension offers the choice between a set of predownloaded wallpapers or to select a custom set of images."
|
||||||
@@ -149,16 +211,7 @@
|
|||||||
"callback": "openRepoWebsite"
|
"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": {
|
"etr_choosen_image_set": {
|
||||||
@@ -214,5 +267,51 @@
|
|||||||
"first_start": {
|
"first_start": {
|
||||||
"type": "generic",
|
"type": "generic",
|
||||||
"default": true
|
"default": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"etr_morning_twilight_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_sunrise_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_morning_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_noon_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_afternoon_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_evening_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_sunset_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_night_twilight_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"etr_night_times": {
|
||||||
|
"type": "entry",
|
||||||
|
"default": "",
|
||||||
|
"description": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
"uuid": "cinnamon-dynamic-wallpaper@TobiZog",
|
"uuid": "cinnamon-dynamic-wallpaper@TobiZog",
|
||||||
"name": "Cinnamon Dynamic Wallpaper",
|
"name": "Cinnamon Dynamic Wallpaper",
|
||||||
"description": "Cinnamon extension for dynamic desktop backgrounds based on time and location",
|
"description": "Cinnamon extension for dynamic desktop backgrounds based on time and location",
|
||||||
"version": "1.2",
|
"version": "1.4",
|
||||||
"multiversion": true,
|
"multiversion": true,
|
||||||
"cinnamon-version": [
|
"cinnamon-version": [
|
||||||
"4.8",
|
"4.8",
|
||||||
|
|||||||
Reference in New Issue
Block a user