There is another way to get the image by taking a screenshot from the current wallpaper.
extension NSImage { static func desktopPicture() -> NSImage { let windows = CGWindowListCopyWindowInfo( CGWindowListOption.OptionOnScreenOnly, CGWindowID(0))! as NSArray var index = 0 for var i = 0; i < windows.count; i++ { let window = windows[i] // we need windows owned by Dock let owner = window["kCGWindowOwnerName"] as! String if owner != "Dock" { continue } // we need windows named like "Desktop Picture %" let name = window["kCGWindowName"] as! String if !name.hasPrefix("Desktop Picture") { continue } // wee need the one which belongs to the current screen let bounds = window["kCGWindowBounds"] as! NSDictionary let x = bounds["X"] as! CGFloat if x == NSScreen.mainScreen()!.frame.origin.x { index = window["kCGWindowNumber"] as! Int break } } let cgImage = CGWindowListCreateImage( CGRectZero, CGWindowListOption(arrayLiteral: CGWindowListOption.OptionIncludingWindow), CGWindowID(index), CGWindowImageOption.Default)! let image = NSImage(CGImage: cgImage, size: NSScreen.mainScreen()!.frame.size) return image } }
This approach looks much easier IMHO if you need a picture, not a URL.
Please note that wallpapers are no longer defined in pl. com.apple.dektop: starting with Mavericks, the parameter moves to ~ / Library / Application Support / Dock / desktoppicture.db. This is an SQLite file, and the "data" table contains the URL.
Alexey Kvasov
source share