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"
|
|
|
|
#include "managers/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-05-28 17:32:19 +02:00
|
|
|
#include "debug/HyprDebugOverlay.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"
|
2022-03-20 15:55:47 +01:00
|
|
|
|
2022-03-16 21:37:21 +01:00
|
|
|
class CCompositor {
|
|
|
|
public:
|
|
|
|
CCompositor();
|
|
|
|
~CCompositor();
|
|
|
|
|
|
|
|
// ------------------ WLR BASICS ------------------ //
|
|
|
|
wl_display* m_sWLDisplay;
|
|
|
|
wlr_backend* m_sWLRBackend;
|
|
|
|
wlr_renderer* m_sWLRRenderer;
|
|
|
|
wlr_allocator* m_sWLRAllocator;
|
|
|
|
wlr_compositor* m_sWLRCompositor;
|
2022-03-17 19:03:15 +01:00
|
|
|
wlr_subcompositor* m_sWLRSubCompositor;
|
|
|
|
wlr_data_device_manager* m_sWLRDataDevMgr;
|
2022-03-16 21:37:21 +01:00
|
|
|
wlr_xdg_activation_v1* m_sWLRXDGActivation;
|
|
|
|
wlr_output_layout* m_sWLROutputLayout;
|
|
|
|
wlr_idle* m_sWLRIdle;
|
|
|
|
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-17 19:03:15 +01:00
|
|
|
wlr_scene* m_sWLRScene;
|
2022-03-22 18:29:13 +01:00
|
|
|
wlr_input_inhibit_manager* m_sWLRInhibitMgr;
|
|
|
|
wlr_keyboard_shortcuts_inhibit_manager_v1* m_sWLRKbShInhibitMgr;
|
2022-03-24 17:17:08 +01:00
|
|
|
wlr_egl* m_sWLREGL;
|
2022-04-04 19:44:25 +02:00
|
|
|
int m_iDRMFD;
|
2022-04-11 19:51:37 +02:00
|
|
|
wlr_ext_workspace_manager_v1* m_sWLREXTWorkspaceMgr;
|
2022-04-14 21:48:12 +02:00
|
|
|
wlr_linux_dmabuf_v1* m_sWLRDmabuf;
|
2022-04-17 21:40:04 +02:00
|
|
|
wlr_pointer_constraints_v1* m_sWLRPointerConstraints;
|
|
|
|
wlr_relative_pointer_manager_v1* m_sWLRRelPointerMgr;
|
2022-05-10 11:01:03 +02:00
|
|
|
wlr_server_decoration_manager* m_sWLRServerDecoMgr;
|
|
|
|
wlr_xdg_decoration_manager_v1* m_sWLRXDGDecoMgr;
|
2022-05-12 12:13:02 +02:00
|
|
|
wlr_virtual_pointer_manager_v1* m_sWLRVirtPtrMgr;
|
2022-05-29 11:24:42 +02:00
|
|
|
wlr_foreign_toplevel_manager_v1* m_sWLRToplevelMgr;
|
2022-03-16 21:37:21 +01:00
|
|
|
// ------------------------------------------------- //
|
|
|
|
|
|
|
|
|
|
|
|
const char* m_szWLDisplaySocket;
|
|
|
|
|
2022-03-18 22:35:51 +01:00
|
|
|
std::list<SMonitor> m_lMonitors;
|
|
|
|
std::list<CWindow> m_lWindows;
|
2022-03-20 14:00:46 +01:00
|
|
|
std::list<SXDGPopup> m_lXDGPopups;
|
2022-04-11 19:51:37 +02:00
|
|
|
std::list<CWorkspace> m_lWorkspaces;
|
2022-03-21 16:13:43 +01:00
|
|
|
std::list<SSubsurface> m_lSubsurfaces;
|
2022-04-05 19:28:10 +02:00
|
|
|
std::list<CWindow*> m_lWindowsFadingOut;
|
2022-05-14 17:23:46 +02:00
|
|
|
std::list<SLayerSurface*> m_lSurfacesFadingOut;
|
2022-03-17 16:56:33 +01:00
|
|
|
|
|
|
|
void startCompositor();
|
2022-04-21 15:59:28 +02:00
|
|
|
void cleanupExit();
|
2022-03-17 20:22:29 +01:00
|
|
|
|
2022-03-20 14:36:55 +01:00
|
|
|
wlr_surface* m_pLastFocus = nullptr;
|
2022-04-02 18:57:09 +02:00
|
|
|
CWindow* m_pLastWindow = nullptr;
|
2022-03-19 20:30:21 +01:00
|
|
|
SMonitor* m_pLastMonitor = nullptr;
|
2022-03-22 18:29:13 +01:00
|
|
|
|
|
|
|
SSeat m_sSeat;
|
2022-03-18 22:53:27 +01:00
|
|
|
|
2022-04-28 17:57:24 +02:00
|
|
|
bool m_bReadyToProcess = false;
|
|
|
|
|
2022-03-17 20:22:29 +01:00
|
|
|
// ------------------------------------------------- //
|
|
|
|
|
|
|
|
SMonitor* getMonitorFromID(const int&);
|
2022-05-29 20:15:34 +02:00
|
|
|
SMonitor* getMonitorFromName(const std::string&);
|
2022-03-17 20:22:29 +01:00
|
|
|
SMonitor* getMonitorFromCursor();
|
2022-03-20 11:22:55 +01:00
|
|
|
SMonitor* getMonitorFromVector(const Vector2D&);
|
2022-03-18 22:35:51 +01:00
|
|
|
void removeWindowFromVectorSafe(CWindow*);
|
2022-04-02 18:57:09 +02:00
|
|
|
void focusWindow(CWindow*, wlr_surface* pSurface = nullptr);
|
2022-04-02 13:02:16 +02:00
|
|
|
void focusSurface(wlr_surface*, CWindow* pWindowOwner = nullptr);
|
2022-03-18 22:53:27 +01:00
|
|
|
bool windowExists(CWindow*);
|
2022-03-18 23:16:15 +01:00
|
|
|
bool windowValidMapped(CWindow*);
|
2022-03-18 22:53:27 +01:00
|
|
|
CWindow* vectorToWindow(const Vector2D&);
|
2022-03-19 17:48:18 +01:00
|
|
|
CWindow* vectorToWindowIdeal(const Vector2D&);
|
2022-03-20 18:31:58 +01:00
|
|
|
CWindow* vectorToWindowTiled(const Vector2D&);
|
2022-03-20 14:36:55 +01:00
|
|
|
wlr_surface* vectorToLayerSurface(const Vector2D&, std::list<SLayerSurface*>*, Vector2D*);
|
2022-04-02 13:02:16 +02:00
|
|
|
wlr_surface* vectorWindowToSurface(const Vector2D&, CWindow*, Vector2D& sl);
|
2022-03-19 20:30:21 +01:00
|
|
|
CWindow* windowFromCursor();
|
2022-03-20 11:14:24 +01:00
|
|
|
CWindow* windowFloatingFromCursor();
|
2022-03-19 20:56:19 +01:00
|
|
|
SMonitor* getMonitorFromOutput(wlr_output*);
|
2022-03-20 14:00:46 +01:00
|
|
|
CWindow* getWindowForPopup(wlr_xdg_popup*);
|
2022-03-20 14:36:55 +01:00
|
|
|
CWindow* getWindowFromSurface(wlr_surface*);
|
2022-03-20 15:55:47 +01:00
|
|
|
bool isWorkspaceVisible(const int&);
|
2022-04-11 19:51:37 +02:00
|
|
|
CWorkspace* getWorkspaceByID(const int&);
|
2022-04-21 16:38:48 +02:00
|
|
|
CWorkspace* getWorkspaceByName(const std::string&);
|
|
|
|
CWorkspace* getWorkspaceByString(const std::string&);
|
2022-03-20 15:55:47 +01:00
|
|
|
void sanityCheckWorkspaces();
|
|
|
|
int getWindowsOnWorkspace(const int&);
|
|
|
|
CWindow* getFirstWindowOnWorkspace(const int&);
|
2022-03-20 19:14:17 +01:00
|
|
|
void fixXWaylandWindowsOnWorkspace(const int&);
|
2022-03-21 19:18:33 +01:00
|
|
|
CWindow* getFullscreenWindowOnWorkspace(const int&);
|
2022-03-22 18:29:13 +01:00
|
|
|
bool doesSeatAcceptInput(wlr_surface*);
|
2022-04-02 13:02:16 +02:00
|
|
|
bool isWindowActive(CWindow*);
|
2022-04-04 16:25:30 +02:00
|
|
|
void moveWindowToTop(CWindow*);
|
2022-05-14 17:26:34 +02:00
|
|
|
void cleanupFadingOut();
|
2022-04-09 13:26:55 +02:00
|
|
|
CWindow* getWindowInDirection(CWindow*, char);
|
2022-04-28 17:55:25 +02:00
|
|
|
void deactivateAllWLRWorkspaces(wlr_ext_workspace_handle_v1* exclude = nullptr);
|
2022-04-13 20:45:06 +02:00
|
|
|
CWindow* getNextWindowOnWorkspace(CWindow*);
|
2022-04-21 16:38:48 +02:00
|
|
|
int getNextAvailableNamedWorkspace();
|
2022-04-24 17:53:50 +02:00
|
|
|
bool isPointOnAnyMonitor(const Vector2D&);
|
2022-04-25 13:40:46 +02:00
|
|
|
CWindow* getConstraintWindow(SMouse*);
|
2022-05-05 12:50:25 +02:00
|
|
|
SMonitor* getMonitorInDirection(const char&);
|
2022-05-26 21:23:13 +02:00
|
|
|
void updateAllWindowsBorders();
|
|
|
|
void updateWindowBorderColor(CWindow*);
|
2022-03-18 23:52:36 +01:00
|
|
|
|
|
|
|
private:
|
|
|
|
void initAllSignals();
|
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
|
|
|
|
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"),
|
|
|
|
HYPRATOM("_NET_WM_WINDOW_TYPE_NOTIFICATION")};
|