defmodule ExSni.Router do defstruct icon: nil, icon_registered: false, menu: nil @type t() :: %__MODULE__{ icon: nil | pid() | atom() | ExSni.Icon.t() | tuple(), icon_registered: boolean(), menu: nil | pid() | atom() | ExSni.Menu.t() | tuple() } end defimpl ExDBus.Router.Protocol, for: ExSni.Router do alias ExSni.{Icon, Menu} # Route Menu methods to server if any def method( %{menu: server_pid}, "/MenuBar", "com.canonical.dbusmenu", method_name, _signature, arguments, _context ) when is_pid(server_pid) do Menu.Server.method(server_pid, method_name, arguments) end def method( %{menu: {:via, _, _} = server_via}, "/MenuBar", "com.canonical.dbusmenu", method_name, _signature, arguments, _context ) do Menu.Server.method(server_via, method_name, arguments) end def method( %{icon: %Icon{}}, "/StatusNotifierItem", "org.kde.StatusNotifierItem", "Activate", _signature, {_x, _y}, _context ) do {:ok, [], []} end def method( %{icon: %Icon{}}, "/StatusNotifierItem", "org.kde.StatusNotifierItem", "SecondaryActivate", _signature, {_x, _y}, _context ) do {:ok, [], []} end def method( %{icon: %Icon{}}, "/StatusNotifierItem", "org.kde.StatusNotifierItem", "Scroll", _signature, {_delta, _orientation}, _context ) do {:ok, [], []} end def method(_router, _path, _interface, _method, _signature, _args, _context) do :skip end def get_property( %{icon: %Icon{} = icon}, "/StatusNotifierItem", "org.kde.StatusNotifierItem", property, _context ) do ExSni.DbusProtocol.get_property(icon, property) end # Route Menu property getters to menu server def get_property( %{menu: server_pid}, "/MenuBar", "com.canonical.dbusmenu", property, _context ) when is_pid(server_pid) do Menu.Server.get_property(server_pid, property) end def get_property( %{menu: {:via, _, _} = server_via}, "/MenuBar", "com.canonical.dbusmenu", property, _context ) do Menu.Server.get_property(server_via, property) end def get_property(_router, _path, _interface, _property, _context) do :skip end # SNI properties are all read-only def set_property(_router, _path, _interface, _property, _value, _context) do :skip end end