From: Pierre Neidhardt <mail@ambrevar.xyz>
To: Nicolas Goaziou <mail@nicolasgoaziou.fr>
Cc: Guix-devel <guix-devel@gnu.org>
Subject: Re: Add helper for .desktop file creation?
Date: Mon, 27 May 2019 09:13:53 +0200 [thread overview]
Message-ID: <877eacmksu.fsf@ambrevar.xyz> (raw)
In-Reply-To: <8736l2nzwm.fsf@ambrevar.xyz>
[-- Attachment #1: Type: text/plain, Size: 4679 bytes --]
I came up with the following function, it seems to work well (need to
test a little more though).
Before I could submit a patch, I was wondering where I should place it:
it seems that placing it in guix/utils.scm triggers a whole world
rebuild.
Is there a way around it or should I send this patch to core-updates?
--8<---------------cut here---------------start------------->8---
(define* (make-desktop-entry-file destination #:key
(type "Application") ; One of "Application", "Link" or "Directory".
(version "1.1")
name
(generic-name name)
(no-display #f)
comment
icon
(hidden #f)
only-show-in
not-show-in
(d-bus-activatable #f)
try-exec
exec
path
(terminal #f)
actions
mime-type
(categories "Application")
implements
keywords
(startup-notify #t)
startup-w-m-class
#:rest all-args)
"Create a desktop entry file at DESTINATION.
You must specify NAME.
Values can be booleans, numbers, strings or list of strings.
Additionally, locales can be specified with an alist where the key is the
locale. The #f key specifies the default. Example:
#:name '((#f \"I love Guix\") (\"fr\" \"J'aime Guix\"))
produces
Name=I love Guix
Name[fr]=J'aime Guix
For a complete description of the format, see the specifications at
https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html."
(define (escape-semicolon s)
(string-join (string-split s #\;) "\\;"))
(define* (parse key value #:optional locale)
(set! value (match value
(#t "true")
(#f "false")
((? number? n) n)
((? string? s) (escape-semicolon s))
((? list? value)
(catch 'wrong-type-arg
(lambda () (string-join (map escape-semicolon value) ";"))
(lambda args (error "List arguments can only contain strings: ~a" args))))
(_ (error "Value must be a boolean, number, string or list of strings"))))
(format #t "~a=~a~%"
(if locale
(format #f "~a[~a]" key locale)
key)
value))
(define key-error-message "This procedure only takes key arguments beside DESTINATION")
(unless name
(error "Missing NAME key argument"))
(unless (member #:type all-args)
(set! all-args (append (list #:type type) all-args)))
(mkdir-p (dirname destination))
(with-output-to-file destination
(lambda ()
(format #t "[Desktop Entry]~%")
(let loop ((args all-args))
(match args
(() #t)
((_) (error key-error-message))
((key value . ...)
(unless (keyword? key)
(error key-error-message))
(set! key
(string-join (map string-titlecase
(string-split (symbol->string
(keyword->symbol key))
#\-))
""))
(match value
(((_ . _) . _)
(for-each (lambda (locale-subvalue)
(parse key
(if (and (list? (cdr locale-subvalue))
(= 1 (length (cdr locale-subvalue))))
;; Support both proper and improper lists for convenience.
(cadr locale-subvalue)
(cdr locale-subvalue))
(car locale-subvalue)))
value))
(_
(parse key value)))
(loop (cddr args))))))))
--8<---------------cut here---------------end--------------->8---
--
Pierre Neidhardt
https://ambrevar.xyz/
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 487 bytes --]
next prev parent reply other threads:[~2019-05-27 7:14 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-24 7:53 Add helper for .desktop file creation? Pierre Neidhardt
2019-05-25 12:06 ` Nicolas Goaziou
2019-05-25 12:21 ` Nicolas Goaziou
2019-05-25 12:51 ` Pierre Neidhardt
2019-05-25 13:33 ` Nicolas Goaziou
2019-05-25 13:45 ` Nicolas Goaziou
2019-05-25 14:20 ` Pierre Neidhardt
2019-05-25 18:37 ` Pierre Neidhardt
2019-05-27 7:13 ` Pierre Neidhardt [this message]
2019-05-27 16:15 ` Nicolas Goaziou
2019-05-27 16:45 ` Pierre Neidhardt
2019-05-27 17:39 ` Nicolas Goaziou
2019-05-27 17:58 ` Pierre Neidhardt
2019-05-27 19:19 ` Nicolas Goaziou
2019-05-30 8:24 ` Pierre Neidhardt
2019-05-27 19:54 ` Marius Bakke
2019-05-27 21:02 ` Pierre Neidhardt
2019-05-25 13:38 ` Amin Bandali
2019-05-25 14:30 ` Danny Milosavljevic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=877eacmksu.fsf@ambrevar.xyz \
--to=mail@ambrevar.xyz \
--cc=guix-devel@gnu.org \
--cc=mail@nicolasgoaziou.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.