FRScreenSaver 101

From AwkwardTV
Revision as of 07:57, 10 September 2007 by ThnEa7 (talk | contribs)
Jump to: navigation, search

katamail aeroporto di milano finale champions league nba hangtime mujeres espiadas radio casa newry and mourne online business cartella piquadro blue square home media center i o i o medusa salerno faust johannes dolce remi e morto bischero castellina e pasi amplificatore audio video primi mod per doom 3 chevrolet roma sport nautici materiali e attrezzature prodotti lavazza garmin gps 301 www bossfilm com video jerry rivera i calci di rigore cancionero general festa halloween batteria blc2 nokia carding gioco d avventura pc gratis storia europeo calcio mr intentional merlin u 530 caparezza fuori dal tunnell rsv 1000 chicas pechugonas salerno sinema alexanderson ernst frederik batteria benq pumas de la unam www donne perverse it computer usato milano neon john mayer gang bang gay neghelli floridia srl fratello sole sorella luna di ortolani monia midi gossip aldo montano lettore mp3 boghe vip quadro marrone 5 amigo backup videoregistratore s vhs adagio per archi d fossati real player red chili baia lorenzocrespi tempesta elettrica maracaibo colombo madame sousatzka officine daewoo www stranierinitalia it rapporto fuller base stoccolma cartoonnetworkla com nuove immagini da rainbow six 3 yesterday the beatles singoli ospitali coma dcme televisore 42 hocus pocus the disney movie com vf750f pentium 830 is it cos gioco gratis download gioco notebook offerta notebook vendita sony dscl1 ps2 memory card 32 mb datel belinea 20 pocketloox 420 cavo asus gps bullet time fight pasteles verdes scegli me download auto a genova sd 1 cuando volveras accordi napoli visita matrix cam revolutions auto noleggio innsbruck sony vaio fs315m creme antirughe samsonite briefcase programmi lotto hit mania estate 2004 musee calliano (asti) calcoli strutturali esempi sildenafil cheap flonase ericsson ringtones buy skelaxin cheap sibutramine buy albuterol airline tickets albuterol online cheap norvasc mono ringtones christian ringtones cheap tenuate synthroid soma cheap hydrocodone clonazepam online cheap cialis paxil online buy ephedra midi ringtones free kyocera ringtones online zovirax free punk ringtones cheap provigil free blackberry ringtones buy cyclobenzaprine cheap dianabol mtv ringtones free music ringtones wellbutrin online free motorola ringtones jungle ringtones cool ringtones buy diethylpropion downloadable ringtones phone ringtones zanaflex verizon ringtones cheap albuterol sony ringtones techno ringtones cheap valium buy metronidazole cheap adderall pharmacy online online lisinopril weird ringtones tmobile ringtones metal ringtones cheap ambien free mp3 ringtones free free ringtones buy darvocet order xanax cheap codeine cheap cephalexin cheap diazepam zoloft talking ringtones free alltel ringtones ativan cheap hoodia pharmacy online online buy flagyl free monophonic ringtones buy azithromycin buy xenical verizon ringtones cheap klonopin buy celexa cheap clomid cheap metformin cheap norco cheap rivotril cheap protonix fluoxetine online cheap glucophage cheap imitrex cheap zoloft klonopin latin ringtones cheap ringtones fioricet online cheap sildenafil buy valtrex norvasc online cheap vigrx cheap ortho sagem ringtones telus ringtones cheap protonix voice ringtones cheap darvon cheap sildenafil cheap zyban buy cialis tramadol sharp ringtones lortab online free pop ringtones Finally the screen saver problem has been solved too!

All the BackRow screen savers are basically generators for Quartz Composer compositions. These compositions can be very powerful, even driving things like RSS feeds. In fact, that's the example we'll use.

Most of the instructions to create a FRAppliance still apply—the bundles are very similar. I will go by the same steps as the FRAppliance tutorial, but only highlight the DIFFERENCES from those changes. Please review FRAppliance_101 to reference those steps.

Making the Project

First, you'll want a more useful name. Instead of "HelloWorld", let's call it "RSSVisualizerSaver". Create a new Cocoa Bundle project with this name.

Creating the Plugin

Open InfoPlist.strings (for English) and make sure CFBundleName accurately reflects your new screen saver name:

CFBundleName = "RSS Visualizer";

The Main Appliance Class

Our primary class will not be HelloWorldAppliance, rather use "RSSVisualizerSaver". That means you'll add an Objective-C class to your project caled RSSVisualizerSaver. Don't forget to check "Also create RSSVisualizerSaver.h" in Xcode.

Open RSSVisualizerSaver.h and change it so that your RSSVisualizerSaver class inherits from BRQCScreenSaver. Change "NSObject" in the line beginning with "@interface" to read "BRQCScreenSaver".

Make sure you import the BackRow framework.

You'll want to add the className class method to RSSVisualizerSaver.m—screen savers need to bypass their own whitelists too. However, we need to use an unused screen saver item, and the only one appears to be RUIRetailScreenSaver. Folks are working on subverting the whitelists, so stay tuned for that. You will also want to search for a different method in the exception backtrace: _validateBundleAtPath:. Here's the full code to place into RSSVisualizerSaver.m, instead of the one defined by the Appliance instructions.

// Override to allow FrontRow to load custom screen saver bundles
  (NSString *) className {
    // this function creates an NSString from the contents of the
    // struct objc_class, which means using this will not call this
    // function recursively, and it'll also return the *real* class
    // name.
    NSString * className = NSStringFromClass( self );
	// new method based on the BackRow NSException subclass, which conveniently provides us a backtrace
	// method!
	NSRange result = [[BRBacktracingException backtrace] rangeOfString:@"_validateBundleAtPath:"];
	if(result.location != NSNotFound) {
		NSLog(@" [%@ className] called for screen saver whitelist check, so I'm lying, m'kay?", className);
		className = @"RUIRetailScreenSaver";
	return className;

We need to copy our Quartz composition into our project, otherwise we'll be making an extremely boring screen saver. First, you'll want to copy a composition into your project. Copy this file from your Mac OS X system:

/System/Library/Screen\ Savers/RSS Visualizer.qtz

into your project folder. Then in Xcode, right-click on the "Resources" directory, select Add > Existing Files..., and select RSS Visualizer.qtz from your project folder. Make sure it is added to your target.

Back to the code. There is no equivalent to the applianceControllerWithScene method in a BRQCScreenSaver. The only thing need to do to run a QuartzComposer composition is override its initWithScene method and set the appropriate composition. We'll call the superclass' initWithScene: method to do all the dirty work, the only change we will make is to set a different composition.

- (id)initWithScene:(id)scene {
	NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];
	NSString *compositionPath = [thisBundle pathForResource:@"RSS Visualizer" ofType:@"qtz"];

	self = [super initWithScene:scene];
	[self setCompositionPath:compositionPath];
	return self;

Building the Plugin

Build Settings

Everything is the same, except:

  • make sure your Principal Class is set to RSSVisualizerSaver, not HelloWorldAppliance.
  • set the Wrapper Extension to frss, not frappliance.


Click Build. The compiled screen saver will appear in build/Debug/RSSVisualizerSaver.frss.

Running the Plugin

You'll want to copy your built copy to the correct folder. I recommend, as the Appliance tutorial author did, to mount the project from your development system so you can make a symlink to the correct location. Copy or symlink your built project to:

/System/Library/CoreServices/ Savers

Kill Finder, then navigate to Settings > Screen Savers. Select "RSS Visualizer", then click Preview to witness your great creation!


Start experimenting with some cool compositions for AppleTV—I think this will be a hugely popular hack, given I know the Apple TV community can come up with some really creative screen savers to show on their sexy widescreens. :)

I (just call me John Doe, I want no recognition for this) owe this entire hack to EricIII, the creator of the FRAppliance 101 tutorial. Quite simply, it would have been impossible without his work, especially since the Screen Saver project is largely a clone of the Appliance project.

Some pretty compositions can be found here: