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); }
void ResizeWindowToContainerSize(link_node *Link) { ax_window *Window = GetWindowByID((unsigned int)Link->WindowID); if(Window) { SetWindowDimensions(Window, Link->Container.X, Link->Container.Y, Link->Container.Width, Link->Container.Height); } }
void ResizeWindowToContainerSize(tree_node *Node) { ax_window *Window = GetWindowByID((unsigned int)Node->WindowID); if(Window) { SetWindowDimensions(Window, Node->Container.X, Node->Container.Y, Node->Container.Width, Node->Container.Height); } }