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 = AXLibGetWindowTitle(Element); else if(CFEqual(Notification, kAXFocusedWindowChangedNotification)) { if(!Window || Window->WID != AXLibGetWindowID(Element)) { window_info *OSXWindow = GetWindowByID(AXLibGetWindowID(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 = -1; } if(!SameScreen) GiveFocusToScreen(OSXScreen->ID, NULL, false, false); SetKwmFocus(Element); if(SameScreen && !IsFocusedWindowFloating()) KWMFocus.InsertionPoint = KWMFocus.Cache; } } } else if(Window && (CFEqual(Notification, kAXWindowResizedNotification) || CFEqual(Notification, kAXWindowMovedNotification))) { if(KWMTiling.LockToContainer) LockWindowToContainerSize(Window); UpdateBorder("focused"); } else if(CFEqual(Notification, kAXUIElementDestroyedNotification) || CFEqual(Notification, kAXWindowMiniaturizedNotification)) { UpdateBorder("focused"); } pthread_mutex_unlock(&KWMThread.Lock); }
std::vector<window_info*> GetAllWindowsOnDisplay(int ScreenIndex) { screen_info *Screen = GetDisplayFromScreenID(ScreenIndex); std::vector<window_info*> ScreenWindowLst; for(std::size_t WindowIndex = 0; WindowIndex < KWMTiling.WindowLst.size(); ++WindowIndex) { window_info *Window = &KWMTiling.WindowLst[WindowIndex]; if(IsWindowTilable(Window) && !IsWindowFloating(KWMTiling.WindowLst[WindowIndex].WID, NULL)) { if(Screen == GetDisplayOfWindow(Window)) ScreenWindowLst.push_back(Window); } } return ScreenWindowLst; }
void CycleFocusedWindowDisplay(int Shift, bool Relative) { screen_info *Screen = GetDisplayOfWindow(FocusedWindow); int NewScreenIndex = -1; if(Relative) { if(Shift == 1) NewScreenIndex = (Screen->ID + 1 >= ActiveDisplaysCount) ? 0 : Screen->ID + 1; else if(Shift == -1) NewScreenIndex = (Screen->ID - 1 < 0) ? ActiveDisplaysCount - 1 : Screen->ID - 1; } else { NewScreenIndex = Shift; } if(NewScreenIndex != Screen->ID) { screen_info *NewScreen = GetDisplayFromScreenID(NewScreenIndex); AddWindowToTreeOfUnfocusedMonitor(NewScreen); } }