lib/schema/StatusNotifierItem.ex

defmodule ExSni.Schema.StatusNotifierItem do
  use ExDBus.Schema

  node do
    interface "org.kde.StatusNotifierItem" do
      property("Category", "s", :read)
      property("Id", "s", :read)
      property("Title", "s", :read)
      property("Status", "s", :read)
      property("WindowId", "i", :read)

      # An additional path to add to the theme search path to find the icons specified above.
      property("IconThemePath", "s", :read)
      property("Menu", "o", :read)
      property("ItemIsMenu", "b", :read)

      # main icon
      # names are preferred over pixmaps
      property("IconName", "s", :read)
      # struct containing width, height and image data
      property("IconPixmap", "a(iiay)", :read) do
        annotation("org.qtproject.QtDBus.QtTypeName", "QXdgDBusImageVector")
      end

      # struct containing width, height and image data
      property("OverlayIconName", "s", :read)

      property("OverlayIconPixmap", "a(iiay)", :read) do
        annotation("org.qtproject.QtDBus.QtTypeName", "QXdgDBusImageVector")
      end

      # Requesting attention icon
      property("AttentionIconName", "s", :read)

      # same definition as image
      property("AttentionIconPixmap", "a(iiay)", :read) do
        annotation("org.qtproject.QtDBus.QtTypeName", "QXdgDBusImageVector")
      end

      # tooltip data

      # (iiay) is an image
      property("ToolTip", "(sa(iiay)ss)", :read) do
        annotation("org.qtproject.QtDBus.QtTypeName", "QXdgDBusToolTipStruct")
      end

      # interaction: the systemtray wants the application to do something
      method "ContextMenu" do
        # we're passing the coordinates of the icon, so the app knows where to put the popup window -->
        arg("x", "i", :in)
        arg("y", "i", :in)
      end

      method "Activate" do
        arg("x", "i", :in)
        arg("y", "i", :in)
      end

      method "SecondaryActivate" do
        arg("x", "i", :in)
        arg("y", "i", :in)
      end

      method "Scroll" do
        arg("delta", "i", :in)
        arg("orientation", "s", :in)
      end

      # Signals: the client wants to change something in the status-->
      signal("NewTitle")
      signal("NewIcon")
      signal("NewAttentionIcon")
      signal("NewOverlayIcon")
      signal("NewMenu")
      signal("NewToolTip")

      signal "NewStatus" do
        arg("status", "s")
      end
    end
  end
end