import commands, sys, os, os.path, subprocess, time
from GregDebug import debug, setDebugLevel, DEBUG_LEVEL_DEBUG, DEBUG_LEVEL_LOW, DEBUG_LEVEL_MEDIUM, DEBUG_LEVEL_HIGH, DEBUG_INCREMENT
+import FileLists
import python24_adapter # NB: Must be imported before collections
import collections
else:
ret = __KDEChanger(*args, **kwargs)
+ debug("Testing for Gnome", DEBUG_LEVEL_LOW)
+ if commands.getstatusoutput("xwininfo -name 'gnome-session'")[0] == 0:
+ if ret is not None:
+ ret.nextChanger = __GnomeChanger(*args, **kwargs)
+ else:
+ ret = __GnomeChanger(*args, **kwargs)
+
debug("Testing for WMaker", DEBUG_LEVEL_LOW)
if commands.getstatusoutput("xlsclients | grep -qi wmaker")[0] == 0:
if ret is not None:
return self.changeTo(file) and self.callChained(file)
def cycleReload(self):
- file = self.filelist.getCurrentImage()
- return self.changeTo(file) and self.callChained(file)
+ try:
+ file = self.filelist.getCurrentImage()
+ return self.changeTo(file) and self.callChained(file)
+ except FileLists.FileListNotImplemented:
+ return self.cycleNext()
class __WMakerChanger(__BaseChanger):
class __OSXChanger(__BaseChanger):
_ConvertedWallpaperLocation = '/tmp/wallpapers/'
+ _DesktopPlistLocation = os.path.expanduser('~/Library/Preferences/com.apple.desktop.plist')
+
def _removeOldImageCache(self):
"""Cleans up any old temp images"""
if not os.path.isdir(self._ConvertedWallpaperLocation):
"""Convert the image to a png, and store it in a local place"""
self._removeOldImageCache()
output_name = os.path.join(self._ConvertedWallpaperLocation, '%s.png' % time.time())
- cmd = ["convert", file, output_name]
- debug("""Convert command: '"%s"'""" % '" "'.join(cmd), DEBUG_LEVEL_DEBUG)
- return output_name, subprocess.Popen(cmd, stdout=sys.stdout, stderr=sys.stderr, stdin=None).wait()
+ try:
+ import PIL, PIL.Image
+ img = PIL.Image.open(file)
+ img.save(output_name, "PNG")
+ return output_name, True
+ except ImportError:
+ debug('Could not load PIL, going to try just copying the image')
+ import shutil
+ output_name = os.path.join(self._ConvertedWallpaperLocation, os.path.basename(file))
+ shutil.copyfile(file, output_name)
+ return output_name, True
+
+ def _fixDesktopPList(self):
+ """Removes the entry in the desktop plist file that specifies the wallpaper for each monitor"""
+ try:
+ import Foundation
+ desktopPList = Foundation.NSMutableDictionary.dictionaryWithContentsOfFile_(self._DesktopPlistLocation)
+ # Remove all but the 'default' entry
+ for k in desktopPList['Background'].keys():
+ if k == 'default':
+ continue
+ desktopPList['Background'].removeObjectForKey_(k)
+ # Store the plist again (Make sure we write it out atomically -- Don't want to break finder)
+ desktopPList.writeToFile_atomically_(self._DesktopPlistLocation, True)
+ except ImportError:
+ debug('Could not import the Foundation module, you may have problems with dual screens', DEBUG_LEVEL_MEDIUM)
def changeTo(self, file):
output_name, ret = self._convertImageFormat(file)
- if ret: # Since 0 indicates success
- debug("Convert failed %s" % ret)
+ if not ret:
+ debug("Convert failed")
return False
+ self._fixDesktopPList()
cmd = """osascript -e 'tell application "finder" to set desktop picture to posix file "%s"'""" % output_name
debug(cmd, DEBUG_LEVEL_DEBUG)
return not commands.getstatusoutput(cmd)[0]