From 441ac3e36ec75d19a2ab44d20bc469f85024e41e Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 30 Apr 2026 20:25:23 +0200 Subject: [PATCH] Sync gnome-qr library patch series with upstream MR Now that the upstream MR has been merged, sync our downstream patch series with it. The gnome-qr-gtk and qr-code test parts are stripped out. Resolves: https://redhat.atlassian.net/browse/RHEL-172452 --- 0001-Add-gnome-qr-library.patch | 1541 +++++++++++++------------------ gnome-desktop3.spec | 2 +- 2 files changed, 632 insertions(+), 911 deletions(-) diff --git a/0001-Add-gnome-qr-library.patch b/0001-Add-gnome-qr-library.patch index 0f34618..c738bb4 100644 --- a/0001-Add-gnome-qr-library.patch +++ b/0001-Add-gnome-qr-library.patch @@ -1,9 +1,11 @@ -From 5b0d028d35bfff54dd68c8b157bf34ac47532c75 Mon Sep 17 00:00:00 2001 +From 2b4aa5f90767d0f08519744f17783252fc537802 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 27 Nov 2025 18:03:16 +0100 -Subject: [PATCH 01/20] meson: Add QR-Code-generator as a subproject +Subject: [PATCH 01/23] meson: Add QR-Code-generator as a subproject Will be used by next commit to generate QR codes + +Part-of: --- .gitignore | 1 + meson.build | 3 +++ @@ -22,10 +24,10 @@ index 00000000..97b1a628 @@ -0,0 +1 @@ +subprojects/qrcodegen diff --git a/meson.build b/meson.build -index 0c3c7c1f..a4876a84 100644 +index a6c7ae2a..d5ab0360 100644 --- a/meson.build +++ b/meson.build -@@ -91,6 +91,9 @@ if not cc.has_function('clock_gettime', dependencies: rt_dep) +@@ -95,6 +95,9 @@ if not cc.has_function('clock_gettime', dependencies: rt_dep) rt_dep = dependency('', required: false) endif @@ -63,13 +65,13 @@ index 00000000..9080ca48 +depth = 1 +patch_directory = qrcodegen -- -2.52.0 +2.53.0 -From 19f107f0695db1bb685aa644191439e9f287c7ff Mon Sep 17 00:00:00 2001 +From 3c1157e66c8698a8ac66a64079f8fe3b49450223 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Thu, 20 Nov 2025 19:54:34 +0100 -Subject: [PATCH 02/20] Introduce gnome-qr library +Subject: [PATCH 02/23] Introduce gnome-qr library g-c-c and now gnome-shell need to generate QR codes. @@ -78,19 +80,22 @@ library implementation to avoid dependencies. Now gnome-shell needs to generate QR codes too, so it makes sense to port the g-c-c QR code generation to libgnome-desktop. + +Part-of: --- .../gnome-desktop3-sections.txt | 14 + libgnome-desktop/gnome-qr/gnome-qr.c | 306 ++++++++++++++++++ libgnome-desktop/gnome-qr/gnome-qr.h | 125 +++++++ libgnome-desktop/gnome-qr/meson.build | 41 +++ libgnome-desktop/meson.build | 1 + - 5 files changed, 487 insertions(+) + meson.build | 4 + + 6 files changed, 491 insertions(+) create mode 100644 libgnome-desktop/gnome-qr/gnome-qr.c create mode 100644 libgnome-desktop/gnome-qr/gnome-qr.h create mode 100644 libgnome-desktop/gnome-qr/meson.build diff --git a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt -index 4f189fcd..0b6b6ec6 100644 +index 4f189fc..0b6b6ec 100644 --- a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt +++ b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt @@ -359,3 +359,17 @@ GNOME_TYPE_PNP_IDS @@ -113,7 +118,7 @@ index 4f189fcd..0b6b6ec6 100644 + diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c new file mode 100644 -index 00000000..e22bb1f4 +index 0000000..e22bb1f --- /dev/null +++ b/libgnome-desktop/gnome-qr/gnome-qr.c @@ -0,0 +1,306 @@ @@ -425,7 +430,7 @@ index 00000000..e22bb1f4 +} diff --git a/libgnome-desktop/gnome-qr/gnome-qr.h b/libgnome-desktop/gnome-qr/gnome-qr.h new file mode 100644 -index 00000000..4d89c59d +index 0000000..4d89c59 --- /dev/null +++ b/libgnome-desktop/gnome-qr/gnome-qr.h @@ -0,0 +1,125 @@ @@ -556,7 +561,7 @@ index 00000000..4d89c59d + GError **error); diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build new file mode 100644 -index 00000000..f8ff3068 +index 0000000..0c59079 --- /dev/null +++ b/libgnome-desktop/gnome-qr/meson.build @@ -0,0 +1,41 @@ @@ -579,11 +584,11 @@ index 00000000..f8ff3068 + subdir: 'gnome-desktop-4.0/gnome-qr' +) + -+libgnome_qr = library('gnome-qr-4', ++libgnome_qr = library('gnome-qr', + sources: libgnome_qr_sources, + dependencies: libgnome_qr_deps, -+ soversion: soversion, -+ version: libversion, ++ soversion: qr_soversion, ++ version: qr_libversion, + c_args: libargs, + install: true, + include_directories: [ @@ -594,7 +599,7 @@ index 00000000..f8ff3068 + +pkg.generate( + libgnome_qr, -+ requires: ['gsettings-desktop-schemas'], ++ requires: ['gio-2.0'], + version: meson.project_version(), + name: 'gnome-qr-4', + filebase: 'gnome-qr-4', @@ -602,7 +607,7 @@ index 00000000..f8ff3068 + subdirs: 'gnome-desktop-4.0', +) diff --git a/libgnome-desktop/meson.build b/libgnome-desktop/meson.build -index 708a4ae8..cbf3fc74 100644 +index 708a4ae..cbf3fc7 100644 --- a/libgnome-desktop/meson.build +++ b/libgnome-desktop/meson.build @@ -167,6 +167,7 @@ if get_option('build_gtk4') @@ -613,18 +618,86 @@ index 708a4ae8..cbf3fc74 100644 endif ### Legacy ### +diff --git a/meson.build b/meson.build +index a4876a8..77c87a3 100644 +--- a/meson.build ++++ b/meson.build +@@ -30,6 +30,10 @@ soversion = libversion.split('.')[0] + compat_libversion = '20.0.0' + compat_soversion = compat_libversion.split('.')[0] + ++# Compatibilty versions for libgnome-qr ++qr_libversion = '0.0.1' ++qr_soversion = qr_libversion.split('.')[0] ++ + gdk_pixbuf_req = '>= 2.36.5' + gtk3_req = '>= 3.3.6' + gtk4_req = '>= 4.4.0' +From 10e03bc2ef8f76a46d80126d1c1abb6b68000866 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Sun, 8 Feb 2026 19:16:23 +0100 +Subject: [PATCH 03/23] gnome-qr: Use a symbol map file to export symbols + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr-symbols.map | 6 ++++++ + libgnome-desktop/gnome-qr/meson.build | 10 ++++++++++ + 2 files changed, 16 insertions(+) + create mode 100644 libgnome-desktop/gnome-qr/gnome-qr-symbols.map + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr-symbols.map b/libgnome-desktop/gnome-qr/gnome-qr-symbols.map +new file mode 100644 +index 00000000..b32e579d +--- /dev/null ++++ b/libgnome-desktop/gnome-qr/gnome-qr-symbols.map +@@ -0,0 +1,6 @@ ++{ ++global: ++ gnome_qr_*; ++local: ++ *; ++}; +diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build +index 0c59079d..ec065699 100644 +--- a/libgnome-desktop/gnome-qr/meson.build ++++ b/libgnome-desktop/gnome-qr/meson.build +@@ -17,12 +17,22 @@ install_headers(libgnome_qr_headers, + subdir: 'gnome-desktop-4.0/gnome-qr' + ) + ++gnome_qr_ld_flags = [] ++gnome_qr_symbol_map = 'gnome-qr-symbols.map' ++gnome_qr_symbol_map_arg = '-Wl,--version-script=@0@'.format( ++ meson.current_source_dir() / gnome_qr_symbol_map) ++if cc.has_link_argument(gnome_qr_symbol_map_arg) ++ gnome_qr_ld_flags += gnome_qr_symbol_map_arg ++endif ++ + libgnome_qr = library('gnome-qr', + sources: libgnome_qr_sources, + dependencies: libgnome_qr_deps, + soversion: qr_soversion, + version: qr_libversion, + c_args: libargs, ++ link_args: gnome_qr_ld_flags, ++ link_depends: files(gnome_qr_symbol_map), + install: true, + include_directories: [ + include_directories('.'), -- -2.52.0 +2.53.0 -From 6a8a8455d857331b47aa35210fcc2bc5c7db2773 Mon Sep 17 00:00:00 2001 +From 15d0ceabf6381702e49ff01e6d28831d6780f5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 4 Dec 2025 22:07:57 +0100 -Subject: [PATCH 03/20] subprojects/qrcodegen: Pin the library version +Subject: [PATCH 04/23] subprojects/qrcodegen: Pin the library version We cannot just allow any revision to be picked by meson without some human review, so let's just lock the version to the latest that we checked rather than just accept any new version + +Part-of: --- subprojects/qrcodegen.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) @@ -641,16 +714,18 @@ index 9080ca48..9421ab21 100644 depth = 1 patch_directory = qrcodegen -- -2.52.0 +2.53.0 -From ab22410332d89074e9c63635c32ab877a68d9a50 Mon Sep 17 00:00:00 2001 +From 6de913f30e3638259b104379de198420834de55a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 4 Dec 2025 22:27:52 +0100 -Subject: [PATCH 04/20] subprojects/qrcodegen: Move meson overlays to the +Subject: [PATCH 05/23] subprojects/qrcodegen: Move meson overlays to the proper folders So we don't have to repeat it + +Part-of: --- subprojects/packagefiles/qrcodegen/c/meson.build | 8 ++++++++ subprojects/packagefiles/qrcodegen/meson.build | 9 +-------- @@ -688,45 +763,15 @@ index 0a66ccb5..e2ba7785 100644 -) +subdir('c') -- -2.52.0 +2.53.0 -From 643d5616fce9ad77a256b249266ac297e1e877b8 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Thu, 4 Dec 2025 22:40:00 +0100 -Subject: [PATCH 05/20] subprojects/qrcodegen: Run upstream tests - ---- - subprojects/packagefiles/qrcodegen/c/meson.build | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/subprojects/packagefiles/qrcodegen/c/meson.build b/subprojects/packagefiles/qrcodegen/c/meson.build -index 1f819005..ca221bca 100644 ---- a/subprojects/packagefiles/qrcodegen/c/meson.build -+++ b/subprojects/packagefiles/qrcodegen/c/meson.build -@@ -6,3 +6,13 @@ qrcodegen_dep = declare_dependency( - link_with: libqrcodegen, - include_directories: include_directories('.') - ) -+ -+test('qrcodegen', -+ executable('qrcodegen-test', -+ sources: [ -+ 'qrcodegen.c', -+ 'qrcodegen-test.c', -+ ], -+ c_args: ['-DQRCODEGEN_TEST'], -+ ), -+) --- -2.52.0 - - -From b834c23a3580ba1fc32eb34ed57f16e8aa111b0f Mon Sep 17 00:00:00 2001 +From 1dd7f2f87f6e0d26c84856ec734b0948739f4eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 4 Dec 2025 22:46:10 +0100 -Subject: [PATCH 06/20] gnome-qr: Always use spaces for indentation +Subject: [PATCH 06/23] gnome-qr: Always use spaces for indentation +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 6 +++--- libgnome-desktop/gnome-qr/gnome-qr.h | 8 ++++---- @@ -769,15 +814,17 @@ index 4d89c59d..b95480c3 100644 /** -- -2.52.0 +2.53.0 -From 07955fdefa7bb0572b9415d52f0521642de9afdd Mon Sep 17 00:00:00 2001 +From e0b0ec08df65395e402b3fc91d4d18fda84ec6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 4 Dec 2025 23:14:07 +0100 -Subject: [PATCH 07/20] gnome-qr: Mark the out_size as optional +Subject: [PATCH 07/23] gnome-qr: Mark the out_size as optional It's not nullable actually, but optional being an out value + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) @@ -807,14 +854,15 @@ index 59fd42e3..5977842f 100644 * * Finish the asynchronous operation started by -- -2.52.0 +2.53.0 -From 09fe6b43a56af35174f0d5bbeb591c04b1d918d9 Mon Sep 17 00:00:00 2001 +From 09865e0eb2cfee54678f80b0d75eb06d455c9610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 00:59:47 +0100 -Subject: [PATCH 08/20] gnome-qr: Clarify the input and output size values +Subject: [PATCH 08/23] gnome-qr: Clarify the input and output size values +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 63 +++++++++++++++------------- libgnome-desktop/gnome-qr/gnome-qr.h | 8 ++-- @@ -1039,14 +1087,15 @@ index b95480c3..d7dbf52a 100644 + size_t *pixel_size_out, GError **error); -- -2.52.0 +2.53.0 -From 8846d0b6899d8dff5d81554f3bb177f5c7390ad2 Mon Sep 17 00:00:00 2001 +From 270043bf50f8eb2f23bbc3837e881a6c894b520c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 01:10:00 +0100 -Subject: [PATCH 09/20] gnome-qr: Docs cleanups +Subject: [PATCH 09/23] gnome-qr: Docs cleanups +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 4 ++-- libgnome-desktop/gnome-qr/meson.build | 2 +- @@ -1075,10 +1124,10 @@ index f2e7b152..ce9fd406 100644 * Only square QR codes are supported. * @bg_color: (nullable): The background color of the code diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build -index f8ff3068..5a9a2cea 100644 +index ec065699..31091b32 100644 --- a/libgnome-desktop/gnome-qr/meson.build +++ b/libgnome-desktop/gnome-qr/meson.build -@@ -36,6 +36,6 @@ pkg.generate( +@@ -46,6 +46,6 @@ pkg.generate( version: meson.project_version(), name: 'gnome-qr-4', filebase: 'gnome-qr-4', @@ -1087,13 +1136,13 @@ index f8ff3068..5a9a2cea 100644 subdirs: 'gnome-desktop-4.0', ) -- -2.52.0 +2.53.0 -From 0d61e1a58aa1b6fe97a5ca5f5c2c2c522a842d1d Mon Sep 17 00:00:00 2001 +From f7f68708ce77f51f746db2b4fdd69529f9ee4cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 01:11:57 +0100 -Subject: [PATCH 10/20] gnome-qr: Use the same pre-conditions in the sync and +Subject: [PATCH 10/23] gnome-qr: Use the same pre-conditions in the sync and async versions We have exactly the same requirements, however we were not checking the @@ -1103,6 +1152,8 @@ late to figure out what's wrong. So let's just replicate the same logic in both versions, rather than returning errors that are not real errors (but rather programmer errors). + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) @@ -1153,151 +1204,19 @@ index ce9fd406..50860bee 100644 data = g_new0 (GnomeQrCodeData, 1); -- -2.52.0 +2.53.0 -From 3c84ff4ece790b629f26c6d4c83c187d389e4edc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Fri, 5 Dec 2025 03:06:51 +0100 -Subject: [PATCH 11/20] tests/languages: Plug leaks for pleasing CI - ---- - tests/languages.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/tests/languages.c b/tests/languages.c -index 34c1cc02..42271bda 100644 ---- a/tests/languages.c -+++ b/tests/languages.c -@@ -29,9 +29,9 @@ - static void - test_using_null_locale (void) - { -- const char *translated_territory; -- const char *translated_language; -- const char *translated_modifier; -+ g_autofree char *translated_territory = NULL; -+ g_autofree char *translated_language = NULL; -+ g_autofree char *translated_modifier = NULL; - - translated_territory = gnome_get_country_from_code("US", NULL); - g_assert (translated_territory != NULL); --- -2.52.0 - - -From 2195f0c15535580dc8698a4f2fc6690b932e37eb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Fri, 5 Dec 2025 03:15:48 +0100 -Subject: [PATCH 12/20] gnome-languages: Do not leak the directory entries - ---- - libgnome-desktop/gnome-languages.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/libgnome-desktop/gnome-languages.c b/libgnome-desktop/gnome-languages.c -index 8a0485c8..f85adcf6 100644 ---- a/libgnome-desktop/gnome-languages.c -+++ b/libgnome-desktop/gnome-languages.c -@@ -480,6 +480,8 @@ collect_locales_from_directory (void) - for (cnt = 0; cnt < ndirents; ++cnt) { - if (add_locale (dirents[cnt]->d_name, TRUE)) - found_locales = TRUE; -+ -+ free (dirents[cnt]); - } - - if (ndirents > 0) { --- -2.52.0 - - -From b23c1293150be248aab2dc83ffc207cf01de32b9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Fri, 5 Dec 2025 01:44:26 +0100 -Subject: [PATCH 13/20] build/ci: Enable tests again - ---- - tests/meson.build | 26 +++++++++++++++----------- - tests/wall-clock.c | 3 +++ - 2 files changed, 18 insertions(+), 11 deletions(-) - -diff --git a/tests/meson.build b/tests/meson.build -index 6982c543..752d07cf 100644 ---- a/tests/meson.build -+++ b/tests/meson.build -@@ -11,30 +11,34 @@ test_env = [ - 'G_ENABLE_DIAGNOSTIC=0' - ] - --test_programs = [] -+test_programs = {} - test_metas = [] - - # XXX: The current batch of tests relies on the legacy library - if get_option('legacy_library') -- test_programs += [ -- 'bg-slide-show', -- 'wall-clock', -- 'wallclock-reftest', -- 'languages' -- ] -+ test_programs += { -+ 'bg-slide-show': {'local-test': false}, -+ 'wall-clock': {}, -+ 'languages': {}, -+ } - - test_metas += [] - endif - --foreach program: test_programs -- exe = executable(program, program + '.c', -+foreach program, options: test_programs -+ installed = get_option('installed_tests') and options.get('installed', true) -+ test_exe = executable(program, program + '.c', - dependencies: libgnome_desktop_dep, - c_args: test_args, - install_dir: test_execdir, -- install: get_option('installed_tests') -+ install: installed - ) - -- if get_option('installed_tests') -+ if options.get('local-test', true) -+ test(program, test_exe, env: test_env) -+ endif -+ -+ if installed - meta_data = configuration_data() - meta_data.set('TEST_EXEC', join_paths(test_execdir, program)) - -diff --git a/tests/wall-clock.c b/tests/wall-clock.c -index 44bc93bb..b0f47107 100644 ---- a/tests/wall-clock.c -+++ b/tests/wall-clock.c -@@ -96,6 +96,9 @@ test_colon_vs_ratio (void) - static void - test_space_vs_en_space (void) - { -+ g_test_skip ("FIXME: This test is failing"); -+ return; -+ - test_utf8_character (EN_SPACE, SPACE); - } - --- -2.52.0 - - -From 1c3fa0595643f865c4b4d777a4eb8e05fcf51376 Mon Sep 17 00:00:00 2001 +From 870e6f82a98e7245f36b63f6f4fd417902321c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 03:08:20 +0100 -Subject: [PATCH 14/20] gnome-qr: Do not create unnecessarily big array +Subject: [PATCH 11/23] gnome-qr: Do not create unnecessarily big array We were multiplying the total pixel size twice Also re-order the for logic to be clearer + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) @@ -1328,16 +1247,18 @@ index 50860bee..0c597e6a 100644 fill_block (qr_matrix, fg_color, format, block_size); else -- -2.52.0 +2.53.0 -From f86b6221970984bb18f734b6fe008dd2ccf9be65 Mon Sep 17 00:00:00 2001 +From e78bf352a7139d2149fa26d88b6bca9160da8d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 03:09:19 +0100 -Subject: [PATCH 15/20] gnome-qr: Do not access to potentially temporary data +Subject: [PATCH 12/23] gnome-qr: Do not access to potentially temporary data The colors needs to be statically saved or we may read from temporary values + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) @@ -1369,18 +1290,20 @@ index 0c597e6a..3fbea659 100644 qr_size = qrcodegen_getSize (qr_code); g_assert (qr_size > 0); -- -2.52.0 +2.53.0 -From 9867e68039c0d72120ef9ace502a42e6f50dbc6e Mon Sep 17 00:00:00 2001 +From 7eb3e625b01aa0abce30a157af9b2032286e3f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 03:10:02 +0100 -Subject: [PATCH 16/20] gnome-qr: Accept a 0-sized qr-code +Subject: [PATCH 13/23] gnome-qr: Accept a 0-sized qr-code It will be just the minimal size that is required for this. UIs can then just stretch it using more optimized rendering, without wasting memory + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 2 -- 1 file changed, 2 deletions(-) @@ -1406,637 +1329,24 @@ index 3fbea659..936b43a7 100644 if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { g_return_if_fail (!bg_color || bg_color->alpha == 255); -- -2.52.0 +2.53.0 -From 72ce693100d638964ffdf9532fd5dbbab6e7e039 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Fri, 5 Dec 2025 03:11:49 +0100 -Subject: [PATCH 17/20] tests: Add basic qr-code tests - ---- - libgnome-desktop/gnome-qr/meson.build | 7 + - meson.build | 2 +- - tests/meson.build | 11 +- - tests/qr-code.c | 535 ++++++++++++++++++++++++++ - 4 files changed, 553 insertions(+), 2 deletions(-) - create mode 100644 tests/qr-code.c - -diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build -index 5a9a2cea..63b5de03 100644 ---- a/libgnome-desktop/gnome-qr/meson.build -+++ b/libgnome-desktop/gnome-qr/meson.build -@@ -39,3 +39,10 @@ pkg.generate( - description: 'QR code utility library for GNOME desktop components', - subdirs: 'gnome-desktop-4.0', - ) -+ -+gnome_qr_dep = declare_dependency( -+ include_directories: [ -+ include_directories('.'), -+ ], -+ link_with: libgnome_qr, -+) -diff --git a/meson.build b/meson.build -index a4876a84..4f0e11a2 100644 ---- a/meson.build -+++ b/meson.build -@@ -1,5 +1,5 @@ - project('gnome-desktop', 'c', -- meson_version: '>= 0.56.2', -+ meson_version: '>= 0.60.0', - version: '44.1', - license: ['GPL-2.0-or-later', 'LGPL-2.1-or-later'], - default_options: [ -diff --git a/tests/meson.build b/tests/meson.build -index 752d07cf..63e15e4c 100644 ---- a/tests/meson.build -+++ b/tests/meson.build -@@ -25,10 +25,18 @@ if get_option('legacy_library') - test_metas += [] - endif - -+if get_option('build_gtk4') -+ test_programs += { -+ 'qr-code': { -+ 'dependencies': gnome_qr_dep, -+ }, -+ } -+endif -+ - foreach program, options: test_programs - installed = get_option('installed_tests') and options.get('installed', true) - test_exe = executable(program, program + '.c', -- dependencies: libgnome_desktop_dep, -+ dependencies: [libgnome_desktop_dep] + options.get('dependencies', []), - c_args: test_args, - install_dir: test_execdir, - install: installed -@@ -68,4 +76,5 @@ if get_option('installed_tests') - ) - install_data(test_data, install_dir: test_execdir) - install_data(test_metas, install_dir: test_metadir) -+ install_subdir('data', install_dir: test_execdir) - endif -diff --git a/tests/qr-code.c b/tests/qr-code.c -new file mode 100644 -index 00000000..80c121ad ---- /dev/null -+++ b/tests/qr-code.c -@@ -0,0 +1,535 @@ -+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ -+/* -+ * Copyright 2025 Canonical Ltd -+ * -+ * SPDX-License-Identifier: LGPL-2.1-or-later -+ * -+ * This library is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU Lesser General Public -+ * License as published by the Free Software Foundation; either -+ * version 2.1 of the License, or (at your option) any later version. -+ * -+ * This library is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ * Lesser General Public License for more details. -+ * -+ * You should have received a copy of the GNU Lesser General -+ * Public License along with this library; if not, see . -+ * -+ * Author: Marco Trevisan -+ */ -+ -+#include "gnome-qr/gnome-qr.h" -+ -+ -+/* FIXME: Ideally we want to check against visible PNGs so that we can verify -+ * the actual rendering, but for now we just compare the raw data because -+ * GNOME OS image in CI does not seem to provide a proper png decoder. -+ */ -+static void -+assert_qr_matches_reference (GBytes *qr_code, -+ const char *reference_file, -+ GnomeQrPixelFormat format) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autofree guint8 *data = NULL; -+ gsize size; -+ -+#ifdef UPDATE_REFERENCE_DATA -+ g_file_set_contents (reference_file, -+ (const gchar *)g_bytes_get_data (qr_code, NULL), -+ g_bytes_get_size (qr_code), &error); -+ g_assert_no_error (error); -+#endif -+ -+ g_file_get_contents (reference_file, -+ (gchar **) &data, -+ &size, -+ &error); -+ g_assert_no_error (error); -+ -+ g_assert_cmpmem (g_bytes_get_data (qr_code, NULL), -+ g_bytes_get_size (qr_code), -+ data, -+ size); -+} -+ -+static void -+test_gnome_qr_sync_generate_simple_rgb_888 (void) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autoptr (GBytes) qr_code = NULL; -+ size_t pixel_size; -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ NULL, &error); -+ g_assert_nonnull (qr_code); -+ g_assert_no_error (error); -+ -+ assert_qr_matches_reference (qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-gnome.org-0-rgb.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGB_888); -+} -+ -+static void -+test_gnome_qr_sync_generate_simple_rgba_8888 (void) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autoptr (GBytes) qr_code = NULL; -+ size_t pixel_size; -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_LOW, -+ &pixel_size, -+ NULL, &error); -+ g_assert_nonnull (qr_code); -+ g_assert_no_error (error); -+ -+ assert_qr_matches_reference (qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-gnome.org-0-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+} -+ -+typedef struct { -+ GMainLoop *loop; -+ GBytes *qr_code; -+ size_t pixel_size; -+ GError *error; -+} AsyncData; -+ -+static void -+on_qr_code_generated (GObject *source, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ AsyncData *data = user_data; -+ -+ data->qr_code = gnome_qr_generate_qr_code_finish (result, -+ &data->pixel_size, -+ &data->error); -+ g_main_loop_quit (data->loop); -+} -+ -+static void -+test_gnome_qr_async_generate_simple_rgb_888 (void) -+{ -+ AsyncData data = { 0 }; -+ data.loop = g_main_loop_new (NULL, FALSE); -+ -+ gnome_qr_generate_qr_code_async ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ NULL, -+ on_qr_code_generated, -+ &data); -+ -+ g_main_loop_run (data.loop); -+ g_main_loop_unref (data.loop); -+ -+ g_assert_nonnull (data.qr_code); -+ g_assert_no_error (data.error); -+ -+ assert_qr_matches_reference (data.qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-gnome.org-0-rgb.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGB_888); -+ -+ g_bytes_unref (data.qr_code); -+} -+ -+static void -+test_gnome_qr_async_generate_simple_rgba_8888 (void) -+{ -+ AsyncData data = { 0 }; -+ data.loop = g_main_loop_new (NULL, FALSE); -+ -+ gnome_qr_generate_qr_code_async ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_LOW, -+ NULL, -+ on_qr_code_generated, -+ &data); -+ -+ g_main_loop_run (data.loop); -+ g_main_loop_unref (data.loop); -+ -+ g_assert_nonnull (data.qr_code); -+ g_assert_no_error (data.error); -+ -+ assert_qr_matches_reference (data.qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-gnome.org-0-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+ -+ g_bytes_unref (data.qr_code); -+} -+ -+static void -+test_gnome_qr_sync_generate_custom_colors_fedora (void) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autoptr (GBytes) qr_code = NULL; -+ GnomeQrColor bg_color = { 60, 110, 180, 255 }; /* Fedora blue */ -+ GnomeQrColor fg_color = { 255, 255, 255, 125 }; /* White with transparency */ -+ size_t pixel_size; -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://fedoraproject.org", -+ 256, &bg_color, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_MEDIUM, -+ &pixel_size, -+ NULL, &error); -+ g_assert_nonnull (qr_code); -+ g_assert_no_error (error); -+ -+ assert_qr_matches_reference (qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-fedoraproject.org-256-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+} -+ -+static void -+test_gnome_qr_sync_generate_custom_colors_ubuntu (void) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autoptr (GBytes) qr_code = NULL; -+ GnomeQrColor bg_color = { 0, 0, 0, 200 }; /* Black with transparency */ -+ GnomeQrColor fg_color = { 233, 84, 32, 255 }; /* Ubuntu orange */ -+ size_t pixel_size; -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://ubuntu.com", -+ 256, &bg_color, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_QUARTILE, -+ &pixel_size, -+ NULL, &error); -+ g_assert_nonnull (qr_code); -+ g_assert_no_error (error); -+ -+ assert_qr_matches_reference (qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-ubuntu.com-256-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+} -+ -+static void -+test_gnome_qr_async_generate_custom_colors_fedora (void) -+{ -+ AsyncData data = { 0 }; -+ GnomeQrColor bg_color = { 60, 110, 180, 255 }; /* Fedora blue */ -+ GnomeQrColor fg_color = { 255, 255, 255, 125 }; /* White with transparency */ -+ -+ data.loop = g_main_loop_new (NULL, FALSE); -+ -+ gnome_qr_generate_qr_code_async ("https://fedoraproject.org", -+ 256, &bg_color, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_MEDIUM, -+ NULL, -+ on_qr_code_generated, -+ &data); -+ -+ g_main_loop_run (data.loop); -+ g_main_loop_unref (data.loop); -+ -+ g_assert_nonnull (data.qr_code); -+ g_assert_no_error (data.error); -+ -+ assert_qr_matches_reference (data.qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-fedoraproject.org-256-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+ -+ g_bytes_unref (data.qr_code); -+} -+ -+static void -+test_gnome_qr_async_generate_custom_colors_ubuntu (void) -+{ -+ AsyncData data = { 0 }; -+ GnomeQrColor bg_color = { 0, 0, 0, 200 }; /* Black with transparency */ -+ GnomeQrColor fg_color = { 233, 84, 32, 255 }; /* Ubuntu orange */ -+ -+ data.loop = g_main_loop_new (NULL, FALSE); -+ -+ gnome_qr_generate_qr_code_async ("https://ubuntu.com", -+ 256, &bg_color, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888, -+ GNOME_QR_ECC_LEVEL_QUARTILE, -+ NULL, -+ on_qr_code_generated, -+ &data); -+ -+ g_main_loop_run (data.loop); -+ g_main_loop_unref (data.loop); -+ -+ g_assert_nonnull (data.qr_code); -+ g_assert_no_error (data.error); -+ -+ assert_qr_matches_reference (data.qr_code, -+ g_test_get_filename (G_TEST_DIST, -+ "data", -+ "qr-ubuntu.com-256-rgba.data", -+ NULL), -+ GNOME_QR_PIXEL_FORMAT_RGBA_8888); -+ -+ g_bytes_unref (data.qr_code); -+} -+ -+static void -+test_gnome_qr_sync_generate_cancelled (void) -+{ -+ g_autoptr (GError) error = NULL; -+ g_autoptr (GCancellable) cancellable = NULL; -+ g_autoptr (GBytes) qr_code = NULL; -+ size_t pixel_size; -+ -+ cancellable = g_cancellable_new (); -+ g_cancellable_cancel (cancellable); -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ cancellable, &error); -+ -+ g_assert_null (qr_code); -+ g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); -+} -+ -+static void -+test_gnome_qr_async_generate_cancelled (void) -+{ -+ AsyncData data = { 0 }; -+ g_autoptr (GCancellable) cancellable = NULL; -+ -+ data.loop = g_main_loop_new (NULL, FALSE); -+ cancellable = g_cancellable_new (); -+ -+ gnome_qr_generate_qr_code_async ("https://gnome.org", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ cancellable, -+ on_qr_code_generated, -+ &data); -+ -+ g_cancellable_cancel (cancellable); -+ -+ g_main_loop_run (data.loop); -+ g_main_loop_unref (data.loop); -+ -+ g_assert_null (data.qr_code); -+ g_assert_error (data.error, G_IO_ERROR, G_IO_ERROR_CANCELLED); -+ -+ g_error_free (data.error); -+} -+ -+static void -+test_gnome_qr_sync_generate_null_text (void) -+{ -+ g_autoptr (GBytes) qr_code = NULL; -+ size_t pixel_size; -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*text != NULL*"); -+ -+ qr_code = gnome_qr_generate_qr_code_sync (NULL, -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ NULL, NULL); -+ -+ g_test_assert_expected_messages (); -+ g_assert_null (qr_code); -+} -+ -+static void -+test_gnome_qr_sync_generate_empty_text (void) -+{ -+ g_autoptr (GBytes) qr_code = NULL; -+ size_t pixel_size; -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "**text != '\\0'*"); -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ NULL, NULL); -+ -+ g_test_assert_expected_messages (); -+ g_assert_null (qr_code); -+} -+ -+static void -+test_gnome_qr_sync_generate_rgb_with_transparent_bg (void) -+{ -+ g_autoptr (GBytes) qr_code = NULL; -+ GnomeQrColor bg_color = { 255, 255, 255, 200 }; /* transparent white */ -+ size_t pixel_size; -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*!bg_color || bg_color->alpha == 255*"); -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://gnome.org", -+ 0, &bg_color, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ NULL, NULL); -+ -+ g_test_assert_expected_messages (); -+ g_assert_null (qr_code); -+} -+ -+static void -+test_gnome_qr_sync_generate_rgb_with_transparent_fg (void) -+{ -+ g_autoptr (GBytes) qr_code = NULL; -+ GnomeQrColor fg_color = { 0, 0, 0, 200 }; /* transparent black */ -+ size_t pixel_size; -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*!fg_color || fg_color->alpha == 255*"); -+ -+ qr_code = gnome_qr_generate_qr_code_sync ("https://gnome.org", -+ 0, NULL, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ &pixel_size, -+ NULL, NULL); -+ -+ g_test_assert_expected_messages (); -+ g_assert_null (qr_code); -+} -+ -+static void -+test_gnome_qr_async_generate_null_text (void) -+{ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*text != NULL*"); -+ -+ gnome_qr_generate_qr_code_async (NULL, -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ NULL, -+ NULL, -+ NULL); -+ -+ g_test_assert_expected_messages (); -+} -+ -+static void -+test_gnome_qr_async_generate_empty_text (void) -+{ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "**text != '\\0'*"); -+ -+ gnome_qr_generate_qr_code_async ("", -+ 0, NULL, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ NULL, -+ NULL, -+ NULL); -+ -+ g_test_assert_expected_messages (); -+} -+ -+static void -+test_gnome_qr_async_generate_rgb_with_transparent_bg (void) -+{ -+ GnomeQrColor bg_color = { 255, 255, 255, 200 }; /* transparent white */ -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*!bg_color || bg_color->alpha == 255*"); -+ -+ gnome_qr_generate_qr_code_async ("https://gnome.org", -+ 0, &bg_color, NULL, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ NULL, -+ NULL, -+ NULL); -+ -+ g_test_assert_expected_messages (); -+} -+ -+static void -+test_gnome_qr_async_generate_rgb_with_transparent_fg (void) -+{ -+ GnomeQrColor fg_color = { 0, 0, 0, 200 }; /* transparent black */ -+ -+ g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, -+ "*!fg_color || fg_color->alpha == 255*"); -+ -+ gnome_qr_generate_qr_code_async ("https://gnome.org", -+ 0, NULL, &fg_color, -+ GNOME_QR_PIXEL_FORMAT_RGB_888, -+ GNOME_QR_ECC_LEVEL_HIGH, -+ NULL, -+ NULL, -+ NULL); -+ -+ g_test_assert_expected_messages (); -+} -+ -+int -+main (int argc, -+ char *argv[]) -+{ -+ g_setenv ("LC_ALL", "C", TRUE); -+ g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); -+ -+ g_test_add_func ("/gnome-qr/sync/generate-simple-rgb-888", test_gnome_qr_sync_generate_simple_rgb_888); -+ g_test_add_func ("/gnome-qr/sync/generate-simple-rgba-8888", test_gnome_qr_sync_generate_simple_rgba_8888); -+ g_test_add_func ("/gnome-qr/sync/generate-custom-colors-fedora", test_gnome_qr_sync_generate_custom_colors_fedora); -+ g_test_add_func ("/gnome-qr/sync/generate-custom-colors-ubuntu", test_gnome_qr_sync_generate_custom_colors_ubuntu); -+ g_test_add_func ("/gnome-qr/sync/generate-cancelled", test_gnome_qr_sync_generate_cancelled); -+ g_test_add_func ("/gnome-qr/sync/generate-null-text", test_gnome_qr_sync_generate_null_text); -+ g_test_add_func ("/gnome-qr/sync/generate-empty-text", test_gnome_qr_sync_generate_empty_text); -+ g_test_add_func ("/gnome-qr/sync/generate-rgb-with-transparent-bg", test_gnome_qr_sync_generate_rgb_with_transparent_bg); -+ g_test_add_func ("/gnome-qr/sync/generate-rgb-with-transparent-fg", test_gnome_qr_sync_generate_rgb_with_transparent_fg); -+ g_test_add_func ("/gnome-qr/async/generate-simple-rgb-888", test_gnome_qr_async_generate_simple_rgb_888); -+ g_test_add_func ("/gnome-qr/async/generate-simple-rgba-8888", test_gnome_qr_async_generate_simple_rgba_8888); -+ g_test_add_func ("/gnome-qr/async/generate-custom-colors-fedora", test_gnome_qr_async_generate_custom_colors_fedora); -+ g_test_add_func ("/gnome-qr/async/generate-custom-colors-ubuntu", test_gnome_qr_async_generate_custom_colors_ubuntu); -+ g_test_add_func ("/gnome-qr/async/generate-cancelled", test_gnome_qr_async_generate_cancelled); -+ g_test_add_func ("/gnome-qr/async/generate-null-text", test_gnome_qr_async_generate_null_text); -+ g_test_add_func ("/gnome-qr/async/generate-empty-text", test_gnome_qr_async_generate_empty_text); -+ g_test_add_func ("/gnome-qr/async/generate-rgb-with-transparent-bg", test_gnome_qr_async_generate_rgb_with_transparent_bg); -+ g_test_add_func ("/gnome-qr/async/generate-rgb-with-transparent-fg", test_gnome_qr_async_generate_rgb_with_transparent_fg); -+ -+ return g_test_run (); -+} --- -2.52.0 - - -From 30e213d6c2fe867a35e8d2ede4954e97c9ae8f3a Mon Sep 17 00:00:00 2001 +From 8c82fba2d6731b90ec13fcc531724ce12bc14387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 06:11:42 +0100 -Subject: [PATCH 18/20] gnome-qr: Ensure that the final size is at least the +Subject: [PATCH 14/23] gnome-qr: Ensure that the final size is at least the requested one Each block can be wider if the space needed does not fit the requested space + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 3 ++- libgnome-desktop/gnome-qr/meson.build | 1 + meson.build | 2 +- - tests/qr-code.c | 6 ++++++ - 4 files changed, 10 insertions(+), 2 deletions(-) + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c index 936b43a7..e18c04a9 100644 @@ -2060,7 +1370,7 @@ index 936b43a7..e18c04a9 100644 qr_matrix = g_byte_array_sized_new (total_size * total_size * diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build -index 63b5de03..c0679b31 100644 +index 31091b32..c9a72dd7 100644 --- a/libgnome-desktop/gnome-qr/meson.build +++ b/libgnome-desktop/gnome-qr/meson.build @@ -2,6 +2,7 @@ libgnome_qr_deps = [ @@ -2072,10 +1382,10 @@ index 63b5de03..c0679b31 100644 libgnome_qr_sources = files([ diff --git a/meson.build b/meson.build -index 4f0e11a2..0fb515d7 100644 +index 515e1dc7..f174d699 100644 --- a/meson.build +++ b/meson.build -@@ -84,7 +84,7 @@ iso_codes_prefix = iso_codes_dep.get_variable(pkgconfig: 'prefix') +@@ -92,7 +92,7 @@ iso_codes_prefix = iso_codes_dep.get_variable(pkgconfig: 'prefix') cc = meson.get_compiler('c') @@ -2084,122 +1394,78 @@ index 4f0e11a2..0fb515d7 100644 rt_dep = cc.find_library('rt', required: false) if not cc.has_function('clock_gettime', dependencies: rt_dep) -diff --git a/tests/qr-code.c b/tests/qr-code.c -index 80c121ad..b3659f7b 100644 ---- a/tests/qr-code.c -+++ b/tests/qr-code.c -@@ -142,6 +142,7 @@ test_gnome_qr_async_generate_simple_rgb_888 (void) - - g_assert_nonnull (data.qr_code); - g_assert_no_error (data.error); -+ g_assert_cmpuint (data.pixel_size, >, 0); - - assert_qr_matches_reference (data.qr_code, - g_test_get_filename (G_TEST_DIST, -@@ -172,6 +173,7 @@ test_gnome_qr_async_generate_simple_rgba_8888 (void) - - g_assert_nonnull (data.qr_code); - g_assert_no_error (data.error); -+ g_assert_cmpuint (data.pixel_size, >, 0); - - assert_qr_matches_reference (data.qr_code, - g_test_get_filename (G_TEST_DIST, -@@ -200,6 +202,7 @@ test_gnome_qr_sync_generate_custom_colors_fedora (void) - NULL, &error); - g_assert_nonnull (qr_code); - g_assert_no_error (error); -+ g_assert_cmpuint (pixel_size, >=, 256); - - assert_qr_matches_reference (qr_code, - g_test_get_filename (G_TEST_DIST, -@@ -226,6 +229,7 @@ test_gnome_qr_sync_generate_custom_colors_ubuntu (void) - NULL, &error); - g_assert_nonnull (qr_code); - g_assert_no_error (error); -+ g_assert_cmpuint (pixel_size, >=, 256); - - assert_qr_matches_reference (qr_code, - g_test_get_filename (G_TEST_DIST, -@@ -257,6 +261,7 @@ test_gnome_qr_async_generate_custom_colors_fedora (void) - - g_assert_nonnull (data.qr_code); - g_assert_no_error (data.error); -+ g_assert_cmpuint (data.pixel_size, >=, 256); - - assert_qr_matches_reference (data.qr_code, - g_test_get_filename (G_TEST_DIST, -@@ -290,6 +295,7 @@ test_gnome_qr_async_generate_custom_colors_ubuntu (void) - - g_assert_nonnull (data.qr_code); - g_assert_no_error (data.error); -+ g_assert_cmpuint (data.pixel_size, >=, 256); - - assert_qr_matches_reference (data.qr_code, - g_test_get_filename (G_TEST_DIST, -- -2.52.0 +2.53.0 -From a54256a35f841118bcc67e4b21107642361533ee Mon Sep 17 00:00:00 2001 +From 118a5c38511010084b2a5afc4002c9d73f3e3c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 06:41:02 +0100 -Subject: [PATCH 19/20] gnome-qr: Add introspection support +Subject: [PATCH 15/23] gnome-qr: Add introspection support We definitely need introspection to be able to use this in the shell and anywhere else + +Part-of: --- - libgnome-desktop/gnome-qr/meson.build | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) + libgnome-desktop/gnome-qr/meson.build | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build -index c0679b31..3f4c461f 100644 +index c9a72dd7..2cd659e5 100644 --- a/libgnome-desktop/gnome-qr/meson.build +++ b/libgnome-desktop/gnome-qr/meson.build -@@ -31,6 +31,23 @@ libgnome_qr = library('gnome-qr', +@@ -41,6 +41,22 @@ libgnome_qr = library('gnome-qr', ], ) ++libgnome_qr_gir = [] +if get_option('introspection') -+ libgnome_qr_gir = gnome.generate_gir(libgnome_qr, ++ libgnome_qr_gir += gnome.generate_gir(libgnome_qr, + sources: [libgnome_qr_headers, libgnome_qr_sources], + export_packages: 'gnome-qr-4', + namespace: 'GnomeQR', + nsversion: '4.0', + identifier_prefix: 'GnomeQr', + symbol_prefix: 'gnome_qr', -+ includes: [libgnome_desktop_base_gir[0], 'Gio-2.0', 'GLib-2.0'], ++ includes: ['Gio-2.0', 'GLib-2.0'], + extra_args: ['--quiet', '--warn-all'], + fatal_warnings: true, + install: true, + ) -+else -+ libgnome_qr_gir = '' +endif + pkg.generate( libgnome_qr, - requires: ['gsettings-desktop-schemas'], -@@ -42,6 +59,9 @@ pkg.generate( + requires: ['gio-2.0'], +@@ -50,3 +66,14 @@ pkg.generate( + description: 'QR code utility library for GNOME desktop components', + subdirs: 'gnome-desktop-4.0', ) - - gnome_qr_dep = declare_dependency( ++ ++gnome_qr_dep = declare_dependency( ++ dependencies: libgnome_qr_deps, + sources: [ + libgnome_qr_gir, + ], - include_directories: [ - include_directories('.'), - ], ++ include_directories: [ ++ include_directories('..'), ++ ], ++ link_with: libgnome_qr, ++) -- -2.52.0 +2.53.0 -From 1a9e34f2b13bbb51541e137a4091f22299555c11 Mon Sep 17 00:00:00 2001 +From bdffa20f7c32fd789a3e729d4a05fd3d2fca5609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 5 Dec 2025 08:03:39 +0100 -Subject: [PATCH 20/20] gnome-qr: Update license to GPL-3+ +Subject: [PATCH 16/23] gnome-qr: Update license to GPL-3+ Part of this code was already licensed as GPL3+, so let's just use this version and adjust the copyright holders + +Part-of: --- libgnome-desktop/gnome-qr/gnome-qr.c | 24 +++++++++++++----------- libgnome-desktop/gnome-qr/gnome-qr.h | 24 +++++++++++++----------- @@ -2290,5 +1556,460 @@ index d7dbf52a..955ebf3b 100644 * Joan Torres Lopez */ -- -2.52.0 +2.53.0 + + +From 9d69fbbbdf37e21fead7bf6fadf2742177b4d701 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Tue, 9 Dec 2025 18:19:38 +0100 +Subject: [PATCH 17/23] gnome-qr: Make pixel_out_size mandatory + +The caller must rely on the actual generated size instead of the requested one. + +It's already documented that the returned size may not match the requested +one. + +It's responsibility of the caller to check the returned size and act +accordingly. + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c +index b2a34b13..51f718e9 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.c ++++ b/libgnome-desktop/gnome-qr/gnome-qr.c +@@ -90,16 +90,17 @@ fill_block (GByteArray *array, + * gnome_qr_generate_qr_code_sync: + * @text: the text of which generate the QR code + * @requested_size: The requested size (width and height) in pixels of the QR code. +- * Only square QR codes are supported. ++ * Only square QR codes are supported. If the requested size is smaller than ++ * the minimum required size for the QR code, it will be generated with 1 pixel ++ * per block. + * @bg_color: (nullable): The background color of the code + * or %NULL to use default (white) + * @fg_color: (nullable): The foreground color of the code + * or %NULL to use default (black) + * @format: The pixel format for the output image data + * @ecc: The error correction level +- * @pixel_size_out: (out) (optional): The square QR code size +- * (width and height) in pixels, or %NULL. +- * Note that it may not match @requested_size. ++ * @pixel_size_out: (out): The actual square QR code size (width and height) ++ * in pixels. Note that it may not match @requested_size. + * @cancellable: (nullable): A #GCancellable to cancel the operation + * @error: #GError for error reporting + * +@@ -128,6 +129,7 @@ gnome_qr_generate_qr_code_sync (const char *text, + + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (*text != '\0', NULL); ++ g_return_val_if_fail (pixel_size_out != NULL, NULL); + + if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { + g_return_val_if_fail (!bg_color || bg_color->alpha == 255, NULL); +@@ -185,8 +187,7 @@ gnome_qr_generate_qr_code_sync (const char *text, + return NULL; + } + +- if (pixel_size_out) +- *pixel_size_out = total_size; ++ *pixel_size_out = total_size; + + return g_byte_array_free_to_bytes (g_steal_pointer (&qr_matrix)); + } +@@ -280,9 +281,8 @@ gnome_qr_generate_qr_code_async (const char *text, + /** + * gnome_qr_generate_qr_code_finish: + * @result: the #GAsyncResult that was provided to the callback +- * @pixel_size_out: (out) (optional): The square QR code size +- * (width and height) in pixels, or %NULL. +- * Note that it may not match the @requested_size in ++ * @pixel_size_out: (out): The actual square QR code size (width and height) ++ * in pixels. Note that it may not match the @requested_size in + * gnome_qr_generate_qr_code_async(). + * @error: #GError for error reporting + * +@@ -303,14 +303,14 @@ gnome_qr_generate_qr_code_finish (GAsyncResult *result, + g_return_val_if_fail (g_async_result_is_tagged (result, + gnome_qr_generate_qr_code_async), + NULL); ++ g_return_val_if_fail (pixel_size_out != NULL, NULL); + + pixel_data = g_task_propagate_pointer (G_TASK (result), error); + if (!pixel_data) + return NULL; + + data = g_task_get_task_data (G_TASK (result)); +- if (pixel_size_out) +- *pixel_size_out = data->pixel_size; ++ *pixel_size_out = data->pixel_size; + + return g_steal_pointer (&pixel_data); + } +-- +2.53.0 + + +From 2d79cb24634ab5ff65b823b3f6f98186b69fa382 Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Tue, 9 Dec 2025 18:26:00 +0100 +Subject: [PATCH 18/23] gnome-qr: Add missing -4 suffix to library name + +This is a library that will only be built when 'build_gtk4' option. + +The same is done for gnome-bg library. This follows the same naming convention. + +Part-of: +--- + libgnome-desktop/gnome-qr/meson.build | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libgnome-desktop/gnome-qr/meson.build b/libgnome-desktop/gnome-qr/meson.build +index 2cd659e5..8c5826fe 100644 +--- a/libgnome-desktop/gnome-qr/meson.build ++++ b/libgnome-desktop/gnome-qr/meson.build +@@ -26,7 +26,7 @@ if cc.has_link_argument(gnome_qr_symbol_map_arg) + gnome_qr_ld_flags += gnome_qr_symbol_map_arg + endif + +-libgnome_qr = library('gnome-qr', ++libgnome_qr = library('gnome-qr-4', + sources: libgnome_qr_sources, + dependencies: libgnome_qr_deps, + soversion: qr_soversion, +-- +2.53.0 + + +From d60e8aa66021b3267c171bcd157877a63a4ccbf7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 5 Feb 2026 16:16:08 +0100 +Subject: [PATCH 19/23] gnome-qr: Register enums as gtype enumeration values + +It's better for bindings and to use these values as properties + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr.c | 10 ++++++++++ + libgnome-desktop/gnome-qr/gnome-qr.h | 4 ++++ + 2 files changed, 14 insertions(+) + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c +index 51f718e9..d14ea51f 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.c ++++ b/libgnome-desktop/gnome-qr/gnome-qr.c +@@ -32,6 +32,16 @@ + #include + #include + ++G_DEFINE_ENUM_TYPE (GnomeQrEccLevel, gnome_qr_ecc_level, ++ G_DEFINE_ENUM_VALUE (GNOME_QR_ECC_LEVEL_LOW, "low"), ++ G_DEFINE_ENUM_VALUE (GNOME_QR_ECC_LEVEL_MEDIUM, "medium"), ++ G_DEFINE_ENUM_VALUE (GNOME_QR_ECC_LEVEL_QUARTILE, "quartile"), ++ G_DEFINE_ENUM_VALUE (GNOME_QR_ECC_LEVEL_HIGH, "high")) ++ ++G_DEFINE_ENUM_TYPE (GnomeQrPixelFormat, gnome_qr_pixel_format, ++ G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_RGB_888, "rgb-888"), ++ G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_RGBA_8888, "rgba-8888")) ++ + typedef struct + { + char *text; +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.h b/libgnome-desktop/gnome-qr/gnome-qr.h +index 955ebf3b..337ad457 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.h ++++ b/libgnome-desktop/gnome-qr/gnome-qr.h +@@ -102,6 +102,10 @@ typedef struct { + guint8 alpha; + } GnomeQrColor; + ++GType gnome_qr_ecc_level_get_type (void); ++ ++GType gnome_qr_pixel_format_get_type (void); ++ + GBytes * gnome_qr_generate_qr_code_sync (const char *text, + size_t requested_size, + const GnomeQrColor *bg_color, +-- +2.53.0 + + +From 376914b7409a44032b51a741ed099acb7fd9b928 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 5 Feb 2026 16:17:48 +0100 +Subject: [PATCH 20/23] gnome-qr: Uniform description for requested size + +We use the same for both sync and async case + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c +index d14ea51f..874b1f87 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.c ++++ b/libgnome-desktop/gnome-qr/gnome-qr.c +@@ -234,7 +234,9 @@ generate_qr_code_in_thread (GTask *task, + * gnome_qr_generate_qr_code_async: + * @text: The text of which generate the QR code + * @requested_size: The requested size (width and height) in pixels of the QR code. +- * Only square QR codes are supported. ++ * Only square QR codes are supported. If the requested size is smaller than ++ * the minimum required size for the QR code, it will be generated with 1 pixel ++ * per block. + * @bg_color: (nullable): The background color of the code + * or %NULL to use default (white) + * @fg_color: (nullable): The foreground color of the code +-- +2.53.0 + + +From 87058163f313465aaee30b5e45bd58e92d6b0626 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 5 Feb 2026 21:10:19 +0100 +Subject: [PATCH 21/23] gnome-qr: Simplify the color for pixel format check + +So we can just use a simpler check and replicate in both functions + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr.c | 28 ++++++++++++++++++---------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c +index 874b1f87..6c57ad91 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.c ++++ b/libgnome-desktop/gnome-qr/gnome-qr.c +@@ -96,6 +96,20 @@ fill_block (GByteArray *array, + } + } + ++G_ALWAYS_INLINE static inline gboolean ++check_color_validity (const GnomeQrColor *color, ++ GnomeQrPixelFormat format) ++{ ++ if (!color) ++ return TRUE; ++ ++ if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { ++ g_return_val_if_fail (color->alpha == 255, FALSE); ++ } ++ ++ return TRUE; ++} ++ + /** + * gnome_qr_generate_qr_code_sync: + * @text: the text of which generate the QR code +@@ -140,11 +154,8 @@ gnome_qr_generate_qr_code_sync (const char *text, + g_return_val_if_fail (text != NULL, NULL); + g_return_val_if_fail (*text != '\0', NULL); + g_return_val_if_fail (pixel_size_out != NULL, NULL); +- +- if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { +- g_return_val_if_fail (!bg_color || bg_color->alpha == 255, NULL); +- g_return_val_if_fail (!fg_color || fg_color->alpha == 255, NULL); +- } ++ g_return_val_if_fail (check_color_validity (bg_color, format), NULL); ++ g_return_val_if_fail (check_color_validity (fg_color, format), NULL); + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; +@@ -268,11 +279,8 @@ gnome_qr_generate_qr_code_async (const char *text, + + g_return_if_fail (text != NULL); + g_return_if_fail (*text != '\0'); +- +- if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { +- g_return_if_fail (!bg_color || bg_color->alpha == 255); +- g_return_if_fail (!fg_color || fg_color->alpha == 255); +- } ++ g_return_if_fail (check_color_validity (bg_color, format)); ++ g_return_if_fail (check_color_validity (fg_color, format)); + + data = g_new0 (GnomeQrCodeData, 1); + data->text = g_strdup (text); +-- +2.53.0 + + +From b5c5140626bcc993a69765379f887cc556f6e879 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 5 Feb 2026 21:30:43 +0100 +Subject: [PATCH 22/23] gnome-qr: Add definition for transparent color + +Part-of: +--- + docs/reference/gnome-desktop3/gnome-desktop3-sections.txt | 1 + + libgnome-desktop/gnome-qr/gnome-qr.h | 7 +++++++ + 2 files changed, 8 insertions(+) + +diff --git a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt +index 43260cc9..19f853c2 100644 +--- a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt ++++ b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt +@@ -223,6 +223,7 @@ GnomeQrColor + GNOME_QR_BYTES_PER_FORMAT + GNOME_QR_COLOR_WHITE + GNOME_QR_COLOR_BLACK ++GNOME_QR_COLOR_TRANSPARENT + gnome_qr_generate_qr_code_sync + gnome_qr_generate_qr_code_async + gnome_qr_generate_qr_code_finish +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.h b/libgnome-desktop/gnome-qr/gnome-qr.h +index 337ad457..61ec738c 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.h ++++ b/libgnome-desktop/gnome-qr/gnome-qr.h +@@ -42,6 +42,13 @@ + #define GNOME_QR_BYTES_PER_FORMAT(format) \ + ((format) == GNOME_QR_PIXEL_FORMAT_RGB_888 ? 3 : 4) + ++/** ++ * GNOME_QR_COLOR_TRANSPARENT: ++ * ++ * Predefined transparent color (0, 0, 0, 0). ++ */ ++#define GNOME_QR_COLOR_TRANSPARENT ((GnomeQrColor) { 0, 0, 0, 0 }) ++ + /** + * GNOME_QR_COLOR_WHITE: + * +-- +2.53.0 + + +From 0098df7e9107dd00f856d0e7adf9596499c0f584 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 5 Feb 2026 21:53:02 +0100 +Subject: [PATCH 23/23] gnome-qr: Add simpler pixel formats such as A8 and G8 + +They can be useful to keep optimize the texture to the maximum + +Part-of: +--- + libgnome-desktop/gnome-qr/gnome-qr.c | 49 ++++++++++++++++++++++++---- + libgnome-desktop/gnome-qr/gnome-qr.h | 6 +++- + 2 files changed, 48 insertions(+), 7 deletions(-) + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.c b/libgnome-desktop/gnome-qr/gnome-qr.c +index 6c57ad91..1ea2e1b3 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.c ++++ b/libgnome-desktop/gnome-qr/gnome-qr.c +@@ -39,6 +39,8 @@ G_DEFINE_ENUM_TYPE (GnomeQrEccLevel, gnome_qr_ecc_level, + G_DEFINE_ENUM_VALUE (GNOME_QR_ECC_LEVEL_HIGH, "high")) + + G_DEFINE_ENUM_TYPE (GnomeQrPixelFormat, gnome_qr_pixel_format, ++ G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_A_8, "a-8"), ++ G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_G_8, "g-8"), + G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_RGB_888, "rgb-888"), + G_DEFINE_ENUM_VALUE (GNOME_QR_PIXEL_FORMAT_RGBA_8888, "rgba-8888")) + +@@ -87,12 +89,29 @@ fill_block (GByteArray *array, + guint i; + + for (i = 0; i < block_size; i++) { +- g_byte_array_append (array, &color->red, 1); +- g_byte_array_append (array, &color->green, 1); +- g_byte_array_append (array, &color->blue, 1); +- +- if (format == GNOME_QR_PIXEL_FORMAT_RGBA_8888) ++ switch (format) { ++ case GNOME_QR_PIXEL_FORMAT_A_8: + g_byte_array_append (array, &color->alpha, 1); ++ break; ++ ++ case GNOME_QR_PIXEL_FORMAT_G_8: ++ /* Use the red channel, as we assert that all the ++ * values must be equal */ ++ g_byte_array_append (array, &color->red, 1); ++ break; ++ ++ case GNOME_QR_PIXEL_FORMAT_RGB_888: ++ case GNOME_QR_PIXEL_FORMAT_RGBA_8888: ++ g_byte_array_append (array, &color->red, 1); ++ g_byte_array_append (array, &color->green, 1); ++ g_byte_array_append (array, &color->blue, 1); ++ ++ if (format == GNOME_QR_PIXEL_FORMAT_RGBA_8888) ++ g_byte_array_append (array, &color->alpha, 1); ++ break; ++ default: ++ g_assert_not_reached (); ++ } + } + } + +@@ -103,8 +122,21 @@ check_color_validity (const GnomeQrColor *color, + if (!color) + return TRUE; + +- if (format == GNOME_QR_PIXEL_FORMAT_RGB_888) { ++ switch (format) { ++ case GNOME_QR_PIXEL_FORMAT_A_8: ++ case GNOME_QR_PIXEL_FORMAT_RGBA_8888: ++ break; ++ ++ case GNOME_QR_PIXEL_FORMAT_G_8: ++ g_return_val_if_fail (color->red == color->green && ++ color->red == color->blue, FALSE); ++ /* fallthrough */ ++ case GNOME_QR_PIXEL_FORMAT_RGB_888: + g_return_val_if_fail (color->alpha == 255, FALSE); ++ break; ++ ++ default: ++ g_assert_not_reached (); + } + + return TRUE; +@@ -148,6 +180,7 @@ gnome_qr_generate_qr_code_sync (const char *text, + uint8_t temp_buf[qrcodegen_BUFFER_LEN_FOR_VERSION (qrcodegen_VERSION_MAX)]; + static const GnomeQrColor default_bg_color = GNOME_QR_COLOR_WHITE; + static const GnomeQrColor default_fg_color = GNOME_QR_COLOR_BLACK; ++ static const GnomeQrColor transparent = GNOME_QR_COLOR_TRANSPARENT; + gint qr_size, block_size, total_size; + gint column, row, i; + +@@ -179,6 +212,10 @@ gnome_qr_generate_qr_code_sync (const char *text, + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return NULL; + ++ if (format == GNOME_QR_PIXEL_FORMAT_A_8 && !bg_color) { ++ bg_color = &transparent; ++ } ++ + if (!bg_color) + bg_color = &default_bg_color; + +diff --git a/libgnome-desktop/gnome-qr/gnome-qr.h b/libgnome-desktop/gnome-qr/gnome-qr.h +index 61ec738c..cb26ffb8 100644 +--- a/libgnome-desktop/gnome-qr/gnome-qr.h ++++ b/libgnome-desktop/gnome-qr/gnome-qr.h +@@ -40,7 +40,9 @@ + * Returns: the number of bytes + */ + #define GNOME_QR_BYTES_PER_FORMAT(format) \ +- ((format) == GNOME_QR_PIXEL_FORMAT_RGB_888 ? 3 : 4) ++ ((format) == GNOME_QR_PIXEL_FORMAT_A_8 ? 1 : \ ++ ((format) == GNOME_QR_PIXEL_FORMAT_G_8 ? 1 : \ ++ (format) == GNOME_QR_PIXEL_FORMAT_RGB_888 ? 3 : 4)) + + /** + * GNOME_QR_COLOR_TRANSPARENT: +@@ -88,6 +90,8 @@ typedef enum { + * Pixel formats for the generated QR code image data. + */ + typedef enum { ++ GNOME_QR_PIXEL_FORMAT_A_8, ++ GNOME_QR_PIXEL_FORMAT_G_8, + GNOME_QR_PIXEL_FORMAT_RGB_888, + GNOME_QR_PIXEL_FORMAT_RGBA_8888, + } GnomeQrPixelFormat; +-- +2.53.0 diff --git a/gnome-desktop3.spec b/gnome-desktop3.spec index e17118b..2edf67a 100644 --- a/gnome-desktop3.spec +++ b/gnome-desktop3.spec @@ -165,7 +165,7 @@ cat %SOURCE5 >> $RPM_BUILD_ROOT/%{_datadir}/applications/gnome-mimeapps.list # LGPL %{_libdir}/libgnome-bg-4.so.2{,.*} %{_libdir}/libgnome-desktop-4.so.2{,.*} -%{_libdir}/libgnome-qr-4.so.2{,.*} +%{_libdir}/libgnome-qr-4.so.0{,.*} %{_libdir}/libgnome-rr-4.so.2{,.*} %{_libdir}/girepository-1.0/Gnome*-4.0.typelib