aboutsummaryrefslogtreecommitdiffstats
path: root/meta-gnome
diff options
context:
space:
mode:
authorMarkus Volk <f_l_k@t-online.de>2023-12-15 18:38:29 +0100
committerKhem Raj <raj.khem@gmail.com>2023-12-18 22:17:23 -0800
commit882aaf9506fb779a19a65c7040de2dbe69406e76 (patch)
treebbbc272fd176524714674747103b036df29ed3f6 /meta-gnome
parentc754b8ec0c75dd1e8bccdfc45dcf9c2fa4979589 (diff)
downloadmeta-openembedded-contrib-882aaf9506fb779a19a65c7040de2dbe69406e76.tar.gz
gnome-software: update 45.1 -> 45.2
- add backport patches for appstream-1.0.0 support Signed-off-by: Markus Volk <f_l_k@t-online.de> Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'meta-gnome')
-rw-r--r--meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch504
-rw-r--r--meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch31
-rw-r--r--meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb (renamed from meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb)6
3 files changed, 540 insertions, 1 deletions
diff --git a/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch b/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch
new file mode 100644
index 0000000000..5e051be15a
--- /dev/null
+++ b/meta-gnome/recipes-gnome/gnome-software/gnome-software/0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch
@@ -0,0 +1,504 @@
+From 0655f358ed0e8455e12d9634f60bc4dbaee434e3 Mon Sep 17 00:00:00 2001
+From: Matthias Klumpp <matthias@tenstral.net>
+Date: Sun, 8 Oct 2023 20:22:44 +0200
+Subject: [PATCH] Adjust to build with AppStream 1.0 as well as 0.16.x
+
+Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/gnome-software/-/commit/0655f358ed0e8455e12d9634f60bc4dbaee434e3]
+---
+ lib/gs-app.c | 4 ++
+ lib/gs-appstream.c | 61 +++++++++++++++++++-----
+ lib/gs-utils.c | 8 ++--
+ meson.build | 22 +--------
+ plugins/core/gs-plugin-appstream.c | 8 ----
+ plugins/fwupd/gs-fwupd-app.c | 8 ++++
+ plugins/fwupd/gs-plugin-fwupd.c | 4 ++
+ src/gs-hardware-support-context-dialog.c | 6 +++
+ src/gs-repos-dialog.c | 4 ++
+ src/gs-screenshot-carousel.c | 4 +-
+ src/gs-screenshot-image.c | 41 ++++++++++++----
+ src/gs-screenshot-image.h | 7 +++
+ subprojects/appstream.wrap | 2 +-
+ 13 files changed, 122 insertions(+), 57 deletions(-)
+
+diff --git a/lib/gs-app.c b/lib/gs-app.c
+index 2308de504d..ea348f8c01 100644
+--- a/lib/gs-app.c
++++ b/lib/gs-app.c
+@@ -609,7 +609,11 @@ gs_app_to_string_append (GsApp *app, GString *str)
+ AsScreenshot *ss = g_ptr_array_index (priv->screenshots, i);
+ g_autofree gchar *key = NULL;
+ tmp = as_screenshot_get_caption (ss);
++#if AS_CHECK_VERSION(1, 0, 0)
++ im = as_screenshot_get_image (ss, 0, 0, 1);
++#else
+ im = as_screenshot_get_image (ss, 0, 0);
++#endif
+ if (im == NULL)
+ continue;
+ key = g_strdup_printf ("screenshot-%02u", i);
+diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
+index deca176dcf..6504d6f25e 100644
+--- a/lib/gs-appstream.c
++++ b/lib/gs-appstream.c
+@@ -1011,8 +1011,11 @@ gs_appstream_refine_app_relation (GsApp *app,
+ as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_CONTROL);
+ as_relation_set_value_control_kind (relation, as_control_kind_from_string (xb_node_get_text (child)));
+ } else if (g_str_equal (item_kind, "display_length")) {
+- AsDisplayLengthKind display_length_kind;
+ const gchar *compare;
++ const gchar *side;
++#if !AS_CHECK_VERSION(1, 0, 0)
++ AsDisplayLengthKind display_length_kind;
++#endif
+
+ /* https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-relations-display_length */
+ as_relation_set_item_kind (relation, AS_RELATION_ITEM_KIND_DISPLAY_LENGTH);
+@@ -1020,15 +1023,21 @@ gs_appstream_refine_app_relation (GsApp *app,
+ compare = xb_node_get_attr (child, "compare");
+ as_relation_set_compare (relation, (compare != NULL) ? as_relation_compare_from_string (compare) : AS_RELATION_COMPARE_GE);
+
++#if AS_CHECK_VERSION(1, 0, 0)
++ side = xb_node_get_attr (child, "side");
++ as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
++ as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
++#else
+ display_length_kind = as_display_length_kind_from_string (xb_node_get_text (child));
+ if (display_length_kind != AS_DISPLAY_LENGTH_KIND_UNKNOWN) {
+ /* Ignore the `side` attribute */
+ as_relation_set_value_display_length_kind (relation, display_length_kind);
+ } else {
+- const gchar *side = xb_node_get_attr (child, "side");
++ side = xb_node_get_attr (child, "side");
+ as_relation_set_display_side_kind (relation, (side != NULL) ? as_display_side_kind_from_string (side) : AS_DISPLAY_SIDE_KIND_SHORTEST);
+ as_relation_set_value_px (relation, xb_node_get_text_as_uint (child));
+ }
++#endif
+ } else {
+ g_debug ("Relation type ‘%s’ not currently supported for %s; ignoring",
+ item_kind, gs_app_get_id (app));
+@@ -1472,7 +1481,7 @@ gs_appstream_refine_app (GsPlugin *plugin,
+ }
+
+ typedef struct {
+- AsSearchTokenMatch match_value;
++ guint16 match_value;
+ XbQuery *query;
+ } GsAppstreamSearchHelper;
+
+@@ -1522,7 +1531,7 @@ gs_appstream_silo_search_component (GPtrArray *array, XbNode *component, const g
+ }
+
+ typedef struct {
+- AsSearchTokenMatch match_value;
++ guint16 match_value;
+ const gchar *xpath;
+ } Query;
+
+@@ -1539,6 +1548,11 @@ gs_appstream_do_search (GsPlugin *plugin,
+ g_autoptr(GPtrArray) array = g_ptr_array_new_with_free_func ((GDestroyNotify) gs_appstream_search_helper_free);
+ g_autoptr(GPtrArray) components = NULL;
+ g_autoptr(GTimer) timer = g_timer_new ();
++#if AS_CHECK_VERSION(1, 0, 0)
++ const guint16 component_id_weight = as_utils_get_tag_search_weight ("id");
++#else
++ const guint16 component_id_weight = AS_SEARCH_TOKEN_MATCH_ID;
++#endif
+
+ g_return_val_if_fail (GS_IS_PLUGIN (plugin), FALSE);
+ g_return_val_if_fail (XB_IS_SILO (silo), FALSE);
+@@ -1585,7 +1599,7 @@ gs_appstream_do_search (GsPlugin *plugin,
+ * Drop the ID token from it as it’s the highest
+ * numeric value but isn’t visible to the user in the
+ * UI, which leads to confusing results ordering. */
+- gs_app_set_match_value (app, match_value & (~AS_SEARCH_TOKEN_MATCH_ID));
++ gs_app_set_match_value (app, match_value & (~component_id_weight));
+ gs_app_list_add (list, app);
+
+ if (gs_app_get_kind (app) == AS_COMPONENT_KIND_ADDON) {
+@@ -1624,18 +1638,32 @@ gs_appstream_search (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GError **error)
+ {
++#if AS_CHECK_VERSION(1, 0, 0)
++ guint16 pkgname_weight = as_utils_get_tag_search_weight ("pkgname");
++ guint16 name_weight = as_utils_get_tag_search_weight ("name");
++ guint16 id_weight = as_utils_get_tag_search_weight ("id");
+ const Query queries[] = {
+- #ifdef HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE
+- { AS_SEARCH_TOKEN_MATCH_MEDIATYPE, "mimetypes/mimetype[text()~=stem(?)]" },
+- #else
+- { AS_SEARCH_TOKEN_MATCH_MIMETYPE, "mimetypes/mimetype[text()~=stem(?)]" },
+- #endif
++ { as_utils_get_tag_search_weight ("mediatype"), "provides/mediatype[text()~=stem(?)]" },
+ /* Search once with a tokenize-and-casefold operator (`~=`) to support casefolded
+ * full-text search, then again using substring matching (`contains()`), to
+ * support prefix matching. Only do the prefix matches on a few fields, and at a
+ * lower priority, otherwise things will get confusing.
+- *
++ *
+ * See https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2277 */
++ { pkgname_weight, "pkgname[text()~=stem(?)]" },
++ { pkgname_weight / 2, "pkgname[contains(text(),stem(?))]" },
++ { as_utils_get_tag_search_weight ("summary"), "summary[text()~=stem(?)]" },
++ { name_weight, "name[text()~=stem(?)]" },
++ { name_weight / 2, "name[contains(text(),stem(?))]" },
++ { as_utils_get_tag_search_weight ("keyword"), "keywords/keyword[text()~=stem(?)]" },
++ { id_weight, "id[text()~=stem(?)]" },
++ { id_weight, "launchable[text()~=stem(?)]" },
++ { as_utils_get_tag_search_weight ("origin"), "../components[@origin~=stem(?)]" },
++ { 0, NULL }
++ };
++#else
++ const Query queries[] = {
++ { AS_SEARCH_TOKEN_MATCH_MEDIATYPE, "mimetypes/mimetype[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_PKGNAME, "pkgname[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_PKGNAME / 2, "pkgname[contains(text(),stem(?))]" },
+ { AS_SEARCH_TOKEN_MATCH_SUMMARY, "summary[text()~=stem(?)]" },
+@@ -1647,6 +1675,7 @@ gs_appstream_search (GsPlugin *plugin,
+ { AS_SEARCH_TOKEN_MATCH_ORIGIN, "../components[@origin~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_NONE, NULL }
+ };
++#endif
+
+ return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
+ }
+@@ -1659,11 +1688,21 @@ gs_appstream_search_developer_apps (GsPlugin *plugin,
+ GCancellable *cancellable,
+ GError **error)
+ {
++#if AS_CHECK_VERSION(1, 0, 0)
++ const Query queries[] = {
++ { as_utils_get_tag_search_weight ("pkgname"), "developer/name[text()~=stem(?)]" },
++ { as_utils_get_tag_search_weight ("summary"), "project_group[text()~=stem(?)]" },
++ /* for legacy support */
++ { as_utils_get_tag_search_weight ("pkgname"), "developer_name[text()~=stem(?)]" },
++ { 0, NULL }
++ };
++#else
+ const Query queries[] = {
+ { AS_SEARCH_TOKEN_MATCH_PKGNAME, "developer_name[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_SUMMARY, "project_group[text()~=stem(?)]" },
+ { AS_SEARCH_TOKEN_MATCH_NONE, NULL }
+ };
++#endif
+
+ return gs_appstream_do_search (plugin, silo, values, queries, list, cancellable, error);
+ }
+diff --git a/lib/gs-utils.c b/lib/gs-utils.c
+index cf9073025f..19e6ebd046 100644
+--- a/lib/gs-utils.c
++++ b/lib/gs-utils.c
+@@ -1694,9 +1694,9 @@ gs_utils_gstring_replace (GString *str,
+ const gchar *find,
+ const gchar *replace)
+ {
+- #ifdef HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS
++#if AS_CHECK_VERSION(1, 0, 0)
+ as_gstring_replace (str, find, replace, 0);
+- #else
+- as_gstring_replace (str, find, replace);
+- #endif
++#else
++ as_gstring_replace2 (str, find, replace, 0);
++#endif
+ }
+diff --git a/meson.build b/meson.build
+index bc19669dd5..8c82464cdb 100644
+--- a/meson.build
++++ b/meson.build
+@@ -113,7 +113,7 @@ add_project_arguments('-D_GNU_SOURCE', language : 'c')
+ conf.set('HAVE_LINUX_UNISTD_H', cc.has_header('linux/unistd.h'))
+
+ appstream = dependency('appstream',
+- version : '>= 0.14.0',
++ version : '>= 0.16.4',
+ fallback : ['appstream', 'appstream_dep'],
+ default_options : [
+ 'docs=false',
+@@ -121,26 +121,6 @@ appstream = dependency('appstream',
+ 'install-docs=false'
+ ]
+ )
+-if appstream.type_name() == 'internal'
+-else
+- if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_SEARCH_TOKEN_MATCH_MEDIATYPE', dependencies: appstream)
+- conf.set('HAVE_AS_SEARCH_TOKEN_MATCH_MEDIATYPE', '1')
+- endif
+- if meson.get_compiler('c').has_header_symbol('appstream.h', 'AS_FORMAT_STYLE_CATALOG', dependencies: appstream)
+- conf.set('HAVE_AS_FORMAT_STYLE_CATALOG', '1')
+- endif
+- if meson.get_compiler('c').has_function('as_metadata_components_to_catalog', prefix: '#include <appstream.h>', dependencies: appstream)
+- conf.set('HAVE_AS_METADATA_COMPONENTS_TO_CATALOG', '1')
+- endif
+- if meson.get_compiler('c').links('''#include <appstream.h>
+- int main (void)
+- {
+- as_gstring_replace (NULL, "a", "b", 0);
+- return 0;
+- }''', name: 'as_gstring_replace() has four arguments', dependencies: appstream)
+- conf.set('HAVE_AS_GSTRING_REPLACE_WITH_FOUR_ARGS', '1')
+- endif
+-endif
+
+ gdk_pixbuf = dependency('gdk-pixbuf-2.0', version : '>= 2.32.0')
+ libxmlb = dependency('xmlb', version : '>= 0.1.7', fallback : ['libxmlb', 'libxmlb_dep'])
+diff --git a/plugins/core/gs-plugin-appstream.c b/plugins/core/gs-plugin-appstream.c
+index cf9f3022b1..ef3226a591 100644
+--- a/plugins/core/gs-plugin-appstream.c
++++ b/plugins/core/gs-plugin-appstream.c
+@@ -414,11 +414,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
+ if (bytes == NULL)
+ return NULL;
+
+- #ifdef HAVE_AS_FORMAT_STYLE_CATALOG
+ as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_CATALOG);
+- #else
+- as_metadata_set_format_style (mdata, AS_FORMAT_STYLE_COLLECTION);
+- #endif
+ as_metadata_parse_bytes (mdata,
+ bytes,
+ AS_FORMAT_KIND_YAML,
+@@ -428,11 +424,7 @@ gs_plugin_appstream_load_dep11_cb (XbBuilderSource *self,
+ return NULL;
+ }
+
+- #ifdef HAVE_AS_METADATA_COMPONENTS_TO_CATALOG
+ xml = as_metadata_components_to_catalog (mdata, AS_FORMAT_KIND_XML, &tmp_error);
+- #else
+- xml = as_metadata_components_to_collection (mdata, AS_FORMAT_KIND_XML, &tmp_error);
+- #endif
+ if (xml == NULL) {
+ // This API currently returns NULL if there is nothing to serialize, so we
+ // have to test if this is an error or not.
+diff --git a/plugins/fwupd/gs-fwupd-app.c b/plugins/fwupd/gs-fwupd-app.c
+index 6dcda6ee92..5d3254da59 100644
+--- a/plugins/fwupd/gs-fwupd-app.c
++++ b/plugins/fwupd/gs-fwupd-app.c
+@@ -164,7 +164,11 @@ gs_fwupd_app_set_from_device (GsApp *app,
+ gs_app_set_install_date (app, fwupd_device_get_created (dev));
+ if (fwupd_device_get_description (dev) != NULL) {
+ g_autofree gchar *tmp = NULL;
++#if AS_CHECK_VERSION(1, 0, 0)
++ tmp = as_markup_convert (fwupd_device_get_description (dev), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ tmp = as_markup_convert_simple (fwupd_device_get_description (dev), NULL);
++#endif
+ if (tmp != NULL)
+ gs_app_set_description (app, GS_APP_QUALITY_NORMAL, tmp);
+ }
+@@ -402,7 +406,11 @@ gs_fwupd_app_set_from_release (GsApp *app, FwupdRelease *rel)
+ }
+ if (fwupd_release_get_description (rel) != NULL) {
+ g_autofree gchar *tmp = NULL;
++#if AS_CHECK_VERSION(1, 0, 0)
++ tmp = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ tmp = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
++#endif
+ if (tmp != NULL)
+ gs_app_set_update_details_text (app, tmp);
+ }
+diff --git a/plugins/fwupd/gs-plugin-fwupd.c b/plugins/fwupd/gs-plugin-fwupd.c
+index d8c0cd2dd4..a9b05028a0 100644
+--- a/plugins/fwupd/gs-plugin-fwupd.c
++++ b/plugins/fwupd/gs-plugin-fwupd.c
+@@ -727,7 +727,11 @@ gs_plugin_add_updates (GsPlugin *plugin,
+ g_autofree gchar *desc = NULL;
+ if (fwupd_release_get_description (rel) == NULL)
+ continue;
++#if AS_CHECK_VERSION(1, 0, 0)
++ desc = as_markup_convert (fwupd_release_get_description (rel), AS_MARKUP_KIND_TEXT, NULL);
++#else
+ desc = as_markup_convert_simple (fwupd_release_get_description (rel), NULL);
++#endif
+ if (desc == NULL)
+ continue;
+ g_string_append_printf (update_desc,
+diff --git a/src/gs-hardware-support-context-dialog.c b/src/gs-hardware-support-context-dialog.c
+index 0e48c8c266..14653401de 100644
+--- a/src/gs-hardware-support-context-dialog.c
++++ b/src/gs-hardware-support-context-dialog.c
+@@ -461,6 +461,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
+ AsRelationCompare comparator = as_relation_get_compare (relation);
+ Range current_display_comparand, relation_comparand;
+
++#if !AS_CHECK_VERSION(1, 0, 0)
+ /* From https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#tag-requires-recommends-display_length */
+ Range display_lengths[] = {
+ [AS_DISPLAY_LENGTH_KIND_XSMALL] = { 0, 360 },
+@@ -469,6 +470,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
+ [AS_DISPLAY_LENGTH_KIND_LARGE] = { 1024, 3840 },
+ [AS_DISPLAY_LENGTH_KIND_XLARGE] = { 3840, G_MAXUINT },
+ };
++#endif
+
+ any_display_relations_set = TRUE;
+
+@@ -485,11 +487,14 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
+ case AS_DISPLAY_SIDE_KIND_LAST:
+ default:
+ current_display_comparand.min = current_display_comparand.max = MAX (current_screen_size.width, current_screen_size.height);
++#if !AS_CHECK_VERSION(1, 0, 0)
+ relation_comparand.min = display_lengths[as_relation_get_value_display_length_kind (relation)].min;
+ relation_comparand.max = display_lengths[as_relation_get_value_display_length_kind (relation)].max;
++#endif
+ break;
+ }
+
++#if !AS_CHECK_VERSION(1, 0, 0)
+ if (evaluate_display_comparison (display_lengths[AS_DISPLAY_LENGTH_KIND_SMALL], comparator, relation_comparand)) {
+ *mobile_relation_kind_out = max_relation_kind (*mobile_relation_kind_out, as_relation_get_kind (relation));
+ *mobile_match_out = TRUE;
+@@ -499,6 +504,7 @@ gs_hardware_support_context_dialog_get_display_support (GdkMonitor *monitor,
+ *desktop_relation_kind_out = max_relation_kind (*desktop_relation_kind_out, as_relation_get_kind (relation));
+ *desktop_match_out = TRUE;
+ }
++#endif
+
+ if (evaluate_display_comparison (current_display_comparand, comparator, relation_comparand)) {
+ *current_relation_kind_out = max_relation_kind (*current_relation_kind_out, as_relation_get_kind (relation));
+diff --git a/src/gs-repos-dialog.c b/src/gs-repos-dialog.c
+index c41c4944a1..7dac0416d9 100644
+--- a/src/gs-repos-dialog.c
++++ b/src/gs-repos-dialog.c
+@@ -154,7 +154,11 @@ enable_repo (GsReposDialog *dialog,
+ g_autoptr(GError) error = NULL;
+
+ /* convert from AppStream markup */
++#if AS_CHECK_VERSION(1, 0, 0)
++ message = as_markup_convert (gs_app_get_agreement (repo), AS_MARKUP_KIND_TEXT, &error);
++#else
+ message = as_markup_convert_simple (gs_app_get_agreement (repo), &error);
++#endif
+ if (message == NULL) {
+ /* failed, so just try and show the original markup */
+ message = g_strdup (gs_app_get_agreement (repo));
+diff --git a/src/gs-screenshot-carousel.c b/src/gs-screenshot-carousel.c
+index 04bbf86a1e..d269af6605 100644
+--- a/src/gs-screenshot-carousel.c
++++ b/src/gs-screenshot-carousel.c
+@@ -141,8 +141,8 @@ gs_screenshot_carousel_load_screenshots (GsScreenshotCarousel *self, GsApp *app,
+ gtk_widget_set_can_focus (gtk_widget_get_first_child (ssimg), FALSE);
+ gs_screenshot_image_set_screenshot (GS_SCREENSHOT_IMAGE (ssimg), ss);
+ gs_screenshot_image_set_size (GS_SCREENSHOT_IMAGE (ssimg),
+- AS_IMAGE_NORMAL_WIDTH,
+- AS_IMAGE_NORMAL_HEIGHT);
++ GS_IMAGE_NORMAL_WIDTH,
++ GS_IMAGE_NORMAL_HEIGHT);
+ gtk_widget_add_css_class (ssimg, "screenshot-image-main");
+ gs_screenshot_image_load_async (GS_SCREENSHOT_IMAGE (ssimg), cancellable);
+
+diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
+index 93dba68f96..6b4db03d06 100644
+--- a/src/gs-screenshot-image.c
++++ b/src/gs-screenshot-image.c
+@@ -293,13 +293,13 @@ gs_screenshot_image_save_downloaded_img (GsScreenshotImage *ssimg,
+ if (images->len > 1)
+ return TRUE;
+
+- if (width == AS_IMAGE_THUMBNAIL_WIDTH &&
+- height == AS_IMAGE_THUMBNAIL_HEIGHT) {
+- width = AS_IMAGE_NORMAL_WIDTH;
+- height = AS_IMAGE_NORMAL_HEIGHT;
++ if (width == GS_IMAGE_THUMBNAIL_WIDTH &&
++ height == GS_IMAGE_THUMBNAIL_HEIGHT) {
++ width = GS_IMAGE_NORMAL_WIDTH;
++ height = GS_IMAGE_NORMAL_HEIGHT;
+ } else {
+- width = AS_IMAGE_THUMBNAIL_WIDTH;
+- height = AS_IMAGE_THUMBNAIL_HEIGHT;
++ width = GS_IMAGE_THUMBNAIL_WIDTH;
++ height = GS_IMAGE_THUMBNAIL_HEIGHT;
+ }
+
+ width *= ssimg->scale;
+@@ -591,16 +591,30 @@ gs_screenshot_image_get_url (GsScreenshotImage *ssimg)
+ } else if (as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE) {
+ AsImage *im;
+
++#if AS_CHECK_VERSION(1, 0, 0)
++ im = as_screenshot_get_image (ssimg->screenshot,
++ ssimg->width,
++ ssimg->height,
++ ssimg->scale);
++#else
+ im = as_screenshot_get_image (ssimg->screenshot,
+ ssimg->width * ssimg->scale,
+ ssimg->height * ssimg->scale);
++#endif
+
+ /* if we've failed to load a HiDPI image, fallback to LoDPI */
+ if (im == NULL && ssimg->scale > 1) {
+ ssimg->scale = 1;
++#if AS_CHECK_VERSION(1, 0, 0)
++ im = as_screenshot_get_image (ssimg->screenshot,
++ ssimg->width,
++ ssimg->height,
++ 1);
++#else
+ im = as_screenshot_get_image (ssimg->screenshot,
+ ssimg->width,
+ ssimg->height);
++#endif
+ }
+
+ if (im)
+@@ -707,15 +721,22 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
+ * smaller version of it straight away */
+ if (!ssimg->showing_image &&
+ as_screenshot_get_media_kind (ssimg->screenshot) == AS_SCREENSHOT_MEDIA_KIND_IMAGE &&
+- ssimg->width > AS_IMAGE_THUMBNAIL_WIDTH &&
+- ssimg->height > AS_IMAGE_THUMBNAIL_HEIGHT) {
++ ssimg->width > GS_IMAGE_THUMBNAIL_WIDTH &&
++ ssimg->height > GS_IMAGE_THUMBNAIL_HEIGHT) {
+ const gchar *url_thumb;
+ g_autofree gchar *basename_thumb = NULL;
+ g_autofree gchar *cache_kind_thumb = NULL;
+ AsImage *im;
++#if AS_CHECK_VERSION(1, 0, 0)
+ im = as_screenshot_get_image (ssimg->screenshot,
+- AS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
+- AS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
++ GS_IMAGE_THUMBNAIL_WIDTH,
++ GS_IMAGE_THUMBNAIL_HEIGHT,
++ ssimg->scale);
++#else
++ im = as_screenshot_get_image (ssimg->screenshot,
++ GS_IMAGE_THUMBNAIL_WIDTH * ssimg->scale,
++ GS_IMAGE_THUMBNAIL_HEIGHT * ssimg->scale);
++#endif
+ url_thumb = as_image_get_url (im);
+ basename_thumb = gs_screenshot_get_cachefn_for_url (url_thumb);
+ cache_kind_thumb = g_build_filename ("screenshots", "112x63", NULL);
+diff --git a/src/gs-screenshot-image.h b/src/gs-screenshot-image.h
+index 1f6cf81ce6..6e45f5d20a 100644
+--- a/src/gs-screenshot-image.h
++++ b/src/gs-screenshot-image.h
+@@ -21,6 +21,13 @@ G_BEGIN_DECLS
+
+ G_DECLARE_FINAL_TYPE (GsScreenshotImage, gs_screenshot_image, GS, SCREENSHOT_IMAGE, GtkWidget)
+
++#define GS_IMAGE_LARGE_HEIGHT 423
++#define GS_IMAGE_LARGE_WIDTH 752
++#define GS_IMAGE_NORMAL_HEIGHT 351
++#define GS_IMAGE_NORMAL_WIDTH 624
++#define GS_IMAGE_THUMBNAIL_HEIGHT 63
++#define GS_IMAGE_THUMBNAIL_WIDTH 112
++
+ GtkWidget *gs_screenshot_image_new (SoupSession *session);
+
+ AsScreenshot *gs_screenshot_image_get_screenshot (GsScreenshotImage *ssimg);
+diff --git a/subprojects/appstream.wrap b/subprojects/appstream.wrap
+index 6f0beb0cbc..b9a9c7dbe5 100644
+--- a/subprojects/appstream.wrap
++++ b/subprojects/appstream.wrap
+@@ -1,5 +1,5 @@
+ [wrap-git]
+ directory = appstream
+ url = https://github.com/ximion/appstream.git
+-revision = v0.14.1
++revision = v0.16.4
+ depth = 1
+--
+GitLab
+
diff --git a/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch b/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch
new file mode 100644
index 0000000000..b7bddc3243
--- /dev/null
+++ b/meta-gnome/recipes-gnome/gnome-software/gnome-software/e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch
@@ -0,0 +1,31 @@
+From e431ab003f3fabf616b6eb7dc93f8967bc9473e5 Mon Sep 17 00:00:00 2001
+From: Milan Crha <mcrha@redhat.com>
+Date: Wed, 22 Nov 2023 09:44:40 +0100
+Subject: [PATCH] gs-appstream: Remove use of AS_PROVIDED_KIND_PYTHON_2
+
+It's dropped in appstream 1.0.0 and it's not used anywhere in the gnome-software
+code, thus just remove it, rather than have it only for pre-1.0.0 appstream version.
+
+Closes https://gitlab.gnome.org/GNOME/gnome-software/-/issues/2388
+
+Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/gnome-software/-/commit/e431ab003f3fabf616b6eb7dc93f8967bc9473e5]
+---
+ lib/gs-appstream.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/lib/gs-appstream.c b/lib/gs-appstream.c
+index 6504d6f25..4fd7f5334 100644
+--- a/lib/gs-appstream.c
++++ b/lib/gs-appstream.c
+@@ -587,8 +587,6 @@ gs_appstream_refine_add_provides (GsApp *app, XbNode *component, GError **error)
+ kind = AS_PROVIDED_KIND_FIRMWARE_RUNTIME;
+ else if (g_strcmp0 (fw_type, "flashed") == 0)
+ kind = AS_PROVIDED_KIND_FIRMWARE_FLASHED;
+- } else if (g_strcmp0 (element_name, "python2") == 0) {
+- kind = AS_PROVIDED_KIND_PYTHON_2;
+ } else if (g_strcmp0 (element_name, "python3") == 0) {
+ kind = AS_PROVIDED_KIND_PYTHON;
+ } else if (g_strcmp0 (element_name, "dbus") == 0) {
+--
+GitLab
+
diff --git a/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb b/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb
index f363a2bbee..fc2b696aa0 100644
--- a/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.1.bb
+++ b/meta-gnome/recipes-gnome/gnome-software/gnome-software_45.2.bb
@@ -28,7 +28,11 @@ RDEPENDS:${PN} = "iso-codes"
EXTRA_OEMESON += "-Dtests=false -Dsoup2=false"
-SRC_URI[archive.sha256sum] = "d72485f7a6e0917f64edbedd68fd7b57246c6ebf10c5a45108b63946635778a2"
+SRC_URI += " \
+ file://0655f358ed0e8455e12d9634f60bc4dbaee434e3.patch \
+ file://e431ab003f3fabf616b6eb7dc93f8967bc9473e5.patch \
+"
+SRC_URI[archive.sha256sum] = "0bdd8fc0caecd6eb013c6010dbca93077397118a6ef5eaf264e2a820a292f5b7"
PACKAGECONFIG ?= "flatpak"
PACKAGECONFIG[flatpak] = "-Dflatpak=true,-Dflatpak=false,flatpak ostree"