fullScreen et keyDown

Bonjour à  tous


 


J'ai un souci en mode fullScreen : je n'arrive pas à  accéder à  keyDown pour sortir du mode full screen. Voici le code :


 


-(IBAction)fullScreen:(id)sender


{


    isInFullScreenMode = YES;


 


NSRect mainDisplayRect;


 


// Create a screen-sized window on the display you want to take over


// Note, mainDisplayRect has a non-zero origin if the key window is on a secondary display


mainDisplayRect = [[NSScreen mainScreen] frame];


fullScreenWindow = [[NSWindow alloc] initWithContentRect:mainDisplayRect styleMask:NSBorderlessWindowMask


backing:NSBackingStoreBuffered defer:YES];


 


// Set the window level to be above the menu bar


[fullScreenWindow setLevel:NSMainMenuWindowLevel+1];


 


// Perform any other window configuration you desire


[fullScreenWindow setOpaque:YES];


[fullScreenWindow setHidesOnDeactivate:YES];


 


    qtMovieFullScreen = [[QTMovieFullScreen alloc] init];


    qtMovieFullScreen.movie = [self movie];


    [qtMovieFullScreen setPreservesAspectRatio:YES];


    [qtMovieFullScreen setControllerVisible:YES];


[fullScreenWindow setContentView:qtMovieFullScreen];


 


// Show the window


[fullScreenWindow makeKeyAndOrderFront:self];


 


}


 


J'ai sous classé le QTMovieView qui doit apparaà®tre dans le fullScreen. J'obtiens bien une réponse si je fais un click, mais je ne passe pas dans keyDown si je tappe une touche. Voici le code de la sous classe QTMovieFullScreen (de classe QTMovieView):


 


#import "QTMovieFullScreen.h"


 


@implementation QTMovieFullScreen


 


- (id)initWithFrame:(NSRect)frame


{


    self = [super initWithFrame:frame];


    if (self) {


        // Initialization code here.


    }


    


    return self;


}


 


- (void)drawRect:(NSRect)dirtyRect


{


    // Drawing code here.


}


-(void) mouseDown:(NSEvent *)theEvent


{


    


}


 


- (BOOL)acceptsFirstResponder {


    return YES;


}


 


- (void) keyDown:(NSEvent *)event


{


    unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0];


    switch (c) {


 


        case 27:


    // Test


 


            break;


 


       default:


            break;


    }


 


}


 


@end


 


 


 


Quelqu'un peut il me dire ce qu'il ne va pas ? ou encore, peut être que je m'y prends mal et dans ce cas, comment afficher un QTMovie en fullScreen puis retourner la la fenêtre initiale en appuyant sur ESC?


 


Merci d'avance

Réponses

  • CéroceCéroce Membre, Modérateur
    juin 2013 modifié #2

    Si la vue ne reçoit pas le -keydown, c'est qu'elle n'est pas le First Responder.


    Mais... a priori, ça devrait plutôt être le rôle de son contrôleur de sortir du fullscreen, donc personnellement, je ferais plutôt en sorte que le contrôleur soit le First Responder.


     


    À mon avis, implémenter -keyDown: dans le contrôleur devrait suffire.


     


    (Je sais que je n'explique pas grand chose, mais cela concerne la chaà®ne des répondeurs, qui est un concept singulier, et si ça ne te parle pas, il faut que tu étudies un peu NSResponder et lise le Cocoa Event Handling Guide).




  • la chaà®ne des répondeurs, qui est un concept singulier




    en quoi?

  • mpergandmpergand Membre
    juin 2013 modifié #4

    Essaye en ajoutant dans une sous classe de NSWindow:



    -(BOOL) canBecomeKeyWindow
    {

    return YES;
    }


  • bon, j'ai sous classé fullScreenWindow comme le suggère mpergand et ajouter canBecomeKeyWindow, et donc j'ai placé cette fois ci  (void) keyDown:(NSEvent *)event dans cette sous classe.


    En plaçant un point d'arrêt dans canBecomeKeyWindow , j'y passe bien. Mais pas mieux au final : je ne passe pas dans keyDown


     


    J'ai même placé  (BOOL)acceptsFirstResponder {return YES;} dans cette sous classe pour avoir le first responder mais ça ne passe jamais dans cette méthode.


     


    J'ai donc tenté la solution de Céroce et j'ai placé le keyDown dans le NSWindowController mais en vain . 


     


    Cela est d'autant surprenant que j'ai fais une appui spécifique pour cela avec un NSDocument qui inclue un QTMovieView qui est sous classé et qui comprend le keyDown. Et là , ça marche très bien. 

    Dans mon appui de départ, j'ai un NSDocument qui ouvre une fenêtre (NSWindowController) comprenant un QTMovieView sous classé. C'est dans cette sous classe que j'ai copié les méthodes de mon appli spécifique mais je n'ai donc plus d'accès à  keyDown


     


    Pourquoi je n'ai plus le first responder ?


     


    Merci d'avance


  • J'ai trouvé une solution : 


     


    Je sous classe bien ma NSWindow de mon fullScreenWindow.


     


    J'y place la méthode de mpegrand :


     


    -(BOOL) canBecomeKeyWindow


    {


        


    return YES;


    }


     


     


    et j'insère après


     


    fullScreenWindow = [[MonFullScreen alloc] initWithContentRect:mainDisplayRect styleMask:NSBorderlessWindowMask


    backing:NSBackingStoreBuffered defer:YES];


     

     


    la ligne suivante : 


     


    [fullScreenWindow setInitialFirstResponder:self];


     


    Avec ça, j'ai accès à  mon KeyDown, qui sera placé dans la même classe  que ma méthode "fullScreen" citée dans mon 1er message. Ce keyDown est le suivant : 


     


     


    - (void) keyDown:(NSEvent *)event


    {


        unichar c = [[event charactersIgnoringModifiers] characterAtIndex:0];


        switch (c) {


     


                // [Esc] exits full-screen mode


            case 27:


                {


                isInFullScreenMode = NO;


                fullScreenWindow = nil;


                 }


                


                break;


     


     


            default:


                break;


        }


    }


     


     


    Voila


     


    Merci à  tous pour vos pistes

  • AliGatorAliGator Membre, Modérateur
    juin 2013 modifié #7
    Merci d'utiliser les balises CODE dans tes messages pour rendre tes citations de ligne de code plus lisible.
    Ca t'évitera en plus que des bouts de code comme
    switch(c)
    soient remplacés par

    switch©

    si tu ne les as pas entouré de ces balises pour indiquer que c'est du code source...
  • Désolé, j'y penserai la prochaine fois


  • AliGatorAliGator Membre, Modérateur
    Il est toujours temps d'éditer tes messages de ce post... ;)
  • Désolé de revenir mais je viens de m'apercevoir que j'ai un autre souci. Tout fonctionne bien... sauf si je clic dans la QTMovieView (et pas à  l'extérieur). En effet, si je clic ou double clic, je n'ai plus la possibilité d'utiliser le keyDown alors que le glissement des doigts fonctionne et n'empêche pas cela.


    Quoi faire et pourquoi


     


    merci encore

  • CéroceCéroce Membre, Modérateur

    En cliquant sur la QTMoveView, c'est elle qui prend le focus...


  • ouais, je suis en effet complètement d'accord avec ça.


    Donc j'ai sous-classé ma QTMovieView qui apparait ds le fullScreen en y insérant un KeyDown.


    Je passe bien dedans quand je tape "esc",  mais du coup, je ne sais plus quoi faire : comment je fais pour quitter ma fullScreen?


    J'ai bien une idée mais je ne vois pas comment la réaliser :


    via cette touche "esc" dans le keyDown de ma sous-classe de mon QTMovieView affiché ds le fullScreen, repasser dans la classe MonFullScreen (qui gère l'apparition du fullScreen dont le code est écrit un peu plus haut) et  en indiquant que ma movieView n'est plus firstResponder (et comment faire)?



    Merci d'avance


  • Désolé mais pour tester le fait que ma movieView ne soit plus le firstResponder, j'avais mis acceptsFirstReponder: return NO; dans ma sous classe  de mon QTMovieView qui apparait dans le fullScreen... mais avec une faute "d'orthographe" (oubli du "s"). Donc avec un "s", ça marche très bien !


     


    Désolé - comme on dit, c'est souvent entre l'écran et la chaise que se trouve l'erreur ... :o


Connectez-vous ou Inscrivez-vous pour répondre.