From dc7d783d1439b92b16bfe1851c2b699e7c7267e0 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Sun, 5 Mar 2023 13:37:21 +0000 Subject: [PATCH] Initialize priority managers before server init --- src/Compositor.cpp | 161 +++++++++++++++++---------------- src/Compositor.hpp | 8 ++ src/main.cpp | 8 +- src/managers/ThreadManager.cpp | 2 - 4 files changed, 97 insertions(+), 82 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index aae6328e..66e23b67 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -35,8 +35,6 @@ void handleUnrecoverableSignal(int sig) { } CCompositor::CCompositor() { - wlr_log_init(WLR_INFO, NULL); - m_iHyprlandPID = getpid(); m_szInstanceSignature = GIT_COMMIT_HASH + std::string("_") + std::to_string(time(NULL)); @@ -72,7 +70,21 @@ CCompositor::CCompositor() { setRandomSplash(); Debug::log(LOG, "\nCurrent splash: %s\n\n", m_szCurrentSplash.c_str()); +} +CCompositor::~CCompositor() { + cleanup(); +} + +void CCompositor::setRandomSplash() { + std::random_device dev; + std::mt19937 engine(dev()); + std::uniform_int_distribution<> distribution(0, SPLASHES.size() - 1); + + m_szCurrentSplash = SPLASHES[distribution(engine)]; +} + +void CCompositor::initServer() { m_sWLDisplay = wl_display_create(); m_sWLEventLoop = wl_display_get_event_loop(m_sWLDisplay); @@ -83,6 +95,14 @@ CCompositor::CCompositor() { signal(SIGABRT, handleUnrecoverableSignal); //wl_event_loop_add_signal(m_sWLEventLoop, SIGINT, handleCritSignal, nullptr); + initManagers(STAGE_PRIORITY); + + wlr_log_init(WLR_INFO, NULL); + + const auto LOGWLR = getenv("HYPRLAND_LOG_WLR"); + if (LOGWLR && std::string(LOGWLR) == "1") + wlr_log_init(WLR_DEBUG, Debug::wlrLog); + m_sWLRBackend = wlr_backend_autocreate(m_sWLDisplay, &m_sWLRSession); if (!m_sWLRBackend) { @@ -226,18 +246,8 @@ CCompositor::CCompositor() { wlr_single_pixel_buffer_manager_v1_create(m_sWLDisplay); wlr_multi_backend_add(m_sWLRBackend, m_sWLRHeadlessBackend); -} -CCompositor::~CCompositor() { - cleanup(); -} - -void CCompositor::setRandomSplash() { - std::random_device dev; - std::mt19937 engine(dev()); - std::uniform_int_distribution<> distribution(0, SPLASHES.size() - 1); - - m_szCurrentSplash = SPLASHES[distribution(engine)]; + initManagers(STAGE_LATE); } void CCompositor::initAllSignals() { @@ -337,70 +347,69 @@ void CCompositor::cleanup() { // the PID should not be reused. } +void CCompositor::initManagers(eManagersInitStage stage) { + switch (stage) { + case STAGE_PRIORITY: { + Debug::log(LOG, "Creating the HookSystem!"); + g_pHookSystem = std::make_unique(); + + Debug::log(LOG, "Creating the KeybindManager!"); + g_pKeybindManager = std::make_unique(); + + Debug::log(LOG, "Creating the AnimationManager!"); + g_pAnimationManager = std::make_unique(); + + Debug::log(LOG, "Creating the ConfigManager!"); + g_pConfigManager = std::make_unique(); + + Debug::log(LOG, "Creating the CHyprError!"); + g_pHyprError = std::make_unique(); + + Debug::log(LOG, "Creating the LayoutManager!"); + g_pLayoutManager = std::make_unique(); + + g_pConfigManager->init(); + } break; + case STAGE_LATE: { + Debug::log(LOG, "Creating the ThreadManager!"); + g_pThreadManager = std::make_unique(); + + Debug::log(LOG, "Creating the InputManager!"); + g_pInputManager = std::make_unique(); + + Debug::log(LOG, "Creating the CHyprOpenGLImpl!"); + g_pHyprOpenGL = std::make_unique(); + + Debug::log(LOG, "Creating the HyprRenderer!"); + g_pHyprRenderer = std::make_unique(); + + Debug::log(LOG, "Creating the XWaylandManager!"); + g_pXWaylandManager = std::make_unique(); + + Debug::log(LOG, "Creating the ProtocolManager!"); + g_pProtocolManager = std::make_unique(); + + Debug::log(LOG, "Creating the SessionLockManager!"); + g_pSessionLockManager = std::make_unique(); + + Debug::log(LOG, "Creating the EventManager!"); + g_pEventManager = std::make_unique(); + g_pEventManager->startThread(); + + Debug::log(LOG, "Creating the HyprDebugOverlay!"); + g_pDebugOverlay = std::make_unique(); + + Debug::log(LOG, "Creating the HyprNotificationOverlay!"); + g_pHyprNotificationOverlay = std::make_unique(); + + Debug::log(LOG, "Creating the PluginSystem!"); + g_pPluginSystem = std::make_unique(); + } break; + default: UNREACHABLE(); + } +} + void CCompositor::startCompositor() { - // Init all the managers BEFORE we start with the wayland server so that ALL of the stuff is initialized - // properly and we dont get any bad mem reads. - // - - Debug::log(LOG, "Creating the HookSystem!"); - g_pHookSystem = std::make_unique(); - - Debug::log(LOG, "Creating the KeybindManager!"); - g_pKeybindManager = std::make_unique(); - - Debug::log(LOG, "Creating the AnimationManager!"); - g_pAnimationManager = std::make_unique(); - - Debug::log(LOG, "Creating the LayoutManager!"); - g_pLayoutManager = std::make_unique(); - - Debug::log(LOG, "Creating the ConfigManager!"); - g_pConfigManager = std::make_unique(); - - Debug::log(LOG, "Creating the CHyprError!"); - g_pHyprError = std::make_unique(); - - Debug::log(LOG, "Creating the ThreadManager!"); - g_pThreadManager = std::make_unique(); - - Debug::log(LOG, "Creating the InputManager!"); - g_pInputManager = std::make_unique(); - - Debug::log(LOG, "Creating the CHyprOpenGLImpl!"); - g_pHyprOpenGL = std::make_unique(); - - Debug::log(LOG, "Creating the HyprRenderer!"); - g_pHyprRenderer = std::make_unique(); - - Debug::log(LOG, "Creating the XWaylandManager!"); - g_pXWaylandManager = std::make_unique(); - - Debug::log(LOG, "Creating the ProtocolManager!"); - g_pProtocolManager = std::make_unique(); - - Debug::log(LOG, "Creating the SessionLockManager!"); - g_pSessionLockManager = std::make_unique(); - - Debug::log(LOG, "Creating the EventManager!"); - g_pEventManager = std::make_unique(); - g_pEventManager->startThread(); - - Debug::log(LOG, "Creating the HyprDebugOverlay!"); - g_pDebugOverlay = std::make_unique(); - - Debug::log(LOG, "Creating the HyprNotificationOverlay!"); - g_pHyprNotificationOverlay = std::make_unique(); - - Debug::log(LOG, "Creating the PluginSystem!"); - g_pPluginSystem = std::make_unique(); - // - // - - // firefox wont detect wl - setenv("MOZ_ENABLE_WAYLAND", "1", 1); - - setenv("XDG_CURRENT_DESKTOP", "Hyprland", 1); - initAllSignals(); // get socket, avoid using 0 diff --git a/src/Compositor.hpp b/src/Compositor.hpp index a3587600..c346df0c 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -28,6 +28,12 @@ #include "hyprerror/HyprError.hpp" #include "plugins/PluginSystem.hpp" +enum eManagersInitStage +{ + STAGE_PRIORITY = 0, + STAGE_LATE +}; + class CCompositor { public: CCompositor(); @@ -93,6 +99,7 @@ class CCompositor { std::vector m_vWindowsFadingOut; std::vector m_vSurfacesFadingOut; + void initServer(); void startCompositor(); void cleanup(); @@ -188,6 +195,7 @@ class CCompositor { private: void initAllSignals(); void setRandomSplash(); + void initManagers(eManagersInitStage stage); uint64_t m_iHyprlandPID = 0; }; diff --git a/src/main.cpp b/src/main.cpp index 9cfe65da..2f2674f2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,8 @@ int main(int argc, char** argv) { setenv("HYPRLAND_CMD", cmd.c_str(), 1); setenv("XDG_BACKEND", "wayland", 1); setenv("_JAVA_AWT_WM_NONREPARENTING", "1", 1); + setenv("MOZ_ENABLE_WAYLAND", "1", 1); + setenv("XDG_CURRENT_DESKTOP", "Hyprland", 1); // parse some args std::string configPath; @@ -50,15 +52,13 @@ int main(int argc, char** argv) { std::cout << "Welcome to Hyprland!\n"; - const auto LOGWLR = getenv("HYPRLAND_LOG_WLR"); - if (LOGWLR && std::string(LOGWLR) == "1") - wlr_log_init(WLR_DEBUG, Debug::wlrLog); - // let's init the compositor. // it initializes basic Wayland stuff in the constructor. g_pCompositor = std::make_unique(); g_pCompositor->explicitConfigPath = configPath; + g_pCompositor->initServer(); + Debug::log(LOG, "Hyprland init finished."); // If all's good to go, start. diff --git a/src/managers/ThreadManager.cpp b/src/managers/ThreadManager.cpp index a268258f..060e69dd 100644 --- a/src/managers/ThreadManager.cpp +++ b/src/managers/ThreadManager.cpp @@ -18,8 +18,6 @@ int handleTimer(void* data) { } CThreadManager::CThreadManager() { - g_pConfigManager->init(); - HyprCtl::startHyprCtlSocket(); m_esConfigTimer = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, handleTimer, this);