mirror of
https://github.com/reactos/reactos.git
synced 2024-10-01 23:14:53 +00:00
[SHELL32]
- CDesktopBrowser: Implement support for multiple monitors. This needs to be disabled since we don't support LVM_SETWORKAREAS in comctl32 yet. Till then confine the desktop window in the default monitor. svn path=/trunk/; revision=72834
This commit is contained in:
parent
17cc431d33
commit
1b795376fc
|
@ -20,6 +20,13 @@
|
||||||
|
|
||||||
#include "shelldesktop.h"
|
#include "shelldesktop.h"
|
||||||
|
|
||||||
|
// Support for multiple monitors is disabled till LVM_SETWORKAREAS gets implemented
|
||||||
|
#ifdef MULTIMONITOR_SUPPORT
|
||||||
|
#include <atlcoll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(desktop);
|
WINE_DEFAULT_DEBUG_CHANNEL(desktop);
|
||||||
|
|
||||||
static const WCHAR szProgmanClassName[] = L"Progman";
|
static const WCHAR szProgmanClassName[] = L"Progman";
|
||||||
|
@ -38,6 +45,7 @@ private:
|
||||||
CComPtr<IShellView> m_ShellView;
|
CComPtr<IShellView> m_ShellView;
|
||||||
|
|
||||||
LRESULT _NotifyTray(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
LRESULT _NotifyTray(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
|
HRESULT _Resize();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CDesktopBrowser();
|
CDesktopBrowser();
|
||||||
|
@ -109,6 +117,72 @@ CDesktopBrowser::~CDesktopBrowser()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MULTIMONITOR_SUPPORT
|
||||||
|
BOOL CALLBACK MonitorEnumProc(
|
||||||
|
_In_ HMONITOR hMonitor,
|
||||||
|
_In_ HDC hdcMonitor,
|
||||||
|
_In_ LPRECT lprcMonitor,
|
||||||
|
_In_ LPARAM dwData
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CAtlList<RECT> *list = (CAtlList<RECT>*)dwData;
|
||||||
|
MONITORINFO MonitorInfo;
|
||||||
|
MonitorInfo.cbSize = sizeof(MonitorInfo);
|
||||||
|
if (::GetMonitorInfoW(hMonitor, &MonitorInfo))
|
||||||
|
{
|
||||||
|
list->AddTail(MonitorInfo.rcWork);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HRESULT CDesktopBrowser::_Resize()
|
||||||
|
{
|
||||||
|
RECT rcNewSize;
|
||||||
|
|
||||||
|
#ifdef MULTIMONITOR_SUPPORT
|
||||||
|
|
||||||
|
UINT cMonitors = GetSystemMetrics(SM_CMONITORS);
|
||||||
|
if (cMonitors == 1)
|
||||||
|
{
|
||||||
|
SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcNewSize, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetRect(&rcNewSize,
|
||||||
|
GetSystemMetrics(SM_XVIRTUALSCREEN),
|
||||||
|
GetSystemMetrics(SM_YVIRTUALSCREEN),
|
||||||
|
GetSystemMetrics(SM_XVIRTUALSCREEN) + GetSystemMetrics(SM_CXVIRTUALSCREEN),
|
||||||
|
GetSystemMetrics(SM_YVIRTUALSCREEN) + GetSystemMetrics(SM_CYVIRTUALSCREEN));
|
||||||
|
}
|
||||||
|
|
||||||
|
::MoveWindow(m_hWnd, rcNewSize.left, rcNewSize.top, rcNewSize.right - rcNewSize.left, rcNewSize.bottom - rcNewSize.top, FALSE);
|
||||||
|
::MoveWindow(m_hWndShellView, 0, 0, rcNewSize.right - rcNewSize.left, rcNewSize.bottom - rcNewSize.top, FALSE);
|
||||||
|
|
||||||
|
if (cMonitors != 1)
|
||||||
|
{
|
||||||
|
CAtlList<RECT> list;
|
||||||
|
EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, (LPARAM)&list);
|
||||||
|
RECT* prcWorkAreas = new RECT[list.GetCount()];
|
||||||
|
int i = 0;
|
||||||
|
for (POSITION it = list.GetHeadPosition(); it; list.GetNext(it))
|
||||||
|
prcWorkAreas[i++] = list.GetAt(it);
|
||||||
|
|
||||||
|
HWND hwndListView = FindWindowExW(m_hWndShellView, NULL, WC_LISTVIEW, NULL);
|
||||||
|
|
||||||
|
::SendMessageW(hwndListView, LVM_SETWORKAREAS , i, (LPARAM)prcWorkAreas);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcNewSize, 0);
|
||||||
|
::MoveWindow(m_hWnd, rcNewSize.left, rcNewSize.top, rcNewSize.right - rcNewSize.left, rcNewSize.bottom - rcNewSize.top, FALSE);
|
||||||
|
::MoveWindow(m_hWndShellView, 0, 0, rcNewSize.right - rcNewSize.left, rcNewSize.bottom - rcNewSize.top, FALSE);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
HRESULT CDesktopBrowser::Initialize(IShellDesktopTray *ShellDesk)
|
HRESULT CDesktopBrowser::Initialize(IShellDesktopTray *ShellDesk)
|
||||||
{
|
{
|
||||||
CComPtr<IShellFolder> psfDesktop;
|
CComPtr<IShellFolder> psfDesktop;
|
||||||
|
@ -117,25 +191,9 @@ HRESULT CDesktopBrowser::Initialize(IShellDesktopTray *ShellDesk)
|
||||||
if (FAILED_UNEXPECTEDLY(hRet))
|
if (FAILED_UNEXPECTEDLY(hRet))
|
||||||
return hRet;
|
return hRet;
|
||||||
|
|
||||||
/* Calculate the size and pos of the window */
|
|
||||||
RECT rect;
|
|
||||||
if (!GetSystemMetrics(SM_CXVIRTUALSCREEN) || !GetSystemMetrics(SM_CYVIRTUALSCREEN))
|
|
||||||
{
|
|
||||||
SetRect(&rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SetRect(&rect,
|
|
||||||
GetSystemMetrics(SM_XVIRTUALSCREEN),
|
|
||||||
GetSystemMetrics(SM_YVIRTUALSCREEN),
|
|
||||||
GetSystemMetrics(SM_XVIRTUALSCREEN) + GetSystemMetrics(SM_CXVIRTUALSCREEN),
|
|
||||||
GetSystemMetrics(SM_YVIRTUALSCREEN) + GetSystemMetrics(SM_CYVIRTUALSCREEN));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
m_Tray = ShellDesk;
|
m_Tray = ShellDesk;
|
||||||
|
|
||||||
Create(NULL, &rect, szProgmanWindowName, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW);
|
Create(NULL, NULL, szProgmanWindowName, WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW);
|
||||||
if (!m_hWnd)
|
if (!m_hWnd)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
|
@ -149,29 +207,15 @@ HRESULT CDesktopBrowser::Initialize(IShellDesktopTray *ShellDesk)
|
||||||
return hRet;
|
return hRet;
|
||||||
|
|
||||||
FOLDERSETTINGS fs;
|
FOLDERSETTINGS fs;
|
||||||
RECT rcWorkArea;
|
RECT rcShellView = {0,0,0,0};
|
||||||
|
|
||||||
// FIXME: Add support for multi-monitor?
|
|
||||||
SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
|
||||||
|
|
||||||
// TODO: Call GetClientRect for the tray window and make small computation
|
|
||||||
// to be sure the tray window rect is removed from the work area!
|
|
||||||
#if 0
|
|
||||||
RECT rcTray;
|
|
||||||
HWND hWndTray;
|
|
||||||
|
|
||||||
/* Get client rect of the taskbar */
|
|
||||||
hRet = m_Tray->GetTrayWindow(&hWndTray);
|
|
||||||
if (SUCCEEDED(hRet))
|
|
||||||
GetClientRect(hWndTray, &rcTray);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fs.ViewMode = FVM_ICON;
|
fs.ViewMode = FVM_ICON;
|
||||||
fs.fFlags = FWF_DESKTOP | FWF_NOCLIENTEDGE | FWF_NOSCROLL | FWF_TRANSPARENT;
|
fs.fFlags = FWF_DESKTOP | FWF_NOCLIENTEDGE | FWF_NOSCROLL | FWF_TRANSPARENT;
|
||||||
hRet = m_ShellView->CreateViewWindow(NULL, &fs, (IShellBrowser *)this, &rcWorkArea, &m_hWndShellView);
|
hRet = m_ShellView->CreateViewWindow(NULL, &fs, (IShellBrowser *)this, &rcShellView, &m_hWndShellView);
|
||||||
if (FAILED_UNEXPECTEDLY(hRet))
|
if (FAILED_UNEXPECTEDLY(hRet))
|
||||||
return hRet;
|
return hRet;
|
||||||
|
|
||||||
|
_Resize();
|
||||||
|
|
||||||
HWND hwndListView = FindWindowExW(m_hWndShellView, NULL, WC_LISTVIEW, NULL);
|
HWND hwndListView = FindWindowExW(m_hWndShellView, NULL, WC_LISTVIEW, NULL);
|
||||||
SetShellWindowEx(m_hWnd, hwndListView);
|
SetShellWindowEx(m_hWnd, hwndListView);
|
||||||
|
|
||||||
|
@ -335,17 +379,6 @@ LRESULT CDesktopBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
|
||||||
/* Hey, we're the desktop!!! */
|
/* Hey, we're the desktop!!! */
|
||||||
::ShowWindow(m_hWnd, SW_RESTORE);
|
::ShowWindow(m_hWnd, SW_RESTORE);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
RECT rcDesktop;
|
|
||||||
rcDesktop.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
|
|
||||||
rcDesktop.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
|
|
||||||
rcDesktop.right = GetSystemMetrics(SM_CXVIRTUALSCREEN);
|
|
||||||
rcDesktop.bottom = GetSystemMetrics(SM_CYVIRTUALSCREEN);
|
|
||||||
|
|
||||||
/* FIXME: Update work area */
|
|
||||||
DBG_UNREFERENCED_LOCAL_VARIABLE(rcDesktop);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -358,22 +391,11 @@ LRESULT CDesktopBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam
|
||||||
SendMessageW(m_hWndShellView, uMsg, wParam, lParam);
|
SendMessageW(m_hWndShellView, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (uMsg == WM_SETTINGCHANGE && wParam == SPI_SETWORKAREA &&
|
if (uMsg == WM_SETTINGCHANGE && wParam == SPI_SETWORKAREA && m_hWndShellView != NULL)
|
||||||
m_hWndShellView != NULL)
|
|
||||||
{
|
{
|
||||||
RECT rcWorkArea;
|
_Resize();
|
||||||
|
|
||||||
// FIXME: Add support for multi-monitor!
|
|
||||||
// FIXME: Maybe merge with the code that retrieves the
|
|
||||||
// work area in CDesktopBrowser::CreateDeskWnd ?
|
|
||||||
SystemParametersInfoW(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
|
||||||
|
|
||||||
::SetWindowPos(m_hWndShellView, NULL,
|
|
||||||
rcWorkArea.left, rcWorkArea.top,
|
|
||||||
rcWorkArea.right - rcWorkArea.left,
|
|
||||||
rcWorkArea.bottom - rcWorkArea.top,
|
|
||||||
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue