Index: reactos/base/shell/explorer/traywnd.cpp =================================================================== --- reactos/base/shell/explorer/traywnd.cpp (revision 74436) +++ reactos/base/shell/explorer/traywnd.cpp (working copy) @@ -520,6 +520,112 @@ return TRUE; } +#define MAX_WINDOWS 64 + + void MinimizeAll() + { + INT nCount = 0; + HWND ahwnd[MAX_WINDOWS], hwndTop = ::GetTopWindow(NULL); + while (hwndTop) + { + if (m_hWnd != hwndTop && m_DesktopWnd != hwndTop && + ::IsWindowVisible(hwndTop) && + !::IsIconic(hwndTop) && + ::GetWindow(hwndTop, GW_OWNER) == NULL) + { + ahwnd[nCount++] = hwndTop; + if (nCount >= MAX_WINDOWS) + break; + } + hwndTop = ::GetWindow(hwndTop, GW_HWNDNEXT); + } + for (INT i = 0; i < nCount; ++i) + { + ::PostMessage(ahwnd[i], WM_SYSCOMMAND, SC_MINIMIZE, 0); + } + } + + void RestoreAll() + { + INT nCount = 0; + HWND ahwnd[MAX_WINDOWS], hwndTop = ::GetTopWindow(NULL); + while (hwndTop) + { + if (m_hWnd != hwndTop && m_DesktopWnd != hwndTop && + ::IsWindowVisible(hwndTop) && ::IsIconic(hwndTop) && + ::GetWindow(hwndTop, GW_OWNER) == NULL) + { + ahwnd[nCount++] = hwndTop; + if (nCount >= MAX_WINDOWS) + break; + } + hwndTop = ::GetWindow(hwndTop, GW_HWNDNEXT); + } + for (INT i = 0; i < nCount; ++i) + { + ::PostMessage(ahwnd[i], WM_SYSCOMMAND, SC_RESTORE, 0); + } + } + + void WinDesktop() + { + // FIXME: Use DeferWindowPos + BOOL HasNonIconic = FALSE; + HWND ahwnd[MAX_WINDOWS], hwndTop = ::GetTopWindow(NULL); + INT nCount = 0; + while (hwndTop) + { + if (m_hWnd != hwndTop && m_DesktopWnd != hwndTop && + ::IsWindowVisible(hwndTop) && !::IsIconic(hwndTop)) + { + HasNonIconic = TRUE; + break; + } + hwndTop = ::GetWindow(hwndTop, GW_HWNDNEXT); + } + if (HasNonIconic) + { + /* show desktop */ + hwndTop = ::GetTopWindow(NULL); + while (hwndTop) + { + if (m_hWnd != hwndTop && m_DesktopWnd != hwndTop && + ::IsWindowVisible(hwndTop) && !::IsIconic(hwndTop)) + { + ahwnd[nCount++] = hwndTop; + if (nCount >= MAX_WINDOWS) + break; + } + hwndTop = ::GetWindow(hwndTop, GW_HWNDNEXT); + } + for (INT i = 0; i < nCount; ++i) + { + ::ShowWindow(ahwnd[i], SW_MINIMIZE); + } + ::SetFocus(m_DesktopWnd); + } + else + { + /* restore all minimized windows */ + hwndTop = ::GetTopWindow(NULL); + while (hwndTop) + { + if (m_hWnd != hwndTop && m_DesktopWnd != hwndTop && + ::IsWindowVisible(hwndTop) && ::IsIconic(hwndTop)) + { + ahwnd[nCount++] = hwndTop; + if (nCount >= MAX_WINDOWS) + break; + } + hwndTop = ::GetWindow(hwndTop, GW_HWNDNEXT); + } + for (INT i = 0; i < nCount; ++i) + { + ::ShowWindow(ahwnd[i], SW_RESTORE); + } + } + } + LRESULT HandleHotKey(DWORD id) { switch (id) @@ -550,10 +656,13 @@ case IDHK_PREV_TASK: break; case IDHK_MINIMIZE_ALL: + MinimizeAll(); break; case IDHK_RESTORE_ALL: + RestoreAll(); break; case IDHK_DESKTOP: + WinDesktop(); break; case IDHK_PAGER: break;