diff --git a/Cocoa/AppDelegate.m b/Cocoa/AppDelegate.m index 96331a6..bbaa3ae 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 314a930..7b2ea5d 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 b128485..90eee54 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 ae4b59f..ac63080 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 194ab5a..b954839 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 245bca8..fe6241e 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 @@ - - + - +