From 5136369c188a9cad01915714a5e3819d76f0824c Mon Sep 17 00:00:00 2001 From: Adrian Perez de Castro Date: Mon, 7 Nov 2016 20:59:03 +0200 Subject: [PATCH] Properly detect changes in .desktop files This fixes the shell not picking updates to the contents of the underlying .desktop files for application launchers, or when a .desktop file is overriden by a user-installed one under ~/.local/share/applications https://bugzilla.gnome.org/show_bug.cgi?id=773636 --- src/shell-app-system.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/shell-app-system.c b/src/shell-app-system.c index c41b4da28..8edf757a9 100644 --- a/src/shell-app-system.c +++ b/src/shell-app-system.c @@ -112,19 +112,40 @@ scan_startup_wm_class_to_id (ShellAppSystem *self) static gboolean app_is_stale (ShellApp *app) { - GDesktopAppInfo *info; - gboolean is_stale; + GDesktopAppInfo *info, *old; + GAppInfo *old_info, *new_info; + gboolean is_unchanged; if (shell_app_is_window_backed (app)) return FALSE; info = g_desktop_app_info_new (shell_app_get_id (app)); - is_stale = (info == NULL); + if (!info) + return TRUE; - if (info) - g_object_unref (info); + old = shell_app_get_app_info (app); + old_info = G_APP_INFO (old); + new_info = G_APP_INFO (info); - return is_stale; + is_unchanged = + g_app_info_should_show (old_info) == g_app_info_should_show (new_info) && + strcmp (g_desktop_app_info_get_filename (old), + g_desktop_app_info_get_filename (info)) == 0 && + g_strcmp0 (g_app_info_get_executable (old_info), + g_app_info_get_executable (new_info)) == 0 && + g_strcmp0 (g_app_info_get_commandline (old_info), + g_app_info_get_commandline (new_info)) == 0 && + strcmp (g_app_info_get_name (old_info), + g_app_info_get_name (new_info)) == 0 && + g_strcmp0 (g_app_info_get_description (old_info), + g_app_info_get_description (new_info)) == 0 && + strcmp (g_app_info_get_display_name (old_info), + g_app_info_get_display_name (new_info)) == 0 && + g_icon_equal (g_app_info_get_icon (old_info), + g_app_info_get_icon (new_info)); + + g_object_unref (info); + return !is_unchanged; } static gboolean