add --notify

This commit is contained in:
Vaxry 2023-12-06 19:45:49 +00:00
parent 51fb8686ab
commit d5e404fbcb
3 changed files with 107 additions and 36 deletions

View File

@ -535,17 +535,17 @@ bool CPluginManager::disablePlugin(const std::string& name) {
return ret; return ret;
} }
void CPluginManager::ensurePluginsLoadState() { ePluginLoadStateReturn CPluginManager::ensurePluginsLoadState() {
if (headersValid() != HEADERS_OK) { if (headersValid() != HEADERS_OK) {
std::cerr << "\n" << std::string{Colors::RED} + "" + Colors::RESET + " headers are not up-to-date, please run hyprpm update."; std::cerr << "\n" << std::string{Colors::RED} + "" + Colors::RESET + " headers are not up-to-date, please run hyprpm update.";
return; return LOADSTATE_HEADERS_OUTDATED;
} }
const auto HOME = getenv("HOME"); const auto HOME = getenv("HOME");
const auto HIS = getenv("HYPRLAND_INSTANCE_SIGNATURE"); const auto HIS = getenv("HYPRLAND_INSTANCE_SIGNATURE");
if (!HOME || !HIS) { if (!HOME || !HIS) {
std::cerr << "PluginManager: no $HOME or HIS\n"; std::cerr << "PluginManager: no $HOME or HIS\n";
return; return LOADSTATE_FAIL;
} }
const auto HYPRPMPATH = DataState::getDataStatePath() + "/"; const auto HYPRPMPATH = DataState::getDataStatePath() + "/";
@ -622,6 +622,8 @@ void CPluginManager::ensurePluginsLoadState() {
} }
std::cout << Colors::GREEN << "" << Colors::RESET << " Plugin load state ensured\n"; std::cout << Colors::GREEN << "" << Colors::RESET << " Plugin load state ensured\n";
return LOADSTATE_OK;
} }
bool CPluginManager::loadUnloadPlugin(const std::string& path, bool load) { bool CPluginManager::loadUnloadPlugin(const std::string& path, bool load) {
@ -645,3 +647,7 @@ void CPluginManager::listAllPlugins() {
} }
} }
} }
void CPluginManager::notify(const eNotifyIcons icon, uint32_t color, int durationMs, const std::string& message) {
execAndGet("hyprctl notify " + std::to_string((int)icon) + " " + std::to_string(durationMs) + " " + std::to_string(color) + " " + message);
}

View File

@ -5,13 +5,32 @@
enum eHeadersErrors enum eHeadersErrors
{ {
HEADERS_OK, HEADERS_OK = 0,
HEADERS_NOT_HYPRLAND, HEADERS_NOT_HYPRLAND,
HEADERS_MISSING, HEADERS_MISSING,
HEADERS_CORRUPTED, HEADERS_CORRUPTED,
HEADERS_MISMATCHED, HEADERS_MISMATCHED,
}; };
enum eNotifyIcons
{
ICON_WARNING = 0,
ICON_INFO,
ICON_HINT,
ICON_ERROR,
ICON_CONFUSED,
ICON_OK,
ICON_NONE
};
enum ePluginLoadStateReturn
{
LOADSTATE_OK = 0,
LOADSTATE_FAIL,
LOADSTATE_PARTIAL_FAIL,
LOADSTATE_HEADERS_OUTDATED
};
class CPluginManager { class CPluginManager {
public: public:
bool addNewPluginRepo(const std::string& url); bool addNewPluginRepo(const std::string& url);
@ -25,9 +44,11 @@ class CPluginManager {
bool enablePlugin(const std::string& name); bool enablePlugin(const std::string& name);
bool disablePlugin(const std::string& name); bool disablePlugin(const std::string& name);
void ensurePluginsLoadState(); ePluginLoadStateReturn ensurePluginsLoadState();
bool loadUnloadPlugin(const std::string& path, bool load); bool loadUnloadPlugin(const std::string& path, bool load);
void notify(const eNotifyIcons icon, uint32_t color, int durationMs, const std::string& message);
}; };
inline std::unique_ptr<CPluginManager> g_pPluginManager; inline std::unique_ptr<CPluginManager> g_pPluginManager;

View File

@ -26,61 +26,105 @@ int main(int argc, char** argv, char** envp) {
ARGS[i] = std::string{argv[i]}; ARGS[i] = std::string{argv[i]};
} }
if (ARGS.size() < 2 || ARGS[1] == "--help" || ARGS[1] == "-h") { if (ARGS.size() < 2) {
std::cout << HELP; std::cout << HELP;
return 1; return 1;
} }
std::vector<std::string> command;
bool notify = false;
for (int i = 1; i < argc; ++i) {
if (ARGS[i].starts_with("-")) {
if (ARGS[i] == "--help" || ARGS[i] == "-h") {
std::cout << HELP;
return 0;
} else if (ARGS[i] == "--notify" || ARGS[i] == "-n") {
notify = true;
} else {
std::cerr << "Unrecognized option " << ARGS[i];
return 1;
}
} else {
command.push_back(ARGS[i]);
}
}
g_pPluginManager = std::make_unique<CPluginManager>(); g_pPluginManager = std::make_unique<CPluginManager>();
if (ARGS[1] == "add") { if (command[0] == "add") {
if (ARGS.size() < 3) { if (command.size() < 2) {
std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for add.\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for add.\n";
return 1; return 1;
} }
return g_pPluginManager->addNewPluginRepo(ARGS[2]) ? 0 : 1; return g_pPluginManager->addNewPluginRepo(command[1]) ? 0 : 1;
} else if (ARGS[1] == "remove") { } else if (command[0] == "remove") {
if (ARGS.size() < 3) { if (ARGS.size() < 2) {
std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for remove.\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for remove.\n";
return 1; return 1;
} }
return g_pPluginManager->removePluginRepo(ARGS[2]) ? 0 : 1; return g_pPluginManager->removePluginRepo(command[1]) ? 0 : 1;
} else if (ARGS[1] == "update") { } else if (command[0] == "update") {
bool headersValid = g_pPluginManager->headersValid() == HEADERS_OK; bool headersValid = g_pPluginManager->headersValid() == HEADERS_OK;
bool headers = g_pPluginManager->updateHeaders(); bool headers = g_pPluginManager->updateHeaders();
if (headers) { if (headers) {
g_pPluginManager->updatePlugins(!headersValid); bool ret1 = g_pPluginManager->updatePlugins(!headersValid);
g_pPluginManager->ensurePluginsLoadState();
} if (!ret1)
} else if (ARGS[1] == "enable") { return 1;
if (ARGS.size() < 3) {
auto ret2 = g_pPluginManager->ensurePluginsLoadState();
if (ret2 != LOADSTATE_OK)
return 1;
} else if (notify)
g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Couldn't update headers");
} else if (command[0] == "enable") {
if (ARGS.size() < 2) {
std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for enable.\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for enable.\n";
return 1; return 1;
} }
if (!g_pPluginManager->enablePlugin(ARGS[2])) { if (!g_pPluginManager->enablePlugin(command[1])) {
std::cerr << Colors::RED << "" << Colors::RESET << " Couldn't enable plugin (missing?)\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Couldn't enable plugin (missing?)\n";
return 1; return 1;
} }
g_pPluginManager->ensurePluginsLoadState(); auto ret = g_pPluginManager->ensurePluginsLoadState();
} else if (ARGS[1] == "disable") { if (ret != LOADSTATE_OK)
if (ARGS.size() < 3) { return 1;
} else if (command[0] == "disable") {
if (command.size() < 2) {
std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for disable.\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Not enough args for disable.\n";
return 1; return 1;
} }
if (!g_pPluginManager->disablePlugin(ARGS[2])) { if (!g_pPluginManager->disablePlugin(command[1])) {
std::cerr << Colors::RED << "" << Colors::RESET << " Couldn't disable plugin (missing?)\n"; std::cerr << Colors::RED << "" << Colors::RESET << " Couldn't disable plugin (missing?)\n";
return 1; return 1;
} }
g_pPluginManager->ensurePluginsLoadState(); auto ret = g_pPluginManager->ensurePluginsLoadState();
} else if (ARGS[1] == "load") { if (ret != LOADSTATE_OK)
g_pPluginManager->ensurePluginsLoadState(); return 1;
} else if (ARGS[1] == "list") { } else if (command[0] == "load") {
auto ret = g_pPluginManager->ensurePluginsLoadState();
if (ret != LOADSTATE_OK && notify) {
switch (ret) {
case LOADSTATE_FAIL:
case LOADSTATE_PARTIAL_FAIL: g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Failed to load plugins"); break;
case LOADSTATE_HEADERS_OUTDATED:
g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Failed to load plugins: Outdated headers. Please run hyprpm update manually.");
break;
default: break;
}
} else if (notify) {
g_pPluginManager->notify(ICON_OK, 0, 4000, "[hyprpm] Loaded plugins");
}
} else if (command[0] == "list") {
g_pPluginManager->listAllPlugins(); g_pPluginManager->listAllPlugins();
} else { } else {
std::cout << HELP; std::cout << HELP;