From 28fcaa95108fee1f603ace94de1f94c11ae7ca07 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 5 Jan 2021 12:28:43 +0100 Subject: [PATCH] D-Bus: InstallPackageNames exits immediately Finish the D-Bus call only after the requested package is installed. The caller may choose a reasonable timeout on the D-Bus call. Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/37 --- src/gs-application.c | 41 ++++++++++++-- src/gs-application.h | 4 ++ src/gs-dbus-helper.c | 126 ++++++++++++++++++++++++++++++++----------- src/gs-extras-page.c | 36 ++++++++++++- src/gs-extras-page.h | 3 +- src/gs-page.c | 4 ++ src/gs-shell.c | 4 +- src/gs-shell.h | 3 +- 8 files changed, 182 insertions(+), 39 deletions(-) diff --git a/src/gs-application.c b/src/gs-application.c index 53610ad86..95afc030c 100644 --- a/src/gs-application.c +++ b/src/gs-application.c @@ -56,6 +56,13 @@ struct _GsApplication { G_DEFINE_TYPE (GsApplication, gs_application, GTK_TYPE_APPLICATION); +enum { + INSTALL_RESOURCES_DONE, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + typedef struct { GsApplication *app; GSimpleAction *action; @@ -819,9 +826,10 @@ install_resources_activated (GSimpleAction *action, const gchar *mode; const gchar *startup_id; const gchar *desktop_id; + const gchar *ident; g_autofree gchar **resources = NULL; - g_variant_get (parameter, "(&s^a&s&s&s)", &mode, &resources, &startup_id, &desktop_id); + g_variant_get (parameter, "(&s^a&s&s&s&s)", &mode, &resources, &startup_id, &desktop_id, &ident); display = gdk_display_get_default (); #ifdef GDK_WINDOWING_X11 @@ -842,7 +850,7 @@ install_resources_activated (GSimpleAction *action, gs_application_present_window (app, startup_id); gs_shell_reset_state (app->shell); - gs_shell_show_extras_search (app->shell, mode, resources, desktop_id); + gs_shell_show_extras_search (app->shell, mode, resources, desktop_id, ident); } static GActionEntry actions[] = { @@ -867,7 +875,7 @@ static GActionEntry actions_after_loading[] = { { "details-url", details_url_activated, "(s)", NULL, NULL }, { "install", install_activated, "(su)", NULL, NULL }, { "filename", filename_activated, "(s)", NULL, NULL }, - { "install-resources", install_resources_activated, "(sasss)", NULL, NULL }, + { "install-resources", install_resources_activated, "(sassss)", NULL, NULL }, { "nop", NULL, NULL, NULL } }; @@ -1158,6 +1166,25 @@ gs_application_class_init (GsApplicationClass *class) G_APPLICATION_CLASS (class)->open = gs_application_open; G_APPLICATION_CLASS (class)->dbus_register = gs_application_dbus_register; G_APPLICATION_CLASS (class)->dbus_unregister = gs_application_dbus_unregister; + + /** + * GsApplication::install-resources-done: + * @ident: Operation identificator, as string + * @op_error: (nullable): an install #GError, or %NULL on success + * + * Emitted after a resource installation operation identified by @ident + * had finished. The @op_error can hold eventual error message, when + * the installation failed. + */ + signals[INSTALL_RESOURCES_DONE] = g_signal_new ( + "install-resources-done", + G_TYPE_FROM_CLASS (class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE, + 0, + NULL, NULL, + NULL, + G_TYPE_NONE, 2, + G_TYPE_STRING, G_TYPE_ERROR); } GsApplication * @@ -1169,3 +1196,11 @@ gs_application_new (void) "inactivity-timeout", 12000, NULL); } + +void +gs_application_emit_install_resources_done (GsApplication *application, + const gchar *ident, + const GError *op_error) +{ + g_signal_emit (application, signals[INSTALL_RESOURCES_DONE], 0, ident, op_error, NULL); +} diff --git a/src/gs-application.h b/src/gs-application.h index dd5650908..6085fb1f1 100644 --- a/src/gs-application.h +++ b/src/gs-application.h @@ -19,3 +19,7 @@ G_DECLARE_FINAL_TYPE (GsApplication, gs_application, GS, APPLICATION, GtkApplica GsApplication *gs_application_new (void); GsPluginLoader *gs_application_get_plugin_loader (GsApplication *application); gboolean gs_application_has_active_window (GsApplication *application); +void gs_application_emit_install_resources_done + (GsApplication *application, + const gchar *ident, + const GError *op_error); \ No newline at end of file diff --git a/src/gs-dbus-helper.c b/src/gs-dbus-helper.c index 85325a495..47eab521c 100644 --- a/src/gs-dbus-helper.c +++ b/src/gs-dbus-helper.c @@ -262,7 +262,8 @@ is_show_confirm_search_set (const gchar *interaction) static void notify_search_resources (GsExtrasPageMode mode, const gchar *desktop_id, - gchar **resources) + gchar **resources, + const gchar *ident) { const gchar *app_name = NULL; const gchar *mode_string; @@ -320,24 +321,87 @@ notify_search_resources (GsExtrasPageMode mode, n = g_notification_new (title); g_notification_set_body (n, body); /* TRANSLATORS: this is a button that launches gnome-software */ - g_notification_add_button_with_target (n, _("Find in Software"), "app.install-resources", "(s^ass)", mode_string, resources, ""); - g_notification_set_default_action_and_target (n, "app.install-resources", "(s^asss)", mode_string, resources, "", desktop_id); + g_notification_add_button_with_target (n, _("Find in Software"), "app.install-resources", "(s^assss)", mode_string, resources, "", desktop_id, ident); + g_notification_set_default_action_and_target (n, "app.install-resources", "(s^assss)", mode_string, resources, "", desktop_id, ident); g_application_send_notification (g_application_get_default (), "install-resources", n); } +typedef struct _InstallResourcesData { + void (* done_func) (GsPackageKitModify2 *object, GDBusMethodInvocation *invocation); + GsPackageKitModify2 *object; + GDBusMethodInvocation *invocation; + gchar *ident; + gulong install_resources_done_id; +} InstallResourcesData; + +static void +install_resources_data_free (gpointer data, + GClosure *closure) +{ + InstallResourcesData *ird = data; + + if (ird) { + g_clear_object (&ird->object); + g_clear_object (&ird->invocation); + g_free (ird->ident); + g_slice_free (InstallResourcesData, ird); + } +} + +static void +install_resources_done_cb (GApplication *app, + const gchar *ident, + const GError *op_error, + gpointer user_data) +{ + InstallResourcesData *ird = user_data; + + g_return_if_fail (ird != NULL); + + if (!ident || g_strcmp0 (ird->ident, ident) == 0) { + if (op_error) + g_dbus_method_invocation_return_gerror (ird->invocation, op_error); + else + ird->done_func (ird->object, ird->invocation); + + g_signal_handler_disconnect (app, ird->install_resources_done_id); + } +} + static void install_resources (GsExtrasPageMode mode, gchar **resources, const gchar *interaction, const gchar *desktop_id, - GVariant *platform_data) + GVariant *platform_data, + void (* done_func) (GsPackageKitModify2 *object, GDBusMethodInvocation *invocation), + GsPackageKitModify2 *object, + GDBusMethodInvocation *invocation) { GApplication *app; const gchar *mode_string; const gchar *startup_id = NULL; + gchar *ident = NULL; + + app = g_application_get_default (); + + if (done_func) { + InstallResourcesData *ird; + + ident = g_strdup_printf ("%p", invocation); + + ird = g_slice_new (InstallResourcesData); + ird->done_func = done_func; + ird->object = g_object_ref (object); + ird->invocation = g_object_ref (invocation); + ird->ident = ident; /* takes ownership */ + ird->install_resources_done_id = g_signal_connect_data (app, "install-resources-done", + G_CALLBACK (install_resources_done_cb), ird, + install_resources_data_free, 0); + } if (is_show_confirm_search_set (interaction)) { - notify_search_resources (mode, desktop_id, resources); + notify_search_resources (mode, desktop_id, resources, ident); return; } @@ -346,10 +410,9 @@ install_resources (GsExtrasPageMode mode, "&s", &startup_id); } - app = g_application_get_default (); mode_string = gs_extras_page_mode_to_string (mode); g_action_group_activate_action (G_ACTION_GROUP (app), "install-resources", - g_variant_new ("(s^asss)", mode_string, resources, startup_id, desktop_id)); + g_variant_new ("(s^assss)", mode_string, resources, startup_id, desktop_id, ident ? ident : "")); } static gboolean @@ -362,7 +425,7 @@ handle_modify_install_package_files (GsPackageKitModify *object, { g_debug ("****** Modify.InstallPackageFiles"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, NULL, arg_files); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, NULL, arg_files, NULL); gs_package_kit_modify_complete_install_package_files (object, invocation); return TRUE; @@ -378,7 +441,7 @@ handle_modify_install_provide_files (GsPackageKitModify *object, { g_debug ("****** Modify.InstallProvideFiles"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, NULL, arg_files); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, NULL, arg_files, NULL); gs_package_kit_modify_complete_install_provide_files (object, invocation); return TRUE; @@ -394,7 +457,7 @@ handle_modify_install_package_names (GsPackageKitModify *object, { g_debug ("****** Modify.InstallPackageNames"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, NULL, arg_package_names); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, NULL, arg_package_names, NULL); gs_package_kit_modify_complete_install_package_names (object, invocation); return TRUE; @@ -410,7 +473,7 @@ handle_modify_install_mime_types (GsPackageKitModify *object, { g_debug ("****** Modify.InstallMimeTypes"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, NULL, arg_mime_types); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, NULL, arg_mime_types, NULL); gs_package_kit_modify_complete_install_mime_types (object, invocation); return TRUE; @@ -426,7 +489,7 @@ handle_modify_install_fontconfig_resources (GsPackageKitModify *object, { g_debug ("****** Modify.InstallFontconfigResources"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, NULL, arg_resources); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, NULL, arg_resources, NULL); gs_package_kit_modify_complete_install_fontconfig_resources (object, invocation); return TRUE; @@ -442,7 +505,7 @@ handle_modify_install_gstreamer_resources (GsPackageKitModify *object, { g_debug ("****** Modify.InstallGStreamerResources"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, NULL, arg_resources); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, NULL, arg_resources, NULL); gs_package_kit_modify_complete_install_gstreamer_resources (object, invocation); return TRUE; @@ -462,7 +525,7 @@ handle_modify_install_resources (GsPackageKitModify *object, g_debug ("****** Modify.InstallResources"); if (g_strcmp0 (arg_type, "plasma-service") == 0) { - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, NULL, arg_resources); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, NULL, arg_resources, NULL); ret = TRUE; } else { ret = FALSE; @@ -482,7 +545,7 @@ handle_modify_install_printer_drivers (GsPackageKitModify *object, { g_debug ("****** Modify.InstallPrinterDrivers"); - notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, NULL, arg_device_ids); + notify_search_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, NULL, arg_device_ids, NULL); gs_package_kit_modify_complete_install_printer_drivers (object, invocation); return TRUE; @@ -499,8 +562,8 @@ handle_modify2_install_package_files (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallPackageFiles"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_package_files (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_package_files, object, invocation); return TRUE; } @@ -516,8 +579,8 @@ handle_modify2_install_provide_files (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallProvideFiles"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_provide_files (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PROVIDE_FILES, arg_files, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_provide_files, object, invocation); return TRUE; } @@ -533,8 +596,8 @@ handle_modify2_install_package_names (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallPackageNames"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, arg_package_names, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_package_names (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_NAMES, arg_package_names, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_package_names, object, invocation); return TRUE; } @@ -550,8 +613,8 @@ handle_modify2_install_mime_types (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallMimeTypes"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, arg_mime_types, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_mime_types (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_MIME_TYPES, arg_mime_types, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_mime_types, object, invocation); return TRUE; } @@ -567,8 +630,8 @@ handle_modify2_install_fontconfig_resources (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallFontconfigResources"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_fontconfig_resources (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_FONTCONFIG_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_fontconfig_resources, object, invocation); return TRUE; } @@ -584,8 +647,8 @@ handle_modify2_install_gstreamer_resources (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallGStreamerResources"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_gstreamer_resources (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_GSTREAMER_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_gstreamer_resources, object, invocation); return TRUE; } @@ -605,12 +668,13 @@ handle_modify2_install_resources (GsPackageKitModify2 *object, g_debug ("****** Modify2.InstallResources"); if (g_strcmp0 (arg_type, "plasma-service") == 0) { - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PLASMA_RESOURCES, arg_resources, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_resources, object, invocation); ret = TRUE; } else { ret = FALSE; + gs_package_kit_modify2_complete_install_resources (object, invocation); } - gs_package_kit_modify2_complete_install_resources (object, invocation); return ret; } @@ -626,8 +690,8 @@ handle_modify2_install_printer_drivers (GsPackageKitModify2 *object, { g_debug ("****** Modify2.InstallPrinterDrivers"); - install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, arg_device_ids, arg_interaction, arg_desktop_id, arg_platform_data); - gs_package_kit_modify2_complete_install_printer_drivers (object, invocation); + install_resources (GS_EXTRAS_PAGE_MODE_INSTALL_PRINTER_DRIVERS, arg_device_ids, arg_interaction, arg_desktop_id, arg_platform_data, + gs_package_kit_modify2_complete_install_printer_drivers, object, invocation); return TRUE; } diff --git a/src/gs-extras-page.c b/src/gs-extras-page.c index ec1e97a4b..139703356 100644 --- a/src/gs-extras-page.c +++ b/src/gs-extras-page.c @@ -12,6 +12,7 @@ #include "gs-extras-page.h" #include "gs-app-row.h" +#include "gs-application.h" #include "gs-language.h" #include "gs-shell.h" #include "gs-common.h" @@ -55,6 +56,7 @@ struct _GsExtrasPage GsVendor *vendor; guint pending_search_cnt; gchar *caller_app_name; + gchar *install_resources_ident; GtkWidget *label_failed; GtkWidget *label_no_results; @@ -239,12 +241,38 @@ gs_extras_page_update_ui_state (GsExtrasPage *self) } } +static void +gs_extras_page_maybe_emit_installed_resources_done (GsExtrasPage *self) +{ + if (self->install_resources_ident && ( + self->state == GS_EXTRAS_PAGE_STATE_LOADING || + self->state == GS_EXTRAS_PAGE_STATE_NO_RESULTS || + self->state == GS_EXTRAS_PAGE_STATE_FAILED)) { + GsApplication *application; + GError *op_error = NULL; + + /* When called during the LOADING state, it means the package is already installed */ + if (self->state == GS_EXTRAS_PAGE_STATE_NO_RESULTS) { + g_set_error_literal (&op_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("Requested software not found")); + } else if (self->state == GS_EXTRAS_PAGE_STATE_FAILED) { + g_set_error_literal (&op_error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Failed to find requested software")); + } + + application = GS_APPLICATION (g_application_get_default ()); + gs_application_emit_install_resources_done (application, self->install_resources_ident, op_error); + + g_clear_pointer (&self->install_resources_ident, g_free); + g_clear_error (&op_error); + } +} + static void gs_extras_page_set_state (GsExtrasPage *self, GsExtrasPageState state) { self->state = state; gs_extras_page_update_ui_state (self); + gs_extras_page_maybe_emit_installed_resources_done (self); } static void @@ -509,6 +537,8 @@ show_search_results (GsExtrasPage *self) g_assert (list != NULL); app = gs_app_row_get_app (GS_APP_ROW (list->data)); gs_shell_change_mode (self->shell, GS_SHELL_MODE_DETAILS, app, TRUE); + if (gs_app_is_installed (app)) + gs_extras_page_maybe_emit_installed_resources_done (self); } else { /* show what we got */ g_debug ("extras: got %u search results, showing", n_children); @@ -1005,11 +1035,14 @@ void gs_extras_page_search (GsExtrasPage *self, const gchar *mode_str, gchar **resources, - const gchar *desktop_id) + const gchar *desktop_id, + const gchar *ident) { self->mode = gs_extras_page_mode_from_string (mode_str); g_clear_pointer (&self->caller_app_name, g_free); self->caller_app_name = gs_extras_page_get_app_name (desktop_id); + g_clear_pointer (&self->install_resources_ident, g_free); + self->install_resources_ident = (ident && *ident) ? g_strdup (ident) : NULL; switch (self->mode) { case GS_EXTRAS_PAGE_MODE_INSTALL_PACKAGE_FILES: @@ -1196,6 +1229,7 @@ gs_extras_page_dispose (GObject *object) g_clear_pointer (&self->array_search_data, g_ptr_array_unref); g_clear_pointer (&self->caller_app_name, g_free); + g_clear_pointer (&self->install_resources_ident, g_free); G_OBJECT_CLASS (gs_extras_page_parent_class)->dispose (object); } diff --git a/src/gs-extras-page.h b/src/gs-extras-page.h index ad248b506..25b06881b 100644 --- a/src/gs-extras-page.h +++ b/src/gs-extras-page.h @@ -35,6 +35,7 @@ GsExtrasPage *gs_extras_page_new (void); void gs_extras_page_search (GsExtrasPage *self, const gchar *mode, gchar **resources, - const gchar *desktop_id); + const gchar *desktop_id, + const gchar *ident); G_END_DECLS diff --git a/src/gs-page.c b/src/gs-page.c index ab5bdc650..e299354db 100644 --- a/src/gs-page.c +++ b/src/gs-page.c @@ -12,6 +12,7 @@ #include #include +#include "gs-application.h" #include "gs-page.h" #include "gs-common.h" #include "gs-screenshot-image.h" @@ -127,6 +128,9 @@ gs_page_app_installed_cb (GObject *source, ret = gs_plugin_loader_job_action_finish (plugin_loader, res, &error); + + gs_application_emit_install_resources_done (GS_APPLICATION (g_application_get_default ()), NULL, error); + if (g_error_matches (error, GS_PLUGIN_ERROR, GS_PLUGIN_ERROR_CANCELLED)) { diff --git a/src/gs-shell.c b/src/gs-shell.c index 3c81c2085..96e5cce00 100644 --- a/src/gs-shell.c +++ b/src/gs-shell.c @@ -2424,7 +2424,7 @@ gs_shell_show_category (GsShell *shell, GsCategory *category) gs_shell_change_mode (shell, GS_SHELL_MODE_CATEGORY, category, TRUE); } -void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **resources, const gchar *desktop_id) +void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **resources, const gchar *desktop_id, const gchar *ident) { GsShellPrivate *priv = gs_shell_get_instance_private (shell); GsPage *page; @@ -2432,7 +2432,7 @@ void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **res page = GS_PAGE (gtk_builder_get_object (priv->builder, "extras_page")); save_back_entry (shell); - gs_extras_page_search (GS_EXTRAS_PAGE (page), mode, resources, desktop_id); + gs_extras_page_search (GS_EXTRAS_PAGE (page), mode, resources, desktop_id, ident); gs_shell_change_mode (shell, GS_SHELL_MODE_EXTRAS, NULL, TRUE); gs_shell_activate (shell); } diff --git a/src/gs-shell.h b/src/gs-shell.h index 7259b722e..89530a085 100644 --- a/src/gs-shell.h +++ b/src/gs-shell.h @@ -82,7 +82,8 @@ void gs_shell_show_search_result (GsShell *shell, void gs_shell_show_extras_search (GsShell *shell, const gchar *mode, gchar **resources, - const gchar *desktop_id); + const gchar *desktop_id, + const gchar *ident); void gs_shell_show_uri (GsShell *shell, const gchar *url); void gs_shell_setup (GsShell *shell, -- GitLab