- start implementing the alt-tab app switching dialog

- requires WH_KEYBOARD_LL hook which is not yet ready
- add missing resource constant

svn path=/trunk/; revision=35051
This commit is contained in:
Johannes Anderwald 2008-08-02 23:49:02 +00:00
parent 7d96358dbf
commit 31d20f1882
16 changed files with 360 additions and 0 deletions

View file

@ -0,0 +1,255 @@
#include "w32csr.h"
typedef struct APPSWITCH_ITEM
{
HWND hwndDlg;
DWORD zPos;
HICON hIcon;
BOOL bFocus;
struct APPSWITCH_ITEM * Next;
WCHAR szText[1];
}APPSWITCH_ITEM, *PAPPSWITCH_ITEM;
static PAPPSWITCH_ITEM pRoot = NULL;
static DWORD NumOfWindows = 0;
static HWND hAppWindowDlg = NULL;
static HHOOK hhk = NULL;
BOOL
CALLBACK
EnumWindowEnumProc(
HWND hwnd,
LPARAM lParam
)
{
PAPPSWITCH_ITEM pItem;
UINT Length;
HICON hIcon;
PAPPSWITCH_ITEM pCurItem;
DWORD dwPid;
HANDLE hProcess;
WCHAR szFileName[MAX_PATH] = {0};
/* check if the enumerated window is visible */
if (!IsWindowVisible(hwnd))
return TRUE;
/* get window icon */
hIcon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
if (!hIcon)
{
GetWindowThreadProcessId(hwnd, &dwPid);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, dwPid);
if (hProcess)
{
if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH))
{
szFileName[MAX_PATH-1] = L'\0';
ExtractIconExW(szFileName, 0, &hIcon, NULL, 1);
}
}
}
else
{
/* icons from WM_GETICON need to be copied */
hIcon = CopyIcon(hIcon);
}
/* get the text length */
Length = SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0);
/* allocate item structure for it */
pItem = (PAPPSWITCH_ITEM)HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(APPSWITCH_ITEM) + Length * sizeof(WCHAR));
if (!pItem)
return TRUE;
if (Length)
{
/* retrieve the window text when available */
SendMessageW(hwnd, WM_GETTEXT, Length+1, (LPARAM)pItem->szText);
}
/* copy the window icon */
pItem->hIcon = hIcon;
/* store window handle */
pItem->hwndDlg = hwnd;
/* is the window the active window */
if (GetActiveWindow() == hwnd)
pItem->bFocus = TRUE;
if (!pRoot)
{
/* first item */
pRoot = pItem;
return TRUE;
}
/* enumerate the last item */
pCurItem = pRoot;
while(pCurItem->Next)
pCurItem = pCurItem->Next;
/* insert it into the list */
pCurItem->Next = pItem;
NumOfWindows++;
return TRUE;
}
VOID
EnumerateAppWindows(HDESK hDesk, HWND hwndDlg)
{
/* initialize defaults */
pRoot = NULL;
NumOfWindows = 0;
hAppWindowDlg = hwndDlg;
/* enumerate all windows */
EnumDesktopWindows(hDesk, EnumWindowEnumProc, (LPARAM)NULL);
if (NumOfWindows > 7)
{
/* FIXME resize window */
}
}
VOID
MarkNextEntryAsActive()
{
PAPPSWITCH_ITEM pItem;
pItem = pRoot;
if (!pRoot)
return;
while(pItem)
{
if (pItem->bFocus)
{
pItem->bFocus = FALSE;
if (pItem->Next)
pItem->Next->bFocus = TRUE;
else
pRoot->bFocus = TRUE;
}
pItem = pItem->Next;
}
InvalidateRgn(hAppWindowDlg, NULL, TRUE);
}
LRESULT
CALLBACK
KeyboardHookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
PKBDLLHOOKSTRUCT hk = (PKBDLLHOOKSTRUCT) lParam;
if (wParam == WM_SYSKEYUP)
{
/* is tab key pressed */
if (hk->vkCode == VK_TAB)
{
if (hAppWindowDlg == NULL)
{
/* FIXME
* launch window
*/
DPRINT1("launch alt-tab window\n");
}
else
{
MarkNextEntryAsActive();
}
}
}
return CallNextHookEx(hhk, nCode, wParam, lParam);
}
VOID
PaintAppWindows(HWND hwndDlg, HDC hDc)
{
DWORD dwIndex, X, Y;
PAPPSWITCH_ITEM pCurItem;
RECT Rect;
DWORD XSize, YSize, XMax;
HBRUSH hBrush;
X = 10;
Y = 10;
XSize = GetSystemMetrics(SM_CXICON);
YSize = GetSystemMetrics(SM_CYICON);
XMax = (XSize+(XSize/2)) * 7 + X;
pCurItem = pRoot;
for (dwIndex = 0; dwIndex < NumOfWindows; dwIndex++)
{
if (X >= XMax)
{
X = 10;
Y += YSize + (YSize/2);
}
if (pCurItem->bFocus)
{
hBrush = CreateSolidBrush(RGB(30, 30, 255));
SetRect(&Rect, X-5, Y-5, X + XSize + 5, Y + YSize + 5);
FillRect(hDc, &Rect, hBrush);
DeleteObject((HGDIOBJ)hBrush);
SendDlgItemMessageW(hwndDlg, IDC_STATIC_CUR_APP, WM_SETTEXT, 0, (LPARAM)pCurItem->szText);
}
DrawIcon(hDc, X, Y, pCurItem->hIcon);
pCurItem = pCurItem->Next;
X += XSize +(XSize/2);
}
}
VOID
DestroyAppWindows()
{
PAPPSWITCH_ITEM pCurItem, pNextItem;
pCurItem = pRoot;
while(pCurItem)
{
pNextItem = pCurItem->Next;
DestroyIcon(pCurItem->hIcon);
HeapFree(Win32CsrApiHeap, 0, pCurItem);
pCurItem = pNextItem;
}
pRoot = NULL;
hAppWindowDlg = NULL;
NumOfWindows = 0;
}
INT_PTR
CALLBACK
SwitchWindowDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT Paint;
HDESK hInput;
switch (message)
{
case WM_INITDIALOG:
hInput = OpenInputDesktop(0,0, GENERIC_ALL);
if (hInput)
{
EnumerateAppWindows(hInput, hwndDlg);
CloseDesktop(hInput);
}
return TRUE;
case WM_PAINT:
BeginPaint(hwndDlg, &Paint);
PaintAppWindows(hwndDlg, Paint.hdc);
EndPaint(hwndDlg, &Paint);
break;
case WM_DESTROY:
DestroyAppWindows();
break;
}
return FALSE;
}
VOID
STDCALL
InitializeAppSwitchHook()
{
hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
DPRINT("InitializeAppSwitchHook hhk %p\n", hhk);
}

View file

@ -16,6 +16,7 @@
/* Not defined in any header file */
extern VOID STDCALL PrivateCsrssManualGuiCheck(LONG Check);
extern VOID STDCALL PrivateCsrssInitialized();
extern VOID STDCALL InitializeAppSwitchHook();
/* GLOBALS *******************************************************************/
@ -95,6 +96,7 @@ DllMain(HANDLE hDll,
if (DLL_PROCESS_ATTACH == dwReason)
{
Win32CsrDllHandle = hDll;
InitializeAppSwitchHook();
}
return TRUE;

View file

@ -33,6 +33,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Îáðàáîòêà"

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Bearbeiten"

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Åðåîåñãáóßá"

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Edit"

View file

@ -32,6 +32,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Editar"

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
/* Fixme : Translation could be really improved, with context
La traduction pourrait réellement être améliorée grâce au contexte */
STRINGTABLE

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Edit"

View file

@ -36,6 +36,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Modifica"

View file

@ -32,6 +32,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Edytuj"

View file

@ -27,6 +27,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "如戾龛螯"

View file

@ -31,6 +31,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Upravi<76>"

View file

@ -35,6 +35,14 @@ BEGIN
IDC_STATIC,7,53,178,26
END
IDD_SWITCH_APP DIALOGEX 90, 90, 265, 170
STYLE DS_SYSMODAL | DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_TOPMOST | WS_EX_WINDOWEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "",IDC_STATIC_CUR_APP,39,139,204,16,SS_SUNKEN,WS_EX_STATICEDGE
END
STRINGTABLE
BEGIN
IDS_EDIT "Ðåäàãóâàòè"

View file

@ -10,10 +10,14 @@
#define WIN32CSR_RESOURCE_H_INCLUDED
#define IDD_END_NOW 10
#define IDD_NOT_RESPONDING 11
#define IDD_SWITCH_APP 12
#define IDC_STATIC 100
#define IDC_PROGRESS 101
#define IDC_END_NOW 102
#define IDC_STATIC_CUR_APP 103
#define ID_SYSTEM_EDIT_MARK 1001
#define ID_SYSTEM_EDIT_COPY 1002

View file

@ -16,6 +16,8 @@
<library>advapi32</library>
<library>psapi</library>
<library>msvcrt</library>
<library>psapi</library>
<library>shell32</library>
<pch>w32csr.h</pch>
<file>alias.c</file>
<file>conio.c</file>
@ -24,5 +26,6 @@
<file>exitros.c</file>
<file>guiconsole.c</file>
<file>tuiconsole.c</file>
<file>appswitch.c</file>
<file>win32csr.rc</file>
</module>