Reactos
at master 117 lines 3.6 kB view raw
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};