Have you seen the amazing dynamic wallpapers on the new macOS 10.14 Mojave? Mojave calculates the position of the sun for your current time and location, compares them to the 16 images inside Mojave (Dynamic).heic
and displays the one closest to your constellation as wallpaper.
majo-v is a proof of concept to achieve the same, on all Macs, in ~100 lines of python.
The recommended way of installing majo-v is with pipsi, but you can also use pip:
pipsi install git+https://github.com/r4lv/majo-v#egg=majo-v
# or
pip install git+https://github.com/r4lv/majo-v#egg=majo-v
Note that majo-v requires python 2.7 or 3.4+.
To use majo-v, you need a folder with a bunch of images inside. You can put there as many as you want (e.g. the original 16 images from macOS Mojave), as long as you rename the files based on the time of the day they should appear first, in the format HH_MM.jpg
, e.g. 06_00.jpg
for an image which is to be displayed after 6am, 08_30.jpg
for an image displayed after 8:30, and so on. You then pass the folder as command line argument to majo-v, which chooses the most fitting image, and sets it as wallpaper on all your screens.
Usage: majo-v [--version] [--no-icon|--once] [--current-time 'HH:MM'] FOLDER
Set the most fitting image from the given folder as wallpaper.
FOLDER contains a set of jpg images, where the filenames are named after
the time of the day where they should appear first, in the format
'HH_MM.jpg', e.g. '06_00.jpg' for an image which is to be displayed after
6am, '08_30.jpg' for an image displayed after 8:30, and so on.
Options:
--version Show the version and exit.
--no-icon Do not show the menu bar icon.
--once Set wallpaper and quit.
--current-time 'HH:MM' Overwrite time used for selecting the most fitting image.
--help Show this message and exit.
- By default, majo-v sits in the menu bar and updates the wallpaper whenever needed. Use
&
to run majo-v in the background and detach it from the terminal:majo-v ~/Pictures/Mojave-Wallpaper &
- With
--no-icon
, you won't see a menu bar icon, but the functionality is the same. Note that when you use&
in this case (don't do that), you willtop
or Activity Monitor to quit majo-v! - With
--once
majo-v will just set the wallpaper based on the current time, and quit. - You can override the current time by using the
--current-time HH:MM
option, to force a specific wallpaper. Useful to check what majo-v does.
majo-v depends on
- click, for the command line interface
- pyobjc-core, for calling the macOS APIs
- rumps, for the menu bar interface
- pendulum, for handling date and time
MacOS 10.14 Mojave's dynamic desktop feature uses single .heic
files which contain a sequence of 16 images, together with metadata (altitude & azimuth of the sun in every image, and index of the default dark and light images when dynamic mode is disabled). I found no way of extracting the images on macOS version before Mojave (metadata can be extracted with 10.13 High Sierra), so you sadly cannot use .heic
files with majo-v
This would be quite feasable, but I think the gain is little. Just rename your files in winter, so that the sunrise matches again ;)
The menubar.tiff
contains two versions of the icon, so it looks good on retina too. The icons were created with these parameters:
menubar.png
, 20×20px- 15×15px circle shape with 1px centered stroke
- 1px padding at the top, 2px padding at the bottom
[email protected]
, 40×40px- 30×30px circle shape with 2px centered stroke
- 4px padding at top and bottom
…and then combined to a single menubar.tiff
with
tiffutil -cathidpicheck menubar.png [email protected] -out menubar.tiff
No need to compress the .png
s, as the .tiff
stores the pixel values only.
By design of macOS, one cannot set a wallpaper for all spaces at once. To come around this limitation, majo-v watches if you change the active space (by listening to NSWorkspaceActiveSpaceDidChangeNotification
) and applies the correct wallpaper. majo-v has to be started with --gui
for this, so that it can sit in the menu bar and watch.
majo-v is compatible with python 2.7 and python 3.4+.
- dict comprehension: python 2.7+
- pathlib: python 3.4+, but pathlib2 backport for older versions
- pendulum: python 2.7+
- pysolar could be used to calculate the current sun position
- xtai/mojave-dynamic-heic also has the extracted jpg from
Mojave (Dynamic).heic
- nshipster.com has a nice nerdy article about dynamic wallpapers, CoreGraphics and HEIC. They also implemented a solar position calculation in Swift
- pipwerks/OS-X-Wallpaper-Changer does something similar, but with applescript and just 6 wallpapers/day
- sindresorhus/macos-wallpaper has some more sophisticated handling of
NSWorkspace.shared.setDesktopImageURL
and companions