Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setting the GTK app id #287

Open
LiberalArtist opened this issue Feb 6, 2023 · 0 comments
Open

Setting the GTK app id #287

LiberalArtist opened this issue Feb 6, 2023 · 0 comments

Comments

@LiberalArtist
Copy link
Contributor

I've started looking at the guide to porting from GTK 3 to GTK 4. A lot of it seems fairly straightforward, but I see some challenges around this point:

Set a proper application ID

In GTK 4 we want the application’s GApplication ‘application-id’ (and therefore the D-Bus name), the desktop file basename and Wayland’s xdg-shell app_id to match. In order to achieve this with GTK 3.x call g_set_prgname() with the same application ID you passed to GtkApplication. Rename your desktop files to match the application ID if needed.

The call to g_set_prgname() can be removed once you fully migrated to GTK 4.

Currently, this is what racket/gui passes to gtk_application_new:

(define (build-app-name)
(let-values ([(path) (simplify-path
(path->complete-path
(or (find-executable-path (find-system-path 'run-file) #f)
(find-system-path 'run-file))
(current-directory)))]
[(host) (or (and gethostname
(let ([b (make-bytes HOSTLEN)])
(and (zero? (gethostname b HOSTLEN))
(bytes->string/utf-8 (car (regexp-match #rx#"^[^\0]*" b)) #\?))))
"")])
(string->bytes/utf-8
(format "org.racket-lang.u~a"
(encode
(format "~a~a~a" host path (version)))))))

There are several problems:

  • It certainly doesn't match the base name of anyone's .desktop file, particularly given the use of gethostname.

  • There is no guarantee that it will satisfy g_application_id_is_valid, particularly the limit of 255 characters and the restriction to [A-Z][a-z][0-9]_- in labels.

  • It will never be valid for D-Bus due to the hyphen in org.racket-lang. From the g_application_id_is_valid docs:

    Note that the hyphen (-) character is allowed in application identifiers, but is problematic or not allowed in various specifications and APIs that refer to D-Bus, such as Flatpak application IDs, the DBusActivatable interface in the Desktop Entry Specification, and the convention that an application’s “main” interface and object path resemble its application identifier and bus name. To avoid situations that require special-case handling, it is recommended that new application identifiers consistently replace hyphens with underscores.

    Like D-Bus interface names, application identifiers should start with the reversed DNS domain name of the author of the interface (in lower-case), and it is conventional for the rest of the application identifier to consist of words run together, with initial capital letters.

    As with D-Bus interface names, if the author’s DNS domain name contains hyphen/minus characters they should be replaced by underscores, and if it contains leading digits they should be escaped by prepending an underscore. For example, if the owner of 7-zip.org used an application identifier for an archiving application, it might be named org._7_zip.Archiver.

    These rules would suggest something like org.racket_lang.DrRacket.

More broadly, it seems like the application ID should be under the control of the programmer.

I'm not sure how best to communicate the application ID to the point where it's needed. Maybe it could us one of the special command-line options to gracket that translate to unsafe-register-process-global? (Or maybe some existing one should be used?)

Then there's the aspect of getting the .desktop file installed under the corresponding name, particularly for something like DrRacket where we have, and presumably want to keep:

https://github.com/racket/drracket/blob/0291c0ebac7d098e827c063a4ffeaa4c2b77d80d/drracket/drracket/info.rkt#L9-L10

which implies that we continue to use the name drracket.desktop to work with get-aux-from-path. Maybe we should add another kind of aux entry to specify the application ID, and use that when installing the file? Maybe there's something analogous to the rewriting make-gracket-launcher already does to the Exec entry in the .desktop file.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant