unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob 638a5e094949423db755d5fa67068cc09f8652ea 3981 bytes (raw)
name: packages/patches/glib-appinfo-watch.patch 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
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 <https://issues.guix.gnu.org/35594>).

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;

debug log:

solving 638a5e094949423db755d5fa67068cc09f8652ea ...
found 638a5e094949423db755d5fa67068cc09f8652ea in https://git.savannah.gnu.org/cgit/guix.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).