NsrunalertPanel aparece atrás da "janela ativa"
-
26-09-2019 - |
Pergunta
Estou tentando montar um pacote de relatórios de erro simples. Se meu programa principal travar, ele salva um Crashlog e inicia um programa repórter. O programa repórter pergunta ao usuário se ele pode enviar o log de falhas para mim, o faz. Estou usando o nsrunalertPanel para criar uma caixa de mensagem básica.
Por alguma razão, essa caixa de mensagens está aparecendo enterrada sob qualquer outra janela que possa estar aberta. Execute o pacote principal de uma janela do localizador, ele aparece no topo, force -o a travar, a janela do repórter aparece atras do a janela do localizador.
Por que isso está acontecendo e como pode ser resolvido?
Caso de teste mínimo:
#import <AppKit/AppKit.h>
int main(int a, char* av) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSApplication* q = [[NSApplication alloc] init];
NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
[pool release];
}
Construído com:
g++ test.mm -framework AppKit && ./a.out
Solução
Parece que tenho uma solução, destilada de muitas páginas da web tangencialmente relacionadas:
#import <AppKit/AppKit.h>
int main(int a, char* av) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSApplication* q = [[NSApplication alloc] init];
ProcessSerialNumber psn = {0, kCurrentProcess};
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
[NSApp activateIgnoringOtherApps:YES];
NSRunAlertPanel(@"Hello", @"Aloha", @"OK", nil,nil);
[pool release];
}
Não pretendo entender isso - é a programação de culto de carga no seu melhor. Melhores respostas, ou explicações do que cada etapa faz, seriam muito apreciadas.