2022-03-16 21:37:21 +01:00
# pragma once
# include <memory>
2022-03-17 16:56:33 +01:00
# include <deque>
2022-03-18 22:35:51 +01:00
# include <list>
2022-03-16 21:37:21 +01:00
# include "defines.hpp"
# include "debug/Log.hpp"
# include "events/Events.hpp"
2022-03-17 15:53:45 +01:00
# include "config/ConfigManager.hpp"
2022-03-18 20:03:39 +01:00
# include "managers/ThreadManager.hpp"
# include "managers/XWaylandManager.hpp"
2022-06-09 12:46:55 +02:00
# include "managers/input/InputManager.hpp"
2022-03-19 15:59:53 +01:00
# include "managers/LayoutManager.hpp"
2022-03-19 17:48:18 +01:00
# include "managers/KeybindManager.hpp"
2022-03-23 22:01:59 +01:00
# include "managers/AnimationManager.hpp"
2022-05-24 19:42:43 +02:00
# include "managers/EventManager.hpp"
2022-12-05 18:05:15 +01:00
# include "managers/ProtocolManager.hpp"
2023-02-03 12:58:55 +01:00
# include "managers/SessionLockManager.hpp"
2023-02-19 21:54:53 +01:00
# include "managers/HookSystemManager.hpp"
2022-05-28 17:32:19 +02:00
# include "debug/HyprDebugOverlay.hpp"
2023-02-27 13:32:38 +01:00
# include "debug/HyprNotificationOverlay.hpp"
2022-03-17 16:56:33 +01:00
# include "helpers/Monitor.hpp"
2024-02-29 14:03:38 +01:00
# include "desktop/Workspace.hpp"
2024-03-20 02:44:51 +01:00
# include "desktop/Window.hpp"
2022-03-17 20:22:29 +01:00
# include "render/Renderer.hpp"
2022-04-04 19:44:25 +02:00
# include "render/OpenGL.hpp"
2022-04-08 21:40:41 +02:00
# include "hyprerror/HyprError.hpp"
2023-02-27 13:32:38 +01:00
# include "plugins/PluginSystem.hpp"
2023-09-29 17:38:13 +02:00
# include "helpers/Watchdog.hpp"
2022-03-20 15:55:47 +01:00
2023-12-06 23:54:56 +01:00
enum eManagersInitStage {
2023-03-05 14:37:21 +01:00
STAGE_PRIORITY = 0 ,
STAGE_LATE
} ;
2022-03-16 21:37:21 +01:00
class CCompositor {
2022-12-16 18:17:31 +01:00
public :
2022-03-16 21:37:21 +01:00
CCompositor ( ) ;
~ CCompositor ( ) ;
// ------------------ WLR BASICS ------------------ //
2024-05-05 02:07:46 +02:00
wl_display * m_sWLDisplay ;
wl_event_loop * m_sWLEventLoop ;
wlr_backend * m_sWLRBackend ;
wlr_session * m_sWLRSession ;
wlr_renderer * m_sWLRRenderer ;
wlr_allocator * m_sWLRAllocator ;
wlr_compositor * m_sWLRCompositor ;
wlr_subcompositor * m_sWLRSubCompositor ;
wlr_drm * m_sWRLDRM ;
wlr_drm_lease_v1_manager * m_sWRLDRMLeaseMgr ;
wlr_egl * m_sWLREGL ;
int m_iDRMFD ;
wlr_linux_dmabuf_v1 * m_sWLRLinuxDMABuf ;
wlr_backend * m_sWLRHeadlessBackend ;
2022-03-16 21:37:21 +01:00
// ------------------------------------------------- //
2024-04-28 23:25:24 +02:00
std : : string m_szHyprTempDataRoot = " " ;
2022-12-16 18:17:31 +01:00
std : : string m_szWLDisplaySocket = " " ;
std : : string m_szInstanceSignature = " " ;
2024-04-28 23:25:24 +02:00
std : : string m_szInstancePath = " " ;
2022-12-16 18:17:31 +01:00
std : : string m_szCurrentSplash = " error " ;
2022-03-16 21:37:21 +01:00
2024-04-27 13:43:12 +02:00
std : : vector < SP < CMonitor > > m_vMonitors ;
std : : vector < SP < CMonitor > > m_vRealMonitors ; // for all monitors, even those turned off
std : : vector < PHLWINDOW > m_vWindows ;
2024-05-09 22:47:21 +02:00
std : : vector < PHLLS > m_vLayers ;
2024-04-02 21:32:39 +02:00
std : : vector < PHLWORKSPACE > m_vWorkspaces ;
2024-04-27 13:43:12 +02:00
std : : vector < PHLWINDOWREF > m_vWindowsFadingOut ;
2024-04-30 03:41:27 +02:00
std : : vector < PHLLSREF > m_vSurfacesFadingOut ;
2022-03-16 21:37:21 +01:00
2023-07-24 18:50:17 +02:00
std : : unordered_map < std : : string , uint64_t > m_mMonitorIDMap ;
2023-07-09 23:08:40 +02:00
2023-03-05 14:37:21 +01:00
void initServer ( ) ;
2022-12-16 18:17:31 +01:00
void startCompositor ( ) ;
void cleanup ( ) ;
2023-08-08 16:16:34 +02:00
void createLockFile ( ) ;
void removeLockFile ( ) ;
2022-03-17 16:56:33 +01:00
2024-04-27 13:43:12 +02:00
wlr_surface * m_pLastFocus = nullptr ;
PHLWINDOWREF m_pLastWindow ;
2024-05-05 23:18:10 +02:00
WP < CMonitor > m_pLastMonitor ;
2022-03-17 20:22:29 +01:00
2024-04-27 13:43:12 +02:00
std : : vector < PHLWINDOWREF > m_vWindowFocusHistory ; // first element is the most recently focused.
2023-01-20 19:15:15 +01:00
2022-12-16 18:17:31 +01:00
bool m_bReadyToProcess = false ;
bool m_bSessionActive = true ;
bool m_bDPMSStateON = true ;
2023-09-24 19:04:38 +02:00
bool m_bUnsafeState = false ; // unsafe state is when there is no monitors.
2023-11-01 19:53:36 +01:00
bool m_bNextIsUnsafe = false ; // because wlroots
CMonitor * m_pUnsafeOutput = nullptr ; // fallback output for the unsafe state
2024-03-25 17:20:30 +01:00
bool m_bExitTriggered = false ; // For exit dispatcher
2022-12-16 18:17:31 +01:00
bool m_bIsShuttingDown = false ;
2022-04-28 17:57:24 +02:00
2022-03-17 20:22:29 +01:00
// ------------------------------------------------- //
2024-04-30 03:41:27 +02:00
CMonitor * getMonitorFromID ( const int & ) ;
CMonitor * getMonitorFromName ( const std : : string & ) ;
CMonitor * getMonitorFromDesc ( const std : : string & ) ;
CMonitor * getMonitorFromCursor ( ) ;
CMonitor * getMonitorFromVector ( const Vector2D & ) ;
void removeWindowFromVectorSafe ( PHLWINDOW ) ;
void focusWindow ( PHLWINDOW , wlr_surface * pSurface = nullptr ) ;
void focusSurface ( wlr_surface * , PHLWINDOW pWindowOwner = nullptr ) ;
bool monitorExists ( CMonitor * ) ;
PHLWINDOW vectorToWindowUnified ( const Vector2D & , uint8_t properties , PHLWINDOW pIgnoreWindow = nullptr ) ;
2024-05-09 22:47:21 +02:00
wlr_surface * vectorToLayerSurface ( const Vector2D & , std : : vector < PHLLSREF > * , Vector2D * , PHLLS * ) ;
2024-04-30 03:41:27 +02:00
wlr_surface * vectorToLayerPopupSurface ( const Vector2D & , CMonitor * monitor , Vector2D * , PHLLS * ) ;
wlr_surface * vectorWindowToSurface ( const Vector2D & , PHLWINDOW , Vector2D & sl ) ;
Vector2D vectorToSurfaceLocal ( const Vector2D & , PHLWINDOW , wlr_surface * ) ;
CMonitor * getMonitorFromOutput ( wlr_output * ) ;
CMonitor * getRealMonitorFromOutput ( wlr_output * ) ;
PHLWINDOW getWindowFromSurface ( wlr_surface * ) ;
PHLWINDOW getWindowFromHandle ( uint32_t ) ;
bool isWorkspaceVisible ( PHLWORKSPACE ) ;
PHLWORKSPACE getWorkspaceByID ( const int & ) ;
PHLWORKSPACE getWorkspaceByName ( const std : : string & ) ;
PHLWORKSPACE getWorkspaceByString ( const std : : string & ) ;
void sanityCheckWorkspaces ( ) ;
void updateWorkspaceWindowDecos ( const int & ) ;
void updateWorkspaceSpecialRenderData ( const int & ) ;
int getWindowsOnWorkspace ( const int & id , std : : optional < bool > onlyTiled = { } , std : : optional < bool > onlyVisible = { } ) ;
int getGroupsOnWorkspace ( const int & id , std : : optional < bool > onlyTiled = { } , std : : optional < bool > onlyVisible = { } ) ;
PHLWINDOW getUrgentWindow ( ) ;
bool hasUrgentWindowOnWorkspace ( const int & ) ;
PHLWINDOW getFirstWindowOnWorkspace ( const int & ) ;
PHLWINDOW getTopLeftWindowOnWorkspace ( const int & ) ;
PHLWINDOW getFullscreenWindowOnWorkspace ( const int & ) ;
bool isWindowActive ( PHLWINDOW ) ;
void changeWindowZOrder ( PHLWINDOW , bool ) ;
void cleanupFadingOut ( const int & monid ) ;
PHLWINDOW getWindowInDirection ( PHLWINDOW , char ) ;
PHLWINDOW getNextWindowOnWorkspace ( PHLWINDOW , bool focusableOnly = false , std : : optional < bool > floating = { } ) ;
PHLWINDOW getPrevWindowOnWorkspace ( PHLWINDOW , bool focusableOnly = false , std : : optional < bool > floating = { } ) ;
int getNextAvailableNamedWorkspace ( ) ;
bool isPointOnAnyMonitor ( const Vector2D & ) ;
bool isPointOnReservedArea ( const Vector2D & point , const CMonitor * monitor = nullptr ) ;
CMonitor * getMonitorInDirection ( const char & ) ;
CMonitor * getMonitorInDirection ( CMonitor * , const char & ) ;
void updateAllWindowsAnimatedDecorationValues ( ) ;
void updateWorkspaceWindows ( const int64_t & id ) ;
void updateWindowAnimatedDecorationValues ( PHLWINDOW ) ;
int getNextAvailableMonitorID ( std : : string const & name ) ;
void moveWorkspaceToMonitor ( PHLWORKSPACE , CMonitor * , bool noWarpCursor = false ) ;
void swapActiveWorkspaces ( CMonitor * , CMonitor * ) ;
CMonitor * getMonitorFromString ( const std : : string & ) ;
bool workspaceIDOutOfBounds ( const int64_t & ) ;
void setWindowFullscreen ( PHLWINDOW , bool , eFullscreenMode mode = FULLSCREEN_INVALID ) ;
void updateFullscreenFadeOnWorkspace ( PHLWORKSPACE ) ;
PHLWINDOW getX11Parent ( PHLWINDOW ) ;
void scheduleFrameForMonitor ( CMonitor * ) ;
void addToFadingOutSafe ( PHLLS ) ;
void addToFadingOutSafe ( PHLWINDOW ) ;
PHLWINDOW getWindowByRegex ( const std : : string & ) ;
void warpCursorTo ( const Vector2D & , bool force = false ) ;
PHLLS getLayerSurfaceFromSurface ( wlr_surface * ) ;
void closeWindow ( PHLWINDOW ) ;
Vector2D parseWindowVectorArgsRelative ( const std : : string & , const Vector2D & ) ;
void forceReportSizesToWindowsOnWorkspace ( const int & ) ;
2024-05-12 01:03:32 +02:00
PHLWORKSPACE createNewWorkspace ( const int & , const int & , const std : : string & name = " " , bool isEmtpy = true ) ; // will be deleted next frame if left empty and unfocused!
2024-04-30 03:41:27 +02:00
void renameWorkspace ( const int & , const std : : string & name = " " ) ;
void setActiveMonitor ( CMonitor * ) ;
bool isWorkspaceSpecial ( const int & ) ;
int getNewSpecialID ( ) ;
void performUserChecks ( ) ;
void moveWindowToWorkspaceSafe ( PHLWINDOW pWindow , PHLWORKSPACE pWorkspace ) ;
PHLWINDOW getForceFocus ( ) ;
void arrangeMonitors ( ) ;
void enterUnsafeState ( ) ;
void leaveUnsafeState ( ) ;
void setPreferredScaleForSurface ( wlr_surface * pSurface , double scale ) ;
void setPreferredTransformForSurface ( wlr_surface * pSurface , wl_output_transform transform ) ;
void updateSuspendedStates ( ) ;
PHLWINDOW windowForCPointer ( CWindow * ) ;
std : : string explicitConfigPath ;
2022-12-16 18:17:31 +01:00
private :
void initAllSignals ( ) ;
2024-01-19 16:20:22 +01:00
void removeAllSignals ( ) ;
2024-05-08 19:11:08 +02:00
void cleanEnvironment ( ) ;
2022-12-16 18:17:31 +01:00
void setRandomSplash ( ) ;
2023-03-05 14:37:21 +01:00
void initManagers ( eManagersInitStage stage ) ;
2023-11-01 19:53:36 +01:00
void prepareFallbackOutput ( ) ;
2022-12-16 18:17:31 +01:00
uint64_t m_iHyprlandPID = 0 ;
2022-03-16 21:37:21 +01:00
} ;
2022-03-20 13:37:07 +01:00
inline std : : unique_ptr < CCompositor > g_pCompositor ;
// For XWayland
2022-12-16 18:17:31 +01:00
inline std : : map < std : : string , xcb_atom_t > HYPRATOMS = { HYPRATOM ( " _NET_WM_WINDOW_TYPE " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_NORMAL " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_DOCK " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_DIALOG " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_UTILITY " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_TOOLBAR " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_SPLASH " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_MENU " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_DROPDOWN_MENU " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_POPUP_MENU " ) ,
HYPRATOM ( " _NET_WM_WINDOW_TYPE_TOOLTIP " ) ,
2023-04-22 23:20:48 +02:00
HYPRATOM ( " _NET_WM_WINDOW_TYPE_NOTIFICATION " ) ,
2024-03-09 17:47:57 +01:00
HYPRATOM ( " _KDE_NET_WM_WINDOW_TYPE_OVERRIDE " ) ,
HYPRATOM ( " _NET_SUPPORTING_WM_CHECK " ) ,
HYPRATOM ( " _NET_WM_NAME " ) ,
HYPRATOM ( " UTF8_STRING " ) } ;