This patch lets GLib's GDesktopAppInfo API watch and notice changes to the Guix user and system profiles. That way, the list of available applications shown by the desktop environment is immediately updated when the user runs "guix install", "guix remove", or "guix system reconfigure" (see ). It does so by monitoring /var/guix/profiles (for changes to the system profile) and /var/guix/profiles/per-user/USER (for changes to the user profile) and crawling their share/applications sub-directory when changes happen. diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index f1e2fdd..095c110 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -148,6 +148,7 @@ typedef struct gchar *alternatively_watching; gboolean is_config; gboolean is_setup; + gchar *guix_profile_watch_dir; GFileMonitor *monitor; GHashTable *app_names; GHashTable *mime_tweaks; @@ -180,6 +181,7 @@ desktop_file_dir_unref (DesktopFileDir *dir) { desktop_file_dir_reset (dir); g_free (dir->path); + g_free (dir->guix_profile_watch_dir); g_free (dir); } } @@ -204,6 +206,13 @@ desktop_file_dir_get_alternative_dir (DesktopFileDir *dir) { gchar *parent; + /* If DIR is a profile, watch the specified directory--e.g., + * /var/guix/profiles/per-user/$USER/ for the user profile. Do not watch + * ~/.guix-profile or /run/current-system/profile because GFileMonitor does + * not pass IN_DONT_FOLLOW and thus cannot notice any change. */ + if (dir->guix_profile_watch_dir != NULL) + return g_strdup (dir->guix_profile_watch_dir); + /* If the directory itself exists then we need no alternative. */ if (g_access (dir->path, R_OK | X_OK) == 0) return NULL; @@ -249,11 +258,11 @@ desktop_file_dir_changed (GFileMonitor *monitor, * * If this is a notification for a parent directory (because the * desktop directory didn't exist) then we shouldn't fire the signal - * unless something actually changed. + * unless something actually changed or it's in /var/guix/profiles. */ g_mutex_lock (&desktop_file_dir_lock); - if (dir->alternatively_watching) + if (dir->alternatively_watching && dir->guix_profile_watch_dir == NULL) { gchar *alternative_dir; @@ -1555,6 +1564,32 @@ desktop_file_dirs_lock (void) for (i = 0; dirs[i]; i++) g_ptr_array_add (desktop_file_dirs, desktop_file_dir_new (dirs[i])); + { + /* Monitor the system and user profile under /var/guix/profiles and + * treat modifications to them as if they were modifications to their + * /share sub-directory. */ + const gchar *user; + DesktopFileDir *system_profile_dir, *user_profile_dir; + + system_profile_dir = + desktop_file_dir_new ("/var/guix/profiles/system/profile/share"); + system_profile_dir->guix_profile_watch_dir = g_strdup ("/var/guix/profiles"); + g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (system_profile_dir)); + + user = g_get_user_name (); + if (user != NULL) + { + gchar *profile_dir, *user_data_dir; + + profile_dir = g_build_filename ("/var/guix/profiles/per-user", user, NULL); + user_data_dir = g_build_filename (profile_dir, "guix-profile", "share", NULL); + user_profile_dir = desktop_file_dir_new (user_data_dir); + user_profile_dir->guix_profile_watch_dir = profile_dir; + g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (user_profile_dir)); + g_free (user_data_dir); + } + } + /* The list of directories will never change after this, unless * g_get_user_config_dir() changes due to %G_TEST_OPTION_ISOLATE_DIRS. */ desktop_file_dirs_config_dir = user_config_dir; it/gnu/tests/vnc.scm?id=0169aee33e154c1fa8b299c7f126f3e94a8dc9a4'>tests: xvnc: Do not use specification->package in OS definition....Doing so would cause the extra package dependencies to not be correctly registered as dependencies, which would lead to a silent failure when attempting to load or byte compile the module at the time guix build itself (e.g., when running 'guix pull'). * gnu/tests/vnc.scm (%xvnc-os) [packages]: Turn the the specification->package declaration into a list of package objects. Maxim Cournoyer 2022-10-07Revert "Revert "services: Add xvnc-service-type.""...This reverts commit 0c4966160054bc50e6ab3a4ac9c9a6a1826ab5a0. The fix appears in the subsequent commit, for clarity. Maxim Cournoyer 2022-10-07Revert "services: Add xvnc-service-type."...This reverts commit 1c528a95cb92b7808e6603d7956185005583629f. This broke 'guix pull', for (yet) unknown reasons. Maxim Cournoyer 2022-10-07services: Add xvnc-service-type....* gnu/services/vnc.scm: New file. * gnu/tests/vnc.scm: Likewise. * gnu/local.mk: Register them. Maxim Cournoyer