commit 83d9573917caea2491c1cb83642d9a289174b579
parent c0abf7f2e57d9a168b3417c2670c6e9716fe093d
Author: Daniel Barlow <dan@telent.net>
Date: Sun, 30 Jan 2022 17:20:02 +0000
Merge branch 'main' of github.com:telent/slab
Diffstat:
| M | saturn/main.fnl | | | 66 | +++++++++++++++++++++++++++++++++++++++++++++++++++--------------- |
1 file changed, 51 insertions(+), 15 deletions(-)
diff --git a/saturn/main.fnl b/saturn/main.fnl
@@ -3,6 +3,8 @@
(local dbus (require :dbus_proxy))
(local inspect (require :inspect))
+(local ICON_SIZE 64)
+
(local dbus-service-attrs
{
:bus dbus.Bus.SESSION
@@ -25,13 +27,23 @@
<interface name='net.telent.saturn'>
<method name='SetVisible'>
<arg type='b' name='visible' direction='in'/>
+ <doc:doc><doc:description>
+ Switch visibility of launcher window
+ </doc:description></doc:doc>
+ </method>
+ <method name='ToggleVisible'>
+ <doc:doc><doc:description>
+ Toggle launcher window visible/invisible
+ </doc:description></doc:doc>
</method>
+ <property name='Visible' type='b' access='read'>
+ </property>
</interface>
</node>"
node-info (Gio.DBusNodeInfo.new_for_xml xml)]
(. node-info.interfaces 1)))
-
+;; these values don't seem to be available through introspection
(local DBUS_NAME_FLAG_DO_NOT_QUEUE 4)
(local DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1)
(local DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2)
@@ -43,10 +55,13 @@
(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
;; Show the currently running instance
(let [saturn (dbus.Proxy:new dbus-service-attrs)]
@@ -59,7 +74,11 @@
(local inspect (require :inspect))
(local posix (require :posix))
+(local path {
+ :absolute? (fn [str] (= (str:sub 1 1) "/"))
+ })
(local Gtk lgi.Gtk)
+(local GdkPixbuf lgi.GdkPixbuf)
(local Pango lgi.Pango)
(local icon-theme (Gtk.IconTheme.get_default))
@@ -72,15 +91,21 @@
}))
(fn find-icon [name]
(var found false)
- (if (= (name.sub 1 1) "/")
- (Gtk.Image.new_from_file name)
- (let [sizes (icon-theme:get_icon_sizes name)]
-
- (each [_ res (pairs [64 48]) :until found]
- (set found (icon-theme:load_icon
- name res
- (+ Gtk.IconLookupFlags.FORCE_SVG Gtk.IconLookupFlags.USE_BUILTIN))))
- (Gtk.Image.new_from_pixbuf found))))
+ (if (path.absolute? name)
+ ;; From a direct path
+ (set found (GdkPixbuf.Pixbuf.new_from_file_at_size name ICON_SIZE ICON_SIZE))
+ ;; From icon theme
+ (let [sizes (icon-theme:get_icon_sizes name)]
+ ;; Uses a list of "safe fallback" values
+ ;; Try the desired size first
+ (each [_ res (pairs [ICON_SIZE 128 64 48]) :until found]
+ (set found
+ (-?> (icon-theme:load_icon
+ name res
+ (+ Gtk.IconLookupFlags.FORCE_SVG Gtk.IconLookupFlags.USE_BUILTIN))
+ (: :scale_simple ICON_SIZE ICON_SIZE GdkPixbuf.InterpType.BILINEAR))))
+ ))
+ (Gtk.Image.new_from_pixbuf found))
(fn read-desktop-file [f]
(let [parsed (inifile.parse f)
@@ -136,18 +161,29 @@
(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
+ "SetVisible"
+ (let [[value] (dbus.variant.strip params)]
+ (if value (window:show_all) (window:hide))
+ (invocation:return_value nil))
+ "ToggleVisible"
+ (let [v window.visible]
+ (if v (window:hide) (window:show_all))
+ (invocation:return_value nil)))))
+
+(fn handle-dbus-get [conn sender path interface name]
+ (when (and (= path dbus-service-attrs.path)
(= interface dbus-service-attrs.interface)
- (= method "SetVisible"))
- (let [[value] (dbus.variant.strip params)]
- (if value (window:show_all) (window:hide))
- (invocation:return_value nil))))
+ (= name "Visible"))
+ (lgi.GLib.Variant "b" window.visible)))
(Gio.DBusConnection.register_object
bus.connection
dbus-service-attrs.path
interface-info
(lgi.GObject.Closure handle-dbus-method-call)
- (lgi.GObject.Closure (fn [a] (print "get")))
+ (lgi.GObject.Closure handle-dbus-get)
(lgi.GObject.Closure (fn [a] (print "set"))))
(let [grid (Gtk.FlowBox {