3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/user32/controls/appswitch.c
6 * PURPOSE: app switching functionality
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
12 #include <wine/debug.h>
13 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
15 typedef struct APPSWITCH_ITEM
21 struct APPSWITCH_ITEM
* Next
;
23 } APPSWITCH_ITEM
, *PAPPSWITCH_ITEM
;
25 static PAPPSWITCH_ITEM pRoot
= NULL
;
26 static DWORD NumOfWindows
= 0;
27 static HWND hAppWindowDlg
= NULL
;
28 static HHOOK hhk
= NULL
;
30 UINT WINAPI
PrivateExtractIconExW(LPCWSTR
,int,HICON
*,HICON
*,UINT
);
40 PAPPSWITCH_ITEM pItem
;
43 PAPPSWITCH_ITEM pCurItem
;
46 WCHAR szFileName
[MAX_PATH
] = {0};
48 /* check if the enumerated window is visible */
49 if (!IsWindowVisible(hwnd
))
52 hIcon
= (HICON
)SendMessage(hwnd
, WM_GETICON
, ICON_BIG
, 0);
55 GetWindowThreadProcessId(hwnd
, &dwPid
);
56 hProcess
= OpenProcess(PROCESS_QUERY_INFORMATION
|PROCESS_VM_READ
, FALSE
, dwPid
);
59 // if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH))
61 szFileName
[MAX_PATH
-1] = L
'\0';
62 PrivateExtractIconExW(szFileName
, 0, &hIcon
, NULL
, 1);
68 /* icons from WM_GETICON need to be copied */
69 hIcon
= CopyIcon(hIcon
);
71 /* get the text length */
72 Length
= SendMessageW(hwnd
, WM_GETTEXTLENGTH
, 0, 0);
73 /* allocate item structure for it */
74 // pItem = (PAPPSWITCH_ITEM)HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(APPSWITCH_ITEM) + Length * sizeof(WCHAR));
79 /* retrieve the window text when available */
80 SendMessageW(hwnd
, WM_GETTEXT
, Length
+1, (LPARAM
)pItem
->szText
);
82 /* copy the window icon */
84 /* store window handle */
85 pItem
->hwndDlg
= hwnd
;
86 /* is the window the active window */
87 if (GetActiveWindow() == hwnd
)
97 /* enumerate the last item */
100 pCurItem
= pCurItem
->Next
;
102 /* insert it into the list */
103 pCurItem
->Next
= pItem
;
109 EnumerateAppWindows(HDESK hDesk
, HWND hwndDlg
)
111 /* initialize defaults */
114 hAppWindowDlg
= hwndDlg
;
115 /* enumerate all windows */
116 EnumDesktopWindows(hDesk
, EnumWindowEnumProc
, (LPARAM
)NULL
);
117 if (NumOfWindows
> 7)
119 /* FIXME resize window */
124 MarkNextEntryAsActive()
126 PAPPSWITCH_ITEM pItem
;
136 pItem
->bFocus
= FALSE
;
138 pItem
->Next
->bFocus
= TRUE
;
140 pRoot
->bFocus
= TRUE
;
145 InvalidateRgn(hAppWindowDlg
, NULL
, TRUE
);
157 PKBDLLHOOKSTRUCT hk
= (PKBDLLHOOKSTRUCT
) lParam
;
159 if (wParam
== WM_SYSKEYUP
)
161 /* is tab key pressed */
162 if (hk
->vkCode
== VK_TAB
)
164 if (hAppWindowDlg
== NULL
)
169 FIXME("launch alt-tab window\n");
173 MarkNextEntryAsActive();
177 return CallNextHookEx(hhk
, nCode
, wParam
, lParam
);
181 PaintAppWindows(HWND hwndDlg
, HDC hDc
)
184 PAPPSWITCH_ITEM pCurItem
;
186 DWORD XSize
, YSize
, XMax
;
191 XSize
= GetSystemMetrics(SM_CXICON
);
192 YSize
= GetSystemMetrics(SM_CYICON
);
193 XMax
= (XSize
+(XSize
/2)) * 7 + X
;
196 for (dwIndex
= 0; dwIndex
< NumOfWindows
; dwIndex
++)
201 Y
+= YSize
+ (YSize
/2);
203 if (pCurItem
->bFocus
)
205 hBrush
= CreateSolidBrush(RGB(30, 30, 255));
206 SetRect(&Rect
, X
-5, Y
-5, X
+ XSize
+ 5, Y
+ YSize
+ 5);
207 FillRect(hDc
, &Rect
, hBrush
);
208 DeleteObject((HGDIOBJ
)hBrush
);
209 // SendDlgItemMessageW(hwndDlg, IDC_STATIC_CUR_APP, WM_SETTEXT, 0, (LPARAM)pCurItem->szText);
212 DrawIcon(hDc
, X
, Y
, pCurItem
->hIcon
);
213 pCurItem
= pCurItem
->Next
;
214 X
+= XSize
+(XSize
/2);
220 PAPPSWITCH_ITEM pCurItem
, pNextItem
;
225 pNextItem
= pCurItem
->Next
;
226 DestroyIcon(pCurItem
->hIcon
);
227 // HeapFree(Win32CsrApiHeap, 0, pCurItem);
228 pCurItem
= pNextItem
;
231 hAppWindowDlg
= NULL
;
237 SwitchWindowDlgProc(HWND hwndDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
245 hInput
= OpenInputDesktop(0,0, GENERIC_ALL
);
248 EnumerateAppWindows(hInput
, hwndDlg
);
249 CloseDesktop(hInput
);
253 BeginPaint(hwndDlg
, &Paint
);
254 PaintAppWindows(hwndDlg
, Paint
.hdc
);
255 EndPaint(hwndDlg
, &Paint
);
266 InitializeAppSwitchHook()
268 hhk
= SetWindowsHookEx(WH_KEYBOARD_LL
, KeyboardHookProc
, NULL
, 0);
269 TRACE("InitializeAppSwitchHook hhk %p\n", hhk
);