Держать окно сверху при переключении пробелов - PullRequest
5 голосов
/ 21 февраля 2011

Я создал окно, используя -[NSWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces].
Тем не менее, он выполняет только половину того, что мне нужно: когда я переключаю пробелы, окно также переключает пробелы (как и ожидалось), но мое окно перемещается назад позади всех других окон в этом пространстве. Это особенно плохо, потому что мое приложение активно, но его окно находится под окнами всех других приложений. Я попытался изменить уровень на NSFloatingWindowLevel, и это удерживает его на вершине, но затем он теряет статус ключа (фокус) при переключении пробелов.

Я попытался NSWindowCollectionBehaviorMoveToActiveSpace для поведения коллекции, но это определенно не то, что я ищу.

Есть ли надежда? Я знаю, что почти нет других API, связанных с пробелами.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Пробелы это боль.Мое решение состояло в том, чтобы зарегистрироваться для уведомления об изменениях как это:

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

Тогда в моем WindowController классе:

- (void) activeSpaceDidChange:(NSNotification *)aNotification {
    if ([NSApp isActive]) [[self window] orderFront:self];
}
1 голос
/ 18 января 2013

Для окон без полей (созданных с помощью NSBorderlessWindowMask) я бился головой, пока не придумал следующую модификацию для Фрэнсиса:

- (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];
    }
}

Я видел, как другие заявляли, что у окон без полей есть проблемы, которые привели меня кидея обмануть это на мгновение, чтобы не видеть это как окно без границ.Сначала я установил маску стиля на «Titled», затем «activIgnoringOtherApps», а затем снова установил стиль «без полей», что казалось более логичным решением.Тем не менее, просто чтобы увидеть, какое минимальное решение требовалось для его работы, я в итоге увидел вышеописанные работы.Было бы здорово, если бы кто-то мог объяснить, что именно происходит, и это позволяет работать.

...