ReactOS  0.4.13-dev-259-g5ca9c9c
appswitch.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS system libraries
4  * FILE: win32ss/user/user32/controls/appswitch.c
5  * PURPOSE: app switching functionality
6  * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7  * David Quintana (gigaherz@gmail.com)
8  * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
9  */
10 
11 //
12 // TODO:
13 // Move to Win32k.
14 // Add registry support.
15 //
16 //
17 
18 #include <user32.h>
19 
21 
22 #define DIALOG_MARGIN 8 // margin of dialog contents
23 
24 #define CX_ICON 32 // width of icon
25 #define CY_ICON 32 // height of icon
26 #define ICON_MARGIN 4 // margin width around an icon
27 
28 #define CX_ITEM (CX_ICON + 2 * ICON_MARGIN)
29 #define CY_ITEM (CY_ICON + 2 * ICON_MARGIN)
30 #define ITEM_MARGIN 4 // margin width around an item
31 
32 #define CX_ITEM_SPACE (CX_ITEM + 2 * ITEM_MARGIN)
33 #define CY_ITEM_SPACE (CY_ITEM + 2 * ITEM_MARGIN)
34 
35 #define CY_TEXT_MARGIN 4 // margin height around text
36 
37 // limit the number of windows shown in the alt-tab window
38 // 120 windows results in (12*40) by (10*40) pixels worth of icons.
39 #define MAX_WINDOWS 120
40 
41 // Global variables
46 
47 int fontHeight=0;
48 
50 
53 int windowCount = 0;
54 
61 
62 int nShift = 0;
63 
65 
69 
70 // window style
73 
74 DWORD wtodw(const WCHAR *psz)
75 {
76  const WCHAR *pch = psz;
77  DWORD Value = 0;
78  while ('0' <= *pch && *pch <= '9')
79  {
80  Value *= 10;
81  Value += *pch - L'0';
82  }
83  return Value;
84 }
85 
87 {
88  CoolSwitch = TRUE;
89  CoolSwitchRows = 3;
91 
92  // FIXME: load the settings from registry
93 
94  TRACE("CoolSwitch: %d\n", CoolSwitch);
95  TRACE("CoolSwitchRows: %d\n", CoolSwitchRows);
96  TRACE("CoolSwitchColumns: %d\n", CoolSwitchColumns);
97 
98  return TRUE;
99 }
100 
102 {
103  int x, y;
104  RECT Rect;
105 
106  int screenwidth = GetSystemMetrics(SM_CXSCREEN);
107  int screenheight = GetSystemMetrics(SM_CYSCREEN);
108 
109  x = (screenwidth - width) / 2;
110  y = (screenheight - height) / 2;
111 
112  SetRect(&Rect, x, y, x + width, y + height);
114 
115  x = Rect.left;
116  y = Rect.top;
117  width = Rect.right - Rect.left;
118  height = Rect.bottom - Rect.top;
120 
121  ptStart.x = x;
122  ptStart.y = y;
123 }
124 
126 {
127  if (IsIconic(hwnd))
129 
130  BringWindowToTop(hwnd); // same as: SetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); ?
132 }
133 
134 void CompleteSwitch(BOOL doSwitch)
135 {
136  if (!isOpen)
137  return;
138 
139  isOpen = FALSE;
140 
141  TRACE("[ATbot] CompleteSwitch Hiding Window.\n");
143 
144  if(doSwitch)
145  {
147  return;
148 
149  // FIXME: workaround because reactos fails to activate the previous window correctly.
150  //if(selectedWindow != 0)
151  {
153 
155 
156  TRACE("[ATbot] CompleteSwitch Switching to 0x%08x (%ls)\n", hwnd, windowText);
157 
159  }
160  }
161 
162  windowCount = 0;
163 }
164 
166 {
167  HICON hIcon;
168  HWND hwndIcon, hwndOwner;
169 
171 
172  hwndOwner = GetWindow(window, GW_OWNER);
173  hwndIcon = (hwndOwner ? hwndOwner : window);
174 
175  // First try to get the big icon assigned to the window
176  hIcon = (HICON)SendMessageW(hwndIcon, WM_GETICON, ICON_BIG, 0);
177  if (!hIcon)
178  {
179  // If no icon is assigned, try to get the icon assigned to the windows' class
180  hIcon = (HICON)GetClassLongPtrW(hwndIcon, GCL_HICON);
181  if (!hIcon)
182  {
183  // If we still don't have an icon, see if we can do with the small icon,
184  // or a default application icon
185  hIcon = (HICON)SendMessageW(hwndIcon, WM_GETICON, ICON_SMALL2, 0);
186  if (!hIcon)
187  {
188  // using windows logo icon as default
189  hIcon = gpsi->hIconWindows;
190  if (!hIcon)
191  {
192  //if all attempts to get icon fails go to the next window
193  return TRUE;
194  }
195  }
196  }
197  }
198 
201 
202  windowCount++;
203 
204  // If we got to the max number of windows,
205  // we won't be able to add any more
206  if(windowCount >= MAX_WINDOWS)
207  return FALSE;
208 
209  return TRUE;
210 }
211 
212 // Function mostly compatible with the normal EnumChildWindows,
213 // except it lists in Z-Order and it doesn't ensure consistency
214 // if a window is removed while enumerating
216 {
217  HWND hwnd, hwndOwner;
218  WCHAR szClass[64];
219  DWORD ExStyle;
220 
222  {
223  if (!IsWindowVisible(hwnd))
224  continue;
225 
226  // check special windows
227  if (!GetClassNameW(hwnd, szClass, _countof(szClass)) ||
228  wcscmp(szClass, L"Shell_TrayWnd") == 0 ||
229  wcscmp(szClass, L"Progman") == 0)
230  {
231  continue;
232  }
233 
236  continue;
237 
238  hwndOwner = GetWindow(hwnd, GW_OWNER);
239  if ((ExStyle & WS_EX_APPWINDOW) || !IsWindowVisible(hwndOwner))
240  {
241  if (!callback(hwnd, lParam))
242  break;
243 
244  continue;
245  }
246  }
247 }
248 
250 {
251  int xPos = LOWORD(lParam);
252  int yPos = HIWORD(lParam);
253 
254  int xIndex = (xPos - DIALOG_MARGIN) / CX_ITEM_SPACE;
255  int yIndex = (yPos - DIALOG_MARGIN) / CY_ITEM_SPACE;
256 
257  if (xIndex < 0 || nCols <= xIndex ||
258  yIndex < 0 || nRows <= yIndex)
259  {
260  return;
261  }
262 
263  selectedWindow = (yIndex*nCols) + xIndex;
264  if (message == WM_MOUSEMOVE)
265  {
267  //RedrawWindow(switchdialog, NULL, NULL, 0);
268  }
269  else
270  {
271  selectedWindow = (yIndex*nCols) + xIndex;
273  }
274 }
275 
277 {
278  HDC dialogDC;
280  RECT cRC, textRC;
281  int i, xPos, yPos, CharCount;
282  HFONT dcFont;
283  HICON hIcon;
284  HPEN hPen;
285  COLORREF Color;
286 
287  // check
288  if (nCols == 0 || nItems == 0)
289  return;
290 
291  // begin painting
292  dialogDC = BeginPaint(hWnd, &paint);
293  if (dialogDC == NULL)
294  return;
295 
296  // fill the client area
297  GetClientRect(hWnd, &cRC);
298  FillRect(dialogDC, &cRC, (HBRUSH)(COLOR_3DFACE + 1));
299 
300  // if the selection index exceeded the display items, then
301  // do display item shifting
302  if (selectedWindow >= nItems)
303  nShift = selectedWindow - nItems + 1;
304  else
305  nShift = 0;
306 
307  for (i = 0; i < nItems; ++i)
308  {
309  // get the icon to display
310  hIcon = iconList[i + nShift];
311 
312  // calculate the position where we start drawing
313  xPos = DIALOG_MARGIN + CX_ITEM_SPACE * (i % nCols) + ITEM_MARGIN;
314  yPos = DIALOG_MARGIN + CY_ITEM_SPACE * (i / nCols) + ITEM_MARGIN;
315 
316  // centering
318  {
319  xPos += (itemsW - nItems * CX_ITEM_SPACE) / 2;
320  }
321 
322  // if this position is selected,
323  if (selectedWindow == i + nShift)
324  {
325  // create a solid pen
327  hPen = CreatePen(PS_SOLID, 1, Color);
328 
329  // draw a rectangle with using the pen
330  SelectObject(dialogDC, hPen);
332  Rectangle(dialogDC, xPos, yPos, xPos + CX_ITEM, yPos + CY_ITEM);
333  Rectangle(dialogDC, xPos + 1, yPos + 1,
334  xPos + CX_ITEM - 1, yPos + CY_ITEM - 1);
335 
336  // delete the pen
337  DeleteObject(hPen);
338  }
339 
340  // draw icon
341  DrawIconEx(dialogDC, xPos + ICON_MARGIN, yPos + ICON_MARGIN,
343  }
344 
345  // set the text rectangle
348 
349  // draw the sunken button around text
350  DrawFrameControl(dialogDC, &textRC, DFC_BUTTON,
352 
353  // get text
356 
357  // draw text
358  dcFont = SelectObject(dialogDC, dialogFont);
360  SetBkMode(dialogDC, TRANSPARENT);
361  DrawTextW(dialogDC, windowText, CharCount, &textRC,
363  SelectObject(dialogDC, dcFont);
364 
365  // end painting
366  EndPaint(hWnd, &paint);
367 }
368 
370 {
372  WC_SWITCH,
373  L"",
377  400, 150,
378  NULL, NULL,
379  hInstance, NULL);
380  if (!switchdialog)
381  {
382  TRACE("[ATbot] Task Switcher Window failed to create.\n");
383  return 0;
384  }
385 
386  isOpen = FALSE;
387  return 1;
388 }
389 
391 {
392  HDC tDC;
393  TEXTMETRIC tm;
394 
396 
397  tDC = GetDC(0);
398  GetTextMetrics(tDC, &tm);
399  fontHeight = tm.tmHeight;
400  ReleaseDC(0, tDC);
401 
402  return 1;
403 }
404 
406 {
408 
411  if (nRows > CoolSwitchRows)
412  {
414  nItems = nRows * nCols;
415  }
416 
419 
420  totalW = itemsW + 2 * DIALOG_MARGIN;
421  totalH = itemsH + 2 * DIALOG_MARGIN;
423 
425 }
426 
428 {
429  if (!isOpen)
430  {
431  windowCount=0;
433 
434  if (windowCount == 0)
435  return FALSE;
436 
437  if (windowCount == 1)
438  {
439  selectedWindow = 0;
441  return TRUE;
442  }
443 
444  selectedWindow = 1;
445 
446  TRACE("[ATbot] HotKey Received. Opening window.\n");
449  isOpen = TRUE;
450  }
451  else
452  {
453  TRACE("[ATbot] HotKey Received Rotating.\n");
456  }
457  return TRUE;
458 }
459 
461 {
462  HWND hwndFirst, hwndLast;
463  DWORD Size;
464 
465  if (windowCount < 2 || !Esc)
466  return;
467 
468  hwndFirst = windowList[0];
469  hwndLast = windowList[windowCount - 1];
470 
471  if (bShift)
472  {
473  SetWindowPos(hwndLast, HWND_TOP, 0, 0, 0, 0,
476 
477  MakeWindowActive(hwndLast);
478 
479  Size = (windowCount - 1) * sizeof(HWND);
481  windowList[0] = hwndLast;
482  }
483  else
484  {
485  SetWindowPos(hwndFirst, hwndLast, 0, 0, 0, 0,
488 
490 
491  Size = (windowCount - 1) * sizeof(HWND);
493  windowList[windowCount - 1] = hwndFirst;
494  }
495 }
496 
497 static void MoveLeft(void)
498 {
500  if (selectedWindow < 0)
503 }
504 
505 static void MoveRight(void)
506 {
509 }
510 
511 static void MoveUp(void)
512 {
513  INT iRow = selectedWindow / nCols;
514  INT iCol = selectedWindow % nCols;
515 
516  --iRow;
517  if (iRow < 0)
518  iRow = nRows - 1;
519 
520  selectedWindow = iRow * nCols + iCol;
524 }
525 
526 static void MoveDown(void)
527 {
528  INT iRow = selectedWindow / nCols;
529  INT iCol = selectedWindow % nCols;
530 
531  ++iRow;
532  if (iRow >= nRows)
533  iRow = 0;
534 
535  selectedWindow = iRow * nCols + iCol;
539 }
540 
541 VOID
543 {
544  // for every item of the icon list:
545  INT i;
546  for (i = 0; i < windowCount; ++i)
547  {
548  // destroy the icon
550  iconList[i] = NULL;
551  }
552 }
553 
555 {
556  HWND hwndActive;
557  MSG msg;
558 
559  // FIXME: Is loading timing OK?
561 
562  if (!CoolSwitch)
563  return 0;
564 
565  // Already in the loop.
566  if (switchdialog || Esc) return 0;
567 
568  hwndActive = GetActiveWindow();
569  // Nothing is active so exit.
570  if (!hwndActive) return 0;
571 
572  if (lParam == VK_ESCAPE)
573  {
574  Esc = TRUE;
575 
576  windowCount = 0;
578 
579  if (windowCount < 2)
580  return 0;
581 
583 
584  hwndActive = GetActiveWindow();
585 
586  if (hwndActive == NULL)
587  {
588  Esc = FALSE;
589  return 0;
590  }
591  }
592 
593  // Capture current active window.
594  SetCapture( hwndActive );
595 
596  switch (lParam)
597  {
598  case VK_TAB:
600  if( !GetDialogFont() ) goto Exit;
601  if( !ProcessHotKey() ) goto Exit;
602  break;
603 
604  case VK_ESCAPE:
605  break;
606 
607  default:
608  goto Exit;
609  }
610  // Main message loop:
611  while (1)
612  {
613  for (;;)
614  {
615  if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ))
616  {
617  if (!CallMsgFilterW( &msg, MSGF_NEXTWINDOW )) break;
618  /* remove the message from the queue */
619  PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
620  }
621  else
622  WaitMessage();
623  }
624 
625  switch (msg.message)
626  {
627  case WM_KEYUP:
628  {
629  PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
630  if (msg.wParam == VK_MENU)
631  {
633  }
634  else if (msg.wParam == VK_RETURN)
635  {
637  }
638  else if (msg.wParam == VK_ESCAPE)
639  {
640  TRACE("DoAppSwitch VK_ESCAPE 2\n");
642  }
643  goto Exit; //break;
644  }
645 
646  case WM_SYSKEYDOWN:
647  {
648  PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
649  if (HIWORD(msg.lParam) & KF_ALTDOWN)
650  {
651  if ( msg.wParam == VK_TAB )
652  {
653  if (Esc) break;
654  if (GetKeyState(VK_SHIFT) < 0)
655  {
656  MoveLeft();
657  }
658  else
659  {
660  MoveRight();
661  }
662  }
663  else if ( msg.wParam == VK_ESCAPE )
664  {
665  if (!Esc) break;
667  }
668  else if ( msg.wParam == VK_LEFT )
669  {
670  MoveLeft();
671  }
672  else if ( msg.wParam == VK_RIGHT )
673  {
674  MoveRight();
675  }
676  else if ( msg.wParam == VK_UP )
677  {
678  MoveUp();
679  }
680  else if ( msg.wParam == VK_DOWN )
681  {
682  MoveDown();
683  }
684  }
685  break;
686  }
687 
688  case WM_LBUTTONUP:
689  PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
690  ProcessMouseMessage(msg.message, msg.lParam);
691  goto Exit;
692 
693  default:
694  if (PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ))
695  {
698  }
699  break;
700  }
701  }
702 Exit:
703  ReleaseCapture();
705  if (Esc) DestroyAppWindows();
706  switchdialog = NULL;
707  selectedWindow = 0;
708  windowCount = 0;
709  Esc = FALSE;
710  return 0;
711 }
712 
713 //
714 // Switch System Class Window Proc.
715 //
717 {
718  PWND pWnd;
719  PALTTABINFO ati;
720  pWnd = ValidateHwnd(hWnd);
721  if (pWnd)
722  {
723  if (!pWnd->fnid)
724  {
726  }
727  }
728 
729  switch (uMsg)
730  {
731  case WM_NCCREATE:
732  if (!(ati = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ati))))
733  return 0;
734  SetWindowLongPtrW( hWnd, 0, (LONG_PTR)ati );
735  return TRUE;
736 
737  case WM_SHOWWINDOW:
738  if (wParam)
739  {
740  PrepareWindow();
742  ati->cbSize = sizeof(ALTTABINFO);
743  ati->cItems = nItems;
744  ati->cColumns = nCols;
745  ati->cRows = nRows;
746  if (nCols)
747  {
748  ati->iColFocus = (selectedWindow - nShift) % nCols;
749  ati->iRowFocus = (selectedWindow - nShift) / nCols;
750  }
751  else
752  {
753  ati->iColFocus = 0;
754  ati->iRowFocus = 0;
755  }
756  ati->cxItem = CX_ITEM_SPACE;
757  ati->cyItem = CY_ITEM_SPACE;
758  ati->ptStart = ptStart;
759  }
760  return 0;
761 
762  case WM_MOUSEMOVE:
764  return 0;
765 
766  case WM_ACTIVATE:
767  if (wParam == WA_INACTIVE)
768  {
770  }
771  return 0;
772 
773  case WM_PAINT:
774  OnPaint(hWnd);
775  return 0;
776 
777  case WM_DESTROY:
778  isOpen = FALSE;
780  HeapFree( GetProcessHeap(), 0, ati );
781  SetWindowLongPtrW( hWnd, 0, 0 );
784  return 0;
785  }
786  return DefWindowProcW(hWnd, uMsg, wParam, lParam);
787 }
788 
790 {
791  return SwitchWndProc_common(hWnd, uMsg, wParam, lParam, FALSE);
792 }
793 
795 {
796  return SwitchWndProc_common(hWnd, uMsg, wParam, lParam, TRUE);
797 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define GW_HWNDNEXT
Definition: winuser.h:756
HFONT dialogFont
Definition: appswitch.c:43
_In_opt_ ULONG _Out_ PULONG Value
Definition: rtlfuncs.h:2327
#define WS_DISABLED
Definition: pedump.c:621
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
DWORD wtodw(const WCHAR *psz)
Definition: appswitch.c:74
BOOL CALLBACK EnumerateCallback(HWND window, LPARAM lParam)
Definition: appswitch.c:165
GLint GLint GLsizei width
Definition: gl.h:1546
BOOL WINAPI TranslateMessage(_In_ const MSG *)
Definition: tftpd.h:59
static HICON
Definition: imagelist.c:84
void CompleteSwitch(BOOL doSwitch)
Definition: appswitch.c:134
#define TRUE
Definition: types.h:120
POINT ptStart
Definition: appswitch.c:60
HPEN WINAPI CreatePen(_In_ int, _In_ int, _In_ COLORREF)
#define DFC_BUTTON
Definition: winuser.h:476
#define COLOR_HIGHLIGHT
Definition: winuser.h:916
void ResizeAndCenter(HWND hwnd, int width, int height)
Definition: appswitch.c:101
#define CX_ICON
Definition: appswitch.c:24
#define SC_RESTORE
Definition: winuser.h:2552
long y
Definition: polytest.cpp:48
HWND switchdialog
Definition: appswitch.c:42
DWORD CreateSwitcherWindow(HINSTANCE hInstance)
Definition: appswitch.c:369
int nCols
Definition: appswitch.c:56
long x
Definition: polytest.cpp:48
HDC WINAPI GetDC(_In_opt_ HWND)
BOOL WINAPI Rectangle(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
#define SW_HIDE
Definition: winuser.h:762
LRESULT WINAPI SwitchWndProcA(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: appswitch.c:789
#define _countof(array)
Definition: fontsub.cpp:30
BOOL WINAPI WaitMessage(void)
Definition: ntwrapper.h:350
#define NULL_BRUSH
Definition: wingdi.h:900
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define MAX_WINDOWS
Definition: appswitch.c:39
BOOL Esc
Definition: appswitch.c:64
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
HWND hWnd
Definition: settings.c:17
int windowCount
Definition: appswitch.c:53
volatile BOOLEAN bShift
Definition: shell.c:71
BOOL isOpen
Definition: appswitch.c:45
#define ITEM_MARGIN
Definition: appswitch.c:30
#define VK_LEFT
Definition: winuser.h:2178
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define WM_SHOWWINDOW
Definition: winuser.h:1610
BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD)
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
#define GWL_EXSTYLE
Definition: winuser.h:845
#define HWND_TOP
Definition: winuser.h:1193
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT)
UINT_PTR WPARAM
Definition: windef.h:207
#define VK_TAB
Definition: winuser.h:2153
#define VK_DOWN
Definition: winuser.h:2181
#define ICON_MARGIN
Definition: appswitch.c:26
LRESULT WINAPI SwitchWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode)
Definition: appswitch.c:716
#define VK_MENU
Definition: winuser.h:2158
#define GetWindowLongPtrW
Definition: winuser.h:4698
#define CY_TEXT_MARGIN
Definition: appswitch.c:35
#define FNID_DESTROY
Definition: ntuser.h:859
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
#define MoveMemory
Definition: winbase.h:1632
#define GetTextMetrics
Definition: wingdi.h:4452
#define VK_ESCAPE
Definition: winuser.h:2168
BOOL(CALLBACK * WNDENUMPROC)(HWND, LPARAM)
Definition: winuser.h:2861
BOOL WINAPI IsIconic(_In_ HWND)
#define WM_NCCREATE
Definition: winuser.h:1665
BOOL WINAPI DestroyWindow(_In_ HWND)
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
HINSTANCE User32Instance
Definition: dllmain.c:10
int32_t INT
Definition: typedefs.h:56
PSERVERINFO gpsi
Definition: main.c:27
#define VK_RETURN
Definition: winuser.h:2155
DWORD WINAPI GetSysColor(_In_ int)
WPARAM wParam
Definition: combotst.c:138
HWND WINAPI GetTopWindow(_In_opt_ HWND)
#define pch(ap)
Definition: match.c:418
struct Color Color
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static void MoveDown(void)
Definition: appswitch.c:526
#define PM_NOREMOVE
Definition: winuser.h:1181
int cxBorder
Definition: appswitch.c:55
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
struct tagALTTABINFO * PALTTABINFO
#define MSGF_NEXTWINDOW
Definition: winuser.h:1165
#define PS_SOLID
Definition: wingdi.h:585
#define DFCS_PUSHED
Definition: winuser.h:503
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
#define SM_CXSCREEN
Definition: winuser.h:949
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
BOOL WINAPI CallMsgFilterW(_In_ LPMSG, _In_ INT)
HINSTANCE hInstance
Definition: charmap.c:20
#define COLOR_3DFACE
Definition: winuser.h:919
#define VK_UP
Definition: winuser.h:2179
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
DWORD fnid
Definition: ntuser.h:673
static void MoveUp(void)
Definition: appswitch.c:511
unsigned int BOOL
Definition: ntddk_ex.h:94
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
#define WC_SWITCH
Definition: undocuser.h:12
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define CX_ITEM_SPACE
Definition: appswitch.c:32
#define TRANSPARENT
Definition: wingdi.h:949
#define CW_USEDEFAULT
Definition: winuser.h:225
#define VK_SHIFT
Definition: winuser.h:2156
int nItems
Definition: appswitch.c:56
BOOL WINAPI BringWindowToTop(_In_ HWND)
#define DT_END_ELLIPSIS
Definition: winuser.h:529
smooth NULL
Definition: ftsmooth.c:416
int totalW
Definition: appswitch.c:58
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
struct tagALTTABINFO ALTTABINFO
HICON iconList[MAX_WINDOWS]
Definition: appswitch.c:52
LONG_PTR LPARAM
Definition: windef.h:208
#define DT_VCENTER
Definition: winuser.h:543
#define DIALOG_MARGIN
Definition: appswitch.c:22
#define WM_DESTROY
Definition: winuser.h:1591
SHORT WINAPI GetKeyState(_In_ int)
void EnumWindowsZOrder(WNDENUMPROC callback, LPARAM lParam)
Definition: appswitch.c:215
#define SM_CYSCREEN
Definition: winuser.h:950
int itemsW
Definition: appswitch.c:57
MmuTrapHandler callback[0x30]
Definition: mmuobject.c:44
static void MoveLeft(void)
Definition: appswitch.c:497
int fontHeight
Definition: appswitch.c:47
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
const DWORD Style
Definition: appswitch.c:71
#define CY_ITEM
Definition: appswitch.c:29
#define FNID_SWITCH
Definition: ntuser.h:827
__wchar_t WCHAR
Definition: xmlstorage.h:180
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:1997
int itemsH
Definition: appswitch.c:57
#define SWP_NOACTIVATE
Definition: winuser.h:1227
DWORD COLORREF
Definition: windef.h:285
static void Exit(void)
Definition: sock.c:1331
int totalH
Definition: appswitch.c:58
#define WINAPI
Definition: msvc.h:8
#define WM_KEYUP
Definition: winuser.h:1692
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
int nShift
Definition: appswitch.c:62
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
int CoolSwitchColumns
Definition: appswitch.c:68
#define DEFAULT_GUI_FONT
Definition: wingdi.h:908
#define WM_PAINT
Definition: winuser.h:1602
DWORD GetDialogFont(VOID)
Definition: appswitch.c:390
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
LRESULT WINAPI SwitchWndProcW(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: appswitch.c:794
static const WCHAR L[]
Definition: oid.c:1250
PWND FASTCALL ValidateHwnd(HWND hwnd)
Definition: misc.c:369
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)
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define DI_NORMAL
Definition: wingdi.h:72
#define WS_EX_TOPMOST
Definition: pedump.c:647
void PrepareWindow(VOID)
Definition: appswitch.c:405
Definition: time.h:76
static IHTMLWindow2 * window
Definition: events.c:77
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL)
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
#define VK_RIGHT
Definition: winuser.h:2180
int cyBorder
Definition: appswitch.c:55
#define CY_ICON
Definition: appswitch.c:25
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:886
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define DT_SINGLELINE
Definition: winuser.h:540
#define GCL_HICON
Definition: winuser.h:661
HICON WINAPI CopyIcon(_In_ HICON)
Definition: cursoricon.c:1980
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
HWND WINAPI SetCapture(_In_ HWND hWnd)
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WS_BORDER
Definition: pedump.c:625
BOOL LoadCoolSwitchSettings(void)
Definition: appswitch.c:86
BOOL ProcessHotKey(VOID)
Definition: appswitch.c:427
#define WM_ACTIVATE
Definition: winuser.h:1594
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
Definition: window.c:1378
HICON hIcon
Definition: msconfig.c:44
#define DFCS_BUTTONPUSH
Definition: winuser.h:501
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
int CoolSwitchRows
Definition: appswitch.c:67
#define WM_LBUTTONUP
Definition: winuser.h:1753
static void MoveRight(void)
Definition: appswitch.c:505
void MakeWindowActive(HWND hwnd)
Definition: appswitch.c:125
int xOffset
Definition: appswitch.c:59
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define WS_POPUP
Definition: pedump.c:616
unsigned int UINT
Definition: ndis.h:50
#define WM_MOUSEMOVE
Definition: winuser.h:1751
#define GW_OWNER
Definition: winuser.h:761
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define KF_ALTDOWN
Definition: winuser.h:2403
static LRESULT paint(HTHEME theme, HWND hwnd, HDC hParamDC, ULONG state)
Definition: theme_combo.c:154
void ProcessMouseMessage(UINT message, LPARAM lParam)
Definition: appswitch.c:249
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
WCHAR windowText[1024]
Definition: appswitch.c:49
#define msg(x)
Definition: auth_time.c:54
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2888
#define SWP_NOREPOSITION
Definition: winuser.h:1235
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
int nRows
Definition: appswitch.c:56
#define CX_ITEM
Definition: appswitch.c:28
void RotateTasks(BOOL bShift)
Definition: appswitch.c:460
#define WM_SYSKEYDOWN
Definition: winuser.h:1695
#define HIWORD(l)
Definition: typedefs.h:246
BOOL WINAPI IsWindowVisible(_In_ HWND)
HWND windowList[MAX_WINDOWS]
Definition: appswitch.c:51
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOL NTAPI NtUserSetWindowFNID(HWND hWnd, WORD fnID)
Definition: window.c:4107
#define DT_CENTER
Definition: winuser.h:527
#define SWP_NOMOVE
Definition: winuser.h:1229
#define COLOR_BTNTEXT
Definition: winuser.h:923
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SetWindowLongPtrW
Definition: winuser.h:5215
#define WA_INACTIVE
Definition: winuser.h:2576
int yOffset
Definition: appswitch.c:59
#define WS_EX_APPWINDOW
Definition: winuser.h:383
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1182
void OnPaint(HWND hWnd)
Definition: appswitch.c:276
LONG_PTR LRESULT
Definition: windef.h:209
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
BOOL CoolSwitch
Definition: appswitch.c:66
WINE_DEFAULT_DEBUG_CHANNEL(user32)
#define WM_SYSCOMMAND
Definition: winuser.h:1717
int selectedWindow
Definition: appswitch.c:44
LPARAM lParam
Definition: combotst.c:139
HWND WINAPI GetActiveWindow(void)
Definition: winpos.c:138
#define LOWORD(l)
Definition: pedump.c:82
#define HeapFree(x, y, z)
Definition: compat.h:394
#define GetClassLongPtrW
Definition: winuser.h:4433
struct Rect Rect
VOID DestroyAppWindows(VOID)
Definition: appswitch.c:542
#define ICON_BIG
Definition: tnclass.cpp:51
const DWORD ExStyle
Definition: appswitch.c:72
LRESULT WINAPI DoAppSwitch(WPARAM wParam, LPARAM lParam)
Definition: appswitch.c:554
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:17
#define CY_ITEM_SPACE
Definition: appswitch.c:33
#define SWP_NOOWNERZORDER
Definition: winuser.h:1234