[PATCH 0/2] gnu: home: Add home-mako-service-type.

  • Open
  • quality assurance status badge
Details
3 participants
  • Andrew Tropin
  • Christopher Baines
  • (
Owner
unassigned
Submitted by
(
Severity
normal
(
(address . guix-patches@gnu.org)(name . ()(address . paren@disroot.org)
20221017162828.14482-1-paren@disroot.org
Heya,

This patchset adds a home service for configuring the Mako notification
daemon.

( (2):
gnu: mako: Patch makoctl to refer directly to binaries.
gnu: home: Add home-mako-service-type.

gnu/home/services/desktop.scm | 338 +++++++++++++++++++++++++++++++++-
gnu/packages/wm.scm | 36 +++-
2 files changed, 362 insertions(+), 12 deletions(-)

--
2.38.0
(
[PATCH 1/2] gnu: mako: Patch makoctl to refer directly to binaries.
(address . 58585@debbugs.gnu.org)(name . ()(address . paren@disroot.org)
20221017164703.14949-1-paren@disroot.org
* gnu/packages/wm.scm (mako)[arguments]<#:phases>{'patch-makoctl}:
New phase.
[inputs]: Add jq.
---
gnu/packages/wm.scm | 36 ++++++++++++++++++++++++++----------
1 file changed, 26 insertions(+), 10 deletions(-)

Toggle diff (57 lines)
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index af406ed2ed..d96846a21c 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -58,6 +58,7 @@
;;; Copyright © 2022 Elais Player <elais@fastmail.com>
;;; Copyright © 2022 Trevor Richards <trev@trevdev.ca>
;;; Copyright © 2022 Fredrik Salomonsson <plattfot@posteo.net>
+;;; Copyright © 2022 ( <paren@disroot.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -1807,17 +1808,32 @@ (define-public mako
(package
(name "mako")
(version "1.7.1")
- (source
- (origin
- (method git-fetch)
- (uri (git-reference
- (url "https://github.com/emersion/mako")
- (commit (string-append "v" version))))
- (file-name (git-file-name name version))
- (sha256
- (base32 "0vpar1a7zafkd2plmyaackgba6fyg35s9zzyxmj8j7v2q5zxirgz"))))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/emersion/mako")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0vpar1a7zafkd2plmyaackgba6fyg35s9zzyxmj8j7v2q5zxirgz"))))
(build-system meson-build-system)
- (inputs (list basu cairo gdk-pixbuf pango wayland))
+ (arguments
+ (list #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'patch-makoctl
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* "makoctl"
+ (("^BUSCTL=.*$")
+ (string-append
+ "BUSCTL="
+ (search-input-file inputs "bin/basuctl")
+ "\n"))
+ (("jq ")
+ (string-append
+ (search-input-file inputs "bin/jq")
+ " "))))))))
+ (inputs (list basu cairo gdk-pixbuf jq pango wayland))
(native-inputs (list pkg-config scdoc wayland-protocols))
(home-page "https://wayland.emersion.fr/mako")
(synopsis "Lightweight Wayland notification daemon")
--
2.38.0
(
[PATCH 2/2] gnu: home: Add home-mako-service-type.
(address . 58585@debbugs.gnu.org)(name . ()(address . paren@disroot.org)
20221017164703.14949-2-paren@disroot.org
* gnu/home/services/desktop.scm (home-mako-section,
home-mako-configuration): New record types.
(%home-mako-default-section, %home-mako-default-grouped-section,
home-mako-service-type): New variables.

Unfortunately, there is no way to actually use this service to
run the daemon itself, as Mako tries to connect to Wayland, which
is impossible as WAYLAND_DISPLAY is almost never set in session
Shepherd's environment. So, this service simply writes the
configuration file to $XDG_CONFIG_HOME/mako/config, and leave the
actual execution of ``mako'' to the user.
---
gnu/home/services/desktop.scm | 338 +++++++++++++++++++++++++++++++++-
1 file changed, 336 insertions(+), 2 deletions(-)

Toggle diff (364 lines)
diff --git a/gnu/home/services/desktop.scm b/gnu/home/services/desktop.scm
index a2ab2b4d07..a929a7533a 100644
--- a/gnu/home/services/desktop.scm
+++ b/gnu/home/services/desktop.scm
@@ -22,17 +22,26 @@ (define-module (gnu home services desktop)
#:use-module (gnu home services shepherd)
#:use-module (gnu services configuration)
#:autoload (gnu packages glib) (dbus)
+ #:autoload (gnu packages wm) (mako)
#:autoload (gnu packages xdisorg) (redshift)
- #:use-module (guix records)
#:use-module (guix gexp)
+ #:use-module (guix records)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 format)
#:use-module (ice-9 match)
#:export (home-redshift-configuration
home-redshift-configuration?
home-redshift-service-type
home-dbus-configuration
- home-dbus-service-type))
+ home-dbus-service-type
+
+ home-mako-section
+ %home-mako-default-section
+ %home-mako-default-grouped-section
+ home-mako-configuration
+ home-mako-service-type))
;;;
@@ -224,3 +233,328 @@ (define home-dbus-service-type
(default-value (home-dbus-configuration))
(description
"Run the session-specific D-Bus inter-process message bus.")))
+
+
+;;;
+;;; Mako.
+;;;
+
+(define-record-type* <home-mako-section>
+ home-mako-section make-home-mako-section
+ home-mako-section?
+
+ (if-app-name home-mako-if-app-name ;string | #f
+ (default #f))
+ (if-app-icon home-mako-if-app-icon ;string | #f
+ (default #f))
+ (if-summary home-mako-if-summary ;string | #f
+ (default #f))
+ (if-summary-regex? home-mako-if-summary-regex? ;boolean
+ (default #f))
+ (if-body home-mako-if-body ;string | #f
+ (default #f))
+ (if-body-regex? home-mako-if-body-regex? ;boolean
+ (default #f))
+ (if-urgency home-mako-if-urgency ;'low | 'normal | 'critical | #f
+ (default #f))
+ (if-category home-mako-if-category ;string | #f
+ (default #f))
+ (if-desktop-entry home-mako-if-desktop-entry ;string | #f
+ (default #f))
+ (if-actionable? home-mako-if-actionable? ;boolean | '()
+ (default '()))
+ (if-expiring? home-mako-if-expiring? ;boolean | '()
+ (default '()))
+ (if-mode home-mako-if-mode ;string | #f
+ (default #f))
+ (if-grouped? home-mako-if-grouped? ;boolean | '()
+ (default '()))
+ (if-group-index home-mako-if-group-index ;integer | #f
+ (default #f))
+ (if-hidden? home-mako-if-hidden? ;boolean | '()
+ (default '()))
+ (if-output home-mako-if-output ;string | #f
+ (default #f))
+ (if-anchor home-mako-if-anchor ;'top-right | 'top-center | 'top-left | 'bottom-right | 'bottom-center | 'bottom-left | 'center-right | 'center-left | 'center | #f
+ (default #f))
+
+ (on-button-left home-mako-on-button-left ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
+ (default 'default))
+ (on-button-middle home-mako-on-button-middle ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | string | list of (file-like | string)
+ (default #f))
+ (on-button-right home-mako-on-button-right ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
+ (default 'dismiss))
+ (on-touch home-mako-on-touch ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
+ (default 'dismiss))
+ (on-notify home-mako-on-notify ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
+ (default #f))
+
+ (font home-mako-font ;string
+ (default "monospace"))
+ (font-size home-mako-font-size ;number
+ (default 10))
+
+ (background-color home-mako-background-color ;string
+ (default "285577FF"))
+ (text-color home-mako-text-color ;string
+ (default "FFFFFFFF"))
+
+ (width home-mako-width ;integer
+ (default 300))
+ (height home-mako-height ;integer
+ (default 100))
+ (outer-margin home-mako-outer-margin ;list of integer
+ (default '(0)))
+ (margin home-mako-margin ;list of integer
+ (default '(10)))
+ (padding home-mako-padding ;list of integer
+ (default '(5)))
+
+ (border-size home-mako-border-size ;integer
+ (default 2))
+ (border-color home-mako-border-color ;string
+ (default "4C7899FF"))
+ (border-radius home-mako-border-radius ;integer
+ (default 0))
+
+ (progress-color home-mako-progress-color ;string
+ (default "5588AAFF"))
+ (progress-style home-mako-progress-style ;'over | 'source
+ (default 'over))
+
+ (icons? home-mako-icons? ;boolean
+ (default #t))
+ (max-icon-size home-mako-max-icon-size ;integer
+ (default 64))
+ (icon-path home-mako-icon-path ;list of string
+ (default '()))
+ (icon-location home-mako-icon-location ;'left | 'right | 'top | 'bottom
+ (default 'left))
+
+ (markup? home-mako-markup? ;boolean
+ (default #t))
+ (actions? home-mako-actions? ;boolean
+ (default #t))
+ (history? home-mako-history? ;boolean
+ (default #t))
+ (invisible? home-mako-invisible? ;boolean
+ (default #f))
+
+ (format home-mako-format
+ (default "<b>%s</b>\\n%b"))
+ (text-alignment home-mako-text-alignment ;'left | 'center | 'right
+ (default 'left))
+
+ (default-timeout home-mako-default-timeout ;integer
+ (default 0))
+ (ignore-timeout? home-mako-ignore-timeout? ;boolean
+ (default #f))
+
+ (group-by home-mako-group-by ;list of string
+ (default #f))
+ (max-visible home-mako-max-visible ;integer
+ (default #f))
+
+ (output home-mako-output ;string
+ (default #f))
+ (layer home-mako-layer ;'background | 'bottom | 'top | 'overlay
+ (default 'top))
+ (anchor home-mako-anchor ;'top-right | 'top-center | 'top-left | 'bottom-right | 'bottom-center | 'bottom-left | 'center-right | 'center-left | 'center
+ (default #f)))
+
+(define (home-mako-configuration-header-attributes section)
+ (define (boolean-clause name field)
+ (let ((value (field section)))
+ (cond ((null? value) '())
+ (value (list "!" name " "))
+ (else (list name)))))
+
+ (define (string-clause name field)
+ (let ((value (field section)))
+ (if value
+ (list name "=\"" value "\" ")
+ '())))
+
+ (define (symbol-clause name field)
+ (if (field section)
+ (string-clause name (compose symbol->string field))
+ '()))
+
+ (define (number-clause name field)
+ (if (field section)
+ (string-clause name (compose number->string field))
+ '()))
+
+ (append (string-clause "app-name" home-mako-if-app-name)
+ (string-clause "app-icon" home-mako-if-app-icon)
+ (string-clause (if (home-mako-if-summary-regex? section)
+ "summary~"
+ "summary")
+ home-mako-if-summary)
+ (string-clause (if (home-mako-if-body-regex? section)
+ "body~"
+ "body")
+ home-mako-if-body)
+ (symbol-clause "urgency" home-mako-if-urgency)
+ (string-clause "category" home-mako-if-category)
+ (string-clause "desktop-entry" home-mako-if-desktop-entry)
+ (boolean-clause "actionable" home-mako-if-actionable?)
+ (boolean-clause "expiring" home-mako-if-expiring?)
+ (string-clause "mode" home-mako-if-mode)
+ (boolean-clause "grouped" home-mako-if-grouped?)
+ (number-clause "group-index" home-mako-if-group-index)
+ (boolean-clause "hidden" home-mako-if-hidden?)
+ (string-clause "output" home-mako-if-output)
+ (symbol-clause "anchor" home-mako-if-anchor)))
+
+(define (home-mako-configuration-header section)
+ (match (home-mako-configuration-header-attributes section)
+ (() '())
+ ((attributes ...)
+ (append (list "\n[ ") attributes (list "]\n")))))
+
+(define (home-mako-configuration-body section)
+ (define (string-clause name field)
+ (let ((value (field section)))
+ (if value
+ (list name "=" (field section) "\n")
+ '())))
+
+ (define (boolean-clause name field)
+ (list name "=" (if (field section) "1" "0") "\n"))
+
+ (define (number-clause name field)
+ (if (field section)
+ (string-clause name (compose number->string field))
+ '()))
+
+ (define (symbol-clause name field)
+ (if (field section)
+ (string-clause name (compose symbol->string field))
+ '()))
+
+ (define (colour-clause name field)
+ (string-clause name (compose (cute string-append "#" <>)
+ field)))
+
+ (define (directional-clause name field)
+ (if (field section)
+ (string-clause name (compose (cute string-join <> ",")
+ (cute map number->string <>)
+ field))
+ '()))
+
+ (define (event-clause name field)
+ (append (list name "=")
+ (match (field section)
+ ('default (list "invoke-default-action"))
+ ('dismiss (list "dismiss"))
+ ('dismiss-all (list "dismiss-all"))
+ ('dismiss-group (list "dismiss-group"))
+ ((args ...)
+ (append (list "exec")
+ (append-map (cute list " \"" <> "\"")
+ args)))
+ (#f (list "none")))
+ (list "\n")))
+
+ (append (event-clause "on-button-left" home-mako-on-button-left)
+ (event-clause "on-button-middle" home-mako-on-button-middle)
+ (event-clause "on-button-right" home-mako-on-button-right)
+ (event-clause "on-touch" home-mako-on-touch)
+ (event-clause "on-notify" home-mako-on-notify)
+ (list "font=" (home-mako-font section) " "
+ (number->string (home-mako-font-size section)) "\n")
+ (colour-clause "background-color" home-mako-background-color)
+ (colour-clause "text-color" home-mako-text-color)
+ (number-clause "width" home-mako-width)
+ (number-clause "height" home-mako-height)
+ (directional-clause "outer-margin" home-mako-outer-margin)
+ (directional-clause "margin" home-mako-margin)
+ (directional-clause "padding" home-mako-padding)
+ (number-clause "border-size" home-mako-border-size)
+ (colour-clause "border-color" home-mako-border-color)
+ (number-clause "border-radius" home-mako-border-radius)
+ (list "progress-color="
+ (symbol->string (home-mako-progress-style section))
+ " #" (home-mako-progress-color section) "\n")
+ (boolean-clause "icons" home-mako-icons?)
+ (number-clause "max-icon-size" home-mako-max-icon-size)
+ (string-clause "icon-path"
+ (compose (cute string-join <> ":")
+ home-mako-icon-path))
+ (symbol-clause "icon-location" home-mako-icon-location)
+ (boolean-clause "markup" home-mako-markup?)
+ (boolean-clause "actions" home-mako-actions?)
+ (boolean-clause "history" home-mako-history?)
+ (boolean-clause "invisible" home-mako-invisible?)
+ (string-clause "format" home-mako-format)
+ (symbol-clause "text-alignment" home-mako-text-alignment)
+ (number-clause "default-timeout" home-mako-default-timeout)
+ (boolean-clause "ignore-timeout" home-mako-ignore-timeout?)
+ (boolean-clause "ignore-timeout" home-mako-ignore-timeout?)
+ (if (home-mako-group-by section)
+ (string-clause "group-by"
+ (compose (cute string-join <> ",")
+ home-mako-group-by))
+ '())
+ (number-clause "max-visible" home-mako-max-visible)
+ (string-clause "output" home-mako-output)
+ (symbol-clause "layer" home-mako-layer)
+ (symbol-clause "anchor" home-mako-anchor)))
+
+(define (home-mako-configuration-section section)
+ (append (home-mako-configuration-header section)
+ (home-mako-configuration-body section)))
+
+(define %home-mako-default-section (home-mako-section))
+
+(define %home-mako-default-grouped-section
+ (home-mako-section
+ (if-grouped? #t)
+ (format "(%g) <b>%s</b>\\n%b")))
+
+(define-record-type* <home-mako-configuration>
+ home-mako-configuration make-home-mako-configuration
+ home-mako-configuration?
+
+ (mako home-mako-configuration-mako ;file-like
+ (default mako))
+ (sections home-mako-configuration-sections ;list of <home-mako-section>
+ (default (list %home-mako-default-section
+ %home-mako-default-grouped-section)))
+
+ (max-history home-mako-configuration-max-history ;integer
+ (default 5))
+ (sort home-mako-configuration-sort ;'time | 'priority
+ (default 'time))
+ (sort-order home-mako-configuration-sort-order ;'ascending | 'descending
+ (default 'descending)))
+
+(define (home-mako-configuration-file config)
+ (apply mixed-text-file "mako-config"
+ (append (list "max-history="
+ (number->string
+ (home-mako-configuration-max-history config))
+ "\n"
+ "sort="
+ (match (home-mako-configuration-sort-order config)
+ ('ascending "+")
+ ('descending "-"))
+ (symbol->string (home-mako-configuration-sort config))
+ "\n")
+ (append-map home-mako-configuration-section
+ (home-mako-configuration-sections config)))))
+
+(define (home-mako-xdg-configuration-files config)
+ `(("mako/config" ,(home-mako-configuration-file config))))
+
+(define home-mako-service-type
+ (service-type
+ (name 'home-mako)
+ (extensions
+ (list (service-extension home-xdg-configuration-files-service-type
+ home-mako-xdg-configuration-files)))
+ (default-value (home-mako-configuration))
+ (description
+ "Install and configure the @code{mako} notification daemon.")))
--
2.38.0
A
A
Andrew Tropin wrote on 10 Nov 2022 13:59
Re: [bug#58585] [PATCH 1/2] gnu: mako: Patch makoctl to refer directly to binaries.
87v8nnufqu.fsf@trop.in
On 2022-10-17 17:47, guix-patches@gnu.org wrote:

Toggle quote (63 lines)
> * gnu/packages/wm.scm (mako)[arguments]<#:phases>{'patch-makoctl}:
> New phase.
> [inputs]: Add jq.
> ---
> gnu/packages/wm.scm | 36 ++++++++++++++++++++++++++----------
> 1 file changed, 26 insertions(+), 10 deletions(-)
>
> diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
> index af406ed2ed..d96846a21c 100644
> --- a/gnu/packages/wm.scm
> +++ b/gnu/packages/wm.scm
> @@ -58,6 +58,7 @@
> ;;; Copyright © 2022 Elais Player <elais@fastmail.com>
> ;;; Copyright © 2022 Trevor Richards <trev@trevdev.ca>
> ;;; Copyright © 2022 Fredrik Salomonsson <plattfot@posteo.net>
> +;;; Copyright © 2022 ( <paren@disroot.org>
> ;;;
> ;;; This file is part of GNU Guix.
> ;;;
> @@ -1807,17 +1808,32 @@ (define-public mako
> (package
> (name "mako")
> (version "1.7.1")
> - (source
> - (origin
> - (method git-fetch)
> - (uri (git-reference
> - (url "https://github.com/emersion/mako")
> - (commit (string-append "v" version))))
> - (file-name (git-file-name name version))
> - (sha256
> - (base32 "0vpar1a7zafkd2plmyaackgba6fyg35s9zzyxmj8j7v2q5zxirgz"))))
> + (source (origin
> + (method git-fetch)
> + (uri (git-reference
> + (url "https://github.com/emersion/mako")
> + (commit (string-append "v" version))))
> + (file-name (git-file-name name version))
> + (sha256
> + (base32
> + "0vpar1a7zafkd2plmyaackgba6fyg35s9zzyxmj8j7v2q5zxirgz"))))
> (build-system meson-build-system)
> - (inputs (list basu cairo gdk-pixbuf pango wayland))
> + (arguments
> + (list #:phases
> + #~(modify-phases %standard-phases
> + (add-after 'unpack 'patch-makoctl
> + (lambda* (#:key inputs #:allow-other-keys)
> + (substitute* "makoctl"
> + (("^BUSCTL=.*$")
> + (string-append
> + "BUSCTL="
> + (search-input-file inputs "bin/basuctl")
> + "\n"))
> + (("jq ")
> + (string-append
> + (search-input-file inputs "bin/jq")
> + " "))))))))
> + (inputs (list basu cairo gdk-pixbuf jq pango wayland))
> (native-inputs (list pkg-config scdoc wayland-protocols))
> (home-page "https://wayland.emersion.fr/mako")
> (synopsis "Lightweight Wayland notification daemon")

Applied this patch and pushed, thank you.

--
Best regards,
Andrew Tropin
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEKEGaxlA4dEDH6S/6IgjSCVjB3rAFAmNs9ckACgkQIgjSCVjB
3rC1Dw//Vhsmw81iZO2aVn9GiFgyLgIPw3O/5/iMY/uvWUKo5DTS+Mq1WcVE2UkS
1D7lVJ8FgQpXpCZuT5xDph0ke87X3uAe+zMWmxX8yUTOCecqfAaaZzyMtyIEU7SJ
HBHG5CSSnRF5cDpAtwMRlKtb0W5SY47scieZhRTgSc1sa8bnggTo3q+/AR1KjLlC
2MMz1a5GwoseC9fKgm/fhhYg2QLXFuQDq8AZeve/Kvp9aBqIpyqfh6O40S01HYTR
df6evKPoTOJtHd910m5UIiklEYrbat97b8VSN0quy35p/bYXT6r8vSOdDESkTsXm
Z0+qy5cWUEqCvdb/Pc+sUWKG9bSZPcNn7dx3dA4c09nRvxnc2ykra0KL7N0mkXp6
/wunIX7NbURF0Cqww57IpH7XB/I0PvgAYxDtzwdz4q0FyL1WPcgCcX++sMVVUdJz
tuSRRUxCLzQYgECb8dmYGa5bcfJFWnAMJPB6QvMrEAjacERHHUfGch1AzC9LM35b
VJRF7oVtHzXWutOHcOFmaGodVWfH9moIYQkD5c7F1YkGRdKQrzWj+nXqEzcQvZkb
1AltRCwkbt9/JBKOW94L6U8/BLQ/XfgcquOVuCL5rnJcKPOyG38m9id3Eu5On9Ka
6POWWAmF9NXe7Q22V0BqqmRb4e+pdTRxA0Emshl9sMuzxpz1WZI=
=zH07
-----END PGP SIGNATURE-----

A
A
Andrew Tropin wrote on 10 Nov 2022 14:16
Re: [bug#58585] [PATCH 2/2] gnu: home: Add home-mako-service-type.
87r0ybueyp.fsf@trop.in
On 2022-10-17 17:47, "\( via Guix-patches" via wrote:

Toggle quote (12 lines)
> * gnu/home/services/desktop.scm (home-mako-section,
> home-mako-configuration): New record types.
> (%home-mako-default-section, %home-mako-default-grouped-section,
> home-mako-service-type): New variables.
>
> Unfortunately, there is no way to actually use this service to
> run the daemon itself, as Mako tries to connect to Wayland, which
> is impossible as WAYLAND_DISPLAY is almost never set in session
> Shepherd's environment. So, this service simply writes the
> configuration file to $XDG_CONFIG_HOME/mako/config, and leave the
> actual execution of ``mako'' to the user.

After recent updates to shepherd service

it's now possible to start shepherd manually.

In rde we start shepherd by sway, so it inherits all wayland related
variables.


It's not a perfect solution, but good enough.

Toggle quote (367 lines)
> ---
> gnu/home/services/desktop.scm | 338 +++++++++++++++++++++++++++++++++-
> 1 file changed, 336 insertions(+), 2 deletions(-)
>
> diff --git a/gnu/home/services/desktop.scm b/gnu/home/services/desktop.scm
> index a2ab2b4d07..a929a7533a 100644
> --- a/gnu/home/services/desktop.scm
> +++ b/gnu/home/services/desktop.scm
> @@ -22,17 +22,26 @@ (define-module (gnu home services desktop)
> #:use-module (gnu home services shepherd)
> #:use-module (gnu services configuration)
> #:autoload (gnu packages glib) (dbus)
> + #:autoload (gnu packages wm) (mako)
> #:autoload (gnu packages xdisorg) (redshift)
> - #:use-module (guix records)
> #:use-module (guix gexp)
> + #:use-module (guix records)
> #:use-module (srfi srfi-1)
> + #:use-module (srfi srfi-26)
> + #:use-module (ice-9 format)
> #:use-module (ice-9 match)
> #:export (home-redshift-configuration
> home-redshift-configuration?
> home-redshift-service-type
>
> home-dbus-configuration
> - home-dbus-service-type))
> + home-dbus-service-type
> +
> + home-mako-section
> + %home-mako-default-section
> + %home-mako-default-grouped-section
> + home-mako-configuration
> + home-mako-service-type))
>
>
> ;;;
> @@ -224,3 +233,328 @@ (define home-dbus-service-type
> (default-value (home-dbus-configuration))
> (description
> "Run the session-specific D-Bus inter-process message bus.")))
> +
> +
> +;;;
> +;;; Mako.
> +;;;
> +
> +(define-record-type* <home-mako-section>
> + home-mako-section make-home-mako-section
> + home-mako-section?
> +
> + (if-app-name home-mako-if-app-name ;string | #f
> + (default #f))
> + (if-app-icon home-mako-if-app-icon ;string | #f
> + (default #f))
> + (if-summary home-mako-if-summary ;string | #f
> + (default #f))
> + (if-summary-regex? home-mako-if-summary-regex? ;boolean
> + (default #f))
> + (if-body home-mako-if-body ;string | #f
> + (default #f))
> + (if-body-regex? home-mako-if-body-regex? ;boolean
> + (default #f))
> + (if-urgency home-mako-if-urgency ;'low | 'normal | 'critical | #f
> + (default #f))
> + (if-category home-mako-if-category ;string | #f
> + (default #f))
> + (if-desktop-entry home-mako-if-desktop-entry ;string | #f
> + (default #f))
> + (if-actionable? home-mako-if-actionable? ;boolean | '()
> + (default '()))
> + (if-expiring? home-mako-if-expiring? ;boolean | '()
> + (default '()))
> + (if-mode home-mako-if-mode ;string | #f
> + (default #f))
> + (if-grouped? home-mako-if-grouped? ;boolean | '()
> + (default '()))
> + (if-group-index home-mako-if-group-index ;integer | #f
> + (default #f))
> + (if-hidden? home-mako-if-hidden? ;boolean | '()
> + (default '()))
> + (if-output home-mako-if-output ;string | #f
> + (default #f))
> + (if-anchor home-mako-if-anchor ;'top-right | 'top-center | 'top-left | 'bottom-right | 'bottom-center | 'bottom-left | 'center-right | 'center-left | 'center | #f
> + (default #f))
> +
> + (on-button-left home-mako-on-button-left ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
> + (default 'default))
> + (on-button-middle home-mako-on-button-middle ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | string | list of (file-like | string)
> + (default #f))
> + (on-button-right home-mako-on-button-right ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
> + (default 'dismiss))
> + (on-touch home-mako-on-touch ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
> + (default 'dismiss))
> + (on-notify home-mako-on-notify ;#f | 'default | 'dismiss | 'dismiss-all | 'dismiss-group | list of (file-like | string)
> + (default #f))
> +
> + (font home-mako-font ;string
> + (default "monospace"))
> + (font-size home-mako-font-size ;number
> + (default 10))
> +
> + (background-color home-mako-background-color ;string
> + (default "285577FF"))
> + (text-color home-mako-text-color ;string
> + (default "FFFFFFFF"))
> +
> + (width home-mako-width ;integer
> + (default 300))
> + (height home-mako-height ;integer
> + (default 100))
> + (outer-margin home-mako-outer-margin ;list of integer
> + (default '(0)))
> + (margin home-mako-margin ;list of integer
> + (default '(10)))
> + (padding home-mako-padding ;list of integer
> + (default '(5)))
> +
> + (border-size home-mako-border-size ;integer
> + (default 2))
> + (border-color home-mako-border-color ;string
> + (default "4C7899FF"))
> + (border-radius home-mako-border-radius ;integer
> + (default 0))
> +
> + (progress-color home-mako-progress-color ;string
> + (default "5588AAFF"))
> + (progress-style home-mako-progress-style ;'over | 'source
> + (default 'over))
> +
> + (icons? home-mako-icons? ;boolean
> + (default #t))
> + (max-icon-size home-mako-max-icon-size ;integer
> + (default 64))
> + (icon-path home-mako-icon-path ;list of string
> + (default '()))
> + (icon-location home-mako-icon-location ;'left | 'right | 'top | 'bottom
> + (default 'left))
> +
> + (markup? home-mako-markup? ;boolean
> + (default #t))
> + (actions? home-mako-actions? ;boolean
> + (default #t))
> + (history? home-mako-history? ;boolean
> + (default #t))
> + (invisible? home-mako-invisible? ;boolean
> + (default #f))
> +
> + (format home-mako-format
> + (default "<b>%s</b>\\n%b"))
> + (text-alignment home-mako-text-alignment ;'left | 'center | 'right
> + (default 'left))
> +
> + (default-timeout home-mako-default-timeout ;integer
> + (default 0))
> + (ignore-timeout? home-mako-ignore-timeout? ;boolean
> + (default #f))
> +
> + (group-by home-mako-group-by ;list of string
> + (default #f))
> + (max-visible home-mako-max-visible ;integer
> + (default #f))
> +
> + (output home-mako-output ;string
> + (default #f))
> + (layer home-mako-layer ;'background | 'bottom | 'top | 'overlay
> + (default 'top))
> + (anchor home-mako-anchor ;'top-right | 'top-center | 'top-left | 'bottom-right | 'bottom-center | 'bottom-left | 'center-right | 'center-left | 'center
> + (default #f)))
> +
> +(define (home-mako-configuration-header-attributes section)
> + (define (boolean-clause name field)
> + (let ((value (field section)))
> + (cond ((null? value) '())
> + (value (list "!" name " "))
> + (else (list name)))))
> +
> + (define (string-clause name field)
> + (let ((value (field section)))
> + (if value
> + (list name "=\"" value "\" ")
> + '())))
> +
> + (define (symbol-clause name field)
> + (if (field section)
> + (string-clause name (compose symbol->string field))
> + '()))
> +
> + (define (number-clause name field)
> + (if (field section)
> + (string-clause name (compose number->string field))
> + '()))
> +
> + (append (string-clause "app-name" home-mako-if-app-name)
> + (string-clause "app-icon" home-mako-if-app-icon)
> + (string-clause (if (home-mako-if-summary-regex? section)
> + "summary~"
> + "summary")
> + home-mako-if-summary)
> + (string-clause (if (home-mako-if-body-regex? section)
> + "body~"
> + "body")
> + home-mako-if-body)
> + (symbol-clause "urgency" home-mako-if-urgency)
> + (string-clause "category" home-mako-if-category)
> + (string-clause "desktop-entry" home-mako-if-desktop-entry)
> + (boolean-clause "actionable" home-mako-if-actionable?)
> + (boolean-clause "expiring" home-mako-if-expiring?)
> + (string-clause "mode" home-mako-if-mode)
> + (boolean-clause "grouped" home-mako-if-grouped?)
> + (number-clause "group-index" home-mako-if-group-index)
> + (boolean-clause "hidden" home-mako-if-hidden?)
> + (string-clause "output" home-mako-if-output)
> + (symbol-clause "anchor" home-mako-if-anchor)))
> +
> +(define (home-mako-configuration-header section)
> + (match (home-mako-configuration-header-attributes section)
> + (() '())
> + ((attributes ...)
> + (append (list "\n[ ") attributes (list "]\n")))))
> +
> +(define (home-mako-configuration-body section)
> + (define (string-clause name field)
> + (let ((value (field section)))
> + (if value
> + (list name "=" (field section) "\n")
> + '())))
> +
> + (define (boolean-clause name field)
> + (list name "=" (if (field section) "1" "0") "\n"))
> +
> + (define (number-clause name field)
> + (if (field section)
> + (string-clause name (compose number->string field))
> + '()))
> +
> + (define (symbol-clause name field)
> + (if (field section)
> + (string-clause name (compose symbol->string field))
> + '()))
> +
> + (define (colour-clause name field)
> + (string-clause name (compose (cute string-append "#" <>)
> + field)))
> +
> + (define (directional-clause name field)
> + (if (field section)
> + (string-clause name (compose (cute string-join <> ",")
> + (cute map number->string <>)
> + field))
> + '()))
> +
> + (define (event-clause name field)
> + (append (list name "=")
> + (match (field section)
> + ('default (list "invoke-default-action"))
> + ('dismiss (list "dismiss"))
> + ('dismiss-all (list "dismiss-all"))
> + ('dismiss-group (list "dismiss-group"))
> + ((args ...)
> + (append (list "exec")
> + (append-map (cute list " \"" <> "\"")
> + args)))
> + (#f (list "none")))
> + (list "\n")))
> +
> + (append (event-clause "on-button-left" home-mako-on-button-left)
> + (event-clause "on-button-middle" home-mako-on-button-middle)
> + (event-clause "on-button-right" home-mako-on-button-right)
> + (event-clause "on-touch" home-mako-on-touch)
> + (event-clause "on-notify" home-mako-on-notify)
> + (list "font=" (home-mako-font section) " "
> + (number->string (home-mako-font-size section)) "\n")
> + (colour-clause "background-color" home-mako-background-color)
> + (colour-clause "text-color" home-mako-text-color)
> + (number-clause "width" home-mako-width)
> + (number-clause "height" home-mako-height)
> + (directional-clause "outer-margin" home-mako-outer-margin)
> + (directional-clause "margin" home-mako-margin)
> + (directional-clause "padding" home-mako-padding)
> + (number-clause "border-size" home-mako-border-size)
> + (colour-clause "border-color" home-mako-border-color)
> + (number-clause "border-radius" home-mako-border-radius)
> + (list "progress-color="
> + (symbol->string (home-mako-progress-style section))
> + " #" (home-mako-progress-color section) "\n")
> + (boolean-clause "icons" home-mako-icons?)
> + (number-clause "max-icon-size" home-mako-max-icon-size)
> + (string-clause "icon-path"
> + (compose (cute string-join <> ":")
> + home-mako-icon-path))
> + (symbol-clause "icon-location" home-mako-icon-location)
> + (boolean-clause "markup" home-mako-markup?)
> + (boolean-clause "actions" home-mako-actions?)
> + (boolean-clause "history" home-mako-history?)
> + (boolean-clause "invisible" home-mako-invisible?)
> + (string-clause "format" home-mako-format)
> + (symbol-clause "text-alignment" home-mako-text-alignment)
> + (number-clause "default-timeout" home-mako-default-timeout)
> + (boolean-clause "ignore-timeout" home-mako-ignore-timeout?)
> + (boolean-clause "ignore-timeout" home-mako-ignore-timeout?)
> + (if (home-mako-group-by section)
> + (string-clause "group-by"
> + (compose (cute string-join <> ",")
> + home-mako-group-by))
> + '())
> + (number-clause "max-visible" home-mako-max-visible)
> + (string-clause "output" home-mako-output)
> + (symbol-clause "layer" home-mako-layer)
> + (symbol-clause "anchor" home-mako-anchor)))
> +
> +(define (home-mako-configuration-section section)
> + (append (home-mako-configuration-header section)
> + (home-mako-configuration-body section)))
> +
> +(define %home-mako-default-section (home-mako-section))
> +
> +(define %home-mako-default-grouped-section
> + (home-mako-section
> + (if-grouped? #t)
> + (format "(%g) <b>%s</b>\\n%b")))
> +
> +(define-record-type* <home-mako-configuration>
> + home-mako-configuration make-home-mako-configuration
> + home-mako-configuration?
> +
> + (mako home-mako-configuration-mako ;file-like
> + (default mako))
> + (sections home-mako-configuration-sections ;list of <home-mako-section>
> + (default (list %home-mako-default-section
> + %home-mako-default-grouped-section)))
> +
> + (max-history home-mako-configuration-max-history ;integer
> + (default 5))
> + (sort home-mako-configuration-sort ;'time | 'priority
> + (default 'time))
> + (sort-order home-mako-configuration-sort-order ;'ascending | 'descending
> + (default 'descending)))
> +
> +(define (home-mako-configuration-file config)
> + (apply mixed-text-file "mako-config"
> + (append (list "max-history="
> + (number->string
> + (home-mako-configuration-max-history config))
> + "\n"
> + "sort="
> + (match (home-mako-configuration-sort-order config)
> + ('ascending "+")
> + ('descending "-"))
> + (symbol->string (home-mako-configuration-sort config))
> + "\n")
> + (append-map home-mako-configuration-section
> + (home-mako-configuration-sections config)))))
> +
> +(define (home-mako-xdg-configuration-files config)
> + `(("mako/config" ,(home-mako-configuration-file config))))
> +
> +(define home-mako-service-type
> + (service-type
> + (name 'home-mako)
> + (extensions
> + (list (service-extension home-xdg-configuration-files-service-type
> + home-mako-xdg-configuration-files)))
> + (default-value (home-mako-configuration))
> + (description
> + "Install and configure the @code{mako} notification daemon.")))

In the coming days, I won't have time to try and check all the options
provided here, sorry, maybe someone else would jump in and review this
service in the meantime.

--
Best regards,
Andrew Tropin
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEKEGaxlA4dEDH6S/6IgjSCVjB3rAFAmNs+b4ACgkQIgjSCVjB
3rD10RAAjKu7Fl2DaAgTVqs6GEZC9Lj+whiH8CBOXMHzSHJBf8hCGhS2zIufQhF1
IpqXiH5vNdD68FAQ6Qv73cTL9dzHvP4ISujy74t7hq/u7kny0B4xqtk/2v/8f7Bt
TgxS+YckxLxo6JG9HLXCOz76SDAI1EhsA8mr+FSp9OoFu+aFnjYceFsXH3RIWHk/
nOusJSpvcdx8NFI2RFo/5oRF7Z9qrAfGtpXkM53y1Qq/KHvU7qux4VVMclw7IXFD
u0W0OzGVC1ezJpPsF9n8xsZiBUW1WlIkrYeN4RqNCpQmY2njpxxbCxPHJiNP8wsU
zwtEx9jMIbR77FoV52/ePz9rKnpnZmOXNgljOAs82/eYiMalkT9aNdbYvaQMrwpC
mluDwm1Rb0KOOS4uQa9bLrVOAmm7Yx2KF8ahNnaNIwfD+idmVosLTg4CeSPlRCim
I9Sylck+yfqecbsjapPC9C6vLzMNPXn56b05V5sHTAsMmS0s9Y9CMbEEZ6iiU3D8
6gxwhpPdTgsMk3dS5HYiqvbXrOUsku+Jx5rIepJOh1jIcqnId3OsjU8v6Ovgj0BA
xe93vkqC+RphdhRfLwebkny5Id2PDm/962Z82veNbmHGl3IZeAZGd5eKgt7+F0C4
TT3GN312RZVKQKPqAcl5EmY4pnpanzqvNxOit/Dfzmrh/hvloRs=
=7Dig
-----END PGP SIGNATURE-----

(
(name . Nicolas Graves)(address . ngraves@ngraves.fr)
CO8Q6WJBI8UD.345WHYKV75CN6@guix-framework
Heya,

On Thu Nov 10, 2022 at 1:16 PM GMT, Andrew Tropin wrote:
Toggle quote (2 lines)
> It's not a perfect solution, but good enough.

Actually, I recently realised there's a better way: modify HOME-DBUS-SERVICE-TYPE
to support D-Bus services, like the system DBUS-SERVICE-TYPE does. I'll try to do
that at some point in the future.

-- (
C
C
Christopher Baines wrote on 23 Nov 2022 10:13
tag 58585 moreinfo
(address . control@debbugs.gnu.org)
87mt8ijaoc.fsf@cbaines.net
tags 58585 + moreinfo
quit
?