Author: mjmartin
Date: Sun Jan 30 03:56:40 2011
New Revision: 50568

URL: http://svn.reactos.org/svn/reactos?rev=50568&view=rev
Log:
[EXPLORER_NEW]
Implement resizing the work area.
Patch by greenie (greenie__ at hotmail dot com)

See issue #5846 for more details.

Modified:
    trunk/reactos/base/shell/explorer-new/traywnd.c

Modified: trunk/reactos/base/shell/explorer-new/traywnd.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer-new/traywnd.c?rev=50568&r1=50567&r2=50568&view=diff
==============================================================================
--- trunk/reactos/base/shell/explorer-new/traywnd.c [iso-8859-1] (original)
+++ trunk/reactos/base/shell/explorer-new/traywnd.c [iso-8859-1] Sun Jan 30 
03:56:40 2011
@@ -59,6 +59,7 @@
 
     DWORD Position;
     HMONITOR Monitor;
+    HMONITOR PreviousMonitor;
     DWORD DraggingPosition;
     HMONITOR DraggingMonitor;
 
@@ -230,7 +231,7 @@
         MONITORINFO mi;
 
         mi.cbSize = sizeof(mi);
-        if (!GetMonitorInfo(This->Monitor,
+        if (!GetMonitorInfo(hMonitor,
                             &mi))
         {
             /* Hm, the monitor is gone? Try to find a monitor where it
@@ -640,6 +641,57 @@
 }
 
 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
 ITrayWindowImpl_CheckTrayWndPosition(IN OUT ITrayWindowImpl *This)
 {
     RECT rcTray;
@@ -655,6 +707,8 @@
                  rcTray.right - rcTray.left,
                  rcTray.bottom - rcTray.top,
                  SWP_NOZORDER);
+
+    ITrayWindowImpl_ResizeWorkArea(This);
 
     ITrayWindowImpl_ApplyClipping(This,
                                   TRUE);
@@ -1954,6 +2008,7 @@
 
                 if (wParam == SIZE_RESTORED && lParam == 0)
                 {
+                    ITrayWindowImpl_ResizeWorkArea(This);
                     /* Clip the tray window on multi monitor systems so the 
edges can't
                        overlap into another monitor */
                     ITrayWindowImpl_ApplyClipping(This,


Reply via email to