dotfiles/awes2/module/dynamic-wallpaper.lua

225 lines
5.8 KiB
Lua
Executable file

----------------------------------------------------------------------------
--- Wallpaper changer module
--
-- @author Gerome Matilla <gerome.matilla07@gmail.com>
-- @copyright 2019 Gerome Matilla
-- @module wallchange
--
--- Nevermind this. Do what you want.
----------------------------------------------------------------------------
-- This module changes wallpaper based on declared time
-- It checks the difference between the current time and the next scheduled time
-- Then convert it to seconds to set it as a timeout value
-- Limitations:
-- Timeout paused when laptop/pc is suspended or in sleep mode, and there's probably some bugs too so whatever
local awful = require('awful')
local filesystem = require('gears.filesystem')
local gears = require('gears')
local beautiful = require('beautiful')
-- ========================================
-- Configuration
-- Change your preference here
-- ========================================
-- Wallpaper directory. The default is:
local wall_dir = filesystem.get_configuration_dir() .. 'theme/wallpapers/'
-- local wall_dir = os.getenv('HOME') .. 'Pictures/Wallpapers/'
-- Wallpapers filename
-- Note:
-- Default image format is jpg
wallpaper_morning = 'morning-wallpaper.jpg'
wallpaper_noon = 'noon-wallpaper.jpg'
wallpaper_night = 'night-wallpaper.jpg'
wallpaper_midnight = 'midnight-wallpaper.jpg'
-- Change the wallpaper on scheduled time
morning_schedule = '06:22:00'
noon_schedule = '12:00:00'
night_schedule = '17:58:00'
midnight_schedule = '24:00:00'
-- Update lockscreen background
local update_ls_bg = false
-- Update lockscreen background command
local update_ls_cmd = 'mantablockscreen --image'
-- ========================================
-- Processes
-- Don't touch it if it's working
-- ========================================
-- Get current time
local current_time = function()
return os.date("%H:%M:%S")
end
-- Countdown variable
-- In seconds
the_countdown = nil
-- We will use an array for hour change and wallpaper string
-- Element 0 errm 1 will store the incoming/next scheduled time
-- Geez why the f is lua's array starts with `1`? lol
-- Element 2 will have the wallpaper file name
local wall_data = {}
-- > Why array, you say?
-- Because why not? I'm new to lua and I'm experimenting with it
-- Parse HH:MM:SS to seconds
local parse_to_seconds = function(time)
-- Convert HH in HH:MM:SS
hour_sec = tonumber(string.sub(time, 1, 2)) * 3600
-- Convert MM in HH:MM:SS
min_sec = tonumber(string.sub(time, 4, 5)) * 60
-- Get SS in HH:MM:SS
get_sec = tonumber(string.sub(time, 7, 8))
-- Return computed seconds
return (hour_sec + min_sec + get_sec)
end
-- Get time difference
local time_diff = function(current, schedule)
local diff = parse_to_seconds(current) - parse_to_seconds(schedule)
return diff
end
-- Update wallpaper (used by the manage_timer function)
-- I think the gears.wallpaper.maximized is too fast or being ran asynchronously
-- So the wallpaper is not being updated on awesome (re)start without this timer
-- We need some delay.
-- Hey it's working, so whatever
local update_wallpaper = function(wall_name)
gears.timer.start_new(0, function()
local wall_dir = wall_dir .. wall_name
gears.wallpaper.maximized (wall_dir, s)
-- Overwrite the default wallpaper
-- This is important in case we add an extra monitor
beautiful.wallpaper = wall_dir
if update_ls_bg then
awful.spawn.easy_async_with_shell(update_ls_cmd .. ' ' .. wall_dir, function()
--
end)
end
end)
end
-- Updates variables
local manage_timer = function()
-- Get current time
local time_now = parse_to_seconds(current_time())
-- Parse the schedules to seconds
local parsed_morning = parse_to_seconds(morning_schedule)
local parsed_noon = parse_to_seconds(noon_schedule)
local parsed_night = parse_to_seconds(night_schedule)
local parsed_midnight = parse_to_seconds('00:00:00')
-- Note that we will use '00:00:00' instead of '24:00:00' as midnight
-- As the latter causes an error. The time_diff() returns a negative value
if time_now >= parsed_midnight and time_now < parsed_morning then
-- Midnight time
-- Update Wallpaper
update_wallpaper(wallpaper_midnight)
-- Set the data for the next scheduled time
wall_data = {morning_schedule, wallpaper_morning}
elseif time_now >= parsed_morning and time_now < parsed_noon then
-- Morning time
-- Update Wallpaper
update_wallpaper(wallpaper_morning)
-- Set the data for the next scheduled time
wall_data = {noon_schedule, wallpaper_noon}
elseif time_now >= parsed_noon and time_now < parsed_night then
-- Noon time
-- Update Wallpaper
update_wallpaper(wallpaper_noon)
-- Set the data for the next scheduled time
wall_data = {night_schedule, wallpaper_night}
else
-- Night time
-- Update Wallpaper
update_wallpaper(wallpaper_night)
-- Set the data for the next scheduled time
wall_data = {midnight_schedule, wallpaper_midnight}
end
-- Get the time difference to set as timeout for the wall_updater timer below
the_countdown = time_diff(wall_data[1], current_time())
end
-- Update values at startup
manage_timer()
local wall_updater = gears.timer {
-- The timeout is the difference of current time and the scheduled time we set above.
timeout = the_countdown,
autostart = true,
call_now = true,
callback = function()
-- Emit signal to update wallpaper
awesome.emit_signal("module::change_wallpaper")
end
}
-- Update wallpaper here and update the timeout for the next schedule
awesome.connect_signal("module::change_wallpaper", function()
-- Update wallpaper based on the data in the array
gears.wallpaper.maximized (wall_dir .. wall_data[2], s)
-- Update values for the next specified schedule
manage_timer()
-- Update timer timeout for the next specified schedule
wall_updater.timeout = the_countdown
-- Restart timer
wall_updater:again()
end)