mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 20:43:00 +00:00
[EXPLORER] AppBar Part 3 (#7966)
Follow-up of #7946. JIRA issue: CORE-7237 - Implement ABM_GETSTATE, ABM_GETTASKBARPOS, ABM_ACTIVATE, ABM_WINDOWPOSCHANGED, ABM_GETAUTOHIDEBAR, ABM_SETAUTOHIDEBAR, and ABM_SETSTATE appbar messages. - Implement TWM_SETZORDER tray message.
This commit is contained in:
parent
2543e2179c
commit
2fd0af4f8f
4 changed files with 199 additions and 46 deletions
|
@ -11,6 +11,7 @@
|
|||
|
||||
CAppBarManager::CAppBarManager()
|
||||
: m_hAppBarDPA(NULL)
|
||||
, m_ahwndAutoHideBars { 0 }
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -450,13 +451,40 @@ void CAppBarManager::RecomputeAllWorkareas()
|
|||
::EnumDisplayMonitors(NULL, NULL, CAppBarManager::MonitorEnumProc, (LPARAM)this);
|
||||
}
|
||||
|
||||
BOOL CAppBarManager::SetAutoHideBar(_In_ HWND hwndTarget, _In_ BOOL bSetOrReset, _In_ UINT uSide)
|
||||
{
|
||||
ATLASSERT(uSide < _countof(m_ahwndAutoHideBars));
|
||||
HWND *phwndAutoHide = &m_ahwndAutoHideBars[uSide];
|
||||
if (!IsWindow(*phwndAutoHide))
|
||||
*phwndAutoHide = NULL;
|
||||
|
||||
if (bSetOrReset) // Set?
|
||||
{
|
||||
if (!*phwndAutoHide)
|
||||
*phwndAutoHide = hwndTarget;
|
||||
return *phwndAutoHide == hwndTarget;
|
||||
}
|
||||
else // Reset
|
||||
{
|
||||
if (*phwndAutoHide == hwndTarget)
|
||||
*phwndAutoHide = NULL;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void CAppBarManager::OnAppBarActivationChange2(_In_ HWND hwndNewAutoHide, _In_ UINT uSide)
|
||||
{
|
||||
HWND hwndAutoHideBar = OnAppBarGetAutoHideBar(uSide);
|
||||
if (hwndAutoHideBar && hwndAutoHideBar != hwndNewAutoHide)
|
||||
::PostMessageW(GetTrayWnd(), TWM_SETZORDER, (WPARAM)hwndAutoHideBar, uSide);
|
||||
}
|
||||
|
||||
PAPPBAR_COMMAND
|
||||
CAppBarManager::GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
|
||||
{
|
||||
PAPPBAR_COMMAND pData = (PAPPBAR_COMMAND)pCopyData->lpData;
|
||||
|
||||
if (pCopyData->cbData != sizeof(*pData) ||
|
||||
pData->abd.cbSize != sizeof(pData->abd))
|
||||
if (pCopyData->cbData != sizeof(*pData) || pData->abd.cbSize != sizeof(pData->abd))
|
||||
{
|
||||
ERR("Invalid AppBar message\n");
|
||||
return NULL;
|
||||
|
@ -465,6 +493,80 @@ CAppBarManager::GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
|
|||
return pData;
|
||||
}
|
||||
|
||||
// ABM_GETSTATE
|
||||
UINT CAppBarManager::OnAppBarGetState()
|
||||
{
|
||||
return (IsAutoHideState() ? ABS_AUTOHIDE : 0) | (IsAlwaysOnTop() ? ABS_ALWAYSONTOP : 0);
|
||||
}
|
||||
|
||||
// ABM_GETTASKBARPOS
|
||||
BOOL CAppBarManager::OnAppBarGetTaskbarPos(_Inout_ PAPPBAR_COMMAND pData)
|
||||
{
|
||||
PAPPBARDATAINTEROP pOutput = AppBar_LockOutput(pData);
|
||||
if (!pOutput)
|
||||
{
|
||||
ERR("!pOutput: %d\n", pData->dwProcessId);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pOutput->rc = *GetTrayRect();
|
||||
pOutput->uEdge = GetPosition();
|
||||
|
||||
AppBar_UnLockOutput(pOutput);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ABM_ACTIVATE, ABM_WINDOWPOSCHANGED
|
||||
void CAppBarManager::OnAppBarActivationChange(_In_ const APPBAR_COMMAND *pData)
|
||||
{
|
||||
HWND hWnd = (HWND)UlongToHandle(pData->abd.hWnd32);
|
||||
PAPPBAR pAppBar = FindAppBar(hWnd);
|
||||
if (!pAppBar)
|
||||
{
|
||||
ERR("Not found: %p\n", hWnd);
|
||||
return;
|
||||
}
|
||||
|
||||
HWND hwndAppBar = pAppBar->hWnd;
|
||||
for (UINT uSide = ABE_LEFT; uSide <= ABE_BOTTOM; ++uSide)
|
||||
{
|
||||
if (m_ahwndAutoHideBars[uSide] == hwndAppBar && uSide != pAppBar->uEdge)
|
||||
return;
|
||||
}
|
||||
|
||||
OnAppBarActivationChange2(hwndAppBar, pAppBar->uEdge);
|
||||
}
|
||||
|
||||
// ABM_GETAUTOHIDEBAR
|
||||
HWND CAppBarManager::OnAppBarGetAutoHideBar(_In_ UINT uSide)
|
||||
{
|
||||
if (uSide >= _countof(m_ahwndAutoHideBars))
|
||||
return NULL;
|
||||
|
||||
if (!::IsWindow(m_ahwndAutoHideBars[uSide]))
|
||||
m_ahwndAutoHideBars[uSide] = NULL;
|
||||
return m_ahwndAutoHideBars[uSide];
|
||||
}
|
||||
|
||||
// ABM_SETAUTOHIDEBAR
|
||||
BOOL CAppBarManager::OnAppBarSetAutoHideBar(_In_ const APPBAR_COMMAND *pData)
|
||||
{
|
||||
if (pData->abd.uEdge >= _countof(m_ahwndAutoHideBars))
|
||||
return FALSE;
|
||||
HWND hwndTarget = (HWND)UlongToHandle(pData->abd.hWnd32);
|
||||
return SetAutoHideBar(hwndTarget, (BOOL)pData->abd.lParam64, pData->abd.uEdge);
|
||||
}
|
||||
|
||||
// ABM_SETSTATE
|
||||
void CAppBarManager::OnAppBarSetState(_In_ UINT uState)
|
||||
{
|
||||
if ((uState & ~(ABS_AUTOHIDE | ABS_ALWAYSONTOP)))
|
||||
return;
|
||||
|
||||
SetAutoHideState(!!(uState & ABS_AUTOHIDE));
|
||||
UpdateAlwaysOnTop(!!(uState & ABS_ALWAYSONTOP));
|
||||
}
|
||||
|
||||
// WM_COPYDATA TABDMC_APPBAR
|
||||
LRESULT CAppBarManager::OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
|
||||
{
|
||||
|
@ -485,6 +587,21 @@ LRESULT CAppBarManager::OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
|
|||
case ABM_SETPOS:
|
||||
OnAppBarSetPos(pData);
|
||||
break;
|
||||
case ABM_GETSTATE:
|
||||
return OnAppBarGetState();
|
||||
case ABM_GETTASKBARPOS:
|
||||
return OnAppBarGetTaskbarPos(pData);
|
||||
case ABM_ACTIVATE:
|
||||
case ABM_WINDOWPOSCHANGED:
|
||||
OnAppBarActivationChange(pData);
|
||||
break;
|
||||
case ABM_GETAUTOHIDEBAR:
|
||||
return (LRESULT)OnAppBarGetAutoHideBar(pData->abd.uEdge);
|
||||
case ABM_SETAUTOHIDEBAR:
|
||||
return OnAppBarSetAutoHideBar(pData);
|
||||
case ABM_SETSTATE:
|
||||
OnAppBarSetState((UINT)pData->abd.lParam64);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
FIXME("0x%X\n", pData->dwMessage);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue