diff options
| author | Joel Klinghed <the_jk@opera.com> | 2026-01-12 23:06:20 +0100 |
|---|---|---|
| committer | Joel Klinghed <the_jk@opera.com> | 2026-01-12 23:06:20 +0100 |
| commit | dfeb19b0a83b8ce57d28bf94a4f8d129993d1064 (patch) | |
| tree | d352908df286058059e306c350d89a07c67049eb /src/notify.cc | |
Initial commit
Diffstat (limited to 'src/notify.cc')
| -rw-r--r-- | src/notify.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/notify.cc b/src/notify.cc new file mode 100644 index 0000000..2403dc6 --- /dev/null +++ b/src/notify.cc @@ -0,0 +1,59 @@ +#include "notify.hh" + +#include "dbus_common.hh" +#include "find_desktop.hh" + +#include <iostream> +#include <optional> +#include <rapidjson/document.h> +#include <rapidjson/error/en.h> +#include <rapidjson/istreamwrapper.h> +#include <sdbus-c++/sdbus-c++.h> +#include <string> +#include <utility> + +int Notify::run(std::optional<std::string> display) { + rapidjson::Document d; + rapidjson::IStreamWrapper stream(std::cin); + d.ParseStream(stream); + if (d.HasParseError()) { + std::cerr << "Error parsing input: " << d.GetErrorOffset() << ": " + << rapidjson::GetParseError_En(d.GetParseError()) << '\n'; + return 2; + } + + if (d.IsObject() && d.HasMember("session_id") && d["session_id"].IsString() && + d.HasMember("hook_event_name") && d["hook_event_name"].IsString()) { + std::string session_id = d["session_id"].GetString(); + std::string event_name = d["hook_event_name"].GetString(); + std::optional<std::string> cwd; + if (d.HasMember("cwd") && d["cwd"].IsString()) { + cwd = d["cwd"].GetString(); + } + std::optional<std::string> notification_type; + if (d.HasMember("notification_type") && d["notification_type"].IsString()) { + notification_type = d["notification_type"].GetString(); + } + + std::optional<std::string> desktop = + find_desktop(std::move(display), /* use_prefix */ false); + + auto proxy = sdbus::createProxy(dbus::kServiceName, dbus::kObjectPath); + + try { + proxy->callMethod("notify") + .onInterface(dbus::kInterfaceName) + .withArguments(session_id, event_name, cwd.value_or(""), + notification_type.value_or(""), desktop.value_or("")) + .dontExpectReply(); + } catch (sdbus::Error const& err) { + std::cerr << "Failed to notify: " << err.what() << '\n'; + return 2; + } + + return 0; + } + + std::cerr << "Unexpected input." << '\n'; + return 2; +} |
