aboutsummaryrefslogtreecommitdiff
path: root/macosx
diff options
context:
space:
mode:
authorPCSX* teams2010-11-16 14:15:22 +0200
committerGrazvydas Ignotas2010-11-16 14:15:22 +0200
commitef79bbde537d6b9c745a7d86cb9df1d04c35590d (patch)
treeef8d2520dbb9e1e345b41b12c9959f300ca8fd10 /macosx
downloadpcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.gz
pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.tar.bz2
pcsx_rearmed-ef79bbde537d6b9c745a7d86cb9df1d04c35590d.zip
pcsxr-1.9.92
Diffstat (limited to 'macosx')
-rw-r--r--macosx/ConfigurationController.h41
-rw-r--r--macosx/ConfigurationController.m203
-rw-r--r--macosx/EmuThread.h40
-rw-r--r--macosx/EmuThread.m398
-rw-r--r--macosx/English.lproj/AddPluginSheet.nib/classes.nib14
-rw-r--r--macosx/English.lproj/AddPluginSheet.nib/info.nib16
-rw-r--r--macosx/English.lproj/AddPluginSheet.nib/keyedobjects.nibbin0 -> 5605 bytes
-rw-r--r--macosx/English.lproj/Configuration.nib/classes.nib49
-rw-r--r--macosx/English.lproj/Configuration.nib/info.nib22
-rw-r--r--macosx/English.lproj/Configuration.nib/objects.nibbin0 -> 15263 bytes
-rw-r--r--macosx/English.lproj/Credits.rtf28
-rw-r--r--macosx/English.lproj/InfoPlist.strings6
-rw-r--r--macosx/English.lproj/PCSX.nib/classes.nib25
-rw-r--r--macosx/English.lproj/PCSX.nib/info.nib21
-rw-r--r--macosx/English.lproj/PCSX.nib/objects.nibbin0 -> 3850 bytes
-rw-r--r--macosx/ExtendedKeys.h23
-rw-r--r--macosx/Info.plist107
-rw-r--r--macosx/Pcsx.xcodeproj/project.pbxproj934
-rw-r--r--macosx/PcsxController.h34
-rw-r--r--macosx/PcsxController.m425
-rw-r--r--macosx/PcsxPlugin.h41
-rw-r--r--macosx/PcsxPlugin.m303
-rw-r--r--macosx/PcsxPluginDocument.h20
-rw-r--r--macosx/PcsxPluginDocument.m95
-rw-r--r--macosx/Plugin.c150
-rw-r--r--macosx/PluginController.h22
-rw-r--r--macosx/PluginController.m81
-rw-r--r--macosx/PluginList.h36
-rw-r--r--macosx/PluginList.m324
-rw-r--r--macosx/config.h31
-rw-r--r--macosx/icons/PCSX.icnsbin0 -> 50301 bytes
-rw-r--r--macosx/icons/pcsxfreeze.icnsbin0 -> 49422 bytes
-rw-r--r--macosx/icons/pcsxmemcard.icnsbin0 -> 49442 bytes
-rw-r--r--macosx/icons/psxbios.icnsbin0 -> 47845 bytes
-rw-r--r--macosx/icons/psxplugin.icnsbin0 -> 38009 bytes
-rw-r--r--macosx/main.m156
-rw-r--r--macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj360
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/Credits.rtf13
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib18
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib16
-rw-r--r--macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nibbin0 -> 8896 bytes
-rwxr-xr-xmacosx/plugins/DFCdrom/English.lproj/InfoPlist.stringsbin0 -> 486 bytes
-rw-r--r--macosx/plugins/DFCdrom/Info.plist22
-rw-r--r--macosx/plugins/DFCdrom/macsrc/PluginConfigController.h18
-rw-r--r--macosx/plugins/DFCdrom/macsrc/PluginConfigController.m158
-rw-r--r--macosx/plugins/DFCdrom/macsrc/cdr-macosx.c250
-rw-r--r--macosx/plugins/DFCdrom/macsrc/cfg.c53
-rw-r--r--macosx/plugins/DFCdrom/version.plist16
-rw-r--r--macosx/plugins/DFInput/DFInput.xcodeproj/project.pbxproj569
-rw-r--r--macosx/plugins/DFInput/English.lproj/Credits.rtf17
-rwxr-xr-xmacosx/plugins/DFInput/English.lproj/InfoPlist.stringsbin0 -> 612 bytes
-rw-r--r--macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/classes.nib33
-rw-r--r--macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/info.nib21
-rw-r--r--macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/keyedobjects.nibbin0 -> 12060 bytes
-rw-r--r--macosx/plugins/DFInput/Info.plist40
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL.h151
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_config.h313
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_endian.h258
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_error.h78
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_haptic.h1123
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_joystick.h209
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_main.h96
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_platform.h154
-rw-r--r--macosx/plugins/DFInput/SDL/include/SDL_stdinc.h792
-rw-r--r--macosx/plugins/DFInput/SDL/include/begin_code.h136
-rw-r--r--macosx/plugins/DFInput/SDL/include/close_code.h38
-rw-r--r--macosx/plugins/DFInput/SDL/src/SDL.c101
-rw-r--r--macosx/plugins/DFInput/SDL/src/SDL_error.c259
-rw-r--r--macosx/plugins/DFInput/SDL/src/SDL_error_c.h62
-rw-r--r--macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic.c708
-rw-r--r--macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic_c.h26
-rw-r--r--macosx/plugins/DFInput/SDL/src/haptic/SDL_syshaptic.h201
-rw-r--r--macosx/plugins/DFInput/SDL/src/haptic/darwin/SDL_syshaptic.c1321
-rw-r--r--macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick.c503
-rw-r--r--macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick_c.h47
-rw-r--r--macosx/plugins/DFInput/SDL/src/joystick/SDL_sysjoystick.h85
-rw-r--r--macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick.c847
-rw-r--r--macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick_c.h88
-rw-r--r--macosx/plugins/DFInput/macsrc/ControllerList.h42
-rw-r--r--macosx/plugins/DFInput/macsrc/ControllerList.m143
-rw-r--r--macosx/plugins/DFInput/macsrc/MappingCell.h29
-rw-r--r--macosx/plugins/DFInput/macsrc/MappingCell.m89
-rw-r--r--macosx/plugins/DFInput/macsrc/PadController.h38
-rw-r--r--macosx/plugins/DFInput/macsrc/PadController.m138
-rw-r--r--macosx/plugins/DFInput/macsrc/PadView.h42
-rw-r--r--macosx/plugins/DFInput/macsrc/PadView.m110
-rw-r--r--macosx/plugins/DFInput/macsrc/cfg.c748
-rw-r--r--macosx/plugins/DFInput/macsrc/cfg.h30
-rw-r--r--macosx/plugins/DFInput/macsrc/xkb.c65
-rw-r--r--macosx/plugins/DFSound/English.lproj/Credits.rtf14
-rwxr-xr-xmacosx/plugins/DFSound/English.lproj/InfoPlist.stringsbin0 -> 538 bytes
-rw-r--r--macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/classes.nib25
-rw-r--r--macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/info.nib16
-rwxr-xr-xmacosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/keyedobjects.nibbin0 -> 10993 bytes
-rw-r--r--macosx/plugins/DFSound/Info.plist22
-rw-r--r--macosx/plugins/DFSound/PeopsSPU.xcodeproj/project.pbxproj343
-rw-r--r--macosx/plugins/DFSound/macsrc/NamedSlider.h13
-rw-r--r--macosx/plugins/DFSound/macsrc/NamedSlider.m33
-rw-r--r--macosx/plugins/DFSound/macsrc/PluginController.h29
-rw-r--r--macosx/plugins/DFSound/macsrc/PluginController.m160
-rwxr-xr-xmacosx/plugins/DFSound/src/macosx.c203
-rw-r--r--macosx/plugins/DFXVideo/English.lproj/Credits.rtf13
-rw-r--r--macosx/plugins/DFXVideo/English.lproj/InfoPlist.stringsbin0 -> 518 bytes
-rw-r--r--macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/classes.nib26
-rw-r--r--macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/info.nib16
-rw-r--r--macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/keyedobjects.nibbin0 -> 15019 bytes
-rw-r--r--macosx/plugins/DFXVideo/Info.plist20
-rw-r--r--macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/classes.nib22
-rw-r--r--macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/info.nib16
-rw-r--r--macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/keyedobjects.nibbin0 -> 2247 bytes
-rw-r--r--macosx/plugins/DFXVideo/PeopsSoftGPU.xcodeproj/project.pbxproj416
-rw-r--r--macosx/plugins/DFXVideo/macsrc/ExtendedKeys.h23
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginConfigController.h26
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginConfigController.m216
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginGLView.h63
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginGLView.m692
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginWindow.h24
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginWindow.m46
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginWindowController.h41
-rw-r--r--macosx/plugins/DFXVideo/macsrc/PluginWindowController.m227
-rw-r--r--macosx/plugins/DFXVideo/macsrc/drawgl.m181
121 files changed, 17245 insertions, 0 deletions
diff --git a/macosx/ConfigurationController.h b/macosx/ConfigurationController.h
new file mode 100644
index 0000000..e390197
--- /dev/null
+++ b/macosx/ConfigurationController.h
@@ -0,0 +1,41 @@
+/* ConfigurationController */
+
+#import <Cocoa/Cocoa.h>
+#import "PluginController.h"
+#import "PluginList.h"
+
+@interface ConfigurationController : NSWindowController
+{
+ IBOutlet PluginController *cdromPlugin;
+ IBOutlet PluginController *graphicsPlugin;
+ IBOutlet PluginController *padPlugin;
+ IBOutlet PluginController *soundPlugin;
+
+ IBOutlet id noXaAudioCell;
+ IBOutlet id sioIrqAlwaysCell;
+ IBOutlet id bwMdecCell;
+ IBOutlet id autoVTypeCell;
+ IBOutlet id vTypePALCell;
+ IBOutlet id noCDAudioCell;
+ IBOutlet id usesHleCell;
+ IBOutlet id usesDynarecCell;
+ IBOutlet id consoleOutputCell;
+ IBOutlet id spuIrqAlwaysCell;
+ IBOutlet id rCountFixCell;
+ IBOutlet id vSyncWAFixCell;
+ IBOutlet id noFastBootCell;
+
+ IBOutlet NSTextField *mcd1Label;
+ IBOutlet NSTextField *mcd2Label;
+
+ NSMutableDictionary *checkBoxDefaults;
+}
+- (IBAction)setCheckbox:(id)sender;
+- (IBAction)setCheckboxInverse:(id)sender;
+- (IBAction)setVideoType:(id)sender;
+- (IBAction)mcdChangeClicked:(id)sender;
+- (IBAction)mcdNewClicked:(id)sender;
+
+- (NSString *)keyForSender:(id)sender;
+
+@end
diff --git a/macosx/ConfigurationController.m b/macosx/ConfigurationController.m
new file mode 100644
index 0000000..9f692ca
--- /dev/null
+++ b/macosx/ConfigurationController.m
@@ -0,0 +1,203 @@
+#import "ConfigurationController.h"
+#import "PcsxController.h"
+#import "PluginList.h"
+#import "PcsxPlugin.h"
+#include "psxcommon.h"
+#include "plugins.h"
+
+@implementation ConfigurationController
+
+- (IBAction)setCheckbox:(id)sender
+{
+ if ([sender isKindOfClass:[NSMatrix class]]) {
+ sender = [sender selectedCell];
+ }
+
+ NSString *key = [self keyForSender:sender];
+ if (key) {
+ [[NSUserDefaults standardUserDefaults] setInteger:[sender intValue] forKey:key];
+ [PcsxController setConfigFromDefaults];
+ }
+}
+
+- (IBAction)setCheckboxInverse:(id)sender
+{
+ if ([sender isKindOfClass:[NSMatrix class]]) {
+ sender = [sender selectedCell];
+ }
+
+ NSString *key = [self keyForSender:sender];
+ if (key) {
+ [[NSUserDefaults standardUserDefaults] setInteger:![sender intValue] forKey:key];
+ [PcsxController setConfigFromDefaults];
+ }
+}
+
+- (IBAction)mcdChangeClicked:(id)sender
+{
+ int tag = [sender tag];
+ char *mcd;
+ NSTextField *label;
+ NSOpenPanel *openDlg = [NSOpenPanel openPanel];
+ NSString *path;
+
+ if (tag == 1) { mcd = Config.Mcd1; label = mcd1Label; }
+ else { mcd = Config.Mcd2; label = mcd2Label; }
+
+ [openDlg setCanChooseFiles:YES];
+ [openDlg setCanChooseDirectories:NO];
+
+ path = [NSString stringWithCString:mcd];
+
+ if ([openDlg runModalForDirectory:[path stringByDeletingLastPathComponent] file:[path lastPathComponent]] == NSOKButton) {
+ NSArray* files = [openDlg filenames];
+ strcpy(mcd, (const char *)[[files objectAtIndex:0] fileSystemRepresentation]);
+
+ [label setTitleWithMnemonic:[NSString stringWithCString:mcd]];
+
+ if (tag == 1)
+ [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithCString:mcd] forKey:@"Mcd1"];
+ else
+ [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithCString:mcd] forKey:@"Mcd2"];
+ }
+}
+
+- (IBAction)mcdNewClicked:(id)sender
+{
+ int tag = [sender tag];
+ char *mcd;
+ NSTextField *label;
+ NSSavePanel *openDlg = [NSSavePanel savePanel];
+ NSString *path;
+
+ if (tag == 1) { mcd = Config.Mcd1; label = mcd1Label; }
+ else { mcd = Config.Mcd2; label = mcd2Label; }
+
+ path = [NSString stringWithCString:mcd];
+
+ if ([openDlg runModalForDirectory:[path stringByDeletingLastPathComponent] file:@"New Memory Card File.mcr"] == NSOKButton) {
+ strcpy(mcd, (const char *)[[openDlg filename] fileSystemRepresentation]);
+
+ [label setTitleWithMnemonic:[NSString stringWithCString:mcd]];
+
+ if (tag == 1)
+ [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithCString:mcd] forKey:@"Mcd1"];
+ else
+ [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithCString:mcd] forKey:@"Mcd2"];
+
+ CreateMcd(mcd);
+ }
+}
+
+- (IBAction)setVideoType:(id)sender
+{
+ int tag = [[sender selectedItem] tag];
+
+ if (3 == tag) {
+ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"AutoDetectVideoType"];
+ } else if (1 == tag || 2 == tag) {
+ [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"AutoDetectVideoType"];
+ [[NSUserDefaults standardUserDefaults] setBool:tag==2 forKey:@"VideoTypePAL"];
+ } else {
+ return;
+ }
+ [PcsxController setConfigFromDefaults];
+
+ if ([sender pullsDown]) {
+ NSArray *items = [sender itemArray];
+ int i;
+
+ for (i=0; i<[items count]; i++)
+ [[items objectAtIndex:i] setState:NSOffState];
+
+ [[sender selectedItem] setState:NSOnState];
+ }
+}
+
+- (void)awakeFromNib
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ [[self window] center];
+
+ // setup checkboxes
+ checkBoxDefaults = [[NSMutableDictionary alloc] init];
+
+ // check that the outlets are active before adding them
+ if (noXaAudioCell) [checkBoxDefaults setObject:noXaAudioCell forKey:@"NoXaAudio"];
+ if (sioIrqAlwaysCell) [checkBoxDefaults setObject:sioIrqAlwaysCell forKey:@"SioIrqAlways"];
+ if (bwMdecCell) [checkBoxDefaults setObject:bwMdecCell forKey:@"BlackAndWhiteMDECVideo"];
+ if (autoVTypeCell) [checkBoxDefaults setObject:autoVTypeCell forKey:@"AutoDetectVideoType"];
+ if (vTypePALCell) [checkBoxDefaults setObject:vTypePALCell forKey:@"VideoTypePAL"];
+ if (noCDAudioCell) [checkBoxDefaults setObject:noCDAudioCell forKey:@"NoCDAudio"];
+ if (usesHleCell) [checkBoxDefaults setObject:usesHleCell forKey:@"UseHLE"];
+ if (usesDynarecCell) [checkBoxDefaults setObject:usesDynarecCell forKey:@"NoDynarec"];
+ if (consoleOutputCell) [checkBoxDefaults setObject:consoleOutputCell forKey:@"ConsoleOutput"];
+ if (spuIrqAlwaysCell) [checkBoxDefaults setObject:spuIrqAlwaysCell forKey:@"SpuIrqAlways"];
+ if (rCountFixCell) [checkBoxDefaults setObject:rCountFixCell forKey:@"RootCounterFix"];
+ if (vSyncWAFixCell) [checkBoxDefaults setObject:vSyncWAFixCell forKey:@"VideoSyncWAFix"];
+ if (noFastBootCell) [checkBoxDefaults setObject:noFastBootCell forKey:@"NoFastBoot"];
+
+ // make the visuals match the defaults
+ NSEnumerator *enumerator= [checkBoxDefaults keyEnumerator];
+ id key;
+ while ((key = [enumerator nextObject])) {
+ if ([defaults integerForKey:key]) {
+ [[checkBoxDefaults objectForKey:key] setNextState];
+ }
+ }
+
+ // special cases
+ if (![PcsxController biosAvailable]) {
+ // no bios means always use HLE
+ [usesHleCell setState:NSOnState];
+ [usesHleCell setEnabled:NO];
+ }
+
+ // setup labels
+ [mcd1Label setTitleWithMnemonic:[NSString stringWithCString:Config.Mcd1]];
+ [mcd2Label setTitleWithMnemonic:[NSString stringWithCString:Config.Mcd2]];
+
+ int tag = [defaults integerForKey:@"AutoDetectVideoType"];
+ if (tag)
+ tag = 3;
+ else {
+ tag = [defaults integerForKey:@"VideoTypePAL"]+1;
+ }
+ [vTypePALCell setAutoenablesItems:NO];
+ if ([vTypePALCell pullsDown]) {
+ [[vTypePALCell itemAtIndex:[vTypePALCell indexOfItemWithTag:tag]] setState:NSOnState];
+ } else {
+ [vTypePALCell selectItemAtIndex:[vTypePALCell indexOfItemWithTag:tag]];
+ }
+
+ // setup plugin lists
+ PluginList *list = [PluginList list];
+
+ [list refreshPlugins];
+ [graphicsPlugin setPluginsTo:[list pluginsForType:PSE_LT_GPU] withType: PSE_LT_GPU];
+ [soundPlugin setPluginsTo:[list pluginsForType:PSE_LT_SPU] withType: PSE_LT_SPU];
+ [padPlugin setPluginsTo:[list pluginsForType:PSE_LT_PAD] withType: PSE_LT_PAD];
+ [cdromPlugin setPluginsTo:[list pluginsForType:PSE_LT_CDR] withType: PSE_LT_CDR];
+}
+
+- (void)dealloc
+{
+ [checkBoxDefaults release];
+ [super dealloc];
+}
+
+- (NSString *)keyForSender:(id)sender
+{
+ NSEnumerator *enumerator= [checkBoxDefaults keyEnumerator];
+ id key;
+ while ((key = [enumerator nextObject])) {
+ id object = [checkBoxDefaults objectForKey:key];
+ if ([object isEqual:sender])
+ return key;
+ }
+
+ return nil;
+}
+
+@end
diff --git a/macosx/EmuThread.h b/macosx/EmuThread.h
new file mode 100644
index 0000000..21b031f
--- /dev/null
+++ b/macosx/EmuThread.h
@@ -0,0 +1,40 @@
+//
+// EmuThread.h
+// Pcsx
+//
+// Created by Gil Pedersen on Sun Sep 21 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#include <setjmp.h>
+
+@interface EmuThread : NSObject {
+ NSAutoreleasePool *pool;
+ jmp_buf restartJmp;
+ BOOL wasPaused;
+}
+
+- (void)EmuThreadRun:(id)anObject;
+- (void)EmuThreadRunBios:(id)anObject;
+- (void)handleEvents;
+
++ (void)run;
++ (void)runBios;
++ (void)stop;
++ (BOOL)pause;
++ (BOOL)pauseSafe;
++ (void)resume;
++ (void)resetNow;
++ (void)reset;
+
++ (BOOL)isPaused;
++ (BOOL)active;
++ (BOOL)isRunBios;
+
++ (void)freezeAt:(NSString *)path which:(int)num;
++ (BOOL)defrostAt:(NSString *)path;
+
+@end
+
+extern EmuThread *emuThread;
diff --git a/macosx/EmuThread.m b/macosx/EmuThread.m
new file mode 100644
index 0000000..941d77d
--- /dev/null
+++ b/macosx/EmuThread.m
@@ -0,0 +1,398 @@
+//
+// EmuThread.m
+// Pcsx
+//
+// Created by Gil Pedersen on Sun Sep 21 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import <ExceptionHandling/NSExceptionHandler.h>
+#import <AppKit/NSApplication.h>
+#include <pthread.h>
+#include <setjmp.h>
+#import "EmuThread.h"
+#include "psxcommon.h"
+#include "plugins.h"
+#include "misc.h"
+
+EmuThread *emuThread;
+NSString *defrostPath = nil;
+static int safeEvent;
+static int paused;
+static int runbios;
+
+static pthread_cond_t eventCond;
+static pthread_mutex_t eventMutex;
+
+#define EMUEVENT_NONE 0
+#define EMUEVENT_PAUSE (1<<0)
+#define EMUEVENT_RESET (1<<1)
+#define EMUEVENT_STOP (1<<2)
+
+@implementation EmuThread
+
+- (void)EmuThreadRun:(id)anObject
+{
+ pool = [[NSAutoreleasePool alloc] init];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowDidClose:)
+ name:@"emuWindowDidClose" object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowWantPause:)
+ name:@"emuWindowWantPause" object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowWantResume:)
+ name:@"emuWindowWantResume" object:nil];
+
+ // we shouldn't change the priority, since we might depend on subthreads
+ //[NSThread setThreadPriority:1.0-((1.0-[NSThread threadPriority])/4.0)];
+
+ // Do processing here
+ if (OpenPlugins() == -1)
+ goto done;
+
+ setjmp(restartJmp);
+
+ EmuReset();
+
+ int res = CheckCdrom();
+ if (res == -1) {
+ ClosePlugins();
+ SysMessage(_("Could not check CD-ROM!\n"));
+ goto done;
+ }
+
+ LoadCdrom();
+
+ if (defrostPath) {
+ LoadState([defrostPath fileSystemRepresentation]);
+ [defrostPath release]; defrostPath = nil;
+ }
+
+ psxCpu->Execute();
+
+done:
+ [pool release]; pool = nil;
+ emuThread = nil;
+
+ return;
+}
+
+- (void)EmuThreadRunBios:(id)anObject
+{
+ pool = [[NSAutoreleasePool alloc] init];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowDidClose:)
+ name:@"emuWindowDidClose" object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowWantPause:)
+ name:@"emuWindowWantPause" object:nil];
+
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(emuWindowWantResume:)
+ name:@"emuWindowWantResume" object:nil];
+
+ // we shouldn't change the priority, since we might depend on subthreads
+ //[NSThread setThreadPriority:1.0-((1.0-[NSThread threadPriority])/4.0)];
+
+ // Do processing here
+ if (OpenPlugins() == -1)
+ goto done;
+
+ EmuReset();
+
+ psxCpu->Execute();
+
+done:
+ [pool release]; pool = nil;
+ emuThread = nil;
+
+ return;
+}
+
+- (void)dealloc
+{
+ // remove all registered observers
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:nil];
+
+ if (pool)
+ [pool release];
+
+ [super dealloc];
+}
+
+- (void)emuWindowDidClose:(NSNotification *)aNotification
+{
+ [EmuThread stop];
+}
+
+- (void)emuWindowWantPause:(NSNotification *)aNotification
+{
+ wasPaused = [EmuThread pause];
+}
+
+- (void)emuWindowWantResume:(NSNotification *)aNotification
+{
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
+ wasPaused = NO;
+}
+
+/* called periodically from the emulation thread */
+- (void)handleEvents
+{
+ /* only do a trylock here, since we're not interested in blocking,
+ and we can just handle events next time round */
+ if (pthread_mutex_trylock(&eventMutex) == 0) {
+ while (safeEvent) {
+ if (safeEvent & EMUEVENT_STOP) {
+ /* signify that the emulation has stopped */
+ [emuThread autorelease];
+ emuThread = nil;
+ paused = NO;
+
+ /* better unlock the mutex before killing ourself */
+ pthread_mutex_unlock(&eventMutex);
+
+ ClosePlugins();
+ SysClose();
+
+ //[[NSThread currentThread] autorelease];
+ [NSThread exit];
+ return;
+ }
+
+ if (safeEvent & EMUEVENT_RESET) {
+#if 0
+ /* signify that the emulation has stopped */
+ [emuThread autorelease];
+ emuThread = nil;
+
+ /* better unlock the mutex before killing ourself */
+ pthread_mutex_unlock(&eventMutex);
+
+ ClosePlugins();
+
+ // start a new emulation thread
+ [EmuThread run];
+
+ //[[NSThread currentThread] autorelease];
+ [NSThread exit];
+ return;
+#else
+ safeEvent &= ~EMUEVENT_RESET;
+ pthread_mutex_unlock(&eventMutex);
+
+ longjmp(restartJmp, 0);
+#endif
+ }
+
+ if (safeEvent & EMUEVENT_PAUSE) {
+ paused = 2;
+ /* wait until we're signalled */
+ pthread_cond_wait(&eventCond, &eventMutex);
+ }
+ }
+ pthread_mutex_unlock(&eventMutex);
+ }
+}
+
++ (void)run
+{
+ int err;
+
+ if (emuThread) {
+ [EmuThread resume];
+ return;
+ }
+
+ if (pthread_mutex_lock(&eventMutex) != 0) {
+ err = pthread_cond_init(&eventCond, NULL);
+ if (err) return;
+
+ err = pthread_mutex_init(&eventMutex, NULL);
+ if (err) return;
+
+ pthread_mutex_lock(&eventMutex);
+ }
+
+ safeEvent = EMUEVENT_NONE;
+ paused = NO;
+ runbios = NO;
+
+ if (SysInit() != 0) {
+ pthread_mutex_unlock(&eventMutex);
+ return;
+ }
+
+ emuThread = [[EmuThread alloc] init];
+
+ [NSThread detachNewThreadSelector:@selector(EmuThreadRun:)
+ toTarget:emuThread withObject:nil];
+
+ pthread_mutex_unlock(&eventMutex);
+}
+
++ (void)runBios
+{
+ int err;
+
+ if (emuThread) {
+ [EmuThread resume];
+ return;
+ }
+
+ if (pthread_mutex_lock(&eventMutex) != 0) {
+ err = pthread_cond_init(&eventCond, NULL);
+ if (err) return;
+
+ err = pthread_mutex_init(&eventMutex, NULL);
+ if (err) return;
+
+ pthread_mutex_lock(&eventMutex);
+ }
+
+ safeEvent = EMUEVENT_NONE;
+ paused = NO;
+ runbios = YES;
+
+ if (SysInit() != 0) {
+ pthread_mutex_unlock(&eventMutex);
+ return;
+ }
+
+ emuThread = [[EmuThread alloc] init];
+
+ [NSThread detachNewThreadSelector:@selector(EmuThreadRunBios:)
+ toTarget:emuThread withObject:nil];
+
+ pthread_mutex_unlock(&eventMutex);
+}
+
++ (void)stop
+{
+ pthread_mutex_lock(&eventMutex);
+ safeEvent = EMUEVENT_STOP;
+ pthread_mutex_unlock(&eventMutex);
+
+ // wake it if it's sleeping
+ pthread_cond_broadcast(&eventCond);
+}
+
++ (BOOL)pause
+{
+ if (paused || ![EmuThread active])
+ return YES;
+
+ pthread_mutex_lock(&eventMutex);
+ safeEvent |= EMUEVENT_PAUSE;
+ paused = 1;
+ pthread_mutex_unlock(&eventMutex);
+
+ pthread_cond_broadcast(&eventCond);
+
+ return NO;
+}
+
++ (BOOL)pauseSafe
+{
+ if ((paused == 2) || ![EmuThread active])
+ return YES;
+
+ [EmuThread pause];
+ while ([EmuThread isPaused] != 2) [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:0.05]];
+
+ return NO;
+}
+
++ (void)resume
+{
+ if (!paused || ![EmuThread active])
+ return;
+
+ pthread_mutex_lock(&eventMutex);
+
+ safeEvent &= ~EMUEVENT_PAUSE;
+ paused = NO;
+ pthread_mutex_unlock(&eventMutex);
+
+ pthread_cond_broadcast(&eventCond);
+}
+
++ (void)reset
+{
+ pthread_mutex_lock(&eventMutex);
+ safeEvent = EMUEVENT_RESET;
+ pthread_mutex_unlock(&eventMutex);
+
+ pthread_cond_broadcast(&eventCond);
+}
+
+// must only be called from within the emulation thread!!!
++ (void)resetNow
+{
+ /* signify that the emulation has stopped */
+ [emuThread autorelease];
+ emuThread = nil;
+
+ ClosePlugins();
+
+ // start a new emulation thread
+ [EmuThread run];
+
+ //[[NSThread currentThread] autorelease];
+ [NSThread exit];
+ return;
+}
+
++ (BOOL)isPaused
+{
+ return paused;
+}
+
++ (BOOL)isRunBios
+{
+ return runbios;
+}
+
++ (BOOL)active
+{
+ return emuThread ? YES : NO;
+}
+
++ (void)freezeAt:(NSString *)path which:(int)num
+{
+ BOOL emuWasPaused = [EmuThread pauseSafe];
+ char Text[256];
+
+ GPU_freeze(2, (GPUFreeze_t *)&num);
+ int ret = SaveState([path fileSystemRepresentation]);
+ if (ret == 0) sprintf (Text, _("*PCSX*: Saved State %d"), num+1);
+ else sprintf (Text, _("*PCSX*: Error Saving State %d"), num+1);
+ GPU_displayText(Text);
+
+ if (!emuWasPaused) {
+ [EmuThread resume];
+ }
+}
+
++ (BOOL)defrostAt:(NSString *)path
+{
+ const char *cPath = [path fileSystemRepresentation];
+ if (CheckState(cPath) != 0)
+ return NO;
+
+ defrostPath = [path retain];
+ [EmuThread reset];
+
+ GPU_displayText(_("*PCSX*: Loaded State"));
+ return YES;
+}
+
+@end
diff --git a/macosx/English.lproj/AddPluginSheet.nib/classes.nib b/macosx/English.lproj/AddPluginSheet.nib/classes.nib
new file mode 100644
index 0000000..ae53771
--- /dev/null
+++ b/macosx/English.lproj/AddPluginSheet.nib/classes.nib
@@ -0,0 +1,14 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {closeAddPluginSheet = id; };
+ CLASS = PcsxPluginDocument;
+ LANGUAGE = ObjC;
+ OUTLETS = {addPluginSheet = NSWindow; pluginName = NSTextField; };
+ SUPERCLASS = NSDocument;
+ },
+ {CLASS = "java.lang.Object"; LANGUAGE = Java; }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/English.lproj/AddPluginSheet.nib/info.nib b/macosx/English.lproj/AddPluginSheet.nib/info.nib
new file mode 100644
index 0000000..3af05e0
--- /dev/null
+++ b/macosx/English.lproj/AddPluginSheet.nib/info.nib
@@ -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>IBDocumentLocation</key>
+ <string>69 10 356 240 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>364.0</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>10</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>7H63</string>
+</dict>
+</plist>
diff --git a/macosx/English.lproj/AddPluginSheet.nib/keyedobjects.nib b/macosx/English.lproj/AddPluginSheet.nib/keyedobjects.nib
new file mode 100644
index 0000000..60ed72e
--- /dev/null
+++ b/macosx/English.lproj/AddPluginSheet.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/English.lproj/Configuration.nib/classes.nib b/macosx/English.lproj/Configuration.nib/classes.nib
new file mode 100644
index 0000000..1198eea
--- /dev/null
+++ b/macosx/English.lproj/Configuration.nib/classes.nib
@@ -0,0 +1,49 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {
+ mcdChangeClicked = id;
+ mcdNewClicked = id;
+ setCheckbox = id;
+ setCheckboxInverse = id;
+ setVideoType = id;
+ };
+ CLASS = ConfigurationController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ autoVTypeCell = id;
+ bwMdecCell = id;
+ cdromPlugin = PluginController;
+ consoleOutputCell = id;
+ graphicsPlugin = PluginController;
+ mcd1Label = NSTextField;
+ mcd2Label = NSTextField;
+ noCDAudioCell = id;
+ noXaAudioCell = id;
+ padPlugin = PluginController;
+ rCountFixCell = id;
+ sioIrqAlwaysCell = id;
+ soundPlugin = PluginController;
+ spuIrqAlwaysCell = id;
+ usesDynarecCell = id;
+ usesHleCell = id;
+ vSyncWAFixCell = id;
+ vTypePALCell = id;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {doAbout = id; doConfigure = id; selectPlugin = id; };
+ CLASS = PluginController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ aboutButton = NSButton;
+ configureButton = NSButton;
+ pluginMenu = NSPopUpButton;
+ };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/English.lproj/Configuration.nib/info.nib b/macosx/English.lproj/Configuration.nib/info.nib
new file mode 100644
index 0000000..aefee7b
--- /dev/null
+++ b/macosx/English.lproj/Configuration.nib/info.nib
@@ -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>187 160 486 240 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBLockedObjects</key>
+ <array/>
+ <key>IBLockedTabItems</key>
+ <array>
+ <integer>240</integer>
+ </array>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>21</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/English.lproj/Configuration.nib/objects.nib b/macosx/English.lproj/Configuration.nib/objects.nib
new file mode 100644
index 0000000..7110388
--- /dev/null
+++ b/macosx/English.lproj/Configuration.nib/objects.nib
Binary files differ
diff --git a/macosx/English.lproj/Credits.rtf b/macosx/English.lproj/Credits.rtf
new file mode 100644
index 0000000..a7870f8
--- /dev/null
+++ b/macosx/English.lproj/Credits.rtf
@@ -0,0 +1,28 @@
+{\rtf1\mac\ansicpg10000\cocoartf102
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Macintosh Port:
+\f1\b0 \
+ Gil Pedersen\
+\
+
+\f0\b Icon Design:
+\f1\b0 \
+ Romain Lafourcade\
+\
+
+\f0\b Original Coders:
+\f1\b0 \
+ Linuzappz\
+ Shadow\
+ Pete Bernert\
+ NoComp\
+ Nik3d\
+\
+
+\f0\b Macintosh Testing:
+\f1\b0 \
+ Richard Banister\
+ Many others} \ No newline at end of file
diff --git a/macosx/English.lproj/InfoPlist.strings b/macosx/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..4c55ed9
--- /dev/null
+++ b/macosx/English.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* Localized versions of Info.plist keys */
+
+CFBundleName = "PCSX";
+CFBundleShortVersionString = "PCSX-Reloaded";
+CFBundleGetInfoString = "Playstation Emulator based on PCSX-df Project.";
+NSHumanReadableCopyright = "Copyright (c) 2003-2005 PCSX Team, Gil Pedersen.\nCopyright (c) 2009-2010 PCSX-Reloaded Team.";
diff --git a/macosx/English.lproj/PCSX.nib/classes.nib b/macosx/English.lproj/PCSX.nib/classes.nib
new file mode 100644
index 0000000..4b25fcc
--- /dev/null
+++ b/macosx/English.lproj/PCSX.nib/classes.nib
@@ -0,0 +1,25 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {
+ defrost = id;
+ ejectCD = id;
+ freeze = id;
+ fullscreen = id;
+ pause = id;
+ preferences = id;
+ reset = id;
+ runBios = id;
+ runCD = id;
+ runExe = id;
+ runIso = id;
+ };
+ CLASS = PcsxController;
+ LANGUAGE = ObjC;
+ OUTLETS = {memCardWindow = NSWindow; preferenceWindow = NSWindow; };
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/English.lproj/PCSX.nib/info.nib b/macosx/English.lproj/PCSX.nib/info.nib
new file mode 100644
index 0000000..a5d6a49
--- /dev/null
+++ b/macosx/English.lproj/PCSX.nib/info.nib
@@ -0,0 +1,21 @@
+<?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>442 353 492 320 0 0 1024 746 </string>
+ <key>IBEditorPositions</key>
+ <dict>
+ <key>29</key>
+ <string>134 613 219 44 0 0 1024 746 </string>
+ </dict>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>29</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/English.lproj/PCSX.nib/objects.nib b/macosx/English.lproj/PCSX.nib/objects.nib
new file mode 100644
index 0000000..cd38d74
--- /dev/null
+++ b/macosx/English.lproj/PCSX.nib/objects.nib
Binary files differ
diff --git a/macosx/ExtendedKeys.h b/macosx/ExtendedKeys.h
new file mode 100644
index 0000000..1b6475b
--- /dev/null
+++ b/macosx/ExtendedKeys.h
@@ -0,0 +1,23 @@
+
+#ifndef __EXTENDED_KEYS_H__
+#define __EXTENDED_KEYS_H__
+
+enum {
+ PSX_FREEZE_KEY = 0xFFBE/*XK_F1*/,
+ PSX_NEXT_FREEZE_SLOT_KEY = 0xFFBF/*XK_F2*/,
+ PSX_DEFROST_KEY = 0xFFC0/*XK_F3*/,
+ PSX_SHOW_FREEZE_PIC_KEY = 0xFFC1/*XK_F4*/,
+ PSX_SIO_ALWAYS_ON_KEY = 0xFFC2/*XK_F5*/,
+ PSX_BW_MDEC_KEY = 0xFFC3/*XK_F6*/,
+ PSX_XA_AUDIO_ON_KEY = 0xFFC4/*XK_F7*/,
+ PSX_SNAPSHOT_KEY = 0xFFC5/*XK_F8*/,
+ PSX_OPEN_SHELL_KEY = 0xFFC6/*XK_F9*/,
+ PSX_CLOSE_SHELL_KEY = 0xFFC7/*XK_F10*/,
+
+ PSX_STOP_KEY = 0xFF1B/*XK_Escape*/,
+
+ GPU_FULLSCREEN_KEY = 0x0100,
+ GPU_FPS_DISPLAY_KEY = 0xFFFF/*XK_Delete*/
+};
+
+#endif //__EXTENDED_KEYS_H__
diff --git a/macosx/Info.plist b/macosx/Info.plist
new file mode 100644
index 0000000..9aa3f68
--- /dev/null
+++ b/macosx/Info.plist
@@ -0,0 +1,107 @@
+<?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>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>psxplugin</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>psxplugin.icns</string>
+ <key>CFBundleTypeName</key>
+ <string>Playstation Emulator Plug-in</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>PsxP</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
+ <true/>
+ <key>NSDocumentClass</key>
+ <string>PcsxPluginDocument</string>
+ </dict>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>bin</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>psxbios.icns</string>
+ <key>CFBundleTypeName</key>
+ <string>Playstation BIOS Image</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>PsxB</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>mcr</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>pcsxmemcard</string>
+ <key>CFBundleTypeName</key>
+ <string>PCSX Memory Card</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>Pmcr</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>pcsxstate</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>pcsxfreeze</string>
+ <key>CFBundleTypeName</key>
+ <string>PCSX Freeze State</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>Pfrz</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
+ <false/>
+ </dict>
+ </array>
+ <key>CFBundleExecutable</key>
+ <string>PCSX</string>
+ <key>CFBundleIconFile</key>
+ <string>PCSX.icns</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.codeplex.pcsxr</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>PCSX</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>PCSX-Reloaded 1.9.92</string>
+ <key>CFBundleSignature</key>
+ <string>Pcsx</string>
+ <key>CFBundleVersion</key>
+ <string>1.9.92</string>
+ <key>NSMainNibFile</key>
+ <string>PCSX.nib</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
diff --git a/macosx/Pcsx.xcodeproj/project.pbxproj b/macosx/Pcsx.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0d17374
--- /dev/null
+++ b/macosx/Pcsx.xcodeproj/project.pbxproj
@@ -0,0 +1,934 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2B143D06078A2CBD00AF745A /* PCSX.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2B143D01078A2CBD00AF745A /* PCSX.icns */; };
+ 2B143D07078A2CBD00AF745A /* pcsxfreeze.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2B143D02078A2CBD00AF745A /* pcsxfreeze.icns */; };
+ 2B143D08078A2CBD00AF745A /* pcsxmemcard.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2B143D03078A2CBD00AF745A /* pcsxmemcard.icns */; };
+ 2B143D09078A2CBD00AF745A /* psxbios.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2B143D04078A2CBD00AF745A /* psxbios.icns */; };
+ 2B143D0A078A2CBD00AF745A /* psxplugin.icns in Resources */ = {isa = PBXBuildFile; fileRef = 2B143D05078A2CBD00AF745A /* psxplugin.icns */; };
+ 2B3E356C06937D1C00763C7D /* PcsxPluginDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B3E356A06937D1C00763C7D /* PcsxPluginDocument.h */; };
+ 2B3E356D06937D1C00763C7D /* PcsxPluginDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B3E356B06937D1C00763C7D /* PcsxPluginDocument.m */; };
+ 2B3E35BC069384D100763C7D /* AddPluginSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2B3E35BA069384D100763C7D /* AddPluginSheet.nib */; };
+ 2B400D910789F58A00BA271E /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B02C04304E145D000880C5B /* Carbon.framework */; };
+ 2B4DE99105FF9307003EFEF0 /* PluginController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B4DE98D05FF9307003EFEF0 /* PluginController.h */; };
+ 2B4DE99205FF9307003EFEF0 /* PluginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B4DE98E05FF9307003EFEF0 /* PluginController.m */; };
+ 2BB3D69D05427FE200831ACB /* PcsxController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B75FD3C051C56D200D12034 /* PcsxController.h */; };
+ 2BB3D69E05427FE200831ACB /* ConfigurationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B75FD4A051C8A7400D12034 /* ConfigurationController.h */; };
+ 2BB3D69F05427FE200831ACB /* PluginList.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BBB1126051DC00500B84448 /* PluginList.h */; };
+ 2BB3D6A005427FE200831ACB /* EmuThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BBB1791051E113B00B84448 /* EmuThread.h */; };
+ 2BB3D6A105427FE200831ACB /* PcsxPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BA44360052DB2EA00E21DDD /* PcsxPlugin.h */; };
+ 2BB3D6A305427FE200831ACB /* Configuration.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2BA178B00514CE260026D74D /* Configuration.nib */; };
+ 2BB3D6A405427FE200831ACB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2BA178B20514CE260026D74D /* InfoPlist.strings */; };
+ 2BB3D6A505427FE200831ACB /* PCSX.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2BA178B40514CE260026D74D /* PCSX.nib */; };
+ 2BB3D6A705427FE200831ACB /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2BBB1786051E0D9700B84448 /* Credits.rtf */; };
+ 2BB3D6BE05427FE200831ACB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BA178A505148D9D0026D74D /* main.m */; };
+ 2BB3D6BF05427FE200831ACB /* PcsxController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B75FD3D051C56D200D12034 /* PcsxController.m */; };
+ 2BB3D6C005427FE200831ACB /* ConfigurationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B75FD4B051C8A7400D12034 /* ConfigurationController.m */; };
+ 2BB3D6C105427FE200831ACB /* PluginList.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BBB1127051DC00500B84448 /* PluginList.m */; };
+ 2BB3D6C205427FE200831ACB /* EmuThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BBB1792051E113B00B84448 /* EmuThread.m */; };
+ 2BB3D6C305427FE200831ACB /* Plugin.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BBB17DA051E4D0F00B84448 /* Plugin.c */; };
+ 2BB3D6C405427FE200831ACB /* PcsxPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BA44361052DB2EA00E21DDD /* PcsxPlugin.m */; };
+ 2BB3D6C605427FE200831ACB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BC4786204C7FD3600CAB520 /* Cocoa.framework */; };
+ 2BB3D6C705427FE200831ACB /* System.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B6E8AAE04C832040017A3B1 /* System.framework */; };
+ 2BB3D6C805427FE200831ACB /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B6E8AB404C8327C0017A3B1 /* IOKit.framework */; };
+ 712FD1E81093096F00575A92 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 712FD1E51093096F00575A92 /* debug.c */; };
+ 712FD1E91093096F00575A92 /* socket.c in Sources */ = {isa = PBXBuildFile; fileRef = 712FD1E61093096F00575A92 /* socket.c */; };
+ 712FD1EA1093096F00575A92 /* socket.h in Headers */ = {isa = PBXBuildFile; fileRef = 712FD1E71093096F00575A92 /* socket.h */; };
+ 713B530E110B75650002F164 /* ppf.c in Sources */ = {isa = PBXBuildFile; fileRef = 713B530C110B75650002F164 /* ppf.c */; };
+ 713B530F110B75650002F164 /* ppf.h in Headers */ = {isa = PBXBuildFile; fileRef = 713B530D110B75650002F164 /* ppf.h */; };
+ 713CB2E411FC49DA0033B6A8 /* DFCdrom.psxplugin in Copy PlugIns */ = {isa = PBXBuildFile; fileRef = 71F93F6C11FB8E9D007A5A7C /* DFCdrom.psxplugin */; };
+ 7161C2820FDED6D000225F97 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 7161C2810FDED6D000225F97 /* config.h */; };
+ 7161C2980FDED75300225F97 /* ExtendedKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 7161C2970FDED75300225F97 /* ExtendedKeys.h */; };
+ 719594B111AEFE8C004AD686 /* gte_divider.h in Headers */ = {isa = PBXBuildFile; fileRef = 719594AF11AEFE8C004AD686 /* gte_divider.h */; };
+ 719594B211AEFE8C004AD686 /* psxcommon.c in Sources */ = {isa = PBXBuildFile; fileRef = 719594B011AEFE8C004AD686 /* psxcommon.c */; };
+ 71AD2DF410C3575300365243 /* PeopsSPU.psxplugin in Copy PlugIns */ = {isa = PBXBuildFile; fileRef = 71AD2DD110C356FD00365243 /* PeopsSPU.psxplugin */; };
+ 71AD2DF510C3575C00365243 /* PeopsSoftGL.psxplugin in Copy PlugIns */ = {isa = PBXBuildFile; fileRef = 71AD2DDC10C3570900365243 /* PeopsSoftGL.psxplugin */; };
+ 71F2C0881200B6B000322AD9 /* DFInput.psxplugin in Copy PlugIns */ = {isa = PBXBuildFile; fileRef = 71F2C0861200B69B00322AD9 /* DFInput.psxplugin */; };
+ 71F4C5890FDED12800529849 /* cdriso.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5600FDED12800529849 /* cdriso.c */; };
+ 71F4C58A0FDED12800529849 /* cdriso.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5610FDED12800529849 /* cdriso.h */; };
+ 71F4C58B0FDED12800529849 /* cdrom.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5620FDED12800529849 /* cdrom.c */; };
+ 71F4C58C0FDED12800529849 /* cdrom.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5630FDED12800529849 /* cdrom.h */; };
+ 71F4C58D0FDED12800529849 /* cheat.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5640FDED12800529849 /* cheat.c */; };
+ 71F4C58E0FDED12800529849 /* cheat.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5650FDED12800529849 /* cheat.h */; };
+ 71F4C58F0FDED12800529849 /* coff.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5660FDED12800529849 /* coff.h */; };
+ 71F4C5900FDED12800529849 /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5670FDED12800529849 /* debug.h */; };
+ 71F4C5910FDED12800529849 /* decode_xa.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5680FDED12800529849 /* decode_xa.c */; };
+ 71F4C5920FDED12800529849 /* decode_xa.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5690FDED12800529849 /* decode_xa.h */; };
+ 71F4C5930FDED12800529849 /* disr3000a.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C56A0FDED12800529849 /* disr3000a.c */; };
+ 71F4C5940FDED12800529849 /* gte.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C56B0FDED12800529849 /* gte.c */; };
+ 71F4C5950FDED12800529849 /* gte.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C56C0FDED12800529849 /* gte.h */; };
+ 71F4C5960FDED12800529849 /* mdec.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C56D0FDED12800529849 /* mdec.c */; };
+ 71F4C5970FDED12800529849 /* mdec.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C56E0FDED12800529849 /* mdec.h */; };
+ 71F4C5980FDED12800529849 /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C56F0FDED12800529849 /* misc.c */; };
+ 71F4C5990FDED12800529849 /* misc.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5700FDED12800529849 /* misc.h */; };
+ 71F4C59A0FDED12800529849 /* plugins.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5710FDED12800529849 /* plugins.c */; };
+ 71F4C59B0FDED12800529849 /* plugins.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5720FDED12800529849 /* plugins.h */; };
+ 71F4C59C0FDED12800529849 /* psemu_plugin_defs.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5730FDED12800529849 /* psemu_plugin_defs.h */; };
+ 71F4C59D0FDED12800529849 /* psxbios.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5740FDED12800529849 /* psxbios.c */; };
+ 71F4C59E0FDED12800529849 /* psxbios.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5750FDED12800529849 /* psxbios.h */; };
+ 71F4C59F0FDED12800529849 /* psxcommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5760FDED12800529849 /* psxcommon.h */; };
+ 71F4C5A00FDED12800529849 /* psxcounters.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5770FDED12800529849 /* psxcounters.c */; };
+ 71F4C5A10FDED12800529849 /* psxcounters.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5780FDED12800529849 /* psxcounters.h */; };
+ 71F4C5A20FDED12800529849 /* psxdma.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5790FDED12800529849 /* psxdma.c */; };
+ 71F4C5A30FDED12800529849 /* psxdma.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C57A0FDED12800529849 /* psxdma.h */; };
+ 71F4C5A40FDED12800529849 /* psxhle.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C57B0FDED12800529849 /* psxhle.c */; };
+ 71F4C5A50FDED12800529849 /* psxhle.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C57C0FDED12800529849 /* psxhle.h */; };
+ 71F4C5A60FDED12800529849 /* psxhw.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C57D0FDED12800529849 /* psxhw.c */; };
+ 71F4C5A70FDED12800529849 /* psxhw.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C57E0FDED12800529849 /* psxhw.h */; };
+ 71F4C5A80FDED12800529849 /* psxinterpreter.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C57F0FDED12800529849 /* psxinterpreter.c */; };
+ 71F4C5A90FDED12800529849 /* psxmem.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5800FDED12800529849 /* psxmem.c */; };
+ 71F4C5AA0FDED12800529849 /* psxmem.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5810FDED12800529849 /* psxmem.h */; };
+ 71F4C5AB0FDED12800529849 /* r3000a.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5820FDED12800529849 /* r3000a.c */; };
+ 71F4C5AC0FDED12800529849 /* r3000a.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5830FDED12800529849 /* r3000a.h */; };
+ 71F4C5AD0FDED12800529849 /* sio.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5840FDED12800529849 /* sio.c */; };
+ 71F4C5AE0FDED12800529849 /* sio.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5850FDED12800529849 /* sio.h */; };
+ 71F4C5AF0FDED12800529849 /* spu.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5860FDED12800529849 /* spu.c */; };
+ 71F4C5B00FDED12800529849 /* spu.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5870FDED12800529849 /* spu.h */; };
+ 71F4C5B10FDED12800529849 /* system.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5880FDED12800529849 /* system.h */; };
+ 71F4C5B80FDED16D00529849 /* iGte.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5B40FDED16D00529849 /* iGte.h */; };
+ 71F4C5B90FDED16D00529849 /* iR3000A.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5B50FDED16D00529849 /* iR3000A.c */; };
+ 71F4C5BA0FDED16D00529849 /* ix86.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F4C5B60FDED16D00529849 /* ix86.c */; };
+ 71F4C5BB0FDED16D00529849 /* ix86.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F4C5B70FDED16D00529849 /* ix86.h */; };
+ 71F703A711B3A673007DD5C5 /* sjisfont.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F703A611B3A673007DD5C5 /* sjisfont.h */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXBuildRule section */
+ 2BB3D6D005427FE200831ACB /* PBXBuildRule */ = {
+ isa = PBXBuildRule;
+ compilerSpec = com.apple.compilers.gcc;
+ fileType = sourcecode.c;
+ isEditable = 1;
+ outputFiles = (
+ );
+ };
+ 2BD707B705559AE300CB5D9B /* PBXBuildRule */ = {
+ isa = PBXBuildRule;
+ compilerSpec = com.apple.compilers.gcc;
+ filePatterns = pasm.s;
+ fileType = sourcecode.asm;
+ isEditable = 1;
+ outputFiles = (
+ "$(DERIVED_FILES_DIR)/$(INPUT_FILE_BASE).o",
+ );
+ script = "as -o $(DERIVED_FILES_DIR)/$(INPUT_FILE_BASE).o $(INPUT_FILE_PATH)";
+ };
+/* End PBXBuildRule section */
+
+/* Begin PBXContainerItemProxy section */
+ 713CB2DD11FC49720033B6A8 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71F93F6311FB8E9D007A5A7C /* DFCdrom.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 8D57630D048677EA00EA77CD;
+ remoteInfo = DFCdrom;
+ };
+ 71AD2DD010C356FD00365243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71AD2DC710C356FD00365243 /* PeopsSPU.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8D576316048677EA00EA77CD;
+ remoteInfo = PeopsSPU;
+ };
+ 71AD2DDB10C3570900365243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71AD2DD210C3570900365243 /* PeopsSoftGPU.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 2BAF50930632BB1A00DB9A16;
+ remoteInfo = gpuPeopsSoftGL;
+ };
+ 71AD2DE810C3572200365243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71AD2DC710C356FD00365243 /* PeopsSPU.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 8D57630D048677EA00EA77CD;
+ remoteInfo = PeopsSPU;
+ };
+ 71AD2DEA10C3572500365243 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71AD2DD210C3570900365243 /* PeopsSoftGPU.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 2BAF50920632BB1A00DB9A16;
+ remoteInfo = gpuPeopsSoftGL;
+ };
+ 71F2C0851200B69B00322AD9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71F2C07E1200B69B00322AD9 /* DFInput.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8D576316048677EA00EA77CD;
+ remoteInfo = DFInput;
+ };
+ 71F2C0BB1200B75100322AD9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71F2C07E1200B69B00322AD9 /* DFInput.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 8D57630D048677EA00EA77CD;
+ remoteInfo = DFInput;
+ };
+ 71F93F6B11FB8E9D007A5A7C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 71F93F6311FB8E9D007A5A7C /* DFCdrom.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 8D576316048677EA00EA77CD;
+ remoteInfo = DFCdrom;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 71AD2DF010C3573400365243 /* Copy PlugIns */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 71F2C0881200B6B000322AD9 /* DFInput.psxplugin in Copy PlugIns */,
+ 713CB2E411FC49DA0033B6A8 /* DFCdrom.psxplugin in Copy PlugIns */,
+ 71AD2DF510C3575C00365243 /* PeopsSoftGL.psxplugin in Copy PlugIns */,
+ 71AD2DF410C3575300365243 /* PeopsSPU.psxplugin in Copy PlugIns */,
+ );
+ name = "Copy PlugIns";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 2B02C04304E145D000880C5B /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ 2B143D01078A2CBD00AF745A /* PCSX.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = PCSX.icns; sourceTree = "<group>"; };
+ 2B143D02078A2CBD00AF745A /* pcsxfreeze.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = pcsxfreeze.icns; sourceTree = "<group>"; };
+ 2B143D03078A2CBD00AF745A /* pcsxmemcard.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = pcsxmemcard.icns; sourceTree = "<group>"; };
+ 2B143D04078A2CBD00AF745A /* psxbios.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = psxbios.icns; sourceTree = "<group>"; };
+ 2B143D05078A2CBD00AF745A /* psxplugin.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = psxplugin.icns; sourceTree = "<group>"; };
+ 2B2189D204D96C7A00179945 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 2B3E356A06937D1C00763C7D /* PcsxPluginDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PcsxPluginDocument.h; sourceTree = "<group>"; };
+ 2B3E356B06937D1C00763C7D /* PcsxPluginDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PcsxPluginDocument.m; sourceTree = "<group>"; };
+ 2B3E35BB069384D100763C7D /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = AddPluginSheet.nib; sourceTree = "<group>"; };
+ 2B4DE98D05FF9307003EFEF0 /* PluginController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PluginController.h; sourceTree = "<group>"; };
+ 2B4DE98E05FF9307003EFEF0 /* PluginController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PluginController.m; sourceTree = "<group>"; };
+ 2B690C760635C65C00CDA575 /* ExceptionHandling.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExceptionHandling.framework; path = /System/Library/Frameworks/ExceptionHandling.framework; sourceTree = "<absolute>"; };
+ 2B6E8AAE04C832040017A3B1 /* System.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = System.framework; path = /System/Library/Frameworks/System.framework; sourceTree = "<absolute>"; };
+ 2B6E8AB404C8327C0017A3B1 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+ 2B75FD3C051C56D200D12034 /* PcsxController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PcsxController.h; sourceTree = "<group>"; };
+ 2B75FD3D051C56D200D12034 /* PcsxController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PcsxController.m; sourceTree = "<group>"; };
+ 2B75FD4A051C8A7400D12034 /* ConfigurationController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ConfigurationController.h; sourceTree = "<group>"; };
+ 2B75FD4B051C8A7400D12034 /* ConfigurationController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ConfigurationController.m; sourceTree = "<group>"; };
+ 2B976C00074C14B4007C050A /* Kernel.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kernel.framework; path = /System/Library/Frameworks/Kernel.framework; sourceTree = "<absolute>"; };
+ 2BA178A505148D9D0026D74D /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 2BA178B10514CE260026D74D /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = Configuration.nib; sourceTree = "<group>"; };
+ 2BA178B30514CE260026D74D /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = InfoPlist.strings; sourceTree = "<group>"; };
+ 2BA178B50514CE260026D74D /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = PCSX.nib; sourceTree = "<group>"; };
+ 2BA44360052DB2EA00E21DDD /* PcsxPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PcsxPlugin.h; sourceTree = "<group>"; };
+ 2BA44361052DB2EA00E21DDD /* PcsxPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = PcsxPlugin.m; sourceTree = "<group>"; tabWidth = 4; usesTabs = 0; };
+ 2BB3D6CF05427FE200831ACB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Info.plist; sourceTree = "<group>"; };
+ 2BB3D6D105427FE200831ACB /* PCSX.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = PCSX.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2BBB1126051DC00500B84448 /* PluginList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginList.h; sourceTree = "<group>"; };
+ 2BBB1127051DC00500B84448 /* PluginList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PluginList.m; sourceTree = "<group>"; };
+ 2BBB1787051E0D9700B84448 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = Credits.rtf; sourceTree = "<group>"; };
+ 2BBB1791051E113B00B84448 /* EmuThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmuThread.h; sourceTree = "<group>"; };
+ 2BBB1792051E113B00B84448 /* EmuThread.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmuThread.m; sourceTree = "<group>"; };
+ 2BBB17DA051E4D0F00B84448 /* Plugin.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; path = Plugin.c; sourceTree = SOURCE_ROOT; };
+ 2BC4786204C7FD3600CAB520 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 712FD1E51093096F00575A92 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = debug.c; path = ../libpcsxcore/debug.c; sourceTree = SOURCE_ROOT; };
+ 712FD1E61093096F00575A92 /* socket.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = socket.c; path = ../libpcsxcore/socket.c; sourceTree = SOURCE_ROOT; };
+ 712FD1E71093096F00575A92 /* socket.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = socket.h; path = ../libpcsxcore/socket.h; sourceTree = SOURCE_ROOT; };
+ 713B530C110B75650002F164 /* ppf.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = ppf.c; path = ../libpcsxcore/ppf.c; sourceTree = SOURCE_ROOT; };
+ 713B530D110B75650002F164 /* ppf.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = ppf.h; path = ../libpcsxcore/ppf.h; sourceTree = SOURCE_ROOT; };
+ 7161C2810FDED6D000225F97 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+ 7161C2970FDED75300225F97 /* ExtendedKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtendedKeys.h; sourceTree = "<group>"; };
+ 719594AF11AEFE8C004AD686 /* gte_divider.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = gte_divider.h; path = ../libpcsxcore/gte_divider.h; sourceTree = SOURCE_ROOT; };
+ 719594B011AEFE8C004AD686 /* psxcommon.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = psxcommon.c; path = ../libpcsxcore/psxcommon.c; sourceTree = SOURCE_ROOT; };
+ 71AD2DC710C356FD00365243 /* PeopsSPU.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PeopsSPU.xcodeproj; path = plugins/DFSound/PeopsSPU.xcodeproj; sourceTree = SOURCE_ROOT; };
+ 71AD2DD210C3570900365243 /* PeopsSoftGPU.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PeopsSoftGPU.xcodeproj; path = plugins/DFXVideo/PeopsSoftGPU.xcodeproj; sourceTree = SOURCE_ROOT; };
+ 71F2C07E1200B69B00322AD9 /* DFInput.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DFInput.xcodeproj; path = plugins/DFInput/DFInput.xcodeproj; sourceTree = "<group>"; };
+ 71F4C5600FDED12800529849 /* cdriso.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cdriso.c; path = ../libpcsxcore/cdriso.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5610FDED12800529849 /* cdriso.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cdriso.h; path = ../libpcsxcore/cdriso.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5620FDED12800529849 /* cdrom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cdrom.c; path = ../libpcsxcore/cdrom.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5630FDED12800529849 /* cdrom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cdrom.h; path = ../libpcsxcore/cdrom.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5640FDED12800529849 /* cheat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cheat.c; path = ../libpcsxcore/cheat.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5650FDED12800529849 /* cheat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cheat.h; path = ../libpcsxcore/cheat.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5660FDED12800529849 /* coff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coff.h; path = ../libpcsxcore/coff.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5670FDED12800529849 /* debug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = debug.h; path = ../libpcsxcore/debug.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5680FDED12800529849 /* decode_xa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = decode_xa.c; path = ../libpcsxcore/decode_xa.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5690FDED12800529849 /* decode_xa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = decode_xa.h; path = ../libpcsxcore/decode_xa.h; sourceTree = SOURCE_ROOT; };
+ 71F4C56A0FDED12800529849 /* disr3000a.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = disr3000a.c; path = ../libpcsxcore/disr3000a.c; sourceTree = SOURCE_ROOT; };
+ 71F4C56B0FDED12800529849 /* gte.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gte.c; path = ../libpcsxcore/gte.c; sourceTree = SOURCE_ROOT; };
+ 71F4C56C0FDED12800529849 /* gte.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gte.h; path = ../libpcsxcore/gte.h; sourceTree = SOURCE_ROOT; };
+ 71F4C56D0FDED12800529849 /* mdec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mdec.c; path = ../libpcsxcore/mdec.c; sourceTree = SOURCE_ROOT; };
+ 71F4C56E0FDED12800529849 /* mdec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mdec.h; path = ../libpcsxcore/mdec.h; sourceTree = SOURCE_ROOT; };
+ 71F4C56F0FDED12800529849 /* misc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = misc.c; path = ../libpcsxcore/misc.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5700FDED12800529849 /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../libpcsxcore/misc.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5710FDED12800529849 /* plugins.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = plugins.c; path = ../libpcsxcore/plugins.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5720FDED12800529849 /* plugins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plugins.h; path = ../libpcsxcore/plugins.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5730FDED12800529849 /* psemu_plugin_defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psemu_plugin_defs.h; path = ../libpcsxcore/psemu_plugin_defs.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5740FDED12800529849 /* psxbios.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxbios.c; path = ../libpcsxcore/psxbios.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5750FDED12800529849 /* psxbios.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxbios.h; path = ../libpcsxcore/psxbios.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5760FDED12800529849 /* psxcommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxcommon.h; path = ../libpcsxcore/psxcommon.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5770FDED12800529849 /* psxcounters.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxcounters.c; path = ../libpcsxcore/psxcounters.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5780FDED12800529849 /* psxcounters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxcounters.h; path = ../libpcsxcore/psxcounters.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5790FDED12800529849 /* psxdma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxdma.c; path = ../libpcsxcore/psxdma.c; sourceTree = SOURCE_ROOT; };
+ 71F4C57A0FDED12800529849 /* psxdma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxdma.h; path = ../libpcsxcore/psxdma.h; sourceTree = SOURCE_ROOT; };
+ 71F4C57B0FDED12800529849 /* psxhle.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxhle.c; path = ../libpcsxcore/psxhle.c; sourceTree = SOURCE_ROOT; };
+ 71F4C57C0FDED12800529849 /* psxhle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxhle.h; path = ../libpcsxcore/psxhle.h; sourceTree = SOURCE_ROOT; };
+ 71F4C57D0FDED12800529849 /* psxhw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxhw.c; path = ../libpcsxcore/psxhw.c; sourceTree = SOURCE_ROOT; };
+ 71F4C57E0FDED12800529849 /* psxhw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxhw.h; path = ../libpcsxcore/psxhw.h; sourceTree = SOURCE_ROOT; };
+ 71F4C57F0FDED12800529849 /* psxinterpreter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxinterpreter.c; path = ../libpcsxcore/psxinterpreter.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5800FDED12800529849 /* psxmem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = psxmem.c; path = ../libpcsxcore/psxmem.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5810FDED12800529849 /* psxmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psxmem.h; path = ../libpcsxcore/psxmem.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5820FDED12800529849 /* r3000a.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = r3000a.c; path = ../libpcsxcore/r3000a.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5830FDED12800529849 /* r3000a.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = r3000a.h; path = ../libpcsxcore/r3000a.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5840FDED12800529849 /* sio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sio.c; path = ../libpcsxcore/sio.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5850FDED12800529849 /* sio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sio.h; path = ../libpcsxcore/sio.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5860FDED12800529849 /* spu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = spu.c; path = ../libpcsxcore/spu.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5870FDED12800529849 /* spu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spu.h; path = ../libpcsxcore/spu.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5880FDED12800529849 /* system.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = system.h; path = ../libpcsxcore/system.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5B40FDED16D00529849 /* iGte.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iGte.h; path = ../libpcsxcore/ix86/iGte.h; sourceTree = SOURCE_ROOT; };
+ 71F4C5B50FDED16D00529849 /* iR3000A.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = iR3000A.c; path = ../libpcsxcore/ix86/iR3000A.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5B60FDED16D00529849 /* ix86.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ix86.c; path = ../libpcsxcore/ix86/ix86.c; sourceTree = SOURCE_ROOT; };
+ 71F4C5B70FDED16D00529849 /* ix86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ix86.h; path = ../libpcsxcore/ix86/ix86.h; sourceTree = SOURCE_ROOT; };
+ 71F703A611B3A673007DD5C5 /* sjisfont.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = sjisfont.h; path = ../libpcsxcore/sjisfont.h; sourceTree = SOURCE_ROOT; };
+ 71F93F6311FB8E9D007A5A7C /* DFCdrom.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = DFCdrom.xcodeproj; path = plugins/DFCdrom/DFCdrom.xcodeproj; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 2BB3D6C505427FE200831ACB /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2BB3D6C605427FE200831ACB /* Cocoa.framework in Frameworks */,
+ 2BB3D6C705427FE200831ACB /* System.framework in Frameworks */,
+ 2BB3D6C805427FE200831ACB /* IOKit.framework in Frameworks */,
+ 2B400D910789F58A00BA271E /* Carbon.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 0249A662FF388D9811CA2CEA /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 2B976C00074C14B4007C050A /* Kernel.framework */,
+ 2B02C04304E145D000880C5B /* Carbon.framework */,
+ 2BC4786204C7FD3600CAB520 /* Cocoa.framework */,
+ 2B6E8AAE04C832040017A3B1 /* System.framework */,
+ 2B6E8AB404C8327C0017A3B1 /* IOKit.framework */,
+ 2B2189D204D96C7A00179945 /* CoreFoundation.framework */,
+ 2B690C760635C65C00CDA575 /* ExceptionHandling.framework */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 08FB7794FE84155DC02AAC07 /* Pcsx */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB7795FE84155DC02AAC07 /* Source */,
+ 0249A662FF388D9811CA2CEA /* External Frameworks and Libraries */,
+ 1AB674ADFE9D54B511CA2CBB /* Products */,
+ 2BB3D6CF05427FE200831ACB /* Info.plist */,
+ );
+ name = Pcsx;
+ sourceTree = "<group>";
+ };
+ 08FB7795FE84155DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 2BCE23B204C6B52C007C2DA3 /* libpcsxcore */,
+ 2BC4787804C7FDBD00CAB520 /* MacOSX */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 1AB674ADFE9D54B511CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 2BBD6C1D04C893F500A83E33 /* PlugIns */,
+ 2BB3D6D105427FE200831ACB /* PCSX.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 2B143D00078A2CBD00AF745A /* icons */ = {
+ isa = PBXGroup;
+ children = (
+ 2B143D01078A2CBD00AF745A /* PCSX.icns */,
+ 2B143D02078A2CBD00AF745A /* pcsxfreeze.icns */,
+ 2B143D03078A2CBD00AF745A /* pcsxmemcard.icns */,
+ 2B143D04078A2CBD00AF745A /* psxbios.icns */,
+ 2B143D05078A2CBD00AF745A /* psxplugin.icns */,
+ );
+ path = icons;
+ sourceTree = "<group>";
+ };
+ 2BA178AD0514CE260026D74D /* English.lproj */ = {
+ isa = PBXGroup;
+ children = (
+ 2BBB1786051E0D9700B84448 /* Credits.rtf */,
+ 2BA178B00514CE260026D74D /* Configuration.nib */,
+ 2BA178B20514CE260026D74D /* InfoPlist.strings */,
+ 2BA178B40514CE260026D74D /* PCSX.nib */,
+ 2B3E35BA069384D100763C7D /* AddPluginSheet.nib */,
+ );
+ path = English.lproj;
+ sourceTree = "<group>";
+ };
+ 2BBD6C1D04C893F500A83E33 /* PlugIns */ = {
+ isa = PBXGroup;
+ children = (
+ 71F2C07E1200B69B00322AD9 /* DFInput.xcodeproj */,
+ 71F93F6311FB8E9D007A5A7C /* DFCdrom.xcodeproj */,
+ 71AD2DD210C3570900365243 /* PeopsSoftGPU.xcodeproj */,
+ 71AD2DC710C356FD00365243 /* PeopsSPU.xcodeproj */,
+ );
+ name = PlugIns;
+ sourceTree = "<group>";
+ };
+ 2BC4787804C7FDBD00CAB520 /* MacOSX */ = {
+ isa = PBXGroup;
+ children = (
+ 2BA178AD0514CE260026D74D /* English.lproj */,
+ 2B143D00078A2CBD00AF745A /* icons */,
+ 7161C2810FDED6D000225F97 /* config.h */,
+ 2BA178A505148D9D0026D74D /* main.m */,
+ 2BBB17DA051E4D0F00B84448 /* Plugin.c */,
+ 2B75FD3C051C56D200D12034 /* PcsxController.h */,
+ 2B75FD3D051C56D200D12034 /* PcsxController.m */,
+ 2B75FD4A051C8A7400D12034 /* ConfigurationController.h */,
+ 2B75FD4B051C8A7400D12034 /* ConfigurationController.m */,
+ 2B4DE98D05FF9307003EFEF0 /* PluginController.h */,
+ 2B4DE98E05FF9307003EFEF0 /* PluginController.m */,
+ 2BBB1791051E113B00B84448 /* EmuThread.h */,
+ 2BBB1792051E113B00B84448 /* EmuThread.m */,
+ 7161C2970FDED75300225F97 /* ExtendedKeys.h */,
+ 2BBB1126051DC00500B84448 /* PluginList.h */,
+ 2BBB1127051DC00500B84448 /* PluginList.m */,
+ 2BA44360052DB2EA00E21DDD /* PcsxPlugin.h */,
+ 2BA44361052DB2EA00E21DDD /* PcsxPlugin.m */,
+ 2B3E356A06937D1C00763C7D /* PcsxPluginDocument.h */,
+ 2B3E356B06937D1C00763C7D /* PcsxPluginDocument.m */,
+ );
+ name = MacOSX;
+ sourceTree = "<group>";
+ };
+ 2BCE23B204C6B52C007C2DA3 /* libpcsxcore */ = {
+ isa = PBXGroup;
+ children = (
+ 71F4C5B30FDED15800529849 /* ix86 */,
+ 71F4C5600FDED12800529849 /* cdriso.c */,
+ 71F4C5610FDED12800529849 /* cdriso.h */,
+ 71F4C5620FDED12800529849 /* cdrom.c */,
+ 71F4C5630FDED12800529849 /* cdrom.h */,
+ 71F4C5640FDED12800529849 /* cheat.c */,
+ 71F4C5650FDED12800529849 /* cheat.h */,
+ 71F4C5660FDED12800529849 /* coff.h */,
+ 712FD1E51093096F00575A92 /* debug.c */,
+ 71F4C5670FDED12800529849 /* debug.h */,
+ 71F4C5680FDED12800529849 /* decode_xa.c */,
+ 71F4C5690FDED12800529849 /* decode_xa.h */,
+ 71F4C56A0FDED12800529849 /* disr3000a.c */,
+ 71F4C56B0FDED12800529849 /* gte.c */,
+ 71F4C56C0FDED12800529849 /* gte.h */,
+ 719594AF11AEFE8C004AD686 /* gte_divider.h */,
+ 71F4C56D0FDED12800529849 /* mdec.c */,
+ 71F4C56E0FDED12800529849 /* mdec.h */,
+ 71F4C56F0FDED12800529849 /* misc.c */,
+ 71F4C5700FDED12800529849 /* misc.h */,
+ 71F4C5710FDED12800529849 /* plugins.c */,
+ 71F4C5720FDED12800529849 /* plugins.h */,
+ 713B530C110B75650002F164 /* ppf.c */,
+ 713B530D110B75650002F164 /* ppf.h */,
+ 71F4C5730FDED12800529849 /* psemu_plugin_defs.h */,
+ 71F4C5740FDED12800529849 /* psxbios.c */,
+ 71F4C5750FDED12800529849 /* psxbios.h */,
+ 719594B011AEFE8C004AD686 /* psxcommon.c */,
+ 71F4C5760FDED12800529849 /* psxcommon.h */,
+ 71F4C5770FDED12800529849 /* psxcounters.c */,
+ 71F4C5780FDED12800529849 /* psxcounters.h */,
+ 71F4C5790FDED12800529849 /* psxdma.c */,
+ 71F4C57A0FDED12800529849 /* psxdma.h */,
+ 71F4C57B0FDED12800529849 /* psxhle.c */,
+ 71F4C57C0FDED12800529849 /* psxhle.h */,
+ 71F4C57D0FDED12800529849 /* psxhw.c */,
+ 71F4C57E0FDED12800529849 /* psxhw.h */,
+ 71F4C57F0FDED12800529849 /* psxinterpreter.c */,
+ 71F4C5800FDED12800529849 /* psxmem.c */,
+ 71F4C5810FDED12800529849 /* psxmem.h */,
+ 71F4C5820FDED12800529849 /* r3000a.c */,
+ 71F4C5830FDED12800529849 /* r3000a.h */,
+ 71F4C5840FDED12800529849 /* sio.c */,
+ 71F4C5850FDED12800529849 /* sio.h */,
+ 71F703A611B3A673007DD5C5 /* sjisfont.h */,
+ 712FD1E61093096F00575A92 /* socket.c */,
+ 712FD1E71093096F00575A92 /* socket.h */,
+ 71F4C5860FDED12800529849 /* spu.c */,
+ 71F4C5870FDED12800529849 /* spu.h */,
+ 71F4C5880FDED12800529849 /* system.h */,
+ );
+ name = libpcsxcore;
+ sourceTree = "<group>";
+ };
+ 71AD2DCD10C356FD00365243 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 71AD2DD110C356FD00365243 /* PeopsSPU.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 71AD2DD810C3570900365243 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 71AD2DDC10C3570900365243 /* PeopsSoftGL.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 71F2C07F1200B69B00322AD9 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 71F2C0861200B69B00322AD9 /* DFInput.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 71F4C5B30FDED15800529849 /* ix86 */ = {
+ isa = PBXGroup;
+ children = (
+ 71F4C5B40FDED16D00529849 /* iGte.h */,
+ 71F4C5B50FDED16D00529849 /* iR3000A.c */,
+ 71F4C5B60FDED16D00529849 /* ix86.c */,
+ 71F4C5B70FDED16D00529849 /* ix86.h */,
+ );
+ name = ix86;
+ sourceTree = "<group>";
+ };
+ 71F93F6411FB8E9D007A5A7C /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 71F93F6C11FB8E9D007A5A7C /* DFCdrom.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 2BB3D68305427FE200831ACB /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2BB3D69D05427FE200831ACB /* PcsxController.h in Headers */,
+ 2BB3D69E05427FE200831ACB /* ConfigurationController.h in Headers */,
+ 2BB3D69F05427FE200831ACB /* PluginList.h in Headers */,
+ 2BB3D6A005427FE200831ACB /* EmuThread.h in Headers */,
+ 2BB3D6A105427FE200831ACB /* PcsxPlugin.h in Headers */,
+ 2B4DE99105FF9307003EFEF0 /* PluginController.h in Headers */,
+ 2B3E356C06937D1C00763C7D /* PcsxPluginDocument.h in Headers */,
+ 71F4C58A0FDED12800529849 /* cdriso.h in Headers */,
+ 71F4C58C0FDED12800529849 /* cdrom.h in Headers */,
+ 71F4C58E0FDED12800529849 /* cheat.h in Headers */,
+ 71F4C58F0FDED12800529849 /* coff.h in Headers */,
+ 71F4C5900FDED12800529849 /* debug.h in Headers */,
+ 71F4C5920FDED12800529849 /* decode_xa.h in Headers */,
+ 71F4C5950FDED12800529849 /* gte.h in Headers */,
+ 71F4C5970FDED12800529849 /* mdec.h in Headers */,
+ 71F4C5990FDED12800529849 /* misc.h in Headers */,
+ 71F4C59B0FDED12800529849 /* plugins.h in Headers */,
+ 71F4C59C0FDED12800529849 /* psemu_plugin_defs.h in Headers */,
+ 71F4C59E0FDED12800529849 /* psxbios.h in Headers */,
+ 71F4C59F0FDED12800529849 /* psxcommon.h in Headers */,
+ 71F4C5A10FDED12800529849 /* psxcounters.h in Headers */,
+ 71F4C5A30FDED12800529849 /* psxdma.h in Headers */,
+ 71F4C5A50FDED12800529849 /* psxhle.h in Headers */,
+ 71F4C5A70FDED12800529849 /* psxhw.h in Headers */,
+ 71F4C5AA0FDED12800529849 /* psxmem.h in Headers */,
+ 71F4C5AC0FDED12800529849 /* r3000a.h in Headers */,
+ 71F4C5AE0FDED12800529849 /* sio.h in Headers */,
+ 71F4C5B00FDED12800529849 /* spu.h in Headers */,
+ 71F4C5B10FDED12800529849 /* system.h in Headers */,
+ 71F4C5B80FDED16D00529849 /* iGte.h in Headers */,
+ 71F4C5BB0FDED16D00529849 /* ix86.h in Headers */,
+ 7161C2820FDED6D000225F97 /* config.h in Headers */,
+ 7161C2980FDED75300225F97 /* ExtendedKeys.h in Headers */,
+ 712FD1EA1093096F00575A92 /* socket.h in Headers */,
+ 713B530F110B75650002F164 /* ppf.h in Headers */,
+ 719594B111AEFE8C004AD686 /* gte_divider.h in Headers */,
+ 71F703A711B3A673007DD5C5 /* sjisfont.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 2BB3D68205427FE200831ACB /* PCSX */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 71F353F30FD98DFE00CBEC28 /* Build configuration list for PBXNativeTarget "PCSX" */;
+ buildPhases = (
+ 2BB3D68305427FE200831ACB /* Headers */,
+ 2BB3D6A205427FE200831ACB /* Resources */,
+ 2BB3D6A805427FE200831ACB /* Sources */,
+ 2BB3D6C505427FE200831ACB /* Frameworks */,
+ 2BB3D6CD05427FE200831ACB /* Rez */,
+ 71AD2DF010C3573400365243 /* Copy PlugIns */,
+ );
+ buildRules = (
+ 2BD707B705559AE300CB5D9B /* PBXBuildRule */,
+ 2BB3D6D005427FE200831ACB /* PBXBuildRule */,
+ );
+ dependencies = (
+ 71AD2DE910C3572200365243 /* PBXTargetDependency */,
+ 71AD2DEB10C3572500365243 /* PBXTargetDependency */,
+ 713CB2DE11FC49720033B6A8 /* PBXTargetDependency */,
+ 71F2C0BC1200B75100322AD9 /* PBXTargetDependency */,
+ );
+ name = PCSX;
+ productInstallPath = "$(USER_APPS_DIR)";
+ productName = "Pcsx-MacOSX";
+ productReference = 2BB3D6D105427FE200831ACB /* PCSX.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 08FB7793FE84155DC02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 71F353F80FD98DFE00CBEC28 /* Build configuration list for PBXProject "Pcsx" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 08FB7794FE84155DC02AAC07 /* Pcsx */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = 71F93F6411FB8E9D007A5A7C /* Products */;
+ ProjectRef = 71F93F6311FB8E9D007A5A7C /* DFCdrom.xcodeproj */;
+ },
+ {
+ ProductGroup = 71F2C07F1200B69B00322AD9 /* Products */;
+ ProjectRef = 71F2C07E1200B69B00322AD9 /* DFInput.xcodeproj */;
+ },
+ {
+ ProductGroup = 71AD2DD810C3570900365243 /* Products */;
+ ProjectRef = 71AD2DD210C3570900365243 /* PeopsSoftGPU.xcodeproj */;
+ },
+ {
+ ProductGroup = 71AD2DCD10C356FD00365243 /* Products */;
+ ProjectRef = 71AD2DC710C356FD00365243 /* PeopsSPU.xcodeproj */;
+ },
+ );
+ targets = (
+ 2BB3D68205427FE200831ACB /* PCSX */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ 71AD2DD110C356FD00365243 /* PeopsSPU.psxplugin */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.cfbundle;
+ path = PeopsSPU.psxplugin;
+ remoteRef = 71AD2DD010C356FD00365243 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 71AD2DDC10C3570900365243 /* PeopsSoftGL.psxplugin */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.cfbundle;
+ path = PeopsSoftGL.psxplugin;
+ remoteRef = 71AD2DDB10C3570900365243 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 71F2C0861200B69B00322AD9 /* DFInput.psxplugin */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.cfbundle;
+ path = DFInput.psxplugin;
+ remoteRef = 71F2C0851200B69B00322AD9 /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ 71F93F6C11FB8E9D007A5A7C /* DFCdrom.psxplugin */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.cfbundle;
+ path = DFCdrom.psxplugin;
+ remoteRef = 71F93F6B11FB8E9D007A5A7C /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 2BB3D6A205427FE200831ACB /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2BB3D6A305427FE200831ACB /* Configuration.nib in Resources */,
+ 2BB3D6A405427FE200831ACB /* InfoPlist.strings in Resources */,
+ 2BB3D6A505427FE200831ACB /* PCSX.nib in Resources */,
+ 2BB3D6A705427FE200831ACB /* Credits.rtf in Resources */,
+ 2B3E35BC069384D100763C7D /* AddPluginSheet.nib in Resources */,
+ 2B143D06078A2CBD00AF745A /* PCSX.icns in Resources */,
+ 2B143D07078A2CBD00AF745A /* pcsxfreeze.icns in Resources */,
+ 2B143D08078A2CBD00AF745A /* pcsxmemcard.icns in Resources */,
+ 2B143D09078A2CBD00AF745A /* psxbios.icns in Resources */,
+ 2B143D0A078A2CBD00AF745A /* psxplugin.icns in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+ 2BB3D6CD05427FE200831ACB /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 2BB3D6A805427FE200831ACB /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2BB3D6BE05427FE200831ACB /* main.m in Sources */,
+ 2BB3D6BF05427FE200831ACB /* PcsxController.m in Sources */,
+ 2BB3D6C005427FE200831ACB /* ConfigurationController.m in Sources */,
+ 2BB3D6C105427FE200831ACB /* PluginList.m in Sources */,
+ 2BB3D6C205427FE200831ACB /* EmuThread.m in Sources */,
+ 2BB3D6C305427FE200831ACB /* Plugin.c in Sources */,
+ 2BB3D6C405427FE200831ACB /* PcsxPlugin.m in Sources */,
+ 2B4DE99205FF9307003EFEF0 /* PluginController.m in Sources */,
+ 2B3E356D06937D1C00763C7D /* PcsxPluginDocument.m in Sources */,
+ 71F4C5890FDED12800529849 /* cdriso.c in Sources */,
+ 71F4C58B0FDED12800529849 /* cdrom.c in Sources */,
+ 71F4C58D0FDED12800529849 /* cheat.c in Sources */,
+ 71F4C5910FDED12800529849 /* decode_xa.c in Sources */,
+ 71F4C5930FDED12800529849 /* disr3000a.c in Sources */,
+ 71F4C5940FDED12800529849 /* gte.c in Sources */,
+ 71F4C5960FDED12800529849 /* mdec.c in Sources */,
+ 71F4C5980FDED12800529849 /* misc.c in Sources */,
+ 71F4C59A0FDED12800529849 /* plugins.c in Sources */,
+ 71F4C59D0FDED12800529849 /* psxbios.c in Sources */,
+ 71F4C5A00FDED12800529849 /* psxcounters.c in Sources */,
+ 71F4C5A20FDED12800529849 /* psxdma.c in Sources */,
+ 71F4C5A40FDED12800529849 /* psxhle.c in Sources */,
+ 71F4C5A60FDED12800529849 /* psxhw.c in Sources */,
+ 71F4C5A80FDED12800529849 /* psxinterpreter.c in Sources */,
+ 71F4C5A90FDED12800529849 /* psxmem.c in Sources */,
+ 71F4C5AB0FDED12800529849 /* r3000a.c in Sources */,
+ 71F4C5AD0FDED12800529849 /* sio.c in Sources */,
+ 71F4C5AF0FDED12800529849 /* spu.c in Sources */,
+ 71F4C5B90FDED16D00529849 /* iR3000A.c in Sources */,
+ 71F4C5BA0FDED16D00529849 /* ix86.c in Sources */,
+ 712FD1E81093096F00575A92 /* debug.c in Sources */,
+ 712FD1E91093096F00575A92 /* socket.c in Sources */,
+ 713B530E110B75650002F164 /* ppf.c in Sources */,
+ 719594B211AEFE8C004AD686 /* psxcommon.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 713CB2DE11FC49720033B6A8 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = DFCdrom;
+ targetProxy = 713CB2DD11FC49720033B6A8 /* PBXContainerItemProxy */;
+ };
+ 71AD2DE910C3572200365243 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = PeopsSPU;
+ targetProxy = 71AD2DE810C3572200365243 /* PBXContainerItemProxy */;
+ };
+ 71AD2DEB10C3572500365243 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = gpuPeopsSoftGL;
+ targetProxy = 71AD2DEA10C3572500365243 /* PBXContainerItemProxy */;
+ };
+ 71F2C0BC1200B75100322AD9 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = DFInput;
+ targetProxy = 71F2C0BB1200B75100322AD9 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 2B3E35BA069384D100763C7D /* AddPluginSheet.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2B3E35BB069384D100763C7D /* English */,
+ );
+ name = AddPluginSheet.nib;
+ sourceTree = "<group>";
+ };
+ 2BA178B00514CE260026D74D /* Configuration.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2BA178B10514CE260026D74D /* English */,
+ );
+ name = Configuration.nib;
+ sourceTree = "<group>";
+ };
+ 2BA178B20514CE260026D74D /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2BA178B30514CE260026D74D /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 2BA178B40514CE260026D74D /* PCSX.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2BA178B50514CE260026D74D /* English */,
+ );
+ name = PCSX.nib;
+ sourceTree = "<group>";
+ };
+ 2BBB1786051E0D9700B84448 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2BBB1787051E0D9700B84448 /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 71F353F40FD98DFE00CBEC28 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DEBUGGING_SYMBOLS = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_ASM_KEYWORD = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = G3;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_1)",
+ __MACOSX__,
+ );
+ GCC_PREPROCESSOR_DEFINITIONS_QUOTED_1 = "PCSX_VERSION=\\\"1.5\\\" XA_HACK=1";
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ OTHER_CFLAGS = (
+ "-fomit-frame-pointer",
+ "-funroll-loops",
+ "-falign-loops=16",
+ );
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = PCSX;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = "-Wmost";
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = NO;
+ };
+ name = Development;
+ };
+ 71F353F50FD98DFE00CBEC28 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUGGING_SYMBOLS = NO;
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_ENABLE_ASM_KEYWORD = YES;
+ GCC_ENABLE_CPP_EXCEPTIONS = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_CPU = "";
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = s;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_1)",
+ __MACOSX__,
+ );
+ GCC_PREPROCESSOR_DEFINITIONS_QUOTED_1 = "PCSX_VERSION=\\\"1.5\\\" XA_HACK=1";
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ OTHER_CFLAGS = (
+ "-fomit-frame-pointer",
+ "-funroll-loops",
+ "-falign-loops=16",
+ );
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = PCSX;
+ SECTORDER_FLAGS = "";
+ WARNING_CFLAGS = "-Wmost";
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 71F353F90FD98DFE00CBEC28 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = i386;
+ GCC_MODEL_TUNING = "";
+ GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
+ HEADER_SEARCH_PATHS = (
+ ../include,
+ ../libpcsxcore,
+ ../macosx,
+ );
+ OTHER_LDFLAGS = (
+ "-lz",
+ "-lSystemStubs",
+ );
+ };
+ name = Development;
+ };
+ 71F353FA0FD98DFE00CBEC28 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = i386;
+ GCC_DYNAMIC_NO_PIC = YES;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 2;
+ GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+ GCC_UNROLL_LOOPS = YES;
+ GCC_WARN_ABOUT_POINTER_SIGNEDNESS = NO;
+ HEADER_SEARCH_PATHS = (
+ ../include,
+ ../libpcsxcore,
+ ../macosx,
+ );
+ OTHER_CFLAGS = "-fomit-frame-pointer";
+ OTHER_LDFLAGS = (
+ "-lz",
+ "-lSystemStubs",
+ );
+ };
+ name = Deployment;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 71F353F30FD98DFE00CBEC28 /* Build configuration list for PBXNativeTarget "PCSX" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71F353F40FD98DFE00CBEC28 /* Development */,
+ 71F353F50FD98DFE00CBEC28 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+ 71F353F80FD98DFE00CBEC28 /* Build configuration list for PBXProject "Pcsx" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71F353F90FD98DFE00CBEC28 /* Development */,
+ 71F353FA0FD98DFE00CBEC28 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 08FB7793FE84155DC02AAC07 /* Project object */;
+}
diff --git a/macosx/PcsxController.h b/macosx/PcsxController.h
new file mode 100644
index 0000000..70e81e1
--- /dev/null
+++ b/macosx/PcsxController.h
@@ -0,0 +1,34 @@
+/* PcsxController */
+
+#import <Cocoa/Cocoa.h>
+#import "EmuThread.h"
+#import "PluginList.h"
+
+@interface PcsxController : NSObject
+{
+ NSWindowController *preferencesController;
+ NSWindowController *memCardController;
+ PluginList *pluginList;
+
+ IBOutlet NSWindow *memCardWindow;
+ IBOutlet NSWindow *preferenceWindow;
+
+ BOOL sleepInBackground;
+ BOOL wasPausedBeforeBGSwitch;
+}
+- (IBAction)ejectCD:(id)sender;
+- (IBAction)pause:(id)sender;
+- (IBAction)preferences:(id)sender;
+- (IBAction)reset:(id)sender;
+- (IBAction)runCD:(id)sender;
+- (IBAction)runIso:(id)sender;
+- (IBAction)runBios:(id)sender;
+- (IBAction)freeze:(id)sender;
+- (IBAction)defrost:(id)sender;
+- (IBAction)fullscreen:(id)sender;
+
++ (void)setConfigFromDefaults;
++ (void)setDefaultFromConfig:(NSString *)defaultKey;
++ (BOOL)biosAvailable;
+
+@end
diff --git a/macosx/PcsxController.m b/macosx/PcsxController.m
new file mode 100644
index 0000000..0bb9144
--- /dev/null
+++ b/macosx/PcsxController.m
@@ -0,0 +1,425 @@
+#import <Cocoa/Cocoa.h>
+#import "PcsxController.h"
+#import "ConfigurationController.h"
+#import "EmuThread.h"
+#include "psxcommon.h"
+#include "plugins.h"
+#include "misc.h"
+#include "ExtendedKeys.h"
+
+NSDictionary *prefStringKeys;
+NSDictionary *prefByteKeys;
+NSMutableArray *biosList;
+NSString *saveStatePath;
+
+@implementation PcsxController
+
+- (IBAction)ejectCD:(id)sender
+{
+ NSMutableString *deviceName;
+ NSTask *ejectTask;
+ NSRange rdiskRange;
+
+ BOOL wasPaused = [EmuThread pauseSafe];
+
+ /* close connection to current cd */
+ if ([EmuThread active])
+ CDR_close();
+
+ // switch to another ISO if using internal image reader, otherwise eject the CD
+ if (UsingIso()) {
+ NSOpenPanel* openDlg = [NSOpenPanel openPanel];
+
+ [openDlg setCanChooseFiles:YES];
+ [openDlg setCanChooseDirectories:NO];
+
+ if ([openDlg runModal] == NSOKButton) {
+ NSArray* files = [openDlg filenames];
+ SetCdOpenCaseTime(time(NULL) + 2);
+ SetIsoFile((const char *)[[files objectAtIndex:0] fileSystemRepresentation]);
+ }
+ } else {
+ if (CDR_getDriveLetter() != nil) {
+ deviceName = [NSMutableString stringWithCString:CDR_getDriveLetter()];
+
+ // delete the 'r' in 'rdisk'
+ rdiskRange = [deviceName rangeOfString:@"rdisk"];
+ if (rdiskRange.length != 0) {
+ rdiskRange.length = 1;
+ [deviceName deleteCharactersInRange:rdiskRange];
+ }
+ // execute hdiutil to eject the device
+ ejectTask = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/hdiutil" arguments:[NSArray arrayWithObjects:@"eject", deviceName, nil]];
+ [ejectTask waitUntilExit];
+ }
+ }
+
+ /* and open new cd */
+ if ([EmuThread active])
+ CDR_open();
+
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
+}
+
+- (IBAction)pause:(id)sender
+{
+ if ([EmuThread isPaused]) {
+ //[sender setState:NSOffState];
+ [EmuThread resume];
+ }
+ else {
+ //[sender setState:NSOnState];
+ [EmuThread pause];
+ }
+}
+
+- (IBAction)preferences:(id)sender
+{
+ /* load the nib if it hasn't yet */
+ if (preferenceWindow == nil) {
+ if (preferencesController == nil) {
+ preferencesController = [[ConfigurationController alloc] initWithWindowNibName:@"Configuration"];
+ }
+ preferenceWindow = [preferencesController window];
+ }
+
+ /* show the window */
+ [preferenceWindow makeKeyAndOrderFront:self];
+ [preferencesController showWindow:self];
+}
+
+- (IBAction)reset:(id)sender
+{
+ [EmuThread reset];
+}
+
+- (IBAction)runCD:(id)sender
+{
+ SetIsoFile(NULL);
+ [EmuThread run];
+}
+
+- (IBAction)runIso:(id)sender
+{
+ NSOpenPanel* openDlg = [NSOpenPanel openPanel];
+
+ [openDlg setCanChooseFiles:YES];
+ [openDlg setCanChooseDirectories:NO];
+
+ if ([openDlg runModalForDirectory:nil file:nil] == NSOKButton) {
+ NSArray* files = [openDlg filenames];
+ SetIsoFile((const char *)[[files objectAtIndex:0] fileSystemRepresentation]);
+ [EmuThread run];
+ }
+}
+
+- (IBAction)runBios:(id)sender
+{
+ SetIsoFile(NULL);
+ [EmuThread runBios];
+}
+
+- (IBAction)freeze:(id)sender
+{
+ int num = [sender tag];
+ NSString *path = [NSString stringWithFormat:@"%@/%s-%3.3d.pcsxstate", saveStatePath, CdromId, num];
+
+ [EmuThread freezeAt:path which:num-1];
+}
+
+- (IBAction)defrost:(id)sender
+{
+ NSString *path = [NSString stringWithFormat:@"%@/%s-%3.3d.pcsxstate", saveStatePath, CdromId, [sender tag]];
+ [EmuThread defrostAt:path];
+}
+
+- (IBAction)fullscreen:(id)sender
+{
+ GPU_keypressed(GPU_FULLSCREEN_KEY);
+}
+
+- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
+{
+ if ([menuItem action] == @selector(pause:)) {
+ [menuItem setState:([EmuThread isPaused] ? NSOnState : NSOffState)];
+ }
+
+ if ([menuItem action] == @selector(pause:) || [menuItem action] == @selector(fullscreen:))
+ return [EmuThread active];
+
+ if ([menuItem action] == @selector(reset:) || [menuItem action] == @selector(ejectCD:) ||
+ [menuItem action] == @selector(freeze:))
+ return [EmuThread active] && ![EmuThread isRunBios];
+
+ if ([menuItem action] == @selector(runCD:) || [menuItem action] == @selector(runIso:) ||
+ [menuItem action] == @selector(runBios:)) {
+ if (preferenceWindow != nil)
+ if ([preferenceWindow isVisible])
+ return NO;
+
+ if ([menuItem action] == @selector(runBios:) && strcmp(Config.Bios, "HLE") == 0)
+ return NO;
+
+ return ![EmuThread active];
+ }
+
+ if ([menuItem action] == @selector(defrost:)) {
+ if (![EmuThread active] || [EmuThread isRunBios])
+ return NO;
+
+ NSString *path = [NSString stringWithFormat:@"%@/%s-%3.3d.pcsxstate", saveStatePath, CdromId, [menuItem tag]];
+ return (CheckState((char *)[path fileSystemRepresentation]) == 0);
+ }
+
+ if ([menuItem action] == @selector(preferences:))
+ return ![EmuThread active];
+
+ return YES;
+}
+
+- (void)applicationWillResignActive:(NSNotification *)aNotification
+{
+ wasPausedBeforeBGSwitch = [EmuThread isPaused];
+
+ if (sleepInBackground) {
+ [EmuThread pause];
+ }
+}
+
+- (void)applicationDidBecomeActive:(NSNotification *)aNotification
+{
+ if (sleepInBackground && !wasPausedBeforeBGSwitch) {
+ [EmuThread resume];
+ }
+}
+
+- (void)awakeFromNib
+{
+ pluginList = [[PluginList alloc] init];
+ if (![pluginList configured] /*!Config.Gpu[0] || !Config.Spu[0] || !Config.Pad1[0] || !Config.Cdr[0]*/) {
+ // configure plugins
+ [self preferences:nil];
+
+ NSRunCriticalAlertPanel(NSLocalizedString(@"Missing plugins!", nil),
+ NSLocalizedString(@"Pcsx is missing one or more critical plugins. You will need to install these in order to play games.", nil),
+ nil, nil, nil);
+ }
+
+ if (![PcsxController biosAvailable]) {
+ NSRunInformationalAlertPanel(NSLocalizedString(@"Missing BIOS!", nil),
+ NSLocalizedString(@"Pcsx wasn't able to locate any Playstation BIOS ROM files. This means that it will run in BIOS simulation mode which is less stable and compatible than using a real Playstation BIOS.\n"
+ @"If you have a BIOS available, please copy it to\n~/Library/Application Support/Pcsx/Bios/", nil),
+ nil, nil, nil);
+ }
+
+ sleepInBackground = YES;
+}
+
+- (void)dealloc
+{
+ [pluginList release];
+ [super dealloc];
+}
+
++ (void)setConfigFromDefaults
+{
+ NSEnumerator *enumerator;
+ const char *str;
+ NSString *key;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ /*
+ enumerator = [prefStringKeys keyEnumerator];
+ while ((key = [enumerator nextObject])) {
+ str = [[defaults stringForKey:key] fileSystemRepresentation];
+ char *dst = (char *)[[prefStringKeys objectForKey:key] pointerValue];
+ if (str != nil && dst != nil) strncpy(dst, str, 255);
+ }*/
+
+ enumerator = [prefByteKeys keyEnumerator];
+ while ((key = [enumerator nextObject])) {
+ u8 *dst = (u8 *)[[prefByteKeys objectForKey:key] pointerValue];
+ if (dst != nil) *dst = [defaults integerForKey:key];
+ }
+
+ // special cases
+ //str = [[defaults stringForKey:@"PluginPAD"] fileSystemRepresentation];
+ //if (str != nil) strncpy(Config.Pad2, str, 255);
+
+ str = [[defaults stringForKey:@"Bios"] fileSystemRepresentation];
+ if (str) {
+ NSString *path = [defaults stringForKey:@"Bios"];
+ int index = [biosList indexOfObject:path];
+
+ if (-1 == index) {
+ [biosList insertObject:path atIndex:0];
+ } else if (0 < index) {
+ [biosList exchangeObjectAtIndex:index withObjectAtIndex:0];
+ }
+ }
+
+ str = [[defaults stringForKey:@"Mcd1"] fileSystemRepresentation];
+ if (str) strncpy(Config.Mcd1, str, MAXPATHLEN);
+
+ str = [[defaults stringForKey:@"Mcd2"] fileSystemRepresentation];
+ if (str) strncpy(Config.Mcd2, str, MAXPATHLEN);
+
+ if ([defaults boolForKey:@"UseHLE"] || 0 == [biosList count]) {
+ strcpy(Config.Bios, "HLE");
+ } else {
+ str = [(NSString *)[biosList objectAtIndex:0] fileSystemRepresentation];
+ if (str != nil) strncpy(Config.Bios, str, MAXPATHLEN);
+ else strcpy(Config.Bios, "HLE");
+ }
+
+ // FIXME: hack
+ strcpy(Config.Net, "Disabled");
+}
+
++ (void)setDefaultFromConfig:(NSString *)defaultKey
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ char *str = (char *)[[prefStringKeys objectForKey:defaultKey] pointerValue];
+ if (str) {
+ [defaults setObject:[NSString stringWithCString:str] forKey:defaultKey];
+ return;
+ }
+
+ u8 *val = (u8 *)[[prefByteKeys objectForKey:defaultKey] pointerValue];
+ if (val) {
+ [defaults setInteger:*val forKey:defaultKey];
+ return;
+ }
+}
+
++ (BOOL)biosAvailable
+{
+ return ([biosList count] > 0);
+}
+
+// called when class is initialized
++ (void)initialize
+{
+ NSString *path;
+ const char *str;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"Disabled", @"PluginNET",
+ [NSNumber numberWithInt:1], @"NoDynarec",
+ [NSNumber numberWithInt:1], @"AutoDetectVideoType",
+ [NSNumber numberWithInt:0], @"UseHLE",
+ nil];
+
+ [defaults registerDefaults:appDefaults];
+
+ prefStringKeys = [[NSDictionary alloc] initWithObjectsAndKeys:
+ [NSValue valueWithPointer:Config.Gpu], @"PluginGPU",
+ [NSValue valueWithPointer:Config.Spu], @"PluginSPU",
+ [NSValue valueWithPointer:Config.Pad1], @"PluginPAD",
+ [NSValue valueWithPointer:Config.Cdr], @"PluginCDR",
+ [NSValue valueWithPointer:Config.Net], @"PluginNET",
+ [NSValue valueWithPointer:Config.Mcd1], @"Mcd1",
+ [NSValue valueWithPointer:Config.Mcd2], @"Mcd2",
+ nil];
+
+ prefByteKeys = [[NSDictionary alloc] initWithObjectsAndKeys:
+ [NSValue valueWithPointer:&Config.Xa], @"NoXaAudio",
+ [NSValue valueWithPointer:&Config.Sio], @"SioIrqAlways",
+ [NSValue valueWithPointer:&Config.Mdec], @"BlackAndWhiteMDECVideo",
+ [NSValue valueWithPointer:&Config.PsxAuto], @"AutoDetectVideoType",
+ [NSValue valueWithPointer:&Config.PsxType], @"VideoTypePAL",
+ [NSValue valueWithPointer:&Config.Cdda], @"NoCDAudio",
+ [NSValue valueWithPointer:&Config.Cpu], @"NoDynarec",
+ [NSValue valueWithPointer:&Config.PsxOut], @"ConsoleOutput",
+ [NSValue valueWithPointer:&Config.SpuIrq], @"SpuIrqAlways",
+ [NSValue valueWithPointer:&Config.RCntFix], @"RootCounterFix",
+ [NSValue valueWithPointer:&Config.VSyncWA], @"VideoSyncWAFix",
+ nil];
+
+ // setup application support paths
+ NSArray *libPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
+ if ([libPaths count] > 0) {
+ NSString *path;
+ BOOL dir;
+
+ // create them if needed
+ NSFileManager *dfm = [NSFileManager defaultManager];
+ NSString *supportPath = [NSString stringWithFormat:@"%@/Application Support", [libPaths objectAtIndex:0]];
+ if (![dfm fileExistsAtPath:supportPath isDirectory:&dir])
+ [dfm createDirectoryAtPath:supportPath attributes:nil];
+
+ path = [NSString stringWithFormat:@"%@/Pcsx", supportPath];
+ if (![dfm fileExistsAtPath:path isDirectory:&dir])
+ [dfm createDirectoryAtPath:path attributes:nil];
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Bios", supportPath];
+ if (![dfm fileExistsAtPath:path isDirectory:&dir])
+ [dfm createDirectoryAtPath:path attributes:nil];
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Memory Cards", supportPath];
+ if (![dfm fileExistsAtPath:path isDirectory:&dir])
+ [dfm createDirectoryAtPath:path attributes:nil];
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Patches", supportPath];
+ if (![dfm fileExistsAtPath:path isDirectory:&dir])
+ [dfm createDirectoryAtPath:path attributes:nil];
+
+ saveStatePath = [[NSString stringWithFormat:@"%@/Pcsx/Save States", supportPath] retain];
+ if (![dfm fileExistsAtPath:saveStatePath isDirectory:&dir])
+ [dfm createDirectoryAtPath:saveStatePath attributes:nil];
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Memory Cards/Mcd001.mcr", supportPath];
+ str = [path fileSystemRepresentation];
+ if (str != nil) strncpy(Config.Mcd1, str, 255);
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Memory Cards/Mcd002.mcr", supportPath];
+ str = [path fileSystemRepresentation];
+ if (str != nil) strncpy(Config.Mcd2, str, 255);
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Bios/", supportPath];
+ str = [path fileSystemRepresentation];
+ if (str != nil) strncpy(Config.BiosDir, str, 255);
+
+ path = [NSString stringWithFormat:@"%@/Pcsx/Patches/", supportPath];
+ str = [path fileSystemRepresentation];
+ if (str != nil) strncpy(Config.PatchesDir, str, 255);
+ } else {
+ strcpy(Config.BiosDir, "Bios/");
+ strcpy(Config.PatchesDir, "Patches/");
+
+ saveStatePath = @"sstates";
+ [saveStatePath retain];
+ }
+
+ // set plugin path
+ path = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingString:@"/"];
+ str = [path fileSystemRepresentation];
+ if (str != nil) strncpy(Config.PluginsDir, str, 255);
+
+ // locate a bios
+ biosList = [[NSMutableArray alloc] init];
+ NSFileManager *manager = [NSFileManager defaultManager];
+ NSArray *bioses = [manager directoryContentsAtPath:[NSString stringWithCString:Config.BiosDir]];
+ if (bioses) {
+ int i;
+ for (i = 0; i < [bioses count]; i++) {
+ NSString *file = [bioses objectAtIndex:i];
+ NSDictionary *attrib = [manager fileAttributesAtPath:[NSString stringWithFormat:@"%s%@", Config.BiosDir, file] traverseLink:YES];
+
+ if ([[attrib fileType] isEqualToString:NSFileTypeRegular]) {
+ unsigned long long size = [attrib fileSize];
+ if (([attrib fileSize] % (256 * 1024)) == 0 && size > 0) {
+ [biosList addObject:file];
+ }
+ }
+ }
+ }
+
+ [PcsxController setConfigFromDefaults];
+}
+
+
+@end
diff --git a/macosx/PcsxPlugin.h b/macosx/PcsxPlugin.h
new file mode 100644
index 0000000..c8d4767
--- /dev/null
+++ b/macosx/PcsxPlugin.h
@@ -0,0 +1,41 @@
+//
+// PcsxPlugin.h
+// Pcsx
+//
+// Created by Gil Pedersen on Fri Oct 03 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+
+@interface PcsxPlugin : NSObject {
+ CFBundleRef pluginRef;
+
+ NSString *path;
+ NSDate *modDate;
+ NSString *name;
+ long version;
+ int type;
+ int active;
+}
+
++ (NSString *)getPrefixForType:(int)type;
++ (NSString *)getDefaultKeyForType:(int)type;
++ (char **)getConfigEntriesForType:(int)type;
+
+- (id)initWithPath:(NSString *)aPath;
+
+- (NSString *)getDisplayVersion;
+- (int)getType;
+- (NSString *)path;
+- (NSString *)description;
+- (BOOL)hasAboutAs:(int)type;
+- (BOOL)hasConfigureAs:(int)type;
+- (long)initAs:(int)aType;
+- (long)shutdownAs:(int)aType;
+- (void)aboutAs:(int)type;
+- (void)configureAs:(int)type;
+- (BOOL)verifyOK;
+
+@end
diff --git a/macosx/PcsxPlugin.m b/macosx/PcsxPlugin.m
new file mode 100644
index 0000000..9ee3111
--- /dev/null
+++ b/macosx/PcsxPlugin.m
@@ -0,0 +1,303 @@
+//
+// PcsxPlugin.m
+// Pcsx
+//
+// Created by Gil Pedersen on Fri Oct 03 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "PcsxPlugin.h"
+#include "psxcommon.h"
+#include "plugins.h"
+
+@implementation PcsxPlugin
+
++ (NSString *)getPrefixForType:(int)aType
+{
+ switch (aType) {
+ case PSE_LT_GPU: return @"GPU";
+ case PSE_LT_CDR: return @"CDR";
+ case PSE_LT_SPU: return @"SPU";
+ case PSE_LT_PAD: return @"PAD";
+ case PSE_LT_NET: return @"NET";
+ }
+
+ return @"";
+}
+
++ (NSString *)getDefaultKeyForType:(int)aType
+{
+ //return @"Plugin" [PcsxPlugin getPrefixForType:aType];
+ switch (aType) {
+ case PSE_LT_GPU: return @"PluginGPU";
+ case PSE_LT_CDR: return @"PluginCDR";
+ case PSE_LT_SPU: return @"PluginSPU";
+ case PSE_LT_PAD: return @"PluginPAD";
+ case PSE_LT_NET: return @"PluginNET";
+ }
+
+ return @"";
+}
+
++ (char **)getConfigEntriesForType:(int)aType
+{
+ static char *gpu[2] = {(char *)&Config.Gpu, NULL};
+ static char *cdr[2] = {(char *)&Config.Cdr, NULL};
+ static char *spu[2] = {(char *)&Config.Spu, NULL};
+ static char *pad[3] = {(char *)&Config.Pad1, (char *)&Config.Pad2, NULL};
+ static char *net[2] = {(char *)&Config.Net, NULL};
+
+ switch (aType) {
+ case PSE_LT_GPU: return (char **)gpu;
+ case PSE_LT_CDR: return (char **)cdr;
+ case PSE_LT_SPU: return (char **)spu;
+ case PSE_LT_PAD: return (char **)pad;
+ case PSE_LT_NET: return (char **)net;
+ }
+
+ return nil;
+}
+
+- (id)initWithPath:(NSString *)aPath
+{
+ if (!(self = [super init])) {
+ return nil;
+ }
+
+ PSEgetLibType PSE_getLibType = NULL;
+ PSEgetLibVersion PSE_getLibVersion = NULL;
+ PSEgetLibName PSE_getLibName = NULL;
+
+ pluginRef = nil;
+ name = nil;
+ path = [aPath retain];
+ NSString *fullPath = [[NSString stringWithCString:Config.PluginsDir] stringByAppendingPathComponent:path];
+
+ pluginRef = SysLoadLibrary([fullPath fileSystemRepresentation]);
+ if (pluginRef == nil) {
+ [self release];
+ return nil;
+ }
+
+ // TODO: add support for plugins with multiple functionalities???
+ PSE_getLibType = (PSEgetLibType) SysLoadSym(pluginRef, "PSEgetLibType");
+ if (SysLibError() != nil) {
+ if (([path rangeOfString: @"gpu" options:NSCaseInsensitiveSearch]).length != 0)
+ type = PSE_LT_GPU;
+ else if (([path rangeOfString: @"cdr" options:NSCaseInsensitiveSearch]).length != 0)
+ type = PSE_LT_CDR;
+ else if (([path rangeOfString: @"spu" options:NSCaseInsensitiveSearch]).length != 0)
+ type = PSE_LT_SPU;
+ else if (([path rangeOfString: @"pad" options:NSCaseInsensitiveSearch]).length != 0)
+ type = PSE_LT_PAD;
+ else {
+ [self release];
+ return nil;
+ }
+ } else {
+ type = (int)PSE_getLibType();
+ if (type != PSE_LT_GPU && type != PSE_LT_CDR && type != PSE_LT_SPU && type != PSE_LT_PAD) {
+ [self release];
+ return nil;
+ }
+ }
+
+ PSE_getLibName = (PSEgetLibName) SysLoadSym(pluginRef, "PSEgetLibName");
+ if (SysLibError() == nil) {
+ name = [[NSString alloc] initWithCString:PSE_getLibName()];
+ }
+
+ PSE_getLibVersion = (PSEgetLibVersion) SysLoadSym(pluginRef, "PSEgetLibVersion");
+ if (SysLibError() == nil) {
+ version = PSE_getLibVersion();
+ }
+ else {
+ version = -1;
+ }
+
+ // save the current modification date
+ NSDictionary *fattrs = [[NSFileManager defaultManager] fileAttributesAtPath:fullPath traverseLink:YES];
+ modDate = [[fattrs fileModificationDate] retain];
+
+ active = 0;
+
+ return self;
+}
+
+- (void)dealloc
+{
+ int i;
+
+ // shutdown if we had previously been inited
+ for (i=0; i<32; i++) {
+ if (active & (1 << i)) {
+ [self shutdownAs:(1 << i)];
+ }
+ }
+
+ if (pluginRef) SysCloseLibrary(pluginRef);
+
+ [path release];
+ [name release];
+
+ [super dealloc];
+}
+
+- (void)runCommand:(id)arg
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSString *funcName = [arg objectAtIndex:0];
+ long (*func)(void);
+
+ func = SysLoadSym(pluginRef, [funcName lossyCString]);
+ if (SysLibError() == nil) {
+ func();
+ } else {
+ NSBeep();
+ }
+
+ [arg release];
+ [pool release];
+ return;
+}
+
+- (long)initAs:(int)aType
+{
+ char symbol[255];
+ long (*init)(void);
+ long (*initArg)(long arg);
+ int res = PSE_ERR_FATAL;
+
+ if ((active & aType) == aType) {
+ return 0;
+ }
+
+ sprintf(symbol, "%sinit", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ init = initArg = SysLoadSym(pluginRef, symbol);
+ if (SysLibError() == nil) {
+ if (aType != PSE_LT_PAD)
+ res = init();
+ else
+ res = initArg(1|2);
+ }
+
+ if (0 == res) {
+ active |= aType;
+ } else {
+ NSRunCriticalAlertPanel(NSLocalizedString(@"Plugin Initialization Failed!", nil),
+ [NSString stringWithFormat:NSLocalizedString(@"Pcsx failed to initialize the selected %s plugin (error=%i).\nThe plugin might not work with your system.", nil), [PcsxPlugin getPrefixForType:aType], res],
+ nil, nil, nil);
+ }
+
+ return res;
+}
+
+- (long)shutdownAs:(int)aType
+{
+ char symbol[255];
+ long (*shutdown)(void);
+
+ sprintf(symbol, "%sshutdown", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ shutdown = SysLoadSym(pluginRef, symbol);
+ if (SysLibError() == nil) {
+ active &= ~aType;
+ return shutdown();
+ }
+
+ return PSE_ERR_FATAL;
+}
+
+- (BOOL)hasAboutAs:(int)aType
+{
+ char symbol[255];
+
+ sprintf(symbol, "%sabout", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ SysLoadSym(pluginRef, symbol);
+
+ return (SysLibError() == nil);
+}
+
+- (BOOL)hasConfigureAs:(int)aType
+{
+ char symbol[255];
+
+ sprintf(symbol, "%sconfigure", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ SysLoadSym(pluginRef, symbol);
+
+ return (SysLibError() == nil);
+}
+
+- (void)aboutAs:(int)aType
+{
+ NSArray *arg;
+ char symbol[255];
+
+ sprintf(symbol, "%sabout", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ arg = [[NSArray alloc] initWithObjects:[NSString stringWithCString:symbol],
+ [NSNumber numberWithInt:0], nil];
+
+ // detach a new thread
+ [NSThread detachNewThreadSelector:@selector(runCommand:) toTarget:self
+ withObject:arg];
+}
+
+- (void)configureAs:(int)aType
+{
+ NSArray *arg;
+ char symbol[255];
+
+ sprintf(symbol, "%sconfigure", [[PcsxPlugin getPrefixForType:aType] lossyCString]);
+ arg = [[NSArray alloc] initWithObjects:[NSString stringWithCString:symbol],
+ [NSNumber numberWithInt:1], nil];
+
+ // detach a new thread
+ [NSThread detachNewThreadSelector:@selector(runCommand:) toTarget:self
+ withObject:arg];
+}
+
+- (NSString *)getDisplayVersion
+{
+ if (version == -1)
+ return @"";
+
+ return [NSString stringWithFormat:@"v%ld.%ld.%ld", version>>16,(version>>8)&0xff,version&0xff];
+}
+
+- (int)getType
+{
+ return type;
+}
+
+- (NSString *)path
+{
+ return path;
+}
+
+- (unsigned)hash
+{
+ return [path hash];
+}
+
+- (NSString *)description
+{
+ if (name == nil)
+ return [path lastPathComponent];
+
+ return [NSString stringWithFormat:@"%@ %@ [%@]", name, [self getDisplayVersion], [path lastPathComponent]];
+}
+
+// the plugin will check if it's still valid and return the status
+- (BOOL)verifyOK
+{
+ // check that the file is still there with the same modification date
+ NSFileManager *dfm = [NSFileManager defaultManager];
+ NSString *fullPath = [[NSString stringWithCString:Config.PluginsDir] stringByAppendingPathComponent:path];
+ if (![dfm fileExistsAtPath:fullPath])
+ return NO;
+
+ NSDictionary *fattrs = [dfm fileAttributesAtPath:fullPath traverseLink:YES];
+ return [[fattrs fileModificationDate] isEqualToDate:modDate];
+}
+
+@end
diff --git a/macosx/PcsxPluginDocument.h b/macosx/PcsxPluginDocument.h
new file mode 100644
index 0000000..bf4f802
--- /dev/null
+++ b/macosx/PcsxPluginDocument.h
@@ -0,0 +1,20 @@
+//
+// PcsxPluginDocument.h
+// Pcsx
+//
+// Created by Gil Pedersen on Thu Jul 01 2004.
+// Copyright (c) 2004 __MyCompanyName__. All rights reserved.
+//
+
+#import <AppKit/AppKit.h>
+
+
+@interface PcsxPluginDocument : NSDocument {
+ IBOutlet NSWindow *addPluginSheet;
+ IBOutlet NSTextField *pluginName;
+
+ BOOL moveOK;
+}
+- (IBAction)closeAddPluginSheet:(id)sender;
+
+@end
diff --git a/macosx/PcsxPluginDocument.m b/macosx/PcsxPluginDocument.m
new file mode 100644
index 0000000..6cbe0fa
--- /dev/null
+++ b/macosx/PcsxPluginDocument.m
@@ -0,0 +1,95 @@
+//
+// PcsxPluginDocument.m
+// Pcsx
+//
+// Created by Gil Pedersen on Thu Jul 01 2004.
+// Copyright (c) 2004 __MyCompanyName__. All rights reserved.
+//
+
+#import "PcsxPluginDocument.h"
+
+
+@implementation PcsxPluginDocument
+
+- (BOOL)showAddPluginSheet:(NSWindow *)window forName:(NSString *)name
+// User has asked to see the custom display. Display it.
+{
+ if (!addPluginSheet)
+ [NSBundle loadNibNamed:@"AddPluginSheet" owner:self];
+
+ [pluginName setObjectValue:name];
+
+ [NSApp beginSheet:addPluginSheet
+ modalForWindow:window
+ modalDelegate:nil
+ didEndSelector:nil
+ contextInfo:nil];
+ [NSApp runModalForWindow:addPluginSheet];
+ // Sheet is up here.
+ [NSApp endSheet:addPluginSheet];
+ [addPluginSheet orderOut:self];
+
+ return moveOK;
+}
+
+- (IBAction)closeAddPluginSheet:(id)sender
+{
+ if ([[sender keyEquivalent] isEqualToString:@"\r"]) {
+ moveOK = YES;
+ } else {
+ moveOK = NO;
+ }
+ [NSApp stopModal];
+}
+
+- (BOOL)loadDataRepresentation:(NSData *)docData ofType:(NSString *)docType
+{
+ //NSLog(@"loadDataRepresentation");
+ return NO;
+}
+
+- (BOOL)loadFileWrapperRepresentation:(NSFileWrapper *)wrapper ofType:(NSString *)docType
+{
+ if ([self showAddPluginSheet:nil forName:[wrapper filename]]) {
+ NSString *dst = [NSString stringWithFormat:@"%@/%@",
+ [[NSBundle mainBundle] builtInPlugInsPath],
+ [wrapper filename]];
+
+ if ([wrapper writeToFile:dst atomically:NO updateFilenames:NO]) {
+ [[NSWorkspace sharedWorkspace] noteFileSystemChanged:[[NSBundle mainBundle] builtInPlugInsPath]];
+ NSRunInformationalAlertPanel(NSLocalizedString(@"Installation Succesfull", nil),
+ NSLocalizedString(@"The installation of the specified plugin was succesfull. In order to use it, please restart the application.", nil),
+ nil, nil, nil);
+ } else {
+ NSRunAlertPanel(NSLocalizedString(@"Installation Failed!", nil),
+ NSLocalizedString(@"The installation of the specified plugin failed. Please try again, or make a manual install.", nil),
+ nil, nil, nil);
+ }
+ }
+
+ // Tell the NSDocument that we can't handle the file, since we are already done with it
+ return NO;
+}
+
+- (id)openDocumentWithContentsOfFile:(NSString *)fileName display:(BOOL)flag
+{
+
+ return nil;
+}
+
+- (NSString *)windowNibName {
+ // Implement this to return a nib to load OR implement -makeWindowControllers to manually create your controllers.
+ return @"PcsxPluginDocument";
+}
+
+- (NSData *)dataRepresentationOfType:(NSString *)type {
+ // Implement to provide a persistent data representation of your document OR remove this and implement the file-wrapper or file path based save methods.
+ return nil;
+}
+/*
+- (BOOL)loadDataRepresentation:(NSData *)data ofType:(NSString *)type {
+ // Implement to load a persistent data representation of your document OR remove this and implement the file-wrapper or file path based load methods.
+ return YES;
+}*/
+
+@end
diff --git a/macosx/Plugin.c b/macosx/Plugin.c
new file mode 100644
index 0000000..e293fbf
--- /dev/null
+++ b/macosx/Plugin.c
@@ -0,0 +1,150 @@
+/* Pcsx - Pc Psx Emulator
+ * Copyright (C) 1999-2002 Pcsx Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#import <CoreFoundation/CoreFoundation.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include "psxcommon.h"
+#include "plugins.h"
+#include "spu.h"
+
+void OnFile_Exit();
+
+unsigned long gpuDisp;
+
+long SPU__open(void) {
+ return SPU_open();
+}
+
+int StatesC = 0;
+extern int UseGui;
+int ShowPic=0;
+
+void gpuShowPic() {
+}
+
+void PADhandleKey(int key) {
+}
+
+long PAD1__open(void) {
+ return PAD1_open(&gpuDisp);
+}
+
+long PAD2__open(void) {
+ return PAD2_open(&gpuDisp);
+}
+
+void OnFile_Exit();
+
+void SignalExit(int sig) {
+ ClosePlugins();
+ OnFile_Exit();
+}
+
+void SPUirq(void);
+
+#define PARSEPATH(dst, src) \
+ ptr = src + strlen(src); \
+ while (*ptr != '\\' && ptr != src) ptr--; \
+ if (ptr != src) { \
+ strcpy(dst, ptr+1); \
+ }
+
+int _OpenPlugins() {
+ static char path[1024];
+ CFURLRef pathUrl;
+ int ret;
+
+ //signal(SIGINT, SignalExit);
+ //signal(SIGPIPE, SignalExit);
+
+ GPU_clearDynarec(clearDynarec);
+
+ pathUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("gpuPeopsSoftX.cfg"), NULL, NULL);
+ if (pathUrl)
+ CFURLGetFileSystemRepresentation(pathUrl, true, path, 1024);
+
+ ret = CDR_open();
+ if (ret < 0) { SysMessage(_("Error Opening CDR Plugin")); return -1; }
+ ret = SPU_open();
+ if (ret < 0) { SysMessage(_("Error Opening SPU Plugin")); return -1; }
+ SPU_registerCallback(SPUirq);
+ ret = GPU_open(&gpuDisp, "PCSX", /*pathUrl ? path :*/ NULL);
+ if (ret < 0) { SysMessage(_("Error Opening GPU Plugin")); return -1; }
+ ret = PAD1_open(&gpuDisp);
+ if (ret < 0) { SysMessage(_("Error Opening PAD1 Plugin")); return -1; }
+ ret = PAD2_open(&gpuDisp);
+ if (ret < 0) { SysMessage(_("Error Opening PAD2 Plugin")); return -1; }
+
+ return 0;
+}
+
+int OpenPlugins() {
+ int ret;
+
+ while ((ret = _OpenPlugins()) == -2) {
+ ReleasePlugins();
+ LoadMcds(Config.Mcd1, Config.Mcd2);
+ if (LoadPlugins() == -1) return -1;
+ }
+ return ret;
+}
+
+void ClosePlugins() {
+ int ret;
+
+ //signal(SIGINT, SIG_DFL);
+ //signal(SIGPIPE, SIG_DFL);
+ ret = CDR_close();
+ if (ret < 0) { SysMessage(_("Error Closing CDR Plugin")); return; }
+ ret = SPU_close();
+ if (ret < 0) { SysMessage(_("Error Closing SPU Plugin")); return; }
+ ret = PAD1_close();
+ if (ret < 0) { SysMessage(_("Error Closing PAD1 Plugin")); return; }
+ ret = PAD2_close();
+ if (ret < 0) { SysMessage(_("Error Closing PAD2 Plugin")); return; }
+ ret = GPU_close();
+ if (ret < 0) { SysMessage(_("Error Closing GPU Plugin")); return; }
+}
+
+void ResetPlugins() {
+ int ret;
+
+ CDR_shutdown();
+ GPU_shutdown();
+ SPU_shutdown();
+ PAD1_shutdown();
+ PAD2_shutdown();
+
+ ret = CDR_init();
+ if (ret < 0) { SysMessage(_("CDRinit error: %d"), ret); return; }
+ ret = GPU_init();
+ if (ret < 0) { SysMessage(_("GPUinit error: %d"), ret); return; }
+ ret = SPU_init();
+ if (ret < 0) { SysMessage(_("SPUinit error: %d"), ret); return; }
+ ret = PAD1_init(1);
+ if (ret < 0) { SysMessage(_("PAD1init error: %d"), ret); return; }
+ ret = PAD2_init(2);
+ if (ret < 0) { SysMessage(_("PAD2init error: %d"), ret); return; }
+
+ NetOpened = FALSE;
+}
+
diff --git a/macosx/PluginController.h b/macosx/PluginController.h
new file mode 100644
index 0000000..e04f152
--- /dev/null
+++ b/macosx/PluginController.h
@@ -0,0 +1,22 @@
+/* PluginController */
+
+#import <Cocoa/Cocoa.h>
+#import "PluginList.h"
+
+@interface PluginController : NSObject
+{
+ IBOutlet NSButton *aboutButton;
+ IBOutlet NSButton *configureButton;
+ IBOutlet NSPopUpButton *pluginMenu;
+
+ int pluginType;
+ NSArray *plugins;
+ NSString *defaultKey;
+}
+- (IBAction)doAbout:(id)sender;
+- (IBAction)doConfigure:(id)sender;
+- (IBAction)selectPlugin:(id)sender;
+
+- (void)setPluginsTo:(NSArray *)list withType:(int)type;
+
+@end
diff --git a/macosx/PluginController.m b/macosx/PluginController.m
new file mode 100644
index 0000000..007e619
--- /dev/null
+++ b/macosx/PluginController.m
@@ -0,0 +1,81 @@
+#import "PluginController.h"
+#import "PcsxPlugin.h"
+#import "PcsxController.h"
+
+@implementation PluginController
+
+- (IBAction)doAbout:(id)sender
+{
+ PcsxPlugin *plugin = [plugins objectAtIndex:[pluginMenu indexOfSelectedItem]];
+ [plugin aboutAs:pluginType];
+}
+
+- (IBAction)doConfigure:(id)sender
+{
+ PcsxPlugin *plugin = [plugins objectAtIndex:[pluginMenu indexOfSelectedItem]];
+
+ [plugin configureAs:pluginType];
+}
+
+- (IBAction)selectPlugin:(id)sender
+{
+ if (sender==pluginMenu) {
+ int index = [pluginMenu indexOfSelectedItem];
+ if (index != -1) {
+ PcsxPlugin *plugin = [plugins objectAtIndex:index];
+
+ if (![[PluginList list] setActivePlugin:plugin forType:pluginType]) {
+ /* plugin won't initialize */
+ }
+
+ // write selection to defaults
+ [[NSUserDefaults standardUserDefaults] setObject:[plugin path] forKey:defaultKey];
+
+ // set button states
+ [aboutButton setEnabled:[plugin hasAboutAs:pluginType]];
+ [configureButton setEnabled:[plugin hasConfigureAs:pluginType]];
+ } else {
+ // set button states
+ [aboutButton setEnabled:NO];
+ [configureButton setEnabled:NO];
+ }
+ }
+}
+
+// must be called before anything else
+- (void)setPluginsTo:(NSArray *)list withType:(int)type
+{
+ NSString *sel;
+ int i;
+
+ // remember the list
+ pluginType = type;
+ plugins = [list retain];
+ defaultKey = [[PcsxPlugin getDefaultKeyForType:pluginType] retain];
+
+ // clear the previous menu items
+ [pluginMenu removeAllItems];
+
+ // load the currently selected plugin
+ sel = [[NSUserDefaults standardUserDefaults] stringForKey:defaultKey];
+
+ // add the menu entries
+ for (i = 0; i < [plugins count]; i++) {
+ [pluginMenu addItemWithTitle:[[plugins objectAtIndex:i] description]];
+
+ // make sure the currently selected is set as such
+ if ([sel isEqualToString:[[plugins objectAtIndex:i] path]]) {
+ [pluginMenu selectItemAtIndex:i];
+ }
+ }
+
+ [self selectPlugin:pluginMenu];
+}
+
+- (void)dealloc
+{
+ if (plugins) [plugins release];
+ if (defaultKey) [defaultKey release];
+}
+
+@end
diff --git a/macosx/PluginList.h b/macosx/PluginList.h
new file mode 100644
index 0000000..fecc4b1
--- /dev/null
+++ b/macosx/PluginList.h
@@ -0,0 +1,36 @@
+//
+// PluginList.h
+// Pcsx
+//
+// Created by Gil Pedersen on Sun Sep 21 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "PcsxPlugin.h"
+
+//extern NSMutableArray *plugins;
+
+@interface PluginList : NSObject {
+
+ @private
+ NSMutableArray *pluginList;
+
+ PcsxPlugin *activeGpuPlugin;
+ PcsxPlugin *activeSpuPlugin;
+ PcsxPlugin *activeCdrPlugin;
+ PcsxPlugin *activePadPlugin;
+
+ BOOL missingPlugins;
+}
+
++ (PluginList *)list;
+
+- (void)refreshPlugins;
+- (NSArray *)pluginsForType:(int)typeMask;
+- (BOOL)hasPluginAtPath:(NSString *)path;
+- (BOOL)configured;
+- (PcsxPlugin *)activePluginForType:(int)type;
+- (BOOL)setActivePlugin:(PcsxPlugin *)plugin forType:(int)type;
+
+@end
diff --git a/macosx/PluginList.m b/macosx/PluginList.m
new file mode 100644
index 0000000..62c877c
--- /dev/null
+++ b/macosx/PluginList.m
@@ -0,0 +1,324 @@
+//
+// PluginList.m
+// Pcsx
+//
+// Created by Gil Pedersen on Sun Sep 21 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import "EmuThread.h"
+#import "PluginList.h"
+#import "PcsxPlugin.h"
+#include "psxcommon.h"
+#include "plugins.h"
+
+//NSMutableArray *plugins;
+static PluginList *sPluginList = nil;
+const static int typeList[4] = {PSE_LT_GPU, PSE_LT_SPU, PSE_LT_CDR, PSE_LT_PAD};
+
+@implementation PluginList
+
++ (PluginList *)list
+{
+ return sPluginList;
+}
+
+#if 0
++ (void)loadPlugins
+{
+ NSDirectoryEnumerator *dirEnum;
+ NSString *pname, *dir;
+
+ // Make sure we only load the plugins once
+ if (plugins != nil)
+ return;
+
+ plugins = [[NSMutableArray alloc] initWithCapacity: 20];
+
+ dir = [NSString stringWithCString:Config.PluginsDir];
+ dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir];
+
+ while (pname = [dirEnum nextObject]) {
+ if ([[pname pathExtension] isEqualToString:@"psxplugin"] ||
+ [[pname pathExtension] isEqualToString:@"so"]) {
+ [dirEnum skipDescendents]; /* don't enumerate this
+ directory */
+
+ PcsxPlugin *plugin = [[PcsxPlugin alloc] initWithPath:pname];
+ if (plugin != nil) {
+ [plugins addObject:plugin];
+ }
+ }
+ }
+}
+
+- (id)initWithType:(int)typeMask
+{
+ unsigned int i;
+
+ self = [super init];
+
+ [PluginList loadPlugins];
+ list = [[NSMutableArray alloc] initWithCapacity: 5];
+
+ type = typeMask;
+ for (i=0; i<[plugins count]; i++) {
+ PcsxPlugin *plugin = [plugins objectAtIndex:i];
+ if ([plugin getType] == type) {
+ [list addObject:plugin];
+ }
+ }
+
+ return self;
+}
+
+- (int)numberOfItems
+{
+ return [list count];
+}
+
+- (id)objectAtIndex:(unsigned)index
+{
+ return [list objectAtIndex:index];
+}
+#endif
+
+
+
+- (id)init
+{
+ int i;
+
+ if (!(self = [super init]))
+ return nil;
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ pluginList = [[NSMutableArray alloc] initWithCapacity:20];
+
+ activeGpuPlugin = activeSpuPlugin = activeCdrPlugin = activePadPlugin = nil;
+
+ missingPlugins = NO;
+ for (i=0; i<sizeof(*typeList); i++) {
+ NSString *path = [defaults stringForKey:[PcsxPlugin getDefaultKeyForType:typeList[i]]];
+ if (nil == path) {
+ missingPlugins = YES;
+ continue;
+ }
+ if ([path isEqualToString:@"Disabled"])
+ continue;
+
+ if (![self hasPluginAtPath:path]) {
+ PcsxPlugin *plugin = [[PcsxPlugin alloc] initWithPath:path];
+ if (plugin) {
+ [pluginList addObject:plugin];
+ if (![self setActivePlugin:plugin forType:typeList[i]])
+ missingPlugins = YES;
+ } else {
+ missingPlugins = YES;
+ }
+ }
+ }
+
+ if (missingPlugins) {
+ [self refreshPlugins];
+ }
+
+ sPluginList = self;
+
+ return self;
+}
+
+- (void)dealloc
+{
+ [activeGpuPlugin release];
+ [activeSpuPlugin release];
+ [activeCdrPlugin release];
+ [activePadPlugin release];
+
+ [pluginList release];
+
+ if (sPluginList == self)
+ sPluginList = nil;
+
+ [super dealloc];
+}
+
+- (void)refreshPlugins
+{
+ NSDirectoryEnumerator *dirEnum;
+ NSString *pname, *dir;
+ int i;
+
+ // verify that the ones that are in list still works
+ for (i=0; i<[pluginList count]; i++) {
+ if (![[pluginList objectAtIndex:i] verifyOK]) {
+ [pluginList removeObjectAtIndex:i]; i--;
+ }
+ }
+
+ // look for new ones in the plugin directory
+ dir = [NSString stringWithCString:Config.PluginsDir];
+ dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:dir];
+
+ while (pname = [dirEnum nextObject]) {
+ if ([[pname pathExtension] isEqualToString:@"psxplugin"] ||
+ [[pname pathExtension] isEqualToString:@"so"]) {
+ [dirEnum skipDescendents]; /* don't enumerate this
+ directory */
+
+ if (![self hasPluginAtPath:pname]) {
+ PcsxPlugin *plugin = [[PcsxPlugin alloc] initWithPath:pname];
+ if (plugin != nil) {
+ [pluginList addObject:plugin];
+ }
+ }
+ }
+ }
+
+ // check the we have the needed plugins
+ missingPlugins = NO;
+ for (i=0; i<sizeof(*typeList); i++) {
+ PcsxPlugin *plugin = [self activePluginForType:typeList[i]];
+ if (nil == plugin) {
+ NSArray *list = [self pluginsForType:typeList[i]];
+ int j;
+
+ for (j=0; j<[list count]; j++) {
+ if ([self setActivePlugin:[list objectAtIndex:j] forType:typeList[i]])
+ break;
+ }
+ if (j == [list count])
+ missingPlugins = YES;
+ }
+ }
+}
+
+- (NSArray *)pluginsForType:(int)typeMask
+{
+ NSMutableArray *types = [NSMutableArray array];
+ int i;
+
+ for (i=0; i<[pluginList count]; i++) {
+ PcsxPlugin *plugin = [pluginList objectAtIndex:i];
+
+ if ([plugin getType] & typeMask) {
+ [types addObject:plugin];
+ }
+ }
+
+ return types;
+}
+
+- (BOOL)hasPluginAtPath:(NSString *)path
+{
+ if (nil == path)
+ return NO;
+
+ int i;
+ for (i=0; i<[pluginList count]; i++) {
+ if ([[[pluginList objectAtIndex:i] path] isEqualToString:path])
+ return YES;
+ }
+
+ return NO;
+}
+
+// returns if all the required plugins are available
+- (BOOL)configured
+{
+ return !missingPlugins;
+}
+
+- (BOOL)doInitPlugins
+{
+ BOOL bad = NO;
+
+ if ([activeGpuPlugin initAs:PSE_LT_GPU] != 0) bad = YES;
+ if ([activeSpuPlugin initAs:PSE_LT_SPU] != 0) bad = YES;
+ if ([activeCdrPlugin initAs:PSE_LT_CDR] != 0) bad = YES;
+ if ([activePadPlugin initAs:PSE_LT_PAD] != 0) bad = YES;
+
+ return !bad;
+}
+
+- (PcsxPlugin *)activePluginForType:(int)type
+{
+ switch (type) {
+ case PSE_LT_GPU: return activeGpuPlugin;
+ case PSE_LT_CDR: return activeCdrPlugin;
+ case PSE_LT_SPU: return activeSpuPlugin;
+ case PSE_LT_PAD: return activePadPlugin;
+// case PSE_LT_NET: return activeNetPlugin;
+ }
+
+ return nil;
+}
+
+- (BOOL)setActivePlugin:(PcsxPlugin *)plugin forType:(int)type
+{
+ PcsxPlugin **pluginPtr;
+ switch (type) {
+ case PSE_LT_GPU: pluginPtr = &activeGpuPlugin; break;
+ case PSE_LT_CDR: pluginPtr = &activeCdrPlugin; break;
+ case PSE_LT_SPU: pluginPtr = &activeSpuPlugin; break;
+ case PSE_LT_PAD: pluginPtr = &activePadPlugin; break;
+// case PSE_LT_NET: pluginPtr = &activeNetPlugin; break;
+ default: return NO;
+ }
+
+ if (plugin == *pluginPtr)
+ return YES;
+
+ BOOL active = (*pluginPtr) && [EmuThread active];
+ BOOL wasPaused = NO;
+ if (active) {
+ // TODO: temporary freeze?
+ wasPaused = [EmuThread pauseSafe];
+ ClosePlugins();
+ ReleasePlugins();
+ }
+
+ // stop the old plugin and start the new one
+ if (*pluginPtr) {
+ [*pluginPtr shutdownAs:type];
+
+ [*pluginPtr release];
+ }
+ *pluginPtr = [plugin retain];
+ if (*pluginPtr) {
+ if ([*pluginPtr initAs:type] != 0) {
+ [*pluginPtr release];
+ *pluginPtr = nil;
+ }
+ }
+
+ // write path to the correct config entry
+ const char *str;
+ if (*pluginPtr != nil) {
+ str = [[plugin path] fileSystemRepresentation];
+ if (str == nil) {
+ str = "Invalid Plugin";
+ }
+ } else {
+ str = "Invalid Plugin";
+ }
+
+ char **dst = [PcsxPlugin getConfigEntriesForType:type];
+ while (*dst) {
+ strncpy(*dst, str, 255);
+ dst++;
+ }
+
+ if (active) {
+ LoadPlugins();
+ OpenPlugins();
+
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
+ }
+
+ return *pluginPtr != nil;
+}
+
+@end
diff --git a/macosx/config.h b/macosx/config.h
new file mode 100644
index 0000000..483c79b
--- /dev/null
+++ b/macosx/config.h
@@ -0,0 +1,31 @@
+//
+// Copyright (c) 2008, Wei Mingzhi. All rights reserved.
+//
+// Use, redistribution and modification of this code is unrestricted as long as this
+// notice is preserved.
+//
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 256
+#endif
+
+#ifndef PACKAGE_VERSION
+#define PACKAGE_VERSION "1.9"
+#endif
+
+#ifndef PREFIX
+#define PREFIX "./"
+#endif
+
+#ifndef inline
+#ifdef _DEBUG
+#define inline /* */
+#else
+#define inline __inline__
+#endif
+#endif
+
+#endif
diff --git a/macosx/icons/PCSX.icns b/macosx/icons/PCSX.icns
new file mode 100644
index 0000000..3f57a34
--- /dev/null
+++ b/macosx/icons/PCSX.icns
Binary files differ
diff --git a/macosx/icons/pcsxfreeze.icns b/macosx/icons/pcsxfreeze.icns
new file mode 100644
index 0000000..bcb21e6
--- /dev/null
+++ b/macosx/icons/pcsxfreeze.icns
Binary files differ
diff --git a/macosx/icons/pcsxmemcard.icns b/macosx/icons/pcsxmemcard.icns
new file mode 100644
index 0000000..f3e47b9
--- /dev/null
+++ b/macosx/icons/pcsxmemcard.icns
Binary files differ
diff --git a/macosx/icons/psxbios.icns b/macosx/icons/psxbios.icns
new file mode 100644
index 0000000..47baf9f
--- /dev/null
+++ b/macosx/icons/psxbios.icns
Binary files differ
diff --git a/macosx/icons/psxplugin.icns b/macosx/icons/psxplugin.icns
new file mode 100644
index 0000000..01a3c93
--- /dev/null
+++ b/macosx/icons/psxplugin.icns
Binary files differ
diff --git a/macosx/main.m b/macosx/main.m
new file mode 100644
index 0000000..ebd6e13
--- /dev/null
+++ b/macosx/main.m
@@ -0,0 +1,156 @@
+//
+// main.m
+//
+// Created by Gil Pedersen on Fri Jun 06 2003.
+// Copyright (c) 2003 SoftWorkz. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <Carbon/Carbon.h>
+#import "EmuThread.h"
+#include <dlfcn.h>
+//#import <sys/param.h>
+#import <unistd.h>
+#include "psxcommon.h"
+#include "sio.h"
+
+static BOOL sysInited = NO;
+//#define EMU_LOG
+
+int main(int argc, const char *argv[]) {
+ if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) {
+ char parentdir[MAXPATHLEN];
+ char *c;
+
+ strncpy ( parentdir, argv[0], sizeof(parentdir) );
+ c = (char*) parentdir;
+
+ while (*c != '\0') /* go to end */
+ c++;
+
+ while (*c != '/') /* back up to parent */
+ c--;
+
+ *c++ = '\0'; /* cut off last part (binary name) */
+
+ assert ( chdir (parentdir) == 0 ); /* chdir to the binary app's parent */
+ assert ( chdir ("../../../") == 0 ); /* chdir to the .app's parent */
+ }
+
+ strcpy(Config.BiosDir, "Bios/");
+ strcpy(Config.PatchesDir, "Patches/");
+
+ // Setup the X11 window
+ if (getenv("DISPLAY") == NULL)
+ setenv("DISPLAY", ":0.0", 0); // Default to first local display
+
+ return NSApplicationMain(argc, argv);
+}
+
+int SysInit() {
+ if (!sysInited) {
+#ifdef EMU_LOG
+#ifndef LOG_STDOUT
+ emuLog = fopen("emuLog.txt","wb");
+#else
+ emuLog = stdout;
+#endif
+ setvbuf(emuLog, NULL, _IONBF, 0);
+#endif
+
+ if (EmuInit() != 0)
+ return -1;
+
+ sysInited = YES;
+ }
+
+ if (LoadPlugins() == -1) {
+ return -1;
+ }
+
+ LoadMcds(Config.Mcd1, Config.Mcd2);
+
+ return 0;
+}
+
+void SysReset() {
+ [EmuThread resetNow];
+ //EmuReset();
+}
+
+void SysPrintf(const char *fmt, ...) {
+ va_list list;
+ char msg[512];
+
+ va_start(list, fmt);
+ vsprintf(msg, fmt, list);
+ va_end(list);
+
+ if (Config.PsxOut) printf ("%s", msg);
+#ifdef EMU_LOG
+#ifndef LOG_STDOUT
+ fprintf(emuLog, "%s", msg);
+#endif
+#endif
+}
+
+void SysMessage(const char *fmt, ...) {
+ va_list list;
+ char msg[512];
+
+ NSString *locFmtString = NSLocalizedString([NSString stringWithCString:fmt], nil);
+
+ va_start(list, fmt);
+ vsprintf(msg, [locFmtString lossyCString], list);
+ va_end(list);
+
+ NSRunAlertPanel(NSLocalizedString(@"Error!", nil),
+ [NSString stringWithCString:msg],
+ nil, nil, nil);
+}
+
+void *SysLoadLibrary(const char *lib) {
+ NSBundle *bundle = [NSBundle bundleWithPath:[NSString stringWithCString:lib]];
+ if (bundle != nil) {
+ return dlopen([[bundle executablePath] fileSystemRepresentation], RTLD_LAZY /*RTLD_NOW*/);
+ }
+ return dlopen(lib, RTLD_LAZY);
+}
+
+void *SysLoadSym(void *lib, const char *sym) {
+ return dlsym(lib, sym);
+}
+
+const char *SysLibError() {
+ return dlerror();
+}
+
+void SysCloseLibrary(void *lib) {
+ //dlclose(lib);
+}
+
+// Called periodically from the emu thread
+void SysUpdate() {
+ UpdateSystemActivity(UsrActivity);
+
+ [emuThread handleEvents];
+}
+
+// Returns to the Gui
+void SysRunGui() {
+}
+
+// Close mem and plugins
+void SysClose() {
+ EmuShutdown();
+ ReleasePlugins();
+
+ if (emuLog != NULL) fclose(emuLog);
+
+ sysInited = NO;
+}
+
+void OnFile_Exit() {
+ SysClose();
+ exit(0);
+}
diff --git a/macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj b/macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..e5767cb
--- /dev/null
+++ b/macosx/plugins/DFCdrom/DFCdrom.xcodeproj/project.pbxproj
@@ -0,0 +1,360 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2BD707180555997500CB5D9B /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BD707170555997500CB5D9B /* IOKit.framework */; };
+ 713DB2E811F113C30001BDD4 /* cdr.c in Sources */ = {isa = PBXBuildFile; fileRef = 713DB2E311F113C30001BDD4 /* cdr.c */; };
+ 713DB2E911F113C30001BDD4 /* cdr.h in Headers */ = {isa = PBXBuildFile; fileRef = 713DB2E411F113C30001BDD4 /* cdr.h */; };
+ 713DB2EB11F113C30001BDD4 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 713DB2E611F113C30001BDD4 /* util.c */; };
+ 71F3C32811F3CD0B007B9F12 /* cdr-macosx.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */; };
+ 71F3C32911F3CD0B007B9F12 /* cfg.c in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32511F3CD0B007B9F12 /* cfg.c */; };
+ 71F3C32A11F3CD0B007B9F12 /* PluginConfigController.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */; };
+ 71F3C32B11F3CD0B007B9F12 /* PluginConfigController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */; };
+ 71F3C38611F3CFED007B9F12 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71F3C38511F3CFED007B9F12 /* AppKit.framework */; };
+ 71F3C38811F3CFF7007B9F12 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71F3C38711F3CFF7007B9F12 /* Carbon.framework */; };
+ 71F3C47A11F3D108007B9F12 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 71F3C47811F3D108007B9F12 /* Credits.rtf */; };
+ 71F3C49D11F3D2B3007B9F12 /* DFCdromPluginConfig.nib in Resources */ = {isa = PBXBuildFile; fileRef = 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */; };
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 2BD707170555997500CB5D9B /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+ 713DB2E311F113C30001BDD4 /* cdr.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = cdr.c; path = ../../../plugins/dfcdrom/cdr.c; sourceTree = SOURCE_ROOT; };
+ 713DB2E411F113C30001BDD4 /* cdr.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = cdr.h; path = ../../../plugins/dfcdrom/cdr.h; sourceTree = SOURCE_ROOT; };
+ 713DB2E611F113C30001BDD4 /* util.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../../../plugins/dfcdrom/util.c; sourceTree = SOURCE_ROOT; };
+ 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = "cdr-macosx.c"; path = "macsrc/cdr-macosx.c"; sourceTree = "<group>"; };
+ 71F3C32511F3CD0B007B9F12 /* cfg.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = cfg.c; path = macsrc/cfg.c; sourceTree = "<group>"; };
+ 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = PluginConfigController.h; path = macsrc/PluginConfigController.h; sourceTree = "<group>"; };
+ 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = PluginConfigController.m; path = macsrc/PluginConfigController.m; sourceTree = "<group>"; };
+ 71F3C38511F3CFED007B9F12 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 71F3C38711F3CFF7007B9F12 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ 71F3C47911F3D108007B9F12 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 71F3C49C11F3D2B3007B9F12 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/DFCdromPluginConfig.nib; sourceTree = "<group>"; };
+ 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DFCdrom.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D576313048677EA00EA77CD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
+ 2BD707180555997500CB5D9B /* IOKit.framework in Frameworks */,
+ 71F3C38611F3CFED007B9F12 /* AppKit.framework in Frameworks */,
+ 71F3C38811F3CFF7007B9F12 /* Carbon.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* CdrDevMac */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB77AFFE84173DC02AAC07 /* Source Files */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
+ 19C28FB6FE9D52B211CA2CBB /* Products */,
+ );
+ name = CdrDevMac;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 71F3C38511F3CFED007B9F12 /* AppKit.framework */,
+ 71F3C38711F3CFF7007B9F12 /* Carbon.framework */,
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
+ 2BD707170555997500CB5D9B /* IOKit.framework */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */,
+ 71F3C47811F3D108007B9F12 /* Credits.rtf */,
+ 8D576317048677EA00EA77CD /* Info.plist */,
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 08FB77AFFE84173DC02AAC07 /* Source Files */ = {
+ isa = PBXGroup;
+ children = (
+ 71F3C32111F3CCEF007B9F12 /* macsrc */,
+ 71F3C30911F3CC22007B9F12 /* src */,
+ );
+ name = "Source Files";
+ sourceTree = "<group>";
+ };
+ 19C28FB6FE9D52B211CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 71F3C30911F3CC22007B9F12 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 713DB2E311F113C30001BDD4 /* cdr.c */,
+ 713DB2E411F113C30001BDD4 /* cdr.h */,
+ 713DB2E611F113C30001BDD4 /* util.c */,
+ );
+ name = src;
+ sourceTree = "<group>";
+ };
+ 71F3C32111F3CCEF007B9F12 /* macsrc */ = {
+ isa = PBXGroup;
+ children = (
+ 71F3C32411F3CD0B007B9F12 /* cdr-macosx.c */,
+ 71F3C32511F3CD0B007B9F12 /* cfg.c */,
+ 71F3C32611F3CD0B007B9F12 /* PluginConfigController.h */,
+ 71F3C32711F3CD0B007B9F12 /* PluginConfigController.m */,
+ );
+ name = macsrc;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 8D57630E048677EA00EA77CD /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 713DB2E911F113C30001BDD4 /* cdr.h in Headers */,
+ 71F3C32A11F3CD0B007B9F12 /* PluginConfigController.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 8D57630D048677EA00EA77CD /* DFCdrom */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "DFCdrom" */;
+ buildPhases = (
+ 8D57630E048677EA00EA77CD /* Headers */,
+ 8D57630F048677EA00EA77CD /* Resources */,
+ 8D576311048677EA00EA77CD /* Sources */,
+ 8D576313048677EA00EA77CD /* Frameworks */,
+ 8D576315048677EA00EA77CD /* Rez */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = DFCdrom;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = CdrDevMac;
+ productReference = 8D576316048677EA00EA77CD /* DFCdrom.psxplugin */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "DFCdrom" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 089C166AFE841209C02AAC07 /* CdrDevMac */;
+ projectDirPath = "";
+ targets = (
+ 8D57630D048677EA00EA77CD /* DFCdrom */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D57630F048677EA00EA77CD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
+ 71F3C47A11F3D108007B9F12 /* Credits.rtf in Resources */,
+ 71F3C49D11F3D2B3007B9F12 /* DFCdromPluginConfig.nib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+ 8D576315048677EA00EA77CD /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D576311048677EA00EA77CD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 713DB2E811F113C30001BDD4 /* cdr.c in Sources */,
+ 713DB2EB11F113C30001BDD4 /* util.c in Sources */,
+ 71F3C32811F3CD0B007B9F12 /* cdr-macosx.c in Sources */,
+ 71F3C32911F3CD0B007B9F12 /* cfg.c in Sources */,
+ 71F3C32B11F3CD0B007B9F12 /* PluginConfigController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 71F3C47811F3D108007B9F12 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 71F3C47911F3D108007B9F12 /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 71F3C49B11F3D2B3007B9F12 /* DFCdromPluginConfig.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 71F3C49C11F3D2B3007B9F12 /* English */,
+ );
+ name = DFCdromPluginConfig.nib;
+ sourceTree = "<group>";
+ };
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 7107359A0FDEED75004AD098 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = DFCdrom;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ };
+ name = Development;
+ };
+ 7107359B0FDEED75004AD098 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUGGING_SYMBOLS = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = s;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = DFCdrom;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 7107359F0FDEED75004AD098 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfcdrom,
+ );
+ STRIP_INSTALLED_PRODUCT = NO;
+ };
+ name = Development;
+ };
+ 710735A00FDEED75004AD098 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_MODEL_TUNING = "";
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfcdrom,
+ );
+ };
+ name = Deployment;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 710735990FDEED75004AD098 /* Build configuration list for PBXNativeTarget "DFCdrom" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7107359A0FDEED75004AD098 /* Development */,
+ 7107359B0FDEED75004AD098 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+ 7107359E0FDEED75004AD098 /* Build configuration list for PBXProject "DFCdrom" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7107359F0FDEED75004AD098 /* Development */,
+ 710735A00FDEED75004AD098 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/macosx/plugins/DFCdrom/English.lproj/Credits.rtf b/macosx/plugins/DFCdrom/English.lproj/Credits.rtf
new file mode 100644
index 0000000..76fa644
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/Credits.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10025\cocoartf824\cocoasubrtf420
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Original coder:
+\f1\b0 \
+ linuzappz\
+\
+
+\f0\b Macintosh Port:
+\f1\b0 \
+ Wei Mingzhi} \ No newline at end of file
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib
new file mode 100644
index 0000000..b1e8f6c
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/classes.nib
@@ -0,0 +1,18 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {cancel = id; ok = id; };
+ CLASS = DFCdromPluginConfigController;
+ LANGUAGE = ObjC;
+ OUTLETS = {CacheSize = NSSlider; Cached = NSControl; CdSpeed = NSPopUpButton; };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ ACTIONS = {"" = id; };
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib
new file mode 100644
index 0000000..f90f50b
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/info.nib
@@ -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>IBDocumentLocation</key>
+ <string>117 49 561 249 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>5</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib
new file mode 100644
index 0000000..64a5021
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/DFCdromPluginConfig.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings b/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000..ea885a5
--- /dev/null
+++ b/macosx/plugins/DFCdrom/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/macosx/plugins/DFCdrom/Info.plist b/macosx/plugins/DFCdrom/Info.plist
new file mode 100644
index 0000000..ee25402
--- /dev/null
+++ b/macosx/plugins/DFCdrom/Info.plist
@@ -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>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>DFCdrom</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>net.pcsx.DFCdrom</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>PsxP</string>
+ <key>CFBundleSignature</key>
+ <string>CdDI</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h
new file mode 100644
index 0000000..b7f6faf
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.h
@@ -0,0 +1,18 @@
+#define PluginConfigController DFCdromPluginConfigController
+
+#import <Cocoa/Cocoa.h>
+
+@interface PluginConfigController : NSWindowController
+{
+ IBOutlet NSControl *Cached;
+ IBOutlet NSSlider *CacheSize;
+ IBOutlet NSPopUpButton *CdSpeed;
+
+ NSMutableDictionary *keyValues;
+}
+- (IBAction)cancel:(id)sender;
+- (IBAction)ok:(id)sender;
+
+- (void)loadValues;
+
+@end
diff --git a/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
new file mode 100644
index 0000000..02b3a76
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/PluginConfigController.m
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import "PluginConfigController.h"
+#include "cdr.h"
+
+#define APP_ID @"net.pcsx.DFCdrom"
+#define PrefsKey APP_ID @" Settings"
+
+static PluginConfigController *windowController;
+
+void AboutDlgProc()
+{
+ // Get parent application instance
+ NSApplication *app = [NSApplication sharedApplication];
+ NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID];
+
+ // Get Credits.rtf
+ NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"];
+ NSAttributedString *credits;
+ if (path) {
+ credits = [[[NSAttributedString alloc] initWithPath: path
+ documentAttributes:NULL] autorelease];
+ } else {
+ credits = [[[NSAttributedString alloc] initWithString:@""] autorelease];
+ }
+
+ // Get Application Icon
+ NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]];
+ NSSize size = NSMakeSize(64, 64);
+ [icon setSize:size];
+
+ [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:
+ [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName",
+ icon, @"ApplicationIcon",
+ [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion",
+ [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version",
+ [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright",
+ credits, @"Credits",
+ nil]];
+}
+
+void ConfDlgProc()
+{
+ NSWindow *window;
+
+ if (windowController == nil) {
+ windowController = [[PluginConfigController alloc] initWithWindowNibName:@"DFCdromPluginConfig"];
+ }
+ window = [windowController window];
+
+ [windowController loadValues];
+
+ [window center];
+ [window makeKeyAndOrderFront:nil];
+}
+
+void ReadConfig()
+{
+ NSDictionary *keyValues;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"Threaded",
+ [NSNumber numberWithInt:64], @"Cache Size",
+ [NSNumber numberWithInt:0], @"Speed",
+ nil], PrefsKey, nil]];
+
+ keyValues = [defaults dictionaryForKey:PrefsKey];
+
+ ReadMode = ([[keyValues objectForKey:@"Threaded"] boolValue] ? THREADED : NORMAL);
+ CacheSize = [[keyValues objectForKey:@"Cache Size"] intValue];
+ CdrSpeed = [[keyValues objectForKey:@"Speed"] intValue];
+}
+
+@implementation PluginConfigController
+
+- (IBAction)cancel:(id)sender
+{
+ [self close];
+}
+
+- (IBAction)ok:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ NSMutableDictionary *writeDic = [NSMutableDictionary dictionaryWithDictionary:keyValues];
+
+ [writeDic setObject:[NSNumber numberWithInt:[Cached intValue]] forKey:@"Threaded"];
+ [writeDic setObject:[NSNumber numberWithInt:[CacheSize intValue]] forKey:@"Cache Size"];
+
+ switch ([CdSpeed indexOfSelectedItem]) {
+ case 1: [writeDic setObject:[NSNumber numberWithInt:1] forKey:@"Speed"]; break;
+ case 2: [writeDic setObject:[NSNumber numberWithInt:2] forKey:@"Speed"]; break;
+ case 3: [writeDic setObject:[NSNumber numberWithInt:4] forKey:@"Speed"]; break;
+ case 4: [writeDic setObject:[NSNumber numberWithInt:8] forKey:@"Speed"]; break;
+ case 5: [writeDic setObject:[NSNumber numberWithInt:16] forKey:@"Speed"]; break;
+ case 6: [writeDic setObject:[NSNumber numberWithInt:32] forKey:@"Speed"]; break;
+ default: [writeDic setObject:[NSNumber numberWithInt:0] forKey:@"Speed"]; break;
+ }
+
+ // write to defaults
+ [defaults setObject:writeDic forKey:PrefsKey];
+ [defaults synchronize];
+
+ // and set global values accordingly
+ ReadConfig();
+
+ [self close];
+}
+
+- (void)loadValues
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ ReadConfig();
+
+ // load from preferences
+ [keyValues release];
+ keyValues = [[defaults dictionaryForKey:PrefsKey] retain];
+
+ [Cached setIntValue:[[keyValues objectForKey:@"Threaded"] intValue]];
+ [CacheSize setIntValue:[[keyValues objectForKey:@"Cache Size"] intValue]];
+
+ switch ([[keyValues objectForKey:@"Speed"] intValue]) {
+ case 1: [CdSpeed selectItemAtIndex:1]; break;
+ case 2: [CdSpeed selectItemAtIndex:2]; break;
+ case 4: [CdSpeed selectItemAtIndex:3]; break;
+ case 8: [CdSpeed selectItemAtIndex:4]; break;
+ case 16: [CdSpeed selectItemAtIndex:5]; break;
+ case 32: [CdSpeed selectItemAtIndex:6]; break;
+ default: [CdSpeed selectItemAtIndex:0]; break;
+ }
+}
+
+- (void)awakeFromNib
+{
+}
+
+@end
diff --git a/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
new file mode 100644
index 0000000..806b659
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/cdr-macosx.c
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "cdr.h"
+
+#ifdef _MACOSX
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOBSD.h>
+#include <IOKit/storage/IOCDMedia.h>
+#include <IOKit/storage/IODVDMedia.h>
+#include <IOKit/storage/IOMedia.h>
+#include <IOKit/storage/IOCDMediaBSDClient.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+int cdHandle = -1;
+char cdDevice[4096] = "";
+
+static int IsPsxDisc(const char *dev) {
+ int fd;
+ char buf[CD_FRAMESIZE_RAW];
+ dk_cd_read_t r;
+
+ fd = open(dev, O_RDONLY, 0);
+ if (fd < 0) return 0;
+
+ memset(&r, 0, sizeof(r));
+
+ r.offset = msf_to_lba(0, 2, 4) * CD_FRAMESIZE_RAW;
+ r.sectorArea = 0xF8;
+ r.sectorType = kCDSectorTypeUnknown;
+ r.bufferLength = CD_FRAMESIZE_RAW;
+ r.buffer = buf;
+
+ if (ioctl(fd, DKIOCCDREAD, &r) != kIOReturnSuccess) {
+ close(fd);
+ return 0;
+ }
+
+ close(fd);
+
+ if (strncmp(buf + 56, "Sony Computer Entertainment", 27) == 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
+static void FindCdDevice(char *dev) {
+ io_object_t next_media;
+ kern_return_t kern_result;
+ io_iterator_t media_iterator;
+ CFMutableDictionaryRef classes_to_match;
+ const char *name, *cd = kIOCDMediaClass, *dvd = kIODVDMediaClass;
+
+ dev[0] = '\0';
+ name = cd;
+
+start:
+ classes_to_match = IOServiceMatching(name);
+ if (classes_to_match == NULL) goto end;
+
+ CFDictionarySetValue(classes_to_match, CFSTR(kIOMediaEjectableKey),
+ kCFBooleanTrue);
+
+ kern_result = IOServiceGetMatchingServices(kIOMasterPortDefault,
+ classes_to_match, &media_iterator);
+
+ if (kern_result != KERN_SUCCESS) goto end;
+
+ next_media = IOIteratorNext(media_iterator);
+ if (next_media != 0) {
+ char psz_buf[0x32];
+ size_t dev_path_length;
+ CFTypeRef str_bsd_path;
+
+ do {
+ str_bsd_path = IORegistryEntryCreateCFProperty(next_media,
+ CFSTR(kIOBSDNameKey), kCFAllocatorDefault, 0);
+
+ if (str_bsd_path == NULL) {
+ IOObjectRelease(next_media);
+ continue;
+ }
+
+ strcpy(psz_buf, "/dev/r");
+ dev_path_length = strlen(psz_buf);
+
+ if (CFStringGetCString(str_bsd_path, (char *)&psz_buf + dev_path_length,
+ sizeof(psz_buf) - dev_path_length, kCFStringEncodingASCII))
+ {
+ strcpy(dev, psz_buf);
+
+ if (IsPsxDisc(dev)) {
+ CFRelease(str_bsd_path);
+ IOObjectRelease(next_media);
+ IOObjectRelease(media_iterator);
+ return;
+ }
+ }
+
+ CFRelease(str_bsd_path);
+ IOObjectRelease(next_media);
+ } while ((next_media = IOIteratorNext(media_iterator)) != 0);
+ }
+
+ IOObjectRelease(media_iterator);
+
+end:
+ if (dev[0] == '\0') {
+ if (name == cd) {
+ name = dvd; // Is this really necessary or correct? Dunno...
+ goto start;
+ }
+ }
+}
+
+int OpenCdHandle(const char *dev) {
+ if (dev != NULL && dev[0] != '\0') strcpy(cdDevice, dev);
+ else if (cdDevice[0] == '\0') FindCdDevice(cdDevice);
+
+ cdHandle = open(cdDevice, O_RDONLY, 0);
+ if (cdHandle < 0) return -1;
+
+ if (CdrSpeed > 0) {
+ u_int16_t speed = kCDSpeedMin * CdrSpeed;
+ ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
+ }
+
+ return 0;
+}
+
+void CloseCdHandle() {
+ if (cdHandle != -1) close(cdHandle);
+ cdHandle = -1;
+}
+
+int IsCdHandleOpen() {
+ return 1;
+}
+
+long GetTN(unsigned char *buffer) {
+ if (cdHandle < 0) return -1;
+
+ // TODO
+ buffer[0] = 1;
+ buffer[1] = 1;
+
+ return 0;
+}
+
+long GetTD(unsigned char track, unsigned char *buffer) {
+ if (cdHandle < 0) return -1;
+
+ // TODO
+ memset(buffer + 1, 0, 3);
+ return 0;
+}
+
+long GetTE(unsigned char track, unsigned char *m, unsigned char *s, unsigned char *f) {
+ return -1; // TODO
+}
+
+long ReadSector(crdata *cr) {
+ int lba;
+ dk_cd_read_t r;
+
+ if (cdHandle < 0) return -1;
+
+ lba = msf_to_lba(cr->msf.cdmsf_min0, cr->msf.cdmsf_sec0, cr->msf.cdmsf_frame0);
+
+ memset(&r, 0, sizeof(r));
+
+ r.offset = lba * CD_FRAMESIZE_RAW;
+ r.sectorArea = 0xF8;
+ r.sectorType = kCDSectorTypeUnknown;
+ r.bufferLength = CD_FRAMESIZE_RAW;
+ r.buffer = cr->buf;
+
+ if (ioctl(cdHandle, DKIOCCDREAD, &r) != kIOReturnSuccess) {
+ return -1;
+ }
+
+ return 0;
+}
+
+long PlayCDDA(unsigned char *sector) {
+ return 0; // TODO
+}
+
+long StopCDDA() {
+ return 0; // TODO
+}
+
+long GetStatus(int playing, struct CdrStat *stat) {
+ memset(stat, 0, sizeof(struct CdrStat));
+ stat->Type = 0x01;
+
+ // Close and reopen the CD handle. If opening failed,
+ // then there is no CD in drive.
+ // Note that this WILL be screwed if user inserted another
+ // removable device such as USB stick when tray is open.
+ // There may be a better way, but this should do the job.
+ if (cdHandle >= 0) {
+ close(cdHandle);
+ cdHandle = -1;
+ }
+
+ cdHandle = open(cdDevice, O_RDONLY, 0);
+ if (cdHandle < 0) {
+ // No CD in drive
+ stat->Type = 0xff;
+ stat->Status |= 0x10;
+ } else {
+ if (CdrSpeed > 0) {
+ u_int16_t speed = kCDSpeedMin * CdrSpeed;
+ ioctl(cdHandle, DKIOCCDSETSPEED, &speed);
+ }
+ }
+
+ return 0;
+}
+
+unsigned char *ReadSub(const unsigned char *time) {
+ return NULL; // TODO
+}
+
+char *CDRgetDriveLetter(void) {
+ return cdDevice;
+}
+
+#endif
diff --git a/macosx/plugins/DFCdrom/macsrc/cfg.c b/macosx/plugins/DFCdrom/macsrc/cfg.c
new file mode 100644
index 0000000..6b5c151
--- /dev/null
+++ b/macosx/plugins/DFCdrom/macsrc/cfg.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: Cdrom for Psemu Pro like Emulators
+ * By: linuzappz <linuzappz@hotmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "cdr.h"
+
+void AboutDlgProc();
+void ConfDlgProc();
+void ReadConfig();
+
+char CdromDev[256];
+long ReadMode;
+long UseSubQ;
+long CacheSize;
+long CdrSpeed;
+long SpinDown;
+
+void LoadConf() {
+ strcpy(CdromDev, "");
+ ReadMode = THREADED;
+ UseSubQ = 0;
+ CacheSize = 64;
+ CdrSpeed = 0;
+ SpinDown = SPINDOWN_VENDOR_SPECIFIC;
+
+ ReadConfig();
+}
+
+long CDRconfigure() {
+ ConfDlgProc();
+ return 0;
+}
+
+void CDRabout() {
+ AboutDlgProc();
+} \ No newline at end of file
diff --git a/macosx/plugins/DFCdrom/version.plist b/macosx/plugins/DFCdrom/version.plist
new file mode 100644
index 0000000..a9c51a6
--- /dev/null
+++ b/macosx/plugins/DFCdrom/version.plist
@@ -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>38</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>ProjectName</key>
+ <string>DFCdrom</string>
+ <key>SourceVersion</key>
+ <string>2350000</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFInput/DFInput.xcodeproj/project.pbxproj b/macosx/plugins/DFInput/DFInput.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..35a8d87
--- /dev/null
+++ b/macosx/plugins/DFInput/DFInput.xcodeproj/project.pbxproj
@@ -0,0 +1,569 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2B679862069193F300E2BD4F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B679860069193F300E2BD4F /* Cocoa.framework */; };
+ 2B679863069193F300E2BD4F /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B679861069193F300E2BD4F /* IOKit.framework */; };
+ 71054DC51204A20900AC2CCB /* begin_code.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA11204A20900AC2CCB /* begin_code.h */; };
+ 71054DC61204A20900AC2CCB /* close_code.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA21204A20900AC2CCB /* close_code.h */; };
+ 71054DC71204A20900AC2CCB /* SDL.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA31204A20900AC2CCB /* SDL.h */; };
+ 71054DC81204A20900AC2CCB /* SDL_assert.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA41204A20900AC2CCB /* SDL_assert.h */; };
+ 71054DC91204A20900AC2CCB /* SDL_config.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA51204A20900AC2CCB /* SDL_config.h */; };
+ 71054DCA1204A20900AC2CCB /* SDL_endian.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA61204A20900AC2CCB /* SDL_endian.h */; };
+ 71054DCB1204A20900AC2CCB /* SDL_error.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA71204A20900AC2CCB /* SDL_error.h */; };
+ 71054DCC1204A20900AC2CCB /* SDL_haptic.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA81204A20900AC2CCB /* SDL_haptic.h */; };
+ 71054DCD1204A20900AC2CCB /* SDL_joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DA91204A20900AC2CCB /* SDL_joystick.h */; };
+ 71054DCE1204A20900AC2CCB /* SDL_main.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DAA1204A20900AC2CCB /* SDL_main.h */; };
+ 71054DD01204A20900AC2CCB /* SDL_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DAC1204A20900AC2CCB /* SDL_platform.h */; };
+ 71054DD31204A20900AC2CCB /* SDL_stdinc.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DAF1204A20900AC2CCB /* SDL_stdinc.h */; };
+ 71054DD61204A20900AC2CCB /* SDL_syshaptic.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DB51204A20900AC2CCB /* SDL_syshaptic.c */; };
+ 71054DD71204A20900AC2CCB /* SDL_haptic.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DB61204A20900AC2CCB /* SDL_haptic.c */; };
+ 71054DD81204A20900AC2CCB /* SDL_haptic_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DB71204A20900AC2CCB /* SDL_haptic_c.h */; };
+ 71054DD91204A20900AC2CCB /* SDL_syshaptic.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DB81204A20900AC2CCB /* SDL_syshaptic.h */; };
+ 71054DDA1204A20900AC2CCB /* SDL_sysjoystick.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DBB1204A20900AC2CCB /* SDL_sysjoystick.c */; };
+ 71054DDB1204A20900AC2CCB /* SDL_sysjoystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DBC1204A20900AC2CCB /* SDL_sysjoystick_c.h */; };
+ 71054DDC1204A20900AC2CCB /* SDL_joystick.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DBD1204A20900AC2CCB /* SDL_joystick.c */; };
+ 71054DDD1204A20900AC2CCB /* SDL_joystick_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DBE1204A20900AC2CCB /* SDL_joystick_c.h */; };
+ 71054DDE1204A20900AC2CCB /* SDL_sysjoystick.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DBF1204A20900AC2CCB /* SDL_sysjoystick.h */; };
+ 71054DDF1204A20900AC2CCB /* SDL.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DC01204A20900AC2CCB /* SDL.c */; };
+ 71054DE21204A20900AC2CCB /* SDL_error.c in Sources */ = {isa = PBXBuildFile; fileRef = 71054DC31204A20900AC2CCB /* SDL_error.c */; };
+ 71054DE31204A20900AC2CCB /* SDL_error_c.h in Headers */ = {isa = PBXBuildFile; fileRef = 71054DC41204A20900AC2CCB /* SDL_error_c.h */; };
+ 71054E211204A49F00AC2CCB /* ForceFeedback.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71054E201204A49F00AC2CCB /* ForceFeedback.framework */; };
+ 7136F1DA1200E163001973D9 /* ControllerList.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E861A411FF75AC001C1826 /* ControllerList.h */; };
+ 7136F1DB1200E163001973D9 /* ControllerList.m in Sources */ = {isa = PBXBuildFile; fileRef = 71E861A511FF75AC001C1826 /* ControllerList.m */; };
+ 7136F1DC1200E164001973D9 /* MappingCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E861A811FF75AC001C1826 /* MappingCell.h */; };
+ 7136F1DD1200E164001973D9 /* MappingCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 71E861A911FF75AC001C1826 /* MappingCell.m */; };
+ 7136F1DE1200E165001973D9 /* PadController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71E861AB11FF75AC001C1826 /* PadController.m */; };
+ 7136F1DF1200E165001973D9 /* PadController.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E861AA11FF75AC001C1826 /* PadController.h */; };
+ 7136F51A12011BB4001973D9 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 7136F51812011BB4001973D9 /* Credits.rtf */; };
+ 714FA82E11FC822A00517F47 /* analog.c in Sources */ = {isa = PBXBuildFile; fileRef = 714FA82A11FC822A00517F47 /* analog.c */; };
+ 714FA82F11FC822A00517F47 /* pad.c in Sources */ = {isa = PBXBuildFile; fileRef = 714FA82B11FC822A00517F47 /* pad.c */; };
+ 714FA83011FC822A00517F47 /* pad.h in Headers */ = {isa = PBXBuildFile; fileRef = 714FA82C11FC822A00517F47 /* pad.h */; };
+ 714FA83111FC822A00517F47 /* sdljoy.c in Sources */ = {isa = PBXBuildFile; fileRef = 714FA82D11FC822A00517F47 /* sdljoy.c */; };
+ 714FA8A011FC846800517F47 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 714FA89F11FC846800517F47 /* Carbon.framework */; };
+ 714FA8FA11FC863500517F47 /* cfg.c in Sources */ = {isa = PBXBuildFile; fileRef = 714FA8F811FC863500517F47 /* cfg.c */; };
+ 714FA8FB11FC863500517F47 /* xkb.c in Sources */ = {isa = PBXBuildFile; fileRef = 714FA8F911FC863500517F47 /* xkb.c */; };
+ 7192EAAE1200D54500038B92 /* cfg.h in Headers */ = {isa = PBXBuildFile; fileRef = 7192EAAB1200D54500038B92 /* cfg.h */; };
+ 71E861B611FF75AC001C1826 /* PadView.h in Headers */ = {isa = PBXBuildFile; fileRef = 71E861AC11FF75AC001C1826 /* PadView.h */; };
+ 71E861B711FF75AC001C1826 /* PadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 71E861AD11FF75AC001C1826 /* PadView.m */; };
+ 71E861BC11FF75BA001C1826 /* NetPcsxHIDInputPluginMain.nib in Resources */ = {isa = PBXBuildFile; fileRef = 71E861BA11FF75BA001C1826 /* NetPcsxHIDInputPluginMain.nib */; };
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 2B679860069193F300E2BD4F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 2B679861069193F300E2BD4F /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
+ 71054DA11204A20900AC2CCB /* begin_code.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = begin_code.h; sourceTree = "<group>"; };
+ 71054DA21204A20900AC2CCB /* close_code.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = close_code.h; sourceTree = "<group>"; };
+ 71054DA31204A20900AC2CCB /* SDL.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL.h; sourceTree = "<group>"; };
+ 71054DA41204A20900AC2CCB /* SDL_assert.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_assert.h; sourceTree = "<group>"; };
+ 71054DA51204A20900AC2CCB /* SDL_config.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_config.h; sourceTree = "<group>"; };
+ 71054DA61204A20900AC2CCB /* SDL_endian.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_endian.h; sourceTree = "<group>"; };
+ 71054DA71204A20900AC2CCB /* SDL_error.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_error.h; sourceTree = "<group>"; };
+ 71054DA81204A20900AC2CCB /* SDL_haptic.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_haptic.h; sourceTree = "<group>"; };
+ 71054DA91204A20900AC2CCB /* SDL_joystick.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_joystick.h; sourceTree = "<group>"; };
+ 71054DAA1204A20900AC2CCB /* SDL_main.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_main.h; sourceTree = "<group>"; };
+ 71054DAC1204A20900AC2CCB /* SDL_platform.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_platform.h; sourceTree = "<group>"; };
+ 71054DAF1204A20900AC2CCB /* SDL_stdinc.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_stdinc.h; sourceTree = "<group>"; };
+ 71054DB51204A20900AC2CCB /* SDL_syshaptic.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL_syshaptic.c; sourceTree = "<group>"; };
+ 71054DB61204A20900AC2CCB /* SDL_haptic.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL_haptic.c; sourceTree = "<group>"; };
+ 71054DB71204A20900AC2CCB /* SDL_haptic_c.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_haptic_c.h; sourceTree = "<group>"; };
+ 71054DB81204A20900AC2CCB /* SDL_syshaptic.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_syshaptic.h; sourceTree = "<group>"; };
+ 71054DBB1204A20900AC2CCB /* SDL_sysjoystick.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL_sysjoystick.c; sourceTree = "<group>"; };
+ 71054DBC1204A20900AC2CCB /* SDL_sysjoystick_c.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_sysjoystick_c.h; sourceTree = "<group>"; };
+ 71054DBD1204A20900AC2CCB /* SDL_joystick.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL_joystick.c; sourceTree = "<group>"; };
+ 71054DBE1204A20900AC2CCB /* SDL_joystick_c.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_joystick_c.h; sourceTree = "<group>"; };
+ 71054DBF1204A20900AC2CCB /* SDL_sysjoystick.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_sysjoystick.h; sourceTree = "<group>"; };
+ 71054DC01204A20900AC2CCB /* SDL.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL.c; sourceTree = "<group>"; };
+ 71054DC31204A20900AC2CCB /* SDL_error.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; path = SDL_error.c; sourceTree = "<group>"; };
+ 71054DC41204A20900AC2CCB /* SDL_error_c.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; path = SDL_error_c.h; sourceTree = "<group>"; };
+ 71054E201204A49F00AC2CCB /* ForceFeedback.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ForceFeedback.framework; path = /System/Library/Frameworks/ForceFeedback.framework; sourceTree = "<absolute>"; };
+ 7136F51912011BB4001973D9 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 714FA82A11FC822A00517F47 /* analog.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = analog.c; path = ../../../plugins/dfinput/analog.c; sourceTree = SOURCE_ROOT; };
+ 714FA82B11FC822A00517F47 /* pad.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = pad.c; path = ../../../plugins/dfinput/pad.c; sourceTree = SOURCE_ROOT; };
+ 714FA82C11FC822A00517F47 /* pad.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = pad.h; path = ../../../plugins/dfinput/pad.h; sourceTree = SOURCE_ROOT; };
+ 714FA82D11FC822A00517F47 /* sdljoy.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = sdljoy.c; path = ../../../plugins/dfinput/sdljoy.c; sourceTree = SOURCE_ROOT; };
+ 714FA89F11FC846800517F47 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ 714FA8F811FC863500517F47 /* cfg.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = cfg.c; path = macsrc/cfg.c; sourceTree = "<group>"; };
+ 714FA8F911FC863500517F47 /* xkb.c */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.c; name = xkb.c; path = macsrc/xkb.c; sourceTree = "<group>"; };
+ 7192EAAB1200D54500038B92 /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = cfg.h; path = macsrc/cfg.h; sourceTree = "<group>"; };
+ 71E861A411FF75AC001C1826 /* ControllerList.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = ControllerList.h; path = macsrc/ControllerList.h; sourceTree = "<group>"; };
+ 71E861A511FF75AC001C1826 /* ControllerList.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = ControllerList.m; path = macsrc/ControllerList.m; sourceTree = "<group>"; };
+ 71E861A811FF75AC001C1826 /* MappingCell.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = MappingCell.h; path = macsrc/MappingCell.h; sourceTree = "<group>"; };
+ 71E861A911FF75AC001C1826 /* MappingCell.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = MappingCell.m; path = macsrc/MappingCell.m; sourceTree = "<group>"; };
+ 71E861AA11FF75AC001C1826 /* PadController.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = PadController.h; path = macsrc/PadController.h; sourceTree = "<group>"; };
+ 71E861AB11FF75AC001C1826 /* PadController.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = PadController.m; path = macsrc/PadController.m; sourceTree = "<group>"; };
+ 71E861AC11FF75AC001C1826 /* PadView.h */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.h; name = PadView.h; path = macsrc/PadView.h; sourceTree = "<group>"; };
+ 71E861AD11FF75AC001C1826 /* PadView.m */ = {isa = PBXFileReference; fileEncoding = 0; lastKnownFileType = sourcecode.c.objc; name = PadView.m; path = macsrc/PadView.m; sourceTree = "<group>"; };
+ 71E861BB11FF75BA001C1826 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/NetPcsxHIDInputPluginMain.nib; sourceTree = "<group>"; };
+ 8D576316048677EA00EA77CD /* DFInput.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DFInput.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D576313048677EA00EA77CD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
+ 2B679862069193F300E2BD4F /* Cocoa.framework in Frameworks */,
+ 2B679863069193F300E2BD4F /* IOKit.framework in Frameworks */,
+ 714FA8A011FC846800517F47 /* Carbon.framework in Frameworks */,
+ 71054E211204A49F00AC2CCB /* ForceFeedback.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* DFInput */ = {
+ isa = PBXGroup;
+ children = (
+ 714FA82911FC820D00517F47 /* macsrc */,
+ 714FA82811FC820900517F47 /* src */,
+ 71054D9F1204A20900AC2CCB /* SDL */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
+ 19C28FB6FE9D52B211CA2CBB /* Products */,
+ );
+ name = DFInput;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 71054E201204A49F00AC2CCB /* ForceFeedback.framework */,
+ 714FA89F11FC846800517F47 /* Carbon.framework */,
+ 2B679860069193F300E2BD4F /* Cocoa.framework */,
+ 2B679861069193F300E2BD4F /* IOKit.framework */,
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 7136F51812011BB4001973D9 /* Credits.rtf */,
+ 71E861BA11FF75BA001C1826 /* NetPcsxHIDInputPluginMain.nib */,
+ 8D576317048677EA00EA77CD /* Info.plist */,
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 19C28FB6FE9D52B211CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D576316048677EA00EA77CD /* DFInput.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 71054D9F1204A20900AC2CCB /* SDL */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DA01204A20900AC2CCB /* include */,
+ 71054DB21204A20900AC2CCB /* src */,
+ );
+ path = SDL;
+ sourceTree = "<group>";
+ };
+ 71054DA01204A20900AC2CCB /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DA11204A20900AC2CCB /* begin_code.h */,
+ 71054DA21204A20900AC2CCB /* close_code.h */,
+ 71054DA31204A20900AC2CCB /* SDL.h */,
+ 71054DA41204A20900AC2CCB /* SDL_assert.h */,
+ 71054DA51204A20900AC2CCB /* SDL_config.h */,
+ 71054DA61204A20900AC2CCB /* SDL_endian.h */,
+ 71054DA71204A20900AC2CCB /* SDL_error.h */,
+ 71054DA81204A20900AC2CCB /* SDL_haptic.h */,
+ 71054DA91204A20900AC2CCB /* SDL_joystick.h */,
+ 71054DAA1204A20900AC2CCB /* SDL_main.h */,
+ 71054DAC1204A20900AC2CCB /* SDL_platform.h */,
+ 71054DAF1204A20900AC2CCB /* SDL_stdinc.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ 71054DB21204A20900AC2CCB /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DB31204A20900AC2CCB /* haptic */,
+ 71054DB91204A20900AC2CCB /* joystick */,
+ 71054DC01204A20900AC2CCB /* SDL.c */,
+ 71054DC31204A20900AC2CCB /* SDL_error.c */,
+ 71054DC41204A20900AC2CCB /* SDL_error_c.h */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 71054DB31204A20900AC2CCB /* haptic */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DB41204A20900AC2CCB /* darwin */,
+ 71054DB61204A20900AC2CCB /* SDL_haptic.c */,
+ 71054DB71204A20900AC2CCB /* SDL_haptic_c.h */,
+ 71054DB81204A20900AC2CCB /* SDL_syshaptic.h */,
+ );
+ path = haptic;
+ sourceTree = "<group>";
+ };
+ 71054DB41204A20900AC2CCB /* darwin */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DB51204A20900AC2CCB /* SDL_syshaptic.c */,
+ );
+ path = darwin;
+ sourceTree = "<group>";
+ };
+ 71054DB91204A20900AC2CCB /* joystick */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DBA1204A20900AC2CCB /* darwin */,
+ 71054DBD1204A20900AC2CCB /* SDL_joystick.c */,
+ 71054DBE1204A20900AC2CCB /* SDL_joystick_c.h */,
+ 71054DBF1204A20900AC2CCB /* SDL_sysjoystick.h */,
+ );
+ path = joystick;
+ sourceTree = "<group>";
+ };
+ 71054DBA1204A20900AC2CCB /* darwin */ = {
+ isa = PBXGroup;
+ children = (
+ 71054DBB1204A20900AC2CCB /* SDL_sysjoystick.c */,
+ 71054DBC1204A20900AC2CCB /* SDL_sysjoystick_c.h */,
+ );
+ path = darwin;
+ sourceTree = "<group>";
+ };
+ 714FA82811FC820900517F47 /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 714FA82A11FC822A00517F47 /* analog.c */,
+ 714FA82B11FC822A00517F47 /* pad.c */,
+ 714FA82C11FC822A00517F47 /* pad.h */,
+ 714FA82D11FC822A00517F47 /* sdljoy.c */,
+ );
+ name = src;
+ sourceTree = "<group>";
+ };
+ 714FA82911FC820D00517F47 /* macsrc */ = {
+ isa = PBXGroup;
+ children = (
+ 71E861A411FF75AC001C1826 /* ControllerList.h */,
+ 71E861A511FF75AC001C1826 /* ControllerList.m */,
+ 71E861A811FF75AC001C1826 /* MappingCell.h */,
+ 71E861A911FF75AC001C1826 /* MappingCell.m */,
+ 71E861AA11FF75AC001C1826 /* PadController.h */,
+ 71E861AB11FF75AC001C1826 /* PadController.m */,
+ 71E861AC11FF75AC001C1826 /* PadView.h */,
+ 71E861AD11FF75AC001C1826 /* PadView.m */,
+ 714FA8F811FC863500517F47 /* cfg.c */,
+ 7192EAAB1200D54500038B92 /* cfg.h */,
+ 714FA8F911FC863500517F47 /* xkb.c */,
+ );
+ name = macsrc;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 8D57630E048677EA00EA77CD /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 714FA83011FC822A00517F47 /* pad.h in Headers */,
+ 71E861B611FF75AC001C1826 /* PadView.h in Headers */,
+ 7192EAAE1200D54500038B92 /* cfg.h in Headers */,
+ 7136F1DA1200E163001973D9 /* ControllerList.h in Headers */,
+ 7136F1DC1200E164001973D9 /* MappingCell.h in Headers */,
+ 7136F1DF1200E165001973D9 /* PadController.h in Headers */,
+ 71054DC51204A20900AC2CCB /* begin_code.h in Headers */,
+ 71054DC61204A20900AC2CCB /* close_code.h in Headers */,
+ 71054DC71204A20900AC2CCB /* SDL.h in Headers */,
+ 71054DC81204A20900AC2CCB /* SDL_assert.h in Headers */,
+ 71054DC91204A20900AC2CCB /* SDL_config.h in Headers */,
+ 71054DCA1204A20900AC2CCB /* SDL_endian.h in Headers */,
+ 71054DCB1204A20900AC2CCB /* SDL_error.h in Headers */,
+ 71054DCC1204A20900AC2CCB /* SDL_haptic.h in Headers */,
+ 71054DCD1204A20900AC2CCB /* SDL_joystick.h in Headers */,
+ 71054DCE1204A20900AC2CCB /* SDL_main.h in Headers */,
+ 71054DD01204A20900AC2CCB /* SDL_platform.h in Headers */,
+ 71054DD31204A20900AC2CCB /* SDL_stdinc.h in Headers */,
+ 71054DD81204A20900AC2CCB /* SDL_haptic_c.h in Headers */,
+ 71054DD91204A20900AC2CCB /* SDL_syshaptic.h in Headers */,
+ 71054DDB1204A20900AC2CCB /* SDL_sysjoystick_c.h in Headers */,
+ 71054DDD1204A20900AC2CCB /* SDL_joystick_c.h in Headers */,
+ 71054DDE1204A20900AC2CCB /* SDL_sysjoystick.h in Headers */,
+ 71054DE31204A20900AC2CCB /* SDL_error_c.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 8D57630D048677EA00EA77CD /* DFInput */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 71155B0C0FDFA2DE00EC0BC5 /* Build configuration list for PBXNativeTarget "DFInput" */;
+ buildPhases = (
+ 8D57630E048677EA00EA77CD /* Headers */,
+ 8D57630F048677EA00EA77CD /* Resources */,
+ 8D576311048677EA00EA77CD /* Sources */,
+ 8D576313048677EA00EA77CD /* Frameworks */,
+ 8D576315048677EA00EA77CD /* Rez */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = DFInput;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = DFInput;
+ productReference = 8D576316048677EA00EA77CD /* DFInput.psxplugin */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 71155B110FDFA2DE00EC0BC5 /* Build configuration list for PBXProject "DFInput" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 089C166AFE841209C02AAC07 /* DFInput */;
+ projectDirPath = "";
+ targets = (
+ 8D57630D048677EA00EA77CD /* DFInput */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D57630F048677EA00EA77CD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
+ 71E861BC11FF75BA001C1826 /* NetPcsxHIDInputPluginMain.nib in Resources */,
+ 7136F51A12011BB4001973D9 /* Credits.rtf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+ 8D576315048677EA00EA77CD /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D576311048677EA00EA77CD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 714FA82E11FC822A00517F47 /* analog.c in Sources */,
+ 714FA82F11FC822A00517F47 /* pad.c in Sources */,
+ 714FA83111FC822A00517F47 /* sdljoy.c in Sources */,
+ 714FA8FA11FC863500517F47 /* cfg.c in Sources */,
+ 714FA8FB11FC863500517F47 /* xkb.c in Sources */,
+ 71E861B711FF75AC001C1826 /* PadView.m in Sources */,
+ 7136F1DB1200E163001973D9 /* ControllerList.m in Sources */,
+ 7136F1DD1200E164001973D9 /* MappingCell.m in Sources */,
+ 7136F1DE1200E165001973D9 /* PadController.m in Sources */,
+ 71054DD61204A20900AC2CCB /* SDL_syshaptic.c in Sources */,
+ 71054DD71204A20900AC2CCB /* SDL_haptic.c in Sources */,
+ 71054DDA1204A20900AC2CCB /* SDL_sysjoystick.c in Sources */,
+ 71054DDC1204A20900AC2CCB /* SDL_joystick.c in Sources */,
+ 71054DDF1204A20900AC2CCB /* SDL.c in Sources */,
+ 71054DE21204A20900AC2CCB /* SDL_error.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 7136F51812011BB4001973D9 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 7136F51912011BB4001973D9 /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 71E861BA11FF75BA001C1826 /* NetPcsxHIDInputPluginMain.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 71E861BB11FF75BA001C1826 /* English */,
+ );
+ name = NetPcsxHIDInputPluginMain.nib;
+ sourceTree = "<group>";
+ };
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 71155B0D0FDFA2DE00EC0BC5 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DEBUGGING_SYMBOLS = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../HID,
+ Utilities,
+ Source,
+ ./HID,
+ Utilities,
+ Source,
+ );
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_SEARCH_PATHS = .;
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = DFInput;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ };
+ name = Development;
+ };
+ 71155B0E0FDFA2DE00EC0BC5 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUGGING_SYMBOLS = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = s;
+ GCC_PRECOMPILE_PREFIX_HEADER = NO;
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../HID,
+ Utilities,
+ Source,
+ ./HID,
+ Utilities,
+ Source,
+ );
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_SEARCH_PATHS = .;
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "";
+ OTHER_LDFLAGS = "";
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = DFInput;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 71155B120FDFA2DE00EC0BC5 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfinput,
+ ../../../plugins/dfinput,
+ ../../../../plugins/dfinput,
+ ./SDL,
+ ./SDL/include,
+ );
+ STRIP_INSTALLED_PRODUCT = NO;
+ };
+ name = Development;
+ };
+ 71155B130FDFA2DE00EC0BC5 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_PREPROCESSOR_DEFINITIONS = "_MACOSX=1";
+ HEADER_SEARCH_PATHS = (
+ ../../../libpcsxcore,
+ ../..,
+ ../../../plugins/dfinput,
+ ../../../../plugins/dfinput,
+ ./SDL,
+ ./SDL/include,
+ ../include,
+ );
+ };
+ name = Deployment;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 71155B0C0FDFA2DE00EC0BC5 /* Build configuration list for PBXNativeTarget "DFInput" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71155B0D0FDFA2DE00EC0BC5 /* Development */,
+ 71155B0E0FDFA2DE00EC0BC5 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+ 71155B110FDFA2DE00EC0BC5 /* Build configuration list for PBXProject "DFInput" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71155B120FDFA2DE00EC0BC5 /* Development */,
+ 71155B130FDFA2DE00EC0BC5 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/macosx/plugins/DFInput/English.lproj/Credits.rtf b/macosx/plugins/DFInput/English.lproj/Credits.rtf
new file mode 100644
index 0000000..1a83729
--- /dev/null
+++ b/macosx/plugins/DFInput/English.lproj/Credits.rtf
@@ -0,0 +1,17 @@
+{\rtf1\mac\ansicpg10025\cocoartf824\cocoasubrtf420
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\vieww9000\viewh9000\viewkind0
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Macintosh Port:
+\f1\b0 \
+ Wei Mingzhi\
+ Gil Pedersen\
+\
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
+
+\f0\b \cf0 Original coder:
+\f1\b0 \
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+\cf0 Wei Mingzhi} \ No newline at end of file
diff --git a/macosx/plugins/DFInput/English.lproj/InfoPlist.strings b/macosx/plugins/DFInput/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000..74d15f4
--- /dev/null
+++ b/macosx/plugins/DFInput/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/classes.nib b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/classes.nib
new file mode 100644
index 0000000..ac067a6
--- /dev/null
+++ b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/classes.nib
@@ -0,0 +1,33 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = NetPcsxHIDInputPluginMappingCell;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSTextFieldCell;
+ },
+ {
+ ACTIONS = {cancel = id; ok = id; setKey = id; };
+ CLASS = NetPcsxHIDInputPluginPadController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ controllerView = NetPcsxHIDInputPluginPadView;
+ controllerView1 = id;
+ controllerView2 = id;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ ACTIONS = {setDevice = id; setType = id; };
+ CLASS = NetPcsxHIDInputPluginPadView;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ deviceMenu = NSPopUpButton;
+ tableView = NSTableView;
+ typeMenu = NSPopUpButton;
+ };
+ SUPERCLASS = NSView;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/info.nib b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/info.nib
new file mode 100644
index 0000000..27f6df1
--- /dev/null
+++ b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/info.nib
@@ -0,0 +1,21 @@
+<?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>54 67 576 240 0 0 1024 746 </string>
+ <key>IBEditorPositions</key>
+ <dict>
+ <key>16</key>
+ <string>293 323 437 378 0 0 1024 746 </string>
+ </dict>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>16</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/keyedobjects.nib b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/keyedobjects.nib
new file mode 100644
index 0000000..793f394
--- /dev/null
+++ b/macosx/plugins/DFInput/English.lproj/NetPcsxHIDInputPluginMain.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFInput/Info.plist b/macosx/plugins/DFInput/Info.plist
new file mode 100644
index 0000000..d0fd8ea
--- /dev/null
+++ b/macosx/plugins/DFInput/Info.plist
@@ -0,0 +1,40 @@
+<?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>DFInput</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>net.pcsx.DFInputPlugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>PsxP</string>
+ <key>CFBundleSignature</key>
+ <string>DFI</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CFPlugInDynamicRegisterFunction</key>
+ <string></string>
+ <key>CFPlugInDynamicRegistration</key>
+ <string>NO</string>
+ <key>CFPlugInFactories</key>
+ <dict>
+ <key>00000000-0000-0000-0000-000000000000</key>
+ <string>MyFactoryFunction</string>
+ </dict>
+ <key>CFPlugInTypes</key>
+ <dict>
+ <key>00000000-0000-0000-0000-000000000000</key>
+ <array>
+ <string>00000000-0000-0000-0000-000000000000</string>
+ </array>
+ </dict>
+ <key>CFPlugInUnloadFunction</key>
+ <string></string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFInput/SDL/include/SDL.h b/macosx/plugins/DFInput/SDL/include/SDL.h
new file mode 100644
index 0000000..6032d95
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL.h
@@ -0,0 +1,151 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+// 7/31/2010 Wei Mingzhi
+// Removed everything unrated to Mac OS X Joystick support
+
+/**
+ * \file SDL.h
+ *
+ * Main include header for the SDL library
+ */
+
+/**
+ * \mainpage Simple DirectMedia Layer (SDL)
+ *
+ * http://www.libsdl.org/
+ *
+ * \section intro_sec Introduction
+ *
+ * This is the Simple DirectMedia Layer, a general API that provides low
+ * level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL,
+ * and 2D framebuffer across multiple platforms.
+ *
+ * The current version supports Windows, Windows CE, Mac OS X, Linux,
+ * FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, and QNX. The code contains
+ * support for other operating systems but those are not officially supported.
+ *
+ * SDL is written in C, but works with C++ natively, and has bindings to
+ * several other languages, including Ada, C#, Eiffel, Erlang, Euphoria,
+ * Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP,
+ * Pike, Pliant, Python, Ruby, and Smalltalk.
+ *
+ * This library is distributed under GNU LGPL version 2, which can be
+ * found in the file "COPYING". This license allows you to use SDL
+ * freely in commercial programs as long as you link with the dynamic
+ * library.
+ *
+ * The best way to learn how to use SDL is to check out the header files in
+ * the "include" subdirectory and the programs in the "test" subdirectory.
+ * The header files and test programs are well commented and always up to date.
+ * More documentation is available in HTML format in "docs/index.html", and
+ * a documentation wiki is available online at:
+ * http://www.libsdl.org/cgi/docwiki.cgi
+ *
+ * The test programs in the "test" subdirectory are in the public domain.
+ *
+ * Frequently asked questions are answered online:
+ * http://www.libsdl.org/faq.php
+ *
+ * If you need help with the library, or just want to discuss SDL related
+ * issues, you can join the developers mailing list:
+ * http://www.libsdl.org/mailing-list.php
+ *
+ * Enjoy!
+ * Sam Lantinga (slouken@libsdl.org)
+ */
+
+#ifndef _SDL_H
+#define _SDL_H
+
+#include "SDL_main.h"
+#include "SDL_stdinc.h"
+#include "SDL_endian.h"
+#include "SDL_error.h"
+
+#ifndef SDL_IGNORE
+#define SDL_IGNORE 0
+#endif
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/* As of version 0.5, SDL is loaded dynamically into the application */
+
+/**
+ * \name SDL_INIT_*
+ *
+ * These are the flags which may be passed to SDL_Init(). You should
+ * specify the subsystems which you will be using in your application.
+ */
+/*@{*/
+#define SDL_INIT_JOYSTICK 0x00000200
+#define SDL_INIT_HAPTIC 0x00001000
+#define SDL_INIT_NOPARACHUTE 0x00100000 /**< Don't catch fatal signals */
+#define SDL_INIT_EVERYTHING 0x0000FFFF
+/*@}*/
+
+/**
+ * This function loads the SDL dynamically linked library and initializes
+ * the subsystems specified by \c flags (and those satisfying dependencies).
+ * Unless the ::SDL_INIT_NOPARACHUTE flag is set, it will install cleanup
+ * signal handlers for some commonly ignored fatal signals (like SIGSEGV).
+ */
+extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags);
+
+/**
+ * This function initializes specific SDL subsystems
+ */
+extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags);
+
+/**
+ * This function cleans up specific SDL subsystems
+ */
+extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);
+
+/**
+ * This function returns mask of the specified subsystems which have
+ * been initialized.
+ *
+ * If \c flags is 0, it returns a mask of all initialized subsystems.
+ */
+extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags);
+
+/**
+ * This function cleans up all initialized subsystems and unloads the
+ * dynamically linked library. You should call it upon all exit conditions.
+ */
+extern DECLSPEC void SDLCALL SDL_Quit(void);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_H */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_config.h b/macosx/plugins/DFInput/SDL/include/SDL_config.h
new file mode 100644
index 0000000..81eda63
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_config.h
@@ -0,0 +1,313 @@
+/* include/SDL_config.h. Generated from SDL_config.h.in by configure. */
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2009 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+#ifndef _SDL_config_h
+#define _SDL_config_h
+
+/**
+ * \file SDL_config.h.in
+ *
+ * This is a set of defines to configure the SDL features
+ */
+
+/* General platform specific identifiers */
+#include "SDL_platform.h"
+
+/* Make sure that this isn't included by Visual C++ */
+#ifdef _MSC_VER
+#error You should copy include/SDL_config.h.default to include/SDL_config.h
+#endif
+
+/* C language features */
+/* #undef const */
+/* #undef inline */
+/* #undef volatile */
+
+/* C datatypes */
+#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H)
+/* #undef size_t */
+/* #undef int8_t */
+/* #undef uint8_t */
+/* #undef int16_t */
+/* #undef uint16_t */
+/* #undef int32_t */
+/* #undef uint32_t */
+/* #undef int64_t */
+/* #undef uint64_t */
+/* #undef uintptr_t */
+#endif /* !_STDINT_H_ && !HAVE_STDINT_H */
+
+#define SIZEOF_VOIDP 4
+#define SDL_HAS_64BIT_TYPE 1
+
+/* Comment this if you want to build without any C library requirements */
+#define HAVE_LIBC 1
+#if HAVE_LIBC
+
+/* Useful headers */
+#define HAVE_ALLOCA_H 1
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_STDIO_H 1
+#define STDC_HEADERS 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STDARG_H 1
+/* #undef HAVE_MALLOC_H */
+#define HAVE_MEMORY_H 1
+#define HAVE_STRING_H 1
+#define HAVE_STRINGS_H 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_CTYPE_H 1
+#define HAVE_MATH_H 1
+#define HAVE_ICONV_H 1
+#define HAVE_SIGNAL_H 1
+/* #undef HAVE_ALTIVEC_H */
+
+/* C library functions */
+#define HAVE_MALLOC 1
+#define HAVE_CALLOC 1
+#define HAVE_REALLOC 1
+#define HAVE_FREE 1
+#define HAVE_ALLOCA 1
+#ifndef _WIN32 /* Don't use C runtime versions of these on Windows */
+#define HAVE_GETENV 1
+#define HAVE_SETENV 1
+#define HAVE_PUTENV 1
+#define HAVE_UNSETENV 1
+#endif
+#define HAVE_QSORT 1
+#define HAVE_ABS 1
+#define HAVE_BCOPY 1
+#define HAVE_MEMSET 1
+#define HAVE_MEMCPY 1
+#define HAVE_MEMMOVE 1
+#define HAVE_MEMCMP 1
+#define HAVE_STRLEN 1
+#define HAVE_STRLCPY 1
+#define HAVE_STRLCAT 1
+#define HAVE_STRDUP 1
+/* #undef HAVE__STRREV */
+/* #undef HAVE__STRUPR */
+/* #undef HAVE__STRLWR */
+/* #undef HAVE_INDEX */
+/* #undef HAVE_RINDEX */
+#define HAVE_STRCHR 1
+#define HAVE_STRRCHR 1
+#define HAVE_STRSTR 1
+/* #undef HAVE_ITOA */
+/* #undef HAVE__LTOA */
+/* #undef HAVE__UITOA */
+/* #undef HAVE__ULTOA */
+#define HAVE_STRTOL 1
+#define HAVE_STRTOUL 1
+/* #undef HAVE__I64TOA */
+/* #undef HAVE__UI64TOA */
+#define HAVE_STRTOLL 1
+#define HAVE_STRTOULL 1
+#define HAVE_STRTOD 1
+#define HAVE_ATOI 1
+#define HAVE_ATOF 1
+#define HAVE_STRCMP 1
+#define HAVE_STRNCMP 1
+/* #undef HAVE__STRICMP */
+#define HAVE_STRCASECMP 1
+/* #undef HAVE__STRNICMP */
+#define HAVE_STRNCASECMP 1
+#define HAVE_SSCANF 1
+#define HAVE_SNPRINTF 1
+#define HAVE_VSNPRINTF 1
+#define HAVE_M_PI
+#define HAVE_CEIL 1
+#define HAVE_COPYSIGN 1
+#define HAVE_COS 1
+#define HAVE_COSF 1
+#define HAVE_FABS 1
+#define HAVE_FLOOR 1
+#define HAVE_LOG 1
+#define HAVE_POW 1
+#define HAVE_SCALBN 1
+#define HAVE_SIN 1
+#define HAVE_SINF 1
+#define HAVE_SQRT 1
+#define HAVE_SIGACTION 1
+#define HAVE_SETJMP 1
+#define HAVE_NANOSLEEP 1
+#define HAVE_SYSCONF 1
+#define HAVE_SYSCTLBYNAME 1
+/* #undef HAVE_CLOCK_GETTIME */
+/* #undef HAVE_GETPAGESIZE */
+#define HAVE_MPROTECT 1
+
+#else
+/* We may need some replacement for stdarg.h here */
+#include <stdarg.h>
+#endif /* HAVE_LIBC */
+
+/* SDL internal assertion support */
+/* #undef SDL_DEFAULT_ASSERT_LEVEL */
+
+/* Allow disabling of core subsystems */
+#define SDL_AUDIO_DISABLED 1
+#define SDL_CPUINFO_DISABLED 1
+#define SDL_EVENTS_DISABLED 1
+#define SDL_FILE_DISABLED 1
+/* #undef SDL_JOYSTICK_DISABLED */
+/* #undef SDL_HAPTIC_DISABLED */
+#define SDL_LOADSO_DISABLED 1
+#define SDL_THREADS_DISABLED 1
+#define SDL_TIMERS_DISABLED 1
+#define SDL_VIDEO_DISABLED 1
+#define SDL_POWER_DISABLED 1
+
+/* Enable various audio drivers */
+/* #undef SDL_AUDIO_DRIVER_ALSA */
+/* #undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC */
+/* #undef SDL_AUDIO_DRIVER_ARTS */
+/* #undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC */
+/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO */
+/* #undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC */
+/* #undef SDL_AUDIO_DRIVER_BEOSAUDIO */
+/* #undef SDL_AUDIO_DRIVER_BSD */
+/* #undef SDL_AUDIO_DRIVER_COREAUDIO */
+/* #undef SDL_AUDIO_DRIVER_DISK */
+/* #undef SDL_AUDIO_DRIVER_DUMMY */
+/* #undef SDL_AUDIO_DRIVER_DMEDIA */
+/* #undef SDL_AUDIO_DRIVER_DSOUND */
+/* #undef SDL_AUDIO_DRIVER_ESD */
+/* #undef SDL_AUDIO_DRIVER_ESD_DYNAMIC */
+/* #undef SDL_AUDIO_DRIVER_MMEAUDIO */
+/* #undef SDL_AUDIO_DRIVER_NAS */
+/* #undef SDL_AUDIO_DRIVER_NAS_DYNAMIC */
+/* #undef SDL_AUDIO_DRIVER_NDS */
+/* #undef SDL_AUDIO_DRIVER_OSS */
+/* #undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H */
+/* #undef SDL_AUDIO_DRIVER_PAUDIO */
+/* #undef SDL_AUDIO_DRIVER_QSA */
+/* #undef SDL_AUDIO_DRIVER_SUNAUDIO */
+/* #undef SDL_AUDIO_DRIVER_WINWAVEOUT */
+/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND */
+/* #undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC */
+
+/* Enable various input drivers */
+/* #undef SDL_INPUT_LINUXEV */
+/* #undef SDL_INPUT_TSLIB */
+/* #undef SDL_JOYSTICK_BEOS */
+/* #undef SDL_JOYSTICK_DINPUT */
+/* #undef SDL_JOYSTICK_DUMMY */
+#define SDL_JOYSTICK_IOKIT 1
+/* #undef SDL_JOYSTICK_LINUX */
+/* #undef SDL_JOYSTICK_NDS */
+/* #undef SDL_JOYSTICK_RISCOS */
+/* #undef SDL_JOYSTICK_WINMM */
+/* #undef SDL_JOYSTICK_USBHID */
+/* #undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H */
+/* #undef SDL_HAPTIC_DUMMY */
+/* #undef SDL_HAPTIC_LINUX */
+#define SDL_HAPTIC_IOKIT 1
+/* #undef SDL_HAPTIC_DINPUT */
+
+/* Enable various shared object loading systems */
+/* #undef SDL_LOADSO_BEOS */
+/* #undef SDL_LOADSO_DLCOMPAT */
+/* #undef SDL_LOADSO_DLOPEN */
+/* #undef SDL_LOADSO_DUMMY */
+/* #undef SDL_LOADSO_LDG */
+/* #undef SDL_LOADSO_WIN32 */
+
+/* Enable various threading systems */
+/* #undef SDL_THREAD_BEOS */
+/* #undef SDL_THREAD_NDS */
+/* #undef SDL_THREAD_PTHREAD */
+/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX */
+/* #undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP */
+/* #undef SDL_THREAD_SPROC */
+/* #undef SDL_THREAD_WIN32 */
+
+/* Enable various timer systems */
+/* #undef SDL_TIMER_BEOS */
+/* #undef SDL_TIMER_DUMMY */
+/* #undef SDL_TIMER_NDS */
+/* #undef SDL_TIMER_RISCOS */
+/* #undef SDL_TIMER_UNIX */
+/* #undef SDL_TIMER_WIN32 */
+/* #undef SDL_TIMER_WINCE */
+
+/* Enable various video drivers */
+/* #undef SDL_VIDEO_DRIVER_BWINDOW */
+/* #undef SDL_VIDEO_DRIVER_COCOA */
+/* #undef SDL_VIDEO_DRIVER_DIRECTFB */
+/* #undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC */
+#define SDL_VIDEO_DRIVER_DUMMY 1
+/* #undef SDL_VIDEO_DRIVER_FBCON */
+/* #undef SDL_VIDEO_DRIVER_NDS */
+/* #undef SDL_VIDEO_DRIVER_PHOTON */
+/* #undef SDL_VIDEO_DRIVER_QNXGF */
+/* #undef SDL_VIDEO_DRIVER_PS3 */
+/* #undef SDL_VIDEO_DRIVER_RISCOS */
+/* #undef SDL_VIDEO_DRIVER_SVGALIB */
+/* #undef SDL_VIDEO_DRIVER_WIN32 */
+/* #undef SDL_VIDEO_DRIVER_X11 */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT */
+/* #undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS */
+/* #undef SDL_VIDEO_DRIVER_X11_VIDMODE */
+/* #undef SDL_VIDEO_DRIVER_X11_XINERAMA */
+/* #undef SDL_VIDEO_DRIVER_X11_XRANDR */
+/* #undef SDL_VIDEO_DRIVER_X11_XINPUT */
+/* #undef SDL_VIDEO_DRIVER_X11_SCRNSAVER */
+/* #undef SDL_VIDEO_DRIVER_X11_XV */
+
+/* #undef SDL_VIDEO_RENDER_D3D */
+/* #undef SDL_VIDEO_RENDER_GDI */
+/* #undef SDL_VIDEO_RENDER_OGL */
+/* #undef SDL_VIDEO_RENDER_OGL_ES */
+/* #undef SDL_VIDEO_RENDER_X11 */
+/* #undef SDL_VIDEO_RENDER_GAPI */
+/* #undef SDL_VIDEO_RENDER_DDRAW */
+
+/* Enable OpenGL support */
+/* #undef SDL_VIDEO_OPENGL */
+/* #undef SDL_VIDEO_OPENGL_ES */
+/* #undef SDL_VIDEO_OPENGL_BGL */
+/* #undef SDL_VIDEO_OPENGL_CGL */
+/* #undef SDL_VIDEO_OPENGL_GLX */
+/* #undef SDL_VIDEO_OPENGL_WGL */
+/* #undef SDL_VIDEO_OPENGL_OSMESA */
+/* #undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC */
+
+/* Enable system power support */
+/* #undef SDL_POWER_LINUX */
+/* #undef SDL_POWER_WINDOWS */
+/* #undef SDL_POWER_MACOSX */
+/* #undef SDL_POWER_BEOS */
+/* #undef SDL_POWER_NINTENDODS */
+/* #undef SDL_POWER_HARDWIRED */
+
+/* Enable assembly routines */
+/* #undef SDL_ASSEMBLY_ROUTINES */
+/* #undef SDL_ALTIVEC_BLITTERS */
+
+#endif /* _SDL_config_h */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_endian.h b/macosx/plugins/DFInput/SDL/include/SDL_endian.h
new file mode 100644
index 0000000..de69e32
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_endian.h
@@ -0,0 +1,258 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_endian.h
+ *
+ * Functions for reading and writing endian-specific values
+ */
+
+#ifndef _SDL_endian_h
+#define _SDL_endian_h
+
+#include "SDL_stdinc.h"
+
+/**
+ * \name The two types of endianness
+ */
+/*@{*/
+#define SDL_LIL_ENDIAN 1234
+#define SDL_BIG_ENDIAN 4321
+/*@}*/
+
+#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */
+#ifdef __linux__
+#include <endian.h>
+#define SDL_BYTEORDER __BYTE_ORDER
+#else /* __linux __ */
+#if defined(__hppa__) || \
+ defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
+ (defined(__MIPS__) && defined(__MISPEB__)) || \
+ defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
+ defined(__sparc__)
+#define SDL_BYTEORDER SDL_BIG_ENDIAN
+#else
+#define SDL_BYTEORDER SDL_LIL_ENDIAN
+#endif
+#endif /* __linux __ */
+#endif /* !SDL_BYTEORDER */
+
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/**
+ * \file SDL_endian.h
+ *
+ * Uses inline functions for compilers that support them, and static
+ * functions for those that do not. Because these functions become
+ * static for compilers that do not support inline functions, this
+ * header should only be included in files that actually use them.
+ */
+#if defined(__GNUC__) && defined(__i386__) && \
+ !(__GNUC__ == 2 && __GNUC_MINOR__ == 95 /* broken gcc version */)
+static __inline__ Uint16
+SDL_Swap16(Uint16 x)
+{
+ __asm__("xchgb %b0,%h0": "=q"(x):"0"(x));
+ return x;
+}
+#elif defined(__GNUC__) && defined(__x86_64__)
+static __inline__ Uint16
+SDL_Swap16(Uint16 x)
+{
+ __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x));
+ return x;
+}
+#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
+static __inline__ Uint16
+SDL_Swap16(Uint16 x)
+{
+ Uint16 result;
+
+ __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x));
+ return result;
+}
+#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)
+static __inline__ Uint16
+SDL_Swap16(Uint16 x)
+{
+ __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc");
+ return x;
+}
+#else
+static __inline__ Uint16
+SDL_Swap16(Uint16 x)
+{
+ return SDL_static_cast(Uint16, ((x << 8) | (x >> 8)));
+}
+#endif
+
+#if defined(__GNUC__) && defined(__i386__)
+static __inline__ Uint32
+SDL_Swap32(Uint32 x)
+{
+ __asm__("bswap %0": "=r"(x):"0"(x));
+ return x;
+}
+#elif defined(__GNUC__) && defined(__x86_64__)
+static __inline__ Uint32
+SDL_Swap32(Uint32 x)
+{
+ __asm__("bswapl %0": "=r"(x):"0"(x));
+ return x;
+}
+#elif defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__))
+static __inline__ Uint32
+SDL_Swap32(Uint32 x)
+{
+ Uint32 result;
+
+ __asm__("rlwimi %0,%2,24,16,23": "=&r"(result):"0"(x >> 24), "r"(x));
+ __asm__("rlwimi %0,%2,8,8,15": "=&r"(result):"0"(result), "r"(x));
+ __asm__("rlwimi %0,%2,24,0,7": "=&r"(result):"0"(result), "r"(x));
+ return result;
+}
+#elif defined(__GNUC__) && (defined(__M68000__) || defined(__M68020__)) && !defined(__mcoldfire__)
+static __inline__ Uint32
+SDL_Swap32(Uint32 x)
+{
+ __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc");
+ return x;
+}
+#else
+static __inline__ Uint32
+SDL_Swap32(Uint32 x)
+{
+ return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) |
+ ((x >> 8) & 0x0000FF00) | (x >> 24)));
+}
+#endif
+
+#ifdef SDL_HAS_64BIT_TYPE
+#if defined(__GNUC__) && defined(__i386__)
+static __inline__ Uint64
+SDL_Swap64(Uint64 x)
+{
+ union
+ {
+ struct
+ {
+ Uint32 a, b;
+ } s;
+ Uint64 u;
+ } v;
+ v.u = x;
+ __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1": "=r"(v.s.a), "=r"(v.s.b):"0"(v.s.a),
+ "1"(v.s.
+ b));
+ return v.u;
+}
+#elif defined(__GNUC__) && defined(__x86_64__)
+static __inline__ Uint64
+SDL_Swap64(Uint64 x)
+{
+ __asm__("bswapq %0": "=r"(x):"0"(x));
+ return x;
+}
+#else
+static __inline__ Uint64
+SDL_Swap64(Uint64 x)
+{
+ Uint32 hi, lo;
+
+ /* Separate into high and low 32-bit values and swap them */
+ lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
+ x >>= 32;
+ hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF);
+ x = SDL_Swap32(lo);
+ x <<= 32;
+ x |= SDL_Swap32(hi);
+ return (x);
+}
+#endif
+#else
+/**
+ * This is mainly to keep compilers from complaining in SDL code.
+ * If there is no real 64-bit datatype, then compilers will complain about
+ * the fake 64-bit datatype that SDL provides when it compiles user code.
+ */
+#define SDL_Swap64(X) (X)
+#endif /* SDL_HAS_64BIT_TYPE */
+
+
+static __inline__ float
+SDL_SwapFloat(float x)
+{
+ union
+ {
+ float f;
+ Uint32 ui32;
+ } swapper;
+ swapper.f = x;
+ swapper.ui32 = SDL_Swap32(swapper.ui32);
+ return swapper.f;
+}
+
+
+/**
+ * \name Swap to native
+ * Byteswap item from the specified endianness to the native endianness.
+ */
+/*@{*/
+#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+#define SDL_SwapLE16(X) (X)
+#define SDL_SwapLE32(X) (X)
+#define SDL_SwapLE64(X) (X)
+#define SDL_SwapFloatLE(X) (X)
+#define SDL_SwapBE16(X) SDL_Swap16(X)
+#define SDL_SwapBE32(X) SDL_Swap32(X)
+#define SDL_SwapBE64(X) SDL_Swap64(X)
+#define SDL_SwapFloatBE(X) SDL_SwapFloat(X)
+#else
+#define SDL_SwapLE16(X) SDL_Swap16(X)
+#define SDL_SwapLE32(X) SDL_Swap32(X)
+#define SDL_SwapLE64(X) SDL_Swap64(X)
+#define SDL_SwapFloatLE(X) SDL_SwapFloat(X)
+#define SDL_SwapBE16(X) (X)
+#define SDL_SwapBE32(X) (X)
+#define SDL_SwapBE64(X) (X)
+#define SDL_SwapFloatBE(X) (X)
+#endif
+/*@}*//*Swap to native*/
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_endian_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_error.h b/macosx/plugins/DFInput/SDL/include/SDL_error.h
new file mode 100644
index 0000000..a4a90d0
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_error.h
@@ -0,0 +1,78 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_error.h
+ *
+ * Simple error message routines for SDL.
+ */
+
+#ifndef _SDL_error_h
+#define _SDL_error_h
+
+#include "SDL_stdinc.h"
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/* Public functions */
+extern DECLSPEC void SDLCALL SDL_SetError(const char *fmt, ...);
+extern DECLSPEC char *SDLCALL SDL_GetError(void);
+extern DECLSPEC void SDLCALL SDL_ClearError(void);
+
+/**
+ * \name Internal error functions
+ *
+ * \internal
+ * Private error message function - used internally.
+ */
+/*@{*/
+#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM)
+#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED)
+typedef enum
+{
+ SDL_ENOMEM,
+ SDL_EFREAD,
+ SDL_EFWRITE,
+ SDL_EFSEEK,
+ SDL_UNSUPPORTED,
+ SDL_LASTERROR
+} SDL_errorcode;
+extern DECLSPEC void SDLCALL SDL_Error(SDL_errorcode code);
+/*@}*//*Internal error functions*/
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_error_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_haptic.h b/macosx/plugins/DFInput/SDL/include/SDL_haptic.h
new file mode 100644
index 0000000..52f33f1
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_haptic.h
@@ -0,0 +1,1123 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 2008 Edgar Simo
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_haptic.h
+ *
+ * \brief The SDL Haptic subsystem allows you to control haptic (force feedback)
+ * devices.
+ *
+ * The basic usage is as follows:
+ * - Initialize the Subsystem (::SDL_INIT_HAPTIC).
+ * - Open a Haptic Device.
+ * - SDL_HapticOpen() to open from index.
+ * - SDL_HapticOpenFromJoystick() to open from an existing joystick.
+ * - Create an effect (::SDL_HapticEffect).
+ * - Upload the effect with SDL_HapticNewEffect().
+ * - Run the effect with SDL_HapticRunEffect().
+ * - (optional) Free the effect with SDL_HapticDestroyEffect().
+ * - Close the haptic device with SDL_HapticClose().
+ *
+ * \par Example:
+ * \code
+ * int test_haptic( SDL_Joystick * joystick ) {
+ * SDL_Haptic *haptic;
+ * SDL_HapticEffect effect;
+ * int effect_id;
+ *
+ * // Open the device
+ * haptic = SDL_HapticOpenFromJoystick( joystick );
+ * if (haptic == NULL) return -1; // Most likely joystick isn't haptic
+ *
+ * // See if it can do sine waves
+ * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) {
+ * SDL_HapticClose(haptic); // No sine effect
+ * return -1;
+ * }
+ *
+ * // Create the effect
+ * memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default
+ * effect.type = SDL_HAPTIC_SINE;
+ * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates
+ * effect.periodic.direction.dir[0] = 18000; // Force comes from south
+ * effect.periodic.period = 1000; // 1000 ms
+ * effect.periodic.magnitude = 20000; // 20000/32767 strength
+ * effect.periodic.length = 5000; // 5 seconds long
+ * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength
+ * effect.periodic.fade_length = 1000; // Takes 1 second to fade away
+ *
+ * // Upload the effect
+ * effect_id = SDL_HapticNewEffect( haptic, &effect );
+ *
+ * // Test the effect
+ * SDL_HapticRunEffect( haptic, effect_id, 1 );
+ * SDL_Delay( 5000); // Wait for the effect to finish
+ *
+ * // We destroy the effect, although closing the device also does this
+ * SDL_HapticDestroyEffect( haptic, effect_id );
+ *
+ * // Close the device
+ * SDL_HapticClose(haptic);
+ *
+ * return 0; // Success
+ * }
+ * \endcode
+ * \author Edgar Simo Serra
+ */
+
+#ifndef _SDL_haptic_h
+#define _SDL_haptic_h
+
+#include "SDL_stdinc.h"
+#include "SDL_error.h"
+#include "SDL_joystick.h"
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+ /* *INDENT-ON* */
+#endif /* __cplusplus */
+
+/**
+ * \typedef SDL_Haptic
+ *
+ * \brief The haptic structure used to identify an SDL haptic.
+ *
+ * \sa SDL_HapticOpen
+ * \sa SDL_HapticOpenFromJoystick
+ * \sa SDL_HapticClose
+ */
+struct _SDL_Haptic;
+typedef struct _SDL_Haptic SDL_Haptic;
+
+
+/**
+ * \name Haptic features
+ *
+ * Different haptic features a device can have.
+ */
+/*@{*/
+
+/**
+ * \name Haptic effects
+ */
+/*@{*/
+
+/**
+ * \brief Constant effect supported.
+ *
+ * Constant haptic effect.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_CONSTANT (1<<0)
+
+/**
+ * \brief Sine wave effect supported.
+ *
+ * Periodic haptic effect that simulates sine waves.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SINE (1<<1)
+
+/**
+ * \brief Square wave effect supported.
+ *
+ * Periodic haptic effect that simulates square waves.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SQUARE (1<<2)
+
+/**
+ * \brief Triangle wave effect supported.
+ *
+ * Periodic haptic effect that simulates triangular waves.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_TRIANGLE (1<<3)
+
+/**
+ * \brief Sawtoothup wave effect supported.
+ *
+ * Periodic haptic effect that simulates saw tooth up waves.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SAWTOOTHUP (1<<4)
+
+/**
+ * \brief Sawtoothdown wave effect supported.
+ *
+ * Periodic haptic effect that simulates saw tooth down waves.
+ *
+ * \sa SDL_HapticPeriodic
+ */
+#define SDL_HAPTIC_SAWTOOTHDOWN (1<<5)
+
+/**
+ * \brief Ramp effect supported.
+ *
+ * Ramp haptic effect.
+ *
+ * \sa SDL_HapticRamp
+ */
+#define SDL_HAPTIC_RAMP (1<<6)
+
+/**
+ * \brief Spring effect supported - uses axes position.
+ *
+ * Condition haptic effect that simulates a spring. Effect is based on the
+ * axes position.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_SPRING (1<<7)
+
+/**
+ * \brief Damper effect supported - uses axes velocity.
+ *
+ * Condition haptic effect that simulates dampening. Effect is based on the
+ * axes velocity.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_DAMPER (1<<8)
+
+/**
+ * \brief Inertia effect supported - uses axes acceleration.
+ *
+ * Condition haptic effect that simulates inertia. Effect is based on the axes
+ * acceleration.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_INERTIA (1<<9)
+
+/**
+ * \brief Friction effect supported - uses axes movement.
+ *
+ * Condition haptic effect that simulates friction. Effect is based on the
+ * axes movement.
+ *
+ * \sa SDL_HapticCondition
+ */
+#define SDL_HAPTIC_FRICTION (1<<10)
+
+/**
+ * \brief Custom effect is supported.
+ *
+ * User defined custom haptic effect.
+ */
+#define SDL_HAPTIC_CUSTOM (1<<11)
+
+/*@}*//*Haptic effects*/
+
+/* These last few are features the device has, not effects */
+
+/**
+ * \brief Device can set global gain.
+ *
+ * Device supports setting the global gain.
+ *
+ * \sa SDL_HapticSetGain
+ */
+#define SDL_HAPTIC_GAIN (1<<12)
+
+/**
+ * \brief Device can set autocenter.
+ *
+ * Device supports setting autocenter.
+ *
+ * \sa SDL_HapticSetAutocenter
+ */
+#define SDL_HAPTIC_AUTOCENTER (1<<13)
+
+/**
+ * \brief Device can be queried for effect status.
+ *
+ * Device can be queried for effect status.
+ *
+ * \sa SDL_HapticGetEffectStatus
+ */
+#define SDL_HAPTIC_STATUS (1<<14)
+
+/**
+ * \brief Device can be paused.
+ *
+ * \sa SDL_HapticPause
+ * \sa SDL_HapticUnpause
+ */
+#define SDL_HAPTIC_PAUSE (1<<15)
+
+
+/**
+ * \name Direction encodings
+ */
+/*@{*/
+
+/**
+ * \brief Uses polar coordinates for the direction.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_POLAR 0
+
+/**
+ * \brief Uses cartesian coordinates for the direction.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_CARTESIAN 1
+
+/**
+ * \brief Uses spherical coordinates for the direction.
+ *
+ * \sa SDL_HapticDirection
+ */
+#define SDL_HAPTIC_SPHERICAL 2
+
+/*@}*//*Direction encodings*/
+
+/*@}*//*Haptic features*/
+
+/*
+ * Misc defines.
+ */
+
+/**
+ * \brief Used to play a device an infinite number of times.
+ *
+ * \sa SDL_HapticRunEffect
+ */
+#define SDL_HAPTIC_INFINITY 4294967295U
+
+
+/**
+ * \brief Structure that represents a haptic direction.
+ *
+ * Directions can be specified by:
+ * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates.
+ * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates.
+ * - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates.
+ *
+ * Cardinal directions of the haptic device are relative to the positioning
+ * of the device. North is considered to be away from the user.
+ *
+ * The following diagram represents the cardinal directions:
+ * \verbatim
+ .--.
+ |__| .-------.
+ |=.| |.-----.|
+ |--| || ||
+ | | |'-----'|
+ |__|~')_____('
+ [ COMPUTER ]
+
+
+ North (0,-1)
+ ^
+ |
+ |
+ (1,0) West <----[ HAPTIC ]----> East (-1,0)
+ |
+ |
+ v
+ South (0,1)
+
+
+ [ USER ]
+ \|||/
+ (o o)
+ ---ooO-(_)-Ooo---
+ \endverbatim
+ *
+ * If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a
+ * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses
+ * the first \c dir parameter. The cardinal directions would be:
+ * - North: 0 (0 degrees)
+ * - East: 9000 (90 degrees)
+ * - South: 18000 (180 degrees)
+ * - West: 27000 (270 degrees)
+ *
+ * If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions
+ * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses
+ * the first three \c dir parameters. The cardinal directions would be:
+ * - North: 0,-1, 0
+ * - East: -1, 0, 0
+ * - South: 0, 1, 0
+ * - West: 1, 0, 0
+ *
+ * The Z axis represents the height of the effect if supported, otherwise
+ * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you
+ * can use any multiple you want, only the direction matters.
+ *
+ * If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations.
+ * The first two \c dir parameters are used. The \c dir parameters are as
+ * follows (all values are in hundredths of degrees):
+ * - Degrees from (1, 0) rotated towards (0, 1).
+ * - Degrees towards (0, 0, 1) (device needs at least 3 axes).
+ *
+ *
+ * Example of force coming from the south with all encodings (force coming
+ * from the south means the user will have to pull the stick to counteract):
+ * \code
+ * SDL_HapticDirection direction;
+ *
+ * // Cartesian directions
+ * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding.
+ * direction.dir[0] = 0; // X position
+ * direction.dir[1] = 1; // Y position
+ * // Assuming the device has 2 axes, we don't need to specify third parameter.
+ *
+ * // Polar directions
+ * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding.
+ * direction.dir[0] = 18000; // Polar only uses first parameter
+ *
+ * // Spherical coordinates
+ * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding
+ * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters.
+ * \endcode
+ *
+ * \sa SDL_HAPTIC_POLAR
+ * \sa SDL_HAPTIC_CARTESIAN
+ * \sa SDL_HAPTIC_SPHERICAL
+ * \sa SDL_HapticEffect
+ * \sa SDL_HapticNumAxes
+ */
+typedef struct SDL_HapticDirection
+{
+ Uint8 type; /**< The type of encoding. */
+ Sint32 dir[3]; /**< The encoded direction. */
+} SDL_HapticDirection;
+
+
+/**
+ * \brief A structure containing a template for a Constant effect.
+ *
+ * The struct is exclusive to the ::SDL_HAPTIC_CONSTANT effect.
+ *
+ * A constant effect applies a constant force in the specified direction
+ * to the joystick.
+ *
+ * \sa SDL_HAPTIC_CONSTANT
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticConstant
+{
+ /* Header */
+ Uint16 type; /**< ::SDL_HAPTIC_CONSTANT */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Constant */
+ Sint16 level; /**< Strength of the constant effect. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticConstant;
+
+/**
+ * \brief A structure containing a template for a Periodic effect.
+ *
+ * The struct handles the following effects:
+ * - ::SDL_HAPTIC_SINE
+ * - ::SDL_HAPTIC_SQUARE
+ * - ::SDL_HAPTIC_TRIANGLE
+ * - ::SDL_HAPTIC_SAWTOOTHUP
+ * - ::SDL_HAPTIC_SAWTOOTHDOWN
+ *
+ * A periodic effect consists in a wave-shaped effect that repeats itself
+ * over time. The type determines the shape of the wave and the parameters
+ * determine the dimensions of the wave.
+ *
+ * Phase is given by hundredth of a cyle meaning that giving the phase a value
+ * of 9000 will displace it 25% of it's period. Here are sample values:
+ * - 0: No phase displacement.
+ * - 9000: Displaced 25% of it's period.
+ * - 18000: Displaced 50% of it's period.
+ * - 27000: Displaced 75% of it's period.
+ * - 36000: Displaced 100% of it's period, same as 0, but 0 is preffered.
+ *
+ * Examples:
+ * \verbatim
+ SDL_HAPTIC_SINE
+ __ __ __ __
+ / \ / \ / \ /
+ / \__/ \__/ \__/
+
+ SDL_HAPTIC_SQUARE
+ __ __ __ __ __
+ | | | | | | | | | |
+ | |__| |__| |__| |__| |
+
+ SDL_HAPTIC_TRIANGLE
+ /\ /\ /\ /\ /\
+ / \ / \ / \ / \ /
+ / \/ \/ \/ \/
+
+ SDL_HAPTIC_SAWTOOTHUP
+ /| /| /| /| /| /| /|
+ / | / | / | / | / | / | / |
+ / |/ |/ |/ |/ |/ |/ |
+
+ SDL_HAPTIC_SAWTOOTHDOWN
+ \ |\ |\ |\ |\ |\ |\ |
+ \ | \ | \ | \ | \ | \ | \ |
+ \| \| \| \| \| \| \|
+ \endverbatim
+ *
+ * \sa SDL_HAPTIC_SINE
+ * \sa SDL_HAPTIC_SQUARE
+ * \sa SDL_HAPTIC_TRIANGLE
+ * \sa SDL_HAPTIC_SAWTOOTHUP
+ * \sa SDL_HAPTIC_SAWTOOTHDOWN
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticPeriodic
+{
+ /* Header */
+ Uint16 type; /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_SQUARE,
+ ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or
+ ::SDL_HAPTIC_SAWTOOTHDOWN */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Periodic */
+ Uint16 period; /**< Period of the wave. */
+ Sint16 magnitude; /**< Peak value. */
+ Sint16 offset; /**< Mean value of the wave. */
+ Uint16 phase; /**< Horizontal shift given by hundredth of a cycle. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticPeriodic;
+
+/**
+ * \brief A structure containing a template for a Condition effect.
+ *
+ * The struct handles the following effects:
+ * - ::SDL_HAPTIC_SPRING: Effect based on axes position.
+ * - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity.
+ * - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration.
+ * - ::SDL_HAPTIC_FRICTION: Effect based on axes movement.
+ *
+ * Direction is handled by condition internals instead of a direction member.
+ * The condition effect specific members have three parameters. The first
+ * refers to the X axis, the second refers to the Y axis and the third
+ * refers to the Z axis. The right terms refer to the positive side of the
+ * axis and the left terms refer to the negative side of the axis. Please
+ * refer to the ::SDL_HapticDirection diagram for which side is positive and
+ * which is negative.
+ *
+ * \sa SDL_HapticDirection
+ * \sa SDL_HAPTIC_SPRING
+ * \sa SDL_HAPTIC_DAMPER
+ * \sa SDL_HAPTIC_INERTIA
+ * \sa SDL_HAPTIC_FRICTION
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticCondition
+{
+ /* Header */
+ Uint16 type; /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER,
+ ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */
+ SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Condition */
+ Uint16 right_sat[3]; /**< Level when joystick is to the positive side. */
+ Uint16 left_sat[3]; /**< Level when joystick is to the negative side. */
+ Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */
+ Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */
+ Uint16 deadband[3]; /**< Size of the dead zone. */
+ Sint16 center[3]; /**< Position of the dead zone. */
+} SDL_HapticCondition;
+
+/**
+ * \brief A structure containing a template for a Ramp effect.
+ *
+ * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect.
+ *
+ * The ramp effect starts at start strength and ends at end strength.
+ * It augments in linear fashion. If you use attack and fade with a ramp
+ * they effects get added to the ramp effect making the effect become
+ * quadratic instead of linear.
+ *
+ * \sa SDL_HAPTIC_RAMP
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticRamp
+{
+ /* Header */
+ Uint16 type; /**< ::SDL_HAPTIC_RAMP */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Ramp */
+ Sint16 start; /**< Beginning strength level. */
+ Sint16 end; /**< Ending strength level. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticRamp;
+
+/**
+ * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect.
+ *
+ * A custom force feedback effect is much like a periodic effect, where the
+ * application can define it's exact shape. You will have to allocate the
+ * data yourself. Data should consist of channels * samples Uint16 samples.
+ *
+ * If channels is one, the effect is rotated using the defined direction.
+ * Otherwise it uses the samples in data for the different axes.
+ *
+ * \sa SDL_HAPTIC_CUSTOM
+ * \sa SDL_HapticEffect
+ */
+typedef struct SDL_HapticCustom
+{
+ /* Header */
+ Uint16 type; /**< ::SDL_HAPTIC_CUSTOM */
+ SDL_HapticDirection direction; /**< Direction of the effect. */
+
+ /* Replay */
+ Uint32 length; /**< Duration of the effect. */
+ Uint16 delay; /**< Delay before starting the effect. */
+
+ /* Trigger */
+ Uint16 button; /**< Button that triggers the effect. */
+ Uint16 interval; /**< How soon it can be triggered again after button. */
+
+ /* Custom */
+ Uint8 channels; /**< Axes to use, minimum of one. */
+ Uint16 period; /**< Sample periods. */
+ Uint16 samples; /**< Amount of samples. */
+ Uint16 *data; /**< Should contain channels*samples items. */
+
+ /* Envelope */
+ Uint16 attack_length; /**< Duration of the attack. */
+ Uint16 attack_level; /**< Level at the start of the attack. */
+ Uint16 fade_length; /**< Duration of the fade. */
+ Uint16 fade_level; /**< Level at the end of the fade. */
+} SDL_HapticCustom;
+
+/**
+ * \brief The generic template for any haptic effect.
+ *
+ * All values max at 32767 (0x7FFF). Signed values also can be negative.
+ * Time values unless specified otherwise are in milliseconds.
+ *
+ * You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767
+ * value. Neither delay, interval, attack_length nor fade_length support
+ * ::SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends.
+ *
+ * Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of
+ * ::SDL_HAPTIC_INFINITY.
+ *
+ * Button triggers may not be supported on all devices, it is advised to not
+ * use them if possible. Buttons start at index 1 instead of index 0 like
+ * they joystick.
+ *
+ * If both attack_length and fade_level are 0, the envelope is not used,
+ * otherwise both values are used.
+ *
+ * Common parts:
+ * \code
+ * // Replay - All effects have this
+ * Uint32 length; // Duration of effect (ms).
+ * Uint16 delay; // Delay before starting effect.
+ *
+ * // Trigger - All effects have this
+ * Uint16 button; // Button that triggers effect.
+ * Uint16 interval; // How soon before effect can be triggered again.
+ *
+ * // Envelope - All effects except condition effects have this
+ * Uint16 attack_length; // Duration of the attack (ms).
+ * Uint16 attack_level; // Level at the start of the attack.
+ * Uint16 fade_length; // Duration of the fade out (ms).
+ * Uint16 fade_level; // Level at the end of the fade.
+ * \endcode
+ *
+ *
+ * Here we have an example of a constant effect evolution in time:
+ * \verbatim
+ Strength
+ ^
+ |
+ | effect level --> _________________
+ | / \
+ | / \
+ | / \
+ | / \
+ | attack_level --> | \
+ | | | <--- fade_level
+ |
+ +--------------------------------------------------> Time
+ [--] [---]
+ attack_length fade_length
+
+ [------------------][-----------------------]
+ delay length
+ \endverbatim
+ *
+ * Note either the attack_level or the fade_level may be above the actual
+ * effect level.
+ *
+ * \sa SDL_HapticConstant
+ * \sa SDL_HapticPeriodic
+ * \sa SDL_HapticCondition
+ * \sa SDL_HapticRamp
+ * \sa SDL_HapticCustom
+ */
+typedef union SDL_HapticEffect
+{
+ /* Common for all force feedback effects */
+ Uint16 type; /**< Effect type. */
+ SDL_HapticConstant constant; /**< Constant effect. */
+ SDL_HapticPeriodic periodic; /**< Periodic effect. */
+ SDL_HapticCondition condition; /**< Condition effect. */
+ SDL_HapticRamp ramp; /**< Ramp effect. */
+ SDL_HapticCustom custom; /**< Custom effect. */
+} SDL_HapticEffect;
+
+
+/* Function prototypes */
+/**
+ * \brief Count the number of joysticks attached to the system.
+ *
+ * \return Number of haptic devices detected on the system.
+ */
+extern DECLSPEC int SDLCALL SDL_NumHaptics(void);
+
+/**
+ * \brief Get the implementation dependent name of a Haptic device.
+ *
+ * This can be called before any joysticks are opened.
+ * If no name can be found, this function returns NULL.
+ *
+ * \param device_index Index of the device to get it's name.
+ * \return Name of the device or NULL on error.
+ *
+ * \sa SDL_NumHaptics
+ */
+extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index);
+
+/**
+ * \brief Opens a Haptic device for usage.
+ *
+ * The index passed as an argument refers to the N'th Haptic device on this
+ * system.
+ *
+ * When opening a haptic device, it's gain will be set to maximum and
+ * autocenter will be disabled. To modify these values use
+ * SDL_HapticSetGain() and SDL_HapticSetAutocenter().
+ *
+ * \param device_index Index of the device to open.
+ * \return Device identifier or NULL on error.
+ *
+ * \sa SDL_HapticIndex
+ * \sa SDL_HapticOpenFromMouse
+ * \sa SDL_HapticOpenFromJoystick
+ * \sa SDL_HapticClose
+ * \sa SDL_HapticSetGain
+ * \sa SDL_HapticSetAutocenter
+ * \sa SDL_HapticPause
+ * \sa SDL_HapticStopAll
+ */
+extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index);
+
+/**
+ * \brief Checks if the haptic device at index has been opened.
+ *
+ * \param device_index Index to check to see if it has been opened.
+ * \return 1 if it has been opened or 0 if it hasn't.
+ *
+ * \sa SDL_HapticOpen
+ * \sa SDL_HapticIndex
+ */
+extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index);
+
+/**
+ * \brief Gets the index of a haptic device.
+ *
+ * \param haptic Haptic device to get the index of.
+ * \return The index of the haptic device or -1 on error.
+ *
+ * \sa SDL_HapticOpen
+ * \sa SDL_HapticOpened
+ */
+extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic);
+
+/**
+ * \brief Gets whether or not the current mouse has haptic capabilities.
+ *
+ * \return SDL_TRUE if the mouse is haptic, SDL_FALSE if it isn't.
+ *
+ * \sa SDL_HapticOpenFromMouse
+ */
+extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void);
+
+/**
+ * \brief Tries to open a haptic device from the current mouse.
+ *
+ * \return The haptic device identifier or NULL on error.
+ *
+ * \sa SDL_MouseIsHaptic
+ * \sa SDL_HapticOpen
+ */
+extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void);
+
+/**
+ * \brief Checks to see if a joystick has haptic features.
+ *
+ * \param joystick Joystick to test for haptic capabilities.
+ * \return 1 if the joystick is haptic, 0 if it isn't
+ * or -1 if an error ocurred.
+ *
+ * \sa SDL_HapticOpenFromJoystick
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick);
+
+/**
+ * \brief Opens a Haptic device for usage from a Joystick device.
+ *
+ * You must still close the haptic device seperately. It will not be closed
+ * with the joystick.
+ *
+ * When opening from a joystick you should first close the haptic device before
+ * closing the joystick device. If not, on some implementations the haptic
+ * device will also get unallocated and you'll be unable to use force feedback
+ * on that device.
+ *
+ * \param joystick Joystick to create a haptic device from.
+ * \return A valid haptic device identifier on success or NULL on error.
+ *
+ * \sa SDL_HapticOpen
+ * \sa SDL_HapticClose
+ */
+extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick *
+ joystick);
+
+/**
+ * \brief Closes a Haptic device previously opened with SDL_HapticOpen().
+ *
+ * \param haptic Haptic device to close.
+ */
+extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic);
+
+/**
+ * \brief Returns the number of effects a haptic device can store.
+ *
+ * On some platforms this isn't fully supported, and therefore is an
+ * aproximation. Always check to see if your created effect was actually
+ * created and do not rely solely on SDL_HapticNumEffects().
+ *
+ * \param haptic The haptic device to query effect max.
+ * \return The number of effects the haptic device can store or
+ * -1 on error.
+ *
+ * \sa SDL_HapticNumEffectsPlaying
+ * \sa SDL_HapticQuery
+ */
+extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic);
+
+/**
+ * \brief Returns the number of effects a haptic device can play at the same
+ * time.
+ *
+ * This is not supported on all platforms, but will always return a value.
+ * Added here for the sake of completness.
+ *
+ * \param haptic The haptic device to query maximum playing effects.
+ * \return The number of effects the haptic device can play at the same time
+ * or -1 on error.
+ *
+ * \sa SDL_HapticNumEffects
+ * \sa SDL_HapticQuery
+ */
+extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic);
+
+/**
+ * \brief Gets the haptic devices supported features in bitwise matter.
+ *
+ * Example:
+ * \code
+ * if (SDL_HapticQueryEffects(haptic) & SDL_HAPTIC_CONSTANT) {
+ * printf("We have constant haptic effect!");
+ * }
+ * \endcode
+ *
+ * \param haptic The haptic device to query.
+ * \return Haptic features in bitwise manner (OR'd).
+ *
+ * \sa SDL_HapticNumEffects
+ * \sa SDL_HapticEffectSupported
+ */
+extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic);
+
+
+/**
+ * \brief Gets the number of haptic axes the device has.
+ *
+ * \sa SDL_HapticDirection
+ */
+extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic);
+
+/**
+ * \brief Checks to see if effect is supported by haptic.
+ *
+ * \param haptic Haptic device to check on.
+ * \param effect Effect to check to see if it is supported.
+ * \return 1 if effect is supported, 0 if it isn't or -1 on error.
+ *
+ * \sa SDL_HapticQuery
+ * \sa SDL_HapticNewEffect
+ */
+extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic,
+ SDL_HapticEffect *
+ effect);
+
+/**
+ * \brief Creates a new haptic effect on the device.
+ *
+ * \param haptic Haptic device to create the effect on.
+ * \param effect Properties of the effect to create.
+ * \return The id of the effect on success or -1 on error.
+ *
+ * \sa SDL_HapticUpdateEffect
+ * \sa SDL_HapticRunEffect
+ * \sa SDL_HapticDestroyEffect
+ */
+extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic,
+ SDL_HapticEffect * effect);
+
+/**
+ * \brief Updates the properties of an effect.
+ *
+ * Can be used dynamically, although behaviour when dynamically changing
+ * direction may be strange. Specifically the effect may reupload itself
+ * and start playing from the start. You cannot change the type either when
+ * running SDL_HapticUpdateEffect().
+ *
+ * \param haptic Haptic device that has the effect.
+ * \param effect Effect to update.
+ * \param data New effect properties to use.
+ * \return The id of the effect on success or -1 on error.
+ *
+ * \sa SDL_HapticNewEffect
+ * \sa SDL_HapticRunEffect
+ * \sa SDL_HapticDestroyEffect
+ */
+extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic,
+ int effect,
+ SDL_HapticEffect * data);
+
+/**
+ * \brief Runs the haptic effect on it's assosciated haptic device.
+ *
+ * If iterations are ::SDL_HAPTIC_INFINITY, it'll run the effect over and over
+ * repeating the envelope (attack and fade) every time. If you only want the
+ * effect to last forever, set ::SDL_HAPTIC_INFINITY in the effect's length
+ * parameter.
+ *
+ * \param haptic Haptic device to run the effect on.
+ * \param effect Identifier of the haptic effect to run.
+ * \param iterations Number of iterations to run the effect. Use
+ * ::SDL_HAPTIC_INFINITY for infinity.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticStopEffect
+ * \sa SDL_HapticDestroyEffect
+ * \sa SDL_HapticGetEffectStatus
+ */
+extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic,
+ int effect,
+ Uint32 iterations);
+
+/**
+ * \brief Stops the haptic effect on it's assosciated haptic device.
+ *
+ * \param haptic Haptic device to stop the effect on.
+ * \param effect Identifier of the effect to stop.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticRunEffect
+ * \sa SDL_HapticDestroyEffect
+ */
+extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic,
+ int effect);
+
+/**
+ * \brief Destroys a haptic effect on the device.
+ *
+ * This will stop the effect if it's running. Effects are automatically
+ * destroyed when the device is closed.
+ *
+ * \param haptic Device to destroy the effect on.
+ * \param effect Identifier of the effect to destroy.
+ *
+ * \sa SDL_HapticNewEffect
+ */
+extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic,
+ int effect);
+
+/**
+ * \brief Gets the status of the current effect on the haptic device.
+ *
+ * Device must support the ::SDL_HAPTIC_STATUS feature.
+ *
+ * \param haptic Haptic device to query the effect status on.
+ * \param effect Identifier of the effect to query it's status.
+ * \return 0 if it isn't playing, ::SDL_HAPTIC_PLAYING if it is playing
+ * or -1 on error.
+ *
+ * \sa SDL_HapticRunEffect
+ * \sa SDL_HapticStopEffect
+ */
+extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic,
+ int effect);
+
+/**
+ * \brief Sets the global gain of the device.
+ *
+ * Device must support the ::SDL_HAPTIC_GAIN feature.
+ *
+ * The user may specify the maxmimum gain by setting the environment variable
+ * ::SDL_HAPTIC_GAIN_MAX which should be between 0 and 100. All calls to
+ * SDL_HapticSetGain() will scale linearly using ::SDL_HAPTIC_GAIN_MAX as the
+ * maximum.
+ *
+ * \param haptic Haptic device to set the gain on.
+ * \param gain Value to set the gain to, should be between 0 and 100.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticQuery
+ */
+extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain);
+
+/**
+ * \brief Sets the global autocenter of the device.
+ *
+ * Autocenter should be between 0 and 100. Setting it to 0 will disable
+ * autocentering.
+ *
+ * Device must support the ::SDL_HAPTIC_AUTOCENTER feature.
+ *
+ * \param haptic Haptic device to set autocentering on.
+ * \param autocenter Value to set autocenter to, 0 disables autocentering.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticQuery
+ */
+extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic,
+ int autocenter);
+
+/**
+ * \brief Pauses a haptic device.
+ *
+ * Device must support the ::SDL_HAPTIC_PAUSE feature. Call
+ * SDL_HapticUnpause() to resume playback.
+ *
+ * Do not modify the effects nor add new ones while the device is paused.
+ * That can cause all sorts of weird errors.
+ *
+ * \param haptic Haptic device to pause.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticUnpause
+ */
+extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic);
+
+/**
+ * \brief Unpauses a haptic device.
+ *
+ * Call to unpause after SDL_HapticPause().
+ *
+ * \param haptic Haptic device to pause.
+ * \return 0 on success or -1 on error.
+ *
+ * \sa SDL_HapticPause
+ */
+extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic);
+
+/**
+ * \brief Stops all the currently playing effects on a haptic device.
+ *
+ * \param haptic Haptic device to stop.
+ * \return 0 on success or -1 on error.
+ */
+extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic);
+
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_haptic_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_joystick.h b/macosx/plugins/DFInput/SDL/include/SDL_joystick.h
new file mode 100644
index 0000000..2e70862
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_joystick.h
@@ -0,0 +1,209 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_joystick.h
+ *
+ * Include file for SDL joystick event handling
+ */
+
+#ifndef _SDL_joystick_h
+#define _SDL_joystick_h
+
+#include "SDL_stdinc.h"
+#include "SDL_error.h"
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/**
+ * \file SDL_joystick.h
+ *
+ * In order to use these functions, SDL_Init() must have been called
+ * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system
+ * for joysticks, and load appropriate drivers.
+ */
+
+/* The joystick structure used to identify an SDL joystick */
+struct _SDL_Joystick;
+typedef struct _SDL_Joystick SDL_Joystick;
+
+
+/* Function prototypes */
+/**
+ * Count the number of joysticks attached to the system
+ */
+extern DECLSPEC int SDLCALL SDL_NumJoysticks(void);
+
+/**
+ * Get the implementation dependent name of a joystick.
+ * This can be called before any joysticks are opened.
+ * If no name can be found, this function returns NULL.
+ */
+extern DECLSPEC const char *SDLCALL SDL_JoystickName(int device_index);
+
+/**
+ * Open a joystick for use.
+ * The index passed as an argument refers tothe N'th joystick on the system.
+ * This index is the value which will identify this joystick in future joystick
+ * events.
+ *
+ * \return A joystick identifier, or NULL if an error occurred.
+ */
+extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index);
+
+/**
+ * Returns 1 if the joystick has been opened, or 0 if it has not.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickOpened(int device_index);
+
+/**
+ * Get the device index of an opened joystick.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickIndex(SDL_Joystick * joystick);
+
+/**
+ * Get the number of general axis controls on a joystick.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick * joystick);
+
+/**
+ * Get the number of trackballs on a joystick.
+ *
+ * Joystick trackballs have only relative motion events associated
+ * with them and their state cannot be polled.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick * joystick);
+
+/**
+ * Get the number of POV hats on a joystick.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick * joystick);
+
+/**
+ * Get the number of buttons on a joystick.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick * joystick);
+
+/**
+ * Update the current state of the open joysticks.
+ *
+ * This is called automatically by the event loop if any joystick
+ * events are enabled.
+ */
+extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void);
+
+/**
+ * Enable/disable joystick event polling.
+ *
+ * If joystick events are disabled, you must call SDL_JoystickUpdate()
+ * yourself and check the state of the joystick when you want joystick
+ * information.
+ *
+ * The state can be one of ::SDL_QUERY, ::SDL_ENABLE or ::SDL_IGNORE.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state);
+
+/**
+ * Get the current state of an axis control on a joystick.
+ *
+ * The state is a value ranging from -32768 to 32767.
+ *
+ * The axis indices start at index 0.
+ */
+extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick * joystick,
+ int axis);
+
+/**
+ * \name Hat positions
+ */
+/*@{*/
+#define SDL_HAT_CENTERED 0x00
+#define SDL_HAT_UP 0x01
+#define SDL_HAT_RIGHT 0x02
+#define SDL_HAT_DOWN 0x04
+#define SDL_HAT_LEFT 0x08
+#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP)
+#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN)
+#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP)
+#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN)
+/*@}*/
+
+/**
+ * Get the current state of a POV hat on a joystick.
+ *
+ * The hat indices start at index 0.
+ *
+ * \return The return value is one of the following positions:
+ * - ::SDL_HAT_CENTERED
+ * - ::SDL_HAT_UP
+ * - ::SDL_HAT_RIGHT
+ * - ::SDL_HAT_DOWN
+ * - ::SDL_HAT_LEFT
+ * - ::SDL_HAT_RIGHTUP
+ * - ::SDL_HAT_RIGHTDOWN
+ * - ::SDL_HAT_LEFTUP
+ * - ::SDL_HAT_LEFTDOWN
+ */
+extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick * joystick,
+ int hat);
+
+/**
+ * Get the ball axis change since the last poll.
+ *
+ * \return 0, or -1 if you passed it invalid parameters.
+ *
+ * The ball indices start at index 0.
+ */
+extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick * joystick,
+ int ball, int *dx, int *dy);
+
+/**
+ * Get the current state of a button on a joystick.
+ *
+ * The button indices start at index 0.
+ */
+extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick * joystick,
+ int button);
+
+/**
+ * Close a joystick previously opened with SDL_JoystickOpen().
+ */
+extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick * joystick);
+
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_joystick_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_main.h b/macosx/plugins/DFInput/SDL/include/SDL_main.h
new file mode 100644
index 0000000..803aa0f
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_main.h
@@ -0,0 +1,96 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+#ifndef _SDL_main_h
+#define _SDL_main_h
+
+#include "SDL_stdinc.h"
+
+/**
+ * \file SDL_main.h
+ *
+ * Redefine main() on some platforms so that it is called by SDL.
+ */
+
+#if defined(__WIN32__) || \
+ (defined(__MWERKS__) && !defined(__BEOS__)) || \
+ defined(__SYMBIAN32__) || defined(__IPHONEOS__)
+
+#ifdef __cplusplus
+#define C_LINKAGE "C"
+#else
+#define C_LINKAGE
+#endif /* __cplusplus */
+
+/**
+ * \file SDL_main.h
+ *
+ * The application's main() function must be called with C linkage,
+ * and should be declared like this:
+ * \code
+ * #ifdef __cplusplus
+ * extern "C"
+ * #endif
+ * int main(int argc, char *argv[])
+ * {
+ * }
+ * \endcode
+ */
+
+#define main SDL_main
+
+/**
+ * The prototype for the application's main() function
+ */
+extern C_LINKAGE int SDL_main(int argc, char *argv[]);
+
+
+/* From the SDL library code -- needed for registering the app on Win32 */
+#ifdef __WIN32__
+
+#include "begin_code.h"
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/**
+ * This can be called to set the application class at startup
+ */
+extern DECLSPEC int SDLCALL SDL_RegisterApp(char *name, Uint32 style,
+ void *hInst);
+extern DECLSPEC void SDLCALL SDL_UnregisterApp(void);
+
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+#endif
+
+#endif /* Need to redefine main()? */
+
+#endif /* _SDL_main_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_platform.h b/macosx/plugins/DFInput/SDL/include/SDL_platform.h
new file mode 100644
index 0000000..f9429bd
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_platform.h
@@ -0,0 +1,154 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_platform.h
+ *
+ * Try to get a standard set of platform defines.
+ */
+
+#ifndef _SDL_platform_h
+#define _SDL_platform_h
+
+#if defined(_AIX)
+#undef __AIX__
+#define __AIX__ 1
+#endif
+#if defined(__BEOS__)
+#undef __BEOS__
+#define __BEOS__ 1
+#endif
+#if defined(__HAIKU__)
+#undef __HAIKU__
+#define __HAIKU__ 1
+#endif
+#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__)
+#undef __BSDI__
+#define __BSDI__ 1
+#endif
+#if defined(_arch_dreamcast)
+#undef __DREAMCAST__
+#define __DREAMCAST__ 1
+#endif
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+#undef __FREEBSD__
+#define __FREEBSD__ 1
+#endif
+#if defined(hpux) || defined(__hpux) || defined(__hpux__)
+#undef __HPUX__
+#define __HPUX__ 1
+#endif
+#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE)
+#undef __IRIX__
+#define __IRIX__ 1
+#endif
+#if defined(linux) || defined(__linux) || defined(__linux__)
+#undef __LINUX__
+#define __LINUX__ 1
+#endif
+
+#if defined(__APPLE__)
+/* lets us know what version of Mac OS X we're compiling on */
+#include "AvailabilityMacros.h"
+#ifdef MAC_OS_X_VERSION_10_3
+#include "TargetConditionals.h" /* this header is in 10.3 or later */
+#if TARGET_OS_IPHONE
+/* if compiling for iPhone */
+#undef __IPHONEOS__
+#define __IPHONEOS__ 1
+#undef __MACOSX__
+#else
+/* if not compiling for iPhone */
+#undef __MACOSX__
+#define __MACOSX__ 1
+#endif /* TARGET_OS_IPHONE */
+#else
+/* if earlier verion of Mac OS X than version 10.3 */
+#undef __MACOSX__
+#define __MACOSX__ 1
+#endif
+
+#endif /* defined(__APPLE__) */
+
+#if defined(__NetBSD__)
+#undef __NETBSD__
+#define __NETBSD__ 1
+#endif
+#if defined(__OpenBSD__)
+#undef __OPENBSD__
+#define __OPENBSD__ 1
+#endif
+#if defined(__OS2__)
+#undef __OS2__
+#define __OS2__ 1
+#endif
+#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE)
+#undef __OSF__
+#define __OSF__ 1
+#endif
+#if defined(__QNXNTO__)
+#undef __QNXNTO__
+#define __QNXNTO__ 1
+#endif
+#if defined(riscos) || defined(__riscos) || defined(__riscos__)
+#undef __RISCOS__
+#define __RISCOS__ 1
+#endif
+#if defined(__SVR4)
+#undef __SOLARIS__
+#define __SOLARIS__ 1
+#endif
+#if defined(WIN32) || defined(_WIN32)
+#undef __WIN32__
+#define __WIN32__ 1
+#endif
+
+#if defined(__NDS__)
+#undef __NINTENDODS__
+#define __NINTENDODS__ 1
+#endif
+
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+/**
+ * \brief Gets the name of the platform.
+ */
+extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void);
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_platform_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/SDL_stdinc.h b/macosx/plugins/DFInput/SDL/include/SDL_stdinc.h
new file mode 100644
index 0000000..ba1e5b5
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/SDL_stdinc.h
@@ -0,0 +1,792 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file SDL_stdinc.h
+ *
+ * This is a general header that includes C language support.
+ */
+
+#ifndef _SDL_stdinc_h
+#define _SDL_stdinc_h
+
+#include "SDL_config.h"
+
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+#if defined(STDC_HEADERS)
+# include <stdlib.h>
+# include <stddef.h>
+# include <stdarg.h>
+#else
+# if defined(HAVE_STDLIB_H)
+# include <stdlib.h>
+# elif defined(HAVE_MALLOC_H)
+# include <malloc.h>
+# endif
+# if defined(HAVE_STDDEF_H)
+# include <stddef.h>
+# endif
+# if defined(HAVE_STDARG_H)
+# include <stdarg.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#elif defined(HAVE_STDINT_H)
+# include <stdint.h>
+#endif
+#ifdef HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+#ifdef HAVE_MATH_H
+# include <math.h>
+#endif
+#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
+# include <iconv.h>
+#endif
+
+/**
+ * The number of elements in an array.
+ */
+#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0]))
+#define SDL_TABLESIZE(table) SDL_arraysize(table)
+
+/**
+ * \name Cast operators
+ *
+ * Use proper C++ casts when compiled as C++ to be compatible with the option
+ * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above).
+ */
+/*@{*/
+#ifdef __cplusplus
+#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression)
+#define SDL_static_cast(type, expression) static_cast<type>(expression)
+#else
+#define SDL_reinterpret_cast(type, expression) ((type)(expression))
+#define SDL_static_cast(type, expression) ((type)(expression))
+#endif
+/*@}*//*Cast operators*/
+
+/* Define a four character code as a Uint32 */
+#define SDL_FOURCC(A, B, C, D) \
+ ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \
+ (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \
+ (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \
+ (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24))
+
+/**
+ * \name Basic data types
+ */
+/*@{*/
+
+typedef enum
+{
+ SDL_FALSE = 0,
+ SDL_TRUE = 1
+} SDL_bool;
+
+/**
+ * \brief A signed 8-bit integer type.
+ */
+typedef int8_t Sint8;
+/**
+ * \brief An unsigned 8-bit integer type.
+ */
+typedef uint8_t Uint8;
+/**
+ * \brief A signed 16-bit integer type.
+ */
+typedef int16_t Sint16;
+/**
+ * \brief An unsigned 16-bit integer type.
+ */
+typedef uint16_t Uint16;
+/**
+ * \brief A signed 32-bit integer type.
+ */
+typedef int32_t Sint32;
+/**
+ * \brief An unsigned 32-bit integer type.
+ */
+typedef uint32_t Uint32;
+
+#ifdef SDL_HAS_64BIT_TYPE
+/**
+ * \brief A signed 64-bit integer type.
+ * \warning On platforms without any sort of 64-bit datatype, this is equivalent to Sint32!
+ */
+typedef int64_t Sint64;
+/**
+ * \brief An unsigned 64-bit integer type.
+ * \warning On platforms without any sort of 64-bit datatype, this is equivalent to Uint32!
+ */
+typedef uint64_t Uint64;
+#else
+/* This is really just a hack to prevent the compiler from complaining */
+typedef Sint32 Sint64;
+typedef Uint32 Uint64;
+#endif
+
+/*@}*//*Basic data types*/
+
+
+#define SDL_COMPILE_TIME_ASSERT(name, x) \
+ typedef int SDL_dummy_ ## name[(x) * 2 - 1]
+/** \cond */
+#ifndef DOXYGEN_SHOULD_IGNORE_THIS
+SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);
+SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);
+SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);
+SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);
+SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);
+SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);
+#ifndef __NINTENDODS__ /* TODO: figure out why the following happens:
+ include/SDL_stdinc.h:150: error: size of array 'SDL_dummy_uint64' is negative
+ include/SDL_stdinc.h:151: error: size of array 'SDL_dummy_sint64' is negative */
+SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);
+SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
+#endif
+#endif /* DOXYGEN_SHOULD_IGNORE_THIS */
+/** \endcond */
+
+/* Check to make sure enums are the size of ints, for structure packing.
+ For both Watcom C/C++ and Borland C/C++ the compiler option that makes
+ enums having the size of an int must be enabled.
+ This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11).
+*/
+/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */
+#ifdef __MWERKS__
+#pragma enumsalwaysint on
+#endif
+
+/** \cond */
+#ifndef DOXYGEN_SHOULD_IGNORE_THIS
+#ifndef __NINTENDODS__ /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */
+typedef enum
+{
+ DUMMY_ENUM_VALUE
+} SDL_DUMMY_ENUM;
+
+SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
+#endif
+#endif /* DOXYGEN_SHOULD_IGNORE_THIS */
+/** \endcond */
+
+#include "begin_code.h"
+/* Set up for C function definitions, even when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+extern "C" {
+/* *INDENT-ON* */
+#endif
+
+#ifdef HAVE_MALLOC
+#define SDL_malloc malloc
+#else
+extern DECLSPEC void *SDLCALL SDL_malloc(size_t size);
+#endif
+
+#ifdef HAVE_CALLOC
+#define SDL_calloc calloc
+#else
+extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size);
+#endif
+
+#ifdef HAVE_REALLOC
+#define SDL_realloc realloc
+#else
+extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size);
+#endif
+
+#ifdef HAVE_FREE
+#define SDL_free free
+#else
+extern DECLSPEC void SDLCALL SDL_free(void *mem);
+#endif
+
+#if defined(HAVE_ALLOCA) && !defined(alloca)
+# if defined(HAVE_ALLOCA_H)
+# include <alloca.h>
+# elif defined(__GNUC__)
+# define alloca __builtin_alloca
+# elif defined(_MSC_VER)
+# include <malloc.h>
+# define alloca _alloca
+# elif defined(__WATCOMC__)
+# include <malloc.h>
+# elif defined(__BORLANDC__)
+# include <malloc.h>
+# elif defined(__DMC__)
+# include <stdlib.h>
+# elif defined(__AIX__)
+#pragma alloca
+# elif defined(__MRC__)
+void *alloca(unsigned);
+# else
+char *alloca();
+# endif
+#endif
+#ifdef HAVE_ALLOCA
+#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count))
+#define SDL_stack_free(data)
+#else
+#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count))
+#define SDL_stack_free(data) SDL_free(data)
+#endif
+
+#ifdef HAVE_GETENV
+#define SDL_getenv getenv
+#else
+extern DECLSPEC char *SDLCALL SDL_getenv(const char *name);
+#endif
+
+/* SDL_putenv() has moved to SDL_compat. */
+#ifdef HAVE_SETENV
+#define SDL_setenv setenv
+#else
+extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value,
+ int overwrite);
+#endif
+
+#ifdef HAVE_QSORT
+#define SDL_qsort qsort
+#else
+extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size,
+ int (*compare) (const void *,
+ const void *));
+#endif
+
+#ifdef HAVE_ABS
+#define SDL_abs abs
+#else
+#define SDL_abs(X) ((X) < 0 ? -(X) : (X))
+#endif
+
+#define SDL_min(x, y) (((x) < (y)) ? (x) : (y))
+#define SDL_max(x, y) (((x) > (y)) ? (x) : (y))
+
+#ifdef HAVE_CTYPE_H
+#define SDL_isdigit(X) isdigit(X)
+#define SDL_isspace(X) isspace(X)
+#define SDL_toupper(X) toupper(X)
+#define SDL_tolower(X) tolower(X)
+#else
+#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9'))
+#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n'))
+#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X))
+#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X))
+#endif
+
+#ifdef HAVE_MEMSET
+#define SDL_memset memset
+#else
+extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len);
+#endif
+#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x)))
+#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x)))
+
+#if defined(__GNUC__) && defined(i386)
+#define SDL_memset4(dst, val, len) \
+do { \
+ int u0, u1, u2; \
+ __asm__ __volatile__ ( \
+ "cld\n\t" \
+ "rep ; stosl\n\t" \
+ : "=&D" (u0), "=&a" (u1), "=&c" (u2) \
+ : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \
+ : "memory" ); \
+} while(0)
+#endif
+#ifndef SDL_memset4
+#define SDL_memset4(dst, val, len) \
+do { \
+ unsigned _count = (len); \
+ unsigned _n = (_count + 3) / 4; \
+ Uint32 *_p = SDL_static_cast(Uint32 *, dst); \
+ Uint32 _val = (val); \
+ if (len == 0) break; \
+ switch (_count % 4) { \
+ case 0: do { *_p++ = _val; \
+ case 3: *_p++ = _val; \
+ case 2: *_p++ = _val; \
+ case 1: *_p++ = _val; \
+ } while ( --_n ); \
+ } \
+} while(0)
+#endif
+
+/* We can count on memcpy existing on Mac OS X and being well-tuned. */
+#if defined(__MACH__) && defined(__APPLE__)
+#define SDL_memcpy(dst, src, len) memcpy(dst, src, len)
+#elif defined(__GNUC__) && defined(i386)
+#define SDL_memcpy(dst, src, len) \
+do { \
+ int u0, u1, u2; \
+ __asm__ __volatile__ ( \
+ "cld\n\t" \
+ "rep ; movsl\n\t" \
+ "testb $2,%b4\n\t" \
+ "je 1f\n\t" \
+ "movsw\n" \
+ "1:\ttestb $1,%b4\n\t" \
+ "je 2f\n\t" \
+ "movsb\n" \
+ "2:" \
+ : "=&c" (u0), "=&D" (u1), "=&S" (u2) \
+ : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \
+ : "memory" ); \
+} while(0)
+#endif
+#ifndef SDL_memcpy
+#ifdef HAVE_MEMCPY
+#define SDL_memcpy memcpy
+#elif defined(HAVE_BCOPY)
+#define SDL_memcpy(d, s, n) bcopy((s), (d), (n))
+#else
+extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src,
+ size_t len);
+#endif
+#endif
+
+/* We can count on memcpy existing on Mac OS X and being well-tuned. */
+#if defined(__MACH__) && defined(__APPLE__)
+#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4)
+#elif defined(__GNUC__) && defined(i386)
+#define SDL_memcpy4(dst, src, len) \
+do { \
+ int ecx, edi, esi; \
+ __asm__ __volatile__ ( \
+ "cld\n\t" \
+ "rep ; movsl" \
+ : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \
+ : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \
+ : "memory" ); \
+} while(0)
+#endif
+#ifndef SDL_memcpy4
+#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2)
+#endif
+
+#if defined(__GNUC__) && defined(i386)
+#define SDL_revcpy(dst, src, len) \
+do { \
+ int u0, u1, u2; \
+ char *dstp = SDL_static_cast(char *, dst); \
+ char *srcp = SDL_static_cast(char *, src); \
+ int n = (len); \
+ if ( n >= 4 ) { \
+ __asm__ __volatile__ ( \
+ "std\n\t" \
+ "rep ; movsl\n\t" \
+ "cld\n\t" \
+ : "=&c" (u0), "=&D" (u1), "=&S" (u2) \
+ : "0" (n >> 2), \
+ "1" (dstp+(n-4)), "2" (srcp+(n-4)) \
+ : "memory" ); \
+ } \
+ switch (n & 3) { \
+ case 3: dstp[2] = srcp[2]; \
+ case 2: dstp[1] = srcp[1]; \
+ case 1: dstp[0] = srcp[0]; \
+ break; \
+ default: \
+ break; \
+ } \
+} while(0)
+#endif
+#ifndef SDL_revcpy
+extern DECLSPEC void *SDLCALL SDL_revcpy(void *dst, const void *src,
+ size_t len);
+#endif
+
+#ifdef HAVE_MEMMOVE
+#define SDL_memmove memmove
+#elif defined(HAVE_BCOPY)
+#define SDL_memmove(d, s, n) bcopy((s), (d), (n))
+#else
+#define SDL_memmove(dst, src, len) \
+do { \
+ if ( dst < src ) { \
+ SDL_memcpy(dst, src, len); \
+ } else { \
+ SDL_revcpy(dst, src, len); \
+ } \
+} while(0)
+#endif
+
+#ifdef HAVE_MEMCMP
+#define SDL_memcmp memcmp
+#else
+extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2,
+ size_t len);
+#endif
+
+#ifdef HAVE_STRLEN
+#define SDL_strlen strlen
+#else
+extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string);
+#endif
+
+#ifdef HAVE_WCSLEN
+#define SDL_wcslen wcslen
+#else
+#if !defined(wchar_t) && defined(__NINTENDODS__)
+#define wchar_t short /* TODO: figure out why libnds doesn't have this */
+#endif
+extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t * string);
+#endif
+
+#ifdef HAVE_STRLCPY
+#define SDL_strlcpy strlcpy
+#else
+extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src,
+ size_t maxlen);
+#endif
+
+#ifdef HAVE_STRLCAT
+#define SDL_strlcat strlcat
+#else
+extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src,
+ size_t maxlen);
+#endif
+
+#ifdef HAVE_STRDUP
+#define SDL_strdup strdup
+#else
+extern DECLSPEC char *SDLCALL SDL_strdup(const char *string);
+#endif
+
+#ifdef HAVE__STRREV
+#define SDL_strrev _strrev
+#else
+extern DECLSPEC char *SDLCALL SDL_strrev(char *string);
+#endif
+
+#ifdef HAVE__STRUPR
+#define SDL_strupr _strupr
+#else
+extern DECLSPEC char *SDLCALL SDL_strupr(char *string);
+#endif
+
+#ifdef HAVE__STRLWR
+#define SDL_strlwr _strlwr
+#else
+extern DECLSPEC char *SDLCALL SDL_strlwr(char *string);
+#endif
+
+#ifdef HAVE_STRCHR
+#define SDL_strchr strchr
+#elif defined(HAVE_INDEX)
+#define SDL_strchr index
+#else
+extern DECLSPEC char *SDLCALL SDL_strchr(const char *string, int c);
+#endif
+
+#ifdef HAVE_STRRCHR
+#define SDL_strrchr strrchr
+#elif defined(HAVE_RINDEX)
+#define SDL_strrchr rindex
+#else
+extern DECLSPEC char *SDLCALL SDL_strrchr(const char *string, int c);
+#endif
+
+#ifdef HAVE_STRSTR
+#define SDL_strstr strstr
+#else
+extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack,
+ const char *needle);
+#endif
+
+#ifdef HAVE_ITOA
+#define SDL_itoa itoa
+#else
+#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix)
+#endif
+
+#ifdef HAVE__LTOA
+#define SDL_ltoa _ltoa
+#else
+extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *string, int radix);
+#endif
+
+#ifdef HAVE__UITOA
+#define SDL_uitoa _uitoa
+#else
+#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix)
+#endif
+
+#ifdef HAVE__ULTOA
+#define SDL_ultoa _ultoa
+#else
+extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *string,
+ int radix);
+#endif
+
+#ifdef HAVE_STRTOL
+#define SDL_strtol strtol
+#else
+extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp,
+ int base);
+#endif
+
+#ifdef HAVE_STRTOUL
+#define SDL_strtoul strtoul
+#else
+extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string,
+ char **endp, int base);
+#endif
+
+#ifdef SDL_HAS_64BIT_TYPE
+
+#ifdef HAVE__I64TOA
+#define SDL_lltoa _i64toa
+#else
+extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *string,
+ int radix);
+#endif
+
+#ifdef HAVE__UI64TOA
+#define SDL_ulltoa _ui64toa
+#else
+extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *string,
+ int radix);
+#endif
+
+#ifdef HAVE_STRTOLL
+#define SDL_strtoll strtoll
+#else
+extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp,
+ int base);
+#endif
+
+#ifdef HAVE_STRTOULL
+#define SDL_strtoull strtoull
+#else
+extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp,
+ int base);
+#endif
+
+#endif /* SDL_HAS_64BIT_TYPE */
+
+#ifdef HAVE_STRTOD
+#define SDL_strtod strtod
+#else
+extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp);
+#endif
+
+#ifdef HAVE_ATOI
+#define SDL_atoi atoi
+#else
+#define SDL_atoi(X) SDL_strtol(X, NULL, 0)
+#endif
+
+#ifdef HAVE_ATOF
+#define SDL_atof atof
+#else
+#define SDL_atof(X) SDL_strtod(X, NULL)
+#endif
+
+#ifdef HAVE_STRCMP
+#define SDL_strcmp strcmp
+#else
+extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2);
+#endif
+
+#ifdef HAVE_STRNCMP
+#define SDL_strncmp strncmp
+#else
+extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2,
+ size_t maxlen);
+#endif
+
+#ifdef HAVE_STRCASECMP
+#define SDL_strcasecmp strcasecmp
+#elif defined(HAVE__STRICMP)
+#define SDL_strcasecmp _stricmp
+#else
+extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1,
+ const char *str2);
+#endif
+
+#ifdef HAVE_STRNCASECMP
+#define SDL_strncasecmp strncasecmp
+#elif defined(HAVE__STRNICMP)
+#define SDL_strncasecmp _strnicmp
+#else
+extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1,
+ const char *str2, size_t maxlen);
+#endif
+
+#ifdef HAVE_SSCANF
+#define SDL_sscanf sscanf
+#else
+extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt,
+ ...);
+#endif
+
+#ifdef HAVE_SNPRINTF
+#define SDL_snprintf snprintf
+#else
+extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen,
+ const char *fmt, ...);
+#endif
+
+#ifdef HAVE_VSNPRINTF
+#define SDL_vsnprintf vsnprintf
+#else
+extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen,
+ const char *fmt, va_list ap);
+#endif
+
+#ifndef HAVE_M_PI
+#define M_PI 3.14159265358979323846264338327950288 /* pi */
+#endif
+
+#ifdef HAVE_CEIL
+#define SDL_ceil ceil
+#else
+#define SDL_ceil(x) ((double)(int)((x)+0.5))
+#endif
+
+#ifdef HAVE_COPYSIGN
+#define SDL_copysign copysign
+#else
+extern DECLSPEC double SDLCALL SDL_copysign(double x, double y);
+#endif
+
+#ifdef HAVE_COS
+#define SDL_cos cos
+#else
+extern DECLSPEC double SDLCALL SDL_cos(double x);
+#endif
+
+#ifdef HAVE_COSF
+#define SDL_cosf cosf
+#else
+#define SDL_cosf(x) (float)SDL_cos((double)x)
+#endif
+
+#ifdef HAVE_FABS
+#define SDL_fabs fabs
+#else
+extern DECLSPEC double SDLCALL SDL_fabs(double x);
+#endif
+
+#ifdef HAVE_FLOOR
+#define SDL_floor floor
+#else
+extern DECLSPEC double SDLCALL SDL_floor(double x);
+#endif
+
+#ifdef HAVE_LOG
+#define SDL_log log
+#else
+extern DECLSPEC double SDLCALL SDL_log(double x);
+#endif
+
+#ifdef HAVE_POW
+#define SDL_pow pow
+#else
+extern DECLSPEC double SDLCALL SDL_pow(double x, double y);
+#endif
+
+#ifdef HAVE_SCALBN
+#define SDL_scalbn scalbn
+#else
+extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n);
+#endif
+
+#ifdef HAVE_SIN
+#define SDL_sin sin
+#else
+extern DECLSPEC double SDLCALL SDL_sin(double x);
+#endif
+
+#ifdef HAVE_SINF
+#define SDL_sinf sinf
+#else
+#define SDL_sinf(x) (float)SDL_sin((double)x)
+#endif
+
+#ifdef HAVE_SQRT
+#define SDL_sqrt sqrt
+#else
+extern DECLSPEC double SDLCALL SDL_sqrt(double x);
+#endif
+
+/* The SDL implementation of iconv() returns these error codes */
+#define SDL_ICONV_ERROR (size_t)-1
+#define SDL_ICONV_E2BIG (size_t)-2
+#define SDL_ICONV_EILSEQ (size_t)-3
+#define SDL_ICONV_EINVAL (size_t)-4
+
+#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
+#define SDL_iconv_t iconv_t
+#define SDL_iconv_open iconv_open
+#define SDL_iconv_close iconv_close
+#else
+typedef struct _SDL_iconv_t *SDL_iconv_t;
+extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode,
+ const char *fromcode);
+extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
+#endif
+extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,
+ size_t * inbytesleft, char **outbuf,
+ size_t * outbytesleft);
+/**
+ * This function converts a string between encodings in one pass, returning a
+ * string that must be freed with SDL_free() or NULL on error.
+ */
+extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,
+ const char *fromcode,
+ const char *inbuf,
+ size_t inbytesleft);
+#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
+#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1)
+#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1)
+
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+/* *INDENT-OFF* */
+}
+/* *INDENT-ON* */
+#endif
+#include "close_code.h"
+
+#endif /* _SDL_stdinc_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/include/begin_code.h b/macosx/plugins/DFInput/SDL/include/begin_code.h
new file mode 100644
index 0000000..395dc7c
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/begin_code.h
@@ -0,0 +1,136 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file begin_code.h
+ *
+ * This file sets things up for C dynamic library function definitions,
+ * static inlined functions, and structures aligned at 4-byte alignment.
+ * If you don't like ugly C preprocessor code, don't look at this file. :)
+ */
+
+/* This shouldn't be nested -- included it around code only. */
+#ifdef _begin_code_h
+#error Nested inclusion of begin_code.h
+#endif
+#define _begin_code_h
+
+/* Some compilers use a special export keyword */
+#ifndef DECLSPEC
+# if defined(__BEOS__) || defined(__HAIKU__)
+# if defined(__GNUC__)
+# define DECLSPEC __declspec(dllexport)
+# else
+# define DECLSPEC __declspec(export)
+# endif
+# elif defined(__WIN32__)
+# ifdef __BORLANDC__
+# ifdef BUILD_SDL
+# define DECLSPEC
+# else
+# define DECLSPEC __declspec(dllimport)
+# endif
+# else
+# define DECLSPEC __declspec(dllexport)
+# endif
+# else
+# if defined(__GNUC__) && __GNUC__ >= 4
+# define DECLSPEC __attribute__ ((visibility("default")))
+# else
+# define DECLSPEC
+# endif
+# endif
+#endif
+
+/* By default SDL uses the C calling convention */
+#ifndef SDLCALL
+#if defined(__WIN32__) && !defined(__GNUC__)
+#define SDLCALL __cdecl
+#else
+#define SDLCALL
+#endif
+#endif /* SDLCALL */
+
+/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */
+#ifdef __SYMBIAN32__
+#undef DECLSPEC
+#define DECLSPEC
+#endif /* __SYMBIAN32__ */
+
+/* Force structure packing at 4 byte alignment.
+ This is necessary if the header is included in code which has structure
+ packing set to an alternate value, say for loading structures from disk.
+ The packing is reset to the previous value in close_code.h
+ */
+#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
+#ifdef _MSC_VER
+#pragma warning(disable: 4103)
+#endif
+#ifdef __BORLANDC__
+#pragma nopackwarning
+#endif
+#pragma pack(push,4)
+#endif /* Compiler needs structure packing set */
+
+/* Set up compiler-specific options for inlining functions */
+#ifndef SDL_INLINE_OKAY
+#ifdef __GNUC__
+#define SDL_INLINE_OKAY
+#else
+/* Add any special compiler-specific cases here */
+#if defined(_MSC_VER) || defined(__BORLANDC__) || \
+ defined(__DMC__) || defined(__SC__) || \
+ defined(__WATCOMC__) || defined(__LCC__) || \
+ defined(__DECC)
+#ifndef __inline__
+#define __inline__ __inline
+#endif
+#define SDL_INLINE_OKAY
+#else
+#if !defined(__MRC__) && !defined(_SGI_SOURCE)
+#ifndef __inline__
+#define __inline__ inline
+#endif
+#define SDL_INLINE_OKAY
+#endif /* Not a funky compiler */
+#endif /* Visual C++ */
+#endif /* GNU C */
+#endif /* SDL_INLINE_OKAY */
+
+/* If inlining isn't supported, remove "__inline__", turning static
+ inlined functions into static functions (resulting in code bloat
+ in all files which include the offending header files)
+*/
+#ifndef SDL_INLINE_OKAY
+#define __inline__
+#endif
+
+/* Apparently this is needed by several Windows compilers */
+#if !defined(__MACH__)
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *)0)
+#endif
+#endif /* NULL */
+#endif /* ! Mac OS X - breaks precompiled headers */
diff --git a/macosx/plugins/DFInput/SDL/include/close_code.h b/macosx/plugins/DFInput/SDL/include/close_code.h
new file mode 100644
index 0000000..4b4e8a4
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/include/close_code.h
@@ -0,0 +1,38 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+/**
+ * \file close_code.h
+ *
+ * This file reverses the effects of begin_code.h and should be included
+ * after you finish any function and structure declarations in your headers
+ */
+
+#undef _begin_code_h
+
+/* Reset structure packing at previous byte alignment */
+#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__WATCOMC__) || defined(__BORLANDC__)
+#ifdef __BORLANDC__
+#pragma nopackwarning
+#endif
+#pragma pack(pop)
+#endif /* Compiler needs structure packing set */
diff --git a/macosx/plugins/DFInput/SDL/src/SDL.c b/macosx/plugins/DFInput/SDL/src/SDL.c
new file mode 100644
index 0000000..8f8e676
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/SDL.c
@@ -0,0 +1,101 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+// 7/31/2010 Wei Mingzhi
+// Removed everything unrated to Mac OS X Joystick support
+
+#include "SDL_config.h"
+
+/* Initialization code for SDL */
+
+#include "SDL.h"
+#include "haptic/SDL_haptic_c.h"
+#include "joystick/SDL_joystick_c.h"
+
+/* The initialized subsystems */
+static Uint32 SDL_initialized = 0;
+
+int
+SDL_InitSubSystem(Uint32 flags)
+{
+ /* Initialize the joystick subsystem */
+ if ((flags & SDL_INIT_JOYSTICK) && !(SDL_initialized & SDL_INIT_JOYSTICK)) {
+ if (SDL_JoystickInit() < 0) {
+ return (-1);
+ }
+ SDL_initialized |= SDL_INIT_JOYSTICK;
+ }
+
+ /* Initialize the haptic subsystem */
+ if ((flags & SDL_INIT_HAPTIC) && !(SDL_initialized & SDL_INIT_HAPTIC)) {
+ if (SDL_HapticInit() < 0) {
+ return (-1);
+ }
+ SDL_initialized |= SDL_INIT_HAPTIC;
+ }
+
+ return (0);
+}
+
+int
+SDL_Init(Uint32 flags)
+{
+ /* Clear the error message */
+ SDL_ClearError();
+
+ /* Initialize the desired subsystems */
+ if (SDL_InitSubSystem(flags) < 0) {
+ return (-1);
+ }
+
+ return (0);
+}
+
+void
+SDL_QuitSubSystem(Uint32 flags)
+{
+ /* Shut down requested initialized subsystems */
+ if ((flags & SDL_initialized & SDL_INIT_JOYSTICK)) {
+ SDL_JoystickQuit();
+ SDL_initialized &= ~SDL_INIT_JOYSTICK;
+ }
+
+ if ((flags & SDL_initialized & SDL_INIT_HAPTIC)) {
+ SDL_HapticQuit();
+ SDL_initialized &= ~SDL_INIT_HAPTIC;
+ }
+}
+
+Uint32
+SDL_WasInit(Uint32 flags)
+{
+ if (!flags) {
+ flags = SDL_INIT_EVERYTHING;
+ }
+ return (SDL_initialized & flags);
+}
+
+void
+SDL_Quit(void)
+{
+ /* Quit all subsystems */
+ SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
+}
diff --git a/macosx/plugins/DFInput/SDL/src/SDL_error.c b/macosx/plugins/DFInput/SDL/src/SDL_error.c
new file mode 100644
index 0000000..55d183a
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/SDL_error.c
@@ -0,0 +1,259 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* Simple error handling in SDL */
+
+#include "SDL_error.h"
+#include "SDL_error_c.h"
+
+/* Routine to get the thread-specific error variable */
+#if SDL_THREADS_DISABLED
+/* !!! FIXME: what does this comment mean? Victim of Search and Replace? */
+/* The SDL_arraysize(The ),default (non-thread-safe) global error variable */
+static SDL_error SDL_global_error;
+#define SDL_GetErrBuf() (&SDL_global_error)
+#else
+extern SDL_error *SDL_GetErrBuf(void);
+#endif /* SDL_THREADS_DISABLED */
+
+#define SDL_ERRBUFIZE 1024
+
+/* Private functions */
+
+static const char *
+SDL_LookupString(const char *key)
+{
+ /* FIXME: Add code to lookup key in language string hash-table */
+ return key;
+}
+
+/* Public functions */
+
+void
+SDL_SetError(const char *fmt, ...)
+{
+ va_list ap;
+ SDL_error *error;
+
+ /* Copy in the key, mark error as valid */
+ error = SDL_GetErrBuf();
+ error->error = 1;
+ SDL_strlcpy((char *) error->key, fmt, sizeof(error->key));
+
+ va_start(ap, fmt);
+ error->argc = 0;
+ while (*fmt) {
+ if (*fmt++ == '%') {
+ while (*fmt == '.' || (*fmt >= '0' && *fmt <= '9')) {
+ ++fmt;
+ }
+ switch (*fmt++) {
+ case 0: /* Malformed format string.. */
+ --fmt;
+ break;
+ case 'c':
+ case 'i':
+ case 'd':
+ case 'u':
+ case 'o':
+ case 'x':
+ case 'X':
+ error->args[error->argc++].value_i = va_arg(ap, int);
+ break;
+ case 'f':
+ error->args[error->argc++].value_f = va_arg(ap, double);
+ break;
+ case 'p':
+ error->args[error->argc++].value_ptr = va_arg(ap, void *);
+ break;
+ case 's':
+ {
+ int i = error->argc;
+ const char *str = va_arg(ap, const char *);
+ if (str == NULL)
+ str = "(null)";
+ SDL_strlcpy((char *) error->args[i].buf, str,
+ ERR_MAX_STRLEN);
+ error->argc++;
+ }
+ break;
+ default:
+ break;
+ }
+ if (error->argc >= ERR_MAX_ARGS) {
+ break;
+ }
+ }
+ }
+ va_end(ap);
+
+ /* If we are in debug mode, print out an error message */
+#ifdef DEBUG_ERROR
+ fprintf(stderr, "SDL_SetError: %s\n", SDL_GetError());
+#endif
+}
+
+/* This function has a bit more overhead than most error functions
+ so that it supports internationalization and thread-safe errors.
+*/
+static char *
+SDL_GetErrorMsg(char *errstr, unsigned int maxlen)
+{
+ SDL_error *error;
+
+ /* Clear the error string */
+ *errstr = '\0';
+ --maxlen;
+
+ /* Get the thread-safe error, and print it out */
+ error = SDL_GetErrBuf();
+ if (error->error) {
+ const char *fmt;
+ char *msg = errstr;
+ int len;
+ int argi;
+
+ fmt = SDL_LookupString(error->key);
+ argi = 0;
+ while (*fmt && (maxlen > 0)) {
+ if (*fmt == '%') {
+ char tmp[32], *spot = tmp;
+ *spot++ = *fmt++;
+ while ((*fmt == '.' || (*fmt >= '0' && *fmt <= '9'))
+ && spot < (tmp + SDL_arraysize(tmp) - 2)) {
+ *spot++ = *fmt++;
+ }
+ *spot++ = *fmt++;
+ *spot++ = '\0';
+ switch (spot[-2]) {
+ case '%':
+ *msg++ = '%';
+ maxlen -= 1;
+ break;
+ case 'c':
+ case 'i':
+ case 'd':
+ case 'u':
+ case 'o':
+ case 'x':
+ case 'X':
+ len =
+ SDL_snprintf(msg, maxlen, tmp,
+ error->args[argi++].value_i);
+ msg += len;
+ maxlen -= len;
+ break;
+ case 'f':
+ len =
+ SDL_snprintf(msg, maxlen, tmp,
+ error->args[argi++].value_f);
+ msg += len;
+ maxlen -= len;
+ break;
+ case 'p':
+ len =
+ SDL_snprintf(msg, maxlen, tmp,
+ error->args[argi++].value_ptr);
+ msg += len;
+ maxlen -= len;
+ break;
+ case 's':
+ len =
+ SDL_snprintf(msg, maxlen, tmp,
+ SDL_LookupString(error->args[argi++].
+ buf));
+ msg += len;
+ maxlen -= len;
+ break;
+ }
+ } else {
+ *msg++ = *fmt++;
+ maxlen -= 1;
+ }
+ }
+ *msg = 0; /* NULL terminate the string */
+ }
+ return (errstr);
+}
+
+/* Available for backwards compatibility */
+char *
+SDL_GetError(void)
+{
+ static char errmsg[SDL_ERRBUFIZE];
+
+ return ((char *) SDL_GetErrorMsg(errmsg, SDL_ERRBUFIZE));
+}
+
+void
+SDL_ClearError(void)
+{
+ SDL_error *error;
+
+ error = SDL_GetErrBuf();
+ error->error = 0;
+}
+
+/* Very common errors go here */
+void
+SDL_Error(SDL_errorcode code)
+{
+ switch (code) {
+ case SDL_ENOMEM:
+ SDL_SetError("Out of memory");
+ break;
+ case SDL_EFREAD:
+ SDL_SetError("Error reading from datastream");
+ break;
+ case SDL_EFWRITE:
+ SDL_SetError("Error writing to datastream");
+ break;
+ case SDL_EFSEEK:
+ SDL_SetError("Error seeking in datastream");
+ break;
+ case SDL_UNSUPPORTED:
+ SDL_SetError("That operation is not supported");
+ break;
+ default:
+ SDL_SetError("Unknown SDL error");
+ break;
+ }
+}
+
+#ifdef TEST_ERROR
+int
+main(int argc, char *argv[])
+{
+ char buffer[BUFSIZ + 1];
+
+ SDL_SetError("Hi there!");
+ printf("Error 1: %s\n", SDL_GetError());
+ SDL_ClearError();
+ SDL_memset(buffer, '1', BUFSIZ);
+ buffer[BUFSIZ] = 0;
+ SDL_SetError("This is the error: %s (%f)", buffer, 1.0);
+ printf("Error 2: %s\n", SDL_GetError());
+ exit(0);
+}
+#endif
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/SDL_error_c.h b/macosx/plugins/DFInput/SDL/src/SDL_error_c.h
new file mode 100644
index 0000000..54501f5
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/SDL_error_c.h
@@ -0,0 +1,62 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* This file defines a structure that carries language-independent
+ error messages
+*/
+
+#ifndef _SDL_error_c_h
+#define _SDL_error_c_h
+
+#define ERR_MAX_STRLEN 128
+#define ERR_MAX_ARGS 5
+
+typedef struct SDL_error
+{
+ /* This is a numeric value corresponding to the current error */
+ int error;
+
+ /* This is a key used to index into a language hashtable containing
+ internationalized versions of the SDL error messages. If the key
+ is not in the hashtable, or no hashtable is available, the key is
+ used directly as an error message format string.
+ */
+ char key[ERR_MAX_STRLEN];
+
+ /* These are the arguments for the error functions */
+ int argc;
+ union
+ {
+ void *value_ptr;
+#if 0 /* What is a character anyway? (UNICODE issues) */
+ unsigned char value_c;
+#endif
+ int value_i;
+ double value_f;
+ char buf[ERR_MAX_STRLEN];
+ } args[ERR_MAX_ARGS];
+} SDL_error;
+
+#endif /* _SDL_error_c_h */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic.c b/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic.c
new file mode 100644
index 0000000..af8c39a
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic.c
@@ -0,0 +1,708 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 2008 Edgar Simo
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL_syshaptic.h"
+#include "SDL_haptic_c.h"
+#include "../joystick/SDL_joystick_c.h" /* For SDL_PrivateJoystickValid */
+
+
+Uint8 SDL_numhaptics = 0;
+SDL_Haptic **SDL_haptics = NULL;
+
+
+/*
+ * Initializes the Haptic devices.
+ */
+int
+SDL_HapticInit(void)
+{
+ int arraylen;
+ int status;
+
+ SDL_numhaptics = 0;
+ status = SDL_SYS_HapticInit();
+ if (status >= 0) {
+ arraylen = (status + 1) * sizeof(*SDL_haptics);
+ SDL_haptics = (SDL_Haptic **) SDL_malloc(arraylen);
+ if (SDL_haptics == NULL) { /* Out of memory. */
+ SDL_numhaptics = 0;
+ } else {
+ SDL_memset(SDL_haptics, 0, arraylen);
+ SDL_numhaptics = status;
+ }
+ status = 0;
+ }
+
+ return status;
+}
+
+
+/*
+ * Checks to see if the haptic device is valid
+ */
+static int
+ValidHaptic(SDL_Haptic * haptic)
+{
+ int i;
+ int valid;
+
+ valid = 0;
+ if (haptic != NULL) {
+ for (i = 0; i < SDL_numhaptics; i++) {
+ if (SDL_haptics[i] == haptic) {
+ valid = 1;
+ break;
+ }
+ }
+ }
+
+ /* Create the error here. */
+ if (valid == 0) {
+ SDL_SetError("Haptic: Invalid haptic device identifier");
+ }
+
+ return valid;
+}
+
+
+/*
+ * Returns the number of available devices.
+ */
+int
+SDL_NumHaptics(void)
+{
+ return SDL_numhaptics;
+}
+
+
+/*
+ * Gets the name of a Haptic device by index.
+ */
+const char *
+SDL_HapticName(int device_index)
+{
+ if ((device_index < 0) || (device_index >= SDL_numhaptics)) {
+ SDL_SetError("Haptic: There are %d haptic devices available",
+ SDL_numhaptics);
+ return NULL;
+ }
+ return SDL_SYS_HapticName(device_index);
+}
+
+
+/*
+ * Opens a Haptic device.
+ */
+SDL_Haptic *
+SDL_HapticOpen(int device_index)
+{
+ int i;
+ SDL_Haptic *haptic;
+
+ if ((device_index < 0) || (device_index >= SDL_numhaptics)) {
+ SDL_SetError("Haptic: There are %d haptic devices available",
+ SDL_numhaptics);
+ return NULL;
+ }
+
+ /* If the haptic is already open, return it */
+ for (i = 0; SDL_haptics[i]; i++) {
+ if (device_index == SDL_haptics[i]->index) {
+ haptic = SDL_haptics[i];
+ ++haptic->ref_count;
+ return haptic;
+ }
+ }
+
+ /* Create the haptic device */
+ haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));
+ if (haptic == NULL) {
+ SDL_OutOfMemory();
+ return NULL;
+ }
+
+ /* Initialize the haptic device */
+ SDL_memset(haptic, 0, (sizeof *haptic));
+ haptic->index = device_index;
+ if (SDL_SYS_HapticOpen(haptic) < 0) {
+ SDL_free(haptic);
+ return NULL;
+ }
+
+ /* Disable autocenter and set gain to max. */
+ if (haptic->supported & SDL_HAPTIC_GAIN)
+ SDL_HapticSetGain(haptic, 100);
+ if (haptic->supported & SDL_HAPTIC_AUTOCENTER)
+ SDL_HapticSetAutocenter(haptic, 0);
+
+ /* Add haptic to list */
+ ++haptic->ref_count;
+ for (i = 0; SDL_haptics[i]; i++)
+ /* Skip to next haptic */ ;
+ SDL_haptics[i] = haptic;
+
+ return haptic;
+}
+
+
+/*
+ * Returns 1 if the device has been opened.
+ */
+int
+SDL_HapticOpened(int device_index)
+{
+ int i, opened;
+
+ opened = 0;
+ for (i = 0; SDL_haptics[i]; i++) {
+ if (SDL_haptics[i]->index == (Uint8) device_index) {
+ opened = 1;
+ break;
+ }
+ }
+ return opened;
+}
+
+
+/*
+ * Returns the index to a haptic device.
+ */
+int
+SDL_HapticIndex(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return haptic->index;
+}
+
+
+/*
+ * Returns SDL_TRUE if mouse is haptic, SDL_FALSE if it isn't.
+ */
+int
+SDL_MouseIsHaptic(void)
+{
+ if (SDL_SYS_HapticMouse() < 0)
+ return SDL_FALSE;
+ return SDL_TRUE;
+}
+
+
+/*
+ * Returns the haptic device if mouse is haptic or NULL elsewise.
+ */
+SDL_Haptic *
+SDL_HapticOpenFromMouse(void)
+{
+ int device_index;
+
+ device_index = SDL_SYS_HapticMouse();
+
+ if (device_index < 0) {
+ SDL_SetError("Haptic: Mouse isn't a haptic device.");
+ return NULL;
+ }
+
+ return SDL_HapticOpen(device_index);
+}
+
+
+/*
+ * Returns SDL_TRUE if joystick has haptic features.
+ */
+int
+SDL_JoystickIsHaptic(SDL_Joystick * joystick)
+{
+ int ret;
+
+ /* Must be a valid joystick */
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return -1;
+ }
+
+ ret = SDL_SYS_JoystickIsHaptic(joystick);
+
+ if (ret > 0)
+ return SDL_TRUE;
+ else if (ret == 0)
+ return SDL_FALSE;
+ else
+ return -1;
+}
+
+
+/*
+ * Opens a haptic device from a joystick.
+ */
+SDL_Haptic *
+SDL_HapticOpenFromJoystick(SDL_Joystick * joystick)
+{
+ int i;
+ SDL_Haptic *haptic;
+
+ /* Must be a valid joystick */
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ SDL_SetError("Haptic: Joystick isn't valid.");
+ return NULL;
+ }
+
+ /* Joystick must be haptic */
+ if (SDL_SYS_JoystickIsHaptic(joystick) <= 0) {
+ SDL_SetError("Haptic: Joystick isn't a haptic device.");
+ return NULL;
+ }
+
+ /* Check to see if joystick's haptic is already open */
+ for (i = 0; SDL_haptics[i]; i++) {
+ if (SDL_SYS_JoystickSameHaptic(SDL_haptics[i], joystick)) {
+ haptic = SDL_haptics[i];
+ ++haptic->ref_count;
+ return haptic;
+ }
+ }
+
+ /* Create the haptic device */
+ haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));
+ if (haptic == NULL) {
+ SDL_OutOfMemory();
+ return NULL;
+ }
+
+ /* Initialize the haptic device */
+ SDL_memset(haptic, 0, sizeof(SDL_Haptic));
+ if (SDL_SYS_HapticOpenFromJoystick(haptic, joystick) < 0) {
+ SDL_free(haptic);
+ return NULL;
+ }
+
+ /* Add haptic to list */
+ ++haptic->ref_count;
+ for (i = 0; SDL_haptics[i]; i++)
+ /* Skip to next haptic */ ;
+ SDL_haptics[i] = haptic;
+
+ return haptic;
+}
+
+
+/*
+ * Closes a SDL_Haptic device.
+ */
+void
+SDL_HapticClose(SDL_Haptic * haptic)
+{
+ int i;
+
+ /* Must be valid */
+ if (!ValidHaptic(haptic)) {
+ return;
+ }
+
+ /* Check if it's still in use */
+ if (--haptic->ref_count < 0) {
+ return;
+ }
+
+ /* Close it, properly removing effects if needed */
+ for (i = 0; i < haptic->neffects; i++) {
+ if (haptic->effects[i].hweffect != NULL) {
+ SDL_HapticDestroyEffect(haptic, i);
+ }
+ }
+ SDL_SYS_HapticClose(haptic);
+
+ /* Remove from the list */
+ for (i = 0; SDL_haptics[i]; ++i) {
+ if (haptic == SDL_haptics[i]) {
+ SDL_haptics[i] = NULL;
+ SDL_memcpy(&SDL_haptics[i], &SDL_haptics[i + 1],
+ (SDL_numhaptics - i) * sizeof(haptic));
+ break;
+ }
+ }
+
+ /* Free */
+ SDL_free(haptic);
+}
+
+/*
+ * Cleans up after the subsystem.
+ */
+void
+SDL_HapticQuit(void)
+{
+ SDL_SYS_HapticQuit();
+ if (SDL_haptics != NULL) {
+ SDL_free(SDL_haptics);
+ SDL_haptics = NULL;
+ }
+ SDL_numhaptics = 0;
+}
+
+/*
+ * Returns the number of effects a haptic device has.
+ */
+int
+SDL_HapticNumEffects(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return haptic->neffects;
+}
+
+
+/*
+ * Returns the number of effects a haptic device can play.
+ */
+int
+SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return haptic->nplaying;
+}
+
+
+/*
+ * Returns supported effects by the device.
+ */
+unsigned int
+SDL_HapticQuery(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return haptic->supported;
+}
+
+
+/*
+ * Returns the number of axis on the device.
+ */
+int
+SDL_HapticNumAxes(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return haptic->naxes;
+}
+
+/*
+ * Checks to see if the device can support the effect.
+ */
+int
+SDL_HapticEffectSupported(SDL_Haptic * haptic, SDL_HapticEffect * effect)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ if ((haptic->supported & effect->type) != 0)
+ return SDL_TRUE;
+ return SDL_FALSE;
+}
+
+/*
+ * Creates a new haptic effect.
+ */
+int
+SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect)
+{
+ int i;
+
+ /* Check for device validity. */
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ /* Check to see if effect is supported */
+ if (SDL_HapticEffectSupported(haptic, effect) == SDL_FALSE) {
+ SDL_SetError("Haptic: Effect not supported by haptic device.");
+ return -1;
+ }
+
+ /* See if there's a free slot */
+ for (i = 0; i < haptic->neffects; i++) {
+ if (haptic->effects[i].hweffect == NULL) {
+
+ /* Now let the backend create the real effect */
+ if (SDL_SYS_HapticNewEffect(haptic, &haptic->effects[i], effect)
+ != 0) {
+ return -1; /* Backend failed to create effect */
+ }
+
+ SDL_memcpy(&haptic->effects[i].effect, effect,
+ sizeof(SDL_HapticEffect));
+ return i;
+ }
+ }
+
+ SDL_SetError("Haptic: Device has no free space left.");
+ return -1;
+}
+
+/*
+ * Checks to see if an effect is valid.
+ */
+static int
+ValidEffect(SDL_Haptic * haptic, int effect)
+{
+ if ((effect < 0) || (effect >= haptic->neffects)) {
+ SDL_SetError("Haptic: Invalid effect identifier.");
+ return 0;
+ }
+ return 1;
+}
+
+/*
+ * Updates an effect.
+ */
+int
+SDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect,
+ SDL_HapticEffect * data)
+{
+ if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
+ return -1;
+ }
+
+ /* Can't change type dynamically. */
+ if (data->type != haptic->effects[effect].effect.type) {
+ SDL_SetError("Haptic: Updating effect type is illegal.");
+ return -1;
+ }
+
+ /* Updates the effect */
+ if (SDL_SYS_HapticUpdateEffect(haptic, &haptic->effects[effect], data) <
+ 0) {
+ return -1;
+ }
+
+ SDL_memcpy(&haptic->effects[effect].effect, data,
+ sizeof(SDL_HapticEffect));
+ return 0;
+}
+
+
+/*
+ * Runs the haptic effect on the device.
+ */
+int
+SDL_HapticRunEffect(SDL_Haptic * haptic, int effect, Uint32 iterations)
+{
+ if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
+ return -1;
+ }
+
+ /* Run the effect */
+ if (SDL_SYS_HapticRunEffect(haptic, &haptic->effects[effect], iterations)
+ < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Stops the haptic effect on the device.
+ */
+int
+SDL_HapticStopEffect(SDL_Haptic * haptic, int effect)
+{
+ if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
+ return -1;
+ }
+
+ /* Stop the effect */
+ if (SDL_SYS_HapticStopEffect(haptic, &haptic->effects[effect]) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Gets rid of a haptic effect.
+ */
+void
+SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)
+{
+ if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
+ return;
+ }
+
+ /* Not allocated */
+ if (haptic->effects[effect].hweffect == NULL) {
+ return;
+ }
+
+ SDL_SYS_HapticDestroyEffect(haptic, &haptic->effects[effect]);
+}
+
+/*
+ * Gets the status of a haptic effect.
+ */
+int
+SDL_HapticGetEffectStatus(SDL_Haptic * haptic, int effect)
+{
+ if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
+ return -1;
+ }
+
+ if ((haptic->supported & SDL_HAPTIC_STATUS) == 0) {
+ SDL_SetError("Haptic: Device does not support status queries.");
+ return -1;
+ }
+
+ return SDL_SYS_HapticGetEffectStatus(haptic, &haptic->effects[effect]);
+}
+
+/*
+ * Sets the global gain of the device.
+ */
+int
+SDL_HapticSetGain(SDL_Haptic * haptic, int gain)
+{
+ const char *env;
+ int real_gain, max_gain;
+
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ if ((haptic->supported & SDL_HAPTIC_GAIN) == 0) {
+ SDL_SetError("Haptic: Device does not support setting gain.");
+ return -1;
+ }
+
+ if ((gain < 0) || (gain > 100)) {
+ SDL_SetError("Haptic: Gain must be between 0 and 100.");
+ return -1;
+ }
+
+ /* We use the envvar to get the maximum gain. */
+ env = SDL_getenv("SDL_HAPTIC_GAIN_MAX");
+ if (env != NULL) {
+ max_gain = SDL_atoi(env);
+
+ /* Check for sanity. */
+ if (max_gain < 0)
+ max_gain = 0;
+ else if (max_gain > 100)
+ max_gain = 100;
+
+ /* We'll scale it linearly with SDL_HAPTIC_GAIN_MAX */
+ real_gain = (gain * max_gain) / 100;
+ } else {
+ real_gain = gain;
+ }
+
+ if (SDL_SYS_HapticSetGain(haptic, real_gain) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Makes the device autocenter, 0 disables.
+ */
+int
+SDL_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ if ((haptic->supported & SDL_HAPTIC_AUTOCENTER) == 0) {
+ SDL_SetError("Haptic: Device does not support setting autocenter.");
+ return -1;
+ }
+
+ if ((autocenter < 0) || (autocenter > 100)) {
+ SDL_SetError("Haptic: Autocenter must be between 0 and 100.");
+ return -1;
+ }
+
+ if (SDL_SYS_HapticSetAutocenter(haptic, autocenter) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+ * Pauses the haptic device.
+ */
+int
+SDL_HapticPause(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ if ((haptic->supported & SDL_HAPTIC_PAUSE) == 0) {
+ SDL_SetError("Haptic: Device does not support setting pausing.");
+ return -1;
+ }
+
+ return SDL_SYS_HapticPause(haptic);
+}
+
+/*
+ * Unpauses the haptic device.
+ */
+int
+SDL_HapticUnpause(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ if ((haptic->supported & SDL_HAPTIC_PAUSE) == 0) {
+ return 0; /* Not going to be paused, so we pretend it's unpaused. */
+ }
+
+ return SDL_SYS_HapticUnpause(haptic);
+}
+
+/*
+ * Stops all the currently playing effects.
+ */
+int
+SDL_HapticStopAll(SDL_Haptic * haptic)
+{
+ if (!ValidHaptic(haptic)) {
+ return -1;
+ }
+
+ return SDL_SYS_HapticStopAll(haptic);
+}
diff --git a/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic_c.h b/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic_c.h
new file mode 100644
index 0000000..4144a0f
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/haptic/SDL_haptic_c.h
@@ -0,0 +1,26 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+extern int SDL_HapticInit(void);
+extern void SDL_HapticQuit(void);
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/haptic/SDL_syshaptic.h b/macosx/plugins/DFInput/SDL/src/haptic/SDL_syshaptic.h
new file mode 100644
index 0000000..9542a0d
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/haptic/SDL_syshaptic.h
@@ -0,0 +1,201 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 2008 Edgar Simo
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+
+#include "SDL_config.h"
+
+#include "SDL_haptic.h"
+
+
+/*
+ * Number of haptic devices on the system.
+ */
+extern Uint8 SDL_numhaptics;
+
+
+struct haptic_effect
+{
+ SDL_HapticEffect effect; /* The current event */
+ struct haptic_hweffect *hweffect; /* The hardware behind the event */
+};
+
+/*
+ * The real SDL_Haptic struct.
+ */
+struct _SDL_Haptic
+{
+ Uint8 index; /* Stores index it is attached to */
+
+ struct haptic_effect *effects; /* Allocated effects */
+ int neffects; /* Maximum amount of effects */
+ int nplaying; /* Maximum amount of effects to play at the same time */
+ unsigned int supported; /* Supported effects */
+ int naxes; /* Number of axes on the device. */
+
+ struct haptic_hwdata *hwdata; /* Driver dependent */
+ int ref_count; /* Count for multiple opens */
+};
+
+/*
+ * Scans the system for haptic devices.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticInit(void);
+
+/*
+ * Gets the device dependent name of the haptic device
+ */
+extern const char *SDL_SYS_HapticName(int index);
+
+/*
+ * Opens the haptic device for usage. The haptic device should have
+ * the index value set previously.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticOpen(SDL_Haptic * haptic);
+
+/*
+ * Returns the index of the haptic core pointer or -1 if none is found.
+ */
+int SDL_SYS_HapticMouse(void);
+
+/*
+ * Checks to see if the joystick has haptic capabilities.
+ *
+ * Returns >0 if haptic capabilities are detected, 0 if haptic
+ * capabilities aren't detected and -1 on error.
+ */
+extern int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick);
+
+/*
+ * Opens the haptic device for usage using the same device as
+ * the joystick.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic,
+ SDL_Joystick * joystick);
+/*
+ * Checks to see if haptic device and joystick device are the same.
+ *
+ * Returns 1 if they are the same, 0 if they aren't.
+ */
+extern int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic,
+ SDL_Joystick * joystick);
+
+/*
+ * Closes a haptic device after usage.
+ */
+extern void SDL_SYS_HapticClose(SDL_Haptic * haptic);
+
+/*
+ * Performs a cleanup on the haptic subsystem.
+ */
+extern void SDL_SYS_HapticQuit(void);
+
+/*
+ * Creates a new haptic effect on the haptic device using base
+ * as a template for the effect.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect,
+ SDL_HapticEffect * base);
+
+/*
+ * Updates the haptic effect on the haptic device using data
+ * as a template.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect,
+ SDL_HapticEffect * data);
+
+/*
+ * Runs the effect on the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticRunEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect,
+ Uint32 iterations);
+
+/*
+ * Stops the effect on the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticStopEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect);
+
+/*
+ * Cleanups up the effect on the haptic device.
+ */
+extern void SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect);
+
+/*
+ * Queries the device for the status of effect.
+ *
+ * Returns 0 if device is stopped, >0 if device is playing and
+ * -1 on error.
+ */
+extern int SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
+ struct haptic_effect *effect);
+
+/*
+ * Sets the global gain of the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain);
+
+/*
+ * Sets the autocenter feature of the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter);
+
+/*
+ * Pauses the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticPause(SDL_Haptic * haptic);
+
+/*
+ * Unpauses the haptic device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticUnpause(SDL_Haptic * haptic);
+
+/*
+ * Stops all the currently playing haptic effects on the device.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+extern int SDL_SYS_HapticStopAll(SDL_Haptic * haptic);
diff --git a/macosx/plugins/DFInput/SDL/src/haptic/darwin/SDL_syshaptic.c b/macosx/plugins/DFInput/SDL/src/haptic/darwin/SDL_syshaptic.c
new file mode 100644
index 0000000..c5b1e54
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/haptic/darwin/SDL_syshaptic.c
@@ -0,0 +1,1321 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 2008 Edgar Simo
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#ifdef SDL_HAPTIC_IOKIT
+
+#include "SDL_haptic.h"
+#include "../SDL_syshaptic.h"
+#include "SDL_joystick.h"
+#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
+#include "../../joystick/darwin/SDL_sysjoystick_c.h" /* For joystick hwdata */
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/hid/IOHIDKeys.h>
+#include <IOKit/hid/IOHIDUsageTables.h>
+#include <ForceFeedback/ForceFeedback.h>
+#include <ForceFeedback/ForceFeedbackConstants.h>
+
+#ifndef IO_OBJECT_NULL
+#define IO_OBJECT_NULL ((io_service_t)0)
+#endif
+
+#define MAX_HAPTICS 32
+
+
+/*
+ * List of available haptic devices.
+ */
+static struct
+{
+ char name[256]; /* Name of the device. */
+
+ io_service_t dev; /* Node we use to create the device. */
+ SDL_Haptic *haptic; /* Haptic currently assosciated with it. */
+
+ /* Usage pages for determining if it's a mouse or not. */
+ long usage;
+ long usagePage;
+} SDL_hapticlist[MAX_HAPTICS];
+
+
+/*
+ * Haptic system hardware data.
+ */
+struct haptic_hwdata
+{
+ FFDeviceObjectReference device; /* Hardware device. */
+ UInt8 axes[3];
+};
+
+
+/*
+ * Haptic system effect data.
+ */
+struct haptic_hweffect
+{
+ FFEffectObjectReference ref; /* Reference. */
+ struct FFEFFECT effect; /* Hardware effect. */
+};
+
+/*
+ * Prototypes.
+ */
+static void SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type);
+static int HIDGetDeviceProduct(io_service_t dev, char *name);
+
+
+/*
+ * Like strerror but for force feedback errors.
+ */
+static const char *
+FFStrError(HRESULT err)
+{
+ switch (err) {
+ case FFERR_DEVICEFULL:
+ return "device full";
+ /* This should be valid, but for some reason isn't defined... */
+ /*case FFERR_DEVICENOTREG:
+ return "device not registered"; */
+ case FFERR_DEVICEPAUSED:
+ return "device paused";
+ case FFERR_DEVICERELEASED:
+ return "device released";
+ case FFERR_EFFECTPLAYING:
+ return "effect playing";
+ case FFERR_EFFECTTYPEMISMATCH:
+ return "effect type mismatch";
+ case FFERR_EFFECTTYPENOTSUPPORTED:
+ return "effect type not supported";
+ case FFERR_GENERIC:
+ return "undetermined error";
+ case FFERR_HASEFFECTS:
+ return "device has effects";
+ case FFERR_INCOMPLETEEFFECT:
+ return "incomplete effect";
+ case FFERR_INTERNAL:
+ return "internal fault";
+ case FFERR_INVALIDDOWNLOADID:
+ return "invalid download id";
+ case FFERR_INVALIDPARAM:
+ return "invalid parameter";
+ case FFERR_MOREDATA:
+ return "more data";
+ case FFERR_NOINTERFACE:
+ return "interface not supported";
+ case FFERR_NOTDOWNLOADED:
+ return "effect is not downloaded";
+ case FFERR_NOTINITIALIZED:
+ return "object has not been initialized";
+ case FFERR_OUTOFMEMORY:
+ return "out of memory";
+ case FFERR_UNPLUGGED:
+ return "device is unplugged";
+ case FFERR_UNSUPPORTED:
+ return "function call unsupported";
+ case FFERR_UNSUPPORTEDAXIS:
+ return "axis unsupported";
+
+ default:
+ return "unknown error";
+ }
+}
+
+
+/*
+ * Initializes the haptic subsystem.
+ */
+int
+SDL_SYS_HapticInit(void)
+{
+ int numhaptics;
+ IOReturn result;
+ io_iterator_t iter;
+ CFDictionaryRef match;
+ io_service_t device;
+ CFMutableDictionaryRef hidProperties;
+ CFTypeRef refCF;
+
+ /* Clear all the memory. */
+ SDL_memset(SDL_hapticlist, 0, sizeof(SDL_hapticlist));
+
+ /* Get HID devices. */
+ match = IOServiceMatching(kIOHIDDeviceKey);
+ if (match == NULL) {
+ SDL_SetError("Haptic: Failed to get IOServiceMatching.");
+ return -1;
+ }
+
+ /* Now search I/O Registry for matching devices. */
+ result = IOServiceGetMatchingServices(kIOMasterPortDefault, match, &iter);
+ if (result != kIOReturnSuccess) {
+ SDL_SetError("Haptic: Couldn't create a HID object iterator.");
+ return -1;
+ }
+ /* IOServiceGetMatchingServices consumes dictionary. */
+
+ if (!IOIteratorIsValid(iter)) { /* No iterator. */
+ numhaptics = 0;
+ return 0;
+ }
+
+ numhaptics = 0;
+ while ((device = IOIteratorNext(iter)) != IO_OBJECT_NULL) {
+
+ /* Check for force feedback. */
+ if (FFIsForceFeedback(device) == FF_OK) {
+
+ /* Set basic device data. */
+ HIDGetDeviceProduct(device, SDL_hapticlist[numhaptics].name);
+ SDL_hapticlist[numhaptics].dev = device;
+ SDL_hapticlist[numhaptics].haptic = NULL;
+
+ /* Set usage pages. */
+ hidProperties = 0;
+ refCF = 0;
+ result = IORegistryEntryCreateCFProperties(device,
+ &hidProperties,
+ kCFAllocatorDefault,
+ kNilOptions);
+ if ((result == KERN_SUCCESS) && hidProperties) {
+ refCF =
+ CFDictionaryGetValue(hidProperties,
+ CFSTR(kIOHIDPrimaryUsagePageKey));
+ if (refCF) {
+ if (!CFNumberGetValue(refCF, kCFNumberLongType,
+ &SDL_hapticlist[numhaptics].
+ usagePage))
+ SDL_SetError
+ ("Haptic: Recieving device's usage page.");
+ refCF =
+ CFDictionaryGetValue(hidProperties,
+ CFSTR(kIOHIDPrimaryUsageKey));
+ if (refCF) {
+ if (!CFNumberGetValue(refCF, kCFNumberLongType,
+ &SDL_hapticlist[numhaptics].
+ usage))
+ SDL_SetError("Haptic: Recieving device's usage.");
+ }
+ }
+ CFRelease(hidProperties);
+ }
+
+ /* Device has been added. */
+ numhaptics++;
+ } else { /* Free the unused device. */
+ IOObjectRelease(device);
+ }
+
+ /* Reached haptic limit. */
+ if (numhaptics >= MAX_HAPTICS)
+ break;
+ }
+ IOObjectRelease(iter);
+
+ return numhaptics;
+}
+
+
+/*
+ * Return the name of a haptic device, does not need to be opened.
+ */
+const char *
+SDL_SYS_HapticName(int index)
+{
+ return SDL_hapticlist[index].name;
+}
+
+/*
+ * Gets the device's product name.
+ */
+static int
+HIDGetDeviceProduct(io_service_t dev, char *name)
+{
+ CFMutableDictionaryRef hidProperties, usbProperties;
+ io_registry_entry_t parent1, parent2;
+ kern_return_t ret;
+
+ hidProperties = usbProperties = 0;
+
+ ret = IORegistryEntryCreateCFProperties(dev, &hidProperties,
+ kCFAllocatorDefault, kNilOptions);
+ if ((ret != KERN_SUCCESS) || !hidProperties) {
+ SDL_SetError("Haptic: Unable to create CFProperties.");
+ return -1;
+ }
+
+ /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also
+ * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties
+ */
+ if ((KERN_SUCCESS ==
+ IORegistryEntryGetParentEntry(dev, kIOServicePlane, &parent1))
+ && (KERN_SUCCESS ==
+ IORegistryEntryGetParentEntry(parent1, kIOServicePlane, &parent2))
+ && (KERN_SUCCESS ==
+ IORegistryEntryCreateCFProperties(parent2, &usbProperties,
+ kCFAllocatorDefault,
+ kNilOptions))) {
+ if (usbProperties) {
+ CFTypeRef refCF = 0;
+ /* get device info
+ * try hid dictionary first, if fail then go to usb dictionary
+ */
+
+
+ /* Get product name */
+ refCF =
+ CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDProductKey));
+ if (!refCF)
+ refCF =
+ CFDictionaryGetValue(usbProperties,
+ CFSTR("USB Product Name"));
+ if (refCF) {
+ if (!CFStringGetCString(refCF, name, 256,
+ CFStringGetSystemEncoding())) {
+ SDL_SetError
+ ("Haptic: CFStringGetCString error retrieving pDevice->product.");
+ return -1;
+ }
+ }
+
+ CFRelease(usbProperties);
+ } else {
+ SDL_SetError
+ ("Haptic: IORegistryEntryCreateCFProperties failed to create usbProperties.");
+ return -1;
+ }
+
+ /* Release stuff. */
+ if (kIOReturnSuccess != IOObjectRelease(parent2)) {
+ SDL_SetError("Haptic: IOObjectRelease error with parent2.");
+ }
+ if (kIOReturnSuccess != IOObjectRelease(parent1)) {
+ SDL_SetError("Haptic: IOObjectRelease error with parent1.");
+ }
+ } else {
+ SDL_SetError("Haptic: Error getting registry entries.");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+#define FF_TEST(ff, s) \
+if (features.supportedEffects & (ff)) supported |= (s)
+/*
+ * Gets supported features.
+ */
+static unsigned int
+GetSupportedFeatures(SDL_Haptic * haptic)
+{
+ HRESULT ret;
+ FFDeviceObjectReference device;
+ FFCAPABILITIES features;
+ unsigned int supported;
+ Uint32 val;
+
+ device = haptic->hwdata->device;
+
+ ret = FFDeviceGetForceFeedbackCapabilities(device, &features);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to get device's supported features.");
+ return -1;
+ }
+
+ supported = 0;
+
+ /* Get maximum effects. */
+ haptic->neffects = features.storageCapacity;
+ haptic->nplaying = features.playbackCapacity;
+
+ /* Test for effects. */
+ FF_TEST(FFCAP_ET_CONSTANTFORCE, SDL_HAPTIC_CONSTANT);
+ FF_TEST(FFCAP_ET_RAMPFORCE, SDL_HAPTIC_RAMP);
+ FF_TEST(FFCAP_ET_SQUARE, SDL_HAPTIC_SQUARE);
+ FF_TEST(FFCAP_ET_SINE, SDL_HAPTIC_SINE);
+ FF_TEST(FFCAP_ET_TRIANGLE, SDL_HAPTIC_TRIANGLE);
+ FF_TEST(FFCAP_ET_SAWTOOTHUP, SDL_HAPTIC_SAWTOOTHUP);
+ FF_TEST(FFCAP_ET_SAWTOOTHDOWN, SDL_HAPTIC_SAWTOOTHDOWN);
+ FF_TEST(FFCAP_ET_SPRING, SDL_HAPTIC_SPRING);
+ FF_TEST(FFCAP_ET_DAMPER, SDL_HAPTIC_DAMPER);
+ FF_TEST(FFCAP_ET_INERTIA, SDL_HAPTIC_INERTIA);
+ FF_TEST(FFCAP_ET_FRICTION, SDL_HAPTIC_FRICTION);
+ FF_TEST(FFCAP_ET_CUSTOMFORCE, SDL_HAPTIC_CUSTOM);
+
+ /* Check if supports gain. */
+ ret = FFDeviceGetForceFeedbackProperty(device, FFPROP_FFGAIN,
+ &val, sizeof(val));
+ if (ret == FF_OK)
+ supported |= SDL_HAPTIC_GAIN;
+ else if (ret != FFERR_UNSUPPORTED) {
+ SDL_SetError("Haptic: Unable to get if device supports gain: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ /* Checks if supports autocenter. */
+ ret = FFDeviceGetForceFeedbackProperty(device, FFPROP_AUTOCENTER,
+ &val, sizeof(val));
+ if (ret == FF_OK)
+ supported |= SDL_HAPTIC_AUTOCENTER;
+ else if (ret != FFERR_UNSUPPORTED) {
+ SDL_SetError
+ ("Haptic: Unable to get if device supports autocenter: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ /* Check for axes, we have an artificial limit on axes */
+ haptic->naxes = ((features.numFfAxes) > 3) ? 3 : features.numFfAxes;
+ /* Actually store the axes we want to use */
+ SDL_memcpy(haptic->hwdata->axes, features.ffAxes,
+ haptic->naxes * sizeof(Uint8));
+
+ /* Always supported features. */
+ supported |= SDL_HAPTIC_STATUS | SDL_HAPTIC_PAUSE;
+
+ haptic->supported = supported;
+ return 0;;
+}
+
+
+/*
+ * Opens the haptic device from the file descriptor.
+ */
+static int
+SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service)
+{
+ HRESULT ret;
+ int ret2;
+
+ /* Allocate the hwdata */
+ haptic->hwdata = (struct haptic_hwdata *)
+ SDL_malloc(sizeof(*haptic->hwdata));
+ if (haptic->hwdata == NULL) {
+ SDL_OutOfMemory();
+ goto creat_err;
+ }
+ SDL_memset(haptic->hwdata, 0, sizeof(*haptic->hwdata));
+
+ /* Open the device */
+ ret = FFCreateDevice(service, &haptic->hwdata->device);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to create device from service: %s.",
+ FFStrError(ret));
+ goto creat_err;
+ }
+
+ /* Get supported features. */
+ ret2 = GetSupportedFeatures(haptic);
+ if (haptic->supported < 0) {
+ goto open_err;
+ }
+
+
+ /* Reset and then enable actuators. */
+ ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
+ FFSFFC_RESET);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to reset device: %s.", FFStrError(ret));
+ goto open_err;
+ }
+ ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
+ FFSFFC_SETACTUATORSON);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to enable actuators: %s.",
+ FFStrError(ret));
+ goto open_err;
+ }
+
+
+ /* Allocate effects memory. */
+ haptic->effects = (struct haptic_effect *)
+ SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects);
+ if (haptic->effects == NULL) {
+ SDL_OutOfMemory();
+ goto open_err;
+ }
+ /* Clear the memory */
+ SDL_memset(haptic->effects, 0,
+ sizeof(struct haptic_effect) * haptic->neffects);
+
+ return 0;
+
+ /* Error handling */
+ open_err:
+ FFReleaseDevice(haptic->hwdata->device);
+ creat_err:
+ if (haptic->hwdata != NULL) {
+ free(haptic->hwdata);
+ haptic->hwdata = NULL;
+ }
+ return -1;
+
+}
+
+
+/*
+ * Opens a haptic device for usage.
+ */
+int
+SDL_SYS_HapticOpen(SDL_Haptic * haptic)
+{
+ return SDL_SYS_HapticOpenFromService(haptic,
+ SDL_hapticlist[haptic->index].dev);
+}
+
+
+/*
+ * Opens a haptic device from first mouse it finds for usage.
+ */
+int
+SDL_SYS_HapticMouse(void)
+{
+ int i;
+
+ for (i = 0; i < SDL_numhaptics; i++) {
+ if ((SDL_hapticlist[i].usagePage == kHIDPage_GenericDesktop) &&
+ (SDL_hapticlist[i].usage == kHIDUsage_GD_Mouse))
+ return i;
+ }
+
+ return -1;
+}
+
+
+/*
+ * Checks to see if a joystick has haptic features.
+ */
+int
+SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
+{
+ if (joystick->hwdata->ffservice != 0)
+ return SDL_TRUE;
+ return SDL_FALSE;
+}
+
+
+/*
+ * Checks to see if the haptic device and joystick and in reality the same.
+ */
+int
+SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
+{
+ if (IOObjectIsEqualTo((io_object_t) haptic->hwdata->device,
+ joystick->hwdata->ffservice))
+ return 1;
+ return 0;
+}
+
+
+/*
+ * Opens a SDL_Haptic from a SDL_Joystick.
+ */
+int
+SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
+{
+ return SDL_SYS_HapticOpenFromService(haptic, joystick->hwdata->ffservice);
+}
+
+
+/*
+ * Closes the haptic device.
+ */
+void
+SDL_SYS_HapticClose(SDL_Haptic * haptic)
+{
+ if (haptic->hwdata) {
+
+ /* Free Effects. */
+ SDL_free(haptic->effects);
+ haptic->effects = NULL;
+ haptic->neffects = 0;
+
+ /* Clean up */
+ FFReleaseDevice(haptic->hwdata->device);
+
+ /* Free */
+ SDL_free(haptic->hwdata);
+ haptic->hwdata = NULL;
+ }
+}
+
+
+/*
+ * Clean up after system specific haptic stuff
+ */
+void
+SDL_SYS_HapticQuit(void)
+{
+ int i;
+
+ for (i = 0; i < SDL_numhaptics; i++) {
+ /* Opened and not closed haptics are leaked, this is on purpose.
+ * Close your haptic devices after usage. */
+
+ /* Free the io_service_t */
+ IOObjectRelease(SDL_hapticlist[i].dev);
+ }
+}
+
+
+/*
+ * Converts an SDL trigger button to an FFEFFECT trigger button.
+ */
+static DWORD
+FFGetTriggerButton(Uint16 button)
+{
+ DWORD dwTriggerButton;
+
+ dwTriggerButton = FFEB_NOTRIGGER;
+
+ if (button != 0) {
+ dwTriggerButton = FFJOFS_BUTTON(button - 1);
+ }
+
+ return dwTriggerButton;
+}
+
+
+/*
+ * Sets the direction.
+ */
+static int
+SDL_SYS_SetDirection(FFEFFECT * effect, SDL_HapticDirection * dir, int naxes)
+{
+ LONG *rglDir;
+
+ /* Handle no axes a part. */
+ if (naxes == 0) {
+ effect->dwFlags |= FFEFF_SPHERICAL; /* Set as default. */
+ effect->rglDirection = NULL;
+ return 0;
+ }
+
+ /* Has axes. */
+ rglDir = SDL_malloc(sizeof(LONG) * naxes);
+ if (rglDir == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(rglDir, 0, sizeof(LONG) * naxes);
+ effect->rglDirection = rglDir;
+
+ switch (dir->type) {
+ case SDL_HAPTIC_POLAR:
+ effect->dwFlags |= FFEFF_POLAR;
+ rglDir[0] = dir->dir[0];
+ return 0;
+ case SDL_HAPTIC_CARTESIAN:
+ effect->dwFlags |= FFEFF_CARTESIAN;
+ rglDir[0] = dir->dir[0];
+ if (naxes > 1)
+ rglDir[1] = dir->dir[1];
+ if (naxes > 2)
+ rglDir[2] = dir->dir[2];
+ return 0;
+ case SDL_HAPTIC_SPHERICAL:
+ effect->dwFlags |= FFEFF_SPHERICAL;
+ rglDir[0] = dir->dir[0];
+ if (naxes > 1)
+ rglDir[1] = dir->dir[1];
+ if (naxes > 2)
+ rglDir[2] = dir->dir[2];
+ return 0;
+
+ default:
+ SDL_SetError("Haptic: Unknown direction type.");
+ return -1;
+ }
+}
+
+
+/* Clamps and converts. */
+#define CCONVERT(x) (((x) > 0x7FFF) ? 10000 : ((x)*10000) / 0x7FFF)
+/* Just converts. */
+#define CONVERT(x) (((x)*10000) / 0x7FFF)
+/*
+ * Creates the FFEFFECT from a SDL_HapticEffect.
+ */
+static int
+SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest,
+ SDL_HapticEffect * src)
+{
+ int i;
+ FFCONSTANTFORCE *constant;
+ FFPERIODIC *periodic;
+ FFCONDITION *condition; /* Actually an array of conditions - one per axis. */
+ FFRAMPFORCE *ramp;
+ FFCUSTOMFORCE *custom;
+ FFENVELOPE *envelope;
+ SDL_HapticConstant *hap_constant;
+ SDL_HapticPeriodic *hap_periodic;
+ SDL_HapticCondition *hap_condition;
+ SDL_HapticRamp *hap_ramp;
+ SDL_HapticCustom *hap_custom;
+ DWORD *axes;
+
+ /* Set global stuff. */
+ SDL_memset(dest, 0, sizeof(FFEFFECT));
+ dest->dwSize = sizeof(FFEFFECT); /* Set the structure size. */
+ dest->dwSamplePeriod = 0; /* Not used by us. */
+ dest->dwGain = 10000; /* Gain is set globally, not locally. */
+ dest->dwFlags = FFEFF_OBJECTOFFSETS; /* Seems obligatory. */
+
+ /* Envelope. */
+ envelope = SDL_malloc(sizeof(FFENVELOPE));
+ if (envelope == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(envelope, 0, sizeof(FFENVELOPE));
+ dest->lpEnvelope = envelope;
+ envelope->dwSize = sizeof(FFENVELOPE); /* Always should be this. */
+
+ /* Axes. */
+ dest->cAxes = haptic->naxes;
+ if (dest->cAxes > 0) {
+ axes = SDL_malloc(sizeof(DWORD) * dest->cAxes);
+ if (axes == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ axes[0] = haptic->hwdata->axes[0]; /* Always at least one axis. */
+ if (dest->cAxes > 1) {
+ axes[1] = haptic->hwdata->axes[1];
+ }
+ if (dest->cAxes > 2) {
+ axes[2] = haptic->hwdata->axes[2];
+ }
+ dest->rgdwAxes = axes;
+ }
+
+
+ /* The big type handling switch, even bigger then linux's version. */
+ switch (src->type) {
+ case SDL_HAPTIC_CONSTANT:
+ hap_constant = &src->constant;
+ constant = SDL_malloc(sizeof(FFCONSTANTFORCE));
+ if (constant == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(constant, 0, sizeof(FFCONSTANTFORCE));
+
+ /* Specifics */
+ constant->lMagnitude = CONVERT(hap_constant->level);
+ dest->cbTypeSpecificParams = sizeof(FFCONSTANTFORCE);
+ dest->lpvTypeSpecificParams = constant;
+
+ /* Generics */
+ dest->dwDuration = hap_constant->length * 1000; /* In microseconds. */
+ dest->dwTriggerButton = FFGetTriggerButton(hap_constant->button);
+ dest->dwTriggerRepeatInterval = hap_constant->interval;
+ dest->dwStartDelay = hap_constant->delay * 1000; /* In microseconds. */
+
+ /* Direction. */
+ if (SDL_SYS_SetDirection(dest, &hap_constant->direction, dest->cAxes)
+ < 0) {
+ return -1;
+ }
+
+ /* Envelope */
+ if ((hap_constant->attack_length == 0)
+ && (hap_constant->fade_length == 0)) {
+ SDL_free(envelope);
+ dest->lpEnvelope = NULL;
+ } else {
+ envelope->dwAttackLevel = CCONVERT(hap_constant->attack_level);
+ envelope->dwAttackTime = hap_constant->attack_length * 1000;
+ envelope->dwFadeLevel = CCONVERT(hap_constant->fade_level);
+ envelope->dwFadeTime = hap_constant->fade_length * 1000;
+ }
+
+ break;
+
+ case SDL_HAPTIC_SINE:
+ case SDL_HAPTIC_SQUARE:
+ case SDL_HAPTIC_TRIANGLE:
+ case SDL_HAPTIC_SAWTOOTHUP:
+ case SDL_HAPTIC_SAWTOOTHDOWN:
+ hap_periodic = &src->periodic;
+ periodic = SDL_malloc(sizeof(FFPERIODIC));
+ if (periodic == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(periodic, 0, sizeof(FFPERIODIC));
+
+ /* Specifics */
+ periodic->dwMagnitude = CONVERT(hap_periodic->magnitude);
+ periodic->lOffset = CONVERT(hap_periodic->offset);
+ periodic->dwPhase = hap_periodic->phase;
+ periodic->dwPeriod = hap_periodic->period * 1000;
+ dest->cbTypeSpecificParams = sizeof(FFPERIODIC);
+ dest->lpvTypeSpecificParams = periodic;
+
+ /* Generics */
+ dest->dwDuration = hap_periodic->length * 1000; /* In microseconds. */
+ dest->dwTriggerButton = FFGetTriggerButton(hap_periodic->button);
+ dest->dwTriggerRepeatInterval = hap_periodic->interval;
+ dest->dwStartDelay = hap_periodic->delay * 1000; /* In microseconds. */
+
+ /* Direction. */
+ if (SDL_SYS_SetDirection(dest, &hap_periodic->direction, dest->cAxes)
+ < 0) {
+ return -1;
+ }
+
+ /* Envelope */
+ if ((hap_periodic->attack_length == 0)
+ && (hap_periodic->fade_length == 0)) {
+ SDL_free(envelope);
+ dest->lpEnvelope = NULL;
+ } else {
+ envelope->dwAttackLevel = CCONVERT(hap_periodic->attack_level);
+ envelope->dwAttackTime = hap_periodic->attack_length * 1000;
+ envelope->dwFadeLevel = CCONVERT(hap_periodic->fade_level);
+ envelope->dwFadeTime = hap_periodic->fade_length * 1000;
+ }
+
+ break;
+
+ case SDL_HAPTIC_SPRING:
+ case SDL_HAPTIC_DAMPER:
+ case SDL_HAPTIC_INERTIA:
+ case SDL_HAPTIC_FRICTION:
+ hap_condition = &src->condition;
+ condition = SDL_malloc(sizeof(FFCONDITION) * dest->cAxes);
+ if (condition == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(condition, 0, sizeof(FFCONDITION));
+
+ /* Specifics */
+ for (i = 0; i < dest->cAxes; i++) {
+ condition[i].lOffset = CONVERT(hap_condition->center[i]);
+ condition[i].lPositiveCoefficient =
+ CONVERT(hap_condition->right_coeff[i]);
+ condition[i].lNegativeCoefficient =
+ CONVERT(hap_condition->left_coeff[i]);
+ condition[i].dwPositiveSaturation =
+ CCONVERT(hap_condition->right_sat[i]);
+ condition[i].dwNegativeSaturation =
+ CCONVERT(hap_condition->left_sat[i]);
+ condition[i].lDeadBand = CCONVERT(hap_condition->deadband[i]);
+ }
+ dest->cbTypeSpecificParams = sizeof(FFCONDITION) * dest->cAxes;
+ dest->lpvTypeSpecificParams = condition;
+
+ /* Generics */
+ dest->dwDuration = hap_condition->length * 1000; /* In microseconds. */
+ dest->dwTriggerButton = FFGetTriggerButton(hap_condition->button);
+ dest->dwTriggerRepeatInterval = hap_condition->interval;
+ dest->dwStartDelay = hap_condition->delay * 1000; /* In microseconds. */
+
+ /* Direction. */
+ if (SDL_SYS_SetDirection(dest, &hap_condition->direction, dest->cAxes)
+ < 0) {
+ return -1;
+ }
+
+ /* Envelope - Not actually supported by most CONDITION implementations. */
+ SDL_free(dest->lpEnvelope);
+ dest->lpEnvelope = NULL;
+
+ break;
+
+ case SDL_HAPTIC_RAMP:
+ hap_ramp = &src->ramp;
+ ramp = SDL_malloc(sizeof(FFRAMPFORCE));
+ if (ramp == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(ramp, 0, sizeof(FFRAMPFORCE));
+
+ /* Specifics */
+ ramp->lStart = CONVERT(hap_ramp->start);
+ ramp->lEnd = CONVERT(hap_ramp->end);
+ dest->cbTypeSpecificParams = sizeof(FFRAMPFORCE);
+ dest->lpvTypeSpecificParams = ramp;
+
+ /* Generics */
+ dest->dwDuration = hap_ramp->length * 1000; /* In microseconds. */
+ dest->dwTriggerButton = FFGetTriggerButton(hap_ramp->button);
+ dest->dwTriggerRepeatInterval = hap_ramp->interval;
+ dest->dwStartDelay = hap_ramp->delay * 1000; /* In microseconds. */
+
+ /* Direction. */
+ if (SDL_SYS_SetDirection(dest, &hap_ramp->direction, dest->cAxes) < 0) {
+ return -1;
+ }
+
+ /* Envelope */
+ if ((hap_ramp->attack_length == 0) && (hap_ramp->fade_length == 0)) {
+ SDL_free(envelope);
+ dest->lpEnvelope = NULL;
+ } else {
+ envelope->dwAttackLevel = CCONVERT(hap_ramp->attack_level);
+ envelope->dwAttackTime = hap_ramp->attack_length * 1000;
+ envelope->dwFadeLevel = CCONVERT(hap_ramp->fade_level);
+ envelope->dwFadeTime = hap_ramp->fade_length * 1000;
+ }
+
+ break;
+
+ case SDL_HAPTIC_CUSTOM:
+ hap_custom = &src->custom;
+ custom = SDL_malloc(sizeof(FFCUSTOMFORCE));
+ if (custom == NULL) {
+ SDL_OutOfMemory();
+ return -1;
+ }
+ SDL_memset(custom, 0, sizeof(FFCUSTOMFORCE));
+
+ /* Specifics */
+ custom->cChannels = hap_custom->channels;
+ custom->dwSamplePeriod = hap_custom->period * 1000;
+ custom->cSamples = hap_custom->samples;
+ custom->rglForceData =
+ SDL_malloc(sizeof(LONG) * custom->cSamples * custom->cChannels);
+ for (i = 0; i < hap_custom->samples * hap_custom->channels; i++) { /* Copy data. */
+ custom->rglForceData[i] = CCONVERT(hap_custom->data[i]);
+ }
+ dest->cbTypeSpecificParams = sizeof(FFCUSTOMFORCE);
+ dest->lpvTypeSpecificParams = custom;
+
+ /* Generics */
+ dest->dwDuration = hap_custom->length * 1000; /* In microseconds. */
+ dest->dwTriggerButton = FFGetTriggerButton(hap_custom->button);
+ dest->dwTriggerRepeatInterval = hap_custom->interval;
+ dest->dwStartDelay = hap_custom->delay * 1000; /* In microseconds. */
+
+ /* Direction. */
+ if (SDL_SYS_SetDirection(dest, &hap_custom->direction, dest->cAxes) <
+ 0) {
+ return -1;
+ }
+
+ /* Envelope */
+ if ((hap_custom->attack_length == 0)
+ && (hap_custom->fade_length == 0)) {
+ SDL_free(envelope);
+ dest->lpEnvelope = NULL;
+ } else {
+ envelope->dwAttackLevel = CCONVERT(hap_custom->attack_level);
+ envelope->dwAttackTime = hap_custom->attack_length * 1000;
+ envelope->dwFadeLevel = CCONVERT(hap_custom->fade_level);
+ envelope->dwFadeTime = hap_custom->fade_length * 1000;
+ }
+
+ break;
+
+
+ default:
+ SDL_SetError("Haptic: Unknown effect type.");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Frees an FFEFFECT allocated by SDL_SYS_ToFFEFFECT.
+ */
+static void
+SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type)
+{
+ FFCUSTOMFORCE *custom;
+
+ if (effect->lpEnvelope != NULL) {
+ SDL_free(effect->lpEnvelope);
+ effect->lpEnvelope = NULL;
+ }
+ if (effect->rgdwAxes != NULL) {
+ SDL_free(effect->rgdwAxes);
+ effect->rgdwAxes = NULL;
+ }
+ if (effect->lpvTypeSpecificParams != NULL) {
+ if (type == SDL_HAPTIC_CUSTOM) { /* Must free the custom data. */
+ custom = (FFCUSTOMFORCE *) effect->lpvTypeSpecificParams;
+ SDL_free(custom->rglForceData);
+ custom->rglForceData = NULL;
+ }
+ SDL_free(effect->lpvTypeSpecificParams);
+ effect->lpvTypeSpecificParams = NULL;
+ }
+ if (effect->rglDirection != NULL) {
+ SDL_free(effect->rglDirection);
+ effect->rglDirection = NULL;
+ }
+}
+
+
+/*
+ * Gets the effect type from the generic SDL haptic effect wrapper.
+ */
+CFUUIDRef
+SDL_SYS_HapticEffectType(Uint16 type)
+{
+ switch (type) {
+ case SDL_HAPTIC_CONSTANT:
+ return kFFEffectType_ConstantForce_ID;
+
+ case SDL_HAPTIC_RAMP:
+ return kFFEffectType_RampForce_ID;
+
+ case SDL_HAPTIC_SQUARE:
+ return kFFEffectType_Square_ID;
+
+ case SDL_HAPTIC_SINE:
+ return kFFEffectType_Sine_ID;
+
+ case SDL_HAPTIC_TRIANGLE:
+ return kFFEffectType_Triangle_ID;
+
+ case SDL_HAPTIC_SAWTOOTHUP:
+ return kFFEffectType_SawtoothUp_ID;
+
+ case SDL_HAPTIC_SAWTOOTHDOWN:
+ return kFFEffectType_SawtoothDown_ID;
+
+ case SDL_HAPTIC_SPRING:
+ return kFFEffectType_Spring_ID;
+
+ case SDL_HAPTIC_DAMPER:
+ return kFFEffectType_Damper_ID;
+
+ case SDL_HAPTIC_INERTIA:
+ return kFFEffectType_Inertia_ID;
+
+ case SDL_HAPTIC_FRICTION:
+ return kFFEffectType_Friction_ID;
+
+ case SDL_HAPTIC_CUSTOM:
+ return kFFEffectType_CustomForce_ID;
+
+ default:
+ SDL_SetError("Haptic: Unknown effect type.");
+ return NULL;
+ }
+}
+
+
+/*
+ * Creates a new haptic effect.
+ */
+int
+SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
+ SDL_HapticEffect * base)
+{
+ HRESULT ret;
+ CFUUIDRef type;
+
+ /* Alloc the effect. */
+ effect->hweffect = (struct haptic_hweffect *)
+ SDL_malloc(sizeof(struct haptic_hweffect));
+ if (effect->hweffect == NULL) {
+ SDL_OutOfMemory();
+ goto err_hweffect;
+ }
+
+ /* Get the type. */
+ type = SDL_SYS_HapticEffectType(base->type);
+ if (type == NULL) {
+ goto err_hweffect;
+ }
+
+ /* Get the effect. */
+ if (SDL_SYS_ToFFEFFECT(haptic, &effect->hweffect->effect, base) < 0) {
+ goto err_effectdone;
+ }
+
+ /* Create the actual effect. */
+ ret = FFDeviceCreateEffect(haptic->hwdata->device, type,
+ &effect->hweffect->effect,
+ &effect->hweffect->ref);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to create effect: %s.", FFStrError(ret));
+ goto err_effectdone;
+ }
+
+ return 0;
+
+ err_effectdone:
+ SDL_SYS_HapticFreeFFEFFECT(&effect->hweffect->effect, base->type);
+ err_hweffect:
+ if (effect->hweffect != NULL) {
+ SDL_free(effect->hweffect);
+ effect->hweffect = NULL;
+ }
+ return -1;
+}
+
+
+/*
+ * Updates an effect.
+ */
+int
+SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
+ struct haptic_effect *effect,
+ SDL_HapticEffect * data)
+{
+ HRESULT ret;
+ FFEffectParameterFlag flags;
+ FFEFFECT temp;
+
+ /* Get the effect. */
+ SDL_memset(&temp, 0, sizeof(FFEFFECT));
+ if (SDL_SYS_ToFFEFFECT(haptic, &temp, data) < 0) {
+ goto err_update;
+ }
+
+ /* Set the flags. Might be worthwhile to diff temp with loaded effect and
+ * only change those parameters. */
+ flags = FFEP_DIRECTION |
+ FFEP_DURATION |
+ FFEP_ENVELOPE |
+ FFEP_STARTDELAY |
+ FFEP_TRIGGERBUTTON |
+ FFEP_TRIGGERREPEATINTERVAL | FFEP_TYPESPECIFICPARAMS;
+
+ /* Create the actual effect. */
+ ret = FFEffectSetParameters(effect->hweffect->ref, &temp, flags);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to update effect: %s.", FFStrError(ret));
+ goto err_update;
+ }
+
+ /* Copy it over. */
+ SDL_SYS_HapticFreeFFEFFECT(&effect->hweffect->effect, data->type);
+ SDL_memcpy(&effect->hweffect->effect, &temp, sizeof(FFEFFECT));
+
+ return 0;
+
+ err_update:
+ SDL_SYS_HapticFreeFFEFFECT(&temp, data->type);
+ return -1;
+}
+
+
+/*
+ * Runs an effect.
+ */
+int
+SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
+ Uint32 iterations)
+{
+ HRESULT ret;
+ Uint32 iter;
+
+ /* Check if it's infinite. */
+ if (iterations == SDL_HAPTIC_INFINITY) {
+ iter = FF_INFINITE;
+ } else
+ iter = iterations;
+
+ /* Run the effect. */
+ ret = FFEffectStart(effect->hweffect->ref, iter, 0);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to run the effect: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Stops an effect.
+ */
+int
+SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
+{
+ HRESULT ret;
+
+ ret = FFEffectStop(effect->hweffect->ref);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to stop the effect: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Frees the effect.
+ */
+void
+SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
+{
+ HRESULT ret;
+
+ ret =
+ FFDeviceReleaseEffect(haptic->hwdata->device, effect->hweffect->ref);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error removing the effect from the device: %s.",
+ FFStrError(ret));
+ }
+ SDL_SYS_HapticFreeFFEFFECT(&effect->hweffect->effect,
+ effect->effect.type);
+ SDL_free(effect->hweffect);
+ effect->hweffect = NULL;
+}
+
+
+/*
+ * Gets the status of a haptic effect.
+ */
+int
+SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
+ struct haptic_effect *effect)
+{
+ HRESULT ret;
+ FFEffectStatusFlag status;
+
+ ret = FFEffectGetEffectStatus(effect->hweffect->ref, &status);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Unable to get effect status: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ if (status == 0)
+ return SDL_FALSE;
+ return SDL_TRUE; /* Assume it's playing or emulated. */
+}
+
+
+/*
+ * Sets the gain.
+ */
+int
+SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
+{
+ HRESULT ret;
+ Uint32 val;
+
+ val = gain * 100; /* Mac OS X uses 0 to 10,000 */
+ ret =
+ FFDeviceSetForceFeedbackProperty(haptic->hwdata->device,
+ FFPROP_FFGAIN, &val);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error setting gain: %s.", FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Sets the autocentering.
+ */
+int
+SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
+{
+ HRESULT ret;
+ Uint32 val;
+
+ /* Mac OS X only has 0 (off) and 1 (on) */
+ if (autocenter == 0)
+ val = 0;
+ else
+ val = 1;
+
+ ret = FFDeviceSetForceFeedbackProperty(haptic->hwdata->device,
+ FFPROP_AUTOCENTER, &val);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error setting autocenter: %s.",
+ FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Pauses the device.
+ */
+int
+SDL_SYS_HapticPause(SDL_Haptic * haptic)
+{
+ HRESULT ret;
+
+ ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
+ FFSFFC_PAUSE);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error pausing device: %s.", FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Unpauses the device.
+ */
+int
+SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
+{
+ HRESULT ret;
+
+ ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
+ FFSFFC_CONTINUE);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error pausing device: %s.", FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Stops all currently playing effects.
+ */
+int
+SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
+{
+ HRESULT ret;
+
+ ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
+ FFSFFC_STOPALL);
+ if (ret != FF_OK) {
+ SDL_SetError("Haptic: Error stopping device: %s.", FFStrError(ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+
+#endif /* SDL_HAPTIC_IOKIT */
diff --git a/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick.c b/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick.c
new file mode 100644
index 0000000..189b811
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick.c
@@ -0,0 +1,503 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* This is the joystick API for Simple DirectMedia Layer */
+#include "SDL.h"
+#include "SDL_sysjoystick.h"
+#include "SDL_joystick_c.h"
+
+/* This is used for Quake III Arena */
+#define SDL_Lock_EventThread()
+#define SDL_Unlock_EventThread()
+
+Uint8 SDL_numjoysticks = 0;
+SDL_Joystick **SDL_joysticks = NULL;
+static SDL_Joystick *default_joystick = NULL;
+
+int
+SDL_JoystickInit(void)
+{
+ int arraylen;
+ int status;
+
+ SDL_numjoysticks = 0;
+ status = SDL_SYS_JoystickInit();
+ if (status >= 0) {
+ arraylen = (status + 1) * sizeof(*SDL_joysticks);
+ SDL_joysticks = (SDL_Joystick **) SDL_malloc(arraylen);
+ if (SDL_joysticks == NULL) {
+ SDL_numjoysticks = 0;
+ } else {
+ SDL_memset(SDL_joysticks, 0, arraylen);
+ SDL_numjoysticks = status;
+ }
+ status = 0;
+ }
+ default_joystick = NULL;
+ return (status);
+}
+
+/*
+ * Count the number of joysticks attached to the system
+ */
+int
+SDL_NumJoysticks(void)
+{
+ return SDL_numjoysticks;
+}
+
+/*
+ * Get the implementation dependent name of a joystick
+ */
+const char *
+SDL_JoystickName(int device_index)
+{
+ if ((device_index < 0) || (device_index >= SDL_numjoysticks)) {
+ SDL_SetError("There are %d joysticks available", SDL_numjoysticks);
+ return (NULL);
+ }
+ return (SDL_SYS_JoystickName(device_index));
+}
+
+/*
+ * Open a joystick for use - the index passed as an argument refers to
+ * the N'th joystick on the system. This index is the value which will
+ * identify this joystick in future joystick events.
+ *
+ * This function returns a joystick identifier, or NULL if an error occurred.
+ */
+SDL_Joystick *
+SDL_JoystickOpen(int device_index)
+{
+ int i;
+ SDL_Joystick *joystick;
+
+ if ((device_index < 0) || (device_index >= SDL_numjoysticks)) {
+ SDL_SetError("There are %d joysticks available", SDL_numjoysticks);
+ return (NULL);
+ }
+
+ /* If the joystick is already open, return it */
+ for (i = 0; SDL_joysticks[i]; ++i) {
+ if (device_index == SDL_joysticks[i]->index) {
+ joystick = SDL_joysticks[i];
+ ++joystick->ref_count;
+ return (joystick);
+ }
+ }
+
+ /* Create and initialize the joystick */
+ joystick = (SDL_Joystick *) SDL_malloc((sizeof *joystick));
+ if (joystick == NULL) {
+ SDL_OutOfMemory();
+ return NULL;
+ }
+
+ SDL_memset(joystick, 0, (sizeof *joystick));
+ joystick->index = device_index;
+ if (SDL_SYS_JoystickOpen(joystick) < 0) {
+ SDL_free(joystick);
+ return NULL;
+ }
+ if (joystick->naxes > 0) {
+ joystick->axes = (Sint16 *) SDL_malloc
+ (joystick->naxes * sizeof(Sint16));
+ }
+ if (joystick->nhats > 0) {
+ joystick->hats = (Uint8 *) SDL_malloc
+ (joystick->nhats * sizeof(Uint8));
+ }
+ if (joystick->nballs > 0) {
+ joystick->balls = (struct balldelta *) SDL_malloc
+ (joystick->nballs * sizeof(*joystick->balls));
+ }
+ if (joystick->nbuttons > 0) {
+ joystick->buttons = (Uint8 *) SDL_malloc
+ (joystick->nbuttons * sizeof(Uint8));
+ }
+ if (((joystick->naxes > 0) && !joystick->axes)
+ || ((joystick->nhats > 0) && !joystick->hats)
+ || ((joystick->nballs > 0) && !joystick->balls)
+ || ((joystick->nbuttons > 0) && !joystick->buttons)) {
+ SDL_OutOfMemory();
+ SDL_JoystickClose(joystick);
+ return NULL;
+ }
+ if (joystick->axes) {
+ SDL_memset(joystick->axes, 0, joystick->naxes * sizeof(Sint16));
+ }
+ if (joystick->hats) {
+ SDL_memset(joystick->hats, 0, joystick->nhats * sizeof(Uint8));
+ }
+ if (joystick->balls) {
+ SDL_memset(joystick->balls, 0,
+ joystick->nballs * sizeof(*joystick->balls));
+ }
+ if (joystick->buttons) {
+ SDL_memset(joystick->buttons, 0, joystick->nbuttons * sizeof(Uint8));
+ }
+
+ /* Add joystick to list */
+ ++joystick->ref_count;
+ SDL_Lock_EventThread();
+ for (i = 0; SDL_joysticks[i]; ++i)
+ /* Skip to next joystick */ ;
+ SDL_joysticks[i] = joystick;
+ SDL_Unlock_EventThread();
+
+ return (joystick);
+}
+
+/*
+ * Returns 1 if the joystick has been opened, or 0 if it has not.
+ */
+int
+SDL_JoystickOpened(int device_index)
+{
+ int i, opened;
+
+ opened = 0;
+ for (i = 0; SDL_joysticks[i]; ++i) {
+ if (SDL_joysticks[i]->index == (Uint8) device_index) {
+ opened = 1;
+ break;
+ }
+ }
+ return (opened);
+}
+
+
+/*
+ * Checks to make sure the joystick is valid.
+ */
+int
+SDL_PrivateJoystickValid(SDL_Joystick ** joystick)
+{
+ int valid;
+
+ if (*joystick == NULL) {
+ *joystick = default_joystick;
+ }
+ if (*joystick == NULL) {
+ SDL_SetError("Joystick hasn't been opened yet");
+ valid = 0;
+ } else {
+ valid = 1;
+ }
+ return valid;
+}
+
+/*
+ * Get the device index of an opened joystick.
+ */
+int
+SDL_JoystickIndex(SDL_Joystick * joystick)
+{
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+ return (joystick->index);
+}
+
+/*
+ * Get the number of multi-dimensional axis controls on a joystick
+ */
+int
+SDL_JoystickNumAxes(SDL_Joystick * joystick)
+{
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+ return (joystick->naxes);
+}
+
+/*
+ * Get the number of hats on a joystick
+ */
+int
+SDL_JoystickNumHats(SDL_Joystick * joystick)
+{
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+ return (joystick->nhats);
+}
+
+/*
+ * Get the number of trackballs on a joystick
+ */
+int
+SDL_JoystickNumBalls(SDL_Joystick * joystick)
+{
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+ return (joystick->nballs);
+}
+
+/*
+ * Get the number of buttons on a joystick
+ */
+int
+SDL_JoystickNumButtons(SDL_Joystick * joystick)
+{
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+ return (joystick->nbuttons);
+}
+
+/*
+ * Get the current state of an axis control on a joystick
+ */
+Sint16
+SDL_JoystickGetAxis(SDL_Joystick * joystick, int axis)
+{
+ Sint16 state;
+
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (0);
+ }
+ if (axis < joystick->naxes) {
+ state = joystick->axes[axis];
+ } else {
+ SDL_SetError("Joystick only has %d axes", joystick->naxes);
+ state = 0;
+ }
+ return (state);
+}
+
+/*
+ * Get the current state of a hat on a joystick
+ */
+Uint8
+SDL_JoystickGetHat(SDL_Joystick * joystick, int hat)
+{
+ Uint8 state;
+
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (0);
+ }
+ if (hat < joystick->nhats) {
+ state = joystick->hats[hat];
+ } else {
+ SDL_SetError("Joystick only has %d hats", joystick->nhats);
+ state = 0;
+ }
+ return (state);
+}
+
+/*
+ * Get the ball axis change since the last poll
+ */
+int
+SDL_JoystickGetBall(SDL_Joystick * joystick, int ball, int *dx, int *dy)
+{
+ int retval;
+
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (-1);
+ }
+
+ retval = 0;
+ if (ball < joystick->nballs) {
+ if (dx) {
+ *dx = joystick->balls[ball].dx;
+ }
+ if (dy) {
+ *dy = joystick->balls[ball].dy;
+ }
+ joystick->balls[ball].dx = 0;
+ joystick->balls[ball].dy = 0;
+ } else {
+ SDL_SetError("Joystick only has %d balls", joystick->nballs);
+ retval = -1;
+ }
+ return (retval);
+}
+
+/*
+ * Get the current state of a button on a joystick
+ */
+Uint8
+SDL_JoystickGetButton(SDL_Joystick * joystick, int button)
+{
+ Uint8 state;
+
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return (0);
+ }
+ if (button < joystick->nbuttons) {
+ state = joystick->buttons[button];
+ } else {
+ SDL_SetError("Joystick only has %d buttons", joystick->nbuttons);
+ state = 0;
+ }
+ return (state);
+}
+
+/*
+ * Close a joystick previously opened with SDL_JoystickOpen()
+ */
+void
+SDL_JoystickClose(SDL_Joystick * joystick)
+{
+ int i;
+
+ if (!SDL_PrivateJoystickValid(&joystick)) {
+ return;
+ }
+
+ /* First decrement ref count */
+ if (--joystick->ref_count > 0) {
+ return;
+ }
+
+ /* Lock the event queue - prevent joystick polling */
+ SDL_Lock_EventThread();
+
+ if (joystick == default_joystick) {
+ default_joystick = NULL;
+ }
+ SDL_SYS_JoystickClose(joystick);
+
+ /* Remove joystick from list */
+ for (i = 0; SDL_joysticks[i]; ++i) {
+ if (joystick == SDL_joysticks[i]) {
+ SDL_memmove(&SDL_joysticks[i], &SDL_joysticks[i + 1],
+ (SDL_numjoysticks - i) * sizeof(joystick));
+ break;
+ }
+ }
+
+ /* Let the event thread keep running */
+ SDL_Unlock_EventThread();
+
+ /* Free the data associated with this joystick */
+ if (joystick->axes) {
+ SDL_free(joystick->axes);
+ }
+ if (joystick->hats) {
+ SDL_free(joystick->hats);
+ }
+ if (joystick->balls) {
+ SDL_free(joystick->balls);
+ }
+ if (joystick->buttons) {
+ SDL_free(joystick->buttons);
+ }
+ SDL_free(joystick);
+}
+
+void
+SDL_JoystickQuit(void)
+{
+ /* Stop the event polling */
+ SDL_Lock_EventThread();
+ SDL_numjoysticks = 0;
+ SDL_Unlock_EventThread();
+
+ /* Quit the joystick setup */
+ SDL_SYS_JoystickQuit();
+ if (SDL_joysticks) {
+ SDL_free(SDL_joysticks);
+ SDL_joysticks = NULL;
+ }
+}
+
+
+/* These are global for SDL_sysjoystick.c and SDL_events.c */
+
+int
+SDL_PrivateJoystickAxis(SDL_Joystick * joystick, Uint8 axis, Sint16 value)
+{
+ int posted;
+
+ /* Update internal joystick state */
+ joystick->axes[axis] = value;
+
+ /* Post the event, if desired */
+ posted = 0;
+
+ return (posted);
+}
+
+int
+SDL_PrivateJoystickHat(SDL_Joystick * joystick, Uint8 hat, Uint8 value)
+{
+ int posted;
+
+ /* Update internal joystick state */
+ joystick->hats[hat] = value;
+
+ /* Post the event, if desired */
+ posted = 0;
+
+ return (posted);
+}
+
+int
+SDL_PrivateJoystickBall(SDL_Joystick * joystick, Uint8 ball,
+ Sint16 xrel, Sint16 yrel)
+{
+ int posted;
+
+ /* Update internal mouse state */
+ joystick->balls[ball].dx += xrel;
+ joystick->balls[ball].dy += yrel;
+
+ /* Post the event, if desired */
+ posted = 0;
+
+ return (posted);
+}
+
+int
+SDL_PrivateJoystickButton(SDL_Joystick * joystick, Uint8 button, Uint8 state)
+{
+ int posted;
+
+ /* Update internal joystick state */
+ joystick->buttons[button] = state;
+
+ /* Post the event, if desired */
+ posted = 0;
+
+ return (posted);
+}
+
+void
+SDL_JoystickUpdate(void)
+{
+ int i;
+
+ for (i = 0; SDL_joysticks[i]; ++i) {
+ SDL_SYS_JoystickUpdate(SDL_joysticks[i]);
+ }
+}
+
+int
+SDL_JoystickEventState(int state)
+{
+ return SDL_IGNORE;
+}
diff --git a/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick_c.h b/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick_c.h
new file mode 100644
index 0000000..e0f8529
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/joystick/SDL_joystick_c.h
@@ -0,0 +1,47 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* Useful functions and variables from SDL_joystick.c */
+#include "SDL_joystick.h"
+
+/* The number of available joysticks on the system */
+extern Uint8 SDL_numjoysticks;
+
+/* Initialization and shutdown functions */
+extern int SDL_JoystickInit(void);
+extern void SDL_JoystickQuit(void);
+
+/* Internal event queueing functions */
+extern int SDL_PrivateJoystickAxis(SDL_Joystick * joystick,
+ Uint8 axis, Sint16 value);
+extern int SDL_PrivateJoystickBall(SDL_Joystick * joystick,
+ Uint8 ball, Sint16 xrel, Sint16 yrel);
+extern int SDL_PrivateJoystickHat(SDL_Joystick * joystick,
+ Uint8 hat, Uint8 value);
+extern int SDL_PrivateJoystickButton(SDL_Joystick * joystick,
+ Uint8 button, Uint8 state);
+
+/* Internal sanity checking functions */
+extern int SDL_PrivateJoystickValid(SDL_Joystick ** joystick);
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/joystick/SDL_sysjoystick.h b/macosx/plugins/DFInput/SDL/src/joystick/SDL_sysjoystick.h
new file mode 100644
index 0000000..ddb3b84
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/joystick/SDL_sysjoystick.h
@@ -0,0 +1,85 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is SDL_free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/* This is the system specific header for the SDL joystick API */
+
+#include "SDL_joystick.h"
+
+/* The SDL joystick structure */
+struct _SDL_Joystick
+{
+ Uint8 index; /* Device index */
+ const char *name; /* Joystick name - system dependent */
+
+ int naxes; /* Number of axis controls on the joystick */
+ Sint16 *axes; /* Current axis states */
+
+ int nhats; /* Number of hats on the joystick */
+ Uint8 *hats; /* Current hat states */
+
+ int nballs; /* Number of trackballs on the joystick */
+ struct balldelta
+ {
+ int dx;
+ int dy;
+ } *balls; /* Current ball motion deltas */
+
+ int nbuttons; /* Number of buttons on the joystick */
+ Uint8 *buttons; /* Current button states */
+
+ struct joystick_hwdata *hwdata; /* Driver dependent information */
+
+ int ref_count; /* Reference count for multiple opens */
+};
+
+/* Function to scan the system for joysticks.
+ * Joystick 0 should be the system default joystick.
+ * This function should return the number of available joysticks, or -1
+ * on an unrecoverable fatal error.
+ */
+extern int SDL_SYS_JoystickInit(void);
+
+/* Function to get the device-dependent name of a joystick */
+extern const char *SDL_SYS_JoystickName(int index);
+
+/* Function to open a joystick for use.
+ The joystick to open is specified by the index field of the joystick.
+ This should fill the nbuttons and naxes fields of the joystick structure.
+ It returns 0, or -1 if there is an error.
+ */
+extern int SDL_SYS_JoystickOpen(SDL_Joystick * joystick);
+
+/* Function to update the state of a joystick - called as a device poll.
+ * This function shouldn't update the joystick structure directly,
+ * but instead should call SDL_PrivateJoystick*() to deliver events
+ * and update joystick device state.
+ */
+extern void SDL_SYS_JoystickUpdate(SDL_Joystick * joystick);
+
+/* Function to close a joystick after use */
+extern void SDL_SYS_JoystickClose(SDL_Joystick * joystick);
+
+/* Function to perform any system-specific joystick related cleanup */
+extern void SDL_SYS_JoystickQuit(void);
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick.c b/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick.c
new file mode 100644
index 0000000..824917f
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick.c
@@ -0,0 +1,847 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#ifdef SDL_JOYSTICK_IOKIT
+
+/* SDL joystick driver for Darwin / Mac OS X, based on the IOKit HID API */
+/* Written 2001 by Max Horn */
+
+#include <unistd.h>
+#include <ctype.h>
+#include <sysexits.h>
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+#ifdef MACOS_10_0_4
+#include <IOKit/hidsystem/IOHIDUsageTables.h>
+#else
+/* The header was moved here in Mac OS X 10.1 */
+#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>
+#endif
+#include <IOKit/hid/IOHIDLib.h>
+#include <IOKit/hid/IOHIDKeys.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <Carbon/Carbon.h> /* for NewPtrClear, DisposePtr */
+
+/* For force feedback testing. */
+#include <ForceFeedback/ForceFeedback.h>
+#include <ForceFeedback/ForceFeedbackConstants.h>
+
+#include "SDL_joystick.h"
+#include "../SDL_sysjoystick.h"
+#include "../SDL_joystick_c.h"
+#include "SDL_sysjoystick_c.h"
+
+
+/* Linked list of all available devices */
+static recDevice *gpDeviceList = NULL;
+
+
+static void
+HIDReportErrorNum(char *strError, long numError)
+{
+ SDL_SetError(strError);
+}
+
+static void HIDGetCollectionElements(CFMutableDictionaryRef deviceProperties,
+ recDevice * pDevice);
+
+/* returns current value for element, polling element
+ * will return 0 on error conditions which should be accounted for by application
+ */
+
+static SInt32
+HIDGetElementValue(recDevice * pDevice, recElement * pElement)
+{
+ IOReturn result = kIOReturnSuccess;
+ IOHIDEventStruct hidEvent;
+ hidEvent.value = 0;
+
+ if (NULL != pDevice && NULL != pElement && NULL != pDevice->interface) {
+ result =
+ (*(pDevice->interface))->getElementValue(pDevice->interface,
+ pElement->cookie,
+ &hidEvent);
+ if (kIOReturnSuccess == result) {
+ /* record min and max for auto calibration */
+ if (hidEvent.value < pElement->minReport)
+ pElement->minReport = hidEvent.value;
+ if (hidEvent.value > pElement->maxReport)
+ pElement->maxReport = hidEvent.value;
+ }
+ }
+
+ /* auto user scale */
+ return hidEvent.value;
+}
+
+static SInt32
+HIDScaledCalibratedValue(recDevice * pDevice, recElement * pElement,
+ long min, long max)
+{
+ float deviceScale = max - min;
+ float readScale = pElement->maxReport - pElement->minReport;
+ SInt32 value = HIDGetElementValue(pDevice, pElement);
+ if (readScale == 0)
+ return value; /* no scaling at all */
+ else
+ return ((value - pElement->minReport) * deviceScale / readScale) +
+ min;
+}
+
+
+static void
+HIDRemovalCallback(void *target, IOReturn result, void *refcon, void *sender)
+{
+ recDevice *device = (recDevice *) refcon;
+ device->removed = 1;
+ device->uncentered = 1;
+}
+
+
+
+/* Create and open an interface to device, required prior to extracting values or building queues.
+ * Note: appliction now owns the device and must close and release it prior to exiting
+ */
+
+static IOReturn
+HIDCreateOpenDeviceInterface(io_object_t hidDevice, recDevice * pDevice)
+{
+ IOReturn result = kIOReturnSuccess;
+ HRESULT plugInResult = S_OK;
+ SInt32 score = 0;
+ IOCFPlugInInterface **ppPlugInInterface = NULL;
+
+ if (NULL == pDevice->interface) {
+ result =
+ IOCreatePlugInInterfaceForService(hidDevice,
+ kIOHIDDeviceUserClientTypeID,
+ kIOCFPlugInInterfaceID,
+ &ppPlugInInterface, &score);
+ if (kIOReturnSuccess == result) {
+ /* Call a method of the intermediate plug-in to create the device interface */
+ plugInResult =
+ (*ppPlugInInterface)->QueryInterface(ppPlugInInterface,
+ CFUUIDGetUUIDBytes
+ (kIOHIDDeviceInterfaceID),
+ (void *)
+ &(pDevice->interface));
+ if (S_OK != plugInResult)
+ HIDReportErrorNum
+ ("CouldnÕt query HID class device interface from plugInInterface",
+ plugInResult);
+ (*ppPlugInInterface)->Release(ppPlugInInterface);
+ } else
+ HIDReportErrorNum
+ ("Failed to create **plugInInterface via IOCreatePlugInInterfaceForService.",
+ result);
+ }
+ if (NULL != pDevice->interface) {
+ result = (*(pDevice->interface))->open(pDevice->interface, 0);
+ if (kIOReturnSuccess != result)
+ HIDReportErrorNum
+ ("Failed to open pDevice->interface via open.", result);
+ else
+ (*(pDevice->interface))->setRemovalCallback(pDevice->interface,
+ HIDRemovalCallback,
+ pDevice, pDevice);
+
+ }
+ return result;
+}
+
+/* Closes and releases interface to device, should be done prior to exting application
+ * Note: will have no affect if device or interface do not exist
+ * application will "own" the device if interface is not closed
+ * (device may have to be plug and re-plugged in different location to get it working again without a restart)
+ */
+
+static IOReturn
+HIDCloseReleaseInterface(recDevice * pDevice)
+{
+ IOReturn result = kIOReturnSuccess;
+
+ if ((NULL != pDevice) && (NULL != pDevice->interface)) {
+ /* close the interface */
+ result = (*(pDevice->interface))->close(pDevice->interface);
+ if (kIOReturnNotOpen == result) {
+ /* do nothing as device was not opened, thus can't be closed */
+ } else if (kIOReturnSuccess != result)
+ HIDReportErrorNum("Failed to close IOHIDDeviceInterface.",
+ result);
+ /* release the interface */
+ result = (*(pDevice->interface))->Release(pDevice->interface);
+ if (kIOReturnSuccess != result)
+ HIDReportErrorNum("Failed to release IOHIDDeviceInterface.",
+ result);
+ pDevice->interface = NULL;
+ }
+ return result;
+}
+
+/* extracts actual specific element information from each element CF dictionary entry */
+
+static void
+HIDGetElementInfo(CFTypeRef refElement, recElement * pElement)
+{
+ long number;
+ CFTypeRef refType;
+
+ refType = CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementCookieKey));
+ if (refType && CFNumberGetValue(refType, kCFNumberLongType, &number))
+ pElement->cookie = (IOHIDElementCookie) number;
+ refType = CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementMinKey));
+ if (refType && CFNumberGetValue(refType, kCFNumberLongType, &number))
+ pElement->minReport = pElement->min = number;
+ pElement->maxReport = pElement->min;
+ refType = CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementMaxKey));
+ if (refType && CFNumberGetValue(refType, kCFNumberLongType, &number))
+ pElement->maxReport = pElement->max = number;
+/*
+ TODO: maybe should handle the following stuff somehow?
+
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementScaledMinKey));
+ if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
+ pElement->scaledMin = number;
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementScaledMaxKey));
+ if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
+ pElement->scaledMax = number;
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementSizeKey));
+ if (refType && CFNumberGetValue (refType, kCFNumberLongType, &number))
+ pElement->size = number;
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementIsRelativeKey));
+ if (refType)
+ pElement->relative = CFBooleanGetValue (refType);
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementIsWrappingKey));
+ if (refType)
+ pElement->wrapping = CFBooleanGetValue (refType);
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementIsNonLinearKey));
+ if (refType)
+ pElement->nonLinear = CFBooleanGetValue (refType);
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementHasPreferedStateKey));
+ if (refType)
+ pElement->preferredState = CFBooleanGetValue (refType);
+ refType = CFDictionaryGetValue (refElement, CFSTR(kIOHIDElementHasNullStateKey));
+ if (refType)
+ pElement->nullState = CFBooleanGetValue (refType);
+*/
+}
+
+/* examines CF dictionary vlaue in device element hierarchy to determine if it is element of interest or a collection of more elements
+ * if element of interest allocate storage, add to list and retrieve element specific info
+ * if collection then pass on to deconstruction collection into additional individual elements
+ */
+
+static void
+HIDAddElement(CFTypeRef refElement, recDevice * pDevice)
+{
+ recElement *element = NULL;
+ recElement **headElement = NULL;
+ long elementType, usagePage, usage;
+ CFTypeRef refElementType =
+ CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementTypeKey));
+ CFTypeRef refUsagePage =
+ CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementUsagePageKey));
+ CFTypeRef refUsage =
+ CFDictionaryGetValue(refElement, CFSTR(kIOHIDElementUsageKey));
+
+
+ if ((refElementType)
+ &&
+ (CFNumberGetValue(refElementType, kCFNumberLongType, &elementType))) {
+ /* look at types of interest */
+ if ((elementType == kIOHIDElementTypeInput_Misc)
+ || (elementType == kIOHIDElementTypeInput_Button)
+ || (elementType == kIOHIDElementTypeInput_Axis)) {
+ if (refUsagePage
+ && CFNumberGetValue(refUsagePage, kCFNumberLongType,
+ &usagePage) && refUsage
+ && CFNumberGetValue(refUsage, kCFNumberLongType, &usage)) {
+ switch (usagePage) { /* only interested in kHIDPage_GenericDesktop and kHIDPage_Button */
+ case kHIDPage_GenericDesktop:
+ {
+ switch (usage) { /* look at usage to determine function */
+ case kHIDUsage_GD_X:
+ case kHIDUsage_GD_Y:
+ case kHIDUsage_GD_Z:
+ case kHIDUsage_GD_Rx:
+ case kHIDUsage_GD_Ry:
+ case kHIDUsage_GD_Rz:
+ case kHIDUsage_GD_Slider:
+ case kHIDUsage_GD_Dial:
+ case kHIDUsage_GD_Wheel:
+ element = (recElement *)
+ NewPtrClear(sizeof(recElement));
+ if (element) {
+ pDevice->axes++;
+ headElement = &(pDevice->firstAxis);
+ }
+ break;
+ case kHIDUsage_GD_Hatswitch:
+ element = (recElement *)
+ NewPtrClear(sizeof(recElement));
+ if (element) {
+ pDevice->hats++;
+ headElement = &(pDevice->firstHat);
+ }
+ break;
+ }
+ }
+ break;
+ case kHIDPage_Button:
+ element = (recElement *)
+ NewPtrClear(sizeof(recElement));
+ if (element) {
+ pDevice->buttons++;
+ headElement = &(pDevice->firstButton);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ } else if (kIOHIDElementTypeCollection == elementType)
+ HIDGetCollectionElements((CFMutableDictionaryRef) refElement,
+ pDevice);
+ }
+
+ if (element && headElement) { /* add to list */
+ recElement *elementPrevious = NULL;
+ recElement *elementCurrent = *headElement;
+ while (elementCurrent && usage >= elementCurrent->usage) {
+ elementPrevious = elementCurrent;
+ elementCurrent = elementCurrent->pNext;
+ }
+ if (elementPrevious) {
+ elementPrevious->pNext = element;
+ } else {
+ *headElement = element;
+ }
+ element->usagePage = usagePage;
+ element->usage = usage;
+ element->pNext = elementCurrent;
+ HIDGetElementInfo(refElement, element);
+ pDevice->elements++;
+ }
+}
+
+/* collects information from each array member in device element list (each array memeber = element) */
+
+static void
+HIDGetElementsCFArrayHandler(const void *value, void *parameter)
+{
+ if (CFGetTypeID(value) == CFDictionaryGetTypeID())
+ HIDAddElement((CFTypeRef) value, (recDevice *) parameter);
+}
+
+/* handles retrieval of element information from arrays of elements in device IO registry information */
+
+static void
+HIDGetElements(CFTypeRef refElementCurrent, recDevice * pDevice)
+{
+ CFTypeID type = CFGetTypeID(refElementCurrent);
+ if (type == CFArrayGetTypeID()) { /* if element is an array */
+ CFRange range = { 0, CFArrayGetCount(refElementCurrent) };
+ /* CountElementsCFArrayHandler called for each array member */
+ CFArrayApplyFunction(refElementCurrent, range,
+ HIDGetElementsCFArrayHandler, pDevice);
+ }
+}
+
+/* handles extracting element information from element collection CF types
+ * used from top level element decoding and hierarchy deconstruction to flatten device element list
+ */
+
+static void
+HIDGetCollectionElements(CFMutableDictionaryRef deviceProperties,
+ recDevice * pDevice)
+{
+ CFTypeRef refElementTop =
+ CFDictionaryGetValue(deviceProperties, CFSTR(kIOHIDElementKey));
+ if (refElementTop)
+ HIDGetElements(refElementTop, pDevice);
+}
+
+/* use top level element usage page and usage to discern device usage page and usage setting appropriate vlaues in device record */
+
+static void
+HIDTopLevelElementHandler(const void *value, void *parameter)
+{
+ CFTypeRef refCF = 0;
+ if (CFGetTypeID(value) != CFDictionaryGetTypeID())
+ return;
+ refCF = CFDictionaryGetValue(value, CFSTR(kIOHIDElementUsagePageKey));
+ if (!CFNumberGetValue
+ (refCF, kCFNumberLongType, &((recDevice *) parameter)->usagePage))
+ SDL_SetError("CFNumberGetValue error retrieving pDevice->usagePage.");
+ refCF = CFDictionaryGetValue(value, CFSTR(kIOHIDElementUsageKey));
+ if (!CFNumberGetValue
+ (refCF, kCFNumberLongType, &((recDevice *) parameter)->usage))
+ SDL_SetError("CFNumberGetValue error retrieving pDevice->usage.");
+}
+
+/* extracts device info from CF dictionary records in IO registry */
+
+static void
+HIDGetDeviceInfo(io_object_t hidDevice, CFMutableDictionaryRef hidProperties,
+ recDevice * pDevice)
+{
+ CFMutableDictionaryRef usbProperties = 0;
+ io_registry_entry_t parent1, parent2;
+
+ /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also
+ * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties
+ */
+ if ((KERN_SUCCESS ==
+ IORegistryEntryGetParentEntry(hidDevice, kIOServicePlane, &parent1))
+ && (KERN_SUCCESS ==
+ IORegistryEntryGetParentEntry(parent1, kIOServicePlane, &parent2))
+ && (KERN_SUCCESS ==
+ IORegistryEntryCreateCFProperties(parent2, &usbProperties,
+ kCFAllocatorDefault,
+ kNilOptions))) {
+ if (usbProperties) {
+ CFTypeRef refCF = 0;
+ /* get device info
+ * try hid dictionary first, if fail then go to usb dictionary
+ */
+
+
+ /* get product name */
+ refCF =
+ CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDProductKey));
+ if (!refCF)
+ refCF =
+ CFDictionaryGetValue(usbProperties,
+ CFSTR("USB Product Name"));
+ if (refCF) {
+ if (!CFStringGetCString
+ (refCF, pDevice->product, 256,
+ CFStringGetSystemEncoding()))
+ SDL_SetError
+ ("CFStringGetCString error retrieving pDevice->product.");
+ }
+
+ /* get usage page and usage */
+ refCF =
+ CFDictionaryGetValue(hidProperties,
+ CFSTR(kIOHIDPrimaryUsagePageKey));
+ if (refCF) {
+ if (!CFNumberGetValue
+ (refCF, kCFNumberLongType, &pDevice->usagePage))
+ SDL_SetError
+ ("CFNumberGetValue error retrieving pDevice->usagePage.");
+ refCF =
+ CFDictionaryGetValue(hidProperties,
+ CFSTR(kIOHIDPrimaryUsageKey));
+ if (refCF)
+ if (!CFNumberGetValue
+ (refCF, kCFNumberLongType, &pDevice->usage))
+ SDL_SetError
+ ("CFNumberGetValue error retrieving pDevice->usage.");
+ }
+
+ if (NULL == refCF) { /* get top level element HID usage page or usage */
+ /* use top level element instead */
+ CFTypeRef refCFTopElement = 0;
+ refCFTopElement =
+ CFDictionaryGetValue(hidProperties,
+ CFSTR(kIOHIDElementKey));
+ {
+ /* refCFTopElement points to an array of element dictionaries */
+ CFRange range = { 0, CFArrayGetCount(refCFTopElement) };
+ CFArrayApplyFunction(refCFTopElement, range,
+ HIDTopLevelElementHandler, pDevice);
+ }
+ }
+
+ CFRelease(usbProperties);
+ } else
+ SDL_SetError
+ ("IORegistryEntryCreateCFProperties failed to create usbProperties.");
+
+ if (kIOReturnSuccess != IOObjectRelease(parent2))
+ SDL_SetError("IOObjectRelease error with parent2.");
+ if (kIOReturnSuccess != IOObjectRelease(parent1))
+ SDL_SetError("IOObjectRelease error with parent1.");
+ }
+}
+
+
+static recDevice *
+HIDBuildDevice(io_object_t hidDevice)
+{
+ recDevice *pDevice = (recDevice *) NewPtrClear(sizeof(recDevice));
+ if (pDevice) {
+ /* get dictionary for HID properties */
+ CFMutableDictionaryRef hidProperties = 0;
+ kern_return_t result =
+ IORegistryEntryCreateCFProperties(hidDevice, &hidProperties,
+ kCFAllocatorDefault,
+ kNilOptions);
+ if ((result == KERN_SUCCESS) && hidProperties) {
+ /* create device interface */
+ result = HIDCreateOpenDeviceInterface(hidDevice, pDevice);
+ if (kIOReturnSuccess == result) {
+ HIDGetDeviceInfo(hidDevice, hidProperties, pDevice); /* hidDevice used to find parents in registry tree */
+ HIDGetCollectionElements(hidProperties, pDevice);
+ } else {
+ DisposePtr((Ptr) pDevice);
+ pDevice = NULL;
+ }
+ CFRelease(hidProperties);
+ } else {
+ DisposePtr((Ptr) pDevice);
+ pDevice = NULL;
+ }
+ }
+ return pDevice;
+}
+
+/* disposes of the element list associated with a device and the memory associated with the list
+ */
+
+static void
+HIDDisposeElementList(recElement ** elementList)
+{
+ recElement *pElement = *elementList;
+ while (pElement) {
+ recElement *pElementNext = pElement->pNext;
+ DisposePtr((Ptr) pElement);
+ pElement = pElementNext;
+ }
+ *elementList = NULL;
+}
+
+/* disposes of a single device, closing and releaseing interface, freeing memory fro device and elements, setting device pointer to NULL
+ * all your device no longer belong to us... (i.e., you do not 'own' the device anymore)
+ */
+
+static recDevice *
+HIDDisposeDevice(recDevice ** ppDevice)
+{
+ kern_return_t result = KERN_SUCCESS;
+ recDevice *pDeviceNext = NULL;
+ if (*ppDevice) {
+ /* save next device prior to disposing of this device */
+ pDeviceNext = (*ppDevice)->pNext;
+
+ /* free posible io_service_t */
+ if ((*ppDevice)->ffservice) {
+ IOObjectRelease((*ppDevice)->ffservice);
+ (*ppDevice)->ffservice = 0;
+ }
+
+ /* free element lists */
+ HIDDisposeElementList(&(*ppDevice)->firstAxis);
+ HIDDisposeElementList(&(*ppDevice)->firstButton);
+ HIDDisposeElementList(&(*ppDevice)->firstHat);
+
+ result = HIDCloseReleaseInterface(*ppDevice); /* function sanity checks interface value (now application does not own device) */
+ if (kIOReturnSuccess != result)
+ HIDReportErrorNum
+ ("HIDCloseReleaseInterface failed when trying to dipose device.",
+ result);
+ DisposePtr((Ptr) * ppDevice);
+ *ppDevice = NULL;
+ }
+ return pDeviceNext;
+}
+
+
+/* Function to scan the system for joysticks.
+ * Joystick 0 should be the system default joystick.
+ * This function should return the number of available joysticks, or -1
+ * on an unrecoverable fatal error.
+ */
+int
+SDL_SYS_JoystickInit(void)
+{
+ IOReturn result = kIOReturnSuccess;
+ mach_port_t masterPort = 0;
+ io_iterator_t hidObjectIterator = 0;
+ CFMutableDictionaryRef hidMatchDictionary = NULL;
+ recDevice *device, *lastDevice;
+ io_object_t ioHIDDeviceObject = 0;
+
+ SDL_numjoysticks = 0;
+
+ if (gpDeviceList) {
+ SDL_SetError("Joystick: Device list already inited.");
+ return -1;
+ }
+
+ result = IOMasterPort(bootstrap_port, &masterPort);
+ if (kIOReturnSuccess != result) {
+ SDL_SetError("Joystick: IOMasterPort error with bootstrap_port.");
+ return -1;
+ }
+
+ /* Set up a matching dictionary to search I/O Registry by class name for all HID class devices. */
+ hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
+ if (hidMatchDictionary) {
+ /* Add key for device type (joystick, in this case) to refine the matching dictionary. */
+
+ /* NOTE: we now perform this filtering later
+ UInt32 usagePage = kHIDPage_GenericDesktop;
+ UInt32 usage = kHIDUsage_GD_Joystick;
+ CFNumberRef refUsage = NULL, refUsagePage = NULL;
+
+ refUsage = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &usage);
+ CFDictionarySetValue (hidMatchDictionary, CFSTR (kIOHIDPrimaryUsageKey), refUsage);
+ refUsagePage = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &usagePage);
+ CFDictionarySetValue (hidMatchDictionary, CFSTR (kIOHIDPrimaryUsagePageKey), refUsagePage);
+ */
+ } else {
+ SDL_SetError
+ ("Joystick: Failed to get HID CFMutableDictionaryRef via IOServiceMatching.");
+ return -1;
+ }
+
+ /*/ Now search I/O Registry for matching devices. */
+ result =
+ IOServiceGetMatchingServices(masterPort, hidMatchDictionary,
+ &hidObjectIterator);
+ /* Check for errors */
+ if (kIOReturnSuccess != result) {
+ SDL_SetError("Joystick: Couldn't create a HID object iterator.");
+ return -1;
+ }
+ if (!hidObjectIterator) { /* there are no joysticks */
+ gpDeviceList = NULL;
+ SDL_numjoysticks = 0;
+ return 0;
+ }
+ /* IOServiceGetMatchingServices consumes a reference to the dictionary, so we don't need to release the dictionary ref. */
+
+ /* build flat linked list of devices from device iterator */
+
+ gpDeviceList = lastDevice = NULL;
+
+ while ((ioHIDDeviceObject = IOIteratorNext(hidObjectIterator))) {
+ /* build a device record */
+ device = HIDBuildDevice(ioHIDDeviceObject);
+ if (!device)
+ continue;
+
+ /* Filter device list to non-keyboard/mouse stuff */
+ if ((device->usagePage != kHIDPage_GenericDesktop) ||
+ ((device->usage != kHIDUsage_GD_Joystick &&
+ device->usage != kHIDUsage_GD_GamePad &&
+ device->usage != kHIDUsage_GD_MultiAxisController))) {
+
+ /* release memory for the device */
+ HIDDisposeDevice(&device);
+ DisposePtr((Ptr) device);
+ continue;
+ }
+
+ /* We have to do some storage of the io_service_t for
+ * SDL_HapticOpenFromJoystick */
+ if (FFIsForceFeedback(ioHIDDeviceObject) == FF_OK) {
+ device->ffservice = ioHIDDeviceObject;
+ } else {
+ device->ffservice = 0;
+ }
+
+ /* Add device to the end of the list */
+ if (lastDevice)
+ lastDevice->pNext = device;
+ else
+ gpDeviceList = device;
+ lastDevice = device;
+ }
+ result = IOObjectRelease(hidObjectIterator); /* release the iterator */
+
+ /* Count the total number of devices we found */
+ device = gpDeviceList;
+ while (device) {
+ SDL_numjoysticks++;
+ device = device->pNext;
+ }
+
+ return SDL_numjoysticks;
+}
+
+/* Function to get the device-dependent name of a joystick */
+const char *
+SDL_SYS_JoystickName(int index)
+{
+ recDevice *device = gpDeviceList;
+
+ for (; index > 0; index--)
+ device = device->pNext;
+
+ return device->product;
+}
+
+/* Function to open a joystick for use.
+ * The joystick to open is specified by the index field of the joystick.
+ * This should fill the nbuttons and naxes fields of the joystick structure.
+ * It returns 0, or -1 if there is an error.
+ */
+int
+SDL_SYS_JoystickOpen(SDL_Joystick * joystick)
+{
+ recDevice *device = gpDeviceList;
+ int index;
+
+ for (index = joystick->index; index > 0; index--)
+ device = device->pNext;
+
+ joystick->hwdata = device;
+ joystick->name = device->product;
+
+ joystick->naxes = device->axes;
+ joystick->nhats = device->hats;
+ joystick->nballs = 0;
+ joystick->nbuttons = device->buttons;
+
+ return 0;
+}
+
+/* Function to update the state of a joystick - called as a device poll.
+ * This function shouldn't update the joystick structure directly,
+ * but instead should call SDL_PrivateJoystick*() to deliver events
+ * and update joystick device state.
+ */
+void
+SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
+{
+ recDevice *device = joystick->hwdata;
+ recElement *element;
+ SInt32 value, range;
+ int i;
+
+ if (device->removed) { /* device was unplugged; ignore it. */
+ if (device->uncentered) {
+ device->uncentered = 0;
+
+ /* Tell the app that everything is centered/unpressed... */
+ for (i = 0; i < device->axes; i++)
+ SDL_PrivateJoystickAxis(joystick, i, 0);
+
+ for (i = 0; i < device->buttons; i++)
+ SDL_PrivateJoystickButton(joystick, i, 0);
+
+ for (i = 0; i < device->hats; i++)
+ SDL_PrivateJoystickHat(joystick, i, SDL_HAT_CENTERED);
+ }
+
+ return;
+ }
+
+ element = device->firstAxis;
+ i = 0;
+ while (element) {
+ value = HIDScaledCalibratedValue(device, element, -32768, 32767);
+ if (value != joystick->axes[i])
+ SDL_PrivateJoystickAxis(joystick, i, value);
+ element = element->pNext;
+ ++i;
+ }
+
+ element = device->firstButton;
+ i = 0;
+ while (element) {
+ value = HIDGetElementValue(device, element);
+ if (value > 1) /* handle pressure-sensitive buttons */
+ value = 1;
+ if (value != joystick->buttons[i])
+ SDL_PrivateJoystickButton(joystick, i, value);
+ element = element->pNext;
+ ++i;
+ }
+
+ element = device->firstHat;
+ i = 0;
+ while (element) {
+ Uint8 pos = 0;
+
+ range = (element->max - element->min + 1);
+ value = HIDGetElementValue(device, element) - element->min;
+ if (range == 4) /* 4 position hatswitch - scale up value */
+ value *= 2;
+ else if (range != 8) /* Neither a 4 nor 8 positions - fall back to default position (centered) */
+ value = -1;
+ switch (value) {
+ case 0:
+ pos = SDL_HAT_UP;
+ break;
+ case 1:
+ pos = SDL_HAT_RIGHTUP;
+ break;
+ case 2:
+ pos = SDL_HAT_RIGHT;
+ break;
+ case 3:
+ pos = SDL_HAT_RIGHTDOWN;
+ break;
+ case 4:
+ pos = SDL_HAT_DOWN;
+ break;
+ case 5:
+ pos = SDL_HAT_LEFTDOWN;
+ break;
+ case 6:
+ pos = SDL_HAT_LEFT;
+ break;
+ case 7:
+ pos = SDL_HAT_LEFTUP;
+ break;
+ default:
+ /* Every other value is mapped to center. We do that because some
+ * joysticks use 8 and some 15 for this value, and apparently
+ * there are even more variants out there - so we try to be generous.
+ */
+ pos = SDL_HAT_CENTERED;
+ break;
+ }
+ if (pos != joystick->hats[i])
+ SDL_PrivateJoystickHat(joystick, i, pos);
+ element = element->pNext;
+ ++i;
+ }
+
+ return;
+}
+
+/* Function to close a joystick after use */
+void
+SDL_SYS_JoystickClose(SDL_Joystick * joystick)
+{
+ /* Should we do anything here? */
+ return;
+}
+
+/* Function to perform any system-specific joystick related cleanup */
+void
+SDL_SYS_JoystickQuit(void)
+{
+ while (NULL != gpDeviceList)
+ gpDeviceList = HIDDisposeDevice(&gpDeviceList);
+}
+
+#endif /* SDL_JOYSTICK_IOKIT */
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick_c.h b/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick_c.h
new file mode 100644
index 0000000..d413f33
--- /dev/null
+++ b/macosx/plugins/DFInput/SDL/src/joystick/darwin/SDL_sysjoystick_c.h
@@ -0,0 +1,88 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2010 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#ifndef SDL_JOYSTICK_IOKIT_H
+
+
+#if MAC_OS_X_VERSION_MIN_REQUIRED == 1030
+#include "10.3.9-FIX/IOHIDLib.h"
+#else
+#include <IOKit/hid/IOHIDLib.h>
+#endif
+#include <IOKit/hid/IOHIDKeys.h>
+
+
+struct recElement
+{
+ IOHIDElementCookie cookie; /* unique value which identifies element, will NOT change */
+ long usagePage, usage; /* HID usage */
+ long min; /* reported min value possible */
+ long max; /* reported max value possible */
+#if 0
+ /* TODO: maybe should handle the following stuff somehow? */
+
+ long scaledMin; /* reported scaled min value possible */
+ long scaledMax; /* reported scaled max value possible */
+ long size; /* size in bits of data return from element */
+ Boolean relative; /* are reports relative to last report (deltas) */
+ Boolean wrapping; /* does element wrap around (one value higher than max is min) */
+ Boolean nonLinear; /* are the values reported non-linear relative to element movement */
+ Boolean preferredState; /* does element have a preferred state (such as a button) */
+ Boolean nullState; /* does element have null state */
+#endif /* 0 */
+
+ /* runtime variables used for auto-calibration */
+ long minReport; /* min returned value */
+ long maxReport; /* max returned value */
+
+ struct recElement *pNext; /* next element in list */
+};
+typedef struct recElement recElement;
+
+struct joystick_hwdata
+{
+ io_service_t ffservice; /* Interface for force feedback, 0 = no ff */
+ IOHIDDeviceInterface **interface; /* interface to device, NULL = no interface */
+
+ char product[256]; /* name of product */
+ long usage; /* usage page from IOUSBHID Parser.h which defines general usage */
+ long usagePage; /* usage within above page from IOUSBHID Parser.h which defines specific usage */
+
+ long axes; /* number of axis (calculated, not reported by device) */
+ long buttons; /* number of buttons (calculated, not reported by device) */
+ long hats; /* number of hat switches (calculated, not reported by device) */
+ long elements; /* number of total elements (shouldbe total of above) (calculated, not reported by device) */
+
+ recElement *firstAxis;
+ recElement *firstButton;
+ recElement *firstHat;
+
+ int removed;
+ int uncentered;
+
+ struct joystick_hwdata *pNext; /* next device */
+};
+typedef struct joystick_hwdata recDevice;
+
+
+#endif /* SDL_JOYSTICK_IOKIT_H */
diff --git a/macosx/plugins/DFInput/macsrc/ControllerList.h b/macosx/plugins/DFInput/macsrc/ControllerList.h
new file mode 100644
index 0000000..176d403
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/ControllerList.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#define ControllerList NetPcsxHIDInputPluginControllerList
+
+#import <Foundation/Foundation.h>
+#import <AppKit/NSTableView.h>
+#include "cfg.h"
+
+@class KeyConfig;
+
+@interface ControllerList : NSObject {
+}
+
+- (id)initWithConfig;
+
++ (void)setCurrentController:(int)which;
++ (int)currentController;
++ (int)getButtonOfRow:(int)row;
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView;
+- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex;
+- (void)deleteRow:(int)which;
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/ControllerList.m b/macosx/plugins/DFInput/macsrc/ControllerList.m
new file mode 100644
index 0000000..5d67370
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/ControllerList.m
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import "ControllerList.h"
+#include "pad.h"
+#include "cfg.h"
+
+static int currentController;
+
+@implementation ControllerList
+
+- (id)initWithConfig
+{
+ if (!(self = [super init])) return nil;
+ return self;
+}
+
+- (void)dealloc
+{
+ [super dealloc];
+}
+
+/* sets current controller data returned by data source */
++ (void)setCurrentController:(int)which
+{
+ currentController = which;
+}
+
++ (int)currentController
+{
+ return currentController;
+}
+
+/* NSDataSource */
+- (int)numberOfRowsInTableView:(NSTableView *)aTableView
+{
+ return DKEY_TOTAL + (g.cfg.PadDef[currentController].Type == PSE_PAD_TYPE_ANALOGPAD ? 8 : -2);
+}
+
+static const NSString *LabelText[DKEY_TOTAL + 8] = {
+ @"D-Pad Up",
+ @"D-Pad Down",
+ @"D-Pad Left",
+ @"D-Pad Right",
+ @"Cross",
+ @"Circle",
+ @"Square",
+ @"Triangle",
+ @"L1",
+ @"R1",
+ @"L2",
+ @"R2",
+ @"Select",
+ @"Start",
+ @"L3",
+ @"R3",
+ @"L-Stick Right",
+ @"L-Stick Left",
+ @"L-Stick Down",
+ @"L-Stick Up",
+ @"R-Stick Right",
+ @"R-Stick Left",
+ @"R-Stick Down",
+ @"R-Stick Up"
+};
+
+static const int DPad[DKEY_TOTAL] = {
+ DKEY_UP,
+ DKEY_DOWN,
+ DKEY_LEFT,
+ DKEY_RIGHT,
+ DKEY_CROSS,
+ DKEY_CIRCLE,
+ DKEY_SQUARE,
+ DKEY_TRIANGLE,
+ DKEY_L1,
+ DKEY_R1,
+ DKEY_L2,
+ DKEY_R2,
+ DKEY_SELECT,
+ DKEY_START,
+ DKEY_L3,
+ DKEY_R3
+};
+
++ (int)getButtonOfRow:(int)row
+{
+ return DPad[row];
+}
+
+- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn
+ row:(int)rowIndex
+{
+ char buf[256];
+
+ if ([((NSString *)[aTableColumn identifier]) isEqualToString:@"key"])
+ return LabelText[rowIndex];
+ else {
+ // actual keys
+ if (rowIndex < DKEY_TOTAL) {
+ GetKeyDescription(buf, currentController, DPad[rowIndex]);
+ } else {
+ rowIndex -= DKEY_TOTAL;
+ GetAnalogDescription(buf, currentController, rowIndex / 4, rowIndex % 4);
+ }
+
+ return [NSString stringWithUTF8String:buf];
+ }
+}
+
+- (void)deleteRow:(int)which
+{
+ if (which < DKEY_TOTAL) {
+ g.cfg.PadDef[currentController].KeyDef[DPad[which]].Key = 0;
+ g.cfg.PadDef[currentController].KeyDef[DPad[which]].JoyEvType = NONE;
+ g.cfg.PadDef[currentController].KeyDef[DPad[which]].J.d = 0;
+ } else {
+ which -= DKEY_TOTAL;
+ g.cfg.PadDef[currentController].AnalogDef[which / 4][which % 4].Key = 0;
+ g.cfg.PadDef[currentController].AnalogDef[which / 4][which % 4].JoyEvType = NONE;
+ g.cfg.PadDef[currentController].AnalogDef[which / 4][which % 4].J.d = 0;
+ }
+}
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/MappingCell.h b/macosx/plugins/DFInput/macsrc/MappingCell.h
new file mode 100644
index 0000000..f803696
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/MappingCell.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#define MappingCell NetPcsxHIDInputPluginMappingCell
+
+#import <AppKit/AppKit.h>
+
+@interface MappingCell : NSTextFieldCell {
+}
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/MappingCell.m b/macosx/plugins/DFInput/macsrc/MappingCell.m
new file mode 100644
index 0000000..0fb43bd
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/MappingCell.m
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import "MappingCell.h"
+#import "ControllerList.h"
+#import "cfg.h"
+
+@implementation MappingCell
+
+- (id)initTextCell:(NSString *)aString {
+ self = [super initTextCell:aString];
+ [self setEditable:NO];
+ return self;
+}
+
+- (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength
+{
+ [super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength];
+
+ int whichPad = [ControllerList currentController];
+ NSTableView *tableView = (NSTableView *)[self controlView];
+ int i, changed = 0, row;
+ NSEvent *endEvent;
+ NSPoint where = {0.0, 0.0};
+
+ /* start a modal session */
+ NSModalSession session = [NSApp beginModalSessionForWindow:[tableView window]];
+ [NSApp runModalSession:session];
+
+ /* delay for a little while to allow user to release the button pressed to activate the element */
+ [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.15]];
+
+ InitAxisPos(whichPad);
+
+ /* wait for 10 seconds for user to press a key */
+ for (i = 0; i < 10; i++) {
+ [NSApp runModalSession:session];
+ row = [tableView selectedRow];
+ if (row < DKEY_TOTAL) {
+ changed = ReadDKeyEvent(whichPad, [ControllerList getButtonOfRow:row]);
+ } else {
+ row -= DKEY_TOTAL;
+ changed = ReadAnalogEvent(whichPad, row / 4, row % 4);
+ }
+
+ if (changed) break;
+ }
+
+ [NSApp endModalSession:session];
+
+ /* move selection to the next list element */
+ [self endEditing:textObj];
+ if (changed == 1) {
+ int nextRow = [tableView selectedRow] + 1;
+ if (nextRow >= [tableView numberOfRows]) {
+ [tableView deselectAll:self];
+ return;
+ }
+ [tableView selectRow:nextRow byExtendingSelection:NO];
+
+ /* discard any events we have received while waiting for the button press */
+ endEvent = [NSEvent otherEventWithType:NSApplicationDefined location:where
+ modifierFlags:0 timestamp:(NSTimeInterval)0
+ windowNumber:0 context:[NSGraphicsContext currentContext] subtype:0 data1:0 data2:0];
+ [NSApp postEvent:endEvent atStart:NO];
+ [NSApp discardEventsMatchingMask:NSAnyEventMask beforeEvent:endEvent];
+ }
+ [[tableView window] makeFirstResponder:tableView];
+}
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/PadController.h b/macosx/plugins/DFInput/macsrc/PadController.h
new file mode 100644
index 0000000..26a5a15
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/PadController.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#define PadController NetPcsxHIDInputPluginPadController
+
+#import <Cocoa/Cocoa.h>
+#import "PadView.h"
+
+@class PadView;
+
+@interface PadController : NSWindowController
+{
+ IBOutlet PadView *controllerView;
+ IBOutlet id controllerView1;
+ IBOutlet id controllerView2;
+}
+
+- (IBAction)cancel:(id)sender;
+- (IBAction)ok:(id)sender;
+@end
diff --git a/macosx/plugins/DFInput/macsrc/PadController.m b/macosx/plugins/DFInput/macsrc/PadController.m
new file mode 100644
index 0000000..06bce2e
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/PadController.m
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import <Cocoa/Cocoa.h>
+#import "PadController.h"
+#include "pad.h"
+
+static NSWindow *padWindow;
+static PadController *padController;
+
+#define APP_ID @"net.pcsx.DFInputPlugin"
+
+void DoAbout() {
+ // Get parent application instance
+ NSApplication *app = [NSApplication sharedApplication];
+ NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID];
+
+ // Get Credits.rtf
+ NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"];
+ NSAttributedString *credits;
+ if (path) {
+ credits = [[[NSAttributedString alloc] initWithPath: path
+ documentAttributes:NULL] autorelease];
+ } else {
+ credits = [[[NSAttributedString alloc] initWithString:@""] autorelease];
+ }
+
+ // Get Application Icon
+ NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]];
+ NSSize size = NSMakeSize(64, 64);
+ [icon setSize:size];
+
+ [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:
+ [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName",
+ icon, @"ApplicationIcon",
+ [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion",
+ [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version",
+ [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright",
+ credits, @"Credits", nil]];
+}
+
+long DoConfiguration() {
+ SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_NOPARACHUTE);
+ LoadPADConfig();
+
+ if (padWindow == nil) {
+ if (padController == nil) {
+ padController = [[PadController alloc] initWithWindowNibName:@"NetPcsxHIDInputPluginMain"];
+ }
+ padWindow = [padController window];
+ }
+
+ [padWindow center];
+ [padWindow makeKeyAndOrderFront:nil];
+
+ return 0;
+}
+
+@implementation PadController
+
+- (IBAction)cancel:(id)sender
+{
+ SDL_Quit();
+ [self close];
+}
+
+- (IBAction)ok:(id)sender
+{
+ SavePADConfig();
+ SDL_Quit();
+ [self close];
+}
+
+- (void)awakeFromNib
+{
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(windowWillClose:)
+ name:NSWindowWillCloseNotification object:[self window]];
+
+ [controllerView1 addSubview: controllerView];
+ [controllerView setController:0];
+}
+
+- (void)tabView:(NSTabView *)tabView didSelectTabViewItem:(NSTabViewItem *)tabViewItem
+{
+ PadView *newView = nil;
+ if ([[tabViewItem identifier] isEqualToString:@"pad1"])
+ newView = controllerView1;
+ else if ([[tabViewItem identifier] isEqualToString:@"pad2"])
+ newView = controllerView2;
+
+ if (nil != newView) {
+ [controllerView removeFromSuperviewWithoutNeedingDisplay];
+ [newView addSubview: controllerView];
+ [controllerView setFrame:[newView frame]];
+ [controllerView setController:[newView isEqual:controllerView1] ? 0 : 1];
+ }
+}
+
+- (void)windowBecameKey:(NSNotification *)notification
+{
+ if ([[controllerView1 subviews] count] > 0)
+ [controllerView setController:0];
+ else if ([[controllerView2 subviews] count] > 0)
+ [controllerView setController:1];
+
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:NSWindowDidBecomeKeyNotification object:[self window]];
+}
+
+- (void)windowWillClose:(NSNotification *)aNotification
+{
+ if ([aNotification object] == [self window]) {
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(windowBecameKey:)
+ name:NSWindowDidBecomeKeyNotification object:[self window]];
+ }
+}
+
+@end \ No newline at end of file
diff --git a/macosx/plugins/DFInput/macsrc/PadView.h b/macosx/plugins/DFInput/macsrc/PadView.h
new file mode 100644
index 0000000..f99686c
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/PadView.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#define PadView NetPcsxHIDInputPluginPadView
+
+#import <Cocoa/Cocoa.h>
+#import "ControllerList.h"
+
+@class ControllerList;
+
+@interface PadView : NSView
+{
+ IBOutlet NSTableView *tableView;
+ IBOutlet NSPopUpButton *typeMenu;
+ IBOutlet NSPopUpButton *deviceMenu;
+
+ ControllerList *controller;
+}
+- (IBAction)setType:(id)sender;
+- (IBAction)setDevice:(id)sender;
+
+- (void)setController:(int)which;
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/PadView.m b/macosx/plugins/DFInput/macsrc/PadView.m
new file mode 100644
index 0000000..b0ed273
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/PadView.m
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * Based on: HIDInput by Gil Pedersen.
+ * Copyright (c) 2004, Gil Pedersen.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#import "PadView.h"
+#include "pad.h"
+
+@implementation PadView
+
+- (id)initWithFrame:(NSRect)frameRect
+{
+ if ((self = [super initWithFrame:frameRect]) != nil) {
+ controller = [[ControllerList alloc] initWithConfig];
+ [self setController:0];
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [controller release];
+ [super dealloc];
+}
+
+- (void)drawRect:(NSRect)rect
+{
+}
+
+- (IBAction)setType:(id)sender
+{
+ g.cfg.PadDef[[ControllerList currentController]].Type =
+ ([sender indexOfSelectedItem] > 0 ? PSE_PAD_TYPE_ANALOGPAD : PSE_PAD_TYPE_STANDARD);
+
+ [tableView reloadData];
+}
+
+- (IBAction)setDevice:(id)sender
+{
+ g.cfg.PadDef[[ControllerList currentController]].DevNum = (int)[sender indexOfSelectedItem] - 1;
+}
+
+- (void)setController:(int)which
+{
+ int i;
+
+ [ControllerList setCurrentController:which];
+ [tableView setDataSource:controller];
+
+ [deviceMenu removeAllItems];
+ [deviceMenu addItemWithTitle:@"(Keyboard only)"];
+
+ for (i = 0; i < SDL_NumJoysticks(); i++) {
+ [deviceMenu addItemWithTitle:[NSString stringWithUTF8String:SDL_JoystickName(i)]];
+ }
+
+ if (g.cfg.PadDef[which].DevNum >= SDL_NumJoysticks()) {
+ g.cfg.PadDef[which].DevNum = -1;
+ }
+
+ [deviceMenu selectItemAtIndex:g.cfg.PadDef[which].DevNum + 1];
+ [typeMenu selectItemAtIndex:(g.cfg.PadDef[which].Type == PSE_PAD_TYPE_ANALOGPAD ? 1 : 0)];
+
+ [tableView reloadData];
+}
+
+
+- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor
+{
+ return false;
+}
+
+/* handles key events on the pad list */
+- (void)keyDown:(NSEvent *)theEvent
+{
+ int key = [theEvent keyCode];
+
+ if ([[theEvent window] firstResponder] == tableView) {
+ if (key == 51 || key == 117) {
+ // delete keys - remove the mappings for the selected item
+ [controller deleteRow:[tableView selectedRow]];
+ [tableView reloadData];
+ return;
+ } else if (key == 36) {
+ // return key - configure the selected item
+ [tableView editColumn:[tableView columnWithIdentifier:@"button"] row:[tableView selectedRow] withEvent:nil select:YES];
+ return;
+ }
+ }
+
+ [super keyDown:theEvent];
+}
+
+@end
diff --git a/macosx/plugins/DFInput/macsrc/cfg.c b/macosx/plugins/DFInput/macsrc/cfg.c
new file mode 100644
index 0000000..9465426
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/cfg.c
@@ -0,0 +1,748 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "pad.h"
+
+GLOBALDATA g;
+
+long DoConfiguration();
+void DoAbout();
+
+static void SetDefaultConfig() {
+ memset(&g.cfg, 0, sizeof(g.cfg));
+
+ g.cfg.Threaded = 1;
+
+ g.cfg.PadDef[0].DevNum = 0;
+ g.cfg.PadDef[1].DevNum = 1;
+
+ g.cfg.PadDef[0].Type = PSE_PAD_TYPE_STANDARD;
+ g.cfg.PadDef[1].Type = PSE_PAD_TYPE_STANDARD;
+
+ // Pad1 keyboard
+ g.cfg.PadDef[0].KeyDef[DKEY_SELECT].Key = 9;
+ g.cfg.PadDef[0].KeyDef[DKEY_START].Key = 10;
+ g.cfg.PadDef[0].KeyDef[DKEY_UP].Key = 127;
+ g.cfg.PadDef[0].KeyDef[DKEY_RIGHT].Key = 125;
+ g.cfg.PadDef[0].KeyDef[DKEY_DOWN].Key = 126;
+ g.cfg.PadDef[0].KeyDef[DKEY_LEFT].Key = 124;
+ g.cfg.PadDef[0].KeyDef[DKEY_L2].Key = 16;
+ g.cfg.PadDef[0].KeyDef[DKEY_R2].Key = 18;
+ g.cfg.PadDef[0].KeyDef[DKEY_L1].Key = 14;
+ g.cfg.PadDef[0].KeyDef[DKEY_R1].Key = 15;
+ g.cfg.PadDef[0].KeyDef[DKEY_TRIANGLE].Key = 3;
+ g.cfg.PadDef[0].KeyDef[DKEY_CIRCLE].Key = 8;
+ g.cfg.PadDef[0].KeyDef[DKEY_CROSS].Key = 7;
+ g.cfg.PadDef[0].KeyDef[DKEY_SQUARE].Key = 2;
+
+ // Pad1 joystick
+ g.cfg.PadDef[0].KeyDef[DKEY_SELECT].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_SELECT].J.Button = 8;
+ g.cfg.PadDef[0].KeyDef[DKEY_START].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_START].J.Button = 9;
+ g.cfg.PadDef[0].KeyDef[DKEY_UP].JoyEvType = AXIS;
+ g.cfg.PadDef[0].KeyDef[DKEY_UP].J.Axis = -2;
+ g.cfg.PadDef[0].KeyDef[DKEY_RIGHT].JoyEvType = AXIS;
+ g.cfg.PadDef[0].KeyDef[DKEY_RIGHT].J.Axis = 1;
+ g.cfg.PadDef[0].KeyDef[DKEY_DOWN].JoyEvType = AXIS;
+ g.cfg.PadDef[0].KeyDef[DKEY_DOWN].J.Axis = 2;
+ g.cfg.PadDef[0].KeyDef[DKEY_LEFT].JoyEvType = AXIS;
+ g.cfg.PadDef[0].KeyDef[DKEY_LEFT].J.Axis = -1;
+ g.cfg.PadDef[0].KeyDef[DKEY_L2].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_L2].J.Button = 4;
+ g.cfg.PadDef[0].KeyDef[DKEY_L1].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_L1].J.Button = 6;
+ g.cfg.PadDef[0].KeyDef[DKEY_R2].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_R2].J.Button = 5;
+ g.cfg.PadDef[0].KeyDef[DKEY_R1].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_R1].J.Button = 7;
+ g.cfg.PadDef[0].KeyDef[DKEY_TRIANGLE].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_TRIANGLE].J.Button = 0;
+ g.cfg.PadDef[0].KeyDef[DKEY_CIRCLE].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_CIRCLE].J.Button = 1;
+ g.cfg.PadDef[0].KeyDef[DKEY_CROSS].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_CROSS].J.Button = 2;
+ g.cfg.PadDef[0].KeyDef[DKEY_SQUARE].JoyEvType = BUTTON;
+ g.cfg.PadDef[0].KeyDef[DKEY_SQUARE].J.Button = 3;
+
+ // Pad2 joystick
+ g.cfg.PadDef[1].KeyDef[DKEY_SELECT].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_SELECT].J.Button = 8;
+ g.cfg.PadDef[1].KeyDef[DKEY_START].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_START].J.Button = 9;
+ g.cfg.PadDef[1].KeyDef[DKEY_UP].JoyEvType = AXIS;
+ g.cfg.PadDef[1].KeyDef[DKEY_UP].J.Axis = -2;
+ g.cfg.PadDef[1].KeyDef[DKEY_RIGHT].JoyEvType = AXIS;
+ g.cfg.PadDef[1].KeyDef[DKEY_RIGHT].J.Axis = 1;
+ g.cfg.PadDef[1].KeyDef[DKEY_DOWN].JoyEvType = AXIS;
+ g.cfg.PadDef[1].KeyDef[DKEY_DOWN].J.Axis = 2;
+ g.cfg.PadDef[1].KeyDef[DKEY_LEFT].JoyEvType = AXIS;
+ g.cfg.PadDef[1].KeyDef[DKEY_LEFT].J.Axis = -1;
+ g.cfg.PadDef[1].KeyDef[DKEY_L2].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_L2].J.Button = 4;
+ g.cfg.PadDef[1].KeyDef[DKEY_L1].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_L1].J.Button = 6;
+ g.cfg.PadDef[1].KeyDef[DKEY_R2].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_R2].J.Button = 5;
+ g.cfg.PadDef[1].KeyDef[DKEY_R1].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_R1].J.Button = 7;
+ g.cfg.PadDef[1].KeyDef[DKEY_TRIANGLE].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_TRIANGLE].J.Button = 0;
+ g.cfg.PadDef[1].KeyDef[DKEY_CIRCLE].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_CIRCLE].J.Button = 1;
+ g.cfg.PadDef[1].KeyDef[DKEY_CROSS].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_CROSS].J.Button = 2;
+ g.cfg.PadDef[1].KeyDef[DKEY_SQUARE].JoyEvType = BUTTON;
+ g.cfg.PadDef[1].KeyDef[DKEY_SQUARE].J.Button = 3;
+}
+
+void LoadPADConfig() {
+ FILE *fp;
+ char buf[256];
+ int current, a, b, c;
+
+ SetDefaultConfig();
+
+ sprintf(buf, "%s/Library/Preferences/net.pcsx.DFInput.plist", getenv("HOME"));
+
+ fp = fopen(buf, "r");
+ if (fp == NULL) {
+ return;
+ }
+
+ current = 0;
+
+ while (fgets(buf, 256, fp) != NULL) {
+ if (strncmp(buf, "Threaded=", 9) == 0) {
+ g.cfg.Threaded = atoi(&buf[9]);
+ } else if (strncmp(buf, "[PAD", 4) == 0) {
+ current = atoi(&buf[4]) - 1;
+ if (current < 0) {
+ current = 0;
+ } else if (current > 1) {
+ current = 1;
+ }
+ } else if (strncmp(buf, "DevNum=", 7) == 0) {
+ g.cfg.PadDef[current].DevNum = atoi(&buf[7]);
+ } else if (strncmp(buf, "Type=", 5) == 0) {
+ g.cfg.PadDef[current].Type = atoi(&buf[5]);
+ } else if (strncmp(buf, "Select=", 7) == 0) {
+ sscanf(buf, "Select=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_SELECT].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_SELECT].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_SELECT].J.d = c;
+ } else if (strncmp(buf, "L3=", 3) == 0) {
+ sscanf(buf, "L3=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_L3].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_L3].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_L3].J.d = c;
+ } else if (strncmp(buf, "R3=", 3) == 0) {
+ sscanf(buf, "R3=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_R3].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_R3].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_R3].J.d = c;
+ } else if (strncmp(buf, "Start=", 6) == 0) {
+ sscanf(buf, "Start=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_START].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_START].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_START].J.d = c;
+ } else if (strncmp(buf, "Up=", 3) == 0) {
+ sscanf(buf, "Up=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_UP].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_UP].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_UP].J.d = c;
+ } else if (strncmp(buf, "Right=", 6) == 0) {
+ sscanf(buf, "Right=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_RIGHT].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_RIGHT].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_RIGHT].J.d = c;
+ } else if (strncmp(buf, "Down=", 5) == 0) {
+ sscanf(buf, "Down=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_DOWN].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_DOWN].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_DOWN].J.d = c;
+ } else if (strncmp(buf, "Left=", 5) == 0) {
+ sscanf(buf, "Left=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_LEFT].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_LEFT].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_LEFT].J.d = c;
+ } else if (strncmp(buf, "L2=", 3) == 0) {
+ sscanf(buf, "L2=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_L2].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_L2].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_L2].J.d = c;
+ } else if (strncmp(buf, "R2=", 3) == 0) {
+ sscanf(buf, "R2=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_R2].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_R2].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_R2].J.d = c;
+ } else if (strncmp(buf, "L1=", 3) == 0) {
+ sscanf(buf, "L1=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_L1].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_L1].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_L1].J.d = c;
+ } else if (strncmp(buf, "R1=", 3) == 0) {
+ sscanf(buf, "R1=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_R1].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_R1].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_R1].J.d = c;
+ } else if (strncmp(buf, "Triangle=", 9) == 0) {
+ sscanf(buf, "Triangle=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_TRIANGLE].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_TRIANGLE].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_TRIANGLE].J.d = c;
+ } else if (strncmp(buf, "Circle=", 7) == 0) {
+ sscanf(buf, "Circle=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_CIRCLE].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_CIRCLE].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_CIRCLE].J.d = c;
+ } else if (strncmp(buf, "Cross=", 6) == 0) {
+ sscanf(buf, "Cross=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_CROSS].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_CROSS].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_CROSS].J.d = c;
+ } else if (strncmp(buf, "Square=", 7) == 0) {
+ sscanf(buf, "Square=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].Key = a;
+ g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].JoyEvType = b;
+ g.cfg.PadDef[current].KeyDef[DKEY_SQUARE].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogXP=", 13) == 0) {
+ sscanf(buf, "LeftAnalogXP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogXM=", 13) == 0) {
+ sscanf(buf, "LeftAnalogXM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogYP=", 13) == 0) {
+ sscanf(buf, "LeftAnalogYP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d = c;
+ } else if (strncmp(buf, "LeftAnalogYM=", 13) == 0) {
+ sscanf(buf, "LeftAnalogYM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d = c;
+ } else if (strncmp(buf, "RightAnalogXP=", 14) == 0) {
+ sscanf(buf, "RightAnalogXP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d = c;
+ } else if (strncmp(buf, "RightAnalogXM=", 14) == 0) {
+ sscanf(buf, "RightAnalogXM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d = c;
+ } else if (strncmp(buf, "RightAnalogYP=", 14) == 0) {
+ sscanf(buf, "RightAnalogYP=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d = c;
+ } else if (strncmp(buf, "RightAnalogYM=", 14) == 0) {
+ sscanf(buf, "RightAnalogYM=%d,%d,%d", &a, &b, &c);
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key = a;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType = b;
+ g.cfg.PadDef[current].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d = c;
+ }
+ }
+
+ fclose(fp);
+}
+
+void SavePADConfig() {
+ FILE *fp;
+ int i;
+ char buf[256];
+
+ sprintf(buf, "%s/Library/Preferences/net.pcsx.DFInput.plist", getenv("HOME"));
+
+ fp = fopen(buf, "w");
+ if (fp == NULL) {
+ return;
+ }
+
+ fprintf(fp, "[CONFIG]\n");
+ fprintf(fp, "Threaded=%d\n", g.cfg.Threaded);
+ fprintf(fp, "\n");
+
+ for (i = 0; i < 2; i++) {
+ fprintf(fp, "[PAD%d]\n", i + 1);
+ fprintf(fp, "DevNum=%d\n", g.cfg.PadDef[i].DevNum);
+ fprintf(fp, "Type=%d\n", g.cfg.PadDef[i].Type);
+
+ fprintf(fp, "Select=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_SELECT].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_SELECT].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_SELECT].J.d);
+ fprintf(fp, "L3=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_L3].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_L3].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_L3].J.d);
+ fprintf(fp, "R3=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_R3].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_R3].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_R3].J.d);
+ fprintf(fp, "Start=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_START].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_START].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_START].J.d);
+ fprintf(fp, "Up=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_UP].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_UP].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_UP].J.d);
+ fprintf(fp, "Right=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_RIGHT].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_RIGHT].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_RIGHT].J.d);
+ fprintf(fp, "Down=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_DOWN].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_DOWN].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_DOWN].J.d);
+ fprintf(fp, "Left=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_LEFT].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_LEFT].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_LEFT].J.d);
+ fprintf(fp, "L2=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_L2].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_L2].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_L2].J.d);
+ fprintf(fp, "R2=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_R2].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_R2].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_R2].J.d);
+ fprintf(fp, "L1=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_L1].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_L1].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_L1].J.d);
+ fprintf(fp, "R1=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_R1].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_R1].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_R1].J.d);
+ fprintf(fp, "Triangle=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_TRIANGLE].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_TRIANGLE].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_TRIANGLE].J.d);
+ fprintf(fp, "Circle=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_CIRCLE].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_CIRCLE].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_CIRCLE].J.d);
+ fprintf(fp, "Cross=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_CROSS].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_CROSS].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_CROSS].J.d);
+ fprintf(fp, "Square=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].Key,
+ g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_SQUARE].J.d);
+ fprintf(fp, "LeftAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XP].J.d);
+ fprintf(fp, "LeftAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_XM].J.d);
+ fprintf(fp, "LeftAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YP].J.d);
+ fprintf(fp, "LeftAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_LEFT][ANALOG_YM].J.d);
+ fprintf(fp, "RightAnalogXP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XP].J.d);
+ fprintf(fp, "RightAnalogXM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_XM].J.d);
+ fprintf(fp, "RightAnalogYP=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YP].J.d);
+ fprintf(fp, "RightAnalogYM=%d,%d,%d\n", g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].Key,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].JoyEvType,
+ g.cfg.PadDef[i].AnalogDef[ANALOG_RIGHT][ANALOG_YM].J.d);
+
+ fprintf(fp, "\n");
+ }
+
+ fclose(fp);
+}
+
+long PADconfigure(void) {
+ if (SDL_WasInit(SDL_INIT_JOYSTICK)) return -1; // cannot change settings on the fly
+
+ DoConfiguration();
+ LoadPADConfig();
+ return 0;
+}
+
+void PADabout(void) {
+ DoAbout();
+}
+
+struct {
+ uint16_t code;
+ const char *desc;
+} KeyString[] = {
+ { 0x01, "A" },
+ { 0x0C, "B" },
+ { 0x09, "C" },
+ { 0x03, "D" },
+ { 0x0F, "E" },
+ { 0x04, "F" },
+ { 0x06, "G" },
+ { 0x05, "H" },
+ { 0x23, "I" },
+ { 0x27, "J" },
+ { 0x29, "K" },
+ { 0x26, "L" },
+ { 0x2F, "M" },
+ { 0x2E, "N" },
+ { 0x20, "O" },
+ { 0x24, "P" },
+ { 0x0D, "Q" },
+ { 0x10, "R" },
+ { 0x02, "S" },
+ { 0x12, "T" },
+ { 0x21, "U" },
+ { 0x0A, "V" },
+ { 0x0E, "W" },
+ { 0x08, "X" },
+ { 0x11, "Y" },
+ { 0x07, "Z" },
+ { 0x22, "[" },
+ { 0x1F, "]" },
+ { 0x2A, ";" },
+ { 0x28, "'" },
+ { 0x2C, "," },
+ { 0x30, "." },
+ { 0x2D, "/" },
+ { 0x33, "`" },
+ { 0x13, "1" },
+ { 0x14, "2" },
+ { 0x15, "3" },
+ { 0x16, "4" },
+ { 0x18, "5" },
+ { 0x17, "6" },
+ { 0x1B, "7" },
+ { 0x1D, "8" },
+ { 0x1A, "9" },
+ { 0x1E, "0" },
+ { 0x1C, "-" },
+ { 0x19, "=" },
+ { 0x2B, "\\" },
+ { 0x31, "Tab" },
+ { 0x39, "Shift" },
+ { 0x3C, "Control" },
+ { 0x38, "Command" },
+ { 0x32, "Spacebar" },
+ { 0x34, "Backspace" },
+ { 0x25, "Enter" },
+ { 0x7F, "Up" },
+ { 0x7E, "Down" },
+ { 0x7C, "Left" },
+ { 0x7D, "Right" },
+ { 0x73, "Insert" },
+ { 0x76, "Delete" },
+ { 0x74, "Home" },
+ { 0x78, "End" },
+ { 0x75, "Page Up" },
+ { 0x7A, "Page Down" },
+ { 0x48, "Num Lock" },
+ { 0x4C, "Keypad /" },
+ { 0x44, "Keypad *" },
+ { 0x4F, "Keypad -" },
+ { 0x46, "Keypad +" },
+ { 0x4D, "Keypad Enter" },
+ { 0x53, "Keypad 0" },
+ { 0x54, "Keypad 1" },
+ { 0x55, "Keypad 2" },
+ { 0x56, "Keypad 3" },
+ { 0x57, "Keypad 4" },
+ { 0x58, "Keypad 5" },
+ { 0x59, "Keypad 6" },
+ { 0x5A, "Keypad 7" },
+ { 0x5C, "Keypad 8" },
+ { 0x5D, "Keypad 9" },
+ { 0x42, "Keypad ." },
+ { 0x00, NULL }
+};
+
+static const char *XKeysymToString(uint16_t key) {
+ static char buf[64];
+ int i = 0;
+
+ while (KeyString[i].code != 0) {
+ if (KeyString[i].code == key) {
+ strcpy(buf, KeyString[i].desc);
+ return buf;
+ }
+ i++;
+ }
+
+ sprintf(buf, "0x%.2X", key);
+ return buf;
+}
+
+void GetKeyDescription(char *buf, int joynum, int key) {
+ const char *hatname[16] = {"Centered", "Up", "Right", "Rightup",
+ "Down", "", "Rightdown", "", "Left", "Leftup", "", "",
+ "Leftdown", "", "", ""};
+
+ switch (g.cfg.PadDef[joynum].KeyDef[key].JoyEvType) {
+ case BUTTON:
+ sprintf(buf, "Joystick: Button %d", g.cfg.PadDef[joynum].KeyDef[key].J.Button);
+ break;
+
+ case AXIS:
+ sprintf(buf, "Joystick: Axis %d%c", abs(g.cfg.PadDef[joynum].KeyDef[key].J.Axis) - 1,
+ g.cfg.PadDef[joynum].KeyDef[key].J.Axis > 0 ? '+' : '-');
+ break;
+
+ case HAT:
+ sprintf(buf, "Joystick: Hat %d %s", (g.cfg.PadDef[joynum].KeyDef[key].J.Hat >> 8),
+ hatname[g.cfg.PadDef[joynum].KeyDef[key].J.Hat & 0x0F]);
+ break;
+
+ case NONE:
+ default:
+ buf[0] = '\0';
+ break;
+ }
+
+ if (g.cfg.PadDef[joynum].KeyDef[key].Key != 0) {
+ if (buf[0] != '\0') {
+ strcat(buf, " / ");
+ }
+
+ strcat(buf, "Keyboard:");
+ strcat(buf, " ");
+ strcat(buf, XKeysymToString(g.cfg.PadDef[joynum].KeyDef[key].Key));
+ }
+}
+
+void GetAnalogDescription(char *buf, int joynum, int analognum, int dir) {
+ const char *hatname[16] = {"Centered", "Up", "Right", "Rightup",
+ "Down", "", "Rightdown", "", "Left", "Leftup", "", "",
+ "Leftdown", "", "", ""};
+
+ switch (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].JoyEvType) {
+ case BUTTON:
+ sprintf(buf, "Joystick: Button %d", g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Button);
+ break;
+
+ case AXIS:
+ sprintf(buf, "Joystick: Axis %d%c", abs(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis) - 1,
+ g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Axis > 0 ? '+' : '-');
+ break;
+
+ case HAT:
+ sprintf(buf, "Joystick: Hat %d %s", (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat >> 8),
+ hatname[g.cfg.PadDef[joynum].AnalogDef[analognum][dir].J.Hat & 0x0F]);
+ break;
+
+ case NONE:
+ default:
+ buf[0] = '\0';
+ break;
+ }
+
+ if (g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key != 0) {
+ if (buf[0] != '\0') {
+ strcat(buf, " / ");
+ }
+
+ strcat(buf, "Keyboard:");
+ strcat(buf, " ");
+ strcat(buf, XKeysymToString(g.cfg.PadDef[joynum].AnalogDef[analognum][dir].Key));
+ }
+}
+
+int CheckKeyDown() {
+ KeyMap theKeys;
+ unsigned char *keybytes;
+ int i;
+
+ GetKeys(theKeys);
+ keybytes = (unsigned char *) theKeys;
+
+ for (i = 0; i < 128; i++) {
+ if (i == 0x3A) continue; // Ignore capslock
+
+ if (keybytes[i >> 3] & (1 << (i & 7)))
+ return i + 1;
+ }
+
+ return 0;
+}
+
+static Sint16 InitialAxisPos[256], PrevAxisPos[256];
+
+#define NUM_AXES(js) (SDL_JoystickNumAxes(js) > 256 ? 256 : SDL_JoystickNumAxes(js))
+
+void InitAxisPos(int padnum) {
+ int i;
+ SDL_Joystick *js;
+
+ if (g.cfg.PadDef[padnum].DevNum >= 0) {
+ js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum);
+ SDL_JoystickEventState(SDL_IGNORE);
+ } else return;
+
+ SDL_JoystickUpdate();
+
+ for (i = 0; i < NUM_AXES(js); i++) {
+ InitialAxisPos[i] = PrevAxisPos[i] = SDL_JoystickGetAxis(js, i);
+ }
+
+ SDL_JoystickClose(js);
+}
+
+int ReadDKeyEvent(int padnum, int key) {
+ SDL_Joystick *js;
+ int i, changed = 0, t;
+ Sint16 axis;
+
+ if (g.cfg.PadDef[padnum].DevNum >= 0) {
+ js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum);
+ SDL_JoystickEventState(SDL_IGNORE);
+ } else {
+ js = NULL;
+ }
+
+ for (t = 0; t < 1000000 / 1000; t++) {
+ // check joystick events
+ if (js != NULL) {
+ SDL_JoystickUpdate();
+
+ for (i = 0; i < SDL_JoystickNumButtons(js); i++) {
+ if (SDL_JoystickGetButton(js, i)) {
+ g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = BUTTON;
+ g.cfg.PadDef[padnum].KeyDef[key].J.Button = i;
+ changed = 1;
+ goto end;
+ }
+ }
+
+ for (i = 0; i < NUM_AXES(js); i++) {
+ axis = SDL_JoystickGetAxis(js, i);
+ if (abs(axis) > 16383 && (abs(axis - PrevAxisPos[i]) > 4096 || abs(axis - InitialAxisPos[i]) > 4096)) {
+ g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = AXIS;
+ g.cfg.PadDef[padnum].KeyDef[key].J.Axis = (i + 1) * (axis > 0 ? 1 : -1);
+ changed = 1;
+ goto end;
+ }
+ PrevAxisPos[i] = axis;
+ }
+
+ for (i = 0; i < SDL_JoystickNumHats(js); i++) {
+ axis = SDL_JoystickGetHat(js, i);
+ if (axis != SDL_HAT_CENTERED) {
+ g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = HAT;
+
+ if (axis & SDL_HAT_UP) {
+ g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_UP);
+ } else if (axis & SDL_HAT_DOWN) {
+ g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_DOWN);
+ } else if (axis & SDL_HAT_LEFT) {
+ g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_LEFT);
+ } else if (axis & SDL_HAT_RIGHT) {
+ g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_RIGHT);
+ }
+
+ changed = 1;
+ goto end;
+ }
+ }
+ }
+
+ // check keyboard events
+ i = CheckKeyDown();
+ if (i != 0) {
+ if (i != 0x36) g.cfg.PadDef[padnum].KeyDef[key].Key = i;
+ changed = 1;
+ goto end;
+ }
+
+ // check mouse events
+ if (Button()) {
+ changed = 2;
+ goto end;
+ }
+
+ usleep(1000);
+ }
+
+end:
+ if (js != NULL) {
+ SDL_JoystickClose(js);
+ }
+
+ return changed;
+}
+
+int ReadAnalogEvent(int padnum, int analognum, int analogdir) {
+ SDL_Joystick *js;
+ int i, changed = 0, t;
+ Sint16 axis;
+
+ if (g.cfg.PadDef[padnum].DevNum >= 0) {
+ js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum);
+ SDL_JoystickEventState(SDL_IGNORE);
+ } else {
+ js = NULL;
+ }
+
+ for (t = 0; t < 1000000 / 1000; t++) {
+ // check joystick events
+ if (js != NULL) {
+ SDL_JoystickUpdate();
+
+ for (i = 0; i < SDL_JoystickNumButtons(js); i++) {
+ if (SDL_JoystickGetButton(js, i)) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = BUTTON;
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Button = i;
+ changed = 1;
+ goto end;
+ }
+ }
+
+ for (i = 0; i < NUM_AXES(js); i++) {
+ axis = SDL_JoystickGetAxis(js, i);
+ if (abs(axis) > 16383 && (abs(axis - PrevAxisPos[i]) > 4096 || abs(axis - InitialAxisPos[i]) > 4096)) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = AXIS;
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Axis = (i + 1) * (axis > 0 ? 1 : -1);
+ changed = 1;
+ goto end;
+ }
+ PrevAxisPos[i] = axis;
+ }
+
+ for (i = 0; i < SDL_JoystickNumHats(js); i++) {
+ axis = SDL_JoystickGetHat(js, i);
+ if (axis != SDL_HAT_CENTERED) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].JoyEvType = HAT;
+
+ if (axis & SDL_HAT_UP) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_UP);
+ } else if (axis & SDL_HAT_DOWN) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_DOWN);
+ } else if (axis & SDL_HAT_LEFT) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_LEFT);
+ } else if (axis & SDL_HAT_RIGHT) {
+ g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].J.Hat = ((i << 8) | SDL_HAT_RIGHT);
+ }
+
+ changed = 1;
+ goto end;
+ }
+ }
+ }
+
+ // check keyboard events
+ i = CheckKeyDown();
+ if (i != 0) {
+ if (i != 0x36) g.cfg.PadDef[padnum].AnalogDef[analognum][analogdir].Key = i;
+ changed = 1;
+ goto end;
+ }
+
+ // check mouse events
+ if (Button()) {
+ changed = 2;
+ goto end;
+ }
+
+ usleep(1000);
+ }
+
+end:
+ if (js != NULL) {
+ SDL_JoystickClose(js);
+ }
+
+ return changed;
+}
diff --git a/macosx/plugins/DFInput/macsrc/cfg.h b/macosx/plugins/DFInput/macsrc/cfg.h
new file mode 100644
index 0000000..99bc103
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/cfg.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#ifndef CFG_H
+#define CFG_H
+
+#include "pad.h"
+
+void GetKeyDescription(char *buf, int joynum, int key);
+void GetAnalogDescription(char *buf, int joynum, int analognum, int dir);
+void InitAxisPos(int padnum);
+int ReadDKeyEvent(int padnum, int key);
+int ReadAnalogEvent(int padnum, int analognum, int analogdir);
+
+#endif
diff --git a/macosx/plugins/DFInput/macsrc/xkb.c b/macosx/plugins/DFInput/macsrc/xkb.c
new file mode 100644
index 0000000..e9345c2
--- /dev/null
+++ b/macosx/plugins/DFInput/macsrc/xkb.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>.
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses>.
+ */
+
+#include "pad.h"
+
+void InitKeyboard() {
+ g.PadState[0].KeyStatus = 0xFFFF;
+ g.PadState[1].KeyStatus = 0xFFFF;
+}
+
+void DestroyKeyboard() {
+}
+
+void CheckKeyboard() {
+ int i, j, k;
+ uint16_t key;
+
+ union {
+ KeyMap km;
+ KeyMapByteArray k;
+ } keyState;
+
+ g.PadState[0].KeyStatus = 0xFFFF;
+ g.PadState[1].KeyStatus = 0xFFFF;
+
+ GetKeys(keyState.km);
+
+#define KeyDown(X) \
+ (keyState.k[((X) - 1) >> 3] & (1 << (((X) - 1) & 7)))
+
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < DKEY_TOTAL; j++) {
+ key = g.cfg.PadDef[i].KeyDef[j].Key;
+ if (key == 0) continue;
+
+ if (KeyDown(key)) g.PadState[i].KeyStatus &= ~(1 << j);
+ }
+
+ if (g.cfg.PadDef[i].Type != PSE_PAD_TYPE_ANALOGPAD) continue;
+
+ for (j = 0; j < ANALOG_TOTAL; j++) {
+ for (k = 0; k < 4; k++) {
+ key = g.cfg.PadDef[i].AnalogDef[j][k].Key;
+ if (key == 0) continue;
+
+ g.PadState[i].AnalogKeyStatus[j][k] = (KeyDown(key) ? 1 : 0);
+ }
+ }
+ }
+}
diff --git a/macosx/plugins/DFSound/English.lproj/Credits.rtf b/macosx/plugins/DFSound/English.lproj/Credits.rtf
new file mode 100644
index 0000000..209850a
--- /dev/null
+++ b/macosx/plugins/DFSound/English.lproj/Credits.rtf
@@ -0,0 +1,14 @@
+{\rtf1\mac\ansicpg10000\cocoartf102
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\vieww9000\viewh9000\viewkind0
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
+
+\f0\b\fs24 \cf0 Macintosh Port:
+\f1\b0 \
+ Gil Pedersen\
+\
+
+\f0\b Original coders:
+\f1\b0 \
+ Pete Bernert and the P.E.Op.S. team} \ No newline at end of file
diff --git a/macosx/plugins/DFSound/English.lproj/InfoPlist.strings b/macosx/plugins/DFSound/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000..6c79d9c
--- /dev/null
+++ b/macosx/plugins/DFSound/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/classes.nib b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/classes.nib
new file mode 100644
index 0000000..ab65672
--- /dev/null
+++ b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/classes.nib
@@ -0,0 +1,25 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ ACTIONS = {cancel = id; ok = id; reset = id; };
+ CLASS = NetSfPeopsSPUPluginController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ hiCompBox = NSControl;
+ interpolValue = NetSfPeopsSPUPluginNamedSlider;
+ irqWaitBox = NetSfPeopsSPUPluginNamedSlider;
+ monoSoundBox = NSControl;
+ reverbValue = NSControl;
+ xaSpeedBox = NSControl;
+ };
+ SUPERCLASS = NSWindowController;
+ },
+ {
+ CLASS = NetSfPeopsSPUPluginNamedSlider;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSSlider;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/info.nib b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/info.nib
new file mode 100644
index 0000000..a4d8dd8
--- /dev/null
+++ b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/info.nib
@@ -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>IBDocumentLocation</key>
+ <string>42 12 546 240 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>6</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/keyedobjects.nib b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/keyedobjects.nib
new file mode 100755
index 0000000..d56d775
--- /dev/null
+++ b/macosx/plugins/DFSound/English.lproj/NetSfPeopsSpuPluginMain.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFSound/Info.plist b/macosx/plugins/DFSound/Info.plist
new file mode 100644
index 0000000..88cf687
--- /dev/null
+++ b/macosx/plugins/DFSound/Info.plist
@@ -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>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>PeopsSPU</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>net.sf.peops.SPUPlugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>PsxP</string>
+ <key>CFBundleSignature</key>
+ <string>PSPU</string>
+ <key>CFBundleVersion</key>
+ <string>1.19</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFSound/PeopsSPU.xcodeproj/project.pbxproj b/macosx/plugins/DFSound/PeopsSPU.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..e9c81c4
--- /dev/null
+++ b/macosx/plugins/DFSound/PeopsSPU.xcodeproj/project.pbxproj
@@ -0,0 +1,343 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2B4F9962077B042E004E36BA /* NetSfPeopsSpuPluginMain.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2B4F9961077B042E004E36BA /* NetSfPeopsSpuPluginMain.nib */; };
+ 2B4F99F9077B0CE4004E36BA /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2B4F99F7077B0CE4004E36BA /* Credits.rtf */; };
+ 2B7B2B94072D9BE6007F0C35 /* PluginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B7B2B92072D9BE6007F0C35 /* PluginController.m */; };
+ 2B7B2BD1072DAE5D007F0C35 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B7B2BD0072DAE5D007F0C35 /* AppKit.framework */; };
+ 2B7B2BE9072DB1B6007F0C35 /* NamedSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B7B2BE7072DB1B6007F0C35 /* NamedSlider.m */; };
+ 2BE18A00077EED7F008688C9 /* macosx.c in Sources */ = {isa = PBXBuildFile; fileRef = 2BFF7EFC0715D16A0061278A /* macosx.c */; };
+ 2BFF7F3E0715D2E00061278A /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BFF7F3D0715D2E00061278A /* Carbon.framework */; };
+ 71E4E7AB109DC529003BB7AC /* dma.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E4E797109DC529003BB7AC /* dma.c */; };
+ 71E4E7AC109DC529003BB7AC /* freeze.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E4E79B109DC529003BB7AC /* freeze.c */; };
+ 71E4E7AE109DC529003BB7AC /* registers.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E4E79F109DC529003BB7AC /* registers.c */; };
+ 71E4E7B0109DC529003BB7AC /* spu.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E4E7A4109DC529003BB7AC /* spu.c */; };
+ 71E4E7B1109DC529003BB7AC /* xa.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E4E7A7109DC529003BB7AC /* xa.c */; };
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */; };
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8D5B49A704867FD3000E48DA /* InfoPlist.strings */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<absolute>"; };
+ 2B4F99F8077B0CE4004E36BA /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 2B6DA89307200A9A009F6FED /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/NetSfPeopsSpuPluginMain.nib; sourceTree = "<group>"; };
+ 2B7B2B91072D9BE6007F0C35 /* PluginController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PluginController.h; path = macsrc/PluginController.h; sourceTree = "<group>"; };
+ 2B7B2B92072D9BE6007F0C35 /* PluginController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PluginController.m; path = macsrc/PluginController.m; sourceTree = "<group>"; };
+ 2B7B2BD0072DAE5D007F0C35 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 2B7B2BE6072DB1B6007F0C35 /* NamedSlider.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = NamedSlider.h; path = macsrc/NamedSlider.h; sourceTree = "<group>"; };
+ 2B7B2BE7072DB1B6007F0C35 /* NamedSlider.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = NamedSlider.m; path = macsrc/NamedSlider.m; sourceTree = "<group>"; };
+ 2BFF7EFC0715D16A0061278A /* macosx.c */ = {isa = PBXFileReference; fileEncoding = 12; lastKnownFileType = sourcecode.c.c; name = macosx.c; path = src/macosx.c; sourceTree = "<group>"; };
+ 2BFF7F3D0715D2E00061278A /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
+ 71E4E793109DC529003BB7AC /* adsr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adsr.c; path = ../../../plugins/dfsound/adsr.c; sourceTree = SOURCE_ROOT; };
+ 71E4E794109DC529003BB7AC /* adsr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adsr.h; path = ../../../plugins/dfsound/adsr.h; sourceTree = SOURCE_ROOT; };
+ 71E4E796109DC529003BB7AC /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cfg.h; path = ../../../plugins/dfsound/cfg.h; sourceTree = SOURCE_ROOT; };
+ 71E4E797109DC529003BB7AC /* dma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dma.c; path = ../../../plugins/dfsound/dma.c; sourceTree = SOURCE_ROOT; };
+ 71E4E798109DC529003BB7AC /* dma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dma.h; path = ../../../plugins/dfsound/dma.h; sourceTree = SOURCE_ROOT; };
+ 71E4E799109DC529003BB7AC /* dsoundoss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dsoundoss.h; path = ../../../plugins/dfsound/dsoundoss.h; sourceTree = SOURCE_ROOT; };
+ 71E4E79A109DC529003BB7AC /* externals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = externals.h; path = ../../../plugins/dfsound/externals.h; sourceTree = SOURCE_ROOT; };
+ 71E4E79B109DC529003BB7AC /* freeze.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = freeze.c; path = ../../../plugins/dfsound/freeze.c; sourceTree = SOURCE_ROOT; };
+ 71E4E79C109DC529003BB7AC /* gauss_i.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gauss_i.h; path = ../../../plugins/dfsound/gauss_i.h; sourceTree = SOURCE_ROOT; };
+ 71E4E79E109DC529003BB7AC /* psemuxa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = psemuxa.h; path = ../../../plugins/dfsound/psemuxa.h; sourceTree = SOURCE_ROOT; };
+ 71E4E79F109DC529003BB7AC /* registers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = registers.c; path = ../../../plugins/dfsound/registers.c; sourceTree = SOURCE_ROOT; };
+ 71E4E7A0109DC529003BB7AC /* registers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = registers.h; path = ../../../plugins/dfsound/registers.h; sourceTree = SOURCE_ROOT; };
+ 71E4E7A1109DC529003BB7AC /* regs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = regs.h; path = ../../../plugins/dfsound/regs.h; sourceTree = SOURCE_ROOT; };
+ 71E4E7A2109DC529003BB7AC /* reverb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = reverb.c; path = ../../../plugins/dfsound/reverb.c; sourceTree = SOURCE_ROOT; };
+ 71E4E7A3109DC529003BB7AC /* reverb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = reverb.h; path = ../../../plugins/dfsound/reverb.h; sourceTree = SOURCE_ROOT; };
+ 71E4E7A4109DC529003BB7AC /* spu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = spu.c; path = ../../../plugins/dfsound/spu.c; sourceTree = SOURCE_ROOT; };
+ 71E4E7A5109DC529003BB7AC /* spu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = spu.h; path = ../../../plugins/dfsound/spu.h; sourceTree = SOURCE_ROOT; };
+ 71E4E7A6109DC529003BB7AC /* stdafx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stdafx.h; path = ../../../plugins/dfsound/stdafx.h; sourceTree = SOURCE_ROOT; };
+ 71E4E7A7109DC529003BB7AC /* xa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xa.c; path = ../../../plugins/dfsound/xa.c; sourceTree = SOURCE_ROOT; };
+ 71E4E7A8109DC529003BB7AC /* xa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xa.h; path = ../../../plugins/dfsound/xa.h; sourceTree = SOURCE_ROOT; };
+ 8D576316048677EA00EA77CD /* PeopsSPU.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PeopsSPU.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8D576317048677EA00EA77CD /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D576313048677EA00EA77CD /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D576314048677EA00EA77CD /* CoreFoundation.framework in Frameworks */,
+ 2BFF7F3E0715D2E00061278A /* Carbon.framework in Frameworks */,
+ 2B7B2BD1072DAE5D007F0C35 /* AppKit.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* PSX Plugin */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB77AFFE84173DC02AAC07 /* Source */,
+ 2B7B2B8E072D9BD6007F0C35 /* Classes */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
+ 19C28FB6FE9D52B211CA2CBB /* Products */,
+ );
+ name = "PSX Plugin";
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 2B7B2BD0072DAE5D007F0C35 /* AppKit.framework */,
+ 2BFF7F3D0715D2E00061278A /* Carbon.framework */,
+ 0AA1909FFE8422F4C02AAC07 /* CoreFoundation.framework */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 8D576317048677EA00EA77CD /* Info.plist */,
+ 2B4F99F7077B0CE4004E36BA /* Credits.rtf */,
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */,
+ 2B4F9961077B042E004E36BA /* NetSfPeopsSpuPluginMain.nib */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 08FB77AFFE84173DC02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 71E4E793109DC529003BB7AC /* adsr.c */,
+ 71E4E794109DC529003BB7AC /* adsr.h */,
+ 71E4E796109DC529003BB7AC /* cfg.h */,
+ 71E4E797109DC529003BB7AC /* dma.c */,
+ 71E4E798109DC529003BB7AC /* dma.h */,
+ 71E4E799109DC529003BB7AC /* dsoundoss.h */,
+ 71E4E79A109DC529003BB7AC /* externals.h */,
+ 71E4E79B109DC529003BB7AC /* freeze.c */,
+ 71E4E79C109DC529003BB7AC /* gauss_i.h */,
+ 71E4E79E109DC529003BB7AC /* psemuxa.h */,
+ 71E4E79F109DC529003BB7AC /* registers.c */,
+ 71E4E7A0109DC529003BB7AC /* registers.h */,
+ 71E4E7A1109DC529003BB7AC /* regs.h */,
+ 71E4E7A2109DC529003BB7AC /* reverb.c */,
+ 71E4E7A3109DC529003BB7AC /* reverb.h */,
+ 71E4E7A4109DC529003BB7AC /* spu.c */,
+ 71E4E7A5109DC529003BB7AC /* spu.h */,
+ 71E4E7A6109DC529003BB7AC /* stdafx.h */,
+ 71E4E7A7109DC529003BB7AC /* xa.c */,
+ 71E4E7A8109DC529003BB7AC /* xa.h */,
+ 2BFF7EFC0715D16A0061278A /* macosx.c */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 19C28FB6FE9D52B211CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D576316048677EA00EA77CD /* PeopsSPU.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 2B7B2B8E072D9BD6007F0C35 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 2B7B2B91072D9BE6007F0C35 /* PluginController.h */,
+ 2B7B2B92072D9BE6007F0C35 /* PluginController.m */,
+ 2B7B2BE6072DB1B6007F0C35 /* NamedSlider.h */,
+ 2B7B2BE7072DB1B6007F0C35 /* NamedSlider.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8D57630D048677EA00EA77CD /* PeopsSPU */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 71155B260FDFA2EB00EC0BC5 /* Build configuration list for PBXNativeTarget "PeopsSPU" */;
+ buildPhases = (
+ 8D57630F048677EA00EA77CD /* Resources */,
+ 8D576311048677EA00EA77CD /* Sources */,
+ 8D576313048677EA00EA77CD /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = PeopsSPU;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = "PSX Plugin";
+ productReference = 8D576316048677EA00EA77CD /* PeopsSPU.psxplugin */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 71155B2B0FDFA2EB00EC0BC5 /* Build configuration list for PBXProject "PeopsSPU" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 089C166AFE841209C02AAC07 /* PSX Plugin */;
+ projectDirPath = "";
+ targets = (
+ 8D57630D048677EA00EA77CD /* PeopsSPU */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D57630F048677EA00EA77CD /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49A804867FD3000E48DA /* InfoPlist.strings in Resources */,
+ 2B4F9962077B042E004E36BA /* NetSfPeopsSpuPluginMain.nib in Resources */,
+ 2B4F99F9077B0CE4004E36BA /* Credits.rtf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D576311048677EA00EA77CD /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2B7B2B94072D9BE6007F0C35 /* PluginController.m in Sources */,
+ 2B7B2BE9072DB1B6007F0C35 /* NamedSlider.m in Sources */,
+ 2BE18A00077EED7F008688C9 /* macosx.c in Sources */,
+ 71E4E7AB109DC529003BB7AC /* dma.c in Sources */,
+ 71E4E7AC109DC529003BB7AC /* freeze.c in Sources */,
+ 71E4E7AE109DC529003BB7AC /* registers.c in Sources */,
+ 71E4E7B0109DC529003BB7AC /* spu.c in Sources */,
+ 71E4E7B1109DC529003BB7AC /* xa.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 2B4F9961077B042E004E36BA /* NetSfPeopsSpuPluginMain.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2B6DA89307200A9A009F6FED /* English */,
+ );
+ name = NetSfPeopsSpuPluginMain.nib;
+ sourceTree = "<group>";
+ };
+ 2B4F99F7077B0CE4004E36BA /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2B4F99F8077B0CE4004E36BA /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 8D5B49A704867FD3000E48DA /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 71155B270FDFA2EB00EC0BC5 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ _MACOSX,
+ USEMACOSX,
+ );
+ HEADER_SEARCH_PATHS = (
+ src/,
+ ../../../plugins/dfsound,
+ );
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "-DUSEMACOSX=1";
+ PRODUCT_NAME = PeopsSPU;
+ SYMROOT = ../../build;
+ WRAPPER_EXTENSION = psxplugin;
+ ZERO_LINK = NO;
+ };
+ name = Development;
+ };
+ 71155B290FDFA2EB00EC0BC5 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUGGING_SYMBOLS = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = s;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ _MACOSX,
+ USEMACOSX,
+ );
+ HEADER_SEARCH_PATHS = (
+ src/,
+ ../../../plugins/dfsound,
+ );
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OTHER_CFLAGS = "";
+ OTHER_CPLUSPLUSFLAGS = "$(OTHER_CFLAGS)";
+ PRODUCT_NAME = PeopsSPU;
+ SYMROOT = ../../build;
+ WRAPPER_EXTENSION = psxplugin;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 71155B2C0FDFA2EB00EC0BC5 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Development;
+ };
+ 71155B2E0FDFA2EB00EC0BC5 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ };
+ name = Deployment;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 71155B260FDFA2EB00EC0BC5 /* Build configuration list for PBXNativeTarget "PeopsSPU" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71155B270FDFA2EB00EC0BC5 /* Development */,
+ 71155B290FDFA2EB00EC0BC5 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+ 71155B2B0FDFA2EB00EC0BC5 /* Build configuration list for PBXProject "PeopsSPU" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 71155B2C0FDFA2EB00EC0BC5 /* Development */,
+ 71155B2E0FDFA2EB00EC0BC5 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/macosx/plugins/DFSound/macsrc/NamedSlider.h b/macosx/plugins/DFSound/macsrc/NamedSlider.h
new file mode 100644
index 0000000..c5a40aa
--- /dev/null
+++ b/macosx/plugins/DFSound/macsrc/NamedSlider.h
@@ -0,0 +1,13 @@
+/* NetSfPeopsSPUPluginNamedSlider */
+
+#import <Cocoa/Cocoa.h>
+
+#define NamedSlider NetSfPeopsSPUPluginNamedSlider
+
+@interface NamedSlider : NSSlider
+{
+ NSArray *strings;
+}
+
+- (void)setStrings:(NSArray *)theStrings;
+@end
diff --git a/macosx/plugins/DFSound/macsrc/NamedSlider.m b/macosx/plugins/DFSound/macsrc/NamedSlider.m
new file mode 100644
index 0000000..fd07780
--- /dev/null
+++ b/macosx/plugins/DFSound/macsrc/NamedSlider.m
@@ -0,0 +1,33 @@
+#import "NamedSlider.h"
+
+@implementation NamedSlider
+
+- (void)dealloc
+{
+ [strings release];
+ [super dealloc];
+}
+
+- (void)setStrings:(NSArray *)theStrings
+{
+ [strings release];
+ strings = [theStrings retain];
+}
+
+- (NSString *)stringValue
+{
+ int index = [self intValue];
+
+ if (index >= 0 && index < [strings count])
+ return [strings objectAtIndex:index];
+
+ return @"(Unknown)";
+}
+
+- (void)setIntValue:(int)value
+{
+ [super setIntValue:value];
+ [self sendAction:[self action] to:[self target]];
+}
+
+@end
diff --git a/macosx/plugins/DFSound/macsrc/PluginController.h b/macosx/plugins/DFSound/macsrc/PluginController.h
new file mode 100644
index 0000000..36373b1
--- /dev/null
+++ b/macosx/plugins/DFSound/macsrc/PluginController.h
@@ -0,0 +1,29 @@
+/* NetSfPeopsSPUPluginController */
+
+#import <Cocoa/Cocoa.h>
+#import "NamedSlider.h"
+
+void DoAbout();
+long DoConfiguration();
+void LoadConfiguration();
+
+#define PluginController NetSfPeopsSPUPluginController
+
+@interface PluginController : NSWindowController
+{
+ IBOutlet NSControl *hiCompBox;
+ IBOutlet NetSfPeopsSPUPluginNamedSlider *interpolValue;
+ IBOutlet NSControl *irqWaitBox;
+ IBOutlet NSControl *monoSoundBox;
+ IBOutlet NetSfPeopsSPUPluginNamedSlider *reverbValue;
+ IBOutlet NSControl *xaEnableBox;
+ IBOutlet NSControl *xaSpeedBox;
+
+ NSMutableDictionary *keyValues;
+}
+- (IBAction)cancel:(id)sender;
+- (IBAction)ok:(id)sender;
+- (IBAction)reset:(id)sender;
+
+- (void)loadValues;
+@end
diff --git a/macosx/plugins/DFSound/macsrc/PluginController.m b/macosx/plugins/DFSound/macsrc/PluginController.m
new file mode 100644
index 0000000..1fa007f
--- /dev/null
+++ b/macosx/plugins/DFSound/macsrc/PluginController.m
@@ -0,0 +1,160 @@
+#import "PluginController.h"
+#include "stdafx.h"
+#include "externals.h"
+
+#define APP_ID @"net.sf.peops.SPUPlugin"
+#define PrefsKey APP_ID @" Settings"
+
+static PluginController *pluginController;
+char * pConfigFile=NULL;
+
+void DoAbout()
+{
+ // Get parent application instance
+ NSApplication *app = [NSApplication sharedApplication];
+ NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID];
+
+ // Get Credits.rtf
+ NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"];
+ NSAttributedString *credits;
+ if (path) {
+ credits = [[[NSAttributedString alloc] initWithPath: path
+ documentAttributes:NULL] autorelease];
+ } else {
+ credits = [[[NSAttributedString alloc] initWithString:@""] autorelease];
+ }
+
+ // Get Application Icon
+ NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]];
+ NSSize size = NSMakeSize(64, 64);
+ [icon setSize:size];
+
+ [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:
+ [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName",
+ icon, @"ApplicationIcon",
+ [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion",
+ [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version",
+ [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright",
+ credits, @"Credits",
+ nil]];
+}
+
+
+long DoConfiguration()
+{
+ NSWindow *window;
+
+ if (pluginController == nil) {
+ pluginController = [[PluginController alloc] initWithWindowNibName:@"NetSfPeopsSpuPluginMain"];
+ }
+ window = [pluginController window];
+
+ /* load values */
+ [pluginController loadValues];
+
+ [window center];
+ [window makeKeyAndOrderFront:nil];
+
+ return 0;
+}
+
+void ReadConfig(void)
+{
+ NSDictionary *keyValues;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"High Compatibility Mode",
+ [NSNumber numberWithBool:YES], @"SPU IRQ Wait",
+ [NSNumber numberWithBool:NO], @"XA Pitch",
+ [NSNumber numberWithInt:0], @"Interpolation Quality",
+ [NSNumber numberWithInt:1], @"Reverb Quality",
+ nil], PrefsKey,
+ nil]];
+
+ keyValues = [defaults dictionaryForKey:PrefsKey];
+
+ iUseTimer = [[keyValues objectForKey:@"High Compatibility Mode"] boolValue] ? 2 : 0;
+ iSPUIRQWait = [[keyValues objectForKey:@"SPU IRQ Wait"] boolValue];
+ iDisStereo = [[keyValues objectForKey:@"Mono Sound Output"] boolValue];
+ iXAPitch = [[keyValues objectForKey:@"XA Pitch"] boolValue];
+
+ iUseInterpolation = [[keyValues objectForKey:@"Interpolation Quality"] intValue];
+ iUseReverb = [[keyValues objectForKey:@"Reverb Quality"] intValue];
+
+ iVolume=1;
+}
+
+@implementation PluginController
+
+- (IBAction)cancel:(id)sender
+{
+ [self close];
+}
+
+- (IBAction)ok:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ NSMutableDictionary *writeDic = [NSMutableDictionary dictionaryWithDictionary:keyValues];
+ [writeDic setObject:[NSNumber numberWithInt:[hiCompBox intValue]] forKey:@"High Compatibility Mode"];
+ [writeDic setObject:[NSNumber numberWithInt:[irqWaitBox intValue]] forKey:@"SPU IRQ Wait"];
+ [writeDic setObject:[NSNumber numberWithInt:[monoSoundBox intValue]] forKey:@"Mono Sound Output"];
+ [writeDic setObject:[NSNumber numberWithInt:[xaSpeedBox intValue]] forKey:@"XA Pitch"];
+
+ [writeDic setObject:[NSNumber numberWithInt:[interpolValue intValue]] forKey:@"Interpolation Quality"];
+ [writeDic setObject:[NSNumber numberWithInt:[reverbValue intValue]] forKey:@"Reverb Quality"];
+
+ // write to defaults
+ [defaults setObject:writeDic forKey:PrefsKey];
+ [defaults synchronize];
+
+ // and set global values accordingly
+ ReadConfig();
+
+ [self close];
+}
+
+- (IBAction)reset:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:PrefsKey];
+ [self loadValues];
+}
+
+- (void)loadValues
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ ReadConfig();
+
+ /* load from preferences */
+ [keyValues release];
+ keyValues = [[defaults dictionaryForKey:PrefsKey] retain];
+
+ [hiCompBox setIntValue:[[keyValues objectForKey:@"High Compatibility Mode"] intValue]];
+ [irqWaitBox setIntValue:[[keyValues objectForKey:@"SPU IRQ Wait"] intValue]];
+ [monoSoundBox setIntValue:[[keyValues objectForKey:@"Mono Sound Output"] intValue]];
+ [xaSpeedBox setIntValue:[[keyValues objectForKey:@"XA Pitch"] intValue]];
+
+ [interpolValue setIntValue:[[keyValues objectForKey:@"Interpolation Quality"] intValue]];
+ [reverbValue setIntValue:[[keyValues objectForKey:@"Reverb Quality"] intValue]];
+}
+
+- (void)awakeFromNib
+{
+ [interpolValue setStrings:[NSArray arrayWithObjects:
+ @"(No Interpolation)",
+ @"(Simple Interpolation)",
+ @"(Gaussian Interpolation)",
+ @"(Cubic Interpolation)",
+ nil]];
+
+ [reverbValue setStrings:[NSArray arrayWithObjects:
+ @"(No Reverb)",
+ @"(Simple Reverb)",
+ @"(PSX Reverb)",
+ nil]];
+}
+
+@end
diff --git a/macosx/plugins/DFSound/src/macosx.c b/macosx/plugins/DFSound/src/macosx.c
new file mode 100755
index 0000000..f329ffc
--- /dev/null
+++ b/macosx/plugins/DFSound/src/macosx.c
@@ -0,0 +1,203 @@
+/***************************************************************************
+ macosx.c - description
+ -------------------
+ begin : Wed May 15 2002
+ copyright : (C) 2002 by Pete Bernert
+ email : BlackDove@addcom.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#include "stdafx.h"
+
+#define _IN_MACOSX
+
+#ifdef _MACOSX
+
+#include <Carbon/Carbon.h>
+#include "externals.h"
+
+#define kMaxSoundBuffers 20
+
+//static int macBufferSize = 2, macBufferCount = 36;
+//static float macSoundPitch = 1.0;
+static long macSoundVolume = 100;
+volatile int soundBufferAt = -1, soundPlayAt = -1, soundQueued = 0;
+char *soundBuffer[kMaxSoundBuffers+1], *emptyBuffer;
+SndChannelPtr sndChannel;
+//ExtSoundHeader sndHeader;
+CmpSoundHeader sndHeader;
+SndCallBackUPP callBackUPP;
+static int bufferIndex;
+
+////////////////////////////////////////////////////////////////////////
+// small linux time helper... only used for watchdog
+////////////////////////////////////////////////////////////////////////
+
+unsigned long timeGetTime()
+{
+ struct timeval tv;
+ gettimeofday(&tv, 0); // well, maybe there are better ways
+ return tv.tv_sec * 1000 + tv.tv_usec/1000; // to do that, but at least it works
+}
+
+pascal void MacProcessSound(SndChannelPtr chan, SndCommand *cmd)
+{
+ #pragma unused (chan, cmd)
+
+ if (soundQueued <= 0)
+ sndHeader.samplePtr = emptyBuffer;
+ else
+ {
+ sndHeader.samplePtr = soundBuffer[soundPlayAt];
+ soundPlayAt++;
+ if (soundPlayAt >= kMaxSoundBuffers/*macBufferCount*/)
+ soundPlayAt = 0;
+ soundQueued--;
+ }
+
+ SndCommand buffer = { bufferCmd, 0, (long) &sndHeader };
+ SndDoImmediate(sndChannel, &buffer);
+
+ SndCommand callback = { callBackCmd, 0, 0 };
+ SndDoCommand(sndChannel, &callback, true);
+}
+
+////////////////////////////////////////////////////////////////////////
+// SETUP SOUND
+////////////////////////////////////////////////////////////////////////
+
+static int buffer_size;
+void SetupSound(void)
+{
+ int count;
+
+ callBackUPP = NewSndCallBackUPP(MacProcessSound);
+
+ if (sndChannel)
+ {
+ SndDisposeChannel(sndChannel, true);
+ sndChannel = nil;
+ }
+
+ buffer_size = 1;
+ while (buffer_size < (44100 / 60))
+ buffer_size <<= 1;
+
+ memset(&sndHeader, 0, sizeof(sndHeader));
+ sndHeader.numChannels = (iDisStereo ? 1 : 2);
+ sndHeader.sampleRate = 44100 << 16;
+ sndHeader.encode = cmpSH;
+ sndHeader.baseFrequency = kMiddleC;
+ sndHeader.numFrames = buffer_size;
+ sndHeader.sampleSize = 16;
+#ifdef __POWERPC__
+ sndHeader.format = k16BitBigEndianFormat;
+#else
+ sndHeader.format = k16BitLittleEndianFormat;
+#endif
+ sndHeader.compressionID = fixedCompression;
+
+ if (soundBufferAt != -1)
+ {
+ free(soundBuffer[0]);
+ free(emptyBuffer);
+ }
+
+ soundBuffer[0] = (char *) calloc(buffer_size << 2, kMaxSoundBuffers);
+ for (count = 1; count <= kMaxSoundBuffers; count++)
+ soundBuffer[count] = soundBuffer[count-1] + (buffer_size << 2);
+ emptyBuffer = (char *) calloc(buffer_size << 2, 1);
+
+ soundBufferAt = soundPlayAt = soundQueued = 0;
+ bufferIndex = 0;
+
+ SndNewChannel(&sndChannel, sampledSynth, initStereo, callBackUPP);
+
+ SndCommand sndcmd;
+ UInt32 volume;
+
+ volume = (UInt32) (256.0 * (float) macSoundVolume / 100.0);
+
+ sndcmd.cmd = volumeCmd;
+ sndcmd.param1 = 0;
+ sndcmd.param2 = (volume << 16) | volume;
+ SndDoCommand(sndChannel, &sndcmd, true);
+
+ sndcmd.cmd = callBackCmd;
+ sndcmd.param1 = 0;
+ sndcmd.param2 = 0;
+ SndDoCommand(sndChannel, &sndcmd, true);
+}
+
+////////////////////////////////////////////////////////////////////////
+// REMOVE SOUND
+////////////////////////////////////////////////////////////////////////
+
+void RemoveSound(void)
+{
+ DisposeSndCallBackUPP(callBackUPP);
+}
+
+////////////////////////////////////////////////////////////////////////
+// GET BYTES BUFFERED
+////////////////////////////////////////////////////////////////////////
+
+unsigned long SoundGetBytesBuffered(void)
+{
+ int bytes;
+ int playAt = soundPlayAt;
+
+ if (soundBufferAt < playAt) {
+ bytes = (soundBuffer[kMaxSoundBuffers]-soundBuffer[playAt])+
+ (soundBuffer[soundBufferAt]-soundBuffer[0]);
+ } else {
+ bytes = soundBuffer[soundBufferAt]-soundBuffer[playAt];
+ }
+ //printf("sb=%i\n", bytes);
+
+// if (bytes < SOUNDSIZE/2)
+// return 0;
+
+ return bytes;
+}
+
+////////////////////////////////////////////////////////////////////////
+// FEED SOUND DATA
+////////////////////////////////////////////////////////////////////////
+
+void SoundFeedStreamData(unsigned char* pSound,long lBytes)
+{
+ int rem;
+
+ if (lBytes > (buffer_size<<2)*kMaxSoundBuffers) {
+ printf("sound feed overflow!\n");
+ return;
+ }
+
+ rem = soundBuffer[kMaxSoundBuffers]-(soundBuffer[soundBufferAt]+bufferIndex);
+ if (lBytes > rem) {
+ memcpy(soundBuffer[soundBufferAt]+bufferIndex, pSound, rem);
+ lBytes -= rem; pSound += rem;
+ soundQueued += kMaxSoundBuffers-soundBufferAt;
+ soundBufferAt = 0; bufferIndex = 0;
+ }
+ memcpy(soundBuffer[soundBufferAt]+bufferIndex, pSound, lBytes);
+ soundBufferAt += (lBytes+bufferIndex)/(buffer_size<<2);
+ soundQueued += (lBytes+bufferIndex)/(buffer_size<<2);
+ bufferIndex = (lBytes+bufferIndex)%(buffer_size<<2);
+
+ if (soundQueued >= kMaxSoundBuffers) {
+ printf("sound buffer overflow!\n");
+ }
+}
+
+#endif
diff --git a/macosx/plugins/DFXVideo/English.lproj/Credits.rtf b/macosx/plugins/DFXVideo/English.lproj/Credits.rtf
new file mode 100644
index 0000000..f49ff39
--- /dev/null
+++ b/macosx/plugins/DFXVideo/English.lproj/Credits.rtf
@@ -0,0 +1,13 @@
+{\rtf1\mac\ansicpg10000\cocoartf102
+{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx565\tx1133\tx1700\tx2266\tx2833\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\ql\qnatural
+
+\f0\b\fs24 \cf0 Created By
+\f1\b0 \
+ Pete Bernert and the P.E.Op.S. team\
+\
+
+\f0\b Macintosh Port By
+\f1\b0 \
+ Gil Pedersen} \ No newline at end of file
diff --git a/macosx/plugins/DFXVideo/English.lproj/InfoPlist.strings b/macosx/plugins/DFXVideo/English.lproj/InfoPlist.strings
new file mode 100644
index 0000000..df4dfcb
--- /dev/null
+++ b/macosx/plugins/DFXVideo/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/classes.nib b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/classes.nib
new file mode 100644
index 0000000..b94b3c4
--- /dev/null
+++ b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/classes.nib
@@ -0,0 +1,26 @@
+{
+ IBClasses = (
+ {
+ ACTIONS = {"" = id; };
+ CLASS = FirstResponder;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSObject;
+ },
+ {
+ ACTIONS = {cancel = id; hackToggle = id; ok = id; reset = id; };
+ CLASS = NetSfPeopsSoftGPUPluginConfigController;
+ LANGUAGE = ObjC;
+ OUTLETS = {
+ autoFullScreen = NSControl;
+ ditherMode = NSPopUpButton;
+ fpsCounter = NSControl;
+ frameSkipping = NSControl;
+ hackEnable = NSControl;
+ hacksView = NSView;
+ vSync = NSControl;
+ };
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/info.nib b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/info.nib
new file mode 100644
index 0000000..8dfe3d1
--- /dev/null
+++ b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/info.nib
@@ -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>IBDocumentLocation</key>
+ <string>19 23 561 249 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>446.1</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>5</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>8P2137</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/keyedobjects.nib b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/keyedobjects.nib
new file mode 100644
index 0000000..2125a2b
--- /dev/null
+++ b/macosx/plugins/DFXVideo/English.lproj/NetSfPeopsSoftGPUConfig.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFXVideo/Info.plist b/macosx/plugins/DFXVideo/Info.plist
new file mode 100644
index 0000000..8113024
--- /dev/null
+++ b/macosx/plugins/DFXVideo/Info.plist
@@ -0,0 +1,20 @@
+<?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>PeopsSoftGL</string>
+ <key>CFBundleIdentifier</key>
+ <string>net.sf.peops.SoftGpuGLPlugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>PsxP</string>
+ <key>CFBundleSignature</key>
+ <string>PSGl</string>
+ <key>CFBundleVersion</key>
+ <string>1.16</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/classes.nib b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/classes.nib
new file mode 100644
index 0000000..78bbc4f
--- /dev/null
+++ b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/classes.nib
@@ -0,0 +1,22 @@
+{
+ IBClasses = (
+ {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
+ {
+ CLASS = NetSfPeopsSoftGPUPluginGLView;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSOpenGLView;
+ },
+ {
+ CLASS = NetSfPeopsSoftGPUPluginWindow;
+ LANGUAGE = ObjC;
+ SUPERCLASS = NSWindow;
+ },
+ {
+ CLASS = NetSfPeopsSoftGPUPluginWindowController;
+ LANGUAGE = ObjC;
+ OUTLETS = {glView = NSOpenGLView; };
+ SUPERCLASS = NSWindowController;
+ }
+ );
+ IBVersion = 1;
+} \ No newline at end of file
diff --git a/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/info.nib b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/info.nib
new file mode 100644
index 0000000..f4ba252
--- /dev/null
+++ b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/info.nib
@@ -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>IBDocumentLocation</key>
+ <string>99 26 409 240 0 0 1024 746 </string>
+ <key>IBFramework Version</key>
+ <string>364.0</string>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>5</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>7S215</string>
+</dict>
+</plist>
diff --git a/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/keyedobjects.nib b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/keyedobjects.nib
new file mode 100644
index 0000000..fb88d8d
--- /dev/null
+++ b/macosx/plugins/DFXVideo/NetSfPeopsSoftGPUInterface.nib/keyedobjects.nib
Binary files differ
diff --git a/macosx/plugins/DFXVideo/PeopsSoftGPU.xcodeproj/project.pbxproj b/macosx/plugins/DFXVideo/PeopsSoftGPU.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..9657f8c
--- /dev/null
+++ b/macosx/plugins/DFXVideo/PeopsSoftGPU.xcodeproj/project.pbxproj
@@ -0,0 +1,416 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 2B038C07069183300082466B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2B038C05069183300082466B /* InfoPlist.strings */; };
+ 2B038D2306918AA80082466B /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2B038D2206918AA80082466B /* Info.plist */; };
+ 2B143C79078A0C6700AF745A /* PluginWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B957EAE0635DFE400543905 /* PluginWindow.h */; };
+ 2B57868206BE7B3700BBA288 /* ExtendedKeys.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B57868106BE7B3700BBA288 /* ExtendedKeys.h */; };
+ 2B957EB10635DFE400543905 /* PluginWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B957EAF0635DFE400543905 /* PluginWindow.m */; };
+ 2B959DC106342C22000F2A2D /* drawgl.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B3E5D64062B2CC1001D796E /* drawgl.m */; };
+ 2B959DC406342C23000F2A2D /* PluginGLView.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BAF4FC90632967A00DB9A16 /* PluginGLView.h */; };
+ 2B959DCD06342C24000F2A2D /* PluginGLView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BAF4FCA0632967A00DB9A16 /* PluginGLView.m */; };
+ 2B959DD006342C25000F2A2D /* PluginWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B3E5DF0062B36FB001D796E /* PluginWindowController.h */; };
+ 2B959DD506342C25000F2A2D /* PluginWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B3E5DF1062B36FB001D796E /* PluginWindowController.m */; };
+ 2B959DE106342C31000F2A2D /* NetSfPeopsSoftGPUInterface.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2B3E5DED062B36A0001D796E /* NetSfPeopsSoftGPUInterface.nib */; };
+ 2B959E4406342D32000F2A2D /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B959E4306342D32000F2A2D /* OpenGL.framework */; };
+ 2BB260A80777462E00F6854C /* PluginConfigController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BB260A60777462E00F6854C /* PluginConfigController.h */; };
+ 2BB260A90777462E00F6854C /* PluginConfigController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BB260A70777462E00F6854C /* PluginConfigController.m */; };
+ 2BD2E769077AF53E00657C69 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2BD2E767077AF53E00657C69 /* Credits.rtf */; };
+ 2BD2E829077AFC2C00657C69 /* NetSfPeopsSoftGPUConfig.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2BD2E828077AFC2C00657C69 /* NetSfPeopsSoftGPUConfig.nib */; };
+ 2BD7C777076E1FAB000F05ED /* GLUT.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B51949E06B3D2D200744730 /* GLUT.framework */; };
+ 71E9EC06109F24E700E98D1D /* fps.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBF4109F24E600E98D1D /* fps.c */; };
+ 71E9EC08109F24E700E98D1D /* gpu.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBF6109F24E600E98D1D /* gpu.c */; };
+ 71E9EC0B109F24E700E98D1D /* key.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBF9109F24E600E98D1D /* key.c */; };
+ 71E9EC0D109F24E700E98D1D /* menu.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBFB109F24E600E98D1D /* menu.c */; };
+ 71E9EC0F109F24E700E98D1D /* prim.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBFD109F24E700E98D1D /* prim.c */; };
+ 71E9EC11109F24E700E98D1D /* soft.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EBFF109F24E700E98D1D /* soft.c */; };
+ 71E9EC14109F24E700E98D1D /* zn.c in Sources */ = {isa = PBXBuildFile; fileRef = 71E9EC02109F24E700E98D1D /* zn.c */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 2B038C06069183300082466B /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 2B038D2206918AA80082466B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = "<group>"; };
+ 2B371FBB0773859200B1DC0B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/NetSfPeopsSoftGPUConfig.nib; sourceTree = "<group>"; };
+ 2B3E5D64062B2CC1001D796E /* drawgl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = drawgl.m; path = macsrc/drawgl.m; sourceTree = SOURCE_ROOT; };
+ 2B3E5DED062B36A0001D796E /* NetSfPeopsSoftGPUInterface.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = NetSfPeopsSoftGPUInterface.nib; sourceTree = "<group>"; };
+ 2B3E5DF0062B36FB001D796E /* PluginWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PluginWindowController.h; path = macsrc/PluginWindowController.h; sourceTree = SOURCE_ROOT; };
+ 2B3E5DF1062B36FB001D796E /* PluginWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PluginWindowController.m; path = macsrc/PluginWindowController.m; sourceTree = SOURCE_ROOT; };
+ 2B51949E06B3D2D200744730 /* GLUT.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLUT.framework; path = /System/Library/Frameworks/GLUT.framework; sourceTree = "<absolute>"; };
+ 2B57868106BE7B3700BBA288 /* ExtendedKeys.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ExtendedKeys.h; path = macsrc/ExtendedKeys.h; sourceTree = SOURCE_ROOT; };
+ 2B957EAE0635DFE400543905 /* PluginWindow.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PluginWindow.h; path = macsrc/PluginWindow.h; sourceTree = SOURCE_ROOT; };
+ 2B957EAF0635DFE400543905 /* PluginWindow.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PluginWindow.m; path = macsrc/PluginWindow.m; sourceTree = SOURCE_ROOT; };
+ 2B959E4306342D32000F2A2D /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
+ 2BAF4FC90632967A00DB9A16 /* PluginGLView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PluginGLView.h; path = macsrc/PluginGLView.h; sourceTree = SOURCE_ROOT; };
+ 2BAF4FCA0632967A00DB9A16 /* PluginGLView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PluginGLView.m; path = macsrc/PluginGLView.m; sourceTree = SOURCE_ROOT; };
+ 2BAF50930632BB1A00DB9A16 /* PeopsSoftGL.psxplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PeopsSoftGL.psxplugin; sourceTree = BUILT_PRODUCTS_DIR; };
+ 2BB260A60777462E00F6854C /* PluginConfigController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PluginConfigController.h; path = macsrc/PluginConfigController.h; sourceTree = SOURCE_ROOT; };
+ 2BB260A70777462E00F6854C /* PluginConfigController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PluginConfigController.m; path = macsrc/PluginConfigController.m; sourceTree = SOURCE_ROOT; };
+ 2BD2E768077AF53E00657C69 /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = "<group>"; };
+ 71E9EBF1109F24E600E98D1D /* cfg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cfg.h; path = ../../../plugins/dfxvideo/cfg.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF2109F24E600E98D1D /* draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = draw.h; path = ../../../plugins/dfxvideo/draw.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF3109F24E600E98D1D /* externals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = externals.h; path = ../../../plugins/dfxvideo/externals.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF4109F24E600E98D1D /* fps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fps.c; path = ../../../plugins/dfxvideo/fps.c; sourceTree = SOURCE_ROOT; };
+ 71E9EBF5109F24E600E98D1D /* fps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fps.h; path = ../../../plugins/dfxvideo/fps.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF6109F24E600E98D1D /* gpu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = gpu.c; path = ../../../plugins/dfxvideo/gpu.c; sourceTree = SOURCE_ROOT; };
+ 71E9EBF7109F24E600E98D1D /* gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = gpu.h; path = ../../../plugins/dfxvideo/gpu.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF8109F24E600E98D1D /* interp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = interp.h; path = ../../../plugins/dfxvideo/interp.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBF9109F24E600E98D1D /* key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = key.c; path = ../../../plugins/dfxvideo/key.c; sourceTree = SOURCE_ROOT; };
+ 71E9EBFA109F24E600E98D1D /* key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = key.h; path = ../../../plugins/dfxvideo/key.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBFB109F24E600E98D1D /* menu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = menu.c; path = ../../../plugins/dfxvideo/menu.c; sourceTree = SOURCE_ROOT; };
+ 71E9EBFC109F24E700E98D1D /* menu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = menu.h; path = ../../../plugins/dfxvideo/menu.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBFD109F24E700E98D1D /* prim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = prim.c; path = ../../../plugins/dfxvideo/prim.c; sourceTree = SOURCE_ROOT; };
+ 71E9EBFE109F24E700E98D1D /* prim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = prim.h; path = ../../../plugins/dfxvideo/prim.h; sourceTree = SOURCE_ROOT; };
+ 71E9EBFF109F24E700E98D1D /* soft.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = soft.c; path = ../../../plugins/dfxvideo/soft.c; sourceTree = SOURCE_ROOT; };
+ 71E9EC00109F24E700E98D1D /* soft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = soft.h; path = ../../../plugins/dfxvideo/soft.h; sourceTree = SOURCE_ROOT; };
+ 71E9EC01109F24E700E98D1D /* swap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = swap.h; path = ../../../plugins/dfxvideo/swap.h; sourceTree = SOURCE_ROOT; };
+ 71E9EC02109F24E700E98D1D /* zn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zn.c; path = ../../../plugins/dfxvideo/zn.c; sourceTree = SOURCE_ROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 2BAF50910632BB1A00DB9A16 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2B959E4406342D32000F2A2D /* OpenGL.framework in Frameworks */,
+ 2BD7C777076E1FAB000F05ED /* GLUT.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 2B3E59FF062AAC1A001D796E = {
+ isa = PBXGroup;
+ children = (
+ 71E9EBF0109F24B600E98D1D /* src */,
+ 2BD2E2F40779F50B00657C69 /* macsrc */,
+ 2BD2E818077AFB9F00657C69 /* English.lproj */,
+ 2B3E5DED062B36A0001D796E /* NetSfPeopsSoftGPUInterface.nib */,
+ 2B038D2206918AA80082466B /* Info.plist */,
+ 2B3E5A0B062AAC34001D796E /* Frameworks */,
+ 2B3E5A46062AACF3001D796E /* Products */,
+ );
+ sourceTree = "<group>";
+ };
+ 2B3E5A0B062AAC34001D796E /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 2B959E4306342D32000F2A2D /* OpenGL.framework */,
+ 2B51949E06B3D2D200744730 /* GLUT.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 2B3E5A46062AACF3001D796E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 2BAF50930632BB1A00DB9A16 /* PeopsSoftGL.psxplugin */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 2BD2E2F40779F50B00657C69 /* macsrc */ = {
+ isa = PBXGroup;
+ children = (
+ 2BB260A60777462E00F6854C /* PluginConfigController.h */,
+ 2BB260A70777462E00F6854C /* PluginConfigController.m */,
+ 2B3E5DF0062B36FB001D796E /* PluginWindowController.h */,
+ 2B3E5DF1062B36FB001D796E /* PluginWindowController.m */,
+ 2B957EAE0635DFE400543905 /* PluginWindow.h */,
+ 2B957EAF0635DFE400543905 /* PluginWindow.m */,
+ 2BAF4FC90632967A00DB9A16 /* PluginGLView.h */,
+ 2BAF4FCA0632967A00DB9A16 /* PluginGLView.m */,
+ 2B3E5D64062B2CC1001D796E /* drawgl.m */,
+ 2B57868106BE7B3700BBA288 /* ExtendedKeys.h */,
+ );
+ name = macsrc;
+ sourceTree = "<group>";
+ };
+ 2BD2E818077AFB9F00657C69 /* English.lproj */ = {
+ isa = PBXGroup;
+ children = (
+ 2BD2E828077AFC2C00657C69 /* NetSfPeopsSoftGPUConfig.nib */,
+ 2BD2E767077AF53E00657C69 /* Credits.rtf */,
+ 2B038C05069183300082466B /* InfoPlist.strings */,
+ );
+ name = English.lproj;
+ sourceTree = "<group>";
+ };
+ 71E9EBF0109F24B600E98D1D /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 71E9EBF1109F24E600E98D1D /* cfg.h */,
+ 71E9EBF2109F24E600E98D1D /* draw.h */,
+ 71E9EBF3109F24E600E98D1D /* externals.h */,
+ 71E9EBF4109F24E600E98D1D /* fps.c */,
+ 71E9EBF5109F24E600E98D1D /* fps.h */,
+ 71E9EBF6109F24E600E98D1D /* gpu.c */,
+ 71E9EBF7109F24E600E98D1D /* gpu.h */,
+ 71E9EBF8109F24E600E98D1D /* interp.h */,
+ 71E9EBF9109F24E600E98D1D /* key.c */,
+ 71E9EBFA109F24E600E98D1D /* key.h */,
+ 71E9EBFB109F24E600E98D1D /* menu.c */,
+ 71E9EBFC109F24E700E98D1D /* menu.h */,
+ 71E9EBFD109F24E700E98D1D /* prim.c */,
+ 71E9EBFE109F24E700E98D1D /* prim.h */,
+ 71E9EBFF109F24E700E98D1D /* soft.c */,
+ 71E9EC00109F24E700E98D1D /* soft.h */,
+ 71E9EC01109F24E700E98D1D /* swap.h */,
+ 71E9EC02109F24E700E98D1D /* zn.c */,
+ );
+ name = src;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 2BAF508E0632BB1A00DB9A16 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2B959DC406342C23000F2A2D /* PluginGLView.h in Headers */,
+ 2B959DD006342C25000F2A2D /* PluginWindowController.h in Headers */,
+ 2B57868206BE7B3700BBA288 /* ExtendedKeys.h in Headers */,
+ 2BB260A80777462E00F6854C /* PluginConfigController.h in Headers */,
+ 2B143C79078A0C6700AF745A /* PluginWindow.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 2BAF50920632BB1A00DB9A16 /* gpuPeopsSoftGL */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 7170842C0FDFD328004F3EB4 /* Build configuration list for PBXNativeTarget "gpuPeopsSoftGL" */;
+ buildPhases = (
+ 2BAF508E0632BB1A00DB9A16 /* Headers */,
+ 2BAF508F0632BB1A00DB9A16 /* Resources */,
+ 2BAF50900632BB1A00DB9A16 /* Sources */,
+ 2BAF50910632BB1A00DB9A16 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = gpuPeopsSoftGL;
+ productName = gpuPeopsSoftGL;
+ productReference = 2BAF50930632BB1A00DB9A16 /* PeopsSoftGL.psxplugin */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 2B3E5A03062AAC1A001D796E /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 717084310FDFD328004F3EB4 /* Build configuration list for PBXProject "PeopsSoftGPU" */;
+ hasScannedForEncodings = 1;
+ mainGroup = 2B3E59FF062AAC1A001D796E;
+ productRefGroup = 2B3E5A46062AACF3001D796E /* Products */;
+ projectDirPath = "";
+ targets = (
+ 2BAF50920632BB1A00DB9A16 /* gpuPeopsSoftGL */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 2BAF508F0632BB1A00DB9A16 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2B959DE106342C31000F2A2D /* NetSfPeopsSoftGPUInterface.nib in Resources */,
+ 2B038C07069183300082466B /* InfoPlist.strings in Resources */,
+ 2B038D2306918AA80082466B /* Info.plist in Resources */,
+ 2BD2E829077AFC2C00657C69 /* NetSfPeopsSoftGPUConfig.nib in Resources */,
+ 2BD2E769077AF53E00657C69 /* Credits.rtf in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 2BAF50900632BB1A00DB9A16 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 2B959DC106342C22000F2A2D /* drawgl.m in Sources */,
+ 2B959DCD06342C24000F2A2D /* PluginGLView.m in Sources */,
+ 2B959DD506342C25000F2A2D /* PluginWindowController.m in Sources */,
+ 2B957EB10635DFE400543905 /* PluginWindow.m in Sources */,
+ 2BB260A90777462E00F6854C /* PluginConfigController.m in Sources */,
+ 71E9EC06109F24E700E98D1D /* fps.c in Sources */,
+ 71E9EC08109F24E700E98D1D /* gpu.c in Sources */,
+ 71E9EC0B109F24E700E98D1D /* key.c in Sources */,
+ 71E9EC0D109F24E700E98D1D /* menu.c in Sources */,
+ 71E9EC0F109F24E700E98D1D /* prim.c in Sources */,
+ 71E9EC11109F24E700E98D1D /* soft.c in Sources */,
+ 71E9EC14109F24E700E98D1D /* zn.c in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 2B038C05069183300082466B /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2B038C06069183300082466B /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ 2BD2E767077AF53E00657C69 /* Credits.rtf */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2BD2E768077AF53E00657C69 /* English */,
+ );
+ name = Credits.rtf;
+ sourceTree = "<group>";
+ };
+ 2BD2E828077AFC2C00657C69 /* NetSfPeopsSoftGPUConfig.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 2B371FBB0773859200B1DC0B /* English */,
+ );
+ name = NetSfPeopsSoftGPUConfig.nib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 7170842D0FDFD328004F3EB4 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DEBUGGING_SYMBOLS = YES;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 1;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ _MACGL,
+ _DARWIN,
+ );
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OPTIMIZATION_CFLAGS = "-finline-functions -finline-limit=1600 -fomit-frame-pointer -fno-exceptions -funroll-loops -falign-loops=16 -ffast-math";
+ OTHER_CFLAGS = "-finline-functions";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = PeopsSoftGL;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ };
+ name = Development;
+ };
+ 7170842E0FDFD328004F3EB4 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = YES;
+ DEBUGGING_SYMBOLS = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = "";
+ GCC_OPTIMIZATION_LEVEL = 3;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "";
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ _MACGL,
+ _DARWIN,
+ );
+ GCC_WARN_FOUR_CHARACTER_CONSTANTS = NO;
+ GCC_WARN_UNKNOWN_PRAGMAS = NO;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(USER_LIBRARY_DIR)/Playstation Emulator Plugins";
+ LIBRARY_STYLE = BUNDLE;
+ OPTIMIZATION_CFLAGS = "-finline-functions -finline-limit=1600 -fomit-frame-pointer -fno-exceptions -funroll-loops -falign-loops=16 -ffast-math";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ OTHER_REZFLAGS = "";
+ PRODUCT_NAME = PeopsSoftGL;
+ SECTORDER_FLAGS = "";
+ SYMROOT = ../../build;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ WRAPPER_EXTENSION = psxplugin;
+ ZERO_LINK = NO;
+ };
+ name = Deployment;
+ };
+ 717084320FDFD328004F3EB4 /* Development */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_MODEL_TUNING = "";
+ HEADER_SEARCH_PATHS = (
+ ../../../plugins/dfxvideo,
+ ../../../libpcsxcore,
+ );
+ };
+ name = Development;
+ };
+ 717084330FDFD328004F3EB4 /* Deployment */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ GCC_MODEL_TUNING = "";
+ HEADER_SEARCH_PATHS = (
+ ../../../plugins/dfxvideo,
+ ../../../libpcsxcore,
+ );
+ };
+ name = Deployment;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 7170842C0FDFD328004F3EB4 /* Build configuration list for PBXNativeTarget "gpuPeopsSoftGL" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 7170842D0FDFD328004F3EB4 /* Development */,
+ 7170842E0FDFD328004F3EB4 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+ 717084310FDFD328004F3EB4 /* Build configuration list for PBXProject "PeopsSoftGPU" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 717084320FDFD328004F3EB4 /* Development */,
+ 717084330FDFD328004F3EB4 /* Deployment */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Development;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 2B3E5A03062AAC1A001D796E /* Project object */;
+}
diff --git a/macosx/plugins/DFXVideo/macsrc/ExtendedKeys.h b/macosx/plugins/DFXVideo/macsrc/ExtendedKeys.h
new file mode 100644
index 0000000..1b6475b
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/ExtendedKeys.h
@@ -0,0 +1,23 @@
+
+#ifndef __EXTENDED_KEYS_H__
+#define __EXTENDED_KEYS_H__
+
+enum {
+ PSX_FREEZE_KEY = 0xFFBE/*XK_F1*/,
+ PSX_NEXT_FREEZE_SLOT_KEY = 0xFFBF/*XK_F2*/,
+ PSX_DEFROST_KEY = 0xFFC0/*XK_F3*/,
+ PSX_SHOW_FREEZE_PIC_KEY = 0xFFC1/*XK_F4*/,
+ PSX_SIO_ALWAYS_ON_KEY = 0xFFC2/*XK_F5*/,
+ PSX_BW_MDEC_KEY = 0xFFC3/*XK_F6*/,
+ PSX_XA_AUDIO_ON_KEY = 0xFFC4/*XK_F7*/,
+ PSX_SNAPSHOT_KEY = 0xFFC5/*XK_F8*/,
+ PSX_OPEN_SHELL_KEY = 0xFFC6/*XK_F9*/,
+ PSX_CLOSE_SHELL_KEY = 0xFFC7/*XK_F10*/,
+
+ PSX_STOP_KEY = 0xFF1B/*XK_Escape*/,
+
+ GPU_FULLSCREEN_KEY = 0x0100,
+ GPU_FPS_DISPLAY_KEY = 0xFFFF/*XK_Delete*/
+};
+
+#endif //__EXTENDED_KEYS_H__
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h
new file mode 100644
index 0000000..0e73441
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.h
@@ -0,0 +1,26 @@
+/* NetSfPeopsSoftGPUPluginConfigController */
+
+#define PluginConfigController NetSfPeopsSoftGPUPluginConfigController
+
+#import <Cocoa/Cocoa.h>
+
+@interface PluginConfigController : NSWindowController
+{
+ IBOutlet NSControl *autoFullScreen;
+ IBOutlet NSPopUpButton *ditherMode;
+ IBOutlet NSControl *fpsCounter;
+ IBOutlet NSControl *frameSkipping;
+ IBOutlet NSControl *hackEnable;
+ IBOutlet NSView *hacksView;
+ IBOutlet NSControl *vSync;
+
+ NSMutableDictionary *keyValues;
+}
+- (IBAction)cancel:(id)sender;
+- (IBAction)ok:(id)sender;
+- (IBAction)reset:(id)sender;
+- (IBAction)hackToggle:(id)sender;
+
+- (void)loadValues;
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m
new file mode 100644
index 0000000..2d3e667
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginConfigController.m
@@ -0,0 +1,216 @@
+#import "PluginConfigController.h"
+#include "gpu.h"
+#include "cfg.h"
+#include "menu.h"
+#include "externals.h"
+
+#define APP_ID @"net.sf.peops.SoftGpuGLPlugin"
+#define PrefsKey APP_ID @" Settings"
+
+static PluginConfigController *windowController;
+char * pConfigFile=NULL;
+
+void AboutDlgProc()
+{
+ // Get parent application instance
+ NSApplication *app = [NSApplication sharedApplication];
+ NSBundle *bundle = [NSBundle bundleWithIdentifier:APP_ID];
+
+ // Get Credits.rtf
+ NSString *path = [bundle pathForResource:@"Credits" ofType:@"rtf"];
+ NSAttributedString *credits;
+ if (path) {
+ credits = [[[NSAttributedString alloc] initWithPath: path
+ documentAttributes:NULL] autorelease];
+ } else {
+ credits = [[[NSAttributedString alloc] initWithString:@""] autorelease];
+ }
+
+ // Get Application Icon
+ NSImage *icon = [[NSWorkspace sharedWorkspace] iconForFile:[bundle bundlePath]];
+ NSSize size = NSMakeSize(64, 64);
+ [icon setSize:size];
+
+ [app orderFrontStandardAboutPanelWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:
+ [bundle objectForInfoDictionaryKey:@"CFBundleName"], @"ApplicationName",
+ icon, @"ApplicationIcon",
+ [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"], @"ApplicationVersion",
+ [bundle objectForInfoDictionaryKey:@"CFBundleVersion"], @"Version",
+ [bundle objectForInfoDictionaryKey:@"NSHumanReadableCopyright"], @"Copyright",
+ credits, @"Credits",
+ nil]];
+}
+
+
+void SoftDlgProc()
+{
+ NSWindow *window;
+
+ if (windowController == nil) {
+ windowController = [[PluginConfigController alloc] initWithWindowNibName:@"NetSfPeopsSoftGPUConfig"];
+ }
+ window = [windowController window];
+
+ /* load values */
+ [windowController loadValues];
+
+ [window center];
+ [window makeKeyAndOrderFront:nil];
+}
+
+void ReadConfig(void)
+{
+ NSDictionary *keyValues;
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:
+ [[NSMutableDictionary alloc] initWithObjectsAndKeys:
+ [NSNumber numberWithBool:NO], @"FPS Counter",
+ [NSNumber numberWithBool:NO], @"Auto Full Screen",
+ [NSNumber numberWithBool:NO], @"Frame Skipping",
+ [NSNumber numberWithBool:YES], @"Frame Limit",
+ [NSNumber numberWithBool:NO], @"VSync",
+ [NSNumber numberWithBool:NO], @"Enable Hacks",
+ [NSNumber numberWithInt:1], @"Dither Mode",
+ [NSNumber numberWithLong:0], @"Hacks",
+ nil], PrefsKey,
+ nil]];
+
+ keyValues = [defaults dictionaryForKey:PrefsKey];
+
+ iShowFPS = [[keyValues objectForKey:@"FPS Counter"] boolValue];
+ iWindowMode = [[keyValues objectForKey:@"Auto Full Screen"] boolValue] ? 0 : 1;
+ UseFrameSkip = [[keyValues objectForKey:@"Frame Skipping"] boolValue];
+ UseFrameLimit = [[keyValues objectForKey:@"Frame Limit"] boolValue];
+ //??? = [[keyValues objectForKey:@"VSync"] boolValue];
+ iUseFixes = [[keyValues objectForKey:@"Enable Hacks"] boolValue];
+
+ iUseDither = [[keyValues objectForKey:@"Dither Mode"] intValue];
+ dwCfgFixes = [[keyValues objectForKey:@"Hacks"] longValue];
+
+ iResX = 640;
+ iResY = 480;
+ iUseNoStretchBlt = 1;
+
+ fFrameRate = 60;
+ iFrameLimit = 2;
+
+ if (iShowFPS)
+ ulKeybits|=KEY_SHOWFPS;
+ else
+ ulKeybits&=~KEY_SHOWFPS;
+
+ // additional checks
+ if(!iColDepth) iColDepth=32;
+ if(iUseFixes) dwActFixes=dwCfgFixes;
+ else dwActFixes=0;
+ SetFixes();
+
+ if(iFrameLimit==2) SetAutoFrameCap();
+ bSkipNextFrame = FALSE;
+
+ szDispBuf[0]=0;
+ BuildDispMenu(0);
+}
+
+@implementation PluginConfigController
+
+- (IBAction)cancel:(id)sender
+{
+ [self close];
+}
+
+- (IBAction)ok:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ NSMutableDictionary *writeDic = [NSMutableDictionary dictionaryWithDictionary:keyValues];
+ [writeDic setObject:[NSNumber numberWithInt:[fpsCounter intValue]] forKey:@"FPS Counter"];
+ [writeDic setObject:[NSNumber numberWithInt:[autoFullScreen intValue]] forKey:@"Auto Full Screen"];
+ [writeDic setObject:[NSNumber numberWithInt:[frameSkipping intValue]] forKey:@"Frame Skipping"];
+ //[writeDic setObject:[NSNumber numberWithInt:[frameLimit intValue]] forKey:@"Frame Limit"];
+ [writeDic setObject:[NSNumber numberWithInt:[vSync intValue]] forKey:@"VSync"];
+ [writeDic setObject:[NSNumber numberWithInt:[hackEnable intValue]] forKey:@"Enable Hacks"];
+
+ [writeDic setObject:[NSNumber numberWithInt:[ditherMode indexOfSelectedItem]] forKey:@"Dither Mode"];
+
+ unsigned long hackValues = 0;
+ int i;
+ NSArray *views = [hacksView subviews];
+ for (i=0; i<[views count]; i++) {
+ NSView *control = [views objectAtIndex:i];
+ if ([control isKindOfClass:[NSButton class]]) {
+ hackValues |= [(NSControl *)control intValue] << ([control tag] - 1);
+ }
+ }
+
+ [writeDic setObject:[NSNumber numberWithLong:hackValues] forKey:@"Hacks"];
+
+ // write to defaults
+ [defaults setObject:writeDic forKey:PrefsKey];
+ [defaults synchronize];
+
+ // and set global values accordingly
+ ReadConfig();
+
+ [self close];
+}
+
+- (IBAction)reset:(id)sender
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults removeObjectForKey:PrefsKey];
+ [self loadValues];
+}
+
+- (IBAction)hackToggle:(id)sender
+{
+ BOOL enable = [sender intValue] ? YES : NO;
+ int i;
+ NSArray *views = [hacksView subviews];
+
+ for (i=0; i<[views count]; i++) {
+ NSView *control = [views objectAtIndex:i];
+ if ([control isKindOfClass:[NSButton class]]) {
+ [(NSControl *)control setEnabled:enable];
+ }
+ }
+}
+
+- (void)loadValues
+{
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+ ReadConfig();
+
+ /* load from preferences */
+ [keyValues release];
+ keyValues = [[defaults dictionaryForKey:PrefsKey] retain];
+
+ [fpsCounter setIntValue:[[keyValues objectForKey:@"FPS Counter"] intValue]];
+ [autoFullScreen setIntValue:[[keyValues objectForKey:@"Auto Full Screen"] intValue]];
+ [frameSkipping setIntValue:[[keyValues objectForKey:@"Frame Skipping"] intValue]];
+ [vSync setIntValue:[[keyValues objectForKey:@"VSync"] intValue]];
+ [hackEnable setIntValue:[[keyValues objectForKey:@"Enable Hacks"] intValue]];
+
+ [ditherMode selectItemAtIndex:[[keyValues objectForKey:@"Dither Mode"] intValue]];
+
+ unsigned long hackValues = [[keyValues objectForKey:@"Hacks"] longValue];
+
+ int i;
+ NSArray *views = [hacksView subviews];
+ for (i=0; i<[views count]; i++) {
+ NSView *control = [views objectAtIndex:i];
+ if ([control isKindOfClass:[NSButton class]]) {
+ [(NSControl *)control setIntValue:(hackValues >> ([control tag] - 1)) & 1];
+ }
+ }
+
+ [self hackToggle:hackEnable];
+}
+
+- (void)awakeFromNib
+{
+ hacksView = [[hacksView subviews] objectAtIndex:0];
+}
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginGLView.h b/macosx/plugins/DFXVideo/macsrc/PluginGLView.h
new file mode 100644
index 0000000..fea3b89
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginGLView.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ PluginGLView.h
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Sun April 18 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#define PluginGLView NetSfPeopsSoftGPUPluginGLView
+
+#import <Cocoa/Cocoa.h>
+#import <OpenGL/gl.h>
+#include <sys/time.h>
+
+#define IMAGE_COUNT 2
+
+@interface PluginGLView : NSOpenGLView
+{
+ GLubyte *image_base;
+ GLubyte *image[IMAGE_COUNT];
+
+ GLint buffers;
+ //GLint frame_rate;
+
+ GLenum texture_hint;
+ GLboolean rect_texture;
+ GLboolean client_storage;
+ GLboolean texture_range;
+
+ struct timeval cycle_time;
+
+ NSLock *glLock;
+ BOOL noDisplay;
+ BOOL drawBG;
+
+ int image_width;
+ int image_height;
+ int image_width2;
+ int image_height2;
+ int image_depth;
+ int image_type;
+ float image_tx;
+ float image_ty;
+ int whichImage;
+ int isFullscreen;
+}
+
+- (void)renderScreen;
+- (void)swapBuffer;
+- (void)clearBuffer:(BOOL)display;
+- (void)loadTextures: (GLboolean)first;
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginGLView.m b/macosx/plugins/DFXVideo/macsrc/PluginGLView.m
new file mode 100644
index 0000000..96b05ff
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginGLView.m
@@ -0,0 +1,692 @@
+/***************************************************************************
+ PluginGLView.m
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Sun April 18 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#import <OpenGL/gl.h>
+#import <OpenGL/glext.h>
+#import <OpenGL/glu.h>
+#import <GLUT/glut.h>
+#import <Carbon/Carbon.h>
+#import "PluginGLView.h"
+#include "externals.h"
+#undef BOOL
+#include "gpu.h"
+#include "swap.h"
+
+#include <time.h>
+extern time_t tStart;
+
+static int mylog2(int val)
+{
+ int i;
+ for (i=1; i<31; i++)
+ if (val <= (1 << i))
+ return (1 << i);
+
+ return -1;
+}
+
+#if 0
+void BlitScreen16NS(unsigned char * surf,long x,long y)
+{
+ unsigned long lu;
+ unsigned short row,column;
+ unsigned short dx=PreviousPSXDisplay.Range.x1>>1;
+ unsigned short dy=PreviousPSXDisplay.DisplayMode.y;
+ unsigned short LineOffset,SurfOffset;
+ long lPitch=image_width<<1;
+
+ if(PreviousPSXDisplay.Range.y0) // centering needed?
+ {
+ surf+=PreviousPSXDisplay.Range.y0*lPitch;
+ dy-=PreviousPSXDisplay.Range.y0;
+ }
+
+ {
+ unsigned long * SRCPtr = (unsigned long *)(psxVuw + (y<<10) + x);
+ unsigned long * DSTPtr = ((unsigned long *)surf)+(PreviousPSXDisplay.Range.x0>>1);
+
+ LineOffset = 512 - dx;
+ SurfOffset = (lPitch>>2) - dx;
+
+ for(column=0;column<dy;column++)
+ {
+ for(row=0;row<dx;row++)
+ {
+ lu=GETLE16D(SRCPtr++);
+
+ *DSTPtr++= lu;//((lu<<11)&0xf800f800)|((lu<<1)&0x7c007c0)|((lu>>10)&0x1f001f);
+ }
+ SRCPtr += LineOffset;
+ DSTPtr += SurfOffset;
+ }
+ }
+}
+#endif
+
+@implementation PluginGLView
+
+//- (id)initWithFrame:(NSRect)frameRect
+- (id) initWithCoder: (NSCoder *) coder
+{
+ const GLubyte * strExt;
+
+ if ((self = [super initWithCoder:coder]) == nil)
+ return nil;
+
+ glLock = [[NSLock alloc] init];
+ if (nil == glLock) {
+ [self release];
+ return nil;
+ }
+
+ // Init pixel format attribs
+ NSOpenGLPixelFormatAttribute attrs[] =
+ {
+ NSOpenGLPFAAccelerated,
+ NSOpenGLPFANoRecovery,
+ NSOpenGLPFADoubleBuffer,
+ 0
+ };
+
+ // Get pixel format from OpenGL
+ NSOpenGLPixelFormat* pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
+ if (!pixFmt)
+ {
+ NSLog(@"No Accelerated OpenGL pixel format found\n");
+
+ NSOpenGLPixelFormatAttribute attrs2[] =
+ {
+ NSOpenGLPFANoRecovery,
+ 0
+ };
+
+ // Get pixel format from OpenGL
+ pixFmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs2];
+ if (!pixFmt) {
+ NSLog(@"No OpenGL pixel format found!\n");
+
+ [self release];
+ return nil;
+ }
+ }
+
+ [self setPixelFormat:[pixFmt autorelease]];
+
+ /*
+ long swapInterval = 1 ;
+ [[self openGLContext]
+ setValues:&swapInterval
+ forParameter:NSOpenGLCPSwapInterval];
+ */
+ [glLock lock];
+ [[self openGLContext] makeCurrentContext];
+
+ // Init object members
+ strExt = glGetString (GL_EXTENSIONS);
+ texture_range = gluCheckExtension ((const unsigned char *)"GL_APPLE_texture_range", strExt) ? GL_TRUE : GL_FALSE;
+ texture_hint = GL_STORAGE_SHARED_APPLE ;
+ client_storage = gluCheckExtension ((const unsigned char *)"GL_APPLE_client_storage", strExt) ? GL_TRUE : GL_FALSE;
+ rect_texture = gluCheckExtension((const unsigned char *)"GL_EXT_texture_rectangle", strExt) ? GL_TRUE : GL_FALSE;
+
+ // Setup some basic OpenGL stuff
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ [NSOpenGLContext clearCurrentContext];
+ [glLock unlock];
+
+ image_width = 1024;
+ image_height = 512;
+ image_depth = 16;
+
+ image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ image_base = (GLubyte *) calloc(((IMAGE_COUNT * image_width * image_height) / 3) * 4, image_depth >> 3);
+ if (image_base == nil) {
+ [self release];
+ return nil;
+ }
+
+ // Create and load textures for the first time
+ [self loadTextures:GL_TRUE];
+
+ // Init fps timer
+ //gettimeofday(&cycle_time, NULL);
+
+ drawBG = YES;
+
+ // Call for a redisplay
+ noDisplay = YES;
+ PSXDisplay.Disabled = 1;
+ [self setNeedsDisplay:true];
+
+ return self;
+}
+
+- (void)dealloc
+{
+ int i;
+
+ [glLock lock];
+
+ [[self openGLContext] makeCurrentContext];
+ for(i = 0; i < IMAGE_COUNT; i++)
+ {
+ GLuint dt = i+1;
+ glDeleteTextures(1, &dt);
+ }
+ if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
+
+ [NSOpenGLContext clearCurrentContext];
+ [glLock unlock];
+ [glLock release];
+
+ if (image_base)
+ free(image_base);
+
+ [super dealloc];
+}
+
+- (BOOL)isOpaque
+{
+ return YES;
+}
+
+- (BOOL)acceptsFirstResponder
+{
+ return NO;
+}
+
+- (void)drawRect:(NSRect)aRect
+{
+ // Check if an update has occured to the buffer
+ if ([self lockFocusIfCanDraw]) {
+
+ // Make this context current
+ if (drawBG) {
+ [[NSColor blackColor] setFill];
+ [NSBezierPath fillRect:[self visibleRect]];
+ }
+
+ //glFinish() ;
+ // Swap buffer to screen
+ //[[self openGLContext] flushBuffer];
+
+ [self unlockFocus];
+ }
+}
+
+#if 0
+- (void)update // moved or resized
+{
+ NSRect rect;
+
+ [super update];
+
+ [[self openGLContext] makeCurrentContext];
+ [[self openGLContext] update];
+
+ rect = [self bounds];
+
+ glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ //[self setNeedsDisplay:true];
+}
+#endif
+
+- (void)reshape // scrolled, moved or resized
+{
+ [glLock lock];
+
+ NSOpenGLContext *oglContext = [self openGLContext];
+ NSRect rect;
+
+ [super reshape];
+
+ [oglContext makeCurrentContext];
+ [oglContext update];
+
+ rect = [[oglContext view] bounds];
+
+ glViewport(0, 0, (int) rect.size.width, (int) rect.size.height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ drawBG = YES;
+
+ [NSOpenGLContext clearCurrentContext];
+
+// [self setNeedsDisplay:true];
+
+ [self renderScreen];
+ [glLock unlock];
+}
+
+- (void)renderScreen
+{
+ int bufferIndex = whichImage;
+
+ if (1/*[glLock tryLock]*/) {
+ // Make this context current
+ [[self openGLContext] makeCurrentContext];
+ if (PSXDisplay.Disabled) {
+ glClear(GL_COLOR_BUFFER_BIT);
+ } else {
+ // Bind, update and draw new image
+ if(rect_texture)
+ {
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, bufferIndex+1);
+
+ glTexSubImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0, image_width, image_height, GL_BGRA, image_type, image[bufferIndex]);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2f(-1.0f, 1.0f);
+
+ glTexCoord2f(0.0f, image_height);
+ glVertex2f(-1.0f, -1.0f);
+
+ glTexCoord2f(image_width, image_height);
+ glVertex2f(1.0f, -1.0f);
+
+ glTexCoord2f(image_width, 0.0f);
+ glVertex2f(1.0f, 1.0f);
+ glEnd();
+ }
+ else
+ {
+ glBindTexture(GL_TEXTURE_2D, whichImage+1);
+
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image_width2, image_height2, GL_BGRA, image_type, image[bufferIndex]);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2f(-1.0f, 1.0f);
+
+ glTexCoord2f(0.0f, image_ty);
+ glVertex2f(-1.0f, -1.0f);
+
+ glTexCoord2f(image_tx, image_ty);
+ glVertex2f(1.0f, -1.0f);
+
+ glTexCoord2f(image_tx, 0.0f);
+ glVertex2f(1.0f, 1.0f);
+ glEnd();
+ }
+ }
+
+ // FPS Display
+ if(ulKeybits&KEY_SHOWFPS)
+ {
+ int len, i;
+ if(szDebugText[0] && ((time(NULL) - tStart) < 2))
+ {
+ strncpy(szDispBuf, szDebugText, 63);
+ }
+ else
+ {
+ szDebugText[0]=0;
+ if (szMenuBuf) {
+ strncat(szDispBuf, szMenuBuf, 63 - strlen(szDispBuf));
+ }
+ }
+
+ NSRect rect = [[[self openGLContext] view] bounds];
+ len = (int) strlen(szDispBuf);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+
+ gluOrtho2D(0.0, rect.size.width, 0.0, rect.size.height);
+ glDisable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
+
+ glColor4f(0.0, 0.0, 0.0, 0.5);
+ glRasterPos2f(3.0, rect.size.height - 14.0);
+ for (i = 0; i < len; i++) {
+ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
+ }
+
+ glColor3f(1.0, 1.0, 1.0);
+ glRasterPos2f(2.0, rect.size.height - 13.0);
+ for (i = 0; i < len; i++) {
+ glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, szDispBuf[i]);
+ }
+
+
+ glEnable(rect_texture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D);
+ glPopMatrix();
+ }
+
+ [[self openGLContext] flushBuffer];
+ [NSOpenGLContext clearCurrentContext];
+ //[glLock unlock];
+ }
+}
+
+- (void)loadTextures:(GLboolean)first
+{
+ GLint i;
+
+ //[glLock lock];
+ [[self openGLContext] makeCurrentContext];
+
+ /*
+ printf("Range.x0=%i\n"
+ "Range.x1=%i\n"
+ "Range.y0=%i\n"
+ "Range.y1=%i\n",
+ PreviousPSXDisplay.Range.x0,
+ PreviousPSXDisplay.Range.x1,
+ PreviousPSXDisplay.Range.y0,
+ PreviousPSXDisplay.Range.y1);
+
+ printf("DisplayMode.x=%d\n"
+ "DisplayMode.y=%d\n",
+ PreviousPSXDisplay.DisplayMode.x,
+ PreviousPSXDisplay.DisplayMode.y);
+
+ printf("DisplayPosition.x=%i\n"
+ "DisplayPosition.y=%i\n",
+ PreviousPSXDisplay.DisplayPosition.x,
+ PreviousPSXDisplay.DisplayPosition.y);
+
+ printf("DisplayEnd.x=%i\n"
+ "DisplayEnd.y=%i\n",
+ PreviousPSXDisplay.DisplayEnd.x,
+ PreviousPSXDisplay.DisplayEnd.y);
+
+ printf("Double=%i\n"
+ "Height=%i\n",
+ PreviousPSXDisplay.Double,
+ PreviousPSXDisplay.Height);
+
+ printf("Disabled=%i\n", PreviousPSXDisplay.Disabled);
+ */
+
+ image_width = PreviousPSXDisplay.Range.x1;
+ image_height = PreviousPSXDisplay.DisplayMode.y;
+ if (PSXDisplay.RGB24) {
+ image_depth = 32;
+ image_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+ } else {
+ image_depth = 16;
+ image_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ //image_width >>= 1;
+ }
+
+ if (image_width * image_height * (image_depth >> 3) > ((1024*512*2)/3)*4)
+ printf("Fatal error: desired dimension are too large! (%ix%i %ibpp)\n",
+ image_width, image_height, image_depth);
+
+ for(i = 0; i < IMAGE_COUNT; i++)
+ image[i] = image_base + i * image_width * image_height * (image_depth >> 3);
+
+ if(rect_texture)
+ {
+ image_width2 = image_width;
+ image_height2 = image_height;
+ image_tx = (float)image_width;
+ image_ty = (float)image_height;
+
+ if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, IMAGE_COUNT * image_width * image_height * (image_depth >> 3), image_base);
+ else glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+
+ for(i = 0; i < IMAGE_COUNT; i++)
+ {
+ if(!first)
+ {
+ GLuint dt = i+1;
+ glDeleteTextures(1, &dt);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_RECTANGLE_EXT);
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, i+1);
+
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, image_width,
+ image_height, 0, GL_BGRA, image_type, image[i]);
+ }
+ }
+ else
+ {
+ image_width2 = mylog2(image_width);
+ image_height2 = mylog2(image_height);
+ image_tx = (float)image_width/(float)image_width2;
+ image_ty = (float)image_height/(float)image_height2;
+
+ glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, 0, NULL);
+ if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
+ else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ for(i = 0; i < IMAGE_COUNT; i++)
+ {
+ if(!first)
+ {
+ GLuint dt = i+1;
+ glDeleteTextures(1, &dt);
+ }
+
+ glDisable(GL_TEXTURE_RECTANGLE_EXT);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, i+1);
+
+ //if(texture_range) glTextureRangeAPPLE(GL_TEXTURE_2D, IMAGE_COUNT * image_width2 * image_height2 * (image_depth >> 3), image_base);
+ //else glTextureRangeAPPLE(GL_TEXTURE_2D, 0, NULL);
+
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE , texture_hint);
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, client_storage);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width2,
+ image_height2, 0, GL_BGRA, image_type, image[i]);
+ }
+ }
+
+ [NSOpenGLContext clearCurrentContext];
+ //[glLock unlock];
+}
+
+- (void)swapBuffer
+{
+ unsigned char * surf;
+ long x = PSXDisplay.DisplayPosition.x;
+ long y = PSXDisplay.DisplayPosition.y;
+ unsigned long lu;
+ unsigned short row,column;
+ unsigned short dx=(unsigned short)PSXDisplay.DisplayEnd.x;//PreviousPSXDisplay.Range.x1;
+ unsigned short dy=(unsigned short)PSXDisplay.DisplayEnd.y;//PreviousPSXDisplay.DisplayMode.y;
+ long lPitch;
+
+ //printf("y=%i",PSXDisplay.DisplayPosition.y);
+
+ if ([glLock tryLock]) {
+ // make sure the texture area is ready to be written to
+ glFinishObjectAPPLE(GL_TEXTURE, 2-whichImage);
+
+ if ((image_width != PreviousPSXDisplay.Range.x1) ||
+ (image_height != PreviousPSXDisplay.DisplayMode.y) ||
+ ((PSXDisplay.RGB24 ? 32 : 16) != image_depth)) {
+ [self loadTextures:NO];
+ }
+
+ surf = image[1-whichImage];
+ lPitch=image_width2<<(image_depth >> 4);
+
+ if(PreviousPSXDisplay.Range.y0) // centering needed?
+ {
+ surf+=PreviousPSXDisplay.Range.y0*lPitch;
+ dy-=PreviousPSXDisplay.Range.y0;
+ }
+
+ if(PSXDisplay.RGB24)
+ {
+ unsigned char * pD;unsigned int startxy;
+
+ surf+=PreviousPSXDisplay.Range.x0<<2;
+
+ for(column=0;column<dy;column++)
+ {
+ startxy = (1024 * (column + y)) + x;
+ pD = (unsigned char *)&psxVuw[startxy];
+
+ row = 0;
+ // make sure the reads are aligned
+ while ((int)pD & 0x3) {
+ *((unsigned long *)((surf)+(column*lPitch)+(row<<2))) =
+ (*(pD+0)<<16)|(*(pD+1)<<8)|*(pD+2);
+
+ pD+=3;
+ row++;
+ }
+
+ for(;row<dx;row+=4)
+ {
+ unsigned long lu1 = *((unsigned long *)pD);
+ unsigned long lu2 = *((unsigned long *)pD+1);
+ unsigned long lu3 = *((unsigned long *)pD+2);
+ unsigned long *dst = ((unsigned long *)((surf)+(column*lPitch)+(row<<2)));
+#ifdef __POWERPC__
+ *(dst)=
+ (((lu1>>24)&0xff)<<16)|(((lu1>>16)&0xff)<<8)|(((lu1>>8)&0xff));
+ *(dst+1)=
+ (((lu1>>0)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu2>>16)&0xff));
+ *(dst+2)=
+ (((lu2>>8)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu3>>24)&0xff));
+ *(dst+3)=
+ (((lu3>>16)&0xff)<<16)|(((lu3>>8)&0xff)<<8)|(((lu3>>0)&0xff));
+#else
+ *(dst)=
+ (((lu1>>0)&0xff)<<16)|(((lu1>>8)&0xff)<<8)|(((lu1>>16)&0xff));
+ *(dst+1)=
+ (((lu1>>24)&0xff)<<16)|(((lu2>>0)&0xff)<<8)|(((lu2>>8)&0xff));
+ *(dst+2)=
+ (((lu2>>16)&0xff)<<16)|(((lu2>>24)&0xff)<<8)|(((lu3>>0)&0xff));
+ *(dst+3)=
+ (((lu3>>8)&0xff)<<16)|(((lu3>>16)&0xff)<<8)|(((lu3>>24)&0xff));
+#endif
+ pD+=12;
+ }
+
+ //for(;row<dx;row+=4)
+ /*while (pD&0x3) {
+ *((unsigned long *)((surf)+(column*lPitch)+(row<<2)))=
+ (*(pD+0)<<16)|(*(pD+1)<<8)|(*(pD+2)&0xff));
+ pD+=3;
+ row++;
+ }*/
+ }
+ }
+ else
+ {
+ int LineOffset,SurfOffset;
+ unsigned long * SRCPtr = (unsigned long *)(psxVuw + (y << 10) + x);
+ unsigned long * DSTPtr =
+ ((unsigned long *)surf) + (PreviousPSXDisplay.Range.x0 >> 1);
+
+ dx >>= 1;
+
+ LineOffset = 512 - dx;
+ SurfOffset = (lPitch >> 2) - dx;
+
+ for(column=0;column<dy;column++)
+ {
+ for(row=0;row<dx;row++)
+ {
+#ifdef __POWERPC__
+ lu=GETLE16D(SRCPtr++);
+#else
+ lu=*SRCPtr++;
+#endif
+ *DSTPtr++=
+ ((lu << 10) & 0x7c007c00)|
+ ((lu) & 0x3e003e0)|
+ ((lu >> 10) & 0x1f001f);
+ }
+ SRCPtr += LineOffset;
+ DSTPtr += SurfOffset;
+ }
+ }
+
+ // Swap image buffer
+ whichImage = 1 - whichImage;
+
+ [self renderScreen];
+ [glLock unlock];
+ }
+}
+
+- (void)clearBuffer:(BOOL)display
+{
+ if (display == NO) {
+ //[[self openGLContext] makeCurrentContext];
+ //glClear(GL_COLOR_BUFFER_BIT);
+ //[self loadTextures:NO];
+ } else {
+ noDisplay = YES;
+// [self setNeedsDisplay:true];
+ }
+}
+/*
+- (void)mouseDown:(NSEvent *)theEvent
+{
+ PluginWindowController *controller = [[self window] windowController];
+
+ static unsigned long lastTime = 0;
+ unsigned long time;
+
+ time = TickCount();
+
+ if (lastTime != 0) {
+ if (time - lastTime > GetDblTime()) {
+ if (isFullscreen) {
+ [[self openGLContext] clearDrawable];
+ } else {
+ [[self openGLContext] setFullScreen];
+ }
+ isFullscreen = 1-isFullscreen;
+ lastTime = 0;
+ return;
+ }
+ }
+
+ lastTime = time;
+}*/
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginWindow.h b/macosx/plugins/DFXVideo/macsrc/PluginWindow.h
new file mode 100644
index 0000000..38a8dfa
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginWindow.h
@@ -0,0 +1,24 @@
+/***************************************************************************
+ PluginWindow.h
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Wed April 21 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#import <Cocoa/Cocoa.h>
+
+@interface NetSfPeopsSoftGPUPluginWindow : NSWindow
+{
+}
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginWindow.m b/macosx/plugins/DFXVideo/macsrc/PluginWindow.m
new file mode 100644
index 0000000..ef4737f
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginWindow.m
@@ -0,0 +1,46 @@
+/***************************************************************************
+ PluginWindow.m
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Wed April 21 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#import "PluginWindow.h"
+
+@implementation NetSfPeopsSoftGPUPluginWindow
+/*
+- (BOOL)windowShouldClose:(id)sender
+{
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"emuWindowDidClose" object:self];
+
+ return YES;
+}*/
+
+- (void)sendEvent:(NSEvent *)theEvent
+{
+ int type = [theEvent type];
+ if (type == NSKeyDown || type == NSKeyUp) {
+ if (type == NSKeyDown && [theEvent keyCode] == 53 /* escape */) {
+ // reroute to menu event
+ [[NSApp mainMenu] performKeyEquivalent:theEvent];
+ }
+
+ // ignore all key Events
+ return;
+ }
+
+ [super sendEvent:theEvent];
+}
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginWindowController.h b/macosx/plugins/DFXVideo/macsrc/PluginWindowController.h
new file mode 100644
index 0000000..ff9af25
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginWindowController.h
@@ -0,0 +1,41 @@
+/***************************************************************************
+ PluginWindowController.h
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Mon April 11 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#define PluginWindowController NetSfPeopsSoftGPUPluginWindowController
+
+#import <Cocoa/Cocoa.h>
+#import "PluginGLView.h"
+
+@class PluginWindowController;
+
+extern NSWindow *gameWindow;
+extern PluginWindowController *gameController;
+
+@interface PluginWindowController : NSWindowController
+{
+ IBOutlet NSOpenGLView *glView;
+
+ NSWindow *fullWindow;
+}
+
++ (id)openGameView;
+- (PluginGLView *)getOpenGLView;
+- (BOOL)fullscreen;
+- (void)setFullscreen:(BOOL)flag;
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/PluginWindowController.m b/macosx/plugins/DFXVideo/macsrc/PluginWindowController.m
new file mode 100644
index 0000000..48262e5
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/PluginWindowController.m
@@ -0,0 +1,227 @@
+/***************************************************************************
+ PluginWindowController.m
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Tue April 12 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#import "PluginWindowController.h"
+#import "PluginWindow.h"
+#import "Carbon/Carbon.h"
+#include "externals.h"
+#undef BOOL
+
+NSWindow *gameWindow;
+PluginWindowController *gameController;
+NSRect windowFrame;
+
+@implementation PluginWindowController
+
++ (id)openGameView
+{
+ if (gameWindow == nil) {
+ if (gameController == nil) {
+ gameController = [[PluginWindowController alloc] initWithWindowNibName:@"NetSfPeopsSoftGPUInterface"];
+ }
+ gameWindow = [gameController window];
+ }
+
+ if (windowFrame.size.width != 0) {
+ [gameWindow setFrame:windowFrame display:NO];
+ } else {
+ [gameWindow center];
+ }
+
+ [gameWindow makeKeyAndOrderFront:nil];
+ [gameController showWindow:nil];
+
+ CGDirectDisplayID display = (CGDirectDisplayID)[[[[gameWindow screen] deviceDescription] objectForKey:@"NSScreenNumber"] longValue];
+ if (CGDisplayIsCaptured(display)) {
+ [gameController setFullscreen:YES];
+ }
+
+ return gameController;
+}
+
+- (PluginGLView *)getOpenGLView
+{
+ return (PluginGLView *)glView;
+}
+
+- (void)dealloc
+{
+ if (fullWindow) {
+ [fullWindow orderOut:self];
+ [fullWindow autorelease];
+ fullWindow = nil;
+ }
+
+ windowFrame = [[self window] frame];
+
+ [super dealloc];
+}
+
+// forget keyDownEvents
+- (void)keyDown:(NSEvent *)theEvent
+{
+ // Not required any more
+}
+
+- (void)mouseDown:(NSEvent *)theEvent
+{
+ if ([self fullscreen]) {
+ [self setFullscreen:NO];
+ }
+}
+
+- (BOOL)fullscreen
+{
+ return (fullWindow!=nil);
+}
+
+- (void)setFullscreen:(BOOL)flag
+{
+ NSWindow *window = [self window];
+ NSScreen *screen = [window screen];
+ CGDirectDisplayID display = (CGDirectDisplayID)[[[screen deviceDescription] objectForKey:@"NSScreenNumber"] longValue];
+
+ NSDisableScreenUpdates();
+
+ if (flag) {
+ if (!CGDisplayIsCaptured(display)) {
+ CGDisplayCapture(display);
+
+ CGDisplayCount count = 10;
+ CGDirectDisplayID displays[10];
+ CGGetActiveDisplayList(10, displays, &count);
+ if (count == 1) {
+ CGDisplayHideCursor(display);
+ CGAssociateMouseAndMouseCursorPosition(NO);
+ }
+
+ //[window orderOut:self];
+ }
+
+ int width = CGDisplayPixelsWide(display);
+ int height = CGDisplayPixelsHigh(display);
+
+ // assume square pixel ratio on the monitor
+ if ((width*3)/4 < height) {
+ height = (width*3)/4;
+ } else {
+ width = (height*4)/3;
+ }
+
+ fullWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect((CGDisplayPixelsWide(display)-width)/2,
+ (CGDisplayPixelsHigh(display)-height)/2,
+ width, height)
+ styleMask:NSBorderlessWindowMask
+ backing:NSBackingStoreRetained
+ defer:NO
+ screen:screen];
+
+ //[[glView openGLContext] setFullScreen];
+ [[glView openGLContext] setView:[fullWindow contentView]];
+ [glView reshape];
+ //[[glView openGLContext] update];
+ //[fullWindow setContentView:glView];
+
+ [fullWindow setBackgroundColor:[NSColor blackColor]];
+ [fullWindow setHasShadow:NO];
+ [fullWindow setDelegate:self];
+
+ [fullWindow setLevel:CGShieldingWindowLevel()];
+ [fullWindow makeKeyAndOrderFront:self];
+
+ [[self window] makeKeyAndOrderFront:self];
+ } else {
+ CGDisplayRelease(display);
+ //CGReleaseAllDisplays();
+
+ CGAssociateMouseAndMouseCursorPosition(YES);
+ CGDisplayShowCursor(display);
+
+ if (fullWindow) {
+ [fullWindow orderOut:self];
+ [fullWindow autorelease];
+ fullWindow = nil;
+
+ [[glView openGLContext] setView:glView];
+ [glView reshape];
+ //[window setContentView:glView];
+ }
+
+ [[self window] makeKeyAndOrderFront:self];
+ }
+
+ NSEnableScreenUpdates();
+}
+
+- (BOOL)windowShouldZoom:(NSWindow *)sender toFrame:(NSRect)newFrame
+{
+ [self setFullscreen:YES];
+
+ return NO;
+}
+
+- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize
+{
+ if (!(([sender resizeFlags] & NSShiftKeyMask) == NSShiftKeyMask)) {
+ NSRect oldSize = [sender frame];
+ NSRect viewSize = [glView frame];
+
+ float xDiff = NSWidth(oldSize) - NSWidth(viewSize);
+ float yDiff = NSHeight(oldSize) - NSHeight(viewSize);
+
+ //if ((proposedFrameSize.height / proposedFrameSize.width) < (3.0/4.0))
+ // proposedFrameSize.height = ((proposedFrameSize.width - xDiff) * 3.0) / 4.0 + yDiff;
+ //else
+ proposedFrameSize.width = ((proposedFrameSize.height - yDiff) * 4.0) / 3.0 + xDiff;
+ }
+
+ return proposedFrameSize;
+}
+
+- (void)windowWillMiniaturize:(NSNotification *)aNotification
+{
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"emuWindowWantPause" object:self];
+}
+
+- (void)windowDidDeminiaturize:(NSNotification *)aNotification
+{
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"emuWindowWantResume" object:self];
+}
+
+//- (void)windowDidBecomeMain:(NSNotification *)aNotification
+/*- (void)windowDidBecomeKey:(NSNotification *)aNotification
+{
+ if (iWindowMode==0) {
+ [self setFullscreen:YES];
+ }
+}*/
+
+- (BOOL)windowShouldClose:(id)sender
+{
+ if (fullWindow) {
+ return NO;
+ }
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"emuWindowDidClose" object:self];
+ [gameController autorelease];
+ gameController = nil;
+ gameWindow = nil;
+
+ return YES;
+}
+
+@end
diff --git a/macosx/plugins/DFXVideo/macsrc/drawgl.m b/macosx/plugins/DFXVideo/macsrc/drawgl.m
new file mode 100644
index 0000000..17e7647
--- /dev/null
+++ b/macosx/plugins/DFXVideo/macsrc/drawgl.m
@@ -0,0 +1,181 @@
+/***************************************************************************
+ drawgl.m
+ PeopsSoftGPU
+
+ Created by Gil Pedersen on Sun April 18 2004.
+ Copyright (c) 2004 Gil Pedersen.
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. See also the license.txt file for *
+ * additional informations. *
+ * *
+ ***************************************************************************/
+
+#import "PluginWindowController.h"
+#import "PluginGLView.h"
+#include "ExtendedKeys.h"
+#include "externals.h"
+#include "draw.h"
+#include "gpu.h"
+#include "menu.h"
+
+////////////////////////////////////////////////////////////////////////////////////
+// misc globals
+////////////////////////////////////////////////////////////////////////////////////
+
+int iResX;
+int iResY;
+long lLowerpart;
+BOOL bIsFirstFrame = TRUE;
+BOOL bCheckMask=FALSE;
+unsigned short sSetMask=0;
+unsigned long lSetMask=0;
+int iDesktopCol=16;
+int iShowFPS=0;
+int iWinSize;
+int iUseScanLines=0;
+int iUseNoStretchBlt=0;
+int iFastFwd=0;
+int iDebugMode=0;
+int iFVDisplay=0;
+PSXPoint_t ptCursorPoint[8];
+unsigned short usCursorActive=0;
+char * Xpixels;
+char * pCaptionText;
+
+//static PluginWindowController *windowController;
+static PluginGLView *glView;
+
+////////////////////////////////////////////////////////////////////////
+
+void DoBufferSwap(void) // SWAP BUFFERS
+{
+#if 1
+ [glView swapBuffer];
+#else
+ static long long lastTickCount = -1;
+ static int skipCount = 0;
+ long long microTickCount;
+ long deltaTime;
+
+ Microseconds((struct UnsignedWide *)&microTickCount);
+ deltaTime = (long)(microTickCount - lastTickCount);
+ if (deltaTime <= (PSXDisplay.PAL ? 1000000/50 : 100000000 / 5994) ||
+ skipCount >= 3) {
+ skipCount = 0;
+ [glView swapBuffer];
+ } else {
+ skipCount++;
+ }
+ NSLog(@"count: %i", deltaTime);
+ lastTickCount = microTickCount;
+#endif
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+void DoClearScreenBuffer(void) // CLEAR DX BUFFER
+{
+ // clear the screen, and DON'T flush it
+ [glView clearBuffer:NO];
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+void DoClearFrontBuffer(void) // CLEAR DX BUFFER
+{
+ // clear the screen, and flush it
+ [glView clearBuffer:YES];
+}
+
+////////////////////////////////////////////////////////////////////////
+
+unsigned long ulInitDisplay(void) // OPEN GAME WINDOW
+{
+ bUsingTWin=FALSE;
+
+ InitMenu();
+
+ bIsFirstFrame = FALSE;
+
+ if(iShowFPS)
+ {
+ //iShowFPS=0;
+ ulKeybits|=KEY_SHOWFPS;
+ szDispBuf[0]=0;
+ BuildDispMenu(0);
+ }
+
+ PluginWindowController *windowController = [PluginWindowController openGameView];
+ glView = [windowController getOpenGLView];
+
+ [[windowController window] setTitle:[NSString stringWithCString:pCaptionText]];
+
+ return (unsigned long)[windowController window];
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+void CloseDisplay(void)
+{
+ if (gameController) {
+ [gameController close];
+ [gameController release];
+ gameController = nil;
+ gameWindow = nil;
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////
+
+void CreatePic(unsigned char * pMem)
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void DestroyPic(void)
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void DisplayPic(void)
+{
+}
+
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void ShowGpuPic(void)
+{
+ // this is the default implementation...
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+
+void ShowTextGpuPic(void)
+{
+ // this is the default implementation...
+}
+
+
+void HandleKey(int keycode)
+{
+ switch (keycode) {
+ case GPU_FULLSCREEN_KEY:
+ [gameController setFullscreen:![gameController fullscreen]];
+ break;
+ }
+}