/* * Copyright 2026 Joel Klinghed * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #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; }