[gnome-software/1265-launch-button-takes-a-while-to-appear-after-installing-an-app] gs-details-page: Refresh the 'Launch' button on app info changes



commit 84bf5f5abe0586d930652b45551617695294b41a
Author: Milan Crha <mcrha redhat com>
Date:   Thu Jul 22 13:01:41 2021 +0200

    gs-details-page: Refresh the 'Launch' button on app info changes
    
    It can happen that after an application installation the GDesktopAppInfo
    cache is not updated before the details page is refreshed, which causes
    the 'Launch' button not being shown, even the application can be launched.
    Let the button visibility be updated on any app info changes, which
    is the time when also the GDesktopAppInfo cache is updated.
    
    Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/1265

 src/gs-details-page.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)
---
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index 0060dd734..bb17896dd 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -78,6 +78,7 @@ struct _GsDetailsPage
        GSettings               *settings;
        GtkSizeGroup            *size_group_origin_popover;
        GsOdrsProvider          *odrs_provider;  /* (nullable) (owned), NULL if reviews are disabled */
+       GAppInfoMonitor         *app_info_monitor;
 
        GtkWidget               *application_details_icon;
        GtkWidget               *application_details_summary;
@@ -776,6 +777,10 @@ gs_details_page_can_launch_app (GsDetailsPage *self)
            gs_app_has_quirk (self->app, GS_APP_QUIRK_PARENTAL_NOT_LAUNCHABLE))
                return FALSE;
 
+       /* don't show the launch button if the app doesn't have a desktop ID */
+       if (gs_app_get_id (self->app) == NULL)
+               return FALSE;
+
        desktop_id = gs_app_get_launchable (self->app, AS_LAUNCHABLE_KIND_DESKTOP_ID);
        if (!desktop_id)
                desktop_id = gs_app_get_id (self->app);
@@ -875,11 +880,6 @@ gs_details_page_refresh_buttons (GsDetailsPage *self)
                              /* TRANSLATORS: A label for a button to execute the selected application. */
                              _("_Launch"));
 
-       /* don't show the launch and shortcut buttons if the app doesn't have a desktop ID */
-       if (gs_app_get_id (self->app) == NULL) {
-               gtk_widget_set_visible (self->button_details_launch, FALSE);
-       }
-
        /* remove button */
        if (gs_app_has_quirk (self->app, GS_APP_QUIRK_COMPULSORY) ||
            gs_app_get_kind (self->app) == AS_COMPONENT_KIND_FIRMWARE) {
@@ -1780,6 +1780,20 @@ settings_changed_cb (GsDetailsPage *self, const gchar *key, gpointer data)
        }
 }
 
+static void
+gs_details_page_app_info_changed_cb (GAppInfoMonitor *monitor,
+                                    gpointer user_data)
+{
+       GsDetailsPage *self = user_data;
+
+       g_return_if_fail (GS_IS_DETAILS_PAGE (self));
+
+       if (!self->app || !gs_page_is_active (GS_PAGE (self)))
+               return;
+
+       gtk_widget_set_visible (self->button_details_launch, gs_details_page_can_launch_app (self));
+}
+
 /* this is being called from GsShell */
 void
 gs_details_page_set_app (GsDetailsPage *self, GsApp *app)
@@ -2210,6 +2224,7 @@ gs_details_page_dispose (GObject *object)
        g_clear_object (&self->session);
        g_clear_object (&self->size_group_origin_popover);
        g_clear_object (&self->odrs_provider);
+       g_clear_object (&self->app_info_monitor);
 
        G_OBJECT_CLASS (gs_details_page_parent_class)->dispose (object);
 }
@@ -2338,6 +2353,9 @@ gs_details_page_init (GsDetailsPage *self)
                                  G_CALLBACK (settings_changed_cb),
                                  self);
        self->size_group_origin_popover = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+       self->app_info_monitor = g_app_info_monitor_get ();
+       g_signal_connect_object (self->app_info_monitor, "changed",
+                                G_CALLBACK (gs_details_page_app_info_changed_cb), self, 0);
 
        gtk_list_box_set_sort_func (GTK_LIST_BOX (self->list_box_addons),
                                    list_sort_func,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]