How to implement a Cocoa-based Adobe Photoshop plugin

后端 未结 3 1426
暖寄归人
暖寄归人 2021-02-09 00:32

Cocoa used to work on CS3 with the trick of putting a Cocoa bundle inside the main Carbon plugin bundle, loading it from Carbon and issuing a NSApplicationLoad(). That\'s becaus

3条回答
  •  盖世英雄少女心
    2021-02-09 00:46

    You have to create a new Loadable Bundle target that contains your nibs and your Cocoa code. Add the bundle product to the Copy Bundle Resources phase of your plugin. Then the code for a filter plugin that loads a Cocoa window with some controls would be:

    Boolean DoUI (void) {
    
        // Create the CF Cocoa bundle
        CFBundleRef pluginBundle;
        CFURLRef cocoaBundleURL;
        pluginBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.example.plugin"));
        cocoaBundleURL = CFBundleCopyResourceURL(pluginBundle, 
                                                 CFSTR("Cocoa_bundle"), 
                                                 CFSTR("bundle"), 
                                                 NULL);
        CFBundleRef cocoaBundleRef;
        cocoaBundleRef = CFBundleCreate(kCFAllocatorDefault, cocoaBundleURL);
        CFRelease(cocoaBundleURL);
    
        // start Cocoa (for CS3)
        NSApplicationLoad(); 
    
        NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    
        // load the cocoa bundle by identifier
        NSBundle* cocoaBundle;
        cocoaBundle = [NSBundle bundleWithIdentifier:@"com.example.plugin.cocoa"];
    
        // load the window controller from the bundle
        Class testControllerClass;
        testControllerClass = [cocoaBundle classNamed:@"MyWindowController"];
    
        MyWindowController* winController = [[testControllerClass alloc] init];
        [NSApp runModalForWindow:[winController window]];
        [[winController window] performClose:nil];
        [winController release];
    
        // release the bundle
        CFRelease(cocoaBundleRef);
    
        [pool release];
    
        return 1;
    }
    

    This is based on the Craig Hockenberry bundle trick. I'm still testing it but it should work both on CS3 and CS4.

提交回复
热议问题