Search code examples
cocoawallpaper

Get the current wallpaper in Cocoa


I'm using this code to get the current wallpaper:

NSURL *imageURL = [[NSWorkspace sharedWorkspace] desktopImageURLForScreen:[NSScreen mainScreen]];

This works fine, but when i set a folder of pictures to be the wallpaper(As shown in the picture), the imageURL is a directory, so how can i get the current wallpaper's USURL in this situation?

enter image description here


Solution

  • I've been trying to do the exact same thing. You can get the current desktop picture URL by:

    1. Getting the current space UUID from the com.apple.spaces property list,
    2. Searching the com.apple.desktop property list for the matching space,
    3. Extracting the URL from the LastName property

    I am still working on this, but the following code obtains the correct URL... sometimes. The main problem is that the property lists aren't updated frequently enough, and I haven't been able to force them to refresh (short of killing the dock). Let me know if you figure something out!

    NSDictionary *spacesPLIST = (__bridge NSDictionary *)(CFPreferencesCopyAppValue(CFSTR("SpacesConfiguration"), CFSTR("com.apple.spaces")));
    NSDictionary *desktopPLIST = (__bridge NSDictionary *)(CFPreferencesCopyAppValue(CFSTR("Background"), CFSTR("com.apple.desktop")));
    
    NSArray *monitors = [spacesPLIST valueForKeyPath:@"Management Data.Monitors"];
    NSInteger monitorIndex = 0;
    if ([monitors count] > 1) {
        //search for main (or ask user to select)
    }
    NSDictionary *monitor = [monitors objectAtIndex:monitorIndex];
    NSDictionary *spaces = [desktopPLIST valueForKey:@"spaces"];
    NSString *currentSpaceUUID = [monitor valueForKeyPath:@"Current Space.uuid"];
    NSDictionary *currentSpace = [spaces valueForKey:currentSpaceUUID];
    NSURL *desktopPicturesDirectory = [NSURL fileURLWithPath:[currentSpace valueForKeyPath:@"default.ChangePath"] isDirectory:true];
    NSString *desktopPictureName = [currentSpace valueForKeyPath:@"default.LastName"];
    NSURL *desktopPictureURL = [NSURL URLWithString:desktopPictureName relativeToURL:desktopPicturesDirectory];
    [[NSWorkspace sharedWorkspace] selectFile:[desktopPictureURL path] inFileViewerRootedAtPath:@""];