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"
2022-03-20 15:55:47 +01:00
# include "helpers/Workspace.hpp"
2022-03-17 20:22:29 +01:00
# include "Window.hpp"
# 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 ------------------ //
2022-12-16 18:17:31 +01: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_data_device_manager * m_sWLRDataDevMgr ;
wlr_drm * m_sWRLDRM ;
wlr_drm_lease_v1_manager * m_sWRLDRMLeaseMgr ;
wlr_xdg_activation_v1 * m_sWLRXDGActivation ;
wlr_output_layout * m_sWLROutputLayout ;
2023-07-13 18:05:34 +02:00
wlr_idle_notifier_v1 * m_sWLRIdleNotifier ;
2022-12-16 18:17:31 +01:00
wlr_layer_shell_v1 * m_sWLRLayerShell ;
wlr_xdg_shell * m_sWLRXDGShell ;
wlr_cursor * m_sWLRCursor ;
wlr_xcursor_manager * m_sWLRXCursorMgr ;
wlr_virtual_keyboard_manager_v1 * m_sWLRVKeyboardMgr ;
wlr_output_manager_v1 * m_sWLROutputMgr ;
wlr_presentation * m_sWLRPresentation ;
2022-03-22 18:29:13 +01:00
wlr_keyboard_shortcuts_inhibit_manager_v1 * m_sWLRKbShInhibitMgr ;
2022-12-16 18:17:31 +01:00
wlr_egl * m_sWLREGL ;
int m_iDRMFD ;
wlr_pointer_constraints_v1 * m_sWLRPointerConstraints ;
wlr_relative_pointer_manager_v1 * m_sWLRRelPointerMgr ;
wlr_server_decoration_manager * m_sWLRServerDecoMgr ;
wlr_xdg_decoration_manager_v1 * m_sWLRXDGDecoMgr ;
wlr_virtual_pointer_manager_v1 * m_sWLRVirtPtrMgr ;
wlr_foreign_toplevel_manager_v1 * m_sWLRToplevelMgr ;
wlr_tablet_manager_v2 * m_sWLRTabletManager ;
wlr_xdg_foreign_registry * m_sWLRForeignRegistry ;
wlr_idle_inhibit_manager_v1 * m_sWLRIdleInhibitMgr ;
wlr_pointer_gestures_v1 * m_sWLRPointerGestures ;
wlr_output_power_manager_v1 * m_sWLROutputPowerMgr ;
wlr_input_method_manager_v2 * m_sWLRIMEMgr ;
wlr_text_input_manager_v3 * m_sWLRTextInputMgr ;
wlr_xdg_activation_v1 * m_sWLRActivation ;
wlr_linux_dmabuf_v1 * m_sWLRLinuxDMABuf ;
wlr_backend * m_sWLRHeadlessBackend ;
2023-02-03 12:58:55 +01:00
wlr_session_lock_manager_v1 * m_sWLRSessionLockMgr ;
2023-06-14 13:26:47 +02:00
wlr_gamma_control_manager_v1 * m_sWLRGammaCtrlMgr ;
2023-07-24 18:50:17 +02:00
wlr_cursor_shape_manager_v1 * m_sWLRCursorShapeMgr ;
2023-09-28 22:48:33 +02:00
wlr_tearing_control_manager_v1 * m_sWLRTearingControlMgr ;
2022-03-16 21:37:21 +01:00
// ------------------------------------------------- //
2022-12-16 18:17:31 +01:00
std : : string m_szWLDisplaySocket = " " ;
std : : string m_szInstanceSignature = " " ;
std : : string m_szCurrentSplash = " error " ;
2022-03-16 21:37:21 +01:00
2022-12-16 18:17:31 +01:00
std : : vector < std : : shared_ptr < CMonitor > > m_vMonitors ;
std : : vector < std : : shared_ptr < CMonitor > > m_vRealMonitors ; // for all monitors, even those turned off
std : : vector < std : : unique_ptr < CWindow > > m_vWindows ;
std : : vector < std : : unique_ptr < SXDGPopup > > m_vXDGPopups ;
std : : vector < std : : unique_ptr < CWorkspace > > m_vWorkspaces ;
std : : vector < std : : unique_ptr < SSubsurface > > m_vSubsurfaces ;
std : : vector < CWindow * > m_vWindowsFadingOut ;
std : : vector < SLayerSurface * > 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
2022-12-16 18:17:31 +01:00
wlr_surface * m_pLastFocus = nullptr ;
CWindow * m_pLastWindow = nullptr ;
CMonitor * m_pLastMonitor = nullptr ;
2022-03-17 20:22:29 +01:00
2023-01-20 19:15:15 +01:00
std : : vector < CWindow * > m_vWindowFocusHistory ; // first element is the most recently focused.
2022-12-16 18:17:31 +01:00
SSeat m_sSeat ;
2022-09-25 20:07:48 +02: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
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
// ------------------------------------------------- //
2022-12-16 18:17:31 +01:00
CMonitor * getMonitorFromID ( const int & ) ;
CMonitor * getMonitorFromName ( const std : : string & ) ;
2023-07-09 23:10:35 +02:00
CMonitor * getMonitorFromDesc ( const std : : string & ) ;
2022-12-16 18:17:31 +01:00
CMonitor * getMonitorFromCursor ( ) ;
CMonitor * getMonitorFromVector ( const Vector2D & ) ;
void removeWindowFromVectorSafe ( CWindow * ) ;
void focusWindow ( CWindow * , wlr_surface * pSurface = nullptr ) ;
void focusSurface ( wlr_surface * , CWindow * pWindowOwner = nullptr ) ;
bool windowExists ( CWindow * ) ;
bool windowValidMapped ( CWindow * ) ;
2023-11-19 13:29:01 +01:00
CWindow * vectorToWindowIdeal ( const Vector2D & , CWindow * pIgnoreWindow = nullptr ) ; // used only for finding a window to focus on, basically a "findFocusableWindow"
2022-12-16 18:17:31 +01:00
CWindow * vectorToWindowTiled ( const Vector2D & ) ;
wlr_surface * vectorToLayerSurface ( const Vector2D & , std : : vector < std : : unique_ptr < SLayerSurface > > * , Vector2D * , SLayerSurface * * ) ;
2023-11-25 15:27:57 +01:00
SIMEPopup * vectorToIMEPopup ( const Vector2D & pos , std : : list < SIMEPopup > & popups ) ;
2022-12-16 18:17:31 +01:00
wlr_surface * vectorWindowToSurface ( const Vector2D & , CWindow * , Vector2D & sl ) ;
2023-09-23 02:21:59 +02:00
Vector2D vectorToSurfaceLocal ( const Vector2D & , CWindow * , wlr_surface * ) ;
2022-12-16 18:17:31 +01:00
CWindow * windowFromCursor ( ) ;
CWindow * windowFloatingFromCursor ( ) ;
CMonitor * getMonitorFromOutput ( wlr_output * ) ;
CWindow * getWindowForPopup ( wlr_xdg_popup * ) ;
CWindow * getWindowFromSurface ( wlr_surface * ) ;
CWindow * getWindowFromHandle ( uint32_t ) ;
CWindow * getWindowFromZWLRHandle ( wl_resource * ) ;
bool isWorkspaceVisible ( const int & ) ;
CWorkspace * getWorkspaceByID ( const int & ) ;
CWorkspace * getWorkspaceByName ( const std : : string & ) ;
CWorkspace * getWorkspaceByString ( const std : : string & ) ;
void sanityCheckWorkspaces ( ) ;
void updateWorkspaceWindowDecos ( const int & ) ;
int getWindowsOnWorkspace ( const int & ) ;
2023-01-21 11:18:55 +01:00
CWindow * getUrgentWindow ( ) ;
2023-01-14 20:31:11 +01:00
bool hasUrgentWindowOnWorkspace ( const int & ) ;
2022-12-16 18:17:31 +01:00
CWindow * getFirstWindowOnWorkspace ( const int & ) ;
2023-08-21 20:54:02 +02:00
CWindow * getTopLeftWindowOnWorkspace ( const int & ) ;
2022-12-16 18:17:31 +01:00
CWindow * getFullscreenWindowOnWorkspace ( const int & ) ;
bool doesSeatAcceptInput ( wlr_surface * ) ;
bool isWindowActive ( CWindow * ) ;
2023-09-21 23:18:26 +02:00
void changeWindowZOrder ( CWindow * , bool ) ;
2022-12-16 18:17:31 +01:00
void cleanupFadingOut ( const int & monid ) ;
CWindow * getWindowInDirection ( CWindow * , char ) ;
2023-12-24 15:08:48 +01:00
CWindow * getNextWindowOnWorkspace ( CWindow * , bool focusableOnly = false , std : : optional < bool > floating = { } ) ;
CWindow * getPrevWindowOnWorkspace ( CWindow * , bool focusableOnly = false , std : : optional < bool > floating = { } ) ;
2022-12-16 18:17:31 +01:00
int getNextAvailableNamedWorkspace ( ) ;
bool isPointOnAnyMonitor ( const Vector2D & ) ;
CWindow * getConstraintWindow ( SMouse * ) ;
CMonitor * getMonitorInDirection ( const char & ) ;
void updateAllWindowsAnimatedDecorationValues ( ) ;
2023-12-20 23:52:18 +01:00
void updateWorkspaceWindows ( const int64_t & id ) ;
2022-12-16 18:17:31 +01:00
void updateWindowAnimatedDecorationValues ( CWindow * ) ;
2023-07-13 18:05:34 +02:00
int getNextAvailableMonitorID ( std : : string const & name ) ;
2022-12-16 18:17:31 +01:00
void moveWorkspaceToMonitor ( CWorkspace * , CMonitor * ) ;
void swapActiveWorkspaces ( CMonitor * , CMonitor * ) ;
CMonitor * getMonitorFromString ( const std : : string & ) ;
2023-05-09 15:07:58 +02:00
bool workspaceIDOutOfBounds ( const int64_t & ) ;
2022-12-16 18:17:31 +01:00
void setWindowFullscreen ( CWindow * , bool , eFullscreenMode ) ;
2023-04-25 00:21:51 +02:00
void updateFullscreenFadeOnWorkspace ( CWorkspace * ) ;
2022-12-16 18:17:31 +01:00
CWindow * getX11Parent ( CWindow * ) ;
void scheduleFrameForMonitor ( CMonitor * ) ;
void addToFadingOutSafe ( SLayerSurface * ) ;
void addToFadingOutSafe ( CWindow * ) ;
CWindow * getWindowByRegex ( const std : : string & ) ;
2023-01-28 13:26:33 +01:00
void warpCursorTo ( const Vector2D & , bool force = false ) ;
2022-12-16 18:17:31 +01:00
SLayerSurface * getLayerSurfaceFromWlr ( wlr_layer_surface_v1 * ) ;
SLayerSurface * getLayerSurfaceFromSurface ( wlr_surface * ) ;
void closeWindow ( CWindow * ) ;
Vector2D parseWindowVectorArgsRelative ( const std : : string & , const Vector2D & ) ;
void forceReportSizesToWindowsOnWorkspace ( const int & ) ;
bool cursorOnReservedArea ( ) ;
CWorkspace * createNewWorkspace ( const int & , const int & , const std : : string & name = " " ) ; // will be deleted next frame if left empty and unfocused!
2023-01-08 14:19:18 +01:00
void renameWorkspace ( const int & , const std : : string & name = " " ) ;
2022-12-16 18:17:31 +01:00
void setActiveMonitor ( CMonitor * ) ;
bool isWorkspaceSpecial ( const int & ) ;
int getNewSpecialID ( ) ;
2023-03-20 16:02:47 +01:00
void performUserChecks ( ) ;
2023-04-14 16:03:53 +02:00
void moveWindowToWorkspaceSafe ( CWindow * pWindow , CWorkspace * pWorkspace ) ;
2023-07-04 12:05:25 +02:00
CWindow * getForceFocus ( ) ;
2023-07-13 18:05:34 +02:00
void notifyIdleActivity ( ) ;
void setIdleActivityInhibit ( bool inhibit ) ;
2023-08-14 14:22:06 +02:00
void arrangeMonitors ( ) ;
2023-09-24 19:04:38 +02:00
void enterUnsafeState ( ) ;
void leaveUnsafeState ( ) ;
2023-10-22 17:58:06 +02:00
void setPreferredScaleForSurface ( wlr_surface * pSurface , double scale ) ;
void setPreferredTransformForSurface ( wlr_surface * pSurface , wl_output_transform transform ) ;
2023-12-23 22:30:49 +01:00
void updateSuspendedStates ( ) ;
2022-12-16 18:17:31 +01:00
std : : string explicitConfigPath ;
private :
void initAllSignals ( ) ;
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 " ) ,
HYPRATOM ( " _KDE_NET_WM_WINDOW_TYPE_OVERRIDE " ) } ;