all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: Leo Prikler <leo.prikler@student.tugraz.at>, 36376@debbugs.gnu.org
Subject: bug#36376: Application menu of desktop environment not automatically updated
Date: Thu, 05 Nov 2020 01:38:25 -0500	[thread overview]
Message-ID: <87d00swboe.fsf@gmail.com> (raw)
In-Reply-To: <87o8keawju.fsf@gnu.org> ("Ludovic Courtès"'s message of "Tue, 03 Nov 2020 23:46:13 +0100")

[-- Attachment #1: Type: text/plain, Size: 2549 bytes --]

Hi Ludovic!

> +static void
> +guix_profile_changed  (GFileMonitor      *monitor,
> +                       GFile             *file,
> +                       GFile             *other_file,
> +                       GFileMonitorEvent  event_type,
> +                       gpointer           user_data)
> +{
> +  DesktopFileDir *dir = user_data;
> +
> +  desktop_file_dir_reset (dir);
> +
> +  /* When ~/.guix-profile changes, emit the 'changed' signal so everyone
> +     knows.  */
> +  g_app_info_monitor_fire ();
> +}
> +
>  static void
>  desktop_file_dir_changed (GFileMonitor      *monitor,
>                            GFile             *file,
> @@ -1531,6 +1548,7 @@ desktop_file_dirs_lock (void)
>
>    if (desktop_file_dirs == NULL || desktop_file_dirs->len == 0)
>      {
> +      const gchar *home;
>        const char * const *dirs;
>        gint i;
>
> @@ -1555,6 +1573,27 @@ desktop_file_dirs_lock (void)
>        for (i = 0; dirs[i]; i++)
>          g_ptr_array_add (desktop_file_dirs, desktop_file_dir_new (dirs[i]));
>
> +      home = g_get_home_dir ();
> +      if (guix_profile_monitor == NULL && home != NULL)
> +        {
> +          DesktopFileDir *dir;
> +          const gchar *profile, *data_dir;
> +          profile = g_build_filename (home, ".guix-profile", NULL);
> +          data_dir = g_build_filename (profile, "share", NULL);
> +          dir = desktop_file_dir_new (data_dir);
> +
> +          /* Monitor ~/.guix-profile and treat modifications to
> +             ~/.guix-profile as if they were modifications to
> +             ~/.guix-profile/share.  */
> +          guix_profile_monitor =
> +            g_local_file_monitor_new_in_worker (profile, FALSE, G_FILE_MONITOR_NONE,
> +                                                guix_profile_changed,
> +                                                desktop_file_dir_ref (dir),
> +                                                closure_notify_cb, NULL);
> +
> +          g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (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;

I think the attached patch is an improvement over the above, by also
supporting /run/current-system/share, being a bit simpler, and not
adding extra monitors.

I've reused the cool trick of passing FALSE to
g_local_file_monitor_new_in_worker to force it to use its polling mode
fallback.


[-- Attachment #2: glib-appinfo-watch.patch --]
[-- Type: text/x-patch, Size: 2697 bytes --]

From a79645c565e56ac201e66936d9f9883ad9387b06 Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Thu, 5 Nov 2020 00:24:29 -0500
Subject: [PATCH] gdesktopappinfo: Fix monitoring of a Guix profile
 XDG_DATA_DIR.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fixes <https://issues.guix.gnu.org/35594>.

Treat the $HOME/.guix-profile/share and /run/current-system/share
XDG_DATA_DIRS file names specially so that the inotify-based monitors
placed by GLib monitor their parent link rather than an immutable
directory.

Co-authored by Ludovic Courtès <ļudo@gnu.org>.
---
 gio/gdesktopappinfo.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
index f1e2fdd65..e659034d5 100644
--- a/gio/gdesktopappinfo.c
+++ b/gio/gdesktopappinfo.c
@@ -1380,7 +1380,8 @@ closure_notify_cb (gpointer  data,
 static void
 desktop_file_dir_init (DesktopFileDir *dir)
 {
-  const gchar *watch_dir;
+  const gchar *watch_dir, *guix_profile_data, *system_profile_data;
+  gboolean is_directory = TRUE;
 
   g_assert (!dir->is_setup);
 
@@ -1390,13 +1391,25 @@ desktop_file_dir_init (DesktopFileDir *dir)
   dir->alternatively_watching = desktop_file_dir_get_alternative_dir (dir);
   watch_dir = dir->alternatively_watching ? dir->alternatively_watching : dir->path;
 
+  /* Workaround for Guix: watch the link of a profile, not its
+   * immutable 'share' sub-directory. */
+  guix_profile_data = g_build_filename (g_get_home_dir (), ".guix-profile", "share", NULL);
+  system_profile_data = "/run/current-system/share";
+
+  if (g_str_equal (watch_dir, guix_profile_data)
+      || g_str_equal (watch_dir, system_profile_data))
+  {
+      is_directory = FALSE;
+      watch_dir = g_path_get_dirname (watch_dir);
+  }
+
   /* There is a very thin race here if the watch_dir has been _removed_
    * between when we checked for it and when we establish the watch.
    * Removes probably don't happen in usual operation, and even if it
    * does (and we catch the unlikely race), the only degradation is that
    * we will fall back to polling.
    */
-  dir->monitor = g_local_file_monitor_new_in_worker (watch_dir, TRUE, G_FILE_MONITOR_NONE,
+  dir->monitor = g_local_file_monitor_new_in_worker (watch_dir, is_directory, G_FILE_MONITOR_NONE,
                                                      desktop_file_dir_changed,
                                                      desktop_file_dir_ref (dir),
                                                      closure_notify_cb, NULL);
-- 
2.28.0


[-- Attachment #3: Type: text/plain, Size: 165 bytes --]


It's untested because 'guix vm' is taking more time to complete than I'm
willing to wait for in the middle of the night :-).  I'll try it
tomorrow.

Thanks,

Maxim

  parent reply	other threads:[~2020-11-05  6:39 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-25 14:12 bug#36376: Application menu of desktop environment not automatically updated Ludovic Courtès
2020-11-03 22:46 ` Ludovic Courtès
2020-11-03 23:28   ` Leo Prikler
2020-11-04 21:41     ` bug#35594: " Maxim Cournoyer
2020-11-04 22:15     ` Ludovic Courtès
2020-11-05  6:38   ` Maxim Cournoyer [this message]
2020-11-06 16:02     ` Ludovic Courtès
2020-11-06 18:56       ` Maxim Cournoyer
2020-11-10 15:23         ` Ludovic Courtès
2020-11-10 17:48           ` bug#35594: " zimoun
2020-11-10 21:23             ` Ludovic Courtès
2020-11-12 15:56           ` bug#35594: " Ludovic Courtès
2020-11-13 20:38             ` bug#36376: " Ludovic Courtès
2020-11-17  4:57             ` Maxim Cournoyer
2020-11-17  9:08               ` Ludovic Courtès
2020-11-18  4:34                 ` Maxim Cournoyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87d00swboe.fsf@gmail.com \
    --to=maxim.cournoyer@gmail.com \
    --cc=36376@debbugs.gnu.org \
    --cc=leo.prikler@student.tugraz.at \
    --cc=ludo@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.