From 42d5d8f4e67500e778fbe5541464a7cab1288e00 Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Thu, 10 Feb 2022 00:29:21 +0000 Subject: [PATCH] initial commit creates service and listens for Notify --- crier/crier.fnl | 94 ++++++++++++++++++++++++++++++++++++++++++++ crier/dbus-proxy.nix | 29 ++++++++++++++ crier/default.nix | 43 ++++++++++++++++++++ crier/interface.xml | 42 ++++++++++++++++++++ crier/shell.nix | 1 + 5 files changed, 209 insertions(+) create mode 100644 crier/crier.fnl create mode 100644 crier/dbus-proxy.nix create mode 100644 crier/default.nix create mode 100644 crier/interface.xml create mode 100644 crier/shell.nix diff --git a/crier/crier.fnl b/crier/crier.fnl new file mode 100644 index 0000000..be5c023 --- /dev/null +++ b/crier/crier.fnl @@ -0,0 +1,94 @@ +(local lgi (require :lgi)) +(local dbus (require :dbus_proxy)) +(local Gio lgi.Gio) +(local GLib lgi.GLib) +(local GV lgi.GLib.Variant) +(local variant dbus.variant) +(local inspect (require :inspect)) +(local Gtk lgi.Gtk) + + +(local dbus-service-attrs + { + :bus dbus.Bus.SESSION + :name "org.freedesktop.Notifications" + :interface "org.freedesktop.Notifications" + :path "/org/freedesktop/Notifications" + }) + +(local bus (dbus.Proxy:new + { + :bus dbus.Bus.SESSION + :name "org.freedesktop.DBus" + :interface "org.freedesktop.DBus" + :path "/org/freedesktop/DBus" + })) + + +(local DBUS_NAME_FLAG_DO_NOT_QUEUE 4) +(local DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1) +(local DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2) +(local DBUS_REQUEST_NAME_REPLY_EXISTS 3) +(local DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4) + + +(let [ret (bus:RequestName dbus-service-attrs.name + DBUS_NAME_FLAG_DO_NOT_QUEUE)] + (match ret + DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER + true + + DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER + true + + DBUS_REQUEST_NAME_REPLY_IN_QUEUE + (error "unexpected DBUS_REQUEST_NAME_REPLY_IN_QUEUE") + + DBUS_REQUEST_NAME_REPLY_EXISTS + (error "already running"))) + +(var notification-id 10) +(fn next-id [] + (set notification-id (+ notification-id 1)) + notification-id) + + +(fn handle-dbus-method-call [conn sender path interface method params invocation] + (when (and (= path dbus-service-attrs.path) + (= interface dbus-service-attrs.interface)) + (match method + "GetCapabilities" + (invocation:return_value (GV "as" ["actions"])) + + "GetServerInformation" + (invocation:return_value + (GV "(ssss)" ["crier" + "telent" + "0.1" + "1.2"])) + + "Notify" + (let [p params] + (print (inspect (dbus.variant.strip p))) + (invocation:return_value (GV "(u)" [(next-id)])))))) + +(fn handle-dbus-get [conn sender path interface name] + (when (and (= path dbus-service-attrs.path) + (= interface dbus-service-attrs.interface) + (= name "Visible")) + (lgi.GLib.Variant "b" true))) + +(local interface-info + (let [xml (: (io.open "interface.xml" "r") :read "*a") + node-info (Gio.DBusNodeInfo.new_for_xml xml)] + (. node-info.interfaces 1))) + +(Gio.DBusConnection.register_object + bus.connection + dbus-service-attrs.path + interface-info + (lgi.GObject.Closure handle-dbus-method-call) + (lgi.GObject.Closure handle-dbus-get) + (lgi.GObject.Closure (fn [a] (print "set")))) + +(Gtk:main) diff --git a/crier/dbus-proxy.nix b/crier/dbus-proxy.nix new file mode 100644 index 0000000..5e2fd62 --- /dev/null +++ b/crier/dbus-proxy.nix @@ -0,0 +1,29 @@ +{ lua, lgi, buildLuaPackage, fetchFromGitHub }: +let + + simpleName = "dbus_proxy"; + +in +# TODO: add busted and checkPhase? +buildLuaPackage rec { + version = "0.10.2"; + pname = simpleName; # nixpkgs unstable needs this + name = "${pname}-${version}"; # nixpkgs 21.11 needs this + + src = fetchFromGitHub { + owner = "stefano-m"; + repo = "lua-${simpleName}"; + rev = "v${version}"; + sha256 = "0kl8ff1g1kpmslzzf53cbzfl1bmb5cb91w431hbz0z0vdrramh6l"; + }; + + propagatedBuildInputs = [ lgi ]; + + buildPhase = ":"; + + installPhase = '' + mkdir -p "$out/share/lua/${lua.luaversion}" + cp -r src/${pname} "$out/share/lua/${lua.luaversion}/" + ''; + +} diff --git a/crier/default.nix b/crier/default.nix new file mode 100644 index 0000000..4802fe0 --- /dev/null +++ b/crier/default.nix @@ -0,0 +1,43 @@ +{ stdenv +, callPackage +, fetchFromGitHub +, fetchurl +, gobject-introspection +, gtk3 +, lib +, librsvg +, lua53Packages +, lua5_3 +, makeWrapper +, writeText +}: +let fennel = fetchurl { + name = "fennel.lua"; + url = "https://fennel-lang.org/downloads/fennel-1.0.0"; + hash = "sha256:1nha32yilzagfwrs44hc763jgwxd700kaik1is7x7lsjjvkgapw7"; + }; + dbusProxy = callPackage ./dbus-proxy.nix { + inherit (lua53Packages) lgi buildLuaPackage; + lua = lua5_3; + }; + + lua = lua5_3.withPackages (ps: with ps; [ + dbusProxy + inspect + lgi + luafilesystem + luaposix + readline + ]); +in stdenv.mkDerivation { + pname = "crier"; + version = "0.1"; + src =./.; + inherit fennel; + + buildInputs = [ lua gtk3 gobject-introspection.dev ]; + nativeBuildInputs = [ lua makeWrapper ]; + + makeFlags = [ "PREFIX=${placeholder "out"}" ]; + +} diff --git a/crier/interface.xml b/crier/interface.xml new file mode 100644 index 0000000..ffe860f --- /dev/null +++ b/crier/interface.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crier/shell.nix b/crier/shell.nix new file mode 100644 index 0000000..a760f25 --- /dev/null +++ b/crier/shell.nix @@ -0,0 +1 @@ +with import {} ; callPackage ./. {}