Fix some task switch window bugs

svn path=/trunk/; revision=33401
This commit is contained in:
Thomas Bluemel 2008-05-10 01:45:08 +00:00
parent 9539538ba0
commit 433a98b5fa
6 changed files with 106 additions and 68 deletions

View file

@ -217,7 +217,7 @@ IDropTargetImpl_DragEnter(IN OUT IDropTarget *iface,
hr = IDropTargetHelper_DragEnter(This->DropTargetHelper, hr = IDropTargetHelper_DragEnter(This->DropTargetHelper,
This->hwndTarget, This->hwndTarget,
pDataObject, pDataObject,
&pt, (POINT *)&pt,
*pdwEffect); *pdwEffect);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
@ -274,7 +274,7 @@ IDropTargetImpl_DragOver(IN OUT IDropTarget *iface,
HRESULT hr; HRESULT hr;
hr = IDropTargetHelper_DragOver(This->DropTargetHelper, hr = IDropTargetHelper_DragOver(This->DropTargetHelper,
&pt, (POINT *)&pt,
*pdwEffect); *pdwEffect);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
@ -350,7 +350,7 @@ IDropTargetImpl_Drop(IN OUT IDropTarget *iface,
hr = IDropTargetHelper_Drop(This->DropTargetHelper, hr = IDropTargetHelper_Drop(This->DropTargetHelper,
pDataObject, pDataObject,
&pt, (POINT *)&pt,
*pdwEffect); *pdwEffect);
if (SUCCEEDED(hr) && This->CanDrop) if (SUCCEEDED(hr) && This->CanDrop)

View file

@ -26,7 +26,7 @@
/* Set DUMP_TASKS to 1 to enable a dump of the tasks and task groups every /* Set DUMP_TASKS to 1 to enable a dump of the tasks and task groups every
5 seconds */ 5 seconds */
#define DUMP_TASKS 0 #define DUMP_TASKS 1
static const TCHAR szTaskSwitchWndClass[] = TEXT("MSTaskSwWClass"); static const TCHAR szTaskSwitchWndClass[] = TEXT("MSTaskSwWClass");
static const TCHAR szRunningApps[] = TEXT("Running Applications"); static const TCHAR szRunningApps[] = TEXT("Running Applications");
@ -136,17 +136,6 @@ typedef struct _TASK_SWITCH_WND
#define MAX_TASKS_COUNT (0x7FFF) #define MAX_TASKS_COUNT (0x7FFF)
#define MAKE_TASKITEM_PTR(ti) ((DWORD_PTR)ti)
#define MAKE_TASKGROUP_PTR(tg) (((DWORD_PTR)tg) | 1)
#define IS_TASKGROUP_PTR(p) ((((DWORD_PTR)p) & 1) != 0)
#define GET_TASKITEM_PTR(lp) ((PTASK_ITEM)(((DWORD_PTR)lp) & ~1))
#define GET_TASKGROUP_PTR(lp) ((PTASK_GROUP)(((DWORD_PTR)lp) & ~1))
#define MAKE_TASKITEM_CMD_ID(id) ((INT)(id))
#define MAKE_TASKGROUP_CMD_ID(id) ((INT)(id) | (1 << 15))
#define IS_TASKGROUP_CMD_ID(id) ((((INT)(id)) & (1 << 15)) != 0)
#define GET_INDEX_FROM_CMD_ID(id) ((INT)(id) & MAX_TASKS_COUNT)
static VOID TaskSwitchWnd_UpdateButtonsSize(IN OUT PTASK_SWITCH_WND This, static VOID TaskSwitchWnd_UpdateButtonsSize(IN OUT PTASK_SWITCH_WND This,
IN BOOL bRedrawDisabled); IN BOOL bRedrawDisabled);
@ -286,7 +275,7 @@ TaskSwitchWnd_UpdateIndexesAfterButtonInserted(IN OUT PTASK_SWITCH_WND This,
NewIndex = CurrentGroup->Index + 1; NewIndex = CurrentGroup->Index + 1;
if (TaskSwitchWnd_SetToolbarButtonCommandId(This, if (TaskSwitchWnd_SetToolbarButtonCommandId(This,
CurrentGroup->Index + 1, CurrentGroup->Index + 1,
MAKE_TASKGROUP_CMD_ID(NewIndex))) NewIndex))
{ {
CurrentGroup->Index = NewIndex; CurrentGroup->Index = NewIndex;
} }
@ -319,7 +308,7 @@ UpdateTaskItemBtn:
NewIndex = CurrentTaskItem->Index + 1; NewIndex = CurrentTaskItem->Index + 1;
if (TaskSwitchWnd_SetToolbarButtonCommandId(This, if (TaskSwitchWnd_SetToolbarButtonCommandId(This,
CurrentTaskItem->Index + 1, CurrentTaskItem->Index + 1,
MAKE_TASKITEM_CMD_ID(NewIndex))) NewIndex))
{ {
CurrentTaskItem->Index = NewIndex; CurrentTaskItem->Index = NewIndex;
} }
@ -352,7 +341,7 @@ TaskSwitchWnd_UpdateIndexesAfterButtonDeleted(IN OUT PTASK_SWITCH_WND This,
NewIndex = CurrentGroup->Index - 1; NewIndex = CurrentGroup->Index - 1;
if (TaskSwitchWnd_SetToolbarButtonCommandId(This, if (TaskSwitchWnd_SetToolbarButtonCommandId(This,
CurrentGroup->Index - 1, CurrentGroup->Index - 1,
MAKE_TASKGROUP_CMD_ID(NewIndex))) NewIndex))
{ {
CurrentGroup->Index = NewIndex; CurrentGroup->Index = NewIndex;
} }
@ -385,7 +374,7 @@ UpdateTaskItemBtn:
NewIndex = CurrentTaskItem->Index - 1; NewIndex = CurrentTaskItem->Index - 1;
if (TaskSwitchWnd_SetToolbarButtonCommandId(This, if (TaskSwitchWnd_SetToolbarButtonCommandId(This,
CurrentTaskItem->Index - 1, CurrentTaskItem->Index - 1,
MAKE_TASKITEM_CMD_ID(NewIndex))) NewIndex))
{ {
CurrentTaskItem->Index = NewIndex; CurrentTaskItem->Index = NewIndex;
} }
@ -570,7 +559,7 @@ TaskSwitchWnd_AddTaskItemButton(IN OUT PTASK_SWITCH_WND This,
tbBtn.iBitmap = 0; tbBtn.iBitmap = 0;
tbBtn.fsState = TBSTATE_ENABLED | TBSTATE_ELLIPSES; tbBtn.fsState = TBSTATE_ENABLED | TBSTATE_ELLIPSES;
tbBtn.fsStyle = BTNS_CHECK | BTNS_NOPREFIX | BTNS_SHOWTEXT; tbBtn.fsStyle = BTNS_CHECK | BTNS_NOPREFIX | BTNS_SHOWTEXT;
tbBtn.dwData = MAKE_TASKITEM_PTR(TaskItem); tbBtn.dwData = TaskItem->Index;
tbBtn.iString = (DWORD_PTR)TaskSwitchWnd_GetWndTextFromTaskItem(This, tbBtn.iString = (DWORD_PTR)TaskSwitchWnd_GetWndTextFromTaskItem(This,
TaskItem); TaskItem);
@ -579,7 +568,7 @@ TaskSwitchWnd_AddTaskItemButton(IN OUT PTASK_SWITCH_WND This,
iIndex = TaskSwitchWnd_CalculateTaskItemNewButtonIndex(This, iIndex = TaskSwitchWnd_CalculateTaskItemNewButtonIndex(This,
TaskItem); TaskItem);
ASSERT(iIndex >= 0); ASSERT(iIndex >= 0);
tbBtn.idCommand = MAKE_TASKITEM_CMD_ID(iIndex); tbBtn.idCommand = iIndex;
TaskSwitchWnd_BeginUpdate(This); TaskSwitchWnd_BeginUpdate(This);
@ -719,6 +708,7 @@ TaskSwitchWnd_RemoveTaskFromTaskGroup(IN OUT PTASK_SWITCH_WND This,
} }
/* Remove the group from the list */ /* Remove the group from the list */
ASSERT(TaskGroup == CurrentGroup);
*PrevLink = TaskGroup->Next; *PrevLink = TaskGroup->Next;
/* Free the task group */ /* Free the task group */
@ -819,39 +809,44 @@ TaskSwitchWnd_AllocTaskItem(IN OUT PTASK_SWITCH_WND This)
return NULL; return NULL;
} }
if (This->AllocatedTaskItems <= This->TaskItemCount) ASSERT(This->AllocatedTaskItems >= This->TaskItemCount);
if (This->TaskItemCount != 0)
{ {
if (This->TaskItemCount != 0) PTASK_ITEM NewArray;
SIZE_T NewArrayLength, ActiveTaskItemIndex;
NewArrayLength = This->AllocatedTaskItems + TASK_ITEM_ARRAY_ALLOC;
NewArray = HeapReAlloc(hProcessHeap,
0,
This->TaskItems,
NewArrayLength * sizeof(*This->TaskItems));
if (NewArray != NULL)
{ {
PTASK_ITEM NewArray; if (This->ActiveTaskItem != NULL)
WORD NewArrayLength;
NewArrayLength = This->AllocatedTaskItems + TASK_ITEM_ARRAY_ALLOC;
NewArray = HeapReAlloc(hProcessHeap,
0,
This->TaskItems,
NewArrayLength * sizeof(*This->TaskItems));
if (NewArray != NULL)
{ {
This->AllocatedTaskItems = NewArrayLength; /* Fixup the ActiveTaskItem pointer */
This->TaskItems = NewArray; ActiveTaskItemIndex = This->ActiveTaskItem - This->TaskItems;
This->ActiveTaskItem = NewArray + ActiveTaskItemIndex;
} }
else This->AllocatedTaskItems = (WORD)NewArrayLength;
return NULL; This->TaskItems = NewArray;
} }
else else
return NULL;
}
else
{
This->TaskItems = HeapAlloc(hProcessHeap,
0,
TASK_ITEM_ARRAY_ALLOC * sizeof(*This->TaskItems));
if (This->TaskItems != NULL)
{ {
This->TaskItems = HeapAlloc(hProcessHeap, This->AllocatedTaskItems = TASK_ITEM_ARRAY_ALLOC;
0,
TASK_ITEM_ARRAY_ALLOC * sizeof(*This->TaskItems));
if (This->TaskItems != NULL)
{
This->AllocatedTaskItems = TASK_ITEM_ARRAY_ALLOC;
}
else
return NULL;
} }
else
return NULL;
} }
return This->TaskItems + This->TaskItemCount++; return This->TaskItems + This->TaskItemCount++;
@ -964,6 +959,43 @@ ChangeActiveTaskItemButton:
} }
} }
static PTASK_ITEM
FindTaskItemByIndex(IN OUT PTASK_SWITCH_WND This,
IN INT Index)
{
PTASK_ITEM TaskItem, LastItem;
TaskItem = This->TaskItems;
LastItem = TaskItem + This->TaskItemCount;
while (TaskItem != LastItem)
{
if (TaskItem->Index == Index)
return TaskItem;
TaskItem++;
}
return NULL;
}
static PTASK_GROUP
FindTaskGroupByIndex(IN OUT PTASK_SWITCH_WND This,
IN INT Index)
{
PTASK_GROUP CurrentGroup;
CurrentGroup = This->TaskGroups;
while (CurrentGroup != NULL)
{
if (CurrentGroup->Index == Index)
break;
CurrentGroup = CurrentGroup->Next;
}
return CurrentGroup;
}
static BOOL static BOOL
TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This, TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This,
IN HWND hWnd) IN HWND hWnd)
@ -1211,9 +1243,9 @@ TaskSwitchWnd_UpdateButtonsSize(IN OUT PTASK_SWITCH_WND This,
uiMin = GetSystemMetrics(SM_CXSIZE) + (2 * GetSystemMetrics(SM_CXEDGE)); uiMin = GetSystemMetrics(SM_CXSIZE) + (2 * GetSystemMetrics(SM_CXEDGE));
if (NewBtnSize < uiMin) if (NewBtnSize < (LONG)uiMin)
NewBtnSize = uiMin; NewBtnSize = uiMin;
if (NewBtnSize > uiMax) if (NewBtnSize > (LONG)uiMax)
NewBtnSize = uiMax; NewBtnSize = uiMax;
This->ButtonSize.cx = NewBtnSize; This->ButtonSize.cx = NewBtnSize;
@ -1392,7 +1424,7 @@ TaskSwitchWnd_Create(IN OUT PTASK_SWITCH_WND This)
/* Register the shell hook */ /* Register the shell hook */
This->ShellHookMsg = RegisterWindowMessage(TEXT("SHELLHOOK")); This->ShellHookMsg = RegisterWindowMessage(TEXT("SHELLHOOK"));
hShell32 = LoadLibrary(TEXT("SHELL32.DLL")); hShell32 = GetModuleHandle(TEXT("SHELL32.DLL"));
if (hShell32 != NULL) if (hShell32 != NULL)
{ {
REGSHELLHOOK RegShellHook; REGSHELLHOOK RegShellHook;
@ -1405,8 +1437,6 @@ TaskSwitchWnd_Create(IN OUT PTASK_SWITCH_WND This)
RegShellHook(This->hWnd, RegShellHook(This->hWnd,
3); /* 1 if no NT! We're targeting NT so we don't care! */ 3); /* 1 if no NT! We're targeting NT so we don't care! */
} }
FreeLibrary(hShell32);
} }
/* Add all windows to the toolbar */ /* Add all windows to the toolbar */
@ -1434,7 +1464,7 @@ TaskSwitchWnd_NCDestroy(IN OUT PTASK_SWITCH_WND This)
This->IsDestroying = TRUE; This->IsDestroying = TRUE;
/* Unregister the shell hook */ /* Unregister the shell hook */
hShell32 = LoadLibrary(TEXT("SHELL32.DLL")); hShell32 = GetModuleHandle(TEXT("SHELL32.DLL"));
if (hShell32 != NULL) if (hShell32 != NULL)
{ {
REGSHELLHOOK RegShellHook; REGSHELLHOOK RegShellHook;
@ -1447,8 +1477,6 @@ TaskSwitchWnd_NCDestroy(IN OUT PTASK_SWITCH_WND This)
RegShellHook(This->hWnd, RegShellHook(This->hWnd,
FALSE); FALSE);
} }
FreeLibrary(hShell32);
} }
TaskSwitchWnd_DeleteAllTasks(This); TaskSwitchWnd_DeleteAllTasks(This);
@ -1604,16 +1632,21 @@ TaskSwichWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This,
HFONT hCaptionFont, hBoldCaptionFont; HFONT hCaptionFont, hBoldCaptionFont;
LRESULT Ret = CDRF_DODEFAULT; LRESULT Ret = CDRF_DODEFAULT;
HMODULE hUser32; HMODULE hUser32;
PTASK_GROUP TaskGroup;
PTASK_ITEM TaskItem;
#if TASK_USE_DRAWCAPTIONTEMP != 0 #if TASK_USE_DRAWCAPTIONTEMP != 0
UINT uidctFlags = DC_TEXT | DC_ICON | DC_NOSENDMSG; UINT uidctFlags = DC_TEXT | DC_ICON | DC_NOSENDMSG;
#endif #endif
TaskItem = FindTaskItemByIndex(This,
if (!IS_TASKGROUP_PTR(nmtbcd->nmcd.lItemlParam)) (INT)nmtbcd->nmcd.dwItemSpec);
TaskGroup = FindTaskGroupByIndex(This,
(INT)nmtbcd->nmcd.dwItemSpec);
if (TaskGroup == NULL && TaskItem != NULL)
{ {
PTASK_ITEM TaskItem = GET_TASKITEM_PTR(nmtbcd->nmcd.lItemlParam); ASSERT(TaskItem != NULL);
if (TaskItem != NULL && IsWindow(TaskItem->hWnd)) if (TaskItem != NULL && IsWindow(TaskItem->hWnd))
{ {
@ -1717,14 +1750,9 @@ TaskSwichWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This,
} }
} }
else else if (TaskGroup != NULL)
{ {
PTASK_GROUP TaskGroup = GET_TASKGROUP_PTR(nmtbcd->nmcd.lItemlParam); /* FIXME: Implement painting for task groups */
if (TaskGroup != NULL)
{
/* FIXME: Implement painting for task groups */
}
} }
return Ret; return Ret;

View file

@ -202,10 +202,17 @@ ITrayBandSiteImpl_OnLoad(IN OUT ITrayBandSite *iface,
if (SUCCEEDED(hRet)) if (SUCCEEDED(hRet))
{ {
/* Now let's read the CLSID from the stream and see if it's our task band */ /* Now let's read the CLSID from the stream and see if it's our task band */
#if defined(IStream_Read)
hRet = IStream_Read(pStm, hRet = IStream_Read(pStm,
&clsid, &clsid,
sizeof(clsid), sizeof(clsid),
&ulRead); &ulRead);
#else
ulRead = sizeof(clsid);
hRet = IStream_Read(pStm,
&clsid,
sizeof(clsid));
#endif
if (SUCCEEDED(hRet) && ulRead == sizeof(clsid)) if (SUCCEEDED(hRet) && ulRead == sizeof(clsid))
{ {
if (IsEqualGUID(&clsid, if (IsEqualGUID(&clsid,
@ -350,7 +357,7 @@ ITrayBandSiteImpl_ProcessMessage(IN OUT ITrayBandSite *iface,
shell behavior! */ shell behavior! */
if (This->WindowEventHandler != NULL) if (This->WindowEventHandler != NULL)
{ {
DbgPrint("Calling IWindowEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p) This->hWndRebar=0x%p\n", hWnd, uMsg, wParam, lParam, plResult, This->hWndRebar); /*DbgPrint("Calling IWindowEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p) This->hWndRebar=0x%p\n", hWnd, uMsg, wParam, lParam, plResult, This->hWndRebar);*/
hRet = IWindowEventHandler_ProcessMessage(This->WindowEventHandler, hRet = IWindowEventHandler_ProcessMessage(This->WindowEventHandler,
hWnd, hWnd,
uMsg, uMsg,

View file

@ -1,6 +1,10 @@
#ifndef __TODO_H #ifndef __TODO_H
#define __TODO_H #define __TODO_H
#ifdef INTERFACE
#undef INTERFACE
#endif
/* FIXME: Ugly hack!!! FIX ASAP! Move to uuid! */ /* FIXME: Ugly hack!!! FIX ASAP! Move to uuid! */
static const GUID IID_HACK_IShellView2 = {0x88E39E80,0x3578,0x11CF,{0xAE,0x69,0x08,0x00,0x2B,0x2E,0x12,0x62}}; static const GUID IID_HACK_IShellView2 = {0x88E39E80,0x3578,0x11CF,{0xAE,0x69,0x08,0x00,0x2B,0x2E,0x12,0x62}};
#define IID_IShellView2 IID_HACK_IShellView2 #define IID_IShellView2 IID_HACK_IShellView2

View file

@ -159,7 +159,7 @@ TrayClockWnd_GetMinimumSize(IN OUT PTRAY_CLOCK_WND_DATA This,
{ {
if (Horizontal) if (Horizontal)
{ {
if (szMax.cy + This->LineSizes[i].cy + This->LineSpacing > if (szMax.cy + This->LineSizes[i].cy + (LONG)This->LineSpacing >
pSize->cy - (2 * TRAY_CLOCK_WND_SPACING_Y)) pSize->cy - (2 * TRAY_CLOCK_WND_SPACING_Y))
{ {
break; break;

View file

@ -1010,8 +1010,7 @@ ITrayWindowImpl_UpdateStartButton(IN OUT ITrayWindowImpl *This,
sizeof(bmp), sizeof(bmp),
&bmp) != 0) &bmp) != 0)
{ {
Size.cx += max(bmp.bmWidth, Size.cx += bmp.bmWidth;
GetSystemMetrics(SM_CXMINIMIZED));
Size.cy += max(bmp.bmHeight, Size.cy += max(bmp.bmHeight,
GetSystemMetrics(SM_CYCAPTION)); GetSystemMetrics(SM_CYCAPTION));
} }