3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: subsys/csrss/win32csr/appswitch.c
6 * PURPOSE: app switching functionality
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
14 typedef struct APPSWITCH_ITEM
20 struct APPSWITCH_ITEM
* Next
;
22 }APPSWITCH_ITEM
, *PAPPSWITCH_ITEM
;
24 static PAPPSWITCH_ITEM pRoot
= NULL
;
25 static DWORD NumOfWindows
= 0;
26 static HWND hAppWindowDlg
= NULL
;
27 static HHOOK hhk
= NULL
;
29 UINT WINAPI
PrivateExtractIconExW(LPCWSTR
,int,HICON
*,HICON
*,UINT
);
39 PAPPSWITCH_ITEM pItem
;
42 PAPPSWITCH_ITEM pCurItem
;
45 WCHAR szFileName
[MAX_PATH
] = {0};
47 /* check if the enumerated window is visible */
48 if (!IsWindowVisible(hwnd
))
51 hIcon
= (HICON
)SendMessage(hwnd
, WM_GETICON
, ICON_BIG
, 0);
54 GetWindowThreadProcessId(hwnd
, &dwPid
);
55 hProcess
= OpenProcess(PROCESS_QUERY_INFORMATION
|PROCESS_VM_READ
, FALSE
, dwPid
);
58 if (GetModuleFileNameExW(hProcess
, NULL
, szFileName
, MAX_PATH
))
60 szFileName
[MAX_PATH
-1] = L
'\0';
61 PrivateExtractIconExW(szFileName
, 0, &hIcon
, NULL
, 1);
67 /* icons from WM_GETICON need to be copied */
68 hIcon
= CopyIcon(hIcon
);
70 /* get the text length */
71 Length
= SendMessageW(hwnd
, WM_GETTEXTLENGTH
, 0, 0);
72 /* allocate item structure for it */
73 pItem
= (PAPPSWITCH_ITEM
)HeapAlloc(Win32CsrApiHeap
, HEAP_ZERO_MEMORY
, sizeof(APPSWITCH_ITEM
) + Length
* sizeof(WCHAR
));
78 /* retrieve the window text when available */
79 SendMessageW(hwnd
, WM_GETTEXT
, Length
+1, (LPARAM
)pItem
->szText
);
81 /* copy the window icon */
83 /* store window handle */
84 pItem
->hwndDlg
= hwnd
;
85 /* is the window the active window */
86 if (GetActiveWindow() == hwnd
)
96 /* enumerate the last item */
99 pCurItem
= pCurItem
->Next
;
101 /* insert it into the list */
102 pCurItem
->Next
= pItem
;
108 EnumerateAppWindows(HDESK hDesk
, HWND hwndDlg
)
110 /* initialize defaults */
113 hAppWindowDlg
= hwndDlg
;
114 /* enumerate all windows */
115 EnumDesktopWindows(hDesk
, EnumWindowEnumProc
, (LPARAM
)NULL
);
116 if (NumOfWindows
> 7)
118 /* FIXME resize window */
123 MarkNextEntryAsActive()
125 PAPPSWITCH_ITEM pItem
;
135 pItem
->bFocus
= FALSE
;
137 pItem
->Next
->bFocus
= TRUE
;
139 pRoot
->bFocus
= TRUE
;
144 InvalidateRgn(hAppWindowDlg
, NULL
, TRUE
);
156 PKBDLLHOOKSTRUCT hk
= (PKBDLLHOOKSTRUCT
) lParam
;
158 if (wParam
== WM_SYSKEYUP
)
160 /* is tab key pressed */
161 if (hk
->vkCode
== VK_TAB
)
163 if (hAppWindowDlg
== NULL
)
168 DPRINT1("launch alt-tab window\n");
172 MarkNextEntryAsActive();
176 return CallNextHookEx(hhk
, nCode
, wParam
, lParam
);
180 PaintAppWindows(HWND hwndDlg
, HDC hDc
)
183 PAPPSWITCH_ITEM pCurItem
;
185 DWORD XSize
, YSize
, XMax
;
190 XSize
= GetSystemMetrics(SM_CXICON
);
191 YSize
= GetSystemMetrics(SM_CYICON
);
192 XMax
= (XSize
+(XSize
/2)) * 7 + X
;
195 for (dwIndex
= 0; dwIndex
< NumOfWindows
; dwIndex
++)
200 Y
+= YSize
+ (YSize
/2);
202 if (pCurItem
->bFocus
)
204 hBrush
= CreateSolidBrush(RGB(30, 30, 255));
205 SetRect(&Rect
, X
-5, Y
-5, X
+ XSize
+ 5, Y
+ YSize
+ 5);
206 FillRect(hDc
, &Rect
, hBrush
);
207 DeleteObject((HGDIOBJ
)hBrush
);
208 SendDlgItemMessageW(hwndDlg
, IDC_STATIC_CUR_APP
, WM_SETTEXT
, 0, (LPARAM
)pCurItem
->szText
);
211 DrawIcon(hDc
, X
, Y
, pCurItem
->hIcon
);
212 pCurItem
= pCurItem
->Next
;
213 X
+= XSize
+(XSize
/2);
219 PAPPSWITCH_ITEM pCurItem
, pNextItem
;
224 pNextItem
= pCurItem
->Next
;
225 DestroyIcon(pCurItem
->hIcon
);
226 HeapFree(Win32CsrApiHeap
, 0, pCurItem
);
227 pCurItem
= pNextItem
;
230 hAppWindowDlg
= NULL
;
236 SwitchWindowDlgProc(HWND hwndDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
244 hInput
= OpenInputDesktop(0,0, GENERIC_ALL
);
247 EnumerateAppWindows(hInput
, hwndDlg
);
248 CloseDesktop(hInput
);
252 BeginPaint(hwndDlg
, &Paint
);
253 PaintAppWindows(hwndDlg
, Paint
.hdc
);
254 EndPaint(hwndDlg
, &Paint
);
265 InitializeAppSwitchHook()
267 hhk
= SetWindowsHookEx(WH_KEYBOARD_LL
, KeyboardHookProc
, NULL
, 0);
268 DPRINT("InitializeAppSwitchHook hhk %p\n", hhk
);