Index: trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/classes.nib
===================================================================
--- trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/classes.nib	(revision 157)
+++ trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/classes.nib	(revision 157)
@@ -0,0 +1,12 @@
+{
+    IBClasses = (
+        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, 
+        {
+            ACTIONS = {turnUnitOff = id; turnUnitOn = id; }; 
+            CLASS = X10RemoteController; 
+            LANGUAGE = ObjC; 
+            SUPERCLASS = NSWindowController; 
+        }
+    ); 
+    IBVersion = 1; 
+}
Index: trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/info.nib
===================================================================
--- trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/info.nib	(revision 157)
+++ trunk/Cocoa/X10Remote/English.lproj/MainMenu.nib/info.nib	(revision 157)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IBDocumentLocation</key>
+	<string>113 42 356 240 0 0 1280 832 </string>
+	<key>IBEditorPositions</key>
+	<dict>
+		<key>29</key>
+		<string>94 283 318 44 0 0 1280 832 </string>
+	</dict>
+	<key>IBFramework Version</key>
+	<string>362.0</string>
+	<key>IBOpenObjects</key>
+	<array>
+		<integer>21</integer>
+		<integer>29</integer>
+	</array>
+	<key>IBSystem Version</key>
+	<string>7D24</string>
+</dict>
+</plist>
Index: trunk/Cocoa/X10Remote/Info.plist
===================================================================
--- trunk/Cocoa/X10Remote/Info.plist	(revision 157)
+++ trunk/Cocoa/X10Remote/Info.plist	(revision 157)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>X10Remote</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>net.sabi.X10Remote</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleSignature</key>
+	<string>X10R</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>NSMainNibFile</key>
+	<string>MainMenu</string>
+	<key>NSPrincipalClass</key>
+	<string>NSApplication</string>
+        <key>LSUIElement</key>
+        <string>1</string>
+</dict>
+</plist>
Index: trunk/Cocoa/X10Remote/NJRHotKey.h
===================================================================
--- trunk/Cocoa/X10Remote/NJRHotKey.h	(revision 157)
+++ trunk/Cocoa/X10Remote/NJRHotKey.h	(revision 157)
@@ -0,0 +1,30 @@
+//
+//  NJRHotKey.h
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Apr 01 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface NJRHotKey : NSObject {
+    NSString *hotKeyCharacters;
+    unsigned hotKeyModifierFlags;
+    unsigned short hotKeyCode;
+}
+
++ (NJRHotKey *)hotKeyWithCharacters:(NSString *)characters modifierFlags:(unsigned)modifierFlags keyCode:(unsigned short)keyCode;
+
+- (id)initWithCharacters:(NSString *)characters modifierFlags:(unsigned)modifierFlags keyCode:(unsigned short)keyCode;
+
+- (NSString *)characters;
+- (unsigned)modifierFlags; // Cocoa
+- (long)modifiers; // Carbon
+- (unsigned short)keyCode;
+
+- (NSDictionary *)propertyListRepresentation;
+- (id)initWithPropertyList:(NSDictionary *)dict;
+
+@end
Index: trunk/Cocoa/X10Remote/NJRHotKey.m
===================================================================
--- trunk/Cocoa/X10Remote/NJRHotKey.m	(revision 157)
+++ trunk/Cocoa/X10Remote/NJRHotKey.m	(revision 157)
@@ -0,0 +1,107 @@
+//
+//  NJRHotKey.m
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Apr 01 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import "NJRHotKey.h"
+
+#include <Carbon/Carbon.h>
+
+// property list keys
+static NSString * const PLCharacters = @"characters"; // NSString
+static NSString * const PLModifierFlags = @"modifierFlags"; // NSNumber
+static NSString * const PLKeyCode = @"keyCode"; // NSNumber
+
+@implementation NJRHotKey
+
+#pragma mark initialize-release
+
++ (NJRHotKey *)hotKeyWithCharacters:(NSString *)characters modifierFlags:(unsigned)modifierFlags keyCode:(unsigned short)keyCode;
+{
+    return [[[self alloc] initWithCharacters: characters modifierFlags: modifierFlags keyCode: keyCode] autorelease];
+}
+
+- (id)initWithCharacters:(NSString *)characters modifierFlags:(unsigned)modifierFlags keyCode:(unsigned short)keyCode;
+{
+    if ( (self = [self init]) != nil) {
+        hotKeyCharacters = [characters retain];
+        hotKeyModifierFlags = modifierFlags;
+        hotKeyCode = keyCode;
+    }
+    return self;
+}
+
+- (void)dealloc;
+{
+    [hotKeyCharacters release];
+}
+
+#pragma mark accessing
+
+- (NSString *)characters;
+{
+    return hotKeyCharacters;
+}
+
+- (unsigned)modifierFlags;
+{
+    return hotKeyModifierFlags;
+}
+
+- (long)modifiers;
+{
+    static long modifierMap[5][2] = {
+       { NSCommandKeyMask, cmdKey },
+       { NSAlternateKeyMask, optionKey },
+       { NSControlKeyMask, controlKey },
+       { NSShiftKeyMask, shiftKey },
+       { 0, 0 }
+    };
+
+    long modifiers = 0;
+    int i;
+
+    for (i = 0 ; modifierMap[i][0] != 0 ; i++)
+        if (hotKeyModifierFlags & modifierMap[i][0])
+            modifiers |= modifierMap[i][1];
+
+    return modifiers;
+}
+
+- (unsigned short)keyCode;
+{
+    return hotKeyCode;
+}
+
+#pragma mark property list serialization (Pester 1.1)
+
+- (NSDictionary *)propertyListRepresentation;
+{
+    return [NSDictionary dictionaryWithObjectsAndKeys:
+        hotKeyCharacters, PLCharacters,
+        [NSNumber numberWithUnsignedInt: hotKeyModifierFlags], PLModifierFlags,
+        [NSNumber numberWithUnsignedShort: hotKeyCode], PLKeyCode,
+        nil];
+}
+
+- (id)initWithPropertyList:(NSDictionary *)dict;
+{
+    if ( (self = [self init]) != nil) {
+        NS_DURING
+            hotKeyCharacters = [[dict objectForKey: PLCharacters] retain];
+            hotKeyModifierFlags = [[dict objectForKey: PLModifierFlags] unsignedIntValue];
+            hotKeyCode = [[dict objectForKey: PLKeyCode] unsignedShortValue];
+        NS_HANDLER
+        NS_ENDHANDLER
+        if (hotKeyCharacters == nil || hotKeyCode == 0) {
+            [self release];
+            self = nil;
+        }
+    }
+    return self;
+}
+
+@end
Index: trunk/Cocoa/X10Remote/NJRHotKeyManager.h
===================================================================
--- trunk/Cocoa/X10Remote/NJRHotKeyManager.h	(revision 157)
+++ trunk/Cocoa/X10Remote/NJRHotKeyManager.h	(revision 157)
@@ -0,0 +1,30 @@
+//
+//  NJRHotKeyManager.h
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Apr 01 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@class NJRHotKey;
+
+@interface NJRHotKeyManager : NSObject {
+    BOOL shortcutsEnabled;
+    NSMutableDictionary *shortcuts;
+}
+
++ (NJRHotKeyManager *)sharedManager;
+
+- (BOOL)addShortcutWithIdentifier:(NSString *)identifier hotKey:(NJRHotKey *)hotKey target:(id)target action:(SEL)action;
+- (void)removeShortcutWithIdentifier:(NSString *)identifier;
+
+- (NSArray *)shortcutIdentifiers;
+- (NJRHotKey *)hotKeyForShortcutWithIdentifier:(NSString *)identifier;
+
+- (void)setShortcutsEnabled:(BOOL)enabled;
+- (BOOL)shortcutsEnabled;
+
+
+@end
Index: trunk/Cocoa/X10Remote/NJRHotKeyManager.m
===================================================================
--- trunk/Cocoa/X10Remote/NJRHotKeyManager.m	(revision 157)
+++ trunk/Cocoa/X10Remote/NJRHotKeyManager.m	(revision 157)
@@ -0,0 +1,260 @@
+//
+//  NJRHotKeyManager.m
+//  Pester
+//
+//  Created by Nicholas Riley on Tue Apr 01 2003.
+//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
+//
+
+// based on HotKeyCenter, by Quentin Carnicelli
+// renamed, reorganized, cleaned up, pre-10.2 support removed
+
+#import "NJRHotKeyManager.h"
+#import "NJRHotKey.h"
+#import <Carbon/Carbon.h>
+
+const OSType kHotKeyManagerSignature = 'NHKM';
+
+@interface _NJRHotKeyShortcut : NSObject {
+    @public
+    BOOL isRegistered;
+    EventHotKeyRef hotKeyRef;
+    NJRHotKey *hotKey;
+    id target;
+    SEL action;
+}
+@end
+
+@implementation _NJRHotKeyShortcut
+
+- (void)dealloc;
+{
+    [hotKey release];
+    [target release];
+}
+
+@end
+
+pascal OSErr keyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void *refCon);
+
+@interface NJRHotKeyManager (Private)
+- (OSStatus)_handleHotKeyEvent:(EventRef)inEvent;
+- (BOOL)_registerHotKeyIfNeeded:(_NJRHotKeyShortcut *)shortcut;
+- (void)_unregisterHotKeyIfNeeded:(_NJRHotKeyShortcut *)shortcut;
+- (void)_hotKeyDown:(_NJRHotKeyShortcut *)hotKey;
+- (void)_hotKeyUp:(_NJRHotKeyShortcut *)hotKey;
+- (void)_hotKeyDownWithRef:(EventHotKeyRef)ref;
+- (void)_hotKeyUpWithRef:(EventHotKeyRef)ref;
+- (_NJRHotKeyShortcut *)_findShortcutWithRef:(EventHotKeyRef)ref;
+@end
+
+@implementation NJRHotKeyManager
+
++ (NJRHotKeyManager *)sharedManager;
+{
+    static NJRHotKeyManager *manager = nil;
+
+    if (manager == nil) {
+        manager = [[self alloc] init];
+
+        EventTypeSpec eventSpec[2] = {
+           { kEventClassKeyboard, kEventHotKeyPressed },
+           { kEventClassKeyboard, kEventHotKeyReleased }
+        };
+
+        InstallEventHandler(GetEventDispatcherTarget(),
+                            NewEventHandlerUPP((EventHandlerProcPtr) keyEventHandler),
+                            2, eventSpec, nil, nil);
+    }
+    return manager;
+}
+
+- (id)init;
+{
+    if ( (self = [super init]) != nil) {
+        shortcutsEnabled = YES;
+        shortcuts = [[NSMutableDictionary alloc] init];
+    }
+
+    return self;
+}
+
+- (void)dealloc;
+{
+    [shortcuts release];
+    [super dealloc];
+}
+
+#pragma mark -
+
+- (BOOL)addShortcutWithIdentifier:(NSString *)identifier hotKey:(NJRHotKey *)hotKey target:(id)target action:(SEL)action;
+{
+    NSParameterAssert(identifier != nil);
+    NSParameterAssert(hotKey != nil);
+    NSParameterAssert(target != nil);
+    NSParameterAssert(action != nil);
+
+    if ([shortcuts objectForKey: identifier] != nil)
+        [self removeShortcutWithIdentifier: identifier];
+
+    _NJRHotKeyShortcut *newShortcut = [[_NJRHotKeyShortcut alloc] init];
+    newShortcut->isRegistered = NO;
+    newShortcut->hotKeyRef = nil;
+    newShortcut->hotKey = [hotKey retain];
+    newShortcut->target = [target retain];
+    newShortcut->action = action;
+
+    [shortcuts setObject: newShortcut forKey: identifier];
+    [newShortcut release];
+    
+    return [self _registerHotKeyIfNeeded: newShortcut];
+}
+
+- (void)removeShortcutWithIdentifier:(NSString *)identifier;
+{
+    _NJRHotKeyShortcut *hotKey = [shortcuts objectForKey: identifier];
+
+    if (hotKey == nil) return;
+    [self _unregisterHotKeyIfNeeded: hotKey];
+    [shortcuts removeObjectForKey: identifier];
+}
+
+- (NSArray *)shortcutIdentifiers;
+{
+    return [shortcuts allKeys];
+}
+
+- (NJRHotKey *)hotKeyForShortcutWithIdentifier:(NSString *)identifier;
+{
+    _NJRHotKeyShortcut *hotKey = [shortcuts objectForKey: identifier];
+
+    return (hotKey == nil ? nil : [[hotKey->hotKey retain] autorelease]);
+}
+
+- (void)setShortcutsEnabled:(BOOL)enabled;
+{
+    NSEnumerator *enumerator = [shortcuts objectEnumerator];
+    _NJRHotKeyShortcut *hotKey;
+
+    while ( (hotKey = [enumerator nextObject]) != nil) {
+        if (enabled)
+            [self _registerHotKeyIfNeeded: hotKey];
+        else
+            [self _unregisterHotKeyIfNeeded: hotKey];
+    }
+    shortcutsEnabled = enabled;
+}
+
+- (BOOL)shortcutsEnabled;
+{
+    return shortcutsEnabled;
+}
+
+#pragma mark -
+
+- (OSStatus)_handleHotKeyEvent:(EventRef)inEvent;
+{
+    OSStatus err;
+    EventHotKeyID hotKeyID;
+    _NJRHotKeyShortcut *shortcut;
+
+    NSAssert(GetEventClass(inEvent) == kEventClassKeyboard, @"Unhandled event class");
+
+    if ( (err = GetEventParameter(inEvent, kEventParamDirectObject, typeEventHotKeyID, nil,
+                                  sizeof(EventHotKeyID), nil, &hotKeyID)) != noErr)
+        return err;
+
+    NSAssert(hotKeyID.signature == kHotKeyManagerSignature, @"Unknown hot key");
+
+    shortcut = (_NJRHotKeyShortcut *)hotKeyID.id;
+    NSAssert(shortcut != nil, @"Got bad hot key");
+
+    switch (GetEventKind(inEvent)) {
+        case kEventHotKeyPressed:
+            [self _hotKeyDown: shortcut];
+            break;
+        case kEventHotKeyReleased:
+            [self _hotKeyUp: shortcut];
+            break;
+        default:
+            break;
+    }
+
+    return noErr;
+}
+
+#pragma mark -
+
+- (BOOL)_registerHotKeyIfNeeded:(_NJRHotKeyShortcut *)shortcut;
+{
+    NJRHotKey *hotKey;
+
+    NSParameterAssert(shortcut != nil);
+
+    hotKey = shortcut->hotKey;
+
+    if (shortcutsEnabled && !(shortcut->isRegistered)) {
+        EventHotKeyID keyID;
+        OSStatus err;
+
+        keyID.signature = kHotKeyManagerSignature;
+        keyID.id = (unsigned long)shortcut;
+        if ( (err = RegisterEventHotKey([hotKey keyCode], [hotKey modifiers], keyID, GetEventDispatcherTarget(), 0, &shortcut->hotKeyRef)) != noErr)
+            return NO;
+
+        shortcut->isRegistered = YES;
+    }
+
+    return YES;
+}
+
+- (void)_unregisterHotKeyIfNeeded:(_NJRHotKeyShortcut *)shortcut;
+{
+    NSParameterAssert(shortcut != nil);
+ 
+    if (shortcut->isRegistered && shortcut->hotKeyRef != nil)
+        UnregisterEventHotKey(shortcut->hotKeyRef);
+}
+
+- (void)_hotKeyDown:(_NJRHotKeyShortcut *)hotKey;
+{
+    id target = hotKey->target;
+    SEL action = hotKey->action;
+
+    [target performSelector: action withObject: self];
+}
+
+- (void)_hotKeyUp:(_NJRHotKeyShortcut *)hotKey;
+{
+}
+
+- (void)_hotKeyDownWithRef:(EventHotKeyRef)ref;
+{
+    _NJRHotKeyShortcut *hotKey = [self _findShortcutWithRef: ref];
+
+    if (hotKey != nil)
+        [self _hotKeyDown: hotKey];
+}
+
+- (void)_hotKeyUpWithRef:(EventHotKeyRef)ref;
+{
+}
+
+- (_NJRHotKeyShortcut *)_findShortcutWithRef:(EventHotKeyRef)ref;
+{
+    NSEnumerator *enumerator = [shortcuts objectEnumerator];
+    _NJRHotKeyShortcut *hotKey;
+
+    while ( (hotKey = [enumerator nextObject]) != nil) {
+        if (hotKey->hotKeyRef == ref)
+            return hotKey;
+    }
+    return nil;
+}
+
+@end
+
+pascal OSErr keyEventHandler(EventHandlerCallRef inHandlerRef, EventRef inEvent, void *refCon)
+{
+    return [[NJRHotKeyManager sharedManager] _handleHotKeyEvent: inEvent];
+}
Index: trunk/Cocoa/X10Remote/X10Remote.xcode/nicholas.pbxuser
===================================================================
--- trunk/Cocoa/X10Remote/X10Remote.xcode/nicholas.pbxuser	(revision 157)
+++ trunk/Cocoa/X10Remote/X10Remote.xcode/nicholas.pbxuser	(revision 157)
@@ -0,0 +1,736 @@
+// !$*UTF8*$!
+{
+	29B97313FDCFA39411CA2CEA = {
+		activeBuildStyle = 4A9504CDFFE6A4B311CA0CBA;
+		activeExecutable = E1D5A6A805C1141200134A5D;
+		activeTarget = 8D1107260486CEB800E47090;
+		addToTargets = (
+			8D1107260486CEB800E47090,
+		);
+		breakpoints = (
+		);
+		codeSenseManager = E1D5A6B405C1141700134A5D;
+		executables = (
+			E1D5A6A805C1141200134A5D,
+		);
+		perUserDictionary = {
+			PBXConfiguration.PBXFileTableDataSource3.PBXErrorsWarningsDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXErrorsWarningsDataSource_LocationID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					45.87988,
+					45.2085,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXErrorsWarningsDataSource_TypeID,
+					PBXErrorsWarningsDataSource_MessageID,
+					PBXErrorsWarningsDataSource_LocationID,
+				);
+			};
+			PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					10,
+					20,
+					10,
+					43,
+					43,
+					20,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+					PBXFileDataSource_Target_ColumnID,
+				);
+			};
+			PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+				PBXFileTableDataSourceColumnWidthsKey = (
+					20,
+					10,
+					10,
+					20,
+					10,
+					43,
+					43,
+				);
+				PBXFileTableDataSourceColumnsKey = (
+					PBXFileDataSource_FiletypeID,
+					PBXFileDataSource_Filename_ColumnID,
+					PBXTargetDataSource_PrimaryAttribute,
+					PBXFileDataSource_Built_ColumnID,
+					PBXFileDataSource_ObjectSize_ColumnID,
+					PBXFileDataSource_Errors_ColumnID,
+					PBXFileDataSource_Warnings_ColumnID,
+				);
+			};
+			PBXPerProjectTemplateStateSaveDate = 101430537;
+			PBXPrepackagedSmartGroups_v2 = (
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					activationKey = OldTargetSmartGroup;
+					clz = PBXTargetSmartGroup;
+					description = "Displays all targets of the project.";
+					globalID = 1C37FABC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXTargetSmartGroup2;
+					description = "Displays all targets of the project as well as nested build phases.";
+					globalID = 1C37FBAC04509CD000000102;
+					name = Targets;
+					preferences = {
+						image = Targets;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXExecutablesSmartGroup;
+					description = "Displays all executables of the project.";
+					globalID = 1C37FAAC04509CD000000102;
+					name = Executables;
+					preferences = {
+						image = Executable;
+					};
+				},
+				{
+					" PBXTransientLocationAtTop " = bottom;
+					absolutePathToBundle = "";
+					clz = PBXErrorsWarningsSmartGroup;
+					description = "Displays files with errors or warnings.";
+					globalID = 1C08E77C0454961000C914BD;
+					name = "Errors and Warnings";
+					preferences = {
+						fnmatch = "";
+						image = WarningsErrors;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = 1CC0EA4004350EF90044410B;
+					name = "Implementation Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "This group displays Interface Builder NIB Files.";
+					globalID = 1CC0EA4004350EF90041110B;
+					name = "NIB Files";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXFindSmartGroup;
+					description = "Displays Find Results.";
+					globalID = 1C37FABC05509CD000000102;
+					name = "Find Results";
+					preferences = {
+						image = spyglass;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = no;
+					absolutePathToBundle = "";
+					clz = PBXBookmarksSmartGroup;
+					description = "Displays Project Bookmarks.";
+					globalID = 1C37FABC05539CD112110102;
+					name = Bookmarks;
+					preferences = {
+						image = Bookmarks;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = XCSCMSmartGroup;
+					description = "Displays files with interesting SCM status.";
+					globalID = E2644B35053B69B200211256;
+					name = SCM;
+					preferences = {
+						image = PBXRepository;
+						isLeaf = 0;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXSymbolsSmartGroup;
+					description = "Displays all symbols for the project.";
+					globalID = 1C37FABC04509CD000100104;
+					name = "Project Symbols";
+					preferences = {
+						image = ProjectSymbols;
+						isLeaf = 1;
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Filter SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "*.nib";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "";
+						root = "<PROJECT>";
+					};
+				},
+				{
+					PBXTransientLocationAtTop = bottom;
+					absolutePathToBundle = "";
+					clz = PBXFilenameSmartGroup;
+					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
+					globalID = PBXTemplateMarker;
+					name = "Simple Regular Expression SmartGroup";
+					preferences = {
+						canSave = 1;
+						fnmatch = "";
+						image = SmartFolder;
+						isLeaf = 0;
+						recursive = 1;
+						regex = "?*\\.[mcMC]";
+						root = "<PROJECT>";
+					};
+				},
+			);
+			PBXWorkspaceContents = (
+				{
+					PBXProjectWorkspaceModule_StateKey_Rev39 = {
+						PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+							BoundsStr = "{{0, 0}, {194, 547}}";
+							Rows = (
+							);
+							VisibleRectStr = "{{0, 0}, {2, 547}}";
+						};
+						PBXProjectWorkspaceModule_EditorOpen = false;
+						PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+							PBXSplitModuleInNavigatorKey = {
+								Split0 = {
+									history = (
+										E16A73C105C24DAD009B66A0,
+										E16A73C205C24DAD009B66A0,
+										E16A73C305C24DAD009B66A0,
+										E16A73C405C24DAD009B66A0,
+										E16A73E205C252A0009B66A0,
+										E16A73E305C252A0009B66A0,
+										E16A73E405C252A0009B66A0,
+									);
+									prevStack = (
+										E16A73C605C24DAD009B66A0,
+										E16A73E505C252A0009B66A0,
+										E16A744C05C25607009B66A0,
+									);
+								};
+								SplitCount = 1;
+							};
+						};
+						PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+							PBXProjectWorkspaceModule_SGTM_Geometry = {
+								_collapsingFrameDimension = 506;
+								_indexOfCollapsedView = 1;
+								_percentageOfCollapsedView = 0.7280576;
+								isCollapsed = yes;
+								sizes = (
+									"{{0, 0}, {199, 543}}",
+								);
+							};
+						};
+						PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {17, 564}}";
+						PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {750, 480}}";
+						PBXProjectWorkspaceModule_OldSuperviewFrame = "{{182, 0}, {17, 564}}";
+						PBXProjectWorkspaceModule_SGTM = {
+							PBXBottomSmartGroupGIDs = (
+								1C37FBAC04509CD000000102,
+								1C37FAAC04509CD000000102,
+								1C08E77C0454961000C914BD,
+								1CC0EA4004350EF90044410B,
+								1CC0EA4004350EF90041110B,
+								1C37FABC05509CD000000102,
+								1C37FABC05539CD112110102,
+								E2644B35053B69B200211256,
+								1C37FABC04509CD000100104,
+							);
+							PBXSmartGroupTreeModuleColumnData = {
+								PBXSmartGroupTreeModuleColumnWidthsKey = (
+									182,
+								);
+								PBXSmartGroupTreeModuleColumnsKey_v4 = (
+									MainColumn,
+								);
+							};
+							PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+								PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+									29B97314FDCFA39411CA2CEA,
+									080E96DDFE201D6D7F000001,
+									29B97317FDCFA39411CA2CEA,
+									29B97323FDCFA39411CA2CEA,
+									1C37FBAC04509CD000000102,
+								);
+								PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+									(
+										3,
+										1,
+										0,
+									),
+								);
+								PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {182, 525}}";
+							};
+							PBXTopSmartGroupGIDs = (
+							);
+						};
+					};
+				},
+			);
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				PBXSplitModuleInNavigatorKey = {
+					SplitCount = 1;
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				PBXProjectWorkspaceModule_StateKey_Rev39 = {
+					PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
+						BoundsStr = "{{0, 0}, {194, 547}}";
+						Rows = (
+						);
+						VisibleRectStr = "{{0, 0}, {2, 547}}";
+					};
+					PBXProjectWorkspaceModule_EditorOpen = false;
+					PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
+						PBXSplitModuleInNavigatorKey = {
+							Split0 = {
+								history = (
+									E16A73C105C24DAD009B66A0,
+									E16A73C205C24DAD009B66A0,
+									E16A73C305C24DAD009B66A0,
+									E16A73C405C24DAD009B66A0,
+									E16A73E205C252A0009B66A0,
+									E16A73E305C252A0009B66A0,
+									E16A73E405C252A0009B66A0,
+								);
+								prevStack = (
+									E16A73C605C24DAD009B66A0,
+									E16A73E505C252A0009B66A0,
+									E16A744C05C25607009B66A0,
+								);
+							};
+							SplitCount = 1;
+						};
+					};
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+						PBXProjectWorkspaceModule_SGTM_Geometry = {
+							_collapsingFrameDimension = 506;
+							_indexOfCollapsedView = 1;
+							_percentageOfCollapsedView = 0.7280576;
+							isCollapsed = yes;
+							sizes = (
+								"{{0, 0}, {199, 543}}",
+							);
+						};
+					};
+					PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {17, 564}}";
+					PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {750, 480}}";
+					PBXProjectWorkspaceModule_OldSuperviewFrame = "{{182, 0}, {17, 564}}";
+					PBXProjectWorkspaceModule_SGTM = {
+						PBXBottomSmartGroupGIDs = (
+							1C37FBAC04509CD000000102,
+							1C37FAAC04509CD000000102,
+							1C08E77C0454961000C914BD,
+							1CC0EA4004350EF90044410B,
+							1CC0EA4004350EF90041110B,
+							1C37FABC05509CD000000102,
+							1C37FABC05539CD112110102,
+							E2644B35053B69B200211256,
+							1C37FABC04509CD000100104,
+						);
+						PBXSmartGroupTreeModuleColumnData = {
+							PBXSmartGroupTreeModuleColumnWidthsKey = (
+								182,
+							);
+							PBXSmartGroupTreeModuleColumnsKey_v4 = (
+								MainColumn,
+							);
+						};
+						PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
+							PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
+								29B97314FDCFA39411CA2CEA,
+								080E96DDFE201D6D7F000001,
+								29B97317FDCFA39411CA2CEA,
+								29B97323FDCFA39411CA2CEA,
+								1C37FBAC04509CD000000102,
+							);
+							PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
+								(
+									13,
+									11,
+									0,
+								),
+							);
+							PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {182, 525}}";
+						};
+						PBXTopSmartGroupGIDs = (
+						);
+					};
+				};
+			};
+			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+				LauncherConfigVersion = 3;
+				Runner = {
+					HorizontalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {366, 167}}",
+							"{{0, 176}, {366, 267}}",
+						);
+					};
+					VerticalSplitView = {
+						_collapsingFrameDimension = 0;
+						_indexOfCollapsedView = 0;
+						_percentageOfCollapsedView = 0;
+						isCollapsed = yes;
+						sizes = (
+							"{{0, 0}, {405, 443}}",
+							"{{414, 0}, {514, 443}}",
+						);
+					};
+				};
+			};
+			PBXWorkspaceGeometries = (
+				{
+					Frame = "{{0, 0}, {199, 543}}";
+					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+					};
+					RubberWindowFrame = "9 243 199 585 0 0 1280 832 ";
+				},
+			);
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
+				Frame = "{{0, 0}, {434, 219}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "737 95 434 240 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
+				Frame = "{{0, 0}, {400, 201}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "50 804 400 222 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
+				Frame = "{{0, 0}, {750, 481}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "745 77 750 502 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectFindModule" = {
+				Frame = "{{0, 0}, {614, 316}}";
+				RubberWindowFrame = "333 390 614 358 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
+				Frame = "{{0, 0}, {199, 543}}";
+				PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
+				};
+				RubberWindowFrame = "9 243 199 585 0 0 1280 832 ";
+			};
+			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
+				Frame = "{{0, 0}, {745, 443}}";
+				PBXModuleWindowStatusBarHidden = YES;
+				RubberWindowFrame = "267 337 745 464 0 0 1280 832 ";
+			};
+			PBXWorkspaceStateSaveDate = 101430537;
+		};
+		perUserProjectItems = {
+			E16A73C105C24DAD009B66A0 = E16A73C105C24DAD009B66A0;
+			E16A73C205C24DAD009B66A0 = E16A73C205C24DAD009B66A0;
+			E16A73C305C24DAD009B66A0 = E16A73C305C24DAD009B66A0;
+			E16A73C405C24DAD009B66A0 = E16A73C405C24DAD009B66A0;
+			E16A73C605C24DAD009B66A0 = E16A73C605C24DAD009B66A0;
+			E16A73E205C252A0009B66A0 = E16A73E205C252A0009B66A0;
+			E16A73E305C252A0009B66A0 = E16A73E305C252A0009B66A0;
+			E16A73E405C252A0009B66A0 = E16A73E405C252A0009B66A0;
+			E16A73E505C252A0009B66A0 = E16A73E505C252A0009B66A0;
+			E16A744C05C25607009B66A0 = E16A744C05C25607009B66A0;
+		};
+		sourceControlManager = E1D5A6B305C1141700134A5D;
+		userBuildSettings = {
+		};
+	};
+	8D1107260486CEB800E47090 = {
+		activeExec = 0;
+		executables = (
+			E1D5A6A805C1141200134A5D,
+		);
+	};
+	8D1107310486CEB800E47090 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {465, 525}}";
+			sepNavSelRange = "{287, 0}";
+			sepNavVisRect = "{{0, 0}, {465, 525}}";
+		};
+	};
+	E15D1C7505D5BE2C0086A074 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 443}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 443}}";
+			sepNavWindowFrame = "{{291, 176}, {750, 502}}";
+		};
+	};
+	E15D1C7705D5BE330086A074 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {559, 1391}}";
+			sepNavSelRange = "{333, 0}";
+			sepNavVisRect = "{{0, 108}, {559, 156}}";
+			sepNavWindowFrame = "{{284, 249}, {750, 502}}";
+		};
+	};
+	E16A73B805C24655009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {755, 660}}";
+			sepNavSelRange = "{379, 0}";
+			sepNavVisRect = "{{0, 0}, {755, 660}}";
+			sepNavWindowFrame = "{{199, 157}, {750, 502}}";
+		};
+	};
+	E16A73B905C24655009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {733, 971}}";
+			sepNavSelRange = "{2498, 0}";
+			sepNavVisRect = "{{0, 0}, {733, 464}}";
+			sepNavWindowFrame = "{{745, 77}, {750, 502}}";
+		};
+	};
+	E16A73C105C24DAD009B66A0 = {
+		fRef = 29B97319FDCFA39411CA2CEA;
+		isa = PBXBookmark;
+	};
+	E16A73C205C24DAD009B66A0 = {
+		fRef = E16A73CD05C24DCC009B66A0;
+		isa = PBXTextBookmark;
+		name = launch;
+		rLen = 6;
+		rLoc = 1228;
+		rType = 0;
+		vrLen = 342;
+		vrLoc = 1432;
+	};
+	E16A73C305C24DAD009B66A0 = {
+		fRef = E16A73B805C24655009B66A0;
+		isa = PBXTextBookmark;
+		name = NSTask;
+		rLen = 6;
+		rLoc = 249;
+		rType = 0;
+		vrLen = 361;
+		vrLoc = 29;
+	};
+	E16A73C405C24DAD009B66A0 = {
+		fRef = E16A73CC05C24DCC009B66A0;
+		isa = PBXTextBookmark;
+		name = "(null): 19";
+		rLen = 0;
+		rLoc = 385;
+		rType = 0;
+		vrLen = 446;
+		vrLoc = 176;
+	};
+	E16A73C605C24DAD009B66A0 = {
+		fRef = 29B97319FDCFA39411CA2CEA;
+		isa = PBXBookmark;
+	};
+	E16A73CC05C24DCC009B66A0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSFileHandle.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSFileHandle.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16A73CD05C24DCC009B66A0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSTask.h;
+		path = /System/Library/Frameworks/Foundation.framework/Versions/C/Headers/NSTask.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16A73DA05C25272009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 464}}";
+			sepNavSelRange = "{0, 788}";
+			sepNavVisRect = "{{0, 0}, {709, 464}}";
+			sepNavWindowFrame = "{{130, 220}, {750, 502}}";
+		};
+	};
+	E16A73DB05C25272009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 1331}}";
+			sepNavSelRange = "{404, 0}";
+			sepNavVisRect = "{{0, 719}, {709, 464}}";
+			sepNavWindowFrame = "{{38, 304}, {750, 502}}";
+		};
+	};
+	E16A73DE05C2527F009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 3144}}";
+			sepNavSelRange = "{0, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 443}}";
+			sepNavWindowFrame = "{{84, 262}, {750, 502}}";
+		};
+	};
+	E16A73DF05C2527F009B66A0 = {
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {709, 464}}";
+			sepNavSelRange = "{273, 0}";
+			sepNavVisRect = "{{0, 0}, {709, 464}}";
+			sepNavWindowFrame = "{{309, 2}, {750, 502}}";
+		};
+	};
+	E16A73E205C252A0009B66A0 = {
+		fRef = E16A73F305C252B1009B66A0;
+		isa = PBXTextBookmark;
+		name = HidesOnDeactivate;
+		rLen = 17;
+		rLoc = 9951;
+		rType = 0;
+		vrLen = 749;
+		vrLoc = 9546;
+	};
+	E16A73E305C252A0009B66A0 = {
+		fRef = E16A73B905C24655009B66A0;
+		isa = PBXTextBookmark;
+		name = "X10RemoteController.m: _sendToRemote:";
+		rLen = 0;
+		rLoc = 2639;
+		rType = 0;
+		vrLen = 577;
+		vrLoc = 859;
+	};
+	E16A73E405C252A0009B66A0 = {
+		fRef = 8D1107310486CEB800E47090;
+		isa = PBXTextBookmark;
+		name = "Info.plist: 17";
+		rLen = 0;
+		rLoc = 563;
+		rType = 0;
+		vrLen = 657;
+		vrLoc = 173;
+	};
+	E16A73E505C252A0009B66A0 = {
+		fRef = E16A73B905C24655009B66A0;
+		isa = PBXTextBookmark;
+		name = "X10RemoteController.m: _sendToRemote:";
+		rLen = 0;
+		rLoc = 2639;
+		rType = 0;
+		vrLen = 577;
+		vrLoc = 859;
+	};
+	E16A73F305C252B1009B66A0 = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = NSWindow.h;
+		path = /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSWindow.h;
+		refType = 0;
+		sourceTree = "<absolute>";
+	};
+	E16A744C05C25607009B66A0 = {
+		fRef = 8D1107310486CEB800E47090;
+		isa = PBXTextBookmark;
+		name = "Info.plist: 8";
+		rLen = 0;
+		rLoc = 287;
+		rType = 0;
+		vrLen = 668;
+		vrLoc = 0;
+	};
+	E1D5A6A805C1141200134A5D = {
+		activeArgIndex = 2147483647;
+		activeArgIndices = (
+		);
+		argumentStrings = (
+		);
+		configStateDict = {
+		};
+		debuggerPlugin = GDBDebugging;
+		dylibVariantSuffix = "";
+		enableDebugStr = 1;
+		environmentEntries = (
+		);
+		isa = PBXExecutable;
+		name = X10Remote;
+		shlibInfoDictList = (
+		);
+		sourceDirectories = (
+		);
+	};
+	E1D5A6B305C1141700134A5D = {
+		isa = PBXSourceControlManager;
+		scmConfiguration = {
+		};
+		scmType = scm.cvs;
+	};
+	E1D5A6B405C1141700134A5D = {
+		indexTemplatePath = "";
+		isa = PBXCodeSenseManager;
+		usesDefaults = 1;
+		wantsCodeCompletion = 1;
+		wantsCodeCompletionAutoPopup = 1;
+		wantsCodeCompletionAutoSuggestions = 1;
+		wantsCodeCompletionCaseSensitivity = 1;
+		wantsCodeCompletionOnlyMatchingItems = 1;
+		wantsCodeCompletionParametersIncluded = 1;
+		wantsCodeCompletionPlaceholdersInserted = 1;
+		wantsCodeCompletionTabCompletes = 1;
+		wantsIndex = 1;
+	};
+}
Index: trunk/Cocoa/X10Remote/X10Remote.xcode/project.pbxproj
===================================================================
--- trunk/Cocoa/X10Remote/X10Remote.xcode/project.pbxproj	(revision 157)
+++ trunk/Cocoa/X10Remote/X10Remote.xcode/project.pbxproj	(revision 157)
@@ -0,0 +1,524 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 39;
+	objects = {
+		080E96DDFE201D6D7F000001 = {
+			children = (
+				E16A73B805C24655009B66A0,
+				E16A73B905C24655009B66A0,
+				E16A73DA05C25272009B66A0,
+				E16A73DB05C25272009B66A0,
+				E16A73DF05C2527F009B66A0,
+				E16A73DE05C2527F009B66A0,
+				E15D1C7505D5BE2C0086A074,
+				E15D1C7705D5BE330086A074,
+			);
+			isa = PBXGroup;
+			name = Classes;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//080
+//081
+//082
+//083
+//084
+//100
+//101
+//102
+//103
+//104
+		1058C7A0FEA54F0111CA2CBB = {
+			children = (
+				1058C7A1FEA54F0111CA2CBB,
+				E16A744605C252ED009B66A0,
+			);
+			isa = PBXGroup;
+			name = "Linked Frameworks";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		1058C7A1FEA54F0111CA2CBB = {
+			fallbackIsa = PBXFileReference;
+			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
+			name = Cocoa.framework;
+			path = /System/Library/Frameworks/Cocoa.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		1058C7A2FEA54F0111CA2CBB = {
+			children = (
+				29B97325FDCFA39411CA2CEA,
+				29B97324FDCFA39411CA2CEA,
+			);
+			isa = PBXGroup;
+			name = "Other Frameworks";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//100
+//101
+//102
+//103
+//104
+//190
+//191
+//192
+//193
+//194
+		19C28FACFE9D520D11CA2CBB = {
+			children = (
+				8D1107320486CEB800E47090,
+			);
+			isa = PBXGroup;
+			name = Products;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//190
+//191
+//192
+//193
+//194
+//290
+//291
+//292
+//293
+//294
+		29B97313FDCFA39411CA2CEA = {
+			buildSettings = {
+			};
+			buildStyles = (
+				4A9504CCFFE6A4B311CA0CBA,
+				4A9504CDFFE6A4B311CA0CBA,
+			);
+			hasScannedForEncodings = 1;
+			isa = PBXProject;
+			mainGroup = 29B97314FDCFA39411CA2CEA;
+			projectDirPath = "";
+			targets = (
+				8D1107260486CEB800E47090,
+			);
+		};
+		29B97314FDCFA39411CA2CEA = {
+			children = (
+				080E96DDFE201D6D7F000001,
+				29B97315FDCFA39411CA2CEA,
+				29B97317FDCFA39411CA2CEA,
+				29B97323FDCFA39411CA2CEA,
+				19C28FACFE9D520D11CA2CBB,
+			);
+			isa = PBXGroup;
+			name = X10Remote;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97315FDCFA39411CA2CEA = {
+			children = (
+				32CA4F630368D1EE00C91783,
+				29B97316FDCFA39411CA2CEA,
+			);
+			isa = PBXGroup;
+			name = "Other Sources";
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97316FDCFA39411CA2CEA = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = main.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97317FDCFA39411CA2CEA = {
+			children = (
+				8D1107310486CEB800E47090,
+				29B97318FDCFA39411CA2CEA,
+			);
+			isa = PBXGroup;
+			name = Resources;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97318FDCFA39411CA2CEA = {
+			children = (
+				29B97319FDCFA39411CA2CEA,
+			);
+			isa = PBXVariantGroup;
+			name = MainMenu.nib;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97319FDCFA39411CA2CEA = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.nib;
+			name = English;
+			path = English.lproj/MainMenu.nib;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97323FDCFA39411CA2CEA = {
+			children = (
+				1058C7A0FEA54F0111CA2CBB,
+				1058C7A2FEA54F0111CA2CBB,
+			);
+			isa = PBXGroup;
+			name = Frameworks;
+			path = "";
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		29B97324FDCFA39411CA2CEA = {
+			fallbackIsa = PBXFileReference;
+			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
+			name = AppKit.framework;
+			path = /System/Library/Frameworks/AppKit.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		29B97325FDCFA39411CA2CEA = {
+			fallbackIsa = PBXFileReference;
+			isa = PBXFrameworkReference;
+			lastKnownFileType = wrapper.framework;
+			name = Foundation.framework;
+			path = /System/Library/Frameworks/Foundation.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+//290
+//291
+//292
+//293
+//294
+//320
+//321
+//322
+//323
+//324
+		32CA4F630368D1EE00C91783 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = X10Remote_Prefix.pch;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+//320
+//321
+//322
+//323
+//324
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+		4A9504CCFFE6A4B311CA0CBA = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = NO;
+				DEBUGGING_SYMBOLS = YES;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				OPTIMIZATION_CFLAGS = "-O0";
+				ZERO_LINK = YES;
+			};
+			isa = PBXBuildStyle;
+			name = Development;
+		};
+		4A9504CDFFE6A4B311CA0CBA = {
+			buildRules = (
+			);
+			buildSettings = {
+				COPY_PHASE_STRIP = YES;
+				GCC_ENABLE_FIX_AND_CONTINUE = NO;
+				ZERO_LINK = NO;
+			};
+			isa = PBXBuildStyle;
+			name = Deployment;
+		};
+//4A0
+//4A1
+//4A2
+//4A3
+//4A4
+//8D0
+//8D1
+//8D2
+//8D3
+//8D4
+		8D1107260486CEB800E47090 = {
+			buildPhases = (
+				8D1107270486CEB800E47090,
+				8D1107290486CEB800E47090,
+				8D11072C0486CEB800E47090,
+				8D11072E0486CEB800E47090,
+			);
+			buildRules = (
+			);
+			buildSettings = {
+				FRAMEWORK_SEARCH_PATHS = "";
+				GCC_ENABLE_TRIGRAPHS = NO;
+				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = X10Remote_Prefix.pch;
+				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
+				GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+				GCC_WARN_UNKNOWN_PRAGMAS = NO;
+				HEADER_SEARCH_PATHS = "";
+				INFOPLIST_FILE = Info.plist;
+				INSTALL_PATH = "$(HOME)/Applications";
+				LIBRARY_SEARCH_PATHS = "";
+				OTHER_CFLAGS = "";
+				OTHER_LDFLAGS = "";
+				PRODUCT_NAME = X10Remote;
+				SECTORDER_FLAGS = "";
+				WARNING_CFLAGS = "-Wmost -Wno-four-char-constants -Wno-unknown-pragmas";
+				WRAPPER_EXTENSION = app;
+			};
+			dependencies = (
+			);
+			isa = PBXNativeTarget;
+			name = X10Remote;
+			productInstallPath = "$(HOME)/Applications";
+			productName = X10Remote;
+			productReference = 8D1107320486CEB800E47090;
+			productType = "com.apple.product-type.application";
+		};
+		8D1107270486CEB800E47090 = {
+			buildActionMask = 2147483647;
+			files = (
+				8D1107280486CEB800E47090,
+				E16A73BA05C24655009B66A0,
+				E16A73DC05C25272009B66A0,
+				E16A73E105C2527F009B66A0,
+				E15D1C7605D5BE2C0086A074,
+			);
+			isa = PBXHeadersBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D1107280486CEB800E47090 = {
+			fileRef = 32CA4F630368D1EE00C91783;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		8D1107290486CEB800E47090 = {
+			buildActionMask = 2147483647;
+			files = (
+				8D11072A0486CEB800E47090,
+			);
+			isa = PBXResourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D11072A0486CEB800E47090 = {
+			fileRef = 29B97318FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		8D11072C0486CEB800E47090 = {
+			buildActionMask = 2147483647;
+			files = (
+				8D11072D0486CEB800E47090,
+				E16A73BB05C24655009B66A0,
+				E16A73DD05C25272009B66A0,
+				E16A73E005C2527F009B66A0,
+				E15D1C7805D5BE330086A074,
+			);
+			isa = PBXSourcesBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D11072D0486CEB800E47090 = {
+			fileRef = 29B97316FDCFA39411CA2CEA;
+			isa = PBXBuildFile;
+			settings = {
+				ATTRIBUTES = (
+				);
+			};
+		};
+		8D11072E0486CEB800E47090 = {
+			buildActionMask = 2147483647;
+			files = (
+				8D11072F0486CEB800E47090,
+				E16A744705C252ED009B66A0,
+			);
+			isa = PBXFrameworksBuildPhase;
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D11072F0486CEB800E47090 = {
+			fileRef = 1058C7A1FEA54F0111CA2CBB;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		8D1107310486CEB800E47090 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = text.plist;
+			path = Info.plist;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		8D1107320486CEB800E47090 = {
+			explicitFileType = wrapper.application;
+			includeInIndex = 0;
+			isa = PBXFileReference;
+			path = X10Remote.app;
+			refType = 3;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
+//8D0
+//8D1
+//8D2
+//8D3
+//8D4
+//E10
+//E11
+//E12
+//E13
+//E14
+		E15D1C7505D5BE2C0086A074 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			name = NJRWindowMagnetism.h;
+			path = /Users/nicholas/Documents/Development/Cocoa/DockCam/NJRWindowMagnetism.h;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E15D1C7605D5BE2C0086A074 = {
+			fileRef = E15D1C7505D5BE2C0086A074;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E15D1C7705D5BE330086A074 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			name = NJRWindowMagnetism.m;
+			path = /Users/nicholas/Documents/Development/Cocoa/DockCam/NJRWindowMagnetism.m;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E15D1C7805D5BE330086A074 = {
+			fileRef = E15D1C7705D5BE330086A074;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73B805C24655009B66A0 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = X10RemoteController.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73B905C24655009B66A0 = {
+			fileEncoding = 4;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = X10RemoteController.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73BA05C24655009B66A0 = {
+			fileRef = E16A73B805C24655009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73BB05C24655009B66A0 = {
+			fileRef = E16A73B905C24655009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73DA05C25272009B66A0 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = NJRHotKey.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73DB05C25272009B66A0 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = NJRHotKey.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73DC05C25272009B66A0 = {
+			fileRef = E16A73DA05C25272009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73DD05C25272009B66A0 = {
+			fileRef = E16A73DB05C25272009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73DE05C2527F009B66A0 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.objc;
+			path = NJRHotKeyManager.m;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73DF05C2527F009B66A0 = {
+			fileEncoding = 30;
+			isa = PBXFileReference;
+			lastKnownFileType = sourcecode.c.h;
+			path = NJRHotKeyManager.h;
+			refType = 4;
+			sourceTree = "<group>";
+		};
+		E16A73E005C2527F009B66A0 = {
+			fileRef = E16A73DE05C2527F009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A73E105C2527F009B66A0 = {
+			fileRef = E16A73DF05C2527F009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+		E16A744605C252ED009B66A0 = {
+			isa = PBXFileReference;
+			lastKnownFileType = wrapper.framework;
+			name = Carbon.framework;
+			path = /System/Library/Frameworks/Carbon.framework;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		E16A744705C252ED009B66A0 = {
+			fileRef = E16A744605C252ED009B66A0;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
+	};
+	rootObject = 29B97313FDCFA39411CA2CEA;
+}
Index: trunk/Cocoa/X10Remote/X10RemoteController.h
===================================================================
--- trunk/Cocoa/X10Remote/X10RemoteController.h	(revision 157)
+++ trunk/Cocoa/X10Remote/X10RemoteController.h	(revision 157)
@@ -0,0 +1,20 @@
+//
+//  X10RemoteController.h
+//  X10Remote
+//
+//  Created by Nicholas Riley on Sat Jan 24 2004.
+//  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface X10RemoteController : NSWindowController {
+    NSTask *remoteShellTask;
+    NSFileHandle *remoteShellInput;
+}
+
+- (IBAction)turnUnitOn:(NSButton *)sender;
+- (IBAction)turnUnitOff:(NSButton *)sender;
+
+@end
Index: trunk/Cocoa/X10Remote/X10RemoteController.m
===================================================================
--- trunk/Cocoa/X10Remote/X10RemoteController.m	(revision 157)
+++ trunk/Cocoa/X10Remote/X10RemoteController.m	(revision 157)
@@ -0,0 +1,80 @@
+//
+//  X10RemoteController.m
+//  X10Remote
+//
+//  Created by Nicholas Riley on Sat Jan 24 2004.
+//  Copyright (c) 2004 Nicholas Riley. All rights reserved.
+//
+
+#import "X10RemoteController.h"
+#import "NJRHotKey.h"
+#import "NJRHotKeyManager.h"
+#import "NJRWindowMagnetism.h"
+
+@implementation X10RemoteController
+
+- (void)_launchRemoteShellTask;
+{
+    NSLog(@"Attempting to connect to stripped");
+    [remoteShellTask release];
+    remoteShellTask = [[NSTask alloc] init];
+    [remoteShellTask setLaunchPath: @"/bin/zsh"];
+    [remoteShellTask setArguments: [NSArray arrayWithObjects: @"-c", @"ssh stripped /bin/sh", nil]];
+    NSPipe *remoteShellPipe = [NSPipe pipe];
+    [remoteShellTask setStandardInput: remoteShellPipe];
+    remoteShellInput = [remoteShellPipe fileHandleForWriting];
+    [remoteShellTask launch];
+    [remoteShellInput writeData: [NSData data]];
+}
+
+- (void)_toggleVisible:(id)sender;
+{
+    NSWindow *window = [self window];
+    if ([window isVisible]) {
+        if ([window isKeyWindow])
+            [NSApp hide: self];
+        [window orderOut: self];
+    } else {
+        [NSApp activateIgnoringOtherApps: YES];
+        [window makeKeyAndOrderFront: self];
+    }
+}
+                        
+- (void)awakeFromNib;
+{
+    NJRHotKeyManager *hotKeyManager = [NJRHotKeyManager sharedManager];
+    NSWindow *window = [self window];
+    [hotKeyManager addShortcutWithIdentifier: @"X10RemoteControllerToggleVisible"
+                                      hotKey: [NJRHotKey hotKeyWithCharacters: @"x"
+                                                                modifierFlags: NSCommandKeyMask | NSControlKeyMask
+                                                                      keyCode: 7]
+                                      target: self
+                                      action: @selector(_toggleVisible:)];
+    [self _launchRemoteShellTask];
+    [window setHidesOnDeactivate: NO];
+    [[NJRWindowMagnetism alloc] initForWindow: window];
+}
+
+- (void)_sendToRemote:(NSString *)commandString;
+{
+    NSData *commandData = [commandString dataUsingEncoding: NSASCIIStringEncoding];
+    if (![remoteShellTask isRunning])
+        [self _launchRemoteShellTask];
+    [remoteShellInput writeData: commandData];
+    if (![remoteShellTask isRunning]) {
+        [self _launchRemoteShellTask];
+        [remoteShellInput writeData: commandData];
+    }
+}
+
+- (IBAction)turnUnitOn:(NSButton *)sender;
+{
+    [self _sendToRemote: [NSString stringWithFormat: @"br n%d on\n", [sender tag]]];
+}
+
+- (IBAction)turnUnitOff:(NSButton *)sender;
+{
+    [self _sendToRemote: [NSString stringWithFormat: @"br n%d off\n", [sender tag]]];
+}
+
+@end
Index: trunk/Cocoa/X10Remote/X10Remote_Prefix.pch
===================================================================
--- trunk/Cocoa/X10Remote/X10Remote_Prefix.pch	(revision 157)
+++ trunk/Cocoa/X10Remote/X10Remote_Prefix.pch	(revision 157)
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'X10Remote' target in the 'X10Remote' project
+//
+
+#ifdef __OBJC__
+    #import <Cocoa/Cocoa.h>
+#endif
Index: trunk/Cocoa/X10Remote/main.m
===================================================================
--- trunk/Cocoa/X10Remote/main.m	(revision 157)
+++ trunk/Cocoa/X10Remote/main.m	(revision 157)
@@ -0,0 +1,14 @@
+//
+//  main.m
+//  X10Remote
+//
+//  Created by Nicholas Riley on Fri Jan 23 2004.
+//  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+
+int main(int argc, const char *argv[])
+{
+    return NSApplicationMain(argc, argv);
+}
Index: trunk/Cocoa/X10Remote/version.plist
===================================================================
--- trunk/Cocoa/X10Remote/version.plist	(revision 157)
+++ trunk/Cocoa/X10Remote/version.plist	(revision 157)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>BuildVersion</key>
+	<string>17</string>
+	<key>CFBundleShortVersionString</key>
+	<string>0.1</string>
+	<key>CFBundleVersion</key>
+	<string>0.1</string>
+	<key>ProjectName</key>
+	<string>NibPBTemplates</string>
+	<key>SourceVersion</key>
+	<string>1150000</string>
+</dict>
+</plist>
