ReactOS 0.4.15-dev-8116-gf69e256
appswitch.c File Reference
#include <user32.h>
Include dependency graph for appswitch.c:

Go to the source code of this file.

Macros

#define DIALOG_MARGIN   8
 
#define CX_ICON   32
 
#define CY_ICON   32
 
#define ICON_MARGIN   4
 
#define CX_ITEM   (CX_ICON + 2 * ICON_MARGIN)
 
#define CY_ITEM   (CY_ICON + 2 * ICON_MARGIN)
 
#define ITEM_MARGIN   4
 
#define CX_ITEM_SPACE   (CX_ITEM + 2 * ITEM_MARGIN)
 
#define CY_ITEM_SPACE   (CY_ITEM + 2 * ITEM_MARGIN)
 
#define CY_TEXT_MARGIN   4
 
#define MAX_WINDOWS   120
 
#define ICON_TIMEOUT   100
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (user32)
 
BOOL LoadCoolSwitchSettings (void)
 
void ResizeAndCenter (HWND hwnd, int width, int height)
 
void CompleteSwitch (BOOL doSwitch)
 
BOOL CALLBACK EnumerateCallback (HWND window, LPARAM lParam)
 
static HWND GetNiceRootOwner (HWND hwnd)
 
BOOL IsAltTabWindow (HWND hwnd)
 
static BOOL CALLBACK EnumWindowsProc (HWND hwnd, LPARAM lParam)
 
void ProcessMouseMessage (UINT message, LPARAM lParam)
 
void OnPaint (HWND hWnd)
 
DWORD CreateSwitcherWindow (HINSTANCE hInstance)
 
DWORD GetDialogFont (VOID)
 
void PrepareWindow (VOID)
 
BOOL ProcessHotKey (VOID)
 
void RotateTasks (BOOL bShift)
 
static void MoveLeft (void)
 
static void MoveRight (void)
 
static void MoveUp (void)
 
static void MoveDown (void)
 
VOID DestroyAppWindows (VOID)
 
LRESULT WINAPI DoAppSwitch (WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI SwitchWndProc_common (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
 
LRESULT WINAPI SwitchWndProcA (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
LRESULT WINAPI SwitchWndProcW (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 

Variables

HWND switchdialog = NULL
 
HFONT dialogFont
 
int selectedWindow = 0
 
BOOL isOpen = FALSE
 
int fontHeight =0
 
WCHAR windowText [1024]
 
HWND windowList [MAX_WINDOWS]
 
HICON iconList [MAX_WINDOWS]
 
int windowCount = 0
 
int cxBorder
 
int cyBorder
 
int nItems
 
int nCols
 
int nRows
 
int itemsW
 
int itemsH
 
int totalW
 
int totalH
 
int xOffset
 
int yOffset
 
POINT ptStart
 
int nShift = 0
 
BOOL Esc = FALSE
 
BOOL CoolSwitch = TRUE
 
int CoolSwitchRows = 3
 
int CoolSwitchColumns = 7
 
const DWORD Style = WS_POPUP | WS_BORDER | WS_DISABLED
 
const DWORD ExStyle = WS_EX_TOPMOST | WS_EX_DLGMODALFRAME | WS_EX_TOOLWINDOW
 

Macro Definition Documentation

◆ CX_ICON

#define CX_ICON   32

Definition at line 24 of file appswitch.c.

◆ CX_ITEM

#define CX_ITEM   (CX_ICON + 2 * ICON_MARGIN)

Definition at line 28 of file appswitch.c.

◆ CX_ITEM_SPACE

#define CX_ITEM_SPACE   (CX_ITEM + 2 * ITEM_MARGIN)

Definition at line 32 of file appswitch.c.

◆ CY_ICON

#define CY_ICON   32

Definition at line 25 of file appswitch.c.

◆ CY_ITEM

#define CY_ITEM   (CY_ICON + 2 * ICON_MARGIN)

Definition at line 29 of file appswitch.c.

◆ CY_ITEM_SPACE

#define CY_ITEM_SPACE   (CY_ITEM + 2 * ITEM_MARGIN)

Definition at line 33 of file appswitch.c.

◆ CY_TEXT_MARGIN

#define CY_TEXT_MARGIN   4

Definition at line 35 of file appswitch.c.

◆ DIALOG_MARGIN

#define DIALOG_MARGIN   8

Definition at line 22 of file appswitch.c.

◆ ICON_MARGIN

#define ICON_MARGIN   4

Definition at line 26 of file appswitch.c.

◆ ICON_TIMEOUT

#define ICON_TIMEOUT   100

◆ ITEM_MARGIN

#define ITEM_MARGIN   4

Definition at line 30 of file appswitch.c.

◆ MAX_WINDOWS

#define MAX_WINDOWS   120

Definition at line 39 of file appswitch.c.

Function Documentation

◆ CompleteSwitch()

void CompleteSwitch ( BOOL  doSwitch)

Definition at line 113 of file appswitch.c.

114{
115 if (!isOpen)
116 return;
117
118 isOpen = FALSE;
119
120 TRACE("[ATbot] CompleteSwitch Hiding Window.\n");
122
123 if(doSwitch)
124 {
126 return;
127
128 // FIXME: workaround because reactos fails to activate the previous window correctly.
129 //if(selectedWindow != 0)
130 {
132
134
135 TRACE("[ATbot] CompleteSwitch Switching to 0x%08x (%ls)\n", hwnd, windowText);
136
138 }
139 }
140
141 windowCount = 0;
142}
WCHAR windowText[1024]
Definition: appswitch.c:49
HWND windowList[MAX_WINDOWS]
Definition: appswitch.c:51
int windowCount
Definition: appswitch.c:53
BOOL isOpen
Definition: appswitch.c:45
HWND switchdialog
Definition: appswitch.c:42
int selectedWindow
Definition: appswitch.c:44
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
VOID WINAPI SwitchToThisWindow(HWND hwnd, BOOL fAltTab)
Definition: window.c:82
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1412
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define SW_HIDE
Definition: winuser.h:768
BOOL WINAPI ShowWindowAsync(_In_ HWND, _In_ int)

Referenced by DoAppSwitch(), ProcessMouseMessage(), and SwitchWndProc_common().

◆ CreateSwitcherWindow()

DWORD CreateSwitcherWindow ( HINSTANCE  hInstance)

Definition at line 397 of file appswitch.c.

398{
400 WC_SWITCH,
401 L"",
405 400, 150,
406 NULL, NULL,
407 hInstance, NULL);
408 if (!switchdialog)
409 {
410 TRACE("[ATbot] Task Switcher Window failed to create.\n");
411 return 0;
412 }
413
414 isOpen = FALSE;
415 return 1;
416}
HINSTANCE hInstance
Definition: charmap.c:19
#define NULL
Definition: types.h:112
#define L(x)
Definition: ntvdm.h:50
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WS_DISABLED
Definition: pedump.c:621
#define WC_SWITCH
Definition: undocuser.h:12
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define CW_USEDEFAULT
Definition: winuser.h:225

Referenced by ProcessHotKey().

◆ DestroyAppWindows()

VOID DestroyAppWindows ( VOID  )

Definition at line 572 of file appswitch.c.

573{
574 // for every item of the icon list:
575 INT i;
576 for (i = 0; i < windowCount; ++i)
577 {
578 // destroy the icon
580 iconList[i] = NULL;
581 }
582}
HICON iconList[MAX_WINDOWS]
Definition: appswitch.c:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int32_t INT
Definition: typedefs.h:58
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2084

Referenced by DoAppSwitch(), and SwitchWndProc_common().

◆ DoAppSwitch()

LRESULT WINAPI DoAppSwitch ( WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 584 of file appswitch.c.

585{
586 HWND hwndActive;
587 MSG msg;
588
589 // FIXME: Is loading timing OK?
591
592 if (!CoolSwitch)
593 return 0;
594
595 // Already in the loop.
596 if (switchdialog || Esc) return 0;
597
598 if (lParam == VK_ESCAPE)
599 {
600 Esc = TRUE;
601
602 windowCount = 0;
604
605 if (windowCount < 2)
606 return 0;
607
609
610 hwndActive = GetActiveWindow();
611
612 if (hwndActive == NULL)
613 {
614 Esc = FALSE;
615 return 0;
616 }
617 }
618
619 // Capture current active window.
620 hwndActive = GetActiveWindow();
621 if (hwndActive)
622 SetCapture(hwndActive);
623
624 switch (lParam)
625 {
626 case VK_TAB:
627 if (!GetDialogFont() || !ProcessHotKey())
628 goto Exit;
629 break;
630
631 case VK_ESCAPE:
632 break;
633
634 default:
635 goto Exit;
636 }
637
638 if (!hwndActive)
639 goto Exit;
640
641 // Main message loop:
642 while (1)
643 {
644 for (;;)
645 {
646 if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ))
647 {
648 if (!CallMsgFilterW( &msg, MSGF_NEXTWINDOW )) break;
649 /* remove the message from the queue */
650 PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
651 }
652 else
653 WaitMessage();
654 }
655
656 switch (msg.message)
657 {
658 case WM_KEYUP:
659 {
660 PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
661 if (msg.wParam == VK_MENU)
662 {
664 }
665 else if (msg.wParam == VK_RETURN)
666 {
668 }
669 else if (msg.wParam == VK_ESCAPE)
670 {
671 TRACE("DoAppSwitch VK_ESCAPE 2\n");
673 }
674 goto Exit; //break;
675 }
676
677 case WM_SYSKEYDOWN:
678 {
679 PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
680 if (HIWORD(msg.lParam) & KF_ALTDOWN)
681 {
682 if ( msg.wParam == VK_TAB )
683 {
684 if (Esc) break;
685 if (GetKeyState(VK_SHIFT) < 0)
686 {
687 MoveLeft();
688 }
689 else
690 {
691 MoveRight();
692 }
693 }
694 else if ( msg.wParam == VK_ESCAPE )
695 {
696 if (!Esc) break;
698 }
699 else if ( msg.wParam == VK_LEFT )
700 {
701 MoveLeft();
702 }
703 else if ( msg.wParam == VK_RIGHT )
704 {
705 MoveRight();
706 }
707 else if ( msg.wParam == VK_UP )
708 {
709 MoveUp();
710 }
711 else if ( msg.wParam == VK_DOWN )
712 {
713 MoveDown();
714 }
715 }
716 break;
717 }
718
719 case WM_LBUTTONUP:
720 PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
721 ProcessMouseMessage(msg.message, msg.lParam);
722 goto Exit;
723
724 default:
725 if (PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ))
726 {
729 }
730 break;
731 }
732 }
733Exit:
736 if (Esc) DestroyAppWindows();
738 selectedWindow = 0;
739 windowCount = 0;
740 Esc = FALSE;
741 return 0;
742}
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
Definition: appswitch.c:267
static void MoveLeft(void)
Definition: appswitch.c:527
static void MoveUp(void)
Definition: appswitch.c:541
void ProcessMouseMessage(UINT message, LPARAM lParam)
Definition: appswitch.c:277
static void MoveRight(void)
Definition: appswitch.c:535
void CompleteSwitch(BOOL doSwitch)
Definition: appswitch.c:113
DWORD GetDialogFont(VOID)
Definition: appswitch.c:418
void RotateTasks(BOOL bShift)
Definition: appswitch.c:490
BOOL ProcessHotKey(VOID)
Definition: appswitch.c:455
BOOL CoolSwitch
Definition: appswitch.c:66
VOID DestroyAppWindows(VOID)
Definition: appswitch.c:572
BOOL LoadCoolSwitchSettings(void)
Definition: appswitch.c:74
static void MoveDown(void)
Definition: appswitch.c:556
BOOL Esc
Definition: appswitch.c:64
#define msg(x)
Definition: auth_time.c:54
LPARAM lParam
Definition: combotst.c:139
static void Exit(void)
Definition: sock.c:1330
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define HIWORD(l)
Definition: typedefs.h:247
HWND WINAPI SetCapture(_In_ HWND hWnd)
HWND WINAPI GetActiveWindow(void)
Definition: winpos.c:138
#define VK_TAB
Definition: winuser.h:2199
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define WM_KEYUP
Definition: winuser.h:1716
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890
#define KF_ALTDOWN
Definition: winuser.h:2449
#define VK_UP
Definition: winuser.h:2225
BOOL WINAPI CallMsgFilterW(_In_ LPMSG, _In_ INT)
#define VK_RETURN
Definition: winuser.h:2201
BOOL WINAPI EnumWindows(_In_ WNDENUMPROC lpEnumFunc, _In_ LPARAM lParam)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define MSGF_NEXTWINDOW
Definition: winuser.h:1179
#define PM_REMOVE
Definition: winuser.h:1196
BOOL WINAPI WaitMessage(void)
Definition: ntwrapper.h:350
#define WM_LBUTTONUP
Definition: winuser.h:1777
#define VK_LEFT
Definition: winuser.h:2224
#define VK_RIGHT
Definition: winuser.h:2226
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define VK_DOWN
Definition: winuser.h:2227
#define VK_SHIFT
Definition: winuser.h:2202
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define VK_ESCAPE
Definition: winuser.h:2214
BOOL WINAPI DestroyWindow(_In_ HWND)
#define PM_NOREMOVE
Definition: winuser.h:1195
#define WM_SYSKEYDOWN
Definition: winuser.h:1719
SHORT WINAPI GetKeyState(_In_ int)
#define VK_MENU
Definition: winuser.h:2204

Referenced by DefWndHandleSysCommand().

◆ EnumerateCallback()

BOOL CALLBACK EnumerateCallback ( HWND  window,
LPARAM  lParam 
)

Definition at line 144 of file appswitch.c.

145{
146 HICON hIcon = NULL;
147 LRESULT bAlive;
148
150
151 // First try to get the big icon assigned to the window
152#define ICON_TIMEOUT 100 // in milliseconds
155 if (!hIcon)
156 {
157 // If no icon is assigned, try to get the icon assigned to the windows' class
159 if (!hIcon)
160 {
161 // If we still don't have an icon, see if we can do with the small icon,
162 // or a default application icon
163 if (bAlive)
164 {
165 SendMessageTimeoutW(window, WM_GETICON, ICON_SMALL2, 0,
167 (PDWORD_PTR)&hIcon);
168 }
169#undef ICON_TIMEOUT
170 if (!hIcon)
171 {
172 // using windows logo icon as default
173 hIcon = gpsi->hIconWindows;
174 if (!hIcon)
175 {
176 //if all attempts to get icon fails go to the next window
177 return TRUE;
178 }
179 }
180 }
181 }
182
185 windowCount++;
186
187 // If we got to the max number of windows, we won't be able to add any more
188 return (windowCount < MAX_WINDOWS);
189}
#define ICON_TIMEOUT
#define MAX_WINDOWS
Definition: appswitch.c:39
ULONG_PTR * PDWORD_PTR
Definition: basetsd.h:182
PSERVERINFO gpsi
Definition: imm.c:18
static HICON
Definition: imagelist.c:84
static IHTMLWindow2 * window
Definition: events.c:77
HICON hIcon
Definition: msconfig.c:44
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define ICON_BIG
Definition: tnclass.cpp:51
LONG_PTR LRESULT
Definition: windef.h:209
#define SMTO_BLOCK
Definition: winuser.h:1224
HICON WINAPI CopyIcon(_In_ HICON)
Definition: cursoricon.c:2042
LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR)
#define GetClassLongPtrW
Definition: winuser.h:4564
#define SMTO_ABORTIFHUNG
Definition: winuser.h:1223
#define GCL_HICON
Definition: winuser.h:666

Referenced by EnumWindowsProc().

◆ EnumWindowsProc()

static BOOL CALLBACK EnumWindowsProc ( HWND  hwnd,
LPARAM  lParam 
)
static

Definition at line 267 of file appswitch.c.

268{
269 if (IsAltTabWindow(hwnd))
270 {
272 return FALSE;
273 }
274 return TRUE;
275}
BOOL CALLBACK EnumerateCallback(HWND window, LPARAM lParam)
Definition: appswitch.c:144
BOOL IsAltTabWindow(HWND hwnd)
Definition: appswitch.c:217

Referenced by DoAppSwitch(), and ProcessHotKey().

◆ GetDialogFont()

DWORD GetDialogFont ( VOID  )

Definition at line 418 of file appswitch.c.

419{
420 HDC tDC;
422
424
425 tDC = GetDC(0);
426 GetTextMetrics(tDC, &tm);
427 fontHeight = tm.tmHeight;
428 ReleaseDC(0, tDC);
429
430 return 1;
431}
int fontHeight
Definition: appswitch.c:47
HFONT dialogFont
Definition: appswitch.c:43
static HDC
Definition: imagelist.c:92
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
Definition: time.h:68
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
#define GetTextMetrics
Definition: wingdi.h:4474
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
HDC WINAPI GetDC(_In_opt_ HWND)

Referenced by DoAppSwitch().

◆ GetNiceRootOwner()

static HWND GetNiceRootOwner ( HWND  hwnd)
static

Definition at line 191 of file appswitch.c.

192{
193 HWND hwndOwner;
194 DWORD ExStyle, OwnerExStyle;
195
196 for (;;)
197 {
198 // A window with WS_EX_APPWINDOW is treated as if it has no owner
201 break;
202
203 // Is the owner visible?
204 // An window with WS_EX_TOOLWINDOW is treated as if it weren't visible
205 hwndOwner = GetWindow(hwnd, GW_OWNER);
206 OwnerExStyle = GetWindowLong(hwndOwner, GWL_EXSTYLE);
207 if (!IsWindowVisible(hwndOwner) || (OwnerExStyle & WS_EX_TOOLWINDOW))
208 break;
209
210 hwnd = hwndOwner;
211 }
212
213 return hwnd;
214}
const DWORD ExStyle
Definition: appswitch.c:72
unsigned long DWORD
Definition: ntddk_ex.h:95
#define GW_OWNER
Definition: winuser.h:766
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define GetWindowLong
Definition: winuser.h:5796
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
BOOL WINAPI IsWindowVisible(_In_ HWND)
#define GWL_EXSTYLE
Definition: winuser.h:851

Referenced by IsAltTabWindow().

◆ IsAltTabWindow()

BOOL IsAltTabWindow ( HWND  hwnd)

Definition at line 217 of file appswitch.c.

218{
220 RECT rc;
221 HWND hwndTry, hwndWalk;
222 WCHAR szClass[64];
223
224 // must be visible
225 if (!IsWindowVisible(hwnd))
226 return FALSE;
227
228 // must not be WS_EX_TOOLWINDOW nor WS_EX_NOACTIVATE
231 return FALSE;
232
233 // must be not empty rect
234 GetWindowRect(hwnd, &rc);
235 if (IsRectEmpty(&rc))
236 return FALSE;
237
238 // check special windows
239 if (!GetClassNameW(hwnd, szClass, _countof(szClass)) ||
240 wcscmp(szClass, L"Shell_TrayWnd") == 0 ||
241 wcscmp(szClass, L"Progman") == 0)
242 {
243 return TRUE;
244 }
245
246 // get 'nice' root owner
247 hwndWalk = GetNiceRootOwner(hwnd);
248
249 // walk back from hwndWalk toward hwnd
250 for (;;)
251 {
252 hwndTry = GetLastActivePopup(hwndWalk);
253 if (hwndTry == hwndWalk)
254 break;
255
257 if (IsWindowVisible(hwndTry) && !(ExStyle & WS_EX_TOOLWINDOW))
258 break;
259
260 hwndWalk = hwndTry;
261 }
262
263 return hwnd == hwndTry; // Reached?
264}
static HWND GetNiceRootOwner(HWND hwnd)
Definition: appswitch.c:191
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
HWND WINAPI GetLastActivePopup(_In_ HWND)
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
BOOL WINAPI IsRectEmpty(_In_ LPCRECT)
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by EnumWindowsProc().

◆ LoadCoolSwitchSettings()

BOOL LoadCoolSwitchSettings ( void  )

Definition at line 74 of file appswitch.c.

75{
79
80 // FIXME: load the settings from registry
81
82 TRACE("CoolSwitch: %d\n", CoolSwitch);
83 TRACE("CoolSwitchRows: %d\n", CoolSwitchRows);
84 TRACE("CoolSwitchColumns: %d\n", CoolSwitchColumns);
85
86 return TRUE;
87}
int CoolSwitchColumns
Definition: appswitch.c:68
int CoolSwitchRows
Definition: appswitch.c:67

Referenced by DoAppSwitch().

◆ MoveDown()

static void MoveDown ( void  )
static

Definition at line 556 of file appswitch.c.

557{
558 INT iRow = selectedWindow / nCols;
559 INT iCol = selectedWindow % nCols;
560
561 ++iRow;
562 if (iRow >= nRows)
563 iRow = 0;
564
565 selectedWindow = iRow * nCols + iCol;
569}
int nRows
Definition: appswitch.c:56
int nCols
Definition: appswitch.c:56
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)

Referenced by DoAppSwitch().

◆ MoveLeft()

static void MoveLeft ( void  )
static

Definition at line 527 of file appswitch.c.

Referenced by DoAppSwitch().

◆ MoveRight()

static void MoveRight ( void  )
static

Definition at line 535 of file appswitch.c.

Referenced by DoAppSwitch().

◆ MoveUp()

static void MoveUp ( void  )
static

Definition at line 541 of file appswitch.c.

542{
543 INT iRow = selectedWindow / nCols;
544 INT iCol = selectedWindow % nCols;
545
546 --iRow;
547 if (iRow < 0)
548 iRow = nRows - 1;
549
550 selectedWindow = iRow * nCols + iCol;
554}

Referenced by DoAppSwitch().

◆ OnPaint()

void OnPaint ( HWND  hWnd)

Definition at line 304 of file appswitch.c.

305{
306 HDC dialogDC;
307 PAINTSTRUCT paint;
308 RECT cRC, textRC;
309 int i, xPos, yPos, CharCount;
310 HFONT dcFont;
311 HICON hIcon;
312 HPEN hPen;
314
315 // check
316 if (nCols == 0 || nItems == 0)
317 return;
318
319 // begin painting
320 dialogDC = BeginPaint(hWnd, &paint);
321 if (dialogDC == NULL)
322 return;
323
324 // fill the client area
325 GetClientRect(hWnd, &cRC);
326 FillRect(dialogDC, &cRC, (HBRUSH)(COLOR_3DFACE + 1));
327
328 // if the selection index exceeded the display items, then
329 // do display item shifting
330 if (selectedWindow >= nItems)
332 else
333 nShift = 0;
334
335 for (i = 0; i < nItems; ++i)
336 {
337 // get the icon to display
338 hIcon = iconList[i + nShift];
339
340 // calculate the position where we start drawing
343
344 // centering
346 {
347 xPos += (itemsW - nItems * CX_ITEM_SPACE) / 2;
348 }
349
350 // if this position is selected,
351 if (selectedWindow == i + nShift)
352 {
353 // create a solid pen
355 hPen = CreatePen(PS_SOLID, 1, Color);
356
357 // draw a rectangle with using the pen
358 SelectObject(dialogDC, hPen);
360 Rectangle(dialogDC, xPos, yPos, xPos + CX_ITEM, yPos + CY_ITEM);
361 Rectangle(dialogDC, xPos + 1, yPos + 1,
362 xPos + CX_ITEM - 1, yPos + CY_ITEM - 1);
363
364 // delete the pen
365 DeleteObject(hPen);
366 }
367
368 // draw icon
369 DrawIconEx(dialogDC, xPos + ICON_MARGIN, yPos + ICON_MARGIN,
371 }
372
373 // set the text rectangle
376
377 // draw the sunken button around text
378 DrawFrameControl(dialogDC, &textRC, DFC_BUTTON,
380
381 // get text
384
385 // draw text
386 dcFont = SelectObject(dialogDC, dialogFont);
388 SetBkMode(dialogDC, TRANSPARENT);
389 DrawTextW(dialogDC, windowText, CharCount, &textRC,
391 SelectObject(dialogDC, dcFont);
392
393 // end painting
394 EndPaint(hWnd, &paint);
395}
int nItems
Definition: appswitch.c:56
#define ITEM_MARGIN
Definition: appswitch.c:30
#define CX_ITEM
Definition: appswitch.c:28
#define CX_ITEM_SPACE
Definition: appswitch.c:32
#define DIALOG_MARGIN
Definition: appswitch.c:22
#define CY_ITEM_SPACE
Definition: appswitch.c:33
int totalH
Definition: appswitch.c:58
int itemsH
Definition: appswitch.c:57
int nShift
Definition: appswitch.c:62
#define ICON_MARGIN
Definition: appswitch.c:26
int totalW
Definition: appswitch.c:58
#define CY_ITEM
Definition: appswitch.c:29
#define CX_ICON
Definition: appswitch.c:24
#define CY_ICON
Definition: appswitch.c:25
int itemsW
Definition: appswitch.c:57
HWND hWnd
Definition: settings.c:17
pKey DeleteObject()
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
DWORD COLORREF
Definition: windef.h:300
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
#define DI_NORMAL
Definition: wingdi.h:72
#define TRANSPARENT
Definition: wingdi.h:950
#define NULL_BRUSH
Definition: wingdi.h:901
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
#define PS_SOLID
Definition: wingdi.h:586
DWORD WINAPI GetSysColor(_In_ int)
#define COLOR_BTNTEXT
Definition: winuser.h:933
#define DT_CENTER
Definition: winuser.h:527
#define DT_END_ELLIPSIS
Definition: winuser.h:529
#define DFCS_BUTTONPUSH
Definition: winuser.h:501
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
#define COLOR_HIGHLIGHT
Definition: winuser.h:926
#define DT_SINGLELINE
Definition: winuser.h:540
#define DFC_BUTTON
Definition: winuser.h:476
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:2059
#define DT_VCENTER
Definition: winuser.h:543
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define DFCS_PUSHED
Definition: winuser.h:503
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define COLOR_3DFACE
Definition: winuser.h:929

Referenced by SwitchWndProc_common().

◆ PrepareWindow()

void PrepareWindow ( VOID  )

Definition at line 433 of file appswitch.c.

434{
436
439 if (nRows > CoolSwitchRows)
440 {
442 nItems = nRows * nCols;
443 }
444
447
451
453}
void ResizeAndCenter(HWND hwnd, int width, int height)
Definition: appswitch.c:89
#define CY_TEXT_MARGIN
Definition: appswitch.c:35

Referenced by SwitchWndProc_common().

◆ ProcessHotKey()

BOOL ProcessHotKey ( VOID  )

Definition at line 455 of file appswitch.c.

456{
457 if (!isOpen)
458 {
459 windowCount = 0;
461
462 if (windowCount == 0)
463 return FALSE;
464
465 if (windowCount == 1)
466 {
468 return FALSE;
469 }
470
472 return FALSE;
473
474 selectedWindow = 1;
475
476 TRACE("[ATbot] HotKey Received. Opening window.\n");
479 isOpen = TRUE;
480 }
481 else
482 {
483 TRACE("[ATbot] HotKey Received Rotating.\n");
486 }
487 return TRUE;
488}
DWORD CreateSwitcherWindow(HINSTANCE hInstance)
Definition: appswitch.c:397
HINSTANCE User32Instance
Definition: dllmain.c:27
#define SW_SHOWNORMAL
Definition: winuser.h:770

Referenced by DoAppSwitch().

◆ ProcessMouseMessage()

void ProcessMouseMessage ( UINT  message,
LPARAM  lParam 
)

Definition at line 277 of file appswitch.c.

278{
279 int xPos = LOWORD(lParam);
280 int yPos = HIWORD(lParam);
281
282 int xIndex = (xPos - DIALOG_MARGIN) / CX_ITEM_SPACE;
283 int yIndex = (yPos - DIALOG_MARGIN) / CY_ITEM_SPACE;
284
285 if (xIndex < 0 || nCols <= xIndex ||
286 yIndex < 0 || nRows <= yIndex)
287 {
288 return;
289 }
290
291 selectedWindow = (yIndex*nCols) + xIndex;
292 if (message == WM_MOUSEMOVE)
293 {
295 //RedrawWindow(switchdialog, NULL, NULL, 0);
296 }
297 else
298 {
299 selectedWindow = (yIndex*nCols) + xIndex;
301 }
302}
#define LOWORD(l)
Definition: pedump.c:82
Definition: tftpd.h:60
#define WM_MOUSEMOVE
Definition: winuser.h:1775

Referenced by DoAppSwitch(), and SwitchWndProc_common().

◆ ResizeAndCenter()

void ResizeAndCenter ( HWND  hwnd,
int  width,
int  height 
)

Definition at line 89 of file appswitch.c.

90{
91 int x, y;
92 RECT Rect;
93
94 int screenwidth = GetSystemMetrics(SM_CXSCREEN);
95 int screenheight = GetSystemMetrics(SM_CYSCREEN);
96
97 x = (screenwidth - width) / 2;
98 y = (screenheight - height) / 2;
99
100 SetRect(&Rect, x, y, x + width, y + height);
102
103 x = Rect.left;
104 y = Rect.top;
105 width = Rect.right - Rect.left;
106 height = Rect.bottom - Rect.top;
108
109 ptStart.x = x;
110 ptStart.y = y;
111}
const DWORD Style
Definition: appswitch.c:71
POINT ptStart
Definition: appswitch.c:60
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define SM_CYSCREEN
Definition: winuser.h:960
BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD)
#define SM_CXSCREEN
Definition: winuser.h:959
int WINAPI GetSystemMetrics(_In_ int)
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)

Referenced by PrepareWindow().

◆ RotateTasks()

void RotateTasks ( BOOL  bShift)

Definition at line 490 of file appswitch.c.

491{
492 HWND hwndFirst, hwndLast;
493 DWORD Size;
494
495 if (windowCount < 2 || !Esc)
496 return;
497
498 hwndFirst = windowList[0];
499 hwndLast = windowList[windowCount - 1];
500
501 if (bShift)
502 {
503 SetWindowPos(hwndLast, HWND_TOP, 0, 0, 0, 0,
506
507 SwitchToThisWindow(hwndLast, TRUE);
508
509 Size = (windowCount - 1) * sizeof(HWND);
511 windowList[0] = hwndLast;
512 }
513 else
514 {
515 SetWindowPos(hwndFirst, hwndLast, 0, 0, 0, 0,
518
520
521 Size = (windowCount - 1) * sizeof(HWND);
523 windowList[windowCount - 1] = hwndFirst;
524 }
525}
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define MoveMemory
Definition: winbase.h:1709
#define SWP_NOACTIVATE
Definition: winuser.h:1242
#define SWP_NOREPOSITION
Definition: winuser.h:1250
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOMOVE
Definition: winuser.h:1244
#define SWP_NOSIZE
Definition: winuser.h:1245
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1253
#define HWND_TOP
Definition: winuser.h:1207
#define SWP_NOOWNERZORDER
Definition: winuser.h:1249

Referenced by DoAppSwitch().

◆ SwitchWndProc_common()

LRESULT WINAPI SwitchWndProc_common ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam,
BOOL  unicode 
)

Definition at line 747 of file appswitch.c.

748{
749 PWND pWnd;
750 PALTTABINFO ati;
751 pWnd = ValidateHwnd(hWnd);
752 if (pWnd)
753 {
754 if (!pWnd->fnid)
755 {
757 }
758 }
759
760 switch (uMsg)
761 {
762 case WM_NCCREATE:
763 if (!(ati = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ati))))
764 return 0;
765 SetWindowLongPtrW( hWnd, 0, (LONG_PTR)ati );
766 return TRUE;
767
768 case WM_SHOWWINDOW:
769 if (wParam)
770 {
773 ati->cbSize = sizeof(ALTTABINFO);
774 ati->cItems = nItems;
775 ati->cColumns = nCols;
776 ati->cRows = nRows;
777 if (nCols)
778 {
781 }
782 else
783 {
784 ati->iColFocus = 0;
785 ati->iRowFocus = 0;
786 }
787 ati->cxItem = CX_ITEM_SPACE;
788 ati->cyItem = CY_ITEM_SPACE;
789 ati->ptStart = ptStart;
790 }
791 return 0;
792
793 case WM_MOUSEMOVE:
795 return 0;
796
797 case WM_ACTIVATE:
798 if (wParam == WA_INACTIVE)
799 {
801 }
802 return 0;
803
804 case WM_PAINT:
805 OnPaint(hWnd);
806 return 0;
807
808 case WM_DESTROY:
809 isOpen = FALSE;
811 HeapFree( GetProcessHeap(), 0, ati );
812 SetWindowLongPtrW( hWnd, 0, 0 );
815 return 0;
816 }
817 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
818}
void OnPaint(HWND hWnd)
Definition: appswitch.c:304
void PrepareWindow(VOID)
Definition: appswitch.c:433
WPARAM wParam
Definition: combotst.c:138
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
#define ValidateHwnd(hwnd)
Definition: precomp.h:85
#define FNID_SWITCH
Definition: ntuser.h:865
#define FNID_DESTROY
Definition: ntuser.h:898
BOOL NTAPI NtUserSetWindowFNID(HWND hWnd, WORD fnID)
Definition: window.c:4330
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
Definition: ntuser.h:694
DWORD fnid
Definition: ntuser.h:709
DWORD cbSize
Definition: winuser.h:3697
POINT ptStart
Definition: winuser.h:3705
#define WM_PAINT
Definition: winuser.h:1620
#define GetWindowLongPtrW
Definition: winuser.h:4829
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WA_INACTIVE
Definition: winuser.h:2622
#define WM_NCCREATE
Definition: winuser.h:1683
#define WM_ACTIVATE
Definition: winuser.h:1612
#define WM_SHOWWINDOW
Definition: winuser.h:1628
#define WM_DESTROY
Definition: winuser.h:1609
struct tagALTTABINFO * PALTTABINFO
#define SetWindowLongPtrW
Definition: winuser.h:5346
struct tagALTTABINFO ALTTABINFO

Referenced by SwitchWndProcA(), and SwitchWndProcW().

◆ SwitchWndProcA()

LRESULT WINAPI SwitchWndProcA ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 820 of file appswitch.c.

821{
823}
LRESULT WINAPI SwitchWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: appswitch.c:747

Referenced by RegisterClientPFN().

◆ SwitchWndProcW()

LRESULT WINAPI SwitchWndProcW ( HWND  hWnd,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 825 of file appswitch.c.

826{
827 return SwitchWndProc_common(hWnd, uMsg, wParam, lParam, TRUE);
828}

Referenced by RegisterClientPFN().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( user32  )

Variable Documentation

◆ CoolSwitch

BOOL CoolSwitch = TRUE

Definition at line 66 of file appswitch.c.

Referenced by DoAppSwitch(), and LoadCoolSwitchSettings().

◆ CoolSwitchColumns

int CoolSwitchColumns = 7

Definition at line 68 of file appswitch.c.

Referenced by LoadCoolSwitchSettings(), OnPaint(), and PrepareWindow().

◆ CoolSwitchRows

int CoolSwitchRows = 3

Definition at line 67 of file appswitch.c.

Referenced by LoadCoolSwitchSettings(), and PrepareWindow().

◆ cxBorder

int cxBorder

Definition at line 55 of file appswitch.c.

Referenced by C1_DrawDragBorder(), and T1_DrawDragBorder().

◆ cyBorder

int cyBorder

Definition at line 55 of file appswitch.c.

Referenced by C1_DrawDragBorder(), and T1_DrawDragBorder().

◆ dialogFont

HFONT dialogFont

Definition at line 43 of file appswitch.c.

Referenced by GetDialogFont(), and OnPaint().

◆ Esc

BOOL Esc = FALSE

Definition at line 64 of file appswitch.c.

Referenced by DoAppSwitch(), and RotateTasks().

◆ ExStyle

◆ fontHeight

int fontHeight =0

Definition at line 47 of file appswitch.c.

Referenced by add_font(), GetDialogFont(), PrepareWindow(), and realize_font().

◆ iconList

HICON iconList[MAX_WINDOWS]

Definition at line 52 of file appswitch.c.

Referenced by DestroyAppWindows(), EnumerateCallback(), and OnPaint().

◆ isOpen

BOOL isOpen = FALSE

◆ itemsH

int itemsH

Definition at line 57 of file appswitch.c.

Referenced by OnPaint(), and PrepareWindow().

◆ itemsW

int itemsW

Definition at line 57 of file appswitch.c.

Referenced by OnPaint(), and PrepareWindow().

◆ nCols

◆ nItems

◆ nRows

◆ nShift

int nShift = 0

Definition at line 62 of file appswitch.c.

Referenced by OnPaint(), and SwitchWndProc_common().

◆ ptStart

◆ selectedWindow

◆ Style

◆ switchdialog

◆ totalH

int totalH

Definition at line 58 of file appswitch.c.

Referenced by OnPaint(), and PrepareWindow().

◆ totalW

int totalW

Definition at line 58 of file appswitch.c.

Referenced by OnPaint(), and PrepareWindow().

◆ windowCount

◆ windowList

HWND windowList[MAX_WINDOWS]

Definition at line 51 of file appswitch.c.

Referenced by CompleteSwitch(), EnumerateCallback(), OnPaint(), ProcessHotKey(), and RotateTasks().

◆ windowText

◆ xOffset

◆ yOffset