void UpdateActiveScreen() { screen_info *Screen = GetDisplayOfMousePointer(); if(Screen && KWMScreen.Current && KWMScreen.Current != Screen) { DEBUG("UpdateActiveScreen() Active Display Changed"); ClearMarkedWindow(); GiveFocusToScreen(Screen->ID, NULL, true, true); } }
bool IsSpaceTransitionInProgress() { int CurrentSpace = CGSGetActiveSpace(CGSDefaultConnection); CFStringRef Identifier = CGSCopyManagedDisplayForSpace(CGSDefaultConnection, CurrentSpace); bool Result = CGSManagedDisplayIsAnimating(CGSDefaultConnection, (CFStringRef)Identifier); if(Result) { DEBUG("IsSpaceTransitionInProgress() Space transition detected") KWMScreen.UpdateSpace = true; ClearFocusedWindow(); ClearMarkedWindow(); } return Result; }
void FocusedAXObserverCallback(AXObserverRef Observer, AXUIElementRef Element, CFStringRef Notification, void *ContextData) { pthread_mutex_lock(&KWMThread.Lock); window_info *Window = KWMFocus.Window; if(Window && CFEqual(Notification, kAXTitleChangedNotification)) Window->Name = GetWindowTitle(Element); else if(CFEqual(Notification, kAXFocusedWindowChangedNotification)) { if(!Window || Window->WID != GetWindowIDFromRef(Element)) { window_info *OSXWindow = GetWindowByID(GetWindowIDFromRef(Element)); screen_info *OSXScreen = GetDisplayOfWindow(OSXWindow); if(OSXWindow && OSXScreen) { screen_info *ScreenOfWindow = GetDisplayOfWindow(Window); bool SameScreen = ScreenOfWindow == OSXScreen; if(ScreenOfWindow && !SameScreen) UpdateActiveWindowList(ScreenOfWindow); if(ScreenOfWindow && Window && GetWindowByID(Window->WID) == NULL && !SameScreen) { space_info *SpaceOfWindow = GetActiveSpaceOfScreen(ScreenOfWindow); if(SpaceOfWindow->Settings.Mode == SpaceModeBSP) RemoveWindowFromBSPTree(ScreenOfWindow, Window->WID, false, false); else if(SpaceOfWindow->Settings.Mode == SpaceModeMonocle) RemoveWindowFromMonocleTree(ScreenOfWindow, Window->WID, false, false); SpaceOfWindow->FocusedWindowID = 0; } if(!SameScreen) GiveFocusToScreen(OSXScreen->ID, NULL, false, false); SetKwmFocus(Element); if(SameScreen && !IsFocusedWindowFloating()) KWMFocus.InsertionPoint = KWMFocus.Cache; } } } else if(CFEqual(Notification, kAXWindowResizedNotification) || CFEqual(Notification, kAXWindowMovedNotification)) { if(KWMTiling.LockToContainer) LockWindowToContainerSize(Window); UpdateBorder("focused"); if(Window && Window->WID == KWMScreen.MarkedWindow) UpdateBorder("marked"); } else if(CFEqual(Notification, kAXUIElementDestroyedNotification) || CFEqual(Notification, kAXWindowMiniaturizedNotification)) { UpdateBorder("focused"); if(Window && Window->WID == KWMScreen.MarkedWindow) ClearMarkedWindow(); } pthread_mutex_unlock(&KWMThread.Lock); }