Newsgroup: it.comp.macintosh
Titolo: [Cocoa] Fullscreen

Salve a tutti. Stavo iniziando ad implementare il fullscreen in PDFView,
ma ho qualche problema. Sono riuscito a creare una finsestra in
fullscreen, ma non ho proprio idea di come farla sparire :-) A volte
Mela+Q va, ma una volta no ed ho dovuto riavviare in quanto non c'era
modo di passare ad un'altra finestra.
Qualcuno sa dove devo mettere il codice per gestire qualcosa tipo
pressione tasto esc, in modo da poter nascondere quella finestra? 
Grazie.

 pressione tasto esc, in modo da poter nascondere quella finestra?
Nella catena dei responder, ad esempio in una sottoclasse di NSWindow:
- (void) keyDown: (NSEvent *) event;
{
    NSString *keys = [event characters];
    int len = [keys length];
    if (!len || len > 1)
      {
        [super keyDown: event];
        return;
      }
    unichar key = [keys characterAtIndex: 0];
    switch (key)
      {
          case 0x1B: // esc
              [self tryToPerform: @selector(closeWindow:) with: self];
              break;
          default:
              [super keyDown: event];
              break;
      }
}
Ciao
Mirko

 [snip]
Perfetto, funziona benissimo. Grazie mille!

 [snip]
Ne approfitto per chiedere un'altra cosa:
- (void) keyDown: (NSEvent *) event;
{
    // Get event keys
    NSString *keys = [event characters];
    int len = [keys length];
    if ( ! len || len > 1 )
    {
        [super keyDown: event];
        return;
    }
 
    unichar key = [keys characterAtIndex: 0];
    if ( key == 0x1B ) {
        // Escape key
        [self tryToPerform: @selector(exitFullScreen:) with: self];
        return;
    }
 
    if ( [event modifierFlags] & NSCommandKeyMask ) {
        switch ( key )
        {
        case '+':
            [fullScreenView zoomIn: self];
            break;
 
        case '-':
            [fullScreenView zoomOut: self];
            break;
 
        case '=':
            [fullScreenView setAutoScales: YES];
            break;
 
        case '[':
            [fullScreenView goBack: self];
            break;
 
        case ']':
            [fullScreenView goForward: self];
            break;
 
        case '1':
            [fullScreenView setDisplayMode:
kPDFDisplaySinglePageContinuous];
            break;
 
        case '2':
            [fullScreenView setDisplayMode: kPDFDisplayTwoUpContinuous];
            break;
 
        default:
            [super keyDown: event];
            break;
        }
    } else {
        [super keyDown: event];
    }
}
Ora: questo codice non funziona come dovrebbe. Cioè, la condizione
dell'if fallisce sempre. Rimuovendolo invece funziona se premo i tasti
senza tenere premuto mela (tipo: schiaccio 1 e funziona, schiaccio
mela+1 e non funziona). Come mai?
Io creo la finestra così:
- (IBAction) goFullScreen: (id) sender
{
    if ( ! fullScreenWindow ) {
        // Create and display
        fullScreenWindow = [[MyFullScreenWindow alloc] init: [wc view]];
        NSWindowController *fswc = [[NSWindowController alloc]
initWithWindow: fullScreenWindow];
        [self addWindowController: fswc];
    }
 
    [fullScreenWindow goFullScreen];
}
Dove questo codice è nella classe MyPDFDocument.
Riporto anche il codice rilevante di MyFullScreenWindow:
- (id) init: (PDFView *) oView
{    
    // Create the full-screen window.
    NSScreen* mainScreen = [NSScreen mainScreen]; 
    NSRect winRect = [mainScreen frame];
    self = [super initWithContentRect: winRect 
        styleMask: NSBorderlessWindowMask 
        backing: NSBackingStoreBuffered 
        defer: NO 
        screen: [NSScreen mainScreen] ];
 
    // Establish the window attributes.
    [self setReleasedWhenClosed: NO];
    [self setDisplaysWhenScreenProfileChanges: YES];
    [self setDelegate: self];
    // Create the view
    normalView = oView;
    fullScreenView = [[PDFView alloc] init];    
    [fullScreenView setDocument: [normalView document]];
    [self setContentView: fullScreenView];
 
    [fullScreenView setNeedsDisplay: YES];
 
    return self;
}
- (BOOL) canBecomeKeyWindow
{
    // So we can get ESC
    return YES;
}
- (void) goFullScreen;
{
    // Get screen information
    NSScreen* mainScreen = [NSScreen mainScreen]; 
    NSDictionary* screenInfo = [mainScreen deviceDescription]; 
    NSNumber* screenID = [screenInfo objectForKey:@"NSScreenNumber"];
 
    // Capture the screen.
    CGDirectDisplayID displayID = (CGDirectDisplayID)[screenID
longValue]; 
    CGDisplayErr err = CGDisplayCapture(displayID);
    if (err == CGDisplayNoErr)
    {
        [self syncView: normalView: fullScreenView];
 
        // The window has to be above the level of the shield window.
        int32_t shieldLevel = CGShieldingWindowLevel();
        [self setLevel: shieldLevel];
 
        // Show the window.
        [self makeKeyAndOrderFront: self];
    }
}
Dove syncView è un metodo che sincronizza lo zoom, la pagina
visualizzata eccetera eccetera.
Grazie a chiunque mi saprà rispondere.

 mela+1 e non funziona). Come mai?
Se -keyDown: l'hai implementato in NSWindow dovrebbe funzionare, al
limite nella seconda linea prova ad utilizzare -charactersIgnoringModifiers
al posto di -characters.
Altrimenti dovresti controllare il tipo di evento che ti viene passato 
(sempre che
non venga filtrato da qualche altro componente).
Ciao
Mirko

 non venga filtrato da qualche altro componente).
Ok, farň un po' di debug serio. Grazie ancora.