[PATCH] home: services: Add xmodmap.

  • Done
  • quality assurance status badge
Details
2 participants
  • conses
  • Ludovic Courtès
Owner
unassigned
Submitted by
conses
Severity
normal

Debbugs page

conses wrote 2 years ago
(address . guix-patches@gnu.org)
867cvo9y6b.fsf@conses.eu
---
gnu/home/services/desktop.scm | 109 ++++++++++++++++++++++++++++++++++
1 file changed, 109 insertions(+)

Toggle diff (136 lines)
diff --git a/gnu/home/services/desktop.scm b/gnu/home/services/desktop.scm
index cb25b03b64..b3c60b017e 100644
--- a/gnu/home/services/desktop.scm
+++ b/gnu/home/services/desktop.scm
@@ -22,10 +22,13 @@ (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 xorg) (xmodmap)
#:autoload (gnu packages xdisorg) (redshift)
+ #:use-module (guix packages)
#:use-module (guix records)
#:use-module (guix gexp)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-43)
#:use-module (ice-9 match)
#:export (home-redshift-configuration
home-redshift-configuration?
@@ -226,3 +229,109 @@ (define home-dbus-service-type
(default-value (home-dbus-configuration))
(description
"Run the session-specific D-Bus inter-process message bus.")))
+
+
+;;;
+;;; xmodmap
+;;;
+
+(define-configuration/no-serialization home-xmodmap-configuration
+ (xmodmap
+ (package xmodmap)
+ "The @code{xmodmap} package to use.")
+ (config
+ (alist '())
+ "Association list of key and value pairs for the
+ @code{xmodmap} configuration file. Its syntax can take something like
+the following:
+
+@example
+'((#(add mod4) . Print)
+ (clear lock)
+ (clear control)
+ (#(keycode 66) . Control_L)
+ (#(add control) . #(Control_L Control_R)))
+@end example"))
+
+(define (home-xmodmap-shepherd-service config)
+ (list
+ (shepherd-service
+ (provision '(xmodmap))
+ (start #~(make-system-constructor
+ (string-join
+ (list #$(file-append
+ (home-xmodmap-configuration-xmodmap config)
+ "/bin/xmodmap")
+ #$(home-xmodmap-file config)))))
+ (one-shot? #t))))
+
+(define (get-xmodmap-configuration field-name val)
+ (define serialize-term
+ (match-lambda
+ ((? vector? e)
+ (string-join
+ (vector-fold
+ (lambda (i acc e)
+ (append
+ acc
+ (list (serialize-term e))))
+ '() e) " "))
+ ((? symbol? e) (symbol->string e))
+ ((? number? e) (number->string e))
+ (e e)))
+
+ (define serialize-field
+ (match-lambda
+ ((? list? e)
+ (string-join
+ (map
+ (lambda (x)
+ (serialize-term x))
+ e)
+ " "))
+ ((key . value)
+ (format #f "~a = ~a"
+ (serialize-term key)
+ (serialize-term value)))
+ (key (string-append (serialize-term key)))))
+
+ #~(string-append
+ #$@(interpose
+ (map serialize-field val)
+ "\n" 'suffix)))
+
+(define (home-xmodmap-files-service config)
+ `(("xmodmap/config"
+ ,(home-xmodmap-file config))))
+
+(define (home-xmodmap-file config)
+ (mixed-text-file
+ "config"
+ (get-xmodmap-configuration
+ #f (home-xmodmap-configuration-config config))))
+
+(define (home-xmodmap-profile-service config)
+ (list (home-xmodmap-configuration-xmodmap config)))
+
+(define home-xmodmap-service-type
+ (service-type
+ (name 'home-xmodmap)
+ (extensions
+ (list
+ (service-extension
+ home-profile-service-type
+ home-xmodmap-profile-service)
+ (service-extension
+ home-xdg-configuration-files-service-type
+ home-xmodmap-files-service)
+ (service-extension
+ home-shepherd-service-type
+ home-xmodmap-shepherd-service)))
+ (description "Configure @code{xmodmap} bindings and rules.")
+ (default-value (home-xmodmap-configuration))))
+
+(define (generate-home-xmodmap-documentation)
+ (generate-documentation
+ `((home-xmodmap-configuration
+ ,home-xmodmap-configuration-fields))
+ 'home-xmodmap-configuration))
--
2.39.1



--
Best regards,
conses
Ludovic Courtès wrote 2 years ago
(name . conses)(address . contact@conses.eu)
87wn3k21la.fsf@gnu.org
Hello,

This looks like a useful addition!

Some comments below; maybe Andrew will bring a different perspective.

conses <contact@conses.eu> skribis:

Toggle quote (3 lines)
> ---
> gnu/home/services/desktop.scm | 109 ++++++++++++++++++++++++++++++++++

It’d be great if you could provide a ChangeLog-style commit log (you can
check the manual and ‘git log’ to see what it’s like); if you can’t, we
can help with that.

More importantly, could you add documentation to guix.texi, similar to
what is done for the other Home services? That is: a few introductory
lines, an example, and the reference (data types, variables,
procedures).

Toggle quote (13 lines)
> + (alist '())
> + "Association list of key and value pairs for the
> + @code{xmodmap} configuration file. Its syntax can take something like
> +the following:
> +
> +@example
> +'((#(add mod4) . Print)
> + (clear lock)
> + (clear control)
> + (#(keycode 66) . Control_L)
> + (#(add control) . #(Control_L Control_R)))
> +@end example"))

I don’t quite get the syntax.

Use of vectors is unusual in this context, I’d recommend against it.

Regarding pairs: in some cases, the cdr is a symbol/vector, in other
cases it’s a one-element list (as in ‘(clear lock)’). That also makes
it a bit confusing to me.

Perhaps we should try to make it look more consistent? WDYT?

Toggle quote (12 lines)
> +(define (home-xmodmap-shepherd-service config)
> + (list
> + (shepherd-service
> + (provision '(xmodmap))
> + (start #~(make-system-constructor
> + (string-join
> + (list #$(file-append
> + (home-xmodmap-configuration-xmodmap config)
> + "/bin/xmodmap")
> + #$(home-xmodmap-file config)))))
> + (one-shot? #t))))

Perhaps it’d be useful to have a ‘stop’ procedure that undoes that
changes? In which case it wouldn’t be one-shot anymore.

Toggle quote (10 lines)
> + (define serialize-field
> + (match-lambda
> + ((? list? e)
> + (string-join
> + (map
> + (lambda (x)
> + (serialize-term x))
> + e)
> + " "))

Just: (string-join (map serialize-term e)).

Toggle quote (16 lines)
> +(define home-xmodmap-service-type
> + (service-type
> + (name 'home-xmodmap)
> + (extensions
> + (list
> + (service-extension
> + home-profile-service-type
> + home-xmodmap-profile-service)
> + (service-extension
> + home-xdg-configuration-files-service-type
> + home-xmodmap-files-service)
> + (service-extension
> + home-shepherd-service-type
> + home-xmodmap-shepherd-service)))
> + (description "Configure @code{xmodmap} bindings and rules.")

Please expand the description a bit.

TIA!

Ludo’.
conses wrote 2 years ago
[PATCH v2] home: services: Add home-xmodmap-service-type.
(name . Ludovic Courtès)(address . ludo@gnu.org)
86edpox2zd.fsf@conses.eu
* gnu/home/services/desktop.scm (home-xmodmap-service-type)
(home-xmodmap-configuration): New variables;
(xmodmap-shepherd-service)
(get-xmodmap-configuration)
(get-xmodmap-file)
(add-xmodmap-config-file)
(add-xmodmap-package): New procedures;
* doc/guix.texi (Desktop Services): Document it.
---
doc/guix.texi | 51 +++++++++++++++++++++
gnu/home/services/desktop.scm | 85 +++++++++++++++++++++++++++++++++++
2 files changed, 136 insertions(+)

Toggle diff (174 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 6671ba9305..c9ec781e8b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -42541,6 +42541,57 @@ Desktop Home Services
@end table
@end deftp
+@defvar home-xmodmap-service-type
+This is the service type for the
+@uref{https://gitlab.freedesktop.org/xorg/app/xmodmap,xmodmap} utility
+to modify keymaps and pointer button mappings under the Xorg display
+server. Its associated value must be a
+@code{home-xmodmap-configuration} record, as shown below.
+
+The syntax for the expression grammar is quite straightforward. You can
+either provide a list of cons cells and strings like this:
+
+@lisp
+(service home-xmodmap-service-type
+ (home-xmodmap-configuration
+ (config '(("add mod4" . "Print")
+ "clear lock"
+ "clear control"
+ ("keycode 66" . "Control_L")
+ ("add control" . "Control_L Control_R")))))
+@end lisp
+
+Alternatively, there is a more Lisp-like configuration syntax via Scheme
+symbols, lists, and vectors, that you can use like this:
+
+@lisp
+(service home-xmodmap-service-type
+ (home-xmodmap-configuration
+ (config '((#(add mod4) . Print)
+ (clear lock)
+ (clear control)
+ (#(keycode 66) . Control_L)
+ (#(add control) . #(Control_L Control_R))))))
+@end lisp
+@end defvar
+
+@deftp {Data Type} home-xmodmap-configuration
+The configuration record for @code{home-xmodmap-service-type}. Its
+available fields are:
+
+@table @asis
+@item @code{xmodmap} (default: @code{xmodmap}) (type: file-like)
+The @code{xmodmap} package to use.
+
+@item @code{config} (default: @code{config}) (type: list)
+The list of expressions to be placed in the
+@file{~/.config/xmodmap/config} configuration file and read on service
+startup.
+
+@end table
+@end deftp
+
+
@node Guix Home Services
@subsection Guix Home Services
diff --git a/gnu/home/services/desktop.scm b/gnu/home/services/desktop.scm
index cb25b03b64..8bc3d82cba 100644
--- a/gnu/home/services/desktop.scm
+++ b/gnu/home/services/desktop.scm
@@ -22,10 +22,12 @@ (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 xorg) (setxkbmap xmodmap)
#:autoload (gnu packages xdisorg) (redshift)
#:use-module (guix records)
#:use-module (guix gexp)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-43)
#:use-module (ice-9 match)
#:export (home-redshift-configuration
home-redshift-configuration?
@@ -226,3 +228,86 @@ (define home-dbus-service-type
(default-value (home-dbus-configuration))
(description
"Run the session-specific D-Bus inter-process message bus.")))
+
+
+;;;
+;;; xmodmap
+;;;
+
+(define-configuration/no-serialization home-xmodmap-configuration
+ (xmodmap
+ (file-like xmodmap)
+ "The @code{xmodmap} package to use.")
+ (config
+ (list '())
+ "List of expressions to be inserted in the @file{.config/xmodmap/config}
+configuration file."))
+
+(define (xmodmap-shepherd-service config)
+ (list
+ (shepherd-service
+ (provision '(xmodmap))
+ (start #~(make-system-constructor
+ (string-join
+ (list #$(file-append
+ (home-xmodmap-configuration-xmodmap config)
+ "/bin/xmodmap")
+ #$(get-xmodmap-file config)))))
+ (stop #~(make-system-constructor
+ #$(file-append setxkbmap "/bin/setxkbmap")))
+ (documentation "On startup, run @code{xmodmap} and read the expressions in
+the configuration file. On stop, reset all the mappings back to the
+defaults."))))
+
+(define (get-xmodmap-configuration field-name val)
+ (define serialize-term
+ (match-lambda
+ ((? vector? e)
+ (string-join
+ (vector-fold (lambda (_ acc e)
+ (append acc (list (serialize-term e))))
+ '() e)))
+ ((? symbol? e) (symbol->string e))
+ ((? number? e) (number->string e))
+ (e e)))
+
+ (define serialize-field
+ (match-lambda
+ ((? list? e)
+ (string-join (map serialize-term e)))
+ ((key . value)
+ (format #f "~a = ~a" (serialize-term key) (serialize-term value)))
+ (key (string-append (serialize-term key)))))
+
+ #~(string-append
+ #$@(interpose
+ (map serialize-field val)
+ "\n" 'suffix)))
+
+(define (get-xmodmap-file config)
+ (mixed-text-file
+ "config"
+ (get-xmodmap-configuration
+ #f (home-xmodmap-configuration-config config))))
+
+(define (add-xmodmap-config-file config)
+ `(("xmodmap/config"
+ ,(get-xmodmap-file config))))
+
+(define (add-xmodmap-package config)
+ (list (home-xmodmap-configuration-xmodmap config)))
+
+(define home-xmodmap-service-type
+ (service-type
+ (name 'home-xmodmap)
+ (extensions
+ (list
+ (service-extension home-profile-service-type
+ add-xmodmap-package)
+ (service-extension home-xdg-configuration-files-service-type
+ add-xmodmap-config-file)
+ (service-extension home-shepherd-service-type
+ xmodmap-shepherd-service)))
+ (default-value (home-xmodmap-configuration))
+ (description "Run the @code{xmodmap} utility to modify keymaps and pointer
+buttons under the Xorg display server via user-defined expressions.")))
--
2.39.1



--
Best regards,
conses
conses wrote 2 years ago
Re: bug#62101: [PATCH] home: services: Add xmodmap.
(name . Ludovic Courtès)(address . ludo@gnu.org)
86a60cx2ff.fsf@conses.eu
Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (5 lines)
> It’d be great if you could provide a ChangeLog-style commit log (you can
> check the manual and ‘git log’ to see what it’s like); if you can’t, we
> can help with that.
>

Apologies for missing this, I added it in v2.

Toggle quote (6 lines)
> More importantly, could you add documentation to guix.texi, similar to
> what is done for the other Home services? That is: a few introductory
> lines, an example, and the reference (data types, variables,
> procedures).
>

Likewise.

Toggle quote (23 lines)
>> + (alist '())
>> + "Association list of key and value pairs for the
>> + @code{xmodmap} configuration file. Its syntax can take something like
>> +the following:
>> +
>> +@example
>> +'((#(add mod4) . Print)
>> + (clear lock)
>> + (clear control)
>> + (#(keycode 66) . Control_L)
>> + (#(add control) . #(Control_L Control_R)))
>> +@end example"))
>
> I don’t quite get the syntax.
>
> Use of vectors is unusual in this context, I’d recommend against it.
>
> Regarding pairs: in some cases, the cdr is a symbol/vector, in other
> cases it’s a one-element list (as in ‘(clear lock)’). That also makes
> it a bit confusing to me.
>
> Perhaps we should try to make it look more consistent? WDYT?

I've amended the type of config to be of list instead. As I've hinted
in the manual, the motivation for including vectors and lists is to
provide a more Lisp-like configuration syntax for those that want it, it
can simply take strings too. IMO there's no point in making it
consistent since the original syntax isn't consistent in the first
place, you can check out some examples here

Toggle quote (17 lines)
>
>> +(define (home-xmodmap-shepherd-service config)
>> + (list
>> + (shepherd-service
>> + (provision '(xmodmap))
>> + (start #~(make-system-constructor
>> + (string-join
>> + (list #$(file-append
>> + (home-xmodmap-configuration-xmodmap config)
>> + "/bin/xmodmap")
>> + #$(home-xmodmap-file config)))))
>> + (one-shot? #t))))
>
> Perhaps it’d be useful to have a ‘stop’ procedure that undoes that
> changes? In which case it wouldn’t be one-shot anymore.
>

I found here https://askubuntu.com/a/1155211 that xmodmap settings can
be simply reversed by calling setxkbmap, so I've added a stop procedure
for this.

Toggle quote (19 lines)
>> +(define home-xmodmap-service-type
>> + (service-type
>> + (name 'home-xmodmap)
>> + (extensions
>> + (list
>> + (service-extension
>> + home-profile-service-type
>> + home-xmodmap-profile-service)
>> + (service-extension
>> + home-xdg-configuration-files-service-type
>> + home-xmodmap-files-service)
>> + (service-extension
>> + home-shepherd-service-type
>> + home-xmodmap-shepherd-service)))
>> + (description "Configure @code{xmodmap} bindings and rules.")
>
> Please expand the description a bit.
>

Done.

--
Best regards,
conses
Ludovic Courtès wrote 2 years ago
(name . conses)(address . contact@conses.eu)(address . 62101@debbugs.gnu.org)
87r0to9xt3.fsf_-_@gnu.org
Hi,

conses <contact@conses.eu> skribis:

Toggle quote (9 lines)
> * gnu/home/services/desktop.scm (home-xmodmap-service-type)
> (home-xmodmap-configuration): New variables;
> (xmodmap-shepherd-service)
> (get-xmodmap-configuration)
> (get-xmodmap-file)
> (add-xmodmap-config-file)
> (add-xmodmap-package): New procedures;
> * doc/guix.texi (Desktop Services): Document it.

Overall LGTM, with minor issues:

Toggle quote (3 lines)
> +The syntax for the expression grammar is quite straightforward. You can
> +either provide a list of cons cells and strings like this:

I’d suggest avoiding the first sentence, because what looks
straightforward to someone might be intimidating to another. We also
avoid jargon like “cons cell” in the manual.

What about something like this:

The @code{key-map} field takes a list of objects, each of which is
either a @dfn{statement} (a string) or an @dfn{assignment} (a pair of
strings). As an example, the snippet below configures the @kbd{mod4}
key (???) such that it does XYZ, FIXME: finish sentence :-)

… where ‘key-map’ is IMO a better name for ‘config’.

Toggle quote (9 lines)
> +Alternatively, there is a more Lisp-like configuration syntax via Scheme
> +symbols, lists, and vectors, that you can use like this:
> +
> +@lisp
> +(service home-xmodmap-service-type
> + (home-xmodmap-configuration
> + (config '((#(add mod4) . Print)
> + (clear lock)

I don’t find it very useful; I’d rather support only one syntax, but
clearly explained. So my suggestion would be to drop this.

Toggle quote (2 lines)
> +@item @code{config} (default: @code{config}) (type: list)

So this would be renamed to @code{key-map} maybe.

Toggle quote (2 lines)
> +(define (get-xmodmap-configuration field-name val)

As a rule of thumb, you can drop ‘get-’ from procedure names; procedures
like this one are rarely called ‘get-SOMETHING’.

Toggle quote (3 lines)
> + (service-extension home-profile-service-type
> + add-xmodmap-package)

I believe this extension is unnecessary.

Could you send an updated patch?

Thank you!

Ludo’.
conses wrote 2 years ago
[PATCH v3] home: services: Add home-xmodmap-service-type.
(name . Ludovic Courtès)(address . ludo@gnu.org)
863563oa44.fsf@conses.eu
* gnu/home/services/desktop.scm (home-xmodmap-service-type)
(home-xmodmap-configuration): New variables;
(serialize-xmodmap-configuration)
(xmodmap-shepherd-service): New procedures;
* doc/guix.texi (Desktop Services): Document it.
---
- Tweak manual as per latest comments.
- Remove profile and xdg-configuration-file service extensions.
- config -> key-map in home-xmodmap-configuration.
doc/guix.texi | 41 +++++++++++++++++++++++++
gnu/home/services/desktop.scm | 57 +++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+)

Toggle diff (132 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index aa98d7df4b..baa5fb5ea5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -42587,6 +42587,47 @@ Desktop Home Services
@end deftp
+@defvar home-xmodmap-service-type
+This is the service type for the
+@uref{https://gitlab.freedesktop.org/xorg/app/xmodmap,xmodmap} utility
+to modify keymaps and pointer button mappings under the Xorg display
+server. Its associated value must be a
+@code{home-xmodmap-configuration} record, as shown below.
+
+The @code{key-map} field takes a list of objects, each of which is
+either a @dfn{statement} (a string) or an @dfn{assignment} (a pair of
+strings). As an example, the snippet below swaps around the
+@kbd{Caps_Lock} and the @kbd{Control_L} keys, by first removing the
+keysyms (on the right-hand side) from the corresponding modifier maps
+(on the left-hand side), re-assigning them by swapping each other out,
+and finally adding back the keysyms to the modifier maps.
+
+@lisp
+(service home-xmodmap-service-type
+ (home-xmodmap-configuration
+ (key-map '(("remove Lock" . "Caps_Lock")
+ ("remove Control" . "Control_L")
+ ("keysym Control_L" . "Caps_Lock")
+ ("keysym Caps_Lock" . "Control_L")
+ ("add Lock" . "Caps_Lock")
+ ("add Control" . "Control_L")))))
+@end lisp
+@end defvar
+
+@deftp {Data Type} home-xmodmap-configuration
+The configuration record for @code{home-xmodmap-service-type}. Its
+available fields are:
+
+@table @asis
+@item @code{xmodmap} (default: @code{xmodmap}) (type: file-like)
+The @code{xmodmap} package to use.
+
+@item @code{key-map} (default: @code{'()}) (type: list)
+The list of expressions to be read by @code{xmodmap} on service startup.
+
+@end table
+@end deftp
+
@node Guix Home Services
@subsection Guix Home Services
diff --git a/gnu/home/services/desktop.scm b/gnu/home/services/desktop.scm
index ab2b871539..fb1cd44060 100644
--- a/gnu/home/services/desktop.scm
+++ b/gnu/home/services/desktop.scm
@@ -24,6 +24,7 @@ (define-module (gnu home services desktop)
#:use-module (gnu services configuration)
#:autoload (gnu packages glib) (dbus)
#:autoload (gnu packages xdisorg) (redshift unclutter)
+ #:autoload (gnu packages xorg) (setxkbmap xmodmap)
#:use-module (guix records)
#:use-module (guix gexp)
#:use-module (srfi srfi-1)
@@ -275,3 +276,59 @@ (define home-unclutter-service-type
(description "Run the @code{unclutter} daemon, which, on systems using the
Xorg graphical display server, automatically hides the cursor after a
user-defined timeout has expired.")))
+
+
+;;;
+;;; Xmodmap.
+;;;
+
+(define-configuration/no-serialization home-xmodmap-configuration
+ (xmodmap
+ (file-like xmodmap)
+ "The @code{xmodmap} package to use.")
+ (key-map
+ (list '())
+ "List of expressions to be read by @code{xmodmap} on service startup."))
+
+(define (serialize-xmodmap-configuration field-name val)
+ (define serialize-field
+ (match-lambda
+ ((key . value)
+ (format #f "~a = ~a" key value))
+ (e e)))
+
+ #~(string-append
+ #$@(interpose (map serialize-field val) "\n" 'suffix)))
+
+(define (xmodmap-shepherd-service config)
+ (define config-file
+ (mixed-text-file
+ "config"
+ (serialize-xmodmap-configuration
+ #f (home-xmodmap-configuration-key-map config))))
+
+ (list
+ (shepherd-service
+ (provision '(xmodmap))
+ (start #~(make-system-constructor
+ (string-join
+ (list #$(file-append
+ (home-xmodmap-configuration-xmodmap config)
+ "/bin/xmodmap")
+ #$config-file))))
+ (stop #~(make-system-constructor
+ #$(file-append setxkbmap "/bin/setxkbmap")))
+ (documentation "On startup, run @code{xmodmap} and read the expressions in
+the configuration file. On stop, reset all the mappings back to the
+defaults."))))
+
+(define home-xmodmap-service-type
+ (service-type
+ (name 'home-xmodmap)
+ (extensions
+ (list
+ (service-extension home-shepherd-service-type
+ xmodmap-shepherd-service)))
+ (default-value (home-xmodmap-configuration))
+ (description "Run the @code{xmodmap} utility to modify keymaps and pointer
+buttons under the Xorg display server via user-defined expressions.")))
--
2.39.1



--
Best regards,
conses
Ludovic Courtès wrote 2 years ago
(name . conses)(address . contact@conses.eu)(address . 62101-done@debbugs.gnu.org)
877cvfvyhc.fsf@gnu.org
Hi,

conses <contact@conses.eu> skribis:

Toggle quote (6 lines)
> * gnu/home/services/desktop.scm (home-xmodmap-service-type)
> (home-xmodmap-configuration): New variables;
> (serialize-xmodmap-configuration)
> (xmodmap-shepherd-service): New procedures;
> * doc/guix.texi (Desktop Services): Document it.

Applied, thank you!

Ludo’.
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 62101@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 62101
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch
You may also tag this issue. See list of standard tags. For example, to set the confirmed and easy tags
mumi command -t +confirmed -t +easy
Or, remove the moreinfo tag and set the help tag
mumi command -t -moreinfo -t +help