2011-02-20 14 views
5

He creado una ventana con - [NSWindow setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]. Sin embargo, solo hace la mitad de lo que quiero: cuando cambio espacios, la ventana también cambia espacios (como se esperaba), pero mi ventana se mueve hacia atrás detrás de todas las otras ventanas en ese espacio. Esto es especialmente malo porque mi aplicación está activa pero su ventana está debajo de todas las ventanas de otras aplicaciones. Traté de cambiar el nivel a NSFloatingWindowLevel, y eso lo mantiene en la parte superior, pero luego pierde el estado de la tecla (enfoque) al cambiar espacios.Mantener la ventana en la parte superior al cambiar espacios

Intenté NSWindowCollectionBehaviorMoveToActiveSpace para el comportamiento de la colección, pero definitivamente no es lo que estoy buscando.

¿Hay esperanza? Sé que casi no hay otras API relacionadas con Spaces.

Respuesta

2

Espacios es un dolor. Mi solución fue la de registrar una notificación de cambio de este modo:

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(activeSpaceDidChange:) name:NSWorkspaceActiveSpaceDidChangeNotification object:nil]; 

Luego, en mi clase WindowController:

- (void) activeSpaceDidChange:(NSNotification *)aNotification { 
    if ([NSApp isActive]) [[self window] orderFront:self]; 
} 
0

Para las ventanas sin bordes (creados con NSBorderlessWindowMask), me di un golpe en la cabeza hasta que se me ocurrió la siguiente modificación de Francisco:

- (void) activeSpaceDidChange:(NSNotification *)aNotification { 

    if ([NSApp isActive]) 
    { 
     NSRect windowRect = [[self window] frame]; 
     [[self window] setStyleMask:NSTitledWindowMask]; 
     [[self window] setStyleMask:NSBorderlessWindowMask]; 
     [[self window] setFrame:windowRect display:YES]; 
     [[NSApplication sharedApplication] activateIgnoringOtherApps : YES]; 
    } 
} 

vi otras que indica que las ventanas sin bordes tienen problemas de lo que me llevó a la idea de engañar que ímpetus rápidamente a no verlo como una ventana sin bordes. Primero tuve que configurar la máscara de estilo en "Titulado" seguido de "activar ignorar otras aplicaciones" y luego volver a configurar el estilo "sin bordes", que parecía ser una solución más lógica. Sin embargo, solo para ver qué solución mínima se requería para que funcionara, terminé viendo los trabajos anteriores. Sería bueno si alguien pudiera completar lo que está sucediendo exactamente que permite que esto funcione.

Cuestiones relacionadas