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 GiveFocusToScreen(int ScreenIndex) { screen_info *Screen = GetDisplayFromScreenID(ScreenIndex); if(Screen) { CGPoint CursorPos = CGPointMake(Screen->X + (Screen->Width / 2), Screen->Y + (Screen->Height / 2)); CGEventRef MoveEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CursorPos, kCGMouseButtonLeft); CGEventSetFlags(MoveEvent, 0); CGEventPost(kCGHIDEventTap, MoveEvent); CFRelease(MoveEvent); DEBUG("GiveFocusToScreen() " << ScreenIndex) UpdateActiveWindowList(Screen); tree_node *NewFocusNode = GetFirstLeafNode(Screen->Space[Screen->ActiveSpace].RootNode); SetWindowFocusByNode(NewFocusNode); } }
void GiveFocusToScreen(unsigned int ScreenIndex, tree_node *FocusNode, bool Mouse, bool UpdateFocus) { screen_info *Screen = GetDisplayFromScreenID(ScreenIndex); if(Screen && Screen != KWMScreen.Current) { KWMScreen.PrevSpace = KWMScreen.Current->ActiveSpace; KWMScreen.Current = Screen; Screen->ActiveSpace = GetActiveSpaceOfDisplay(Screen); ShouldActiveSpaceBeManaged(); space_info *Space = GetActiveSpaceOfScreen(Screen); DEBUG("GiveFocusToScreen() " << ScreenIndex << \ ": Space transition ended " << KWMScreen.PrevSpace << \ " -> " << Screen->ActiveSpace); if(UpdateFocus) { if(Space->Initialized && FocusNode) { DEBUG("Populated Screen 'Window -f Focus'"); UpdateActiveWindowList(Screen); FilterWindowList(Screen); SetWindowFocusByNode(FocusNode); MoveCursorToCenterOfFocusedWindow(); } else if(Space->Initialized && Space->RootNode) { DEBUG("Populated Screen Key/Mouse Focus"); UpdateActiveWindowList(Screen); FilterWindowList(Screen); bool WindowBelowCursor = IsAnyWindowBelowCursor(); if(Mouse && !WindowBelowCursor) ClearFocusedWindow(); else if(Mouse && WindowBelowCursor) FocusWindowBelowCursor(); if(!Mouse) { if(Space->FocusedWindowID == -1) { if(Space->Settings.Mode == SpaceModeBSP) { void *FocusNode = NULL; GetFirstLeafNode(Space->RootNode, (void**)&FocusNode); Space->FocusedWindowID = ((tree_node*)FocusNode)->WindowID; } else if(Space->Settings.Mode == SpaceModeMonocle) { if(Space->RootNode->List) Space->FocusedWindowID = Space->RootNode->List->WindowID; } } FocusWindowByID(Space->FocusedWindowID); MoveCursorToCenterOfFocusedWindow(); } } else { if(!Space->Initialized || Space->Settings.Mode == SpaceModeFloating || !Space->RootNode) { DEBUG("Uninitialized Screen"); ClearFocusedWindow(); if(!Mouse) CGWarpMouseCursorPosition(CGPointMake(Screen->X + (Screen->Width / 2), Screen->Y + (Screen->Height / 2))); if(Space->Settings.Mode != SpaceModeFloating && !Space->RootNode) { CGPoint ClickPos = GetCursorPos(); CGEventRef ClickEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, ClickPos, kCGMouseButtonLeft); CGEventSetFlags(ClickEvent, 0); CGEventPost(kCGHIDEventTap, ClickEvent); CFRelease(ClickEvent); ClickEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, ClickPos, kCGMouseButtonLeft); CGEventSetFlags(ClickEvent, 0); CGEventPost(kCGHIDEventTap, ClickEvent); CFRelease(ClickEvent); } } } } } }