void HandleSysCommand(WPARAM wParam, HWND hwnd) { if (wParam == MOVETOMENU_NEW) { // abort command, too many commands in a short period of time if (nLastCommand > GetTickCount64()) { return; } Log("Getting RootWindow of %X", hwnd); HWND rootHwnd = GetAncestor(hwnd, GA_ROOTOWNER); if (rootHwnd != NULL) { hwnd = rootHwnd; } Log("Moving %X to new", hwnd); IVirtualDesktop *pNewDesktop = nullptr; HRESULT hr = pDesktopManagerInternal->CreateDesktopW(&pNewDesktop); if (FAILED(hr)) { return; } GUID id; hr = pNewDesktop->GetID(&id); if (SUCCEEDED(hr)) { HWND focusHwnd = NULL; if (!bSwitchDesktopAfterMove) { focusHwnd = hwnd; do { focusHwnd = GetNextWindow(focusHwnd, GW_HWNDNEXT); } while (focusHwnd && EnumWindowsProc(focusHwnd, NULL)); } Log("pDesktopManager->MoveWindowToDesktop(%X, %X)", hwnd, id); hr = pDesktopManager->MoveWindowToDesktop(hwnd, id); if (SUCCEEDED(hr)) { if (bSwitchDesktopAfterMove) { pDesktopManagerInternal->SwitchDesktop(pNewDesktop); } else if (focusHwnd) { SetForegroundWindow(focusHwnd); } } else { Log("Error %d on moving %X to %X", hr, hwnd, id); } } pNewDesktop->Release(); nLastCommand = GetTickCount64() + COMMAND_TIMEOUT; } else if (wParam >= MOVETOMENU_START && wParam <= MOVETOMENU_LAST) { // abort command, too many commands in a short period of time if (nLastCommand > GetTickCount64()) { return; } Log("Getting RootWindow of %X", hwnd); HWND rootHwnd = GetAncestor(hwnd, GA_ROOTOWNER); if (rootHwnd != NULL) { hwnd = rootHwnd; } Log("Moving %X to %X", hwnd, wParam); IObjectArray *pObjectArray = nullptr; HRESULT hr = pDesktopManagerInternal->GetDesktops(&pObjectArray); if (FAILED(hr)) { Log("Failed to get desktops for %X", hwnd); return; } IVirtualDesktop *pDesktop = nullptr; if (SUCCEEDED(pObjectArray->GetAt((UINT)wParam - MOVETOMENU_START, __uuidof(IVirtualDesktop), (void**)&pDesktop))) { GUID id; hr = pDesktop->GetID(&id); if (SUCCEEDED(hr)) { HWND focusHwnd = NULL; if (!bSwitchDesktopAfterMove) { focusHwnd = hwnd; do { focusHwnd = GetNextWindow(focusHwnd, GW_HWNDNEXT); } while (focusHwnd && EnumWindowsProc(focusHwnd, NULL)); } Log("pDesktopManager->MoveWindowToDesktop(%X, %X)", hwnd, id); hr = pDesktopManager->MoveWindowToDesktop(hwnd, id); if (SUCCEEDED(hr)) { // If there are no windows delete the desktop if (bDeleteEmptyDesktops) { IVirtualDesktop *pCurrentDesktop = nullptr; hr = pDesktopManagerInternal->GetCurrentDesktop(&pCurrentDesktop); if (SUCCEEDED(hr)) { if (pCurrentDesktop != pDesktop) { if (EnumWindows((WNDENUMPROC)EnumWindowsProc, NULL) != FALSE) { Log("Removing Desktop"); pDesktopManagerInternal->RemoveDesktop(pCurrentDesktop, pDesktop); } } pCurrentDesktop->Release(); } } if (bSwitchDesktopAfterMove) { pDesktopManagerInternal->SwitchDesktop(pDesktop); } else if (focusHwnd != NULL) { SetForegroundWindow(focusHwnd); } } else { Log("Error %X on moving %X to %X", hr, hwnd, id); } } pDesktop->Release(); } pObjectArray->Release(); nLastCommand = GetTickCount64() + COMMAND_TIMEOUT; } else if (wParam == MOVETOMENU_LEFT) { UINT count; int index = GetCurrentDesktopIndex(&count); Log("Current Index is %d", index); Log("Current Count is %d", count); if (index == -1) return; if (index == MOVETOMENU_START) return; Log("Switch to %d", index - 1); HandleSysCommand(--index, hwnd); } else if (wParam == MOVETOMENU_RIGHT) { UINT count; int index = GetCurrentDesktopIndex(&count); Log("Current Index is %d", index); Log("Current Count is %d", count); if (index == -1) return; if (index == MOVETOMENU_LAST) return; if ((++index) <= (int)(count + MOVETOMENU_NEW)) { Log("Switch to %d", index); HandleSysCommand(index, hwnd); } else if (bCreateNewDesktopOnMove) { Log("Create new desktop"); HandleSysCommand(MOVETOMENU_NEW, hwnd); } } }
void HandleSysCommand(WPARAM wParam, HWND hwnd) { if (wParam == MOVETOMENU_NEW) { Log("Getting RootWindow of %X", hwnd); HWND rootHwnd = GetAncestor(hwnd, GA_ROOTOWNER); if (rootHwnd != NULL) { hwnd = rootHwnd; } Log("Moving %X to new", hwnd); IVirtualDesktop *pNewDesktop = nullptr; HRESULT hr = pDesktopManagerInternal->CreateDesktopW(&pNewDesktop); if (FAILED(hr)) { return; } GUID id; hr = pNewDesktop->GetID(&id); if (SUCCEEDED(hr)) { Log("pDesktopManager->MoveWindowToDesktop(%X, %X)", hwnd, id); hr = pDesktopManager->MoveWindowToDesktop(hwnd, id); if (SUCCEEDED(hr)) { if (bSwitchDesktopAfterMove) { pDesktopManagerInternal->SwitchDesktop(pNewDesktop); } } else { Log("Error %d on moving %X to %X", hr, hwnd, id); } } pNewDesktop->Release(); } else if (wParam >= MOVETOMENU_START && wParam <= MOVETOMENU_LAST) { Log("Getting RootWindow of %X", hwnd); HWND rootHwnd = GetAncestor(hwnd, GA_ROOTOWNER); if (rootHwnd != NULL) { hwnd = rootHwnd; } Log("Moving %X to %X", hwnd, wParam); IObjectArray *pObjectArray = nullptr; HRESULT hr = pDesktopManagerInternal->GetDesktops(&pObjectArray); if (FAILED(hr)) { Log("Failed to get desktops for %X", hwnd); return; } IVirtualDesktop *pDesktop = nullptr; if (SUCCEEDED(pObjectArray->GetAt((UINT)wParam - MOVETOMENU_START, __uuidof(IVirtualDesktop), (void**)&pDesktop))) { GUID id; hr = pDesktop->GetID(&id); if (SUCCEEDED(hr)) { Log("pDesktopManager->MoveWindowToDesktop(%X, %X)", hwnd, id); hr = pDesktopManager->MoveWindowToDesktop(hwnd, id); if (SUCCEEDED(hr)) { if (bSwitchDesktopAfterMove) { pDesktopManagerInternal->SwitchDesktop(pDesktop); } } else { Log("Error %X on moving %X to %X", hr, hwnd, id); } } pDesktop->Release(); } pObjectArray->Release(); } else if (wParam == MOVETOMENU_LEFT) { UINT count; int index = GetCurrentDesktopIndex(&count); Log("Current Index is %d", index); Log("Current Count is %d", count); if (index == -1) return; if (index == MOVETOMENU_START) return; Log("Switch to %d", index - 1); HandleSysCommand(--index, hwnd); } else if (wParam == MOVETOMENU_RIGHT) { UINT count; int index = GetCurrentDesktopIndex(&count); Log("Current Index is %d", index); Log("Current Count is %d", count); if (index == -1) return; if (index == MOVETOMENU_LAST) return; if ((++index) <= (int)(count + MOVETOMENU_NEW)) { Log("Switch to %d", index); HandleSysCommand(index, hwnd); } else { Log("Create new desktop"); HandleSysCommand(MOVETOMENU_NEW, hwnd); } } }