From 60bda7ee3d0a77d19277540cce53ecbddeabd716 Mon Sep 17 00:00:00 2001 From: Vaxry Date: Mon, 5 Feb 2024 01:56:38 +0000 Subject: pluginapi: allow registering hyprctl commands closes #4616 --- src/plugins/PluginAPI.cpp | 24 ++++++++++++++++++++++++ src/plugins/PluginAPI.hpp | 14 ++++++++++++++ src/plugins/PluginSystem.cpp | 4 ++++ src/plugins/PluginSystem.hpp | 1 + 4 files changed, 43 insertions(+) (limited to 'src/plugins') diff --git a/src/plugins/PluginAPI.cpp b/src/plugins/PluginAPI.cpp index e6fe6138..b6a353ea 100644 --- a/src/plugins/PluginAPI.cpp +++ b/src/plugins/PluginAPI.cpp @@ -362,4 +362,28 @@ APICALL SVersionInfo HyprlandAPI::getHyprlandVersion(HANDLE handle) { return {}; return {GIT_COMMIT_HASH, GIT_TAG, GIT_DIRTY != std::string(""), GIT_BRANCH, GIT_COMMIT_MESSAGE}; +} + +APICALL std::shared_ptr HyprlandAPI::registerHyprCtlCommand(HANDLE handle, SHyprCtlCommand cmd) { + auto* const PLUGIN = g_pPluginSystem->getPluginByHandle(handle); + + if (!PLUGIN) + return nullptr; + + auto PTR = g_pHyprCtl->registerCommand(cmd); + PLUGIN->registeredHyprctlCommands.push_back(PTR); + return PTR; +} + +APICALL bool HyprlandAPI::unregisterHyprCtlCommand(HANDLE handle, std::shared_ptr cmd) { + + auto* const PLUGIN = g_pPluginSystem->getPluginByHandle(handle); + + if (!PLUGIN) + return false; + + std::erase(PLUGIN->registeredHyprctlCommands, cmd); + g_pHyprCtl->unregisterCommand(cmd); + + return true; } \ No newline at end of file diff --git a/src/plugins/PluginAPI.hpp b/src/plugins/PluginAPI.hpp index 12e7c128..e7a6c899 100644 --- a/src/plugins/PluginAPI.hpp +++ b/src/plugins/PluginAPI.hpp @@ -273,6 +273,20 @@ namespace HyprlandAPI { for a different hash. */ APICALL SVersionInfo getHyprlandVersion(HANDLE handle); + + /* + Registers a hyprctl command + + returns: Pointer. Nullptr on fail. + */ + APICALL std::shared_ptr registerHyprCtlCommand(HANDLE handle, SHyprCtlCommand cmd); + + /* + Unregisters a hyprctl command + + returns: true on success. False otherwise. + */ + APICALL bool unregisterHyprCtlCommand(HANDLE handle, std::shared_ptr cmd); }; /* diff --git a/src/plugins/PluginSystem.cpp b/src/plugins/PluginSystem.cpp index 1468cb79..44b4de1f 100644 --- a/src/plugins/PluginSystem.cpp +++ b/src/plugins/PluginSystem.cpp @@ -113,6 +113,10 @@ void CPluginSystem::unloadPlugin(const CPlugin* plugin, bool eject) { for (auto& d : rdi) HyprlandAPI::removeDispatcher(plugin->m_pHandle, d); + const auto rhc = plugin->registeredHyprctlCommands; + for (auto& c : rhc) + HyprlandAPI::unregisterHyprCtlCommand(plugin->m_pHandle, c); + g_pConfigManager->removePluginConfig(plugin->m_pHandle); dlclose(plugin->m_pHandle); diff --git a/src/plugins/PluginSystem.hpp b/src/plugins/PluginSystem.hpp index f0c9c9ad..ce2c2bb2 100644 --- a/src/plugins/PluginSystem.hpp +++ b/src/plugins/PluginSystem.hpp @@ -23,6 +23,7 @@ class CPlugin { std::vector registeredDecorations; std::vector> registeredCallbacks; std::vector registeredDispatchers; + std::vector> registeredHyprctlCommands; }; class CPluginSystem { -- cgit v1.2.3