Juanjo Conti
Juanjo Conti

Reputation: 30013

Programmatically change screen saver settings

I'm trying to programmatically change the configured screen saver.

If I do

$ defaults -currentHost read com.apple.screensaver
{
    CleanExit = YES;
    PrefsVersion = 100;
    idleTime = 600;
    moduleDict =     {
        moduleName = XXXX;
        path = "/Users/juanjo/Library/Screen Savers/XXXX.saver";
        type = 0;
    };
    showClock = 0;
}

I can see that info or even update it using the write parameter.

This settings are not accesibles via NSUserDefaults but they are via CF.

I was able to do this by code

var moduleDict = CFPreferencesCopyAppValue("moduleDict", "com.apple.screensaver") as CFDictionary

but when I try to get one value from that "dict" the program crash in this line:

var saverName = CFDictionaryGetValue(moduleDict, "moduleName")

saying EXC_BAD_ACCESS (code=EXC_I386_GPFLT).

So, do you know how can I read this values and write back?

Upvotes: 1

Views: 922

Answers (1)

Juanjo Conti
Juanjo Conti

Reputation: 30013

As I mentioned in Cocoa-Dev list, I was able to do it this way.

Reading:

var moduleDict = CFPreferencesCopyAppValue("moduleDict", "com.apple.screensaver") as NSDictionary
var saverName = moduleDict["moduleName"] as String!

Writing:

var moduleDict = CFPreferencesCopyAppValue("moduleDict", "com.apple.screensaver") as NSDictionary
var mutable = moduleDict.mutableCopy() as NSMutableDictionary
mutable["moduleName"] = "MyScreenSaver"
mutable["path"] = mySaverPath
CFPreferencesSetValue("moduleDict", mutable as CFPropertyList, "com.apple.screensaver", kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
CFPreferencesAppSynchronize("com.apple.screensaver")

Upvotes: 3

Related Questions