lib/bus.ex

defmodule ExSni.Bus do
  @doc """
  Returns true if there is a StatusNotifierWatcher available
  on the Session Bus.
  """
  @spec is_supported?() :: boolean()
  def is_supported?() do
    with {:ok, bus} <- ExDBus.Bus.start_link(:session),
         :ok <- ExDBus.Bus.connect(bus) do
      result = is_supported?(bus)
      ExDBus.Bus.close(bus)
      result
    else
      _ ->
        false
    end
  end

  @doc """
  Returns true if there is a StatusNotifierWatcher available
  on the Session Bus.
  - bus_pid - The pid of the ExDBus.Bus GenServer
  """
  @spec is_supported?(GenServer.server()) :: boolean()
  def is_supported?(bus_pid) do
    if ExDBus.Bus.name_has_owner(bus_pid, "org.kde.StatusNotifierWatcher") do
      ExDBus.Bus.has_interface?(
        bus_pid,
        "org.kde.StatusNotifierWatcher",
        "/StatusNotifierWatcher",
        "org.kde.StatusNotifierWatcher"
      )
    else
      false
    end
  end
end