On 8/23/22 16:30, Simon McVittie wrote:
That wording seems strange when compared with how GLib implements it,
but again, I didn't write this spec; all I can tell you is what one
of the implementations that have been in daily use for many years is
doing. Perhaps GLib is relying on the "as-if" rule, or perhaps the spec
doesn't match reality, or perhaps the spec author meant something that
is not how we're interpreting it.

Some of my questions still remain unanswered. But I'm not going to complain, passing the work to the shell significantly simplifies the code logic.

Because GLib is substituting the field codes before doing shell-style
parsing, it would be wrong for it not to quote the expansion of the field
codes. If it didn't quote the expansion of the field codes, then the
shell-style parsing would give it the wrong answer, because not every
character in a shell-style string represents itself: some are metacharacters
with a special meaning, like quotes and spaces.

Thanks, now I understand. My current plan is:
a) Expand the basic \s, \n, \t, \r, and \\ while parsing the desktop files.
b) Substitute the field codes with a quoted version of them (I personally put it in double quotes and then escape $, `, " and \ instead of using single quotes and then doing '"'"' for single quotes). This ensures that the shell won't do anything unexpected with it and that there will be the correct number of arguments as the spec requires:

> Implementations must take care not to expand field codes into multiple arguments unless explicitly instructed by this specification. This means that name fields, filenames and other replacements that can contain spaces must be passed as a single argument to the executable program after expansion.

c) Pass it to the shell. This gets pretty interesting when Terminal=true. I have to do execlp(emulator, emulator, "-e", shell, "-c", exec, (char *) NULL). For example for Htop with xterm and /bin/sh: "xterm -e /bin/sh -c htop". That is the terminal emulator executing shell executing the program. Heh.

For the GNOME side, all you'd really need is the GLib library, not
any GUIs. GDesktopAppInfo objects are responsible for handling .desktop
files.

Thanks! You helped me understand the standard better.

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

Reply via email to