Changeset 5472

Show
Ignore:
Timestamp:
04/22/08 01:46:27 (3 weeks ago)
Author:
morris
Message:

Generalize remote button handlers

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • Spiral/trunk/SPAppleRemote.h

    r5460 r5472  
    5353 *****************************************************************************/ 
    5454 
    55 #import <mach/mach.h> 
    56 #import <mach/mach_error.h> 
    57 #import <IOKit/IOKitLib.h> 
    58 #import <IOKit/IOCFPlugIn.h> 
    59 #import <IOKit/hid/IOHIDLib.h> 
    60 #import <IOKit/hid/IOHIDKeys.h> 
     55#import "SPRemote.h" 
    6156 
    6257enum _SPAppleRemoteButton { 
     
    7873@protocol SPAppleRemoteDelegate; 
    7974 
    80 @interface SPAppleRemote : WIObject
     75@interface SPAppleRemote : SPRemote
    8176        IBOutlet id <SPAppleRemoteDelegate>                     delegate; 
    8277 
     
    9287        BOOL                                                                            _lastButtonSimulatedHold; 
    9388         
    94         BOOL                                                                            _delegateAppleRemotePressedButtonDown
     89        BOOL                                                                            _delegateAppleRemotePressedButton
    9590        BOOL                                                                            _delegateAppleRemoteHeldButton; 
     91        BOOL                                                                            _delegateAppleRemoteReleasedButton; 
    9692} 
    9793 
     
    105101- (BOOL)isListening; 
    106102 
     103- (SPRemoteAction)actionForButton:(SPAppleRemoteButton)button inContext:(SPRemoteContext)context; 
     104 
    107105@end 
    108106 
     
    112110@optional 
    113111 
    114 - (void)appleRemotePressedButton:(SPAppleRemoteButton)button down:(BOOL)down
     112- (void)appleRemotePressedButton:(SPAppleRemoteButton)button
    115113- (void)appleRemoteHeldButton:(SPAppleRemoteButton)button; 
     114- (void)appleRemoteReleasedButton; 
    116115 
    117116@end 
  • Spiral/trunk/SPAppleRemote.m

    r5468 r5472  
    280280 
    281281                if(!held) { 
    282                         if(_delegateAppleRemotePressedButtonDown) 
    283                                 [delegate appleRemotePressedButton:button down:pressedDown]; 
     282                        if(pressedDown) { 
     283                                if(_delegateAppleRemotePressedButton) 
     284                                        [delegate appleRemotePressedButton:button]; 
     285                        } else { 
     286                                if(_delegateAppleRemoteReleasedButton) 
     287                                        [delegate appleRemoteReleasedButton]; 
     288                        } 
    284289                } 
    285290        } else { 
     
    412417        delegate = aDelegate; 
    413418         
    414         _delegateAppleRemotePressedButtonDown = [delegate respondsToSelector:@selector(appleRemotePressedButton:down:)]; 
    415         _delegateAppleRemoteHeldButton = [delegate respondsToSelector:@selector(appleRemoteHeldButton:)]; 
     419        _delegateAppleRemotePressedButton       = [delegate respondsToSelector:@selector(appleRemotePressedButton:)]; 
     420        _delegateAppleRemoteHeldButton          = [delegate respondsToSelector:@selector(appleRemoteHeldButton:)]; 
     421        _delegateAppleRemoteReleasedButton      = [delegate respondsToSelector:@selector(appleRemoteReleasedButton)]; 
    416422} 
    417423 
     
    464470} 
    465471 
     472 
     473 
     474#pragma mark - 
     475 
     476- (SPRemoteAction)actionForButton:(SPAppleRemoteButton)button inContext:(SPRemoteContext)context { 
     477        switch(button) { 
     478                case SPAppleRemoteButtonVolumePlus: 
     479                        if(context == SPRemotePlayer) 
     480                                return SPRemoteCycleSubtitleTracks; 
     481                        else 
     482                                return SPRemoteUp; 
     483                        break; 
     484 
     485                case SPAppleRemoteButtonVolumeMinus: 
     486                        if(context == SPRemotePlayer) 
     487                                return SPRemoteCycleAudioTracks; 
     488                        else 
     489                                return SPRemoteDown; 
     490                        break; 
     491                 
     492                case SPAppleRemoteButtonMenu: 
     493                        if(context == SPRemoteDrillView) 
     494                                return SPRemoteHideDrillView; 
     495                        else if(context == SPRemoteFullscreenPlayer) 
     496                                return SPRemoteCloseFullscreenMovie; 
     497                        else 
     498                                return SPRemoteShowDrillView; 
     499                        break; 
     500                 
     501                case SPAppleRemoteButtonPlay: 
     502                        if(context == SPRemotePlayer) 
     503                                return SPRemotePlayOrPause; 
     504                        else 
     505                                return SPRemoteEnter; 
     506                        break; 
     507                 
     508                case SPAppleRemoteButtonRight: 
     509                        if(context == SPRemotePlayer) 
     510                                return SPRemoteNext; 
     511                        else 
     512                                return SPRemoteRight; 
     513                        break; 
     514                 
     515                case SPAppleRemoteButtonLeft: 
     516                        if(context == SPRemotePlayer) 
     517                                return SPRemotePrevious; 
     518                        else 
     519                                return SPRemoteLeft; 
     520                        break; 
     521                 
     522                case SPAppleRemoteButtonRightHold: 
     523                        if(context == SPRemotePlayer) 
     524                                return SPRemoteScanForward; 
     525                        else 
     526                                return SPRemoteRight; 
     527                        break; 
     528                 
     529                case SPAppleRemoteButtonLeftHold: 
     530                        if(context == SPRemotePlayer) 
     531                                return SPRemoteScanBackward; 
     532                        else 
     533                                return SPRemoteLeft; 
     534                        break; 
     535                 
     536                default: 
     537                        return SPRemoteDoNothing; 
     538                        break; 
     539        } 
     540 
     541        return SPRemoteDoNothing; 
     542} 
     543 
    466544@end 
  • Spiral/trunk/SPApplicationController.m

    r5471 r5472  
    4141static SPApplicationController                  *SPSharedApplicationController; 
    4242 
     43 
     44@interface SPApplicationController(Private) 
     45 
     46- (SPRemoteContext)_remoteContext; 
     47- (void)_handleRemoteAction:(SPRemoteAction)action; 
     48 
     49@end 
     50 
     51 
     52@implementation SPApplicationController(Private) 
     53 
     54- (SPRemoteContext)_remoteContext { 
     55        SPMovieController       *movieController; 
     56        id                                      delegate; 
     57         
     58        delegate = [[NSApp keyWindow] delegate]; 
     59         
     60        if([delegate isKindOfClass:[SPPlayerController class]]) { 
     61                return SPRemotePlayer; 
     62        } 
     63        else if([delegate isKindOfClass:[SPDrillController class]]) { 
     64                movieController = [delegate movieController]; 
     65                 
     66                if([movieController isInFullscreen]) 
     67                        return SPRemoteFullscreenPlayer; 
     68                else 
     69                        return SPRemoteDrillView; 
     70        } 
     71        else if([delegate isKindOfClass:[SPPlaylistController class]]) { 
     72                return SPRemotePlaylist; 
     73        } 
     74 
     75        return SPRemoteNone; 
     76} 
     77 
     78 
     79 
     80- (void)_handleRemoteAction:(SPRemoteAction)action { 
     81        SPMovieController               *movieController; 
     82        double                                  rate; 
     83        id                                              delegate; 
     84 
     85        delegate = [[NSApp keyWindow] delegate]; 
     86         
     87        if([delegate isKindOfClass:[SPPlayerController class]] || [delegate isKindOfClass:[SPDrillController class]]) 
     88                movieController = [delegate movieController]; 
     89        else 
     90                movieController = NULL; 
     91         
     92        switch(action) { 
     93                case SPRemoteDoNothing: 
     94                        break; 
     95                 
     96                case SPRemoteUp: 
     97                        [delegate moveSelectionUp]; 
     98                        break; 
     99                 
     100                case SPRemoteDown: 
     101                        [delegate moveSelectionDown]; 
     102                        break; 
     103                 
     104                case SPRemoteRight: 
     105                        [delegate openSelection]; 
     106                        break; 
     107                 
     108                case SPRemoteLeft: 
     109                        [delegate closeSelection]; 
     110                        break; 
     111                 
     112                case SPRemoteEnter: 
     113                        [delegate openSelection]; 
     114                        break; 
     115                 
     116                case SPRemotePlay: 
     117                        [movieController playAtRate:1.0]; 
     118                        break; 
     119                 
     120                case SPRemotePlayOrPause: 
     121                        [movieController play]; 
     122                        break; 
     123                 
     124                case SPRemotePause: 
     125                        [movieController stop]; 
     126                        break; 
     127                 
     128                case SPRemoteStop: 
     129                        [movieController stop]; 
     130                        break; 
     131                 
     132                case SPRemoteNext: 
     133                        [movieController openNext]; 
     134                        break; 
     135                 
     136                case SPRemotePrevious: 
     137                        [movieController openPrevious]; 
     138                        break; 
     139                 
     140                case SPRemoteBack: 
     141                        if([movieController isInFullscreen]) 
     142                                [delegate closeWindow]; 
     143                        else 
     144                                [delegate closeSelection]; 
     145                        break; 
     146                         
     147                case SPRemoteScanForward: 
     148                        rate = [SPSettings doubleForKey:SPFastForwardFactor]; 
     149                         
     150                        [movieController playAtRate:rate]; 
     151                        break; 
     152                 
     153                case SPRemoteScanBackward: 
     154                        rate = [SPSettings doubleForKey:SPFastForwardFactor]; 
     155                         
     156                        [movieController playAtRate:-rate]; 
     157                        break; 
     158                 
     159                case SPRemoteStepForward: 
     160                        [movieController stepForward]; 
     161                        break; 
     162                 
     163                case SPRemoteStepBackward: 
     164                        [movieController stepBackward]; 
     165                        break; 
     166                 
     167                case SPRemoteCycleSubtitleTracks: 
     168                        [movieController cycleSubtitleTracksForwards:YES]; 
     169                        break; 
     170                 
     171                case SPRemoteCycleAudioTracks: 
     172                        [movieController cycleAudioTracksForwards:YES]; 
     173                        break; 
     174                 
     175                case SPRemoteEject: 
     176                        [[NSWorkspace sharedWorkspace] ejectCDDrive]; 
     177                        break; 
     178                 
     179                case SPRemoteShowHUD: 
     180                        [movieController orderFrontFullscreenHUDWindow]; 
     181                        break; 
     182                         
     183                case SPRemoteDisplayTime: 
     184                        [movieController flashCurrentTime]; 
     185                        break; 
     186                 
     187                case SPRemoteShowDrillView: 
     188                        [[SPDrillController drillController] showWindow:self]; 
     189                        break; 
     190                 
     191                case SPRemoteHideDrillView: 
     192                        [delegate closeWindow]; 
     193                        break; 
     194                 
     195                case SPRemoteCloseFullscreenMovie: 
     196                        [delegate closeWindow]; 
     197                        break; 
     198        } 
     199} 
     200 
     201@end 
     202 
     203 
     204 
    43205@implementation SPApplicationController 
    44206 
     
    210372 
    211373 
    212 - (void)appleRemotePressedButton:(SPAppleRemoteButton)button down:(BOOL)down { 
    213         SPMovieController               *movieController; 
    214         id                                              delegate; 
    215         double                                  rate; 
    216          
    217         delegate = [[NSApp keyWindow] delegate]; 
    218          
    219         if([delegate isKindOfClass:[SPPlayerController class]] || [delegate isKindOfClass:[SPDrillController class]]) { 
    220                 movieController = [delegate movieController]; 
    221                  
    222                 if([delegate isKindOfClass:[SPDrillController class]] && 
    223                    (![movieController isInFullscreen] || 
    224                         button == SPAppleRemoteButtonMenu)) { 
    225                         if(button == SPAppleRemoteButtonPlay || button == SPAppleRemoteButtonRight) 
    226                                 [delegate openSelection]; 
    227                         else if(button == SPAppleRemoteButtonVolumeMinus && down) 
    228                                 [delegate moveSelectionDown]; 
    229                         else if(button == SPAppleRemoteButtonVolumePlus && down) 
    230                                 [delegate moveSelectionUp]; 
    231                         else if(button == SPAppleRemoteButtonLeft) 
    232                                 [delegate closeSelection]; 
    233                         else if(button == SPAppleRemoteButtonMenu) 
    234                                 [delegate closeWindow]; 
    235                 } else { 
    236                         if(button == SPAppleRemoteButtonPlay) 
    237                                 [movieController play]; 
    238                         else if(button == SPAppleRemoteButtonLeft) 
    239                                 [movieController openPrevious]; 
    240                         else if(button == SPAppleRemoteButtonRight) 
    241                                 [movieController openNext]; 
    242                         else if(button == SPAppleRemoteButtonVolumeMinus) 
    243                                 [movieController cycleSubtitleTracksForwards:YES]; 
    244                         else if(button == SPAppleRemoteButtonVolumePlus) 
    245                                 [movieController cycleAudioTracksForwards:YES]; 
    246                         else if(button == SPAppleRemoteButtonMenu) { 
    247                                 if(![movieController isInFullscreen]) 
    248                                         [[SPDrillController drillController] showWindow:self]; 
    249                         } 
    250                         else if(button == SPAppleRemoteButtonLeftHold || button == SPAppleRemoteButtonRightHold) { 
    251                                 if(down) { 
    252                                         rate = [SPSettings doubleForKey:SPFastForwardFactor]; 
    253                                          
    254                                         [movieController playAtRate:(button == SPAppleRemoteButtonRightHold) ? rate : -rate]; 
    255                                 } else { 
    256                                         [movieController playAtRate:1.0]; 
    257                                 } 
    258                         } 
    259                 } 
    260         } 
    261         else if([delegate isKindOfClass:[SPPlaylistController class]]) { 
    262                 if(button == SPAppleRemoteButtonPlay) 
    263                         [(SPPlaylistController *) delegate open:self]; 
    264                 else if(button == SPAppleRemoteButtonVolumeMinus && down) 
    265                         [delegate moveSelectionDown]; 
    266                 else if(button == SPAppleRemoteButtonVolumePlus && down) 
    267                         [delegate moveSelectionUp]; 
    268                 else if(button == SPAppleRemoteButtonLeft) 
    269                         [delegate closeSelection]; 
    270                 else if(button == SPAppleRemoteButtonRight) 
    271                         [delegate openSelection]; 
    272                 else if(button == SPAppleRemoteButtonMenu) 
    273                         [[SPDrillController drillController] showWindow:self]; 
    274         } 
    275         else if(button == SPAppleRemoteButtonMenu) { 
    276                 [[SPDrillController drillController] showWindow:self]; 
    277         } 
    278  
     374- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)selector { 
     375        if(selector == @selector(insertNewline:)) { 
     376                [self openURLOK:self]; 
     377 
     378                return YES; 
     379        } 
     380        else if(selector == @selector(cancelOperation:)) { 
     381                [_openURLPanel performClose:self]; 
     382 
     383                return YES; 
     384        } 
     385 
     386        return NO; 
     387
     388 
     389 
     390 
     391#pragma mark - 
     392 
     393- (void)appleRemotePressedButton:(SPAppleRemoteButton)button { 
     394        SPRemoteAction          action; 
     395         
     396        action = [[SPAppleRemote sharedRemote] actionForButton:button inContext:[self _remoteContext]]; 
     397         
     398        [self _handleRemoteAction:action]; 
     399         
    279400        _holdingAppleRemoteButton = NO; 
    280401} 
     
    292413 
    293414- (void)holdAppleRemoteButton:(NSNumber *)button { 
    294         id                     delegate
     415        SPRemoteAction         action
    295416         
    296417        if(_holdingAppleRemoteButton) { 
    297                 delegate = [[NSApp keyWindow] delegate]; 
    298                  
    299                 if([delegate isKindOfClass:[SPDrillController class]] ||  
    300                    [delegate isKindOfClass:[SPPlaylistController class]]) { 
    301                         if([button intValue] == SPAppleRemoteButtonVolumeMinus) 
    302                                 [delegate moveSelectionDown]; 
    303                         else if([button intValue] == SPAppleRemoteButtonVolumePlus) 
    304                                 [delegate moveSelectionUp]; 
    305                 } 
     418                action = [[SPAppleRemote sharedRemote] actionForButton:[button intValue] inContext:[self _remoteContext]]; 
     419                 
     420                [self _handleRemoteAction:action]; 
    306421                 
    307422                [self performSelector:@selector(holdAppleRemoteButton:)  
     
    313428 
    314429 
    315 - (void)PS3RemotePressedButton:(SPPS3RemoteButton)button { 
     430- (void)appleRemoteReleasedButton { 
    316431        SPMovieController               *movieController; 
    317432        id                                              delegate; 
    318         double                                  rate; 
    319          
    320         if(button == SPPS3RemoteButtonEject) { 
    321                 [[NSWorkspace sharedWorkspace] ejectCDDrive]; 
    322                  
    323                 return; 
    324         } 
    325          
     433 
    326434        delegate = [[NSApp keyWindow] delegate]; 
    327          
     435 
    328436        if([delegate isKindOfClass:[SPPlayerController class]] || [delegate isKindOfClass:[SPDrillController class]]) { 
    329437                movieController = [delegate movieController]; 
    330438 
    331                 if([delegate isKindOfClass:[SPDrillController class]] && 
    332                    (![movieController isInFullscreen] || 
    333                         button == SPPS3RemoteButtonTopMenu || 
    334                         button == SPPS3RemoteButtonStop || 
    335                         button == SPPS3RemoteButtonReturn || 
    336                         button == SPPS3RemoteButtonX || 
    337                         button == SPPS3RemoteButtonBack)) { 
    338                         if(button == SPPS3RemoteButtonEnter || button == SPPS3RemoteButtonRight) 
    339                                 [delegate openSelection]; 
    340                         else if(button == SPPS3RemoteButtonDown) 
    341                                 [delegate moveSelectionDown]; 
    342                         else if(button == SPPS3RemoteButtonUp) 
    343                                 [delegate moveSelectionUp]; 
    344                         else if(button == SPPS3RemoteButtonLeft) 
    345                                 [delegate closeSelection]; 
    346                         else if(button == SPPS3RemoteButtonReturn || button == SPPS3RemoteButtonX || button == SPPS3RemoteButtonBack) { 
    347                                 if([movieController isInFullscreen]) 
    348                                         [delegate closeWindow]; 
    349                                 else 
    350                                         [delegate closeSelection]; 
    351                         } 
    352                         else if(button == SPPS3RemoteButtonStop) { 
    353                                 if([movieController isInFullscreen]) 
    354                                         [delegate closeWindow]; 
    355                         } 
    356                         else if(button == SPPS3RemoteButtonTopMenu) 
    357                                 [delegate closeWindow]; 
    358                 } else { 
    359                         if(button == SPPS3RemoteButtonPlay) 
    360                                 [movieController playAtRate:1.0]; 
    361                         else if(button == SPPS3RemoteButtonPause || button == SPPS3RemoteButtonStop) 
    362                                 [movieController stop]; 
    363                         else if(button == SPPS3RemoteButtonAudio) 
    364                                 [movieController cycleAudioTracksForwards:YES]; 
    365                         else if(button == SPPS3RemoteButtonSubtitle) 
    366                                 [movieController cycleSubtitleTracksForwards:YES]; 
    367                         else if(button == SPPS3RemoteButtonTime || button == SPPS3RemoteButtonDisplay) 
    368                                 [movieController flashCurrentTime]; 
    369                         else if(button == SPPS3RemoteButtonTopMenu) { 
    370                                 if(![movieController isInFullscreen]) 
    371                                         [[SPDrillController drillController] showWindow:self]; 
    372                         } 
    373                         else if(button == SPPS3RemoteButtonPopUpMenu) 
    374                                 [movieController orderFrontFullscreenHUDWindow]; 
    375                         else if(button == SPPS3RemoteButtonPrevious) 
    376                                 [movieController openPrevious]; 
    377                         else if(button == SPPS3RemoteButtonNext) 
    378                                 [movieController openNext]; 
    379                         else if(button == SPPS3RemoteButtonStepBackward) 
    380                                 [movieController stepBackward]; 
    381                         else if(button == SPPS3RemoteButtonStepForward) 
    382                                 [movieController stepForward]; 
    383                         else if(button == SPPS3RemoteButtonScanBackward || button == SPPS3RemoteButtonScanForward) { 
    384                                 rate = [SPSettings doubleForKey:SPFastForwardFactor]; 
    385                                  
    386                                 [movieController playAtRate:(button == SPPS3RemoteButtonScanForward) ? rate : -rate]; 
    387                         } 
    388                 } 
    389         } 
    390         else if([delegate isKindOfClass:[SPPlaylistController class]]) { 
    391                 if(button == SPPS3RemoteButtonEnter) 
    392                         [(SPPlaylistController *) delegate open:self]; 
    393                 else if(button == SPPS3RemoteButtonDown) 
    394                         [delegate moveSelectionDown]; 
    395                 else if(button == SPPS3RemoteButtonUp) 
    396                         [delegate moveSelectionUp]; 
    397                 else if(button == SPPS3RemoteButtonLeft) 
    398                         [delegate closeSelection]; 
    399                 else if(button == SPPS3RemoteButtonRight) 
    400                         [delegate openSelection]; 
    401                 else if(button == SPPS3RemoteButtonTopMenu) 
    402                         [[SPDrillController drillController] showWindow:self]; 
    403         } 
    404         else if(button == SPPS3RemoteButtonTopMenu) { 
    405                 [[SPDrillController drillController] showWindow:self]; 
    406         } 
     439                if([movieController rate] > 1.0) 
     440                        [movieController playAtRate:1.0]; 
     441        } 
     442 
     443        _holdingAppleRemoteButton = NO; 
     444
     445 
     446 
     447 
     448#pragma mark - 
     449 
     450- (void)PS3RemotePressedButton:(SPPS3RemoteButton)button { 
     451        SPRemoteAction          action; 
     452         
     453        action = [[SPPS3Remote sharedRemote] actionForButton:button inContext:[self _remoteContext]]; 
     454         
     455        [self _handleRemoteAction:action]; 
    407456 
    408457        _holdingPS3RemoteButton = NO; 
     
    421470 
    422471- (void)holdPS3RemoteButton:(NSNumber *)button { 
    423         SPMovieController               *movieController; 
    424         id                                              delegate; 
     472        SPRemoteAction          action; 
    425473         
    426474        if(_holdingPS3RemoteButton) { 
    427                 delegate = [[NSApp keyWindow] delegate]; 
    428                  
    429                 if([delegate isKindOfClass:[SPPlayerController class]] || [delegate isKindOfClass:[SPDrillController class]]) { 
    430                         movieController = [delegate movieController]; 
    431                          
    432                         if([button intValue] == SPPS3RemoteButtonDown) 
    433                                 [delegate moveSelectionDown]; 
    434                         else if([button intValue] == SPPS3RemoteButtonUp) 
    435                                 [delegate moveSelectionUp]; 
    436                         else if([button intValue] == SPPS3RemoteButtonStepBackward) 
    437                                 [movieController stepBackward]; 
    438                         else if([button intValue] == SPPS3RemoteButtonStepForward) 
    439                                 [movieController stepForward]; 
    440                 } 
    441                 else if([delegate isKindOfClass:[SPPlaylistController class]]) { 
    442                         if([button intValue] == SPPS3RemoteButtonDown) 
    443                                 [delegate moveSelectionDown]; 
    444                         else if([button intValue] == SPPS3RemoteButtonUp) 
    445                                 [delegate moveSelectionUp]; 
    446                 } 
     475                action = [[SPPS3Remote sharedRemote] actionForButton:[button intValue] inContext:[self _remoteContext]]; 
     476                 
     477                [self _handleRemoteAction:action]; 
    447478                    
    448479                [self performSelector:@selector(holdPS3RemoteButton:)  
     
    460491 
    461492 
     493#pragma mark - 
     494 
    462495- (void)wiiRemotePressedButton:(SPWiiRemoteButton)button { 
    463         switch(button) { 
    464                 case SPWiiRemoteButton1:                NSLog(@"pressed button 1"); break; 
    465                 case SPWiiRemoteButton2:                NSLog(@"pressed button 2"); break; 
    466                 case SPWiiRemoteButtonB:                NSLog(@"pressed button B"); break; 
    467                 case SPWiiRemoteButtonA:                NSLog(@"pressed button A"); break; 
    468                 case SPWiiRemoteButtonMinus:    NSLog(@"pressed button minus"); break; 
    469                 case SPWiiRemoteButtonHome:             NSLog(@"pressed button home"); break; 
    470                 case SPWiiRemoteButtonLeft:             NSLog(@"pressed button left"); break; 
    471                 case SPWiiRemoteButtonRight:    NSLog(@"pressed button right"); break; 
    472                 case SPWiiRemoteButtonDown:             NSLog(@"pressed button down"); break; 
    473                 case SPWiiRemoteButtonUp:               NSLog(@"pressed button up"); break; 
    474                 case SPWiiRemoteButtonPlus:             NSLog(@"pressed button plus"); break; 
    475         } 
     496        SPRemoteAction          action; 
     497         
     498        action = [[SPWiiRemote sharedRemote] actionForButton:button inContext:[self _remoteContext]]; 
     499         
     500        [self _handleRemoteAction:action]; 
     501 
     502        _holdingWiiRemoteButton = NO; 
    476503} 
    477504 
     
    479506 
    480507- (void)wiiRemoteHeldButton:(SPWiiRemoteButton)button { 
    481         switch(button) { 
    482                 case SPWiiRemoteButton1:                NSLog(@"held button 1"); break; 
    483                 case SPWiiRemoteButton2:                NSLog(@"held button 2"); break; 
    484                 case SPWiiRemoteButtonB:                NSLog(@"held button B"); break; 
    485                 case SPWiiRemoteButtonA:                NSLog(@"held button A"); break; 
    486                 case SPWiiRemoteButtonMinus:    NSLog(@"held button minus"); break; 
    487                 case SPWiiRemoteButtonHome:             NSLog(@"held button home"); break; 
    488                 case SPWiiRemoteButtonLeft:             NSLog(@"held button left"); break; 
    489                 case SPWiiRemoteButtonRight:    NSLog(@"held button right"); break; 
    490                 case SPWiiRemoteButtonDown:             NSLog(@"held button down"); break; 
    491                 case SPWiiRemoteButtonUp:               NSLog(@"held button up"); break; 
    492                 case SPWiiRemoteButtonPlus:             NSLog(@"held button plus"); break; 
    493         } 
    494          
    495508        _holdingWiiRemoteButton = YES; 
    496                 
     509         
    497510        [self performSelector:@selector(holdWiiRemoteButton:)  
    498511                           withObject:[NSNumber numberWithInt:button]]; 
     
    502515 
    503516- (void)holdWiiRemoteButton:(NSNumber *)button { 
     517        SPRemoteAction          action; 
     518         
     519        if(_holdingWiiRemoteButton) { 
     520                action = [[SPWiiRemote sharedRemote] actionForButton:[button intValue] inContext:[self _remoteContext]]; 
     521                 
     522                [self _handleRemoteAction:action]; 
     523                    
     524                [self performSelector:@selector(holdWiiRemoteButton:)  
     525                                   withObject:button 
     526                                   afterDelay:0.05];          
     527        } 
    504528} 
    505529 
     
    508532- (void)wiiRemoteReleasedButton { 
    509533        _holdingWiiRemoteButton = NO; 
    510 } 
    511  
    512  
    513  
    514 - (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)selector { 
    515         if(selector == @selector(insertNewline:)) { 
    516                 [self openURLOK:self]; 
    517  
    518                 return YES; 
    519         } 
    520         else if(selector == @selector(cancelOperation:)) { 
    521                 [_openURLPanel performClose:self]; 
    522  
    523                 return YES; 
    524         } 
    525  
    526         return NO; 
    527534} 
    528535 
  • Spiral/trunk/SPBluetoothRemote.h

    r5471 r5472  
    2727 */ 
    2828 
     29#import "SPRemote.h" 
     30 
    2931#define SPBluetoothRemoteWillConnect            @"SPBluetoothRemoteWillConnect" 
    3032#define SPBluetoothRemoteDidConnect                     @"SPBluetoothRemoteDidConnect" 
    3133 
    3234 
    33 @interface SPBluetoothRemote : WIObject
     35@interface SPBluetoothRemote : SPRemote
    3436        IOBluetoothDevice                                               *_device; 
    3537         
  • Spiral/trunk/SPMovieController.m

    r5458 r5472  
    10861086        _startPlayingWhenTracksAreLoaded = NO; 
    10871087 
    1088         if([self isPlaying]) 
    1089                 [_movie stop]; 
    1090         else 
     1088        if(fabs([_movie rate]) > 1.0) { 
     1089                [_movie setRate:1.0]; 
    10911090                [_movie play]; 
     1091        } else { 
     1092                if(![self isPlaying]) 
     1093                        [_movie play]; 
     1094                else 
     1095                        [_movie stop]; 
     1096        } 
    10921097} 
    10931098 
  • Spiral/trunk/SPPS3Remote.h

    r5471 r5472  
    104104- (id <SPPS3RemoteDelegate>)delegate; 
    105105 
     106- (SPRemoteAction)actionForButton:(SPPS3RemoteButton)button inContext:(SPRemoteContext)context; 
     107 
    106108@end 
    107109 
  • Spiral/trunk/SPPS3Remote.m

    r5471 r5472  
    124124#pragma mark - 
    125125 
     126- (SPRemoteAction)actionForButton:(SPPS3RemoteButton)button inContext:(SPRemoteContext)context { 
     127        switch(button) { 
     128                case SPPS3RemoteButtonEject: 
     129                        return SPRemoteEject; 
     130                        break; 
     131                         
     132                case SPPS3RemoteButtonAudio: 
     133                        return SPRemoteCycleAudioTracks; 
     134                        break; 
     135                         
     136                case SPPS3RemoteButtonSubtitle: 
     137                        return SPRemoteCycleSubtitleTracks; 
     138                        break; 
     139                         
     140                case SPPS3RemoteButtonTime: 
     141                case SPPS3RemoteButtonDisplay: 
     142                        return SPRemoteDisplayTime; 
     143                        break; 
     144                         
     145                case SPPS3RemoteButtonTopMenu: 
     146                        if(context == SPRemoteDrillView) 
     147                                return SPRemoteHideDrillView; 
     148                        else if(context == SPRemoteFullscreenPlayer) 
     149                                return SPRemoteCloseFullscreenMovie; 
     150                        else 
     151                                return SPRemoteShowDrillView; 
     152                        break; 
     153                         
     154                case SPPS3RemoteButtonPopUpMenu: 
     155                        return SPRemoteShowHUD; 
     156                        break; 
     157                         
     158                case SPPS3RemoteButtonReturn: 
     159                case SPPS3RemoteButtonBack: 
     160                case SPPS3RemoteButtonX: 
     161                        return SPRemoteBack; 
     162                        break; 
     163                         
     164                case SPPS3RemoteButtonUp: 
     165                        return SPRemoteUp; 
     166                        break; 
     167                         
     168                case SPPS3RemoteButtonDown: 
     169                        return SPRemoteDown; 
     170                        break; 
     171                         
     172                case SPPS3RemoteButtonLeft: 
     173                        return SPRemoteLeft; 
     174                        break; 
     175                         
     176                case SPPS3RemoteButtonRight: 
     177                        return SPRemoteRight; 
     178                        break; 
     179