[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:
Katayama Hirofumi MZ 2025-06-03 06:59:30 +09:00 committed by GitHub
parent 2543e2179c
commit 2fd0af4f8f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 199 additions and 46 deletions

View file

@ -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);