Skip to content

Instantly share code, notes, and snippets.

@junjuew
Last active September 11, 2017 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save junjuew/a3bc9eebb4e7d6f194ae9685c24b8c7c to your computer and use it in GitHub Desktop.
Save junjuew/a3bc9eebb4e7d6f194ae9685c24b8c7c to your computer and use it in GitHub Desktop.
xscreensaver rotate image in sequence
#!/usr/bin/env python3
import sys
import os
import time
import fcntl
def main(image_dir):
files = []
for (dirpath, dirnames, filenames) in os.walk(image_dir):
for filename in filenames:
files.append(os.path.join(dirpath, filename))
sortedfiles = sorted(files, key=lambda s: s.lower())
home_dir = os.environ['HOME']
cache_filename = os.path.join(home_dir, '.cache', 'xscreensaver', 'xscreensaver-getimage-alt.cache')
os.makedirs(os.path.dirname(cache_filename), exist_ok=True)
cache_fd = os.open(cache_filename, os.O_CREAT | os.O_RDWR, 0o666)
fcntl.lockf(cache_fd, fcntl.LOCK_EX)
cache_file = os.fdopen(cache_fd, 'r+', closefd=False)
line = cache_file.readline()
if not line:
if not sortedfiles:
sys.exit(1);
else:
newfile = sortedfiles[0]
write_cache(cache_file, newfile)
print(newfile)
else:
updatetime_filename = line.split(' ', 1)
updatetime = float(updatetime_filename[0])
filename = updatetime_filename[1]
currenttime = time.time()
if currenttime - updatetime > 2:
# get next item in list
if filename in sortedfiles:
newindex = (sortedfiles.index(filename) + 1) % len(sortedfiles)
else:
newindex = 0
newfile = sortedfiles[newindex]
write_cache(cache_file, newfile)
print(newfile)
else:
print(filename)
fcntl.lockf(cache_fd, fcntl.LOCK_UN)
os.close(cache_fd)
def write_cache(cache_file, filename):
cache_file.seek(0)
cache_file.truncate(0)
cache_file.write(str(time.time()))
cache_file.write(' ')
cache_file.write(filename)
cache_file.flush()
if __name__ == "__main__":
main(sys.argv[-1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment