[EXPLORER_NEW]

Implement resizing the work area.
Patch by greenie (greenie__ at hotmail dot com)

See issue #5846 for more details.

svn path=/trunk/; revision=50568
This commit is contained in:
Michael Martin 2011-01-30 03:56:40 +00:00
parent 72664fe2d6
commit 613f1bbf85

View file

@ -59,6 +59,7 @@ typedef struct
DWORD Position; DWORD Position;
HMONITOR Monitor; HMONITOR Monitor;
HMONITOR PreviousMonitor;
DWORD DraggingPosition; DWORD DraggingPosition;
HMONITOR DraggingMonitor; HMONITOR DraggingMonitor;
@ -230,7 +231,7 @@ ITrayWindowImpl_GetScreenRect(IN OUT ITrayWindowImpl *This,
MONITORINFO mi; MONITORINFO mi;
mi.cbSize = sizeof(mi); mi.cbSize = sizeof(mi);
if (!GetMonitorInfo(This->Monitor, if (!GetMonitorInfo(hMonitor,
&mi)) &mi))
{ {
/* Hm, the monitor is gone? Try to find a monitor where it /* Hm, the monitor is gone? Try to find a monitor where it
@ -639,6 +640,57 @@ ITrayWindowImpl_ApplyClipping(IN OUT ITrayWindowImpl *This,
} }
} }
static VOID
ITrayWindowImpl_ResizeWorkArea(IN OUT ITrayWindowImpl *This)
{
RECT rcTray,rcWorkArea;
/* If monitor has changed then fix the previous monitors work area */
if(This->PreviousMonitor!=This->Monitor)
{
ITrayWindowImpl_GetScreenRect(This,
This->PreviousMonitor,
&rcWorkArea);
SystemParametersInfo(SPI_SETWORKAREA,
1,
&rcWorkArea,
SPIF_SENDCHANGE);
}
rcTray = This->rcTrayWnd[This->Position];
ITrayWindowImpl_GetScreenRect(This,
This->Monitor,
&rcWorkArea);
This->PreviousMonitor=This->Monitor;
/* If AutoHide is false then change the workarea to exclude the area that
the taskbar covers. */
if(!This->AutoHide)
{
switch(This->Position)
{
case ABE_TOP:
rcWorkArea.top=rcTray.bottom;
break;
case ABE_LEFT:
rcWorkArea.left=rcTray.right;
break;
case ABE_RIGHT:
rcWorkArea.right=rcTray.left;
break;
case ABE_BOTTOM:
rcWorkArea.bottom=rcTray.top;
break;
}
}
SystemParametersInfo(SPI_SETWORKAREA,
1,
&rcWorkArea,
SPIF_SENDCHANGE);
}
static VOID static VOID
ITrayWindowImpl_CheckTrayWndPosition(IN OUT ITrayWindowImpl *This) ITrayWindowImpl_CheckTrayWndPosition(IN OUT ITrayWindowImpl *This)
{ {
@ -656,6 +708,8 @@ ITrayWindowImpl_CheckTrayWndPosition(IN OUT ITrayWindowImpl *This)
rcTray.bottom - rcTray.top, rcTray.bottom - rcTray.top,
SWP_NOZORDER); SWP_NOZORDER);
ITrayWindowImpl_ResizeWorkArea(This);
ITrayWindowImpl_ApplyClipping(This, ITrayWindowImpl_ApplyClipping(This,
TRUE); TRUE);
} }
@ -1954,6 +2008,7 @@ TrayWndProc(IN HWND hwnd,
if (wParam == SIZE_RESTORED && lParam == 0) if (wParam == SIZE_RESTORED && lParam == 0)
{ {
ITrayWindowImpl_ResizeWorkArea(This);
/* Clip the tray window on multi monitor systems so the edges can't /* Clip the tray window on multi monitor systems so the edges can't
overlap into another monitor */ overlap into another monitor */
ITrayWindowImpl_ApplyClipping(This, ITrayWindowImpl_ApplyClipping(This,