qt6: 6.8.2

This commit is contained in:
Raven 2025-02-09 14:20:12 +06:00
parent 1b61b6800d
commit 00ecd51ce3
50 changed files with 27245 additions and 69 deletions

View File

@ -11,7 +11,7 @@
%global pypi_name PyQt6_WebEngine
Name: python-pyqt6-webengine
Version: 6.8.0
Version: 6.8.2
Release: %autorelease
Summary: Python bindings for Qt6WebEngine
License: GPL-3.0-only
@ -100,6 +100,9 @@ done
%changelog
* Thu feb 6 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- Update to 6.8.2
* Fri Jan 3 2025 Raven <raven@sysadmins.ws> - 6.8.0-1
- Update to 6.8.0

View File

@ -6,12 +6,12 @@
Summary: PyQt6 is Python bindings for Qt6
Name: python-pyqt6
Version: 6.8.0
Version: 6.8.1
Release: 1%{?snap:^%{snap}}%{?dist}
License: gpl-3.0-only
Url: http://www.riverbankcomputing.com/software/pyqt/
Source0: https://pypi.python.org/packages/source/P/PyQt6/PyQt6-%{version}%{?snap:.%{snap}}.tar.gz
Source0: https://pypi.python.org/packages/source/P/PyQt6/pyqt6-%{version}%{?snap:.%{snap}}.tar.gz
Source1: macros.pyqt6
BuildRequires: make
@ -115,7 +115,7 @@ BuildArch: noarch
%prep
%autosetup -n PyQt6-%{version}%{?snap:.%{snap}} -p1
%autosetup -n pyqt6-%{version}%{?snap:.%{snap}} -p1
%build
%enable_devtoolset14
@ -243,6 +243,9 @@ sed -i \
%changelog
* Thu Feb 6 2025 Raven <raven@sysadmins.ws> - 6.8.1-1
- Update to 6.8.1
* Fri Jan 3 2025 Raven <raven@sysadmins.ws> - 6.8.0-1
- Update to 6.8.0

View File

@ -9,7 +9,7 @@
Summary: Qt6 - Qt3D QML bindings and C++ APIs
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
%global examples 1
@ -220,6 +220,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Qt 5 Compatibility Libraries
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -118,6 +118,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -49,7 +49,7 @@ BuildRequires: pkgconfig(libsystemd)
Name: qt6-qtbase
Summary: Qt6 - QtBase components
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -109,6 +109,14 @@ Patch100: qtbase-use-qgnomeplatform-as-default-platform-theme-on-gnome.patch
%endif
## upstream patches
Patch150: qtbase-extract-emoji-data-from-unicode-files.patch
Patch151: qtbase-introduce-emoji-segmenter-to-3rdparty-code.patch
Patch152: qtbase-use-emoji-segmenter-to-apply-emoji-fonts-automatically.patch
Patch153: qtbase-fix-regression-when-looking-up-fallback-fonts.patch
Patch154: qtbase-skip-ad-hoc-handling-of-variation-selector-in-font-merging.patch
Patch155: qtbase-fontconfig-dont-register-hardcoded-fonts-as-color-fonts.patch
Patch156: qtbase-request-actual-font-family-request-in-final-color-font-fail-safe.patch
Patch157: qtbase-fontconfig-fix-detection-of-color-fonts.patch
# Do not check any files in %%{_qt6_plugindir}/platformthemes/ for requires.
@ -326,6 +334,10 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
Recommends: qt6-qtwayland%{?_isa}
Recommends: qt6-qttranslations
Recommends: mesa-dri-drivers%{?_isa}
Obsoletes: adwaita-qt6 <= 1.4.2
Obsoletes: libadwaita-qt6 <= 1.4.2
Obsoletes: qgnomeplatform-qt6 <= 0.9.3
Provides: qgnomeplatform-qt6 = %{version}-%{release}
# for Source6: 10-qt6-check-opengl2.sh:
# glxinfo
Requires: glx-utils
@ -884,6 +896,12 @@ make check -k ||:
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Jan 21 2025 Raven <raven@sysadmins.ws> - 6.8.1-2
- Import patches from Fedora
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,96 @@
From 486bbc7a5bc4483ecc2a6b8927543725e3d38722 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Tue, 26 Nov 2024 14:39:44 +0100
Subject: Fix regression when looking up fallback fonts
This amends 16850709306589a2433c0038605d365a6b6bedad.
In that change, the final pass for looking up fallback
fonts was turned into a lambda so that we could run it
an additional time at the very end. However, when making
a lambda from the code, some of the logic was accidentally
changed.
Specifically, for multi engines the original code would pass
Script_Common instead of the requested script to the match()
function, but it would still pass the actual script to
loadEngine() as well as store it in the key. In the changed
code, Script_Common would be used for all of these when multi
was true.
This change was not intentional and it caused us to fail to
load certain fallback fonts, for instance the Bengali font
on Windows.
Fixes: QTBUG-131632
Change-Id: Id215ee4dc2851e846be27a3a25a31cad57b8f67d
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 96c2337e..0c2a4b66 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -2734,17 +2734,23 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req,
if (script > QChar::Script_Common)
fallbacks += QString(); // Find the first font matching the specified script.
- auto findMatchingFallback = [&](int xscript) {
+ auto findMatchingFallback = [&fallbacks,
+ &index,
+ &multi,
+ &fontCache,
+ &blackListed,
+ &request](int lookupScript, int cacheScript) {
+ QFontEngine *engine = nullptr;
for (int i = 0; !engine && i < fallbacks.size(); i++) {
QFontDef def = request;
def.families = QStringList(fallbacks.at(i));
- QFontCache::Key key(def, xscript, multi ? 1 : 0);
+ QFontCache::Key key(def, cacheScript, multi ? 1 : 0);
engine = fontCache->findEngine(key);
if (!engine) {
QtFontDesc desc;
do {
- index = match(xscript,
+ index = match(lookupScript,
def,
def.families.constFirst(),
""_L1,
@@ -2755,7 +2761,12 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req,
QFontDef loadDef = def;
if (loadDef.families.isEmpty())
loadDef.families = QStringList(desc.family->name);
- engine = loadEngine(xscript, loadDef, desc.family, desc.foundry, desc.style, desc.size);
+ engine = loadEngine(cacheScript,
+ loadDef,
+ desc.family,
+ desc.foundry,
+ desc.style,
+ desc.size);
if (engine)
initFontDef(desc, loadDef, &engine->fontDef, multi);
else
@@ -2764,15 +2775,20 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req,
} while (index >= 0 && !engine);
}
}
+
+ return engine;
};
- findMatchingFallback(multi && script != QFontDatabasePrivate::Script_Emoji ? QChar::Script_Common: script);
+ engine = findMatchingFallback(multi && script != QFontDatabasePrivate::Script_Emoji
+ ? QChar::Script_Common
+ : script,
+ script);
// If we are looking for a color font and there are no color fonts on the system,
// we will end up here, for one final pass. This is a rare occurrence so we accept
// and extra pass on the fallbacks for this.
if (!engine && script == QFontDatabasePrivate::Script_Emoji)
- findMatchingFallback(QChar::Script_Common);
+ engine = findMatchingFallback(QChar::Script_Common, script);
}
if (!engine)

View File

@ -0,0 +1,34 @@
From 83864f8682da73a062a3ca32b928377dfc333021 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Wed, 15 Jan 2025 14:52:55 +0100
Subject: [PATCH] FontConfig: Don't register hardcoded fonts as color fonts
This amends 16850709306589a2433c0038605d365a6b6bedad. The patch
aimed to pass false for the color font parameter, but got it in
the wrong position, so it passed false for the pixel size instead.
The registerFont() function is a real mess, and it should be cleaned
up, but this at least fixes the immediate bug.
Pick-to: 6.9
Task-number: QTBUG-132821
Change-Id: Id54989960aa5f86d3c79423d004530bb6a4fa475
---
diff --git a/src/gui/text/unix/qfontconfigdatabase.cpp b/src/gui/text/unix/qfontconfigdatabase.cpp
index 7866e341..790316a6 100644
--- a/src/gui/text/unix/qfontconfigdatabase.cpp
+++ b/src/gui/text/unix/qfontconfigdatabase.cpp
@@ -622,9 +622,9 @@ void QFontconfigDatabase::populateFontDatabase()
while (f->qtname) {
QString familyQtName = QString::fromLatin1(f->qtname);
- registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,false,0,f->fixed,ws,nullptr);
- registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,false,0,f->fixed,ws,nullptr);
- registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,false,0,f->fixed,ws,nullptr);
+ registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleNormal,QFont::Unstretched,true,true,0,f->fixed,false,ws,nullptr);
+ registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleItalic,QFont::Unstretched,true,true,0,f->fixed,false,ws,nullptr);
+ registerFont(familyQtName,QString(),QString(),QFont::Normal,QFont::StyleOblique,QFont::Unstretched,true,true,0,f->fixed,false,ws,nullptr);
++f;
}

View File

@ -0,0 +1,43 @@
From 2c309f71705449607592bb4588bcc56223da897b Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Wed, 15 Jan 2025 15:39:16 +0100
Subject: [PATCH] FontConfig: Fix detection of color fonts
There were two mistakes in the code that intended to detect
if a specific font was a color font in the FontConfig database.
1. The "int n" parameter in FcPatternGet*() is not an array size,
but an index, so it should be 0 and not 1.
2. We need to add FC_COLOR to the list of properties in our pattern
when populating the database, otherwise we will just fail to match
it and none of the system fonts will be listed as color.
Pick-to: 6.9
Fixes: QTBUG-132377
Change-Id: Ib3c112e8a354abacd05679c62283a1f1abfb40ee
---
diff --git a/src/gui/text/unix/qfontconfigdatabase.cpp b/src/gui/text/unix/qfontconfigdatabase.cpp
index de6618f..20794ed 100644
--- a/src/gui/text/unix/qfontconfigdatabase.cpp
+++ b/src/gui/text/unix/qfontconfigdatabase.cpp
@@ -478,7 +478,7 @@
FcBool colorFont = false;
#ifdef FC_COLOR
- FcPatternGetBool(pattern, FC_COLOR, 1, &colorFont);
+ FcPatternGetBool(pattern, FC_COLOR, 0, &colorFont);
#endif
// Note: stretch should really be an int but registerFont incorrectly uses an enum
@@ -577,6 +577,9 @@
#if FC_VERSION >= 20297
FC_CAPABILITY,
#endif
+#if defined(FC_COLOR)
+ FC_COLOR,
+#endif
(const char *)nullptr
};
const char **p = properties;

View File

@ -0,0 +1,568 @@
From aa7d479be0df3e118580e87f30e061445dfb37e3 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Fri, 2 Feb 2024 15:45:20 +0100
Subject: Introduce emoji-segmenter to 3rdparty code
This is a parser for emoji sequences developed by Google
which is used in multiple other projects for parsing
sequences of characters to see if they should be represented
as color emojis or as monochrome text.
[ChangeLog][Third-Party Code] Added the emoji-segmenter to
third party code, for supporting complex emoji sequences.
This can be configured using the -emojisegmenter option.
Task-number: QTBUG-111801
Change-Id: I7f87b0751415024d29f074d133850027f0003e29
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
diff --git a/config_help.txt b/config_help.txt
index deb38c9c2f..09aebf2e65 100644
--- a/config_help.txt
+++ b/config_help.txt
@@ -298,6 +298,7 @@ Gui, printing, widget options:
-cups ................ Enable CUPS support [auto] (Unix only)
+ -emojisegmenter ...... Enable complex emoji sequences [yes]
-fontconfig .......... Enable Fontconfig support [auto] (Unix only)
-freetype ............ Select used FreeType [system/qt/no]
-harfbuzz ............ Select used HarfBuzz-NG [system/qt/no]
diff --git a/src/3rdparty/emoji-segmenter/CONTRIBUTING.md b/src/3rdparty/emoji-segmenter/CONTRIBUTING.md
new file mode 100644
index 0000000000..db177d4ac7
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# How to Contribute
+
+We'd love to accept your patches and contributions to this project. There are
+just a few small guidelines you need to follow.
+
+## Contributor License Agreement
+
+Contributions to this project must be accompanied by a Contributor License
+Agreement. You (or your employer) retain the copyright to your contribution;
+this simply gives us permission to use and redistribute your contributions as
+part of the project. Head over to <https://cla.developers.google.com/> to see
+your current agreements on file or to sign a new one.
+
+You generally only need to submit a CLA once, so if you've already submitted one
+(even if it was for a different project), you probably don't need to do it
+again.
+
+## Code reviews
+
+All submissions, including submissions by project members, require review. We
+use GitHub pull requests for this purpose. Consult
+[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
+information on using pull requests.
+
+## Community Guidelines
+
+This project follows
+[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
diff --git a/src/3rdparty/emoji-segmenter/NEWS b/src/3rdparty/emoji-segmenter/NEWS
new file mode 100644
index 0000000000..3fd07f1ce2
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/NEWS
@@ -0,0 +1,28 @@
+Overview of changes leading to 0.4.0
+Friday, November 15, 2024
+====================================
+
+* Add `make size` targe to
+ determine binary size.
+* Set has_vs for
+ emoji_keycap_sequence
+
+Overview of changes leading to 0.3.0
+Tuesday, September 5, 2024
+====================================
+
+* Add segmentation for variation
+ selector pairs, VS15 and VS16,
+ needed for font-variant-emoji.
+
+Overview of changes leading to 0.2.0
+Tuesday, Februar 20, 2024
+====================================
+
+* Change Ragel mode to -F1
+
+Overview of changes leading to 0.1.0
+Tuesday, January 29, 2019
+====================================
+
+* Initial release
diff --git a/src/3rdparty/emoji-segmenter/README.md b/src/3rdparty/emoji-segmenter/README.md
new file mode 100644
index 0000000000..571a1a4515
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/README.md
@@ -0,0 +1,103 @@
+Emoji Segmenter
+===
+
+This repository contains a Ragel grammar and generated C code for segmenting
+runs of text into text-presentation and emoji-presentation runs. It is currently
+used in projects such as Chromium and Pango for deciding which preferred
+presentation, color or text, a run of text should have.
+
+The goal is to stay very close to the grammar definitions in [Unicode Technical
+Standard #51](http://www.unicode.org/reports/tr51/).
+
+API
+===
+
+By including the `emoji_presentation_scanner.c` file, you will be able to call
+the following API
+
+```
+scan_emoji_presentation (emoji_text_iter_t p,
+ const emoji_text_iter_t pe,
+ bool* is_emoji,
+ bool* has_vs)
+```
+
+This API call will scan `emoji_text_iter_t p` for the next grammar-token and
+return an iterator that points to the end of the next token. An end iterator
+needs be specified as `pe` so that the scanner can compare against this and
+knows where to stop. In the reference parameter `is_emoji` it returns whether
+this token has emoji-presentation text-presentation, `has_vs` is set to true
+if the token contains a variation selector.
+
+A grammar token is either a combination of an emoji plus variation selector 15
+for text presentation, an emoji presentation sequence (emoji + VS16), an emoji
+presentation emoji or emoji sequence, or a single text presentation character.
+
+`emoji_text_iter_t` is an iterator type over a buffer of the character classes
+that are defined at the beginning of the the Ragel file, e.g. `EMOJI`,
+`EMOJI_TEXT_PRESENTATION`, `REGIONAL_INDICATOR`, `KEYCAP_BASE`, etc.
+
+By typedef'ing `emoji_text_iter_t` to your own iterator type, you can implement
+an adapter class that iterates over an input text buffer in any encoding, and on
+dereferencing returns the correct Ragel class by implementing something similar
+to the following Unicode character class to Ragel class mapping, example taken
+from Chromium:
+
+```
+char EmojiSegmentationCategory(UChar32 codepoint) {
+ // Specific ones first.
+ if (codepoint == kCombiningEnclosingKeycapCharacter)
+ return COMBINING_ENCLOSING_KEYCAP;
+ if (codepoint == kCombiningEnclosingCircleBackslashCharacter)
+ return COMBINING_ENCLOSING_CIRCLE_BACKSLASH;
+ if (codepoint == kZeroWidthJoinerCharacter)
+ return ZWJ;
+ if (codepoint == kVariationSelector15Character)
+ return VS15;
+ if (codepoint == kVariationSelector16Character)
+ return VS16;
+ if (codepoint == 0x1F3F4)
+ return TAG_BASE;
+ if ((codepoint >= 0xE0030 && codepoint <= 0xE0039) ||
+ (codepoint >= 0xE0061 && codepoint <= 0xE007A))
+ return TAG_SEQUENCE;
+ if (codepoint == 0xE007F)
+ return TAG_TERM;
+ if (Character::IsEmojiModifierBase(codepoint))
+ return EMOJI_MODIFIER_BASE;
+ if (Character::IsModifier(codepoint))
+ return EMOJI_MODIFIER;
+ if (Character::IsRegionalIndicator(codepoint))
+ return REGIONAL_INDICATOR;
+ if (Character::IsEmojiKeycapBase(codepoint))
+ return KEYCAP_BASE;
+
+ if (Character::IsEmojiEmojiDefault(codepoint))
+ return EMOJI_EMOJI_PRESENTATION;
+ if (Character::IsEmojiTextDefault(codepoint))
+ return EMOJI_TEXT_PRESENTATION;
+ if (Character::IsEmoji(codepoint))
+ return EMOJI;
+
+ // Ragel state machine will interpret unknown category as "any".
+ return kMaxEmojiScannerCategory;
+}
+```
+
+Update/Build requisites
+===
+
+You need to have ragel installed if you want to modify the grammar and generate a new C file as output.
+
+`apt-get install ragel`
+
+then run
+
+`make`
+
+to update the `emoji_presentation_scanner.c` and `emoji_presentation_scanner_vs.c` output C source file.
+
+Contributing
+===
+
+See the CONTRIBUTING.md file for how to contribute.
diff --git a/src/3rdparty/emoji-segmenter/REUSE.toml b/src/3rdparty/emoji-segmenter/REUSE.toml
new file mode 100644
index 0000000000..53d2dc47c7
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/REUSE.toml
@@ -0,0 +1,7 @@
+version = 1
+
+[[annotations]]
+path = ["**"]
+precedence = "closest"
+SPDX-FileCopyrightText = "Copyright 2019 Google LLC"
+SPDX-License-Identifier = "Apache-2.0"
diff --git a/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c b/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c
new file mode 100644
index 0000000000..00b7700a9a
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c
@@ -0,0 +1,251 @@
+
+#line 1 "emoji_presentation_scanner.rl"
+/* Copyright 2019 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdbool.h>
+
+#ifndef EMOJI_LINKAGE
+#define EMOJI_LINKAGE static
+#endif
+
+
+#line 23 "emoji_presentation_scanner.c"
+static const unsigned char _emoji_presentation_trans_keys[] = {
+ 0u, 13u, 14u, 15u, 0u, 13u, 9u, 12u, 10u, 12u, 10u, 10u, 4u, 12u, 4u, 12u,
+ 6u, 6u, 9u, 12u, 8u, 8u, 8u, 10u, 9u, 14u, 0
+};
+
+static const char _emoji_presentation_key_spans[] = {
+ 14, 2, 14, 4, 3, 1, 9, 9,
+ 1, 4, 1, 3, 6
+};
+
+static const char _emoji_presentation_index_offsets[] = {
+ 0, 15, 18, 33, 38, 42, 44, 54,
+ 64, 66, 71, 73, 77
+};
+
+static const char _emoji_presentation_indicies[] = {
+ 1, 1, 1, 2, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 1, 0, 4,
+ 5, 3, 6, 6, 7, 8, 9, 9,
+ 10, 11, 9, 9, 9, 9, 9, 12,
+ 9, 5, 13, 14, 15, 0, 13, 16,
+ 17, 16, 13, 0, 17, 16, 16, 16,
+ 16, 16, 13, 16, 17, 16, 17, 16,
+ 16, 16, 16, 5, 13, 14, 15, 16,
+ 5, 18, 5, 13, 19, 20, 18, 14,
+ 21, 23, 22, 13, 22, 5, 13, 14,
+ 15, 16, 4, 16, 0
+};
+
+static const char _emoji_presentation_trans_targs[] = {
+ 2, 4, 6, 2, 1, 2, 3, 3,
+ 7, 2, 8, 9, 12, 0, 2, 5,
+ 2, 5, 2, 10, 11, 2, 2, 2
+};
+
+static const char _emoji_presentation_trans_actions[] = {
+ 1, 2, 2, 3, 0, 4, 7, 2,
+ 2, 8, 0, 7, 2, 0, 9, 10,
+ 11, 2, 12, 0, 10, 13, 14, 15
+};
+
+static const char _emoji_presentation_to_state_actions[] = {
+ 0, 0, 5, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0
+};
+
+static const char _emoji_presentation_from_state_actions[] = {
+ 0, 0, 6, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0
+};
+
+static const char _emoji_presentation_eof_trans[] = {
+ 1, 4, 0, 1, 17, 1, 17, 17,
+ 19, 19, 22, 23, 17
+};
+
+static const int emoji_presentation_start = 2;
+
+static const int emoji_presentation_en_text_and_emoji_run = 2;
+
+
+#line 26 "emoji_presentation_scanner.rl"
+
+
+
+#line 100 "emoji_presentation_scanner.rl"
+
+
+EMOJI_LINKAGE emoji_text_iter_t
+scan_emoji_presentation (emoji_text_iter_t p,
+ const emoji_text_iter_t pe,
+ bool* is_emoji,
+ bool* has_vs)
+{
+ emoji_text_iter_t ts;
+ emoji_text_iter_t te;
+ const emoji_text_iter_t eof = pe;
+
+ (void)ts;
+
+ unsigned act;
+ int cs;
+
+
+#line 100 "emoji_presentation_scanner.c"
+ {
+ cs = emoji_presentation_start;
+ ts = 0;
+ te = 0;
+ act = 0;
+ }
+
+#line 106 "emoji_presentation_scanner.c"
+ {
+ int _slen;
+ int _trans;
+ const unsigned char *_keys;
+ const char *_inds;
+ if ( p == pe )
+ goto _test_eof;
+_resume:
+ switch ( _emoji_presentation_from_state_actions[cs] ) {
+ case 6:
+#line 1 "NONE"
+ {ts = p;}
+ break;
+#line 118 "emoji_presentation_scanner.c"
+ }
+
+ _keys = _emoji_presentation_trans_keys + (cs<<1);
+ _inds = _emoji_presentation_indicies + _emoji_presentation_index_offsets[cs];
+
+ _slen = _emoji_presentation_key_spans[cs];
+ _trans = _inds[ _slen > 0 && _keys[0] <=(*p) &&
+ (*p) <= _keys[1] ?
+ (*p) - _keys[0] : _slen ];
+
+_eof_trans:
+ cs = _emoji_presentation_trans_targs[_trans];
+
+ if ( _emoji_presentation_trans_actions[_trans] == 0 )
+ goto _again;
+
+ switch ( _emoji_presentation_trans_actions[_trans] ) {
+ case 9:
+#line 94 "emoji_presentation_scanner.rl"
+ {te = p+1;{ *is_emoji = false; *has_vs = true; return te; }}
+ break;
+ case 15:
+#line 95 "emoji_presentation_scanner.rl"
+ {te = p+1;{ *is_emoji = true; *has_vs = true; return te; }}
+ break;
+ case 4:
+#line 96 "emoji_presentation_scanner.rl"
+ {te = p+1;{ *is_emoji = true; *has_vs = false; return te; }}
+ break;
+ case 8:
+#line 97 "emoji_presentation_scanner.rl"
+ {te = p+1;{ *is_emoji = false; *has_vs = false; return te; }}
+ break;
+ case 13:
+#line 94 "emoji_presentation_scanner.rl"
+ {te = p;p--;{ *is_emoji = false; *has_vs = true; return te; }}
+ break;
+ case 14:
+#line 95 "emoji_presentation_scanner.rl"
+ {te = p;p--;{ *is_emoji = true; *has_vs = true; return te; }}
+ break;
+ case 11:
+#line 96 "emoji_presentation_scanner.rl"
+ {te = p;p--;{ *is_emoji = true; *has_vs = false; return te; }}
+ break;
+ case 12:
+#line 97 "emoji_presentation_scanner.rl"
+ {te = p;p--;{ *is_emoji = false; *has_vs = false; return te; }}
+ break;
+ case 3:
+#line 96 "emoji_presentation_scanner.rl"
+ {{p = ((te))-1;}{ *is_emoji = true; *has_vs = false; return te; }}
+ break;
+ case 1:
+#line 1 "NONE"
+ { switch( act ) {
+ case 2:
+ {{p = ((te))-1;} *is_emoji = true; *has_vs = true; return te; }
+ break;
+ case 3:
+ {{p = ((te))-1;} *is_emoji = true; *has_vs = false; return te; }
+ break;
+ case 4:
+ {{p = ((te))-1;} *is_emoji = false; *has_vs = false; return te; }
+ break;
+ }
+ }
+ break;
+ case 10:
+#line 1 "NONE"
+ {te = p+1;}
+#line 95 "emoji_presentation_scanner.rl"
+ {act = 2;}
+ break;
+ case 2:
+#line 1 "NONE"
+ {te = p+1;}
+#line 96 "emoji_presentation_scanner.rl"
+ {act = 3;}
+ break;
+ case 7:
+#line 1 "NONE"
+ {te = p+1;}
+#line 97 "emoji_presentation_scanner.rl"
+ {act = 4;}
+ break;
+#line 188 "emoji_presentation_scanner.c"
+ }
+
+_again:
+ switch ( _emoji_presentation_to_state_actions[cs] ) {
+ case 5:
+#line 1 "NONE"
+ {ts = 0;}
+ break;
+#line 195 "emoji_presentation_scanner.c"
+ }
+
+ if ( ++p != pe )
+ goto _resume;
+ _test_eof: {}
+ if ( p == eof )
+ {
+ if ( _emoji_presentation_eof_trans[cs] > 0 ) {
+ _trans = _emoji_presentation_eof_trans[cs] - 1;
+ goto _eof_trans;
+ }
+ }
+
+ }
+
+#line 118 "emoji_presentation_scanner.rl"
+
+
+ /* Should not be reached. */
+ *is_emoji = false;
+ *has_vs = false;
+ return p;
+}
diff --git a/src/3rdparty/emoji-segmenter/patch/0001-Compile-with-warnings-are-errors.patch b/src/3rdparty/emoji-segmenter/patch/0001-Compile-with-warnings-are-errors.patch
new file mode 100644
index 0000000000..0cc1868ca7
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/patch/0001-Compile-with-warnings-are-errors.patch
@@ -0,0 +1,26 @@
+From 4ced1426e27320e00b0dd28693df5d95c648d230 Mon Sep 17 00:00:00 2001
+From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
+Date: Thu, 14 Nov 2024 09:42:11 +0100
+Subject: [PATCH] Compile with warnings-are-errors
+
+Change-Id: Icea8febefc90f3f047143e5b76ff511145c0dcae
+---
+ src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c b/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c
+index 56e2e78033..ce7e01846c 100644
+--- a/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c
++++ b/src/3rdparty/emoji-segmenter/emoji_presentation_scanner.c
+@@ -101,6 +101,8 @@ scan_emoji_presentation (emoji_text_iter_t p,
+ emoji_text_iter_t te;
+ const emoji_text_iter_t eof = pe;
+
++ (void)ts;
++
+ unsigned act;
+ int cs;
+
+--
+2.40.0.windows.1
+
diff --git a/src/3rdparty/emoji-segmenter/qt_attribution.json b/src/3rdparty/emoji-segmenter/qt_attribution.json
new file mode 100644
index 0000000000..64083381d4
--- /dev/null
+++ b/src/3rdparty/emoji-segmenter/qt_attribution.json
@@ -0,0 +1,16 @@
+{
+ "Id": "emoji-segmenter",
+ "Name": "Emoji Segmenter",
+ "QDocModule": "qtgui",
+ "QtUsage": "Used in QtGui for parsing complex emoji sequences. Can be configured using the -emojisegmenter option.",
+ "SecurityCritical": true,
+
+ "Description": "A parser for emoji sequences.",
+ "Homepage": "https://github.com/google/emoji-segmenter",
+ "Version": "0.4.0",
+ "DownloadLocation": "https://github.com/google/emoji-segmenter/releases/tag/0.4.0",
+
+ "License": "Apache License 2.0",
+ "LicenseId": "Apache-2.0",
+ "Copyright": "Copyright 2019 Google LLC"
+}
diff --git a/src/gui/configure.cmake b/src/gui/configure.cmake
index b7c1e8e00c..7889445976 100644
--- a/src/gui/configure.cmake
+++ b/src/gui/configure.cmake
@@ -699,6 +699,12 @@ qt_feature("direct2d1_1" PRIVATE
LABEL "Direct 2D 1.1"
CONDITION QT_FEATURE_direct2d AND TEST_d2d1_1
)
+qt_feature("emojisegmenter" PUBLIC PRIVATE
+ SECTION "Fonts"
+ LABEL "Emoji Segmenter"
+ PURPOSE "Supports parsing complex emoji sequences for better font resolution."
+)
+qt_feature_definition("emojisegmenter" "QT_NO_EMOJISEGMENTER" NEGATE VALUE "1")
qt_feature("evdev" PRIVATE
LABEL "evdev"
CONDITION QT_FEATURE_thread AND TEST_evdev
@@ -1299,6 +1305,7 @@ qt_feature("wayland" PUBLIC
qt_configure_add_summary_section(NAME "Qt Gui")
qt_configure_add_summary_entry(ARGS "accessibility")
+qt_configure_add_summary_entry(ARGS "emojisegmenter")
qt_configure_add_summary_entry(ARGS "freetype")
qt_configure_add_summary_entry(ARGS "system-freetype")
qt_configure_add_summary_entry(ARGS "harfbuzz")
diff --git a/src/gui/qt_cmdline.cmake b/src/gui/qt_cmdline.cmake
index 446618ebc4..5465b2c63e 100644
--- a/src/gui/qt_cmdline.cmake
+++ b/src/gui/qt_cmdline.cmake
@@ -10,6 +10,7 @@ qt_commandline_option(eglfs TYPE boolean)
qt_commandline_option(evdev TYPE boolean)
qt_commandline_option(fontconfig TYPE boolean)
qt_commandline_option(freetype TYPE enum VALUES no qt system)
+qt_commandline_option(emojisegmenter TYPE boolean)
qt_commandline_option(gbm TYPE boolean)
qt_commandline_option(gif TYPE boolean)
qt_commandline_option(harfbuzz TYPE enum VALUES no qt system)

View File

@ -0,0 +1,45 @@
From 0acbd22508cb793461c01979d89c529f86a24bc3 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Wed, 15 Jan 2025 15:12:41 +0100
Subject: [PATCH] Request actual font family request in final color font fail safe
When we're trying to resolve a font for color emojis, we will
prefer any color font over the selected font (since a normal
font may have monochrome glyphs for emoji characters and that's
not what we are after).
If there are no color fonts on the system at all, we need to do
a final match where we ignore whether the font is in color or
not and just return it anyway.
In this final pass we would find the first best match among the
fallbacks (typically the first one), but never actually check
the font that was requested in the first place. This was a
mistake. Unless it does not exist, we should just return the
requested font family.
Pick-to: 6.9
Task-number: QTBUG-132377
Change-Id: Ie53a6bd665ebdaaca92bf0c33fabf5195e1aa5fe
---
diff --git a/src/gui/text/qfontdatabase.cpp b/src/gui/text/qfontdatabase.cpp
index 0c2a4b66..03f29009 100644
--- a/src/gui/text/qfontdatabase.cpp
+++ b/src/gui/text/qfontdatabase.cpp
@@ -2787,8 +2787,14 @@ QFontEngine *QFontDatabasePrivate::findFont(const QFontDef &req,
// If we are looking for a color font and there are no color fonts on the system,
// we will end up here, for one final pass. This is a rare occurrence so we accept
// and extra pass on the fallbacks for this.
- if (!engine && script == QFontDatabasePrivate::Script_Emoji)
+ if (!engine && script == QFontDatabasePrivate::Script_Emoji) {
engine = findMatchingFallback(QChar::Script_Common, script);
+
+ // Since we no longer require color fonts, we need to retry to check if the
+ // actual requested font is available as a non-color font.
+ if (!requestFamily.isEmpty())
+ fallbacks.prepend(requestFamily);
+ }
}
if (!engine)

View File

@ -0,0 +1,55 @@
From cb2633468413d8c2a9e28d4c4a10b25e90dd3116 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Mon, 25 Nov 2024 16:05:09 +0100
Subject: Skip ad hoc handling of variation selector in font merging
Since we now support emoji parsing, there is no longer any need
for this ad hoc processing of VS-16. The exception is if Qt is
built without the emoji segmenter, in which case we should keep
it for consistency with previous versions.
Task-number: QTBUG-111801
Change-Id: I3e243b9610fe55dda26eba63ac849e6afa22a185
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 02595b40c5..6be6a5aca2 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -1997,8 +1997,11 @@ int QFontEngineMulti::stringToCMap(const QChar *str, int len,
int glyph_pos = 0;
QStringIterator it(str, str + len);
- int lastFallback = -1;
+#if defined(QT_NO_EMOJISEGMENTER)
char32_t previousUcs4 = 0;
+#endif
+
+ int lastFallback = -1;
while (it.hasNext()) {
const char32_t ucs4 = it.peekNext();
@@ -2057,6 +2060,7 @@ int QFontEngineMulti::stringToCMap(const QChar *str, int len,
}
}
+#if defined(QT_NO_EMOJISEGMENTER)
// For variant-selectors, they are modifiers to the previous character. If we
// end up with different font selections for the selector and the character it
// modifies, we try applying the selector font to the preceding character as well
@@ -2095,11 +2099,15 @@ int QFontEngineMulti::stringToCMap(const QChar *str, int len,
}
}
}
+#endif
}
it.advance();
++glyph_pos;
+
+#if defined(QT_NO_EMOJISEGMENTER)
previousUcs4 = ucs4;
+#endif
}
*nglyphs = glyph_pos;

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Charts component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -102,6 +102,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -4,7 +4,7 @@
Summary: Qt6 - CoAP component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -85,6 +85,9 @@ Requires: %{name}-devel%{?_isa} = %{version}-%{release}
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Connectivity components
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
# See LICENSE.GPL3, respectively, for exception details
@ -123,6 +123,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -15,8 +15,8 @@
Summary: Qt6 - QtDeclarative component
Name: qt6-%{qt_module}
Version: 6.8.1
Release: 2%{?dist}
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
Url: http://www.qt.io
@ -413,6 +413,9 @@ make check -k -C tests ||:
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Sat Dec 21 2024 Raven <raven@sysadmins.ws> - 6.8.1-2
- drop QmlAssetDownloader

View File

@ -1,7 +1,7 @@
%global qt_module qtgraphs
Name: qt6-qtgraphs
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
%global examples 1
@ -113,6 +113,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -4,7 +4,7 @@
%global examples 1
Name: qt6-qthttpserver
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
Summary: Library to facilitate the creation of an http server with Qt
@ -93,6 +93,9 @@ to the usage of %{name}.
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -8,7 +8,7 @@
Summary: Qt6 - QtImageFormats component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -87,6 +87,9 @@ rm -rv src/3rdparty
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -8,7 +8,7 @@
Summary: Qt6 - LanguageServer component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -78,10 +78,13 @@ Requires: qt6-qtbase-devel%{?_isa}
%{_qt6_libdir}/qt6/metatypes/qt6*_metatypes.json
%{_qt6_libdir}/qt6/modules/JsonRpcPrivate.json
%{_qt6_libdir}/qt6/modules/LanguageServerPrivate.json
%{_qt6_libdir}/qt6/sbom/qtlanguageserver-6.8.1.spdx
%{_qt6_libdir}/qt6/sbom/qtlanguageserver-%{version}.spdx
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Location Libraries
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
# Rest of the licenses are for Qt code in src/location and src/plugins
@ -126,6 +126,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -8,7 +8,7 @@
Summary: Qt6 - Lottie Animation
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -80,6 +80,9 @@ Requires: qt6-qtbase-devel%{?_isa}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -1,7 +1,7 @@
%global qt_module qtmqtt
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
Summary: Qt6 - Mqtt module
@ -70,6 +70,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%{_qt6_examplesdir}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -1,9 +1,6 @@
%global qt_module qtmultimedia
%global gst 0.10
%if 0%{?fedora} || 0%{?rhel} > 7
%global gst 1.0
%endif
%bcond_without ffmpeg
@ -16,7 +13,7 @@
Summary: Qt6 - Multimedia support
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -51,9 +48,7 @@ BuildRequires: qt6-qtdeclarative-devel >= %{version}
BuildRequires: qt6-qtshadertools-devel >= %{version}
BuildRequires: qt6-qtquick3d-devel >= %{version}
BuildRequires: pkgconfig(alsa)
%if "%{?gst}" == "0.10"
BuildRequires: pkgconfig(gstreamer-interfaces-0.10)
%endif
BuildRequires: pkgconfig(gstreamer-%{gst})
BuildRequires: pkgconfig(gstreamer-app-%{gst})
BuildRequires: pkgconfig(gstreamer-audio-%{gst})
@ -73,6 +68,7 @@ BuildRequires: libavformat-free-devel
BuildRequires: libswscale-free-devel
BuildRequires: libswresample-free-devel
%endif
BuildRequires: pkgconfig(libpipewire-0.3)
BuildRequires: pkgconfig(libva) pkgconfig(libva-drm)
%endif
BuildRequires: pkgconfig(xrandr)
@ -81,6 +77,7 @@ BuildRequires: pkgconfig(xkbcommon)
BuildRequires: pkgconfig(openssl)
# workaround missing dep
# /usr/include/gstreamer-1.0/gst/gl/wayland/gstgldisplay_wayland.h:26:10: fatal error: wayland-client.h: No such file or directory
BuildRequires: wayland-devel
%description
@ -119,7 +116,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%endif
%cmake_qt6 \
-DQT_FEATURE_alsa=ON \
-DQT_BUILD_EXAMPLES:BOOL=%{?examples:ON}%{!?examples:OFF} \
-DQT_INSTALL_EXAMPLES_SOURCES=%{?examples:ON}%{!?examples:OFF} \
-DINPUT_gstreamer:BOOL=TRUE \
-DINPUT_ffmpeg:BOOL=TRUE
@ -217,6 +216,12 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Jan 21 2025 Raven <raven@sysadmins.ws> - 6.8.1-2
- rebuild (ffmpeg)
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - NetworkAuth component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -110,6 +110,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -4,7 +4,7 @@
Summary: Qt6 - OPC UA component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -102,6 +102,9 @@ Requires: %{name}-devel%{?_isa} = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Positioning component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -149,6 +149,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Quick3D Libraries and utilities
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -271,6 +271,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -8,7 +8,7 @@
Summary: Qt6 - QuickTimeline plugin
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -96,6 +96,9 @@ Requires: qt6-qtdeclarative-devel%{?_isa}
%{_qt6_libdir}/pkgconfig/*.pc
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Qt Remote Objects
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -111,6 +111,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - ScXml component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -120,6 +120,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Sensors component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
# See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details
@ -130,6 +130,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - SerialBus component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -107,6 +107,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - SerialPort component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
# See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details
@ -110,6 +110,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -8,7 +8,7 @@
Summary: Qt6 - Qt Shader Tools module builds on the SPIR-V Open Source Ecosystem
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -109,10 +109,13 @@ popd
%dir %{_qt6_libdir}/cmake/Qt6ShaderToolsTools/
%{_qt6_libdir}/cmake/Qt6ShaderToolsTools/*.cmake
%{_qt6_libdir}/qt6/metatypes/qt6*_metatypes.json
%{_qt6_libdir}/qt6/sbom/qtshadertools-6.8.1.spdx
%{_qt6_libdir}/qt6/sbom/qtshadertools-*.spdx
%{_qt6_libdir}/pkgconfig/Qt6ShaderTools.pc
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Speech component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
# Code can be either LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only
@ -148,6 +148,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - Support for rendering and displaying SVG
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -120,6 +120,9 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -9,7 +9,7 @@
Summary: Qt6 - QtTool components
Name: qt6-qttools
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -366,6 +366,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -7,7 +7,7 @@
Summary: Qt6 - QtTranslations module
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -89,6 +89,7 @@ Provides: %{_qt6}-zh_TW = %{version}-%{release}
%files
%license LICENSES/*
%{_qt6_datadir}/translations/catalogs.json
%{_qt6_libdir}/qt6/sbom/%{qt_module}-*.spdx
%lang(ar) %{_qt6_translationdir}/*_ar.qm
%lang(bg) %{_qt6_translationdir}/*_bg.qm
%lang(ca) %{_qt6_translationdir}/*_ca.qm
@ -127,6 +128,9 @@ Provides: %{_qt6}-zh_TW = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -10,7 +10,7 @@
Summary: Qt6 - VirtualKeyboard component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -129,6 +129,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -9,8 +9,8 @@
Summary: Qt6 - Wayland platform support and QtCompositor module
Name: qt6-%{qt_module}
Version: 6.8.1
Release: 1%{?dist}
Version: 6.8.2
Release: 2%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
Url: http://www.qt.io
@ -23,12 +23,13 @@ Source0: https://download.qt.io/development_releases/qt/%{majmin}/%{qt_version}/
Source0: https://download.qt.io/official_releases/qt/%{majmin}/%{version}/submodules/%{qt_module}-everywhere-src-%{version}.tar.xz
%endif
# Upstream patches
# Upstreamable patches
Patch0: qtwayland-use-adwaita-decorations-by-default.patch
# Upstream patches
Patch1: qtwayland-update-wayland-xml-to-version-1.23.0.patch
Patch3: qtwayland-adwaita-improve-border-painting.patch
# filter qml provides
%global __provides_exclude_from ^%{_qt6_archdatadir}/qml/.*\\.so$
@ -200,6 +201,12 @@ popd
%endif
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Jan 21 2025 Raven <raven@sysadmins.ws> - 6.8.1-2
- Import patches from Fedora
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -0,0 +1,74 @@
From 1304ba3997951a93939b04b9ad1df1e0a0c146eb Mon Sep 17 00:00:00 2001
From: Jan Grulich <jgrulich@redhat.com>
Date: Tue, 19 Nov 2024 19:15:08 +0100
Subject: [PATCH] Adwaita decorations: improve border painting
This is a backport of two changes pushed to QAdwaitaDecorations upstream
that further improve painting of border around the application window.
Using the 0.5px adjustment makes the border to look better as the line
better aligns. Also the separator between window and title doesn't need
to be painted separately. Co-authored with Lorenzo Bertini.
Pick-to: 6.8
Change-Id: Ib841073884dee58e599a173c259547416d2ed8ce
---
diff --git a/src/plugins/decorations/adwaita/qwaylandadwaitadecoration.cpp b/src/plugins/decorations/adwaita/qwaylandadwaitadecoration.cpp
index 2d3575b..c32ab4a 100644
--- a/src/plugins/decorations/adwaita/qwaylandadwaitadecoration.cpp
+++ b/src/plugins/decorations/adwaita/qwaylandadwaitadecoration.cpp
@@ -46,7 +46,6 @@
static constexpr int ceShadowsWidth = 10;
static constexpr int ceTitlebarHeight = 38;
static constexpr int ceWindowBorderWidth = 1;
-static constexpr qreal ceTitlebarSeperatorWidth = 0.5;
static QMap<QWaylandAdwaitaDecoration::ButtonIcon, QString> buttonMap = {
{ QWaylandAdwaitaDecoration::CloseIcon, "window-close-symbolic"_L1 },
@@ -129,36 +128,29 @@
/*
* Titlebar and window border
*/
- const int titleBarWidth = surfaceRect.width() - margins().left() - margins().right();
QPainterPath path;
+ const QPointF topLeft = { margins(ShadowsOnly).left() + 0.5,
+ margins(ShadowsOnly).top() - 0.5 };
+ const int titleBarWidth = surfaceRect.width() - margins(ShadowsOnly).left()
+ - margins(ShadowsOnly).right() - 0.5;
+ const int borderRectHeight =
+ surfaceRect.height() - margins().top() - margins().bottom() + 0.5;
// Maximized or tiled won't have rounded corners
if (waylandWindow()->windowStates() & Qt::WindowMaximized
|| waylandWindow()->toplevelWindowTilingStates() != QWaylandWindow::WindowNoState)
- path.addRect(margins().left(), margins().bottom(), titleBarWidth, margins().top());
+ path.addRect(QRectF(topLeft, QSizeF(titleBarWidth, margins().top())));
else
- path.addRoundedRect(margins().left(), margins().bottom(), titleBarWidth,
- margins().top() + ceCornerRadius, ceCornerRadius, ceCornerRadius);
+ path.addRoundedRect(QRectF(topLeft, QSizeF(titleBarWidth, margins().top() + ceCornerRadius)),
+ ceCornerRadius, ceCornerRadius);
p.save();
p.setPen(color(Border));
p.fillPath(path.simplified(), color(Background));
p.drawPath(path);
- p.drawRect(margins().left(), margins().top(), titleBarWidth, surfaceRect.height() - margins().top() - margins().bottom());
+ p.drawRect(QRectF(topLeft.x(), margins().top(), titleBarWidth, borderRectHeight));
p.restore();
-
- /*
- * Titlebar separator
- */
- p.save();
- p.setPen(color(Border));
- p.drawLine(QLineF(margins().left(), margins().top() - ceTitlebarSeperatorWidth,
- surfaceRect.width() - margins().right(),
- margins().top() - ceTitlebarSeperatorWidth));
- p.restore();
-
-
/*
* Window title
*/

View File

@ -0,0 +1,491 @@
From c2f61bc47baacf2e6a44c6c3c4e4cbf0abfa4095 Mon Sep 17 00:00:00 2001
From: Liang Qi <liang.qi@qt.io>
Date: Wed, 3 Jul 2024 15:06:09 +0200
Subject: Update wayland.xml to version 1.23.0
This updates only the protocol definition, implementations
will need additional commits to opt into using them.
Change-Id: I5999e6dd75dfff7d904981fb1545d58c8b38ceb0
Reviewed-by: David Edmundson <davidedmundson@kde.org>
---
src/3rdparty/protocol/wayland.xml | 215 +++++++++++++++++++++++++++-----------
1 file changed, 156 insertions(+), 59 deletions(-)
diff --git a/src/3rdparty/protocol/wayland/wayland.xml b/src/3rdparty/protocol/wayland/wayland.xml
index 10e039d6e..9418c62f3 100644
--- a/src/3rdparty/protocol/wayland/wayland.xml
+++ b/src/3rdparty/protocol/wayland/wayland.xml
@@ -46,7 +46,7 @@
compositor after the callback is fired and as such the client must not
attempt to use it after that point.
- The callback_data passed in the callback is the event serial.
+ The callback_data passed in the callback is undefined and should be ignored.
</description>
<arg name="callback" type="new_id" interface="wl_callback"
summary="callback object for the sync request"/>
@@ -212,7 +212,7 @@
</request>
</interface>
- <interface name="wl_shm_pool" version="1">
+ <interface name="wl_shm_pool" version="2">
<description summary="a shared memory pool">
The wl_shm_pool object encapsulates a piece of memory shared
between the compositor and client. Through the wl_shm_pool
@@ -262,17 +262,17 @@
created, but using the new size. This request can only be
used to make the pool bigger.
- This request only changes the amount of bytes that are mmapped
- by the server and does not touch the file corresponding to the
- file descriptor passed at creation time. It is the client's
- responsibility to ensure that the file is at least as big as
- the new pool size.
+ This request only changes the amount of bytes that are mmapped
+ by the server and does not touch the file corresponding to the
+ file descriptor passed at creation time. It is the client's
+ responsibility to ensure that the file is at least as big as
+ the new pool size.
</description>
<arg name="size" type="int" summary="new size of the pool, in bytes"/>
</request>
</interface>
- <interface name="wl_shm" version="1">
+ <interface name="wl_shm" version="2">
<description summary="shared memory support">
A singleton global object that provides support for shared
memory.
@@ -419,6 +419,21 @@
<entry name="xbgr16161616" value="0x38344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/>
<entry name="argb16161616" value="0x38345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/>
<entry name="abgr16161616" value="0x38344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/>
+ <entry name="c1" value="0x20203143" summary="[7:0] C0:C1:C2:C3:C4:C5:C6:C7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="c2" value="0x20203243" summary="[7:0] C0:C1:C2:C3 2:2:2:2 four pixels/byte"/>
+ <entry name="c4" value="0x20203443" summary="[7:0] C0:C1 4:4 two pixels/byte"/>
+ <entry name="d1" value="0x20203144" summary="[7:0] D0:D1:D2:D3:D4:D5:D6:D7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="d2" value="0x20203244" summary="[7:0] D0:D1:D2:D3 2:2:2:2 four pixels/byte"/>
+ <entry name="d4" value="0x20203444" summary="[7:0] D0:D1 4:4 two pixels/byte"/>
+ <entry name="d8" value="0x20203844" summary="[7:0] D"/>
+ <entry name="r1" value="0x20203152" summary="[7:0] R0:R1:R2:R3:R4:R5:R6:R7 1:1:1:1:1:1:1:1 eight pixels/byte"/>
+ <entry name="r2" value="0x20203252" summary="[7:0] R0:R1:R2:R3 2:2:2:2 four pixels/byte"/>
+ <entry name="r4" value="0x20203452" summary="[7:0] R0:R1 4:4 two pixels/byte"/>
+ <entry name="r10" value="0x20303152" summary="[15:0] x:R 6:10 little endian"/>
+ <entry name="r12" value="0x20323152" summary="[15:0] x:R 4:12 little endian"/>
+ <entry name="avuy8888" value="0x59555641" summary="[31:0] A:Cr:Cb:Y 8:8:8:8 little endian"/>
+ <entry name="xvuy8888" value="0x59555658" summary="[31:0] X:Cr:Cb:Y 8:8:8:8 little endian"/>
+ <entry name="p030" value="0x30333050" summary="2x2 subsampled Cr:Cb plane 10 bits per channel packed"/>
</enum>
<request name="create_pool">
@@ -442,6 +457,17 @@
</description>
<arg name="format" type="uint" enum="format" summary="buffer pixel format"/>
</event>
+
+ <!-- Version 2 additions -->
+
+ <request name="release" type="destructor" since="2">
+ <description summary="release the shm object">
+ Using this request a client can tell the server that it is not going to
+ use the shm object anymore.
+
+ Objects created via this interface remain unaffected.
+ </description>
+ </request>
</interface>
<interface name="wl_buffer" version="1">
@@ -453,9 +479,11 @@
client provides and updates the contents is defined by the buffer factory
interface.
- If the buffer uses a format that has an alpha channel, the alpha channel
- is assumed to be premultiplied in the color channels unless otherwise
- specified.
+ Color channels are assumed to be electrical rather than optical (in other
+ words, encoded with a transfer function) unless otherwise specified. If
+ the buffer uses a format that has an alpha channel, the alpha channel is
+ assumed to be premultiplied into the electrical color channel values
+ (after transfer function encoding) unless otherwise specified.
Note, because wl_buffer objects are created from multiple independent
factory interfaces, the wl_buffer interface is frozen at version 1.
@@ -847,6 +875,7 @@
<enum name="error">
<entry name="role" value="0" summary="given wl_surface has another role"/>
+ <entry name="used_source" value="1" summary="source has already been used"/>
</enum>
<request name="start_drag">
@@ -868,7 +897,7 @@
The icon surface is an optional (can be NULL) surface that
provides an icon to be moved around with the cursor. Initially,
the top-left corner of the icon surface is placed at the cursor
- hotspot, but subsequent wl_surface.attach request can move the
+ hotspot, but subsequent wl_surface.offset requests can move the
relative position. Attach requests must be confirmed with
wl_surface.commit as usual. The icon surface is given the role of
a drag-and-drop icon. If the icon surface already has another role,
@@ -876,6 +905,10 @@
The input region is ignored for wl_surfaces with the role of a
drag-and-drop icon.
+
+ The given source may not be used in any further set_selection or
+ start_drag requests. Attempting to reuse a previously-used source
+ may send a used_source error.
</description>
<arg name="source" type="object" interface="wl_data_source" allow-null="true" summary="data source for the eventual transfer"/>
<arg name="origin" type="object" interface="wl_surface" summary="surface where the drag originates"/>
@@ -889,6 +922,10 @@
to the data from the source on behalf of the client.
To unset the selection, set the source to NULL.
+
+ The given source may not be used in any further set_selection or
+ start_drag requests. Attempting to reuse a previously-used source
+ may send a used_source error.
</description>
<arg name="source" type="object" interface="wl_data_source" allow-null="true" summary="data source for the selection"/>
<arg name="serial" type="uint" summary="serial number of the event that triggered this request"/>
@@ -1411,7 +1448,7 @@
<entry name="invalid_size" value="2" summary="buffer size is invalid"/>
<entry name="invalid_offset" value="3" summary="buffer offset is invalid"/>
<entry name="defunct_role_object" value="4"
- summary="surface was destroyed before its role object"/>
+ summary="surface was destroyed before its role object"/>
</enum>
<request name="destroy" type="destructor">
@@ -1440,9 +1477,9 @@
When the bound wl_surface version is 5 or higher, passing any
non-zero x or y is a protocol violation, and will result in an
- 'invalid_offset' error being raised. The x and y arguments are ignored
- and do not change the pending state. To achieve equivalent semantics,
- use wl_surface.offset.
+ 'invalid_offset' error being raised. The x and y arguments are ignored
+ and do not change the pending state. To achieve equivalent semantics,
+ use wl_surface.offset.
Surface contents are double-buffered state, see wl_surface.commit.
@@ -1479,6 +1516,13 @@
If wl_surface.attach is sent with a NULL wl_buffer, the
following wl_surface.commit will remove the surface content.
+
+ If a pending wl_buffer has been destroyed, the result is not specified.
+ Many compositors are known to remove the surface content on the following
+ wl_surface.commit, but this behaviour is not universal. Clients seeking to
+ maximise compatibility should not destroy pending buffers and should
+ ensure that they explicitly remove content from surfaces, even after
+ destroying buffers.
</description>
<arg name="buffer" type="object" interface="wl_buffer" allow-null="true"
summary="buffer of surface contents"/>
@@ -1618,16 +1662,18 @@
<description summary="commit pending surface state">
Surface state (input, opaque, and damage regions, attached buffers,
etc.) is double-buffered. Protocol requests modify the pending state,
- as opposed to the current state in use by the compositor. A commit
- request atomically applies all pending state, replacing the current
- state. After commit, the new pending state is as documented for each
- related request.
+ as opposed to the active state in use by the compositor.
- On commit, a pending wl_buffer is applied first, and all other state
- second. This means that all coordinates in double-buffered state are
- relative to the new wl_buffer coming into use, except for
- wl_surface.attach itself. If there is no pending wl_buffer, the
- coordinates are relative to the current surface contents.
+ A commit request atomically creates a content update from the pending
+ state, even if the pending state has not been touched. The content
+ update is placed in a queue until it becomes active. After commit, the
+ new pending state is as documented for each related request.
+
+ When the content update is applied, the wl_buffer is applied before all
+ other state. This means that all coordinates in double-buffered state
+ are relative to the newly attached wl_buffers, except for
+ wl_surface.attach itself. If there is no newly attached wl_buffer, the
+ coordinates are relative to the previous content update.
All requests that need a commit to become effective are documented
to affect double-buffered state.
@@ -1666,10 +1712,12 @@
<request name="set_buffer_transform" since="2">
<description summary="sets the buffer transformation">
- This request sets an optional transformation on how the compositor
- interprets the contents of the buffer attached to the surface. The
- accepted values for the transform parameter are the values for
- wl_output.transform.
+ This request sets the transformation that the client has already applied
+ to the content of the buffer. The accepted values for the transform
+ parameter are the values for wl_output.transform.
+
+ The compositor applies the inverse of this transformation whenever it
+ uses the buffer contents.
Buffer transform is double-buffered state, see wl_surface.commit.
@@ -1725,11 +1773,11 @@
a buffer that is larger (by a factor of scale in each dimension)
than the desired surface size.
- If scale is not positive the invalid_scale protocol error is
+ If scale is not greater than 0 the invalid_scale protocol error is
raised.
</description>
<arg name="scale" type="int"
- summary="positive scale for interpreting buffer contents"/>
+ summary="scale for interpreting buffer contents"/>
</request>
<!-- Version 4 additions -->
@@ -1802,10 +1850,15 @@
This event indicates the preferred buffer scale for this surface. It is
sent whenever the compositor's preference changes.
+ Before receiving this event the preferred buffer scale for this surface
+ is 1.
+
It is intended that scaling aware clients use this event to scale their
content and use wl_surface.set_buffer_scale to indicate the scale they
have rendered with. This allows clients to supply a higher detail
buffer.
+
+ The compositor shall emit a scale value greater than 0.
</description>
<arg name="factor" type="int" summary="preferred scaling factor"/>
</event>
@@ -1815,9 +1868,12 @@
This event indicates the preferred buffer transform for this surface.
It is sent whenever the compositor's preference changes.
- It is intended that transform aware clients use this event to apply the
- transform to their content and use wl_surface.set_buffer_transform to
- indicate the transform they have rendered with.
+ Before receiving this event the preferred buffer transform for this
+ surface is normal.
+
+ Applying this transformation to the surface buffer contents and using
+ wl_surface.set_buffer_transform might allow the compositor to use the
+ surface buffer more efficiently.
</description>
<arg name="transform" type="uint" enum="wl_output.transform"
summary="preferred transform"/>
@@ -1992,9 +2048,9 @@
where (x, y) are the coordinates of the pointer location, in
surface-local coordinates.
- On surface.attach requests to the pointer surface, hotspot_x
+ On wl_surface.offset requests to the pointer surface, hotspot_x
and hotspot_y are decremented by the x and y parameters
- passed to the request. Attach must be confirmed by
+ passed to the request. The offset must be applied by
wl_surface.commit as usual.
The hotspot can also be updated by passing the currently set
@@ -2248,7 +2304,7 @@
<arg name="axis" type="uint" enum="axis" summary="the axis stopped with this event"/>
</event>
- <event name="axis_discrete" since="5">
+ <event name="axis_discrete" since="5" deprecated-since="8">
<description summary="axis click event">
Discrete step information for scroll and other axes.
@@ -2374,6 +2430,16 @@
<description summary="keyboard input device">
The wl_keyboard interface represents one or more keyboards
associated with a seat.
+
+ Each wl_keyboard has the following logical state:
+
+ - an active surface (possibly null),
+ - the keys currently logically down,
+ - the active modifiers,
+ - the active group.
+
+ By default, the active surface is null, the keys currently logically down
+ are empty, the active modifiers and the active group are 0.
</description>
<enum name="keymap_format">
@@ -2408,10 +2474,15 @@
The compositor must send the wl_keyboard.modifiers event after this
event.
+
+ In the wl_keyboard logical state, this event sets the active surface to
+ the surface argument and the keys currently logically down to the keys
+ in the keys argument. The compositor must not send this event if the
+ wl_keyboard already had an active surface immediately before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the enter event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface gaining keyboard focus"/>
- <arg name="keys" type="array" summary="the currently pressed keys"/>
+ <arg name="keys" type="array" summary="the keys currently logically down"/>
</event>
<event name="leave">
@@ -2422,8 +2493,10 @@
The leave notification is sent before the enter notification
for the new focus.
- After this event client must assume that all keys, including modifiers,
- are lifted and also it must stop key repeating if there's some going on.
+ In the wl_keyboard logical state, this event resets all values to their
+ defaults. The compositor must not send this event if the active surface
+ of the wl_keyboard was not equal to the surface argument immediately
+ before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the leave event"/>
<arg name="surface" type="object" interface="wl_surface" summary="surface that lost keyboard focus"/>
@@ -2448,6 +2521,15 @@
If this event produces a change in modifiers, then the resulting
wl_keyboard.modifiers event must be sent after this event.
+
+ In the wl_keyboard logical state, this event adds the key to the keys
+ currently logically down (if the state argument is pressed) or removes
+ the key from the keys currently logically down (if the state argument is
+ released). The compositor must not send this event if the wl_keyboard
+ did not have an active surface immediately before this event. The
+ compositor must not send this event if state is pressed (resp. released)
+ and the key was already logically down (resp. was not logically down)
+ immediately before this event.
</description>
<arg name="serial" type="uint" summary="serial number of the key event"/>
<arg name="time" type="uint" summary="timestamp with millisecond granularity"/>
@@ -2459,6 +2541,17 @@
<description summary="modifier and group state">
Notifies clients that the modifier and/or group state has
changed, and it should update its local state.
+
+ The compositor may send this event without a surface of the client
+ having keyboard focus, for example to tie modifier information to
+ pointer focus instead. If a modifier event with pressed modifiers is sent
+ without a prior enter event, the client can assume the modifier state is
+ valid until it receives the next wl_keyboard.modifiers event. In order to
+ reset the modifier state again, the compositor can send a
+ wl_keyboard.modifiers event with no pressed modifiers.
+
+ In the wl_keyboard logical state, this event updates the modifiers and
+ group.
</description>
<arg name="serial" type="uint" summary="serial number of the modifiers event"/>
<arg name="mods_depressed" type="uint" summary="depressed modifiers"/>
@@ -2566,6 +2659,8 @@
currently active on this client's surface. The client is
responsible for finalizing the touch points, future touch points on
this surface may reuse the touch point ID.
+
+ No frame event is required after the cancel event.
</description>
</event>
@@ -2665,10 +2760,9 @@
</enum>
<enum name="transform">
- <description summary="transform from framebuffer to output">
- This describes the transform that a compositor will apply to a
- surface to compensate for the rotation or mirroring of an
- output device.
+ <description summary="transformation applied to buffer contents">
+ This describes transformations that clients and compositors apply to
+ buffer contents.
The flipped values correspond to an initial flip around a
vertical axis followed by rotation.
@@ -2700,6 +2794,10 @@
The geometry event will be followed by a done event (starting from
version 2).
+ Clients should use wl_surface.preferred_buffer_transform instead of the
+ transform advertised by this event to find the preferred buffer
+ transform to use for a surface.
+
Note: wl_output only advertises partial information about the output
position and identification. Some compositors, for instance those not
implementing a desktop-style output layout or those exposing virtual
@@ -2722,7 +2820,7 @@
<arg name="model" type="string"
summary="textual description of the model"/>
<arg name="transform" type="int" enum="transform"
- summary="transform that maps framebuffer to output"/>
+ summary="additional transformation applied to buffer contents during presentation"/>
</event>
<enum name="mode" bitfield="true">
@@ -2795,8 +2893,9 @@
This event contains scaling geometry information
that is not in the geometry event. It may be sent after
binding the output object or if the output scale changes
- later. If it is not sent, the client should assume a
- scale of 1.
+ later. The compositor will emit a non-zero, positive
+ value for scale. If it is not sent, the client should
+ assume a scale of 1.
A scale larger than 1 means that the compositor will
automatically scale surface buffers by this amount
@@ -2804,12 +2903,9 @@
displays where applications rendering at the native
resolution would be too small to be legible.
- It is intended that scaling aware clients track the
- current output of a surface, and if it is on a scaled
- output it should use wl_surface.set_buffer_scale with
- the scale of the output. That way the compositor can
- avoid scaling the surface, and the client can supply
- a higher detail image.
+ Clients should use wl_surface.preferred_buffer_scale
+ instead of this event to find the preferred buffer
+ scale to use for a surface.
The scale event will be followed by a done event.
</description>
@@ -3035,6 +3131,11 @@
If the parent wl_surface object is destroyed, the sub-surface is
unmapped.
+
+ A sub-surface never has the keyboard focus of any seat.
+
+ The wl_surface.offset request is ignored: clients must use set_position
+ instead to move the sub-surface.
</description>
<request name="destroy" type="destructor">
@@ -3060,9 +3161,7 @@
surface area. Negative values are allowed.
The scheduled coordinates will take effect whenever the state of the
- parent surface is applied. When this happens depends on whether the
- parent surface is in synchronized mode or not. See
- wl_subsurface.set_sync and wl_subsurface.set_desync for details.
+ parent surface is applied.
If more than one set_position request is invoked by the client before
the commit of the parent surface, the position of a new request always
@@ -3085,9 +3184,7 @@
The z-order is double-buffered. Requests are handled in order and
applied immediately to a pending state. The final pending state is
copied to the active state the next time the state of the parent
- surface is applied. When this happens depends on whether the parent
- surface is in synchronized mode or not. See wl_subsurface.set_sync and
- wl_subsurface.set_desync for details.
+ surface is applied.
A new sub-surface is initially added as the top-most in the stack
of its siblings and parent.
--
cgit v1.2.3

View File

@ -10,7 +10,7 @@
Summary: Qt6 - WebChannel component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -124,6 +124,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -11,6 +11,8 @@
%global use_system_ffmpeg 1
%global python3_pkgversion 3.12
%global __python3 %{_bindir}/python%{python3_pkgversion}
# Build with system libvpx is broken at the moment
#if 0%{?rhel} == 8
@ -64,7 +66,7 @@
Summary: Qt6 - QtWebEngine components
Name: qt6-qtwebengine
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
%global majmin %(echo %{version} | cut -d. -f1-2)
@ -143,13 +145,9 @@ BuildRequires: flex elfutils
%if %{with clang}
BuildRequires: clang >= 19.0
%else
%if 0%{?rhel} && 0%{?rhel} < 10
BuildRequires: gcc-toolset-14-gcc-plugin-annobin
BuildRequires: gcc-toolset-14-libatomic-devel
BuildRequires: gcc-toolset-14-gcc-c++
%else
BuildRequires: gcc-c++ gcc
%endif
%endif
# gn links statically (for now)
BuildRequires: libstdc++-static
@ -227,7 +225,7 @@ BuildRequires: pkgconfig(lcms2)
BuildRequires: pkgconfig(xkbcommon)
BuildRequires: pkgconfig(xkbfile)
BuildRequires: pkgconfig(xshmfence)
BuildRequires: python3-html5lib
%if 0%{?use_system_tiff}
BuildRequires: pkgconfig(libtiff-4) >= 4.2.0
%endif
@ -243,13 +241,11 @@ BuildRequires: pkgconfig(opus)
%endif
BuildRequires: perl-interpreter
BuildRequires: python(abi) >= 3.11
%if 0%{?rhel} <= 9
BuildRequires: python3.11-html5lib
BuildRequires: python3.11-rpm-macros
%global __python3 %{_bindir}/python3.11
%endif
BuildRequires: python(abi) >= %{python3_pkgversion}
BuildRequires: python%{python3_pkgversion}-html5lib
BuildRequires: python%{python3_pkgversion}-rpm-macros
%if 0%{?use_system_libvpx}
BuildRequires: pkgconfig(vpx) >= 1.12.0
@ -540,9 +536,7 @@ export LDFLAGS="-L/opt/rx/%{_lib}/ -Wl,-rpath=/opt/rx/%{_lib}/ %{__global_ldflag
%{?use_system_re2:-DQT_FEATURE_webengine_system_re2:BOOL=ON} \
%{?use_system_libwebp:-DQT_FEATURE_webengine_system_libwebp:BOOL=ON} \
-DQT_BUILD_EXAMPLES:BOOL=OFF \
%if 0%{?rhel} <= 9
-DPython3_EXECUTABLE:FILEPATH=%{_bindir}/python3.11 \
%endif
-DPython3_EXECUTABLE:FILEPATH=%{__python3} \
-DFEATURE_webengine_system_ninja:BOOL=ON \
-DFEATURE_webengine_vulkan:BOOL=ON \
-DFEATURE_pdf_v8:BOOL=ON \
@ -621,6 +615,7 @@ rm -fr %{buildroot}%{_qt6_libdir}/cmake/Qt6BuildInternals
%{_qt6_libdir}/qt6/metatypes/*.json
%{_qt6_libdir}/qt6/modules/*.json
%{_qt6_libdir}/qt6/sbom/%{qt_module}-*.spdx
%{_qt6_libdir}/qt6/sbom/qtpdf-*.spdx
%{_libdir}/pkgconfig/Qt6*.pc
%files devtools
@ -628,6 +623,12 @@ rm -fr %{buildroot}%{_qt6_libdir}/cmake/Qt6BuildInternals
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Jan 21 2025 Raven <raven@sysadmins.ws> - 6.8.1-2
- rebuild (ffmpeg)
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -0,0 +1,574 @@
From 6e554a30893150793c2638e3689cf208ffc8e375 Mon Sep 17 00:00:00 2001
From: Dale Curtis <dalecurtis@chromium.org>
Date: Sat, 2 Apr 2022 05:13:53 +0000
Subject: [PATCH] Roll src/third_party/ffmpeg/ 574c39cce..32b2d1d526 (1125
commits)
https://chromium.googlesource.com/chromium/third_party/ffmpeg.git/+log/574c39cce323..32b2d1d526
Created with:
roll-dep src/third_party/ffmpeg
Fixed: 1293918
Cq-Include-Trybots: luci.chromium.try:mac_chromium_asan_rel_ng,linux_chromium_asan_rel_ng,linux_chromium_chromeos_asan_rel_ng
Change-Id: I41945d0f963e3d1f65940067bac22f63b68e37d2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3565647
Auto-Submit: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/main@{#988253}
---
.../clear_key_cdm/ffmpeg_cdm_audio_decoder.cc | 29 ++++++++++---------
media/ffmpeg/ffmpeg_common.cc | 11 +++----
media/filters/audio_file_reader.cc | 9 +++---
media/filters/audio_file_reader_unittest.cc | 6 ++--
.../filters/audio_video_metadata_extractor.cc | 11 +++++--
.../filters/ffmpeg_aac_bitstream_converter.cc | 7 +++--
...ffmpeg_aac_bitstream_converter_unittest.cc | 2 +-
media/filters/ffmpeg_audio_decoder.cc | 13 +++++----
8 files changed, 51 insertions(+), 37 deletions(-)
diff --git a/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc b/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
index c535d2b..62ddbc8 100644
--- a/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
+++ b/src/3rdparty/chromium/media/cdm/library_cdm/clear_key_cdm/ffmpeg_cdm_audio_decoder.cc
@@ -74,7 +74,7 @@ void CdmAudioDecoderConfigToAVCodecContext(
codec_context->sample_fmt = AV_SAMPLE_FMT_NONE;
}
- codec_context->channels = config.channel_count;
+ codec_context->ch_layout.nb_channels = config.channel_count;
codec_context->sample_rate = config.samples_per_second;
if (config.extra_data) {
@@ -124,8 +124,8 @@ void CopySamples(cdm::AudioFormat cdm_format,
case cdm::kAudioFormatPlanarS16:
case cdm::kAudioFormatPlanarF32: {
const int decoded_size_per_channel =
- decoded_audio_size / av_frame.channels;
- for (int i = 0; i < av_frame.channels; ++i) {
+ decoded_audio_size / av_frame.ch_layout.nb_channels;
+ for (int i = 0; i < av_frame.ch_layout.nb_channels; ++i) {
memcpy(output_buffer, av_frame.extended_data[i],
decoded_size_per_channel);
output_buffer += decoded_size_per_channel;
@@ -185,13 +185,14 @@ bool FFmpegCdmAudioDecoder::Initialize(
// Success!
decoding_loop_ = std::make_unique<FFmpegDecodingLoop>(codec_context_.get());
samples_per_second_ = config.samples_per_second;
- bytes_per_frame_ = codec_context_->channels * config.bits_per_channel / 8;
+ bytes_per_frame_ =
+ codec_context_->ch_layout.nb_channels * config.bits_per_channel / 8;
output_timestamp_helper_ =
std::make_unique<AudioTimestampHelper>(config.samples_per_second);
is_initialized_ = true;
// Store initial values to guard against midstream configuration changes.
- channels_ = codec_context_->channels;
+ channels_ = codec_context_->ch_layout.nb_channels;
av_sample_format_ = codec_context_->sample_fmt;
return true;
@@ -291,7 +292,8 @@ cdm::Status FFmpegCdmAudioDecoder::DecodeBuffer(
for (auto& frame : audio_frames) {
int decoded_audio_size = 0;
if (frame->sample_rate != samples_per_second_ ||
- frame->channels != channels_ || frame->format != av_sample_format_) {
+ frame->ch_layout.nb_channels != channels_ ||
+ frame->format != av_sample_format_) {
DLOG(ERROR) << "Unsupported midstream configuration change!"
<< " Sample Rate: " << frame->sample_rate << " vs "
<< samples_per_second_
@@ -302,7 +304,7 @@ cdm::Status FFmpegCdmAudioDecoder::DecodeBuffer(
}
decoded_audio_size = av_samples_get_buffer_size(
- nullptr, codec_context_->channels, frame->nb_samples,
+ nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
codec_context_->sample_fmt, 1);
if (!decoded_audio_size)
continue;
@@ -322,7 +324,7 @@ bool FFmpegCdmAudioDecoder::OnNewFrame(
std::vector<std::unique_ptr<AVFrame, ScopedPtrAVFreeFrame>>* audio_frames,
AVFrame* frame) {
*total_size += av_samples_get_buffer_size(
- nullptr, codec_context_->channels, frame->nb_samples,
+ nullptr, codec_context_->ch_layout.nb_channels, frame->nb_samples,
codec_context_->sample_fmt, 1);
audio_frames->emplace_back(av_frame_clone(frame));
return true;
diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
index 2665355..910f9ad 100644
--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
+++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
@@ -336,10 +336,11 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
codec_context->sample_fmt, codec_context->codec_id);
ChannelLayout channel_layout =
- codec_context->channels > 8
+ codec_context->ch_layout.nb_channels > 8
? CHANNEL_LAYOUT_DISCRETE
- : ChannelLayoutToChromeChannelLayout(codec_context->channel_layout,
- codec_context->channels);
+ : ChannelLayoutToChromeChannelLayout(
+ codec_context->ch_layout.u.mask,
+ codec_context->ch_layout.nb_channels);
switch (codec) {
// For AC3/EAC3 we enable only demuxing, but not decoding, so FFmpeg does
@@ -391,7 +392,7 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
extra_data, encryption_scheme, seek_preroll,
codec_context->delay);
if (channel_layout == CHANNEL_LAYOUT_DISCRETE)
- config->SetChannelsForDiscrete(codec_context->channels);
+ config->SetChannelsForDiscrete(codec_context->ch_layout.nb_channels);
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
// These are bitstream formats unknown to ffmpeg, so they don't have
@@ -460,7 +461,7 @@ void AudioDecoderConfigToAVCodecContext(const AudioDecoderConfig& config,
// TODO(scherkus): should we set |channel_layout|? I'm not sure if FFmpeg uses
// said information to decode.
- codec_context->channels = config.channels();
+ codec_context->ch_layout.nb_channels = config.channels();
codec_context->sample_rate = config.samples_per_second();
if (config.extra_data().empty()) {
diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc
index 777eabc..2b58dd7 100644
--- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc
+++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc
@@ -113,14 +113,15 @@ bool AudioFileReader::OpenDecoder() {
// Verify the channel layout is supported by Chrome. Acts as a sanity check
// against invalid files. See http://crbug.com/171962
- if (ChannelLayoutToChromeChannelLayout(codec_context_->channel_layout,
- codec_context_->channels) ==
+ if (ChannelLayoutToChromeChannelLayout(
+ codec_context_->ch_layout.u.mask,
+ codec_context_->ch_layout.nb_channels) ==
CHANNEL_LAYOUT_UNSUPPORTED) {
return false;
}
// Store initial values to guard against midstream configuration changes.
- channels_ = codec_context_->channels;
+ channels_ = codec_context_->ch_layout.nb_channels;
audio_codec_ = CodecIDToAudioCodec(codec_context_->codec_id);
sample_rate_ = codec_context_->sample_rate;
av_sample_format_ = codec_context_->sample_fmt;
@@ -223,7 +224,7 @@ bool AudioFileReader::OnNewFrame(
if (frames_read < 0)
return false;
- const int channels = frame->channels;
+ const int channels = frame->ch_layout.nb_channels;
if (frame->sample_rate != sample_rate_ || channels != channels_ ||
frame->format != av_sample_format_) {
DLOG(ERROR) << "Unsupported midstream configuration change!"
diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc
index 76b41aa..e26b6cd 100644
--- a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc
+++ b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter.cc
@@ -195,14 +195,15 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
if (!header_generated_ || codec_ != stream_codec_parameters_->codec_id ||
audio_profile_ != stream_codec_parameters_->profile ||
sample_rate_index_ != sample_rate_index ||
- channel_configuration_ != stream_codec_parameters_->channels ||
+ channel_configuration_ !=
+ stream_codec_parameters_->ch_layout.nb_channels ||
frame_length_ != header_plus_packet_size) {
header_generated_ =
GenerateAdtsHeader(stream_codec_parameters_->codec_id,
0, // layer
stream_codec_parameters_->profile, sample_rate_index,
0, // private stream
- stream_codec_parameters_->channels,
+ stream_codec_parameters_->ch_layout.nb_channels,
0, // originality
0, // home
0, // copyrighted_stream
@@ -214,7 +215,7 @@ bool FFmpegAACBitstreamConverter::ConvertPacket(AVPacket* packet) {
codec_ = stream_codec_parameters_->codec_id;
audio_profile_ = stream_codec_parameters_->profile;
sample_rate_index_ = sample_rate_index;
- channel_configuration_ = stream_codec_parameters_->channels;
+ channel_configuration_ = stream_codec_parameters_->ch_layout.nb_channels;
frame_length_ = header_plus_packet_size;
}
diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
index 3b46f7f..1897eb0 100644
--- a/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
+++ b/src/3rdparty/chromium/media/filters/ffmpeg_aac_bitstream_converter_unittest.cc
@@ -34,7 +34,7 @@ class FFmpegAACBitstreamConverterTest : public testing::Test {
memset(&test_parameters_, 0, sizeof(AVCodecParameters));
test_parameters_.codec_id = AV_CODEC_ID_AAC;
test_parameters_.profile = FF_PROFILE_AAC_MAIN;
- test_parameters_.channels = 2;
+ test_parameters_.ch_layout.nb_channels = 2;
test_parameters_.extradata = extradata_header_;
test_parameters_.extradata_size = sizeof(extradata_header_);
}
diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc
index bf3ed00..d564ee9 100644
--- a/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc
+++ b/src/3rdparty/chromium/media/filters/ffmpeg_audio_decoder.cc
@@ -29,7 +29,7 @@ namespace media {
// Return the number of channels from the data in |frame|.
static inline int DetermineChannels(AVFrame* frame) {
- return frame->channels;
+ return frame->ch_layout.nb_channels;
}
// Called by FFmpeg's allocation routine to allocate a buffer. Uses
@@ -243,7 +243,7 @@ bool FFmpegAudioDecoder::OnNewFrame(const DecoderBuffer& buffer,
// Translate unsupported into discrete layouts for discrete configurations;
// ffmpeg does not have a labeled discrete configuration internally.
ChannelLayout channel_layout = ChannelLayoutToChromeChannelLayout(
- codec_context_->channel_layout, codec_context_->channels);
+ codec_context_->ch_layout.u.mask, codec_context_->ch_layout.nb_channels);
if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED &&
config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE) {
channel_layout = CHANNEL_LAYOUT_DISCRETE;
@@ -360,11 +360,11 @@ bool FFmpegAudioDecoder::ConfigureDecoder(const AudioDecoderConfig& config) {
// Success!
av_sample_format_ = codec_context_->sample_fmt;
- if (codec_context_->channels != config.channels()) {
+ if (codec_context_->ch_layout.nb_channels != config.channels()) {
MEDIA_LOG(ERROR, media_log_)
<< "Audio configuration specified " << config.channels()
<< " channels, but FFmpeg thinks the file contains "
- << codec_context_->channels << " channels";
+ << codec_context_->ch_layout.nb_channels << " channels";
ReleaseFFmpegResources();
state_ = DecoderState::kUninitialized;
return false;
@@ -415,7 +415,7 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
if (frame->nb_samples <= 0)
return AVERROR(EINVAL);
- if (s->channels != channels) {
+ if (s->ch_layout.nb_channels != channels) {
DLOG(ERROR) << "AVCodecContext and AVFrame disagree on channel count.";
return AVERROR(EINVAL);
}
@@ -448,7 +448,8 @@ int FFmpegAudioDecoder::GetAudioBuffer(struct AVCodecContext* s,
ChannelLayout channel_layout =
config_.channel_layout() == CHANNEL_LAYOUT_DISCRETE
? CHANNEL_LAYOUT_DISCRETE
- : ChannelLayoutToChromeChannelLayout(s->channel_layout, s->channels);
+ : ChannelLayoutToChromeChannelLayout(s->ch_layout.u.mask,
+ s->ch_layout.nb_channels);
if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
DLOG(ERROR) << "Unsupported channel layout.";
commit 62274859104bd828373ae406aa9309e610449ac5
Author: Ted Meyer <tmathmeyer@chromium.org>
Date: Fri Mar 22 19:56:55 2024 +0000
Replace deprecated use of AVCodecContext::reordered_opaque
We can use the AV_CODEC_FLAG_COPY_OPAQUE flag on the codec context
now to trigger timestamp propagation.
Bug: 330573128
Change-Id: I6bc57241a35ab5283742aad8d42acb4dc5e85858
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5384308
Commit-Queue: Ted (Chromium) Meyer <tmathmeyer@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1277051}
diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
index 910f9ad..8be165c 100644
--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
+++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_common.cc
@@ -411,7 +411,9 @@ bool AVCodecContextToAudioDecoderConfig(const AVCodecContext* codec_context,
// TODO(dalecurtis): Just use the profile from the codec context if ffmpeg
// ever starts supporting xHE-AAC.
- if (codec_context->profile == FF_PROFILE_UNKNOWN) {
+ constexpr uint8_t kXHEAAc = 41;
+ if (codec_context->profile == FF_PROFILE_UNKNOWN ||
+ codec_context->profile == kXHEAAc) {
// Errors aren't fatal here, so just drop any MediaLog messages.
NullMediaLog media_log;
mp4::AAC aac_parser;
diff --git a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
index 05dcb1c..866f446 100644
--- a/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
+++ b/src/3rdparty/chromium/media/ffmpeg/ffmpeg_regression_tests.cc
@@ -90,16 +90,16 @@ FFMPEG_TEST_CASE(Cr62127,
PIPELINE_ERROR_DECODE,
PIPELINE_ERROR_DECODE);
FFMPEG_TEST_CASE(Cr93620, "security/93620.ogg", PIPELINE_OK, PIPELINE_OK);
-FFMPEG_TEST_CASE(Cr100492,
- "security/100492.webm",
- DECODER_ERROR_NOT_SUPPORTED,
- DECODER_ERROR_NOT_SUPPORTED);
+FFMPEG_TEST_CASE(Cr100492, "security/100492.webm", PIPELINE_OK, PIPELINE_OK);
FFMPEG_TEST_CASE(Cr100543, "security/100543.webm", PIPELINE_OK, PIPELINE_OK);
FFMPEG_TEST_CASE(Cr101458,
"security/101458.webm",
PIPELINE_ERROR_DECODE,
PIPELINE_ERROR_DECODE);
-FFMPEG_TEST_CASE(Cr108416, "security/108416.webm", PIPELINE_OK, PIPELINE_OK);
+FFMPEG_TEST_CASE(Cr108416,
+ "security/108416.webm",
+ PIPELINE_ERROR_DECODE,
+ PIPELINE_ERROR_DECODE);
FFMPEG_TEST_CASE(Cr110849,
"security/110849.mkv",
DEMUXER_ERROR_COULD_NOT_OPEN,
@@ -154,7 +154,10 @@ FFMPEG_TEST_CASE(Cr234630b,
"security/234630b.mov",
DEMUXER_ERROR_NO_SUPPORTED_STREAMS,
DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
-FFMPEG_TEST_CASE(Cr242786, "security/242786.webm", PIPELINE_OK, PIPELINE_OK);
+FFMPEG_TEST_CASE(Cr242786,
+ "security/242786.webm",
+ PIPELINE_OK,
+ PIPELINE_ERROR_DECODE);
// Test for out-of-bounds access with slightly corrupt file (detection logic
// thinks it's a MONO file, but actually contains STEREO audio).
FFMPEG_TEST_CASE(Cr275590,
@@ -372,8 +375,8 @@ FFMPEG_TEST_CASE(WEBM_2,
DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
FFMPEG_TEST_CASE(WEBM_4,
"security/out.webm.68798.1929",
- DECODER_ERROR_NOT_SUPPORTED,
- DECODER_ERROR_NOT_SUPPORTED);
+ PIPELINE_OK,
+ PIPELINE_OK);
FFMPEG_TEST_CASE(WEBM_5, "frame_size_change.webm", PIPELINE_OK, PIPELINE_OK);
// General MKV test cases.
diff --git a/src/3rdparty/chromium/media/filters/audio_decoder_unittest.cc b/src/3rdparty/chromium/media/filters/audio_decoder_unittest.cc
index a7b2533..ba3c308 100644
--- a/src/3rdparty/chromium/media/filters/audio_decoder_unittest.cc
+++ b/src/3rdparty/chromium/media/filters/audio_decoder_unittest.cc
@@ -484,7 +484,7 @@ constexpr TestParams kXheAacTestParams[] = {
}},
0,
29400,
- CHANNEL_LAYOUT_MONO,
+ CHANNEL_LAYOUT_UNSUPPORTED,
AudioCodecProfile::kXHE_AAC},
#endif
{AudioCodec::kAAC,
diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader.cc b/src/3rdparty/chromium/media/filters/audio_file_reader.cc
index 2b58dd7..9d37f32 100644
--- a/src/3rdparty/chromium/media/filters/audio_file_reader.cc
+++ b/src/3rdparty/chromium/media/filters/audio_file_reader.cc
@@ -243,18 +243,10 @@ bool AudioFileReader::OnNewFrame(
// silence from being output. In the case where we are also discarding some
// portion of the packet (as indicated by a negative pts), we further want to
// adjust the duration downward by however much exists before zero.
-#if BUILDFLAG(USE_SYSTEM_FFMPEG)
- if (audio_codec_ == AudioCodec::kAAC && frame->pkt_duration) {
-#else
if (audio_codec_ == AudioCodec::kAAC && frame->duration) {
-#endif // BUILDFLAG(USE_SYSTEM_FFMPEG)
const base::TimeDelta pkt_duration = ConvertFromTimeBase(
glue_->format_context()->streams[stream_index_]->time_base,
-#if BUILDFLAG(USE_SYSTEM_FFMPEG)
- frame->pkt_duration + std::min(static_cast<int64_t>(0), frame->pts));
-#else
frame->duration + std::min(static_cast<int64_t>(0), frame->pts));
-#endif // BUILDFLAG(USE_SYSTEM_FFMPEG)
const base::TimeDelta frame_duration =
base::Seconds(frames_read / static_cast<double>(sample_rate_));
diff --git a/src/3rdparty/chromium/media/filters/audio_file_reader_unittest.cc b/src/3rdparty/chromium/media/filters/audio_file_reader_unittest.cc
index a1c633d..5784fe1 100644
--- a/src/3rdparty/chromium/media/filters/audio_file_reader_unittest.cc
+++ b/src/3rdparty/chromium/media/filters/audio_file_reader_unittest.cc
@@ -61,15 +61,14 @@ class AudioFileReaderTest : public testing::Test {
// Verify packets are consistent across demuxer runs. Reads the first few
// packets and then seeks back to the start timestamp and verifies that the
// hashes match on the packets just read.
- void VerifyPackets() {
- const int kReads = 3;
+ void VerifyPackets(int packet_reads) {
const int kTestPasses = 2;
AVPacket packet;
base::TimeDelta start_timestamp;
std::vector<std::string> packet_md5_hashes_;
for (int i = 0; i < kTestPasses; ++i) {
- for (int j = 0; j < kReads; ++j) {
+ for (int j = 0; j < packet_reads; ++j) {
ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
// On the first pass save the MD5 hash of each packet, on subsequent
@@ -98,7 +97,8 @@ class AudioFileReaderTest : public testing::Test {
int sample_rate,
base::TimeDelta duration,
int frames,
- int expected_frames) {
+ int expected_frames,
+ int packet_reads = 3) {
Initialize(fn);
ASSERT_TRUE(reader_->Open());
EXPECT_EQ(channels, reader_->channels());
@@ -112,7 +112,7 @@ class AudioFileReaderTest : public testing::Test {
EXPECT_EQ(reader_->HasKnownDuration(), false);
}
if (!packet_verification_disabled_)
- ASSERT_NO_FATAL_FAILURE(VerifyPackets());
+ ASSERT_NO_FATAL_FAILURE(VerifyPackets(packet_reads));
ReadAndVerify(hash, expected_frames);
}
@@ -219,7 +219,7 @@ TEST_F(AudioFileReaderTest, AAC_ADTS) {
}
TEST_F(AudioFileReaderTest, MidStreamConfigChangesFail) {
- RunTestFailingDecode("midstream_config_change.mp3", 42624);
+ RunTestFailingDecode("midstream_config_change.mp3", 0);
}
#endif
@@ -229,7 +229,7 @@ TEST_F(AudioFileReaderTest, VorbisInvalidChannelLayout) {
TEST_F(AudioFileReaderTest, WaveValidFourChannelLayout) {
RunTest("4ch.wav", "131.71,38.02,130.31,44.89,135.98,42.52,", 4, 44100,
- base::Microseconds(100001), 4411, 4410);
+ base::Microseconds(100001), 4411, 4410, /*packet_reads=*/2);
}
TEST_F(AudioFileReaderTest, ReadPartialMP3) {
diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc
index e62b2af..ab39796 100644
--- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc
+++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.cc
@@ -125,7 +125,7 @@ bool FFmpegVideoDecoder::IsCodecSupported(VideoCodec codec) {
}
FFmpegVideoDecoder::FFmpegVideoDecoder(MediaLog* media_log)
- : media_log_(media_log) {
+ : media_log_(media_log), timestamp_map_(128) {
DVLOG(1) << __func__;
DETACH_FROM_SEQUENCE(sequence_checker_);
}
@@ -204,10 +204,6 @@ int FFmpegVideoDecoder::GetVideoBuffer(struct AVCodecContext* codec_context,
frame->linesize[plane] = layout->planes()[plane].stride;
}
- // This seems unsafe, given threaded decoding. However, `reordered_opaque` is
- // also going away upstream, so we need a whole new mechanism either way.
- frame->reordered_opaque = codec_context->reordered_opaque;
-
// This will be freed by `ReleaseVideoBufferImpl`.
auto* opaque = new OpaqueData(fb_priv, frame_pool_, data, allocation_size,
std::move(*layout));
@@ -354,8 +350,10 @@ bool FFmpegVideoDecoder::FFmpegDecode(const DecoderBuffer& buffer) {
DCHECK(packet->data);
DCHECK_GT(packet->size, 0);
- // Let FFmpeg handle presentation timestamp reordering.
- codec_context_->reordered_opaque = buffer.timestamp().InMicroseconds();
+ const int64_t timestamp = buffer.timestamp().InMicroseconds();
+ const TimestampId timestamp_id = timestamp_id_generator_.GenerateNextId();
+ timestamp_map_.Put(std::make_pair(timestamp_id, timestamp));
+ packet->opaque = reinterpret_cast<void*>(timestamp_id.GetUnsafeValue());
}
FFmpegDecodingLoop::DecodeStatus decode_status = decoding_loop_->DecodePacket(
packet, base::BindRepeating(&FFmpegVideoDecoder::OnNewFrame,
@@ -414,7 +412,12 @@ bool FFmpegVideoDecoder::OnNewFrame(AVFrame* frame) {
}
gfx::Size natural_size = aspect_ratio.GetNaturalSize(visible_rect);
- const auto pts = base::Microseconds(frame->reordered_opaque);
+ const auto ts_id = TimestampId(reinterpret_cast<size_t>(frame->opaque));
+ const auto ts_lookup = timestamp_map_.Get(ts_id);
+ if (ts_lookup == timestamp_map_.end()) {
+ return false;
+ }
+ const auto pts = base::Microseconds(std::get<1>(*ts_lookup));
auto video_frame = VideoFrame::WrapExternalDataWithLayout(
opaque->layout, visible_rect, natural_size, opaque->data, opaque->size,
pts);
@@ -489,8 +492,10 @@ bool FFmpegVideoDecoder::ConfigureDecoder(const VideoDecoderConfig& config,
codec_context_->thread_count = GetFFmpegVideoDecoderThreadCount(config);
codec_context_->thread_type =
FF_THREAD_SLICE | (low_delay ? 0 : FF_THREAD_FRAME);
+
codec_context_->opaque = this;
codec_context_->get_buffer2 = GetVideoBufferImpl;
+ codec_context_->flags |= AV_CODEC_FLAG_COPY_OPAQUE;
if (decode_nalus_)
codec_context_->flags2 |= AV_CODEC_FLAG2_CHUNKS;
diff --git a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h
index 60cb9d5..4fa8628 100644
--- a/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h
+++ b/src/3rdparty/chromium/media/filters/ffmpeg_video_decoder.h
@@ -7,10 +7,12 @@
#include <memory>
+#include "base/containers/lru_cache.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/sequence_checker.h"
+#include "base/types/id_type.h"
#include "media/base/supported_video_decoder_config.h"
#include "media/base/video_decoder.h"
#include "media/base/video_decoder_config.h"
@@ -87,6 +89,20 @@ class MEDIA_EXPORT FFmpegVideoDecoder : public VideoDecoder {
// FFmpeg structures owned by this object.
std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
+ // The gist here is that timestamps need to be 64 bits to store microsecond
+ // precision. A 32 bit integer would overflow at ~35 minutes at this level of
+ // precision. We can't cast the timestamp to the void ptr object used by the
+ // opaque field in ffmpeg then, because it would lose data on a 32 bit build.
+ // However, we don't actually have 2^31 timestamped frames in a single
+ // playback, so it's fine to use the 32 bit value as a key in a map which
+ // contains the actual timestamps. Additionally, we've in the past set 128
+ // outstanding frames for re-ordering as a limit for cross-thread decoding
+ // tasks, so we'll do that here too with the LRU cache.
+ using TimestampId = base::IdType<int64_t, size_t, 0>;
+
+ TimestampId::Generator timestamp_id_generator_;
+ base::LRUCache<TimestampId, int64_t> timestamp_map_;
+
VideoDecoderConfig config_;
scoped_refptr<FrameBufferPool> frame_pool_;
diff --git a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
index f67718c..fe42aef 100644
--- a/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
+++ b/src/3rdparty/chromium/third_party/webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.cc
@@ -229,7 +229,6 @@ int H264DecoderImpl::AVGetBuffer2(AVCodecContext* context,
int total_size = y_size + 2 * uv_size;
av_frame->format = context->pix_fmt;
- av_frame->reordered_opaque = context->reordered_opaque;
// Create a VideoFrame object, to keep a reference to the buffer.
// TODO(nisse): The VideoFrame's timestamp and rotation info is not used.
@@ -377,8 +376,6 @@ int32_t H264DecoderImpl::Decode(const EncodedImage& input_image,
return WEBRTC_VIDEO_CODEC_ERROR;
}
packet->size = static_cast<int>(input_image.size());
- int64_t frame_timestamp_us = input_image.ntp_time_ms_ * 1000; // ms -> μs
- av_context_->reordered_opaque = frame_timestamp_us;
int result = avcodec_send_packet(av_context_.get(), packet.get());
@@ -395,10 +392,6 @@ int32_t H264DecoderImpl::Decode(const EncodedImage& input_image,
return WEBRTC_VIDEO_CODEC_ERROR;
}
- // We don't expect reordering. Decoded frame timestamp should match
- // the input one.
- RTC_DCHECK_EQ(av_frame_->reordered_opaque, frame_timestamp_us);
-
// TODO(sakal): Maybe it is possible to get QP directly from FFmpeg.
h264_bitstream_parser_.ParseBitstream(input_image);
absl::optional<int> qp = h264_bitstream_parser_.GetLastSliceQp();

View File

@ -10,7 +10,7 @@
Summary: Qt6 - WebSockets component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -118,6 +118,9 @@ popd
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -4,7 +4,7 @@
Summary: Qt6 - WebView component
Name: qt6-%{qt_module}
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
License: LGPL-3.0-only OR GPL-3.0-only WITH Qt-GPL-exception-1.0
@ -102,6 +102,9 @@ Requires: %{name}%{?_isa} = %{version}-%{release}
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1

View File

@ -1,6 +1,6 @@
Name: qt6
Version: 6.8.1
Version: 6.8.2
Release: 1%{?dist}
Summary: Qt6 meta package
License: GPL-3.0-only
@ -148,6 +148,9 @@ echo "- Qt6 devel meta package" > %{buildroot}%{_docdir}/qt6-devel/README
%changelog
* Sat Feb 1 2025 Raven <raven@sysadmins.ws> - 6.8.2-1
- 6.8.2
* Tue Dec 3 2024 Raven <raven@sysadmins.ws> - 6.8.1-1
- 6.8.1