Implement taskbar context menu items "Undo Cascade" and "Undo Tile".
Based on patch by KRosUser.
CORE-18383
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Лента със задачи и Старт меню"
IDS_RESTORE_ALL "&Покажи отворените прозорци"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Vlastnosti hlavního panelu a Start menu"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskleisten- und Startmenüeinstellungen"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Propiedades de la Barra de tareas y del Menú Inicio"
IDS_RESTORE_ALL "&Mostrar ventanas abiertas"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Tegumiriba ja Menüü Start"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Ataza-barra eta Hasi menuaren propietateak"
IDS_RESTORE_ALL "E&rakutsi irekitako leihoak"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Tehtäväpalkki ja Käynnistä Valikko"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Barre des tâches et Menu Démarrer"
IDS_RESTORE_ALL "&Afficher les fenêtres ouvertes"
+ IDS_TRAYWND_UNDO_CASCADE "Ann&uler cascade"
+ IDS_TRAYWND_UNDO_TILE "Ann&uler mosaïque"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "שורת המשימות ושולחן העבודה"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "टास्कबार और स्टार्ट मेनू"
IDS_RESTORE_ALL "खुले हुऐ विंडोज &दिखाएं"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Tálca és Start menü"
IDS_RESTORE_ALL "&Megnyitott ablakok megjelenítése"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Bilah Tugas dan Menu Mulai"
IDS_RESTORE_ALL "&Tampilkan Semua Jendela"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Proprietà della Barra delle applicazioni e del Menú di avvio"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "タスクバーとスタートメニュー"
IDS_RESTORE_ALL "開いているウィンドウを表示(&S)"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "작업 표시줄 및 시작 메뉴"
IDS_RESTORE_ALL "열린 창 보기(&S)"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Bar Tugas dan Menu Mula"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taakbalk en menu Start eigenschappen"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Egenskaper for oppgavelinjen og startmeny"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Paska zadań i menu Start"
IDS_RESTORE_ALL "&Pokaż otwarte okna"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Propriedades do Barra de Tarefas e Menu Iniciar"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Barra de Tarefas e Menu Iniciar"
IDS_RESTORE_ALL "&Mostrar janelas abertas"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Bara de activități și meniul „Pornire”"
IDS_RESTORE_ALL "&Afișează ferestrele deschise"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Меню ""Пуск"" и панель задач"
IDS_RESTORE_ALL "&Показать окна"
+ IDS_TRAYWND_UNDO_CASCADE "&Отменить Каскадом"
+ IDS_TRAYWND_UNDO_TILE "&Отменить Окна рядом"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Vlastnosti panela úloh a ponuky Štart"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar dhe Start Menu"
IDS_RESTORE_ALL "&Show Open Windows"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Görev Çubuğu ve Başlat Menüsü"
IDS_RESTORE_ALL "&Açık Pencereleri Göster"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "Властивості меню Пуск та Панелі завдань"
IDS_RESTORE_ALL "&Показати відкриті вікна"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "任务栏和开始菜单属性"
IDS_RESTORE_ALL "显示打开的窗口(&S)"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "工作列及開始功能表"
IDS_RESTORE_ALL "顯示開啟的視窗(&S)"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
BEGIN
IDS_TASKBAR_STARTMENU_PROP_CAPTION "工作列及開始功能表"
IDS_RESTORE_ALL "顯示開啟的視窗(&S)"
+ IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade"
+ IDS_TRAYWND_UNDO_TILE "&Undo Tile"
END
#define IDS_HELP_COMMAND 732
#define IDS_TASKBAR_STARTMENU_PROP_CAPTION 810
#define IDS_RESTORE_ALL 811
+#define IDS_TRAYWND_UNDO_CASCADE 812
+#define IDS_TRAYWND_UNDO_TILE 813
/*******************************************************************************\
|* Control Resources *|
static const WCHAR szTrayWndClass[] = L"Shell_TrayWnd";
+enum { NONE, TILED, CASCADED } g_Arrangement = NONE;
+
+struct WINDOWPOSBACKUPDATA
+{
+ HWND hwnd;
+ WINDOWPLACEMENT wplt;
+};
+CSimpleArray<WINDOWPOSBACKUPDATA> g_WindowPosBackup;
+
+static BOOL CALLBACK BackupWindowsPosProc(HWND hwnd, LPARAM lParam)
+{
+ WINDOWPOSBACKUPDATA wposdata;
+ HWND hDesk = GetDesktopWindow();
+ if (IsWindowVisible(hwnd) && !IsIconic(hwnd) && (hwnd != hDesk))
+ {
+ wposdata.hwnd = hwnd;
+ wposdata.wplt.length = sizeof(wposdata.wplt);
+ GetWindowPlacement(hwnd, &(wposdata.wplt));
+ g_WindowPosBackup.Add(wposdata);
+ }
+
+ return TRUE;
+}
+
+VOID BackupWindowPos()
+{
+ EnumWindows(BackupWindowsPosProc, NULL);
+}
+
+VOID RestoreWindowPos()
+{
+ g_Arrangement = NONE;
+
+ for (INT i = g_WindowPosBackup.GetSize() - 1; i >= 0; --i)
+ {
+ SetWindowPlacement(g_WindowPosBackup[i].hwnd, &(g_WindowPosBackup[i].wplt));
+ }
+
+ g_WindowPosBackup.RemoveAll();
+}
+
struct EFFECTIVE_INFO
{
HWND hwndFound;
break;
case ID_SHELL_CMD_UNDO_ACTION:
+ RestoreWindowPos();
break;
case ID_SHELL_CMD_SHOW_DESKTOP:
case ID_SHELL_CMD_TILE_WND_H:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
+ if (g_Arrangement == NONE)
+ {
+ BackupWindowPos();
+ }
TileWindows(NULL, MDITILE_HORIZONTAL, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
+ g_Arrangement = TILED;
break;
case ID_SHELL_CMD_TILE_WND_V:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
+ if (g_Arrangement == NONE)
+ {
+ BackupWindowPos();
+ }
TileWindows(NULL, MDITILE_VERTICAL, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
+ g_Arrangement = TILED;
break;
case ID_SHELL_CMD_CASCADE_WND:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
+ if (g_Arrangement == NONE)
+ {
+ BackupWindowPos();
+ }
CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
+ g_Arrangement = CASCADED;
break;
case ID_SHELL_CMD_CUST_NOTIF:
::EnableMenuItem(hMenu, ID_SHELL_CMD_CASCADE_WND, MF_BYCOMMAND | MF_ENABLED);
::EnableMenuItem(hMenu, ID_SHELL_CMD_TILE_WND_H, MF_BYCOMMAND | MF_ENABLED);
::EnableMenuItem(hMenu, ID_SHELL_CMD_TILE_WND_V, MF_BYCOMMAND | MF_ENABLED);
+ if (g_Arrangement != NONE)
+ {
+ CStringW strCaption((g_Arrangement == TILED) ? MAKEINTRESOURCEW(IDS_TRAYWND_UNDO_TILE)
+ : MAKEINTRESOURCEW(IDS_TRAYWND_UNDO_CASCADE));
+ MENUITEMINFOW mii = { sizeof(mii) };
+ ::GetMenuItemInfoW(hMenu, ID_SHELL_CMD_UNDO_ACTION, FALSE, &mii);
+ mii.fMask = MIIM_TYPE;
+ mii.fType = MFT_STRING;
+ mii.dwTypeData = const_cast<LPWSTR>(&strCaption[0]);
+ ::SetMenuItemInfoW(hMenu, ID_SHELL_CMD_UNDO_ACTION, FALSE, &mii);
+ }
+ else
+ {
+ ::DeleteMenu(hMenu, ID_SHELL_CMD_UNDO_ACTION, MF_BYCOMMAND);
+ }
}
else
{
::EnableMenuItem(hMenu, ID_SHELL_CMD_CASCADE_WND, MF_BYCOMMAND | MF_GRAYED);
::EnableMenuItem(hMenu, ID_SHELL_CMD_TILE_WND_H, MF_BYCOMMAND | MF_GRAYED);
::EnableMenuItem(hMenu, ID_SHELL_CMD_TILE_WND_V, MF_BYCOMMAND | MF_GRAYED);
+ ::DeleteMenu(hMenu, ID_SHELL_CMD_UNDO_ACTION, MF_BYCOMMAND);
+ g_Arrangement = NONE;
+ g_WindowPosBackup.RemoveAll();
}
return 0;
}