reactos/base/shell/explorer/appbar.h
Katayama Hirofumi MZ 2fd0af4f8f
[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.
2025-06-03 06:59:30 +09:00

117 lines
3.6 KiB
C++

/*
* PROJECT: ReactOS Explorer
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: AppBar implementation
* COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#pragma once
typedef struct tagAPPBAR
{
HWND hWnd;
UINT uCallbackMessage;
UINT uEdge;
RECT rc;
} APPBAR, *PAPPBAR;
static inline PAPPBARDATAINTEROP
AppBar_LockOutput(_In_ PAPPBAR_COMMAND pData)
{
return (PAPPBARDATAINTEROP)SHLockShared((HANDLE)pData->hOutput, pData->dwProcessId);
}
static inline VOID
AppBar_UnLockOutput(_Out_ PAPPBARDATAINTEROP pOutput)
{
SHUnlockShared(pOutput);
}
static inline BOOL
Edge_IsVertical(_In_ UINT uEdge)
{
return uEdge == ABE_TOP || uEdge == ABE_BOTTOM;
}
// Return value of CAppBarManager::RecomputeWorkArea
enum WORKAREA_TYPE
{
WORKAREA_NO_TRAY_AREA = 0,
WORKAREA_IS_NOT_MONITOR = 1,
WORKAREA_SAME_AS_MONITOR = 2,
};
class CAppBarManager
{
public:
CAppBarManager();
virtual ~CAppBarManager();
LRESULT OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
protected:
HDPA m_hAppBarDPA; // DPA (Dynamic Pointer Array)
HWND m_ahwndAutoHideBars[4]; // The side --> auto-hide window
PAPPBAR FindAppBar(_In_ HWND hwndAppBar) const;
void EliminateAppBar(_In_ INT iItem);
void DestroyAppBarDPA();
void AppBarSubtractRect(_In_ PAPPBAR pAppBar, _Inout_ PRECT prc);
BOOL AppBarOutsideOf(_In_ const APPBAR *pAppBar1, _In_ const APPBAR *pAppBar2);
void ComputeHiddenRect(_Inout_ PRECT prc, _In_ UINT uSide);
PAPPBAR_COMMAND GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
void GetDockedRect(_Out_ PRECT prcDocked);
BOOL SetAutoHideBar(_In_ HWND hwndTarget, _In_ BOOL bSetOrReset, _In_ UINT uSide);
void OnAppBarActivationChange2(_In_ HWND hwndNewAutoHide, _In_ UINT uSide);
BOOL OnAppBarNew(_In_ const APPBAR_COMMAND *pData);
void OnAppBarRemove(_In_ const APPBAR_COMMAND *pData);
void OnAppBarQueryPos(_Inout_ PAPPBAR_COMMAND pData);
void OnAppBarSetPos(_Inout_ PAPPBAR_COMMAND pData);
UINT OnAppBarGetState();
BOOL OnAppBarGetTaskbarPos(_Inout_ PAPPBAR_COMMAND pData);
void OnAppBarActivationChange(_In_ const APPBAR_COMMAND *pData);
HWND OnAppBarGetAutoHideBar(_In_ UINT uSide);
BOOL OnAppBarSetAutoHideBar(_In_ const APPBAR_COMMAND *pData);
void OnAppBarSetState(_In_ UINT uState);
void OnAppBarNotifyAll(
_In_opt_ HMONITOR hMon,
_In_opt_ HWND hwndIgnore,
_In_ DWORD dwNotify,
_In_opt_ LPARAM lParam);
WORKAREA_TYPE
RecomputeWorkArea(
_In_ const RECT *prcTray,
_In_ HMONITOR hMonitor,
_Out_ PRECT prcWorkArea);
void RecomputeAllWorkareas();
void StuckAppChange(
_In_opt_ HWND hwndTarget,
_In_opt_ const RECT *prcOld,
_In_opt_ const RECT *prcNew,
_In_ BOOL bTray);
void RedrawDesktop(_In_ HWND hwndDesktop, _Inout_ PRECT prc);
virtual BOOL IsAutoHideState() const = 0;
virtual BOOL IsHidingState() const = 0;
virtual BOOL IsAlwaysOnTop() const = 0;
virtual HMONITOR& GetMonitor() = 0;
virtual HMONITOR& GetPreviousMonitor() = 0;
virtual INT GetPosition() const = 0;
virtual const RECT* GetTrayRect() = 0;
virtual HWND GetTrayWnd() const = 0;
virtual HWND GetDesktopWnd() const = 0;
virtual void SetAutoHideState(_In_ BOOL bAutoHide) = 0;
virtual void UpdateAlwaysOnTop(_In_ BOOL bAlwaysOnTop) = 0;
static BOOL CALLBACK
MonitorEnumProc(
_In_ HMONITOR hMonitor,
_In_ HDC hDC,
_In_ LPRECT prc,
_Inout_ LPARAM lParam);
};