Reactos
1/*
2 * PROJECT: ReactOS Explorer
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: AppBar implementation
5 * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8#pragma once
9
10typedef struct tagAPPBAR
11{
12 HWND hWnd;
13 UINT uCallbackMessage;
14 UINT uEdge;
15 RECT rc;
16} APPBAR, *PAPPBAR;
17
18static inline PAPPBARDATAINTEROP
19AppBar_LockOutput(_In_ PAPPBAR_COMMAND pData)
20{
21 return (PAPPBARDATAINTEROP)SHLockShared((HANDLE)pData->hOutput, pData->dwProcessId);
22}
23
24static inline VOID
25AppBar_UnLockOutput(_Out_ PAPPBARDATAINTEROP pOutput)
26{
27 SHUnlockShared(pOutput);
28}
29
30static inline BOOL
31Edge_IsVertical(_In_ UINT uEdge)
32{
33 return uEdge == ABE_TOP || uEdge == ABE_BOTTOM;
34}
35
36// Return value of CAppBarManager::RecomputeWorkArea
37enum WORKAREA_TYPE
38{
39 WORKAREA_NO_TRAY_AREA = 0,
40 WORKAREA_IS_NOT_MONITOR = 1,
41 WORKAREA_SAME_AS_MONITOR = 2,
42};
43
44class CAppBarManager
45{
46public:
47 CAppBarManager();
48 virtual ~CAppBarManager();
49
50 LRESULT OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
51
52protected:
53 HDPA m_hAppBarDPA; // DPA (Dynamic Pointer Array)
54 HWND m_ahwndAutoHideBars[4]; // The side --> auto-hide window
55
56 PAPPBAR FindAppBar(_In_ HWND hwndAppBar) const;
57 void EliminateAppBar(_In_ INT iItem);
58 void DestroyAppBarDPA();
59 void AppBarSubtractRect(_In_ PAPPBAR pAppBar, _Inout_ PRECT prc);
60 BOOL AppBarOutsideOf(_In_ const APPBAR *pAppBar1, _In_ const APPBAR *pAppBar2);
61 void ComputeHiddenRect(_Inout_ PRECT prc, _In_ UINT uSide);
62 PAPPBAR_COMMAND GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
63 void GetDockedRect(_Out_ PRECT prcDocked);
64 BOOL SetAutoHideBar(_In_ HWND hwndTarget, _In_ BOOL bSetOrReset, _In_ UINT uSide);
65 void OnAppBarActivationChange2(_In_ HWND hwndNewAutoHide, _In_ UINT uSide);
66
67 BOOL OnAppBarNew(_In_ const APPBAR_COMMAND *pData);
68 void OnAppBarRemove(_In_ const APPBAR_COMMAND *pData);
69 void OnAppBarQueryPos(_Inout_ PAPPBAR_COMMAND pData);
70 void OnAppBarSetPos(_Inout_ PAPPBAR_COMMAND pData);
71 UINT OnAppBarGetState();
72 BOOL OnAppBarGetTaskbarPos(_Inout_ PAPPBAR_COMMAND pData);
73 void OnAppBarActivationChange(_In_ const APPBAR_COMMAND *pData);
74 HWND OnAppBarGetAutoHideBar(_In_ UINT uSide);
75 BOOL OnAppBarSetAutoHideBar(_In_ const APPBAR_COMMAND *pData);
76 void OnAppBarSetState(_In_ UINT uState);
77
78 void OnAppBarNotifyAll(
79 _In_opt_ HMONITOR hMon,
80 _In_opt_ HWND hwndIgnore,
81 _In_ DWORD dwNotify,
82 _In_opt_ LPARAM lParam);
83
84 WORKAREA_TYPE
85 RecomputeWorkArea(
86 _In_ const RECT *prcTray,
87 _In_ HMONITOR hMonitor,
88 _Out_ PRECT prcWorkArea);
89 void RecomputeAllWorkareas();
90
91 void StuckAppChange(
92 _In_opt_ HWND hwndTarget,
93 _In_opt_ const RECT *prcOld,
94 _In_opt_ const RECT *prcNew,
95 _In_ BOOL bTray);
96
97 void RedrawDesktop(_In_ HWND hwndDesktop, _Inout_ PRECT prc);
98
99 virtual BOOL IsAutoHideState() const = 0;
100 virtual BOOL IsHidingState() const = 0;
101 virtual BOOL IsAlwaysOnTop() const = 0;
102 virtual HMONITOR& GetMonitor() = 0;
103 virtual HMONITOR& GetPreviousMonitor() = 0;
104 virtual INT GetPosition() const = 0;
105 virtual const RECT* GetTrayRect() = 0;
106 virtual HWND GetTrayWnd() const = 0;
107 virtual HWND GetDesktopWnd() const = 0;
108 virtual void SetAutoHideState(_In_ BOOL bAutoHide) = 0;
109 virtual void UpdateAlwaysOnTop(_In_ BOOL bAlwaysOnTop) = 0;
110
111 static BOOL CALLBACK
112 MonitorEnumProc(
113 _In_ HMONITOR hMonitor,
114 _In_ HDC hDC,
115 _In_ LPRECT prc,
116 _Inout_ LPARAM lParam);
117};