void DisplayReconfigurationCallBack(CGDirectDisplayID Display, CGDisplayChangeSummaryFlags Flags, void *UserInfo) { pthread_mutex_lock(&KWMThread.Lock); if (Flags & kCGDisplayAddFlag) { // Display has been added DEBUG("New display detected! DisplayID: " << Display << " Index: " << KWMScreen.ActiveCount) RefreshActiveDisplays(); } else if (Flags & kCGDisplayRemoveFlag) { // Display has been removed if(CGDisplayIsAsleep(Display)) { DEBUG("Display " << Display << " is asleep!") } else { DEBUG("Display has been removed! DisplayID: " << Display) std::map<int, space_info>::iterator It; for(It = KWMTiling.DisplayMap[Display].Space.begin(); It != KWMTiling.DisplayMap[Display].Space.end(); ++It) DestroyNodeTree(It->second.RootNode); if(KWMTiling.DisplayMap[Display].Identifier) CFRelease(KWMTiling.DisplayMap[Display].Identifier); KWMTiling.DisplayMap.erase(Display); } RefreshActiveDisplays(); }
void DestroyNodeTree(tree_node *Node) { if(Node) { if(Node->List) DestroyLinkList(Node->List); if(Node->LeftChild) DestroyNodeTree(Node->LeftChild); if(Node->RightChild) DestroyNodeTree(Node->RightChild); free(Node); Node = NULL; } }
void FloatFocusedSpace() { if(KWMScreen.Current && IsSpaceInitializedForScreen(KWMScreen.Current) && KWMToggles.EnableTilingMode && !IsSpaceTransitionInProgress() && !IsSpaceSystemOrFullscreen() && FilterWindowList(KWMScreen.Current)) { space_info *Space = &KWMScreen.Current->Space[KWMScreen.Current->ActiveSpace]; DestroyNodeTree(Space->RootNode, Space->Mode); Space->RootNode = NULL; Space->Mode = SpaceModeFloating; ClearFocusedWindow(); } }
void TileFocusedSpace(space_tiling_option Mode) { if(KWMScreen.Current && IsSpaceInitializedForScreen(KWMScreen.Current) && KWMToggles.EnableTilingMode && !IsSpaceTransitionInProgress() && !IsSpaceSystemOrFullscreen() && FilterWindowList(KWMScreen.Current)) { space_info *Space = &KWMScreen.Current->Space[KWMScreen.Current->ActiveSpace]; if(Space->Mode == Mode) return; DestroyNodeTree(Space->RootNode, Space->Mode); Space->RootNode = NULL; Space->Mode = Mode; std::vector<window_info*> WindowsOnDisplay = GetAllWindowsOnDisplay(KWMScreen.Current->ID); CreateWindowNodeTree(KWMScreen.Current, &WindowsOnDisplay); } }
void DisplayReconfigurationCallBack(CGDirectDisplayID Display, CGDisplayChangeSummaryFlags Flags, void *UserInfo) { pthread_mutex_lock(&BackgroundLock); if (Flags & kCGDisplayAddFlag) { // Display has been added DEBUG("New display detected! DisplayID: " << Display << " Index: " << ActiveDisplaysCount) RefreshActiveDisplays(); } else if (Flags & kCGDisplayRemoveFlag) { // Display has been removed DEBUG("Display has been removed! DisplayID: " << Display) std::map<int, space_info>::iterator It; for(It = DisplayMap[Display].Space.begin(); It != DisplayMap[Display].Space.end(); ++It) DestroyNodeTree(It->second.RootNode, It->second.Mode); DisplayMap.erase(Display); RefreshActiveDisplays(); } pthread_mutex_unlock(&BackgroundLock); }
void DisplayReconfigurationCallBack(CGDirectDisplayID Display, CGDisplayChangeSummaryFlags Flags, void *UserInfo) { pthread_mutex_lock(&KWMThread.Lock); static int idx = 0; DEBUG("\n[" << idx << "] BEGIN DISPLAY CONFIGURATION CALLBACK"); if (Flags & kCGDisplayAddFlag) { CFStringRef displayIdentifier = GetDisplayIdentifier(Display); int savedDisplayID = 0; if(displayIdentifier) savedDisplayID = GetDisplayIDFromIdentifier(displayIdentifier); if (!savedDisplayID) { DEBUG("New display detected! DisplayID: " << Display << " Index: " << KWMScreen.ActiveCount); } else if (savedDisplayID != Display) { DEBUG("This display being added had saved ID: " << savedDisplayID); UpdateDisplayIDForDisplay(savedDisplayID, Display); } else { DEBUG("The display that is being added is already there!"); } // Display has been added RefreshActiveDisplays(true); } if (Flags & kCGDisplayRemoveFlag) { CFStringRef displayIdentifier = GetDisplayIdentifier(Display); int savedDisplayID = 0; if(displayIdentifier) savedDisplayID = GetDisplayIDFromIdentifier(displayIdentifier); if ((!savedDisplayID) || (savedDisplayID == Display)) { // Display has been removed if(CGDisplayIsAsleep(Display)) { DEBUG("Display " << Display << " is asleep!"); RefreshActiveDisplays(false); } else { DEBUG("Display has been removed! DisplayID: " << Display); std::map<int, space_info>::iterator It; for(It = KWMTiling.DisplayMap[Display].Space.begin(); It != KWMTiling.DisplayMap[Display].Space.end(); ++It) DestroyNodeTree(It->second.RootNode); if(KWMTiling.DisplayMap[Display].Identifier) CFRelease(KWMTiling.DisplayMap[Display].Identifier); KWMTiling.DisplayMap.erase(Display); RefreshActiveDisplays(true); } } else if (savedDisplayID != Display) { DEBUG("This display being removed had saved ID: " << savedDisplayID); RefreshActiveDisplays(true); } } if ((Flags & kCGDisplayDesktopShapeChangedFlag) || (Flags & kCGDisplayMovedFlag)) { if(!CGDisplayIsAsleep(Display)) { if (Flags & kCGDisplayDesktopShapeChangedFlag) { DEBUG("Display " << Display << " changed resolution"); } else { DEBUG("Display " << Display << " moved"); } screen_info *Screen = &KWMTiling.DisplayMap[Display]; UpdateExistingScreenInfo(Screen, Display, Screen->ID); std::map<int, space_info>::iterator It; for(It = Screen->Space.begin(); It != Screen->Space.end(); ++It) { if(It->second.Managed || It->second.Settings.Mode == SpaceModeFloating) { if(It->first == Screen->ActiveSpace) UpdateSpaceOfScreen(&It->second, Screen); else It->second.NeedsUpdate = true; } } } } if (Flags & kCGDisplaySetMainFlag) { DEBUG("Display " << Display << " became main"); } if (Flags & kCGDisplaySetModeFlag) { DEBUG("Display " << Display << " changed mode"); } if (Flags & kCGDisplayEnabledFlag) { DEBUG("Display " << Display << " enabled"); } if (Flags & kCGDisplayDisabledFlag) { DEBUG("Display " << Display << " disabled"); } DEBUG("[" << idx << "] END DISPLAY CONFIGURATION CALLBACK\n"); idx++; pthread_mutex_unlock(&KWMThread.Lock); }