diff --git a/Cocoa/AppDelegate.m b/Cocoa/AppDelegate.m
index 96331a6e..bbaa3aee 100644
--- a/Cocoa/AppDelegate.m
+++ b/Cocoa/AppDelegate.m
@@ -13,8 +13,8 @@
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
for (unsigned i = 0; i < GBButtonCount; i++) {
- if ([[defaults objectForKey:button_to_preference_name(i)] isKindOfClass:[NSString class]]) {
- [defaults removeObjectForKey:button_to_preference_name(i)];
+ if ([[defaults objectForKey:button_to_preference_name(i, 0)] isKindOfClass:[NSString class]]) {
+ [defaults removeObjectForKey:button_to_preference_name(i, 0)];
}
}
[[NSUserDefaults standardUserDefaults] registerDefaults:@{
diff --git a/Cocoa/GBButtons.h b/Cocoa/GBButtons.h
index 314a930a..7b2ea5d9 100644
--- a/Cocoa/GBButtons.h
+++ b/Cocoa/GBButtons.h
@@ -13,13 +13,17 @@ typedef enum : NSUInteger {
GBTurbo,
GBRewind,
GBUnderclock,
- GBButtonCount
+ GBButtonCount,
+ GBGameBoyButtonCount = GBStart + 1,
} GBButton;
extern NSString const *GBButtonNames[GBButtonCount];
-static inline NSString *button_to_preference_name(GBButton button)
+static inline NSString *button_to_preference_name(GBButton button, unsigned player)
{
+ if (player) {
+ return [NSString stringWithFormat:@"GBPlayer%d%@", player + 1, GBButtonNames[button]];
+ }
return [NSString stringWithFormat:@"GB%@", GBButtonNames[button]];
}
diff --git a/Cocoa/GBPreferencesWindow.h b/Cocoa/GBPreferencesWindow.h
index b1284851..90eee545 100644
--- a/Cocoa/GBPreferencesWindow.h
+++ b/Cocoa/GBPreferencesWindow.h
@@ -16,5 +16,7 @@
@property (weak) IBOutlet NSPopUpButton *dmgPopupButton;
@property (weak) IBOutlet NSPopUpButton *sgbPopupButton;
@property (weak) IBOutlet NSPopUpButton *cgbPopupButton;
+@property (weak) IBOutlet NSPopUpButton *preferredJoypadButton;
+@property (weak) IBOutlet NSPopUpButton *playerListButton;
@end
diff --git a/Cocoa/GBPreferencesWindow.m b/Cocoa/GBPreferencesWindow.m
index ae4b59fc..ac63080c 100644
--- a/Cocoa/GBPreferencesWindow.m
+++ b/Cocoa/GBPreferencesWindow.m
@@ -103,7 +103,10 @@
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
- return GBButtonCount;
+ if (self.playerListButton.selectedTag == 0) {
+ return GBButtonCount;
+ }
+ return GBGameBoyButtonCount;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
@@ -115,17 +118,23 @@
if (is_button_being_modified && button_being_modified == row) {
return @"Select a new key...";
}
+
+ NSNumber *key = [[NSUserDefaults standardUserDefaults] valueForKey:button_to_preference_name(row, self.playerListButton.selectedTag)];
+ if (key) {
+ return [NSString displayStringForKeyCode: [key unsignedIntegerValue]];
+ }
- return [NSString displayStringForKeyCode:[[NSUserDefaults standardUserDefaults] integerForKey:
- button_to_preference_name(row)]];
+ return @"";
}
- (BOOL)tableView:(NSTableView *)tableView shouldEditTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
+
dispatch_async(dispatch_get_main_queue(), ^{
is_button_being_modified = true;
button_being_modified = row;
tableView.enabled = NO;
+ self.playerListButton.enabled = NO;
[tableView reloadData];
[self makeFirstResponder:self];
});
@@ -144,8 +153,9 @@
is_button_being_modified = false;
[[NSUserDefaults standardUserDefaults] setInteger:theEvent.keyCode
- forKey:button_to_preference_name(button_being_modified)];
+ forKey:button_to_preference_name(button_being_modified, self.playerListButton.selectedTag)];
self.controlsTableView.enabled = YES;
+ self.playerListButton.enabled = YES;
[self.controlsTableView reloadData];
[self makeFirstResponder:self.controlsTableView];
}
@@ -419,4 +429,9 @@
[[NSNotificationCenter defaultCenter] postNotificationName:@"GBCGBModelChanged" object:nil];
}
+- (IBAction)reloadButtonsData:(id)sender
+{
+ [self.controlsTableView reloadData];
+}
+
@end
diff --git a/Cocoa/GBView.m b/Cocoa/GBView.m
index 194ab5a7..b9548399 100644
--- a/Cocoa/GBView.m
+++ b/Cocoa/GBView.m
@@ -169,26 +169,32 @@
bool handled = false;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- for (GBButton i = 0; i < GBButtonCount; i++) {
- if ([defaults integerForKey:button_to_preference_name(i)] == keyCode) {
- handled = true;
- switch (i) {
- case GBTurbo:
- GB_set_turbo_mode(_gb, true, self.isRewinding);
- break;
-
- case GBRewind:
- self.isRewinding = true;
- GB_set_turbo_mode(_gb, false, false);
- break;
-
- case GBUnderclock:
- underclockKeyDown = true;
- break;
-
- default:
- GB_set_key_state(_gb, (GB_key_t)i, true);
- break;
+ unsigned player_count = GB_is_sgb(_gb)? 4: 1;
+ for (unsigned player = 0; player < player_count; player++) {
+ for (GBButton button = 0; button < GBButtonCount; button++) {
+ NSNumber *key = [defaults valueForKey:button_to_preference_name(button, player)];
+ if (!key) continue;
+
+ if (key.unsignedShortValue == keyCode) {
+ handled = true;
+ switch (button) {
+ case GBTurbo:
+ GB_set_turbo_mode(_gb, true, self.isRewinding);
+ break;
+
+ case GBRewind:
+ self.isRewinding = true;
+ GB_set_turbo_mode(_gb, false, false);
+ break;
+
+ case GBUnderclock:
+ underclockKeyDown = true;
+ break;
+
+ default:
+ GB_set_key_state_for_player(_gb, (GB_key_t)button, player, true);
+ break;
+ }
}
}
}
@@ -204,29 +210,34 @@
bool handled = false;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- for (GBButton i = 0; i < GBButtonCount; i++) {
- if ([defaults integerForKey:button_to_preference_name(i)] == keyCode) {
- handled = true;
- switch (i) {
- case GBTurbo:
- GB_set_turbo_mode(_gb, false, false);
- break;
-
- case GBRewind:
- self.isRewinding = false;
- break;
-
- case GBUnderclock:
- underclockKeyDown = false;
- break;
-
- default:
- GB_set_key_state(_gb, (GB_key_t)i, false);
- break;
+ unsigned player_count = GB_is_sgb(_gb)? 4: 1;
+ for (unsigned player = 0; player < player_count; player++) {
+ for (GBButton button = 0; button < GBButtonCount; button++) {
+ NSNumber *key = [defaults valueForKey:button_to_preference_name(button, player)];
+ if (!key) continue;
+
+ if (key.unsignedShortValue == keyCode) {
+ handled = true;
+ switch (button) {
+ case GBTurbo:
+ GB_set_turbo_mode(_gb, false, false);
+ break;
+
+ case GBRewind:
+ self.isRewinding = false;
+ break;
+
+ case GBUnderclock:
+ underclockKeyDown = false;
+ break;
+
+ default:
+ GB_set_key_state_for_player(_gb, (GB_key_t)button, player, false);
+ break;
+ }
}
}
}
-
if (!handled && [theEvent type] != NSEventTypeFlagsChanged) {
[super keyUp:theEvent];
}
diff --git a/Cocoa/Preferences.xib b/Cocoa/Preferences.xib
index 245bca88..fe6241ea 100644
--- a/Cocoa/Preferences.xib
+++ b/Cocoa/Preferences.xib
@@ -69,6 +69,8 @@
+
+
@@ -89,7 +91,7 @@
-
+
@@ -134,7 +136,7 @@
-
+
@@ -173,7 +175,7 @@
-
+
@@ -215,7 +217,7 @@
-
+
@@ -248,7 +250,7 @@
-
+
@@ -276,7 +278,7 @@
-
+
@@ -305,8 +307,12 @@
+
+
+
+
-
+
@@ -323,10 +329,6 @@
-
-
-
-
@@ -335,7 +337,7 @@
-
+
@@ -367,24 +369,46 @@
-
+
-
-
+
+
+
+
+
+
-
+
-
+
@@ -437,30 +461,62 @@
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+