#include "notify.hh" #include "dbus_common.hh" #include "find_desktop.hh" #include #include #include #include #include #include #include #include int Notify::run(std::optional 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 cwd; if (d.HasMember("cwd") && d["cwd"].IsString()) { cwd = d["cwd"].GetString(); } std::optional notification_type; if (d.HasMember("notification_type") && d["notification_type"].IsString()) { notification_type = d["notification_type"].GetString(); } std::optional 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; }