Compare commits

..

84 Commits

Author SHA1 Message Date
6eb22ee7ae packaging: add Fedora 43
Change-Id: I1116c117b81f4da67f9ab939df3ae4749ab107a1
2025-11-01 11:25:38 -04:00
3b8c2139e4 cmake: update ZXING
Change-Id: I806af0e04409bb667f7db5243a4044182f650a33
2025-10-31 17:06:48 -04:00
3b5918ada8 update daemon
Change-Id: I109aeb3cc5ba458a92c4e66f2df1bec46d6fdd20
2025-10-31 16:42:44 -04:00
5095539829 cmake: update ZXING
Change-Id: I60e10b9d78e98aec4ae7fb91ef70c185d4123417
2025-10-30 15:02:05 -04:00
7e46154471 mainview: SIP: fix text overflow
* The component's size was never set, thus it's children's
  widths were unbound. This caused the text not to wrap at
  at the UI border.

GitLab: #1999
Change-Id: Ifb50b2124fd7a82e2e023398048215535fa9dd0b
2025-10-29 16:07:55 -04:00
bdbd2dc39f i18n: automatic bump
Change-Id: Ice95a2c79e4f9f1f716488660d1c8b45236d689a
2025-10-29 15:08:06 -04:00
c821877739 packaging: add Ubuntu 25.10
Change-Id: Ic0026fd300c8f5bbcf3a02d893049db2c783c83a
2025-10-28 17:06:24 -04:00
5b3c74dfc8 MessagesAdapter: simplify getFormattedTime
Change-Id: Ic7d511331d1b5f44f622b35843a57b730eec1884
2025-10-24 15:37:12 -04:00
c522c99ce0 About: cleanup
Change-Id: I7a57811146a7d9bf7dd1d8b10a15f12a3a9dc6ae
GitLab: https://git.jami.net/savoirfairelinux/jami-client-android/-/issues/1911
2025-10-23 15:49:14 -04:00
2e9714cacf CMakeLists: fix typo
GitLab: #2112
Change-Id: Icdf5a4302eaf55df1ac3a5e0fe7b1a5a7adc5027
2025-10-23 15:39:16 -04:00
69db0e8cfe update net.jami.Jami.metainfo.xml
Change-Id: I22721d2e2c9dcb2e687fad47ab1b93d533803981
2025-10-23 15:37:03 -04:00
1d0601bae0 gitignore: add cache folder
Change-Id: Iffecad180c0a619139dd015daab0f4578762599e
2025-10-23 15:22:47 -04:00
7d0a37a1e1 clang-format: update
Change-Id: Ifcfae82b340082a568c9653df2a76e3ffdbc21fd
2025-10-23 14:20:03 -04:00
95922b2bc9 vscode: cleanup settings
Change-Id: Ifc96cce2b9a99216fea424c9caa09d558641f3f3
2025-10-23 14:20:00 -04:00
37337ba1f6 misc: bump daemon
Change-Id: I12ca689396cf4400eb2839ac4b13c634d0c7fdc0
2025-10-22 18:07:31 -04:00
f7fc485224 About: cleanup
GitLab: https://git.jami.net/savoirfairelinux/jami-client-android/-/issues/1911

Change-Id: I85b8d579d88fcd8e106f956c2413987c297085f3
2025-10-09 05:06:10 -04:00
097f5263f8 src/libclient/api/interaction.h: localize call duration numbers
Change-Id: Icfcd977d9d4f54c628ff40b44a9e41b2876cb2c5
GitLab: #2105
2025-10-08 16:28:27 -04:00
c346e6391c CallViewContextMenu: fit contextmenu to items
GitLab: #2100
Change-Id: I03e4f60050891484737c5d9479919bff22e90e65
2025-10-08 15:10:43 -04:00
6251525e30 AudioSettingsPage: add advanced config options
Add combo boxes for users to select if they want to use system,
audioProcessor, auto, or off for their echo cancellation and noise
reduction configuration. Also add the ability to toggle voice activity
detection via a toggle switch.

Note: requires https://review.jami.net/c/jami-daemon/+/31960
patch for jami-daemon

GitLab: #2103
Change-Id: I1fc1e6752df601ee030719c8df67ce5166a61591
2025-10-08 13:27:07 -04:00
aa9e0d2746 AudioSettingsPage: hide manager for one option
Hide the audio manager when there's only one option (ex: coreaudio on
MacOS)

GitLab: #2104
Change-Id: Ie36de906997b5b834c98f2d42c2c53adb0ed1aa4
2025-10-08 12:57:38 -04:00
dce1dc2677 About: Add donate button in "About Jami" popup
Add button at the bottom : Donate / Contribute / Feedback
ref to https://jami.net/donate/

Gitlab: #1449
Change-Id: Ibbd4353d08abf6dca27d03cc02ffdfa02a9903d9
2025-10-08 12:50:00 -04:00
dfe81588bd tests: Skip tests that need Internet when there's none.
* tests/unittests/messageparser_unittest.cpp (ALinkIsParsedCorrectly)
(YoutubeLinkIsParsedCorrectly): Skip when there is no Internet.

Fixes: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1507>
Change-Id: I0a5b57cd82f93fd7edf3fbeb73fb3db5a04c628c
2025-10-08 11:39:35 -04:00
e59820eafc JamiStrings: localize numbers
Change-Id: I260f7321da47d3b5fc292cd3cdfdb44493bdf053
GitLab: #2105
2025-10-08 11:03:07 -04:00
addb7b93f0 CMakeLists.txt: cleanup
Change-Id: I7ab377d3eadfbd52c6191e8c18a83bb85e2bf26a
2025-10-08 11:02:15 -04:00
731e1f3acf conversationlistmodelbase.cpp: cleanup
Change-Id: Ib75824483d494d79adb0f633b8d7daa473079c32
2025-10-08 11:02:05 -04:00
d8f4c493bc messageparser_unittest.cpp: cleanup
Change-Id: I881ced37a1408518296401953607eef1116d891c
2025-10-06 16:39:36 -04:00
2e71d00c05 Misc: update metainfo for 20251003
Change-Id: I6c9fa5830a745d3afe35fae90a4f9f2b728b98f1
2025-10-03 13:05:48 -04:00
e7ebc6f04a misc: bump daemon
Change-Id: Ib0a185b252c6247fb063626f8ce8abb00c0efd37
2025-09-29 14:29:05 -04:00
2bc69b7306 PluginStoreListView: fix scrolling
Scrolling on the extensions page in setting was broken for smaller
window sizes.

GitLab: #2097
Change-Id: I63d3f3a3a927f75c3f499b7fe09486e3a7a854bd
2025-09-26 14:11:25 -04:00
a934cd1c70 src/libclient/api/interaction.h: translate call duration units
GitLab: #1979
Change-Id: I1f6bd06ef3c72cd395f45d8be40fa48f8df4022a
2025-09-25 17:01:53 -04:00
2d487c8adf donate: update URL address
Change-Id: I3e9b6117bc0e6842434cdd8924814ce23ff20b62
2025-09-25 16:12:25 -04:00
5771d07eb4 vscode: update settings
* use build/compile_commands.json
* use formatter from ms-vscode.cpptools
* disable configure on open to avoid vscode overriding CMake configuration

Change-Id: Ib890317c8c5be94fadff4f24032f967c089d7acf
2025-09-18 14:39:48 -04:00
f8d74fb170 snap: use core24 as base
In addition to migrating from core22 to core24 as the Jami snap's base,
this commits removes the install-pipewire-from-source.sh script, which
is no longer necessary, and adds the gpu-2404 interface, which will
hopefully reduce the likelihood of graphics hardware-related bugs in the
future (https://canonical.com/mir/docs/the-gpu-2404-snap-interface).

GitLab: #2095
Change-Id: I838553a8d3fc8e9731316458903901f7de617424
2025-09-17 09:59:21 -04:00
7a03b4d410 src/libclient/api/interaction.h: improve call duration format
Remove leading zeros. For example:
34m 05s → 34m 5s
15m 03s → 15m 3s

GitLab: #1979
Change-Id: I98922c3baa0ce35ce9d3ab8406a548328f8f0a0a
2025-09-16 18:59:19 -04:00
77a9b447f1 misc: bump daemon
Change-Id: Ic9c8c178e24e27bdc64b8f8009e8ee48472d89b3
2025-09-16 15:01:22 -04:00
98f868fb5e packaging: remove Debian 11
GitLab: #2082
Change-Id: I7e092df6269eb7abe0934d8a20e1a620e4d0fa8c
2025-09-16 14:30:53 -04:00
0ff0ee2bd8 packaging: add Debian 13
GitLab: #2082
Change-Id: I27157c6de6b029710248fe29ed5e0d6dac816f98
2025-09-16 14:30:53 -04:00
002af53f81 Metainfo: update screenshots
The screenshots seen on https://flathub.org/apps/net.jami.Jami are very
old. New screenshots are currently being made. For the time being,
screenshots should be updated to these somewhat newer ones for an
improved public appearance.

Screenshots can be previewed using the command:
gnome-software --show-metainfo extras/data/net.jami.Jami.metainfo.xml

Change-Id: Ieb03d13c7aee2bab624bdbeaac44868cd32f68dc
2025-09-16 14:11:54 -04:00
4289545f94 debian/control: remove obsolete dependency
GitLab: #2083
Change-Id: I5c67c4858896e8b36a12122c26ddf9c4a9f7ab21
2025-09-16 09:52:56 -04:00
bd3552a049 Metainfo.xml: update versions for new stable
Change-Id: I0c7e3c8a94c4c07de69ad25ec679f32c74b4b2e8
2025-09-12 14:30:24 -04:00
03bcd905e5 misc: bump daemon
Change-Id: I8afd7d7f2fde3b933906b95c2f06f104b0003459
2025-09-12 13:25:46 -04:00
9bfd149d45 Spelling: confrimLeaveGroup -> confirmLeaveGroup
Change-Id: I4451b9314cc40de5175da9257fcc9645ee481012
2025-09-12 11:28:35 -04:00
6c5ab1e483 JamiStrings: reword group and 1-to-1 leaving
Change-Id: I767f9f49f4e1ac46faef70804ff1bd71d0cb8acc
2025-09-11 16:44:51 -04:00
faba758254 conversation: add ended banner
Change-Id: I4e58f8da33a2776b6f2cdc15b4f8f11ad8f88482
2025-09-11 15:22:28 -04:00
d8f548261d conversation: add option remove one-to-one conversation
Change-Id: I44d2c69b99a5359f0fce0d6c134374c11efbd286
2025-09-11 15:22:28 -04:00
fe504827fa build: fix --debug option
The install.sh script's -d option and (therefore) the build.py script's
--debug option were broken by commit 22be4be864.

Change-Id: I165eb625735d93b5fb3a2a845387d29cc4f6c18a
2025-09-11 09:02:11 -04:00
ca02cf172a ImportFromDevicePage: allow confirm for all cases
Change-Id: Id4848a5d8f87a5d0321e7b13870bb717341db041
2025-09-10 12:18:51 -04:00
ba44b70f97 3rdparty: bump md4c
This reverts the change that was accidentally made in commit 22be4be864.

Change-Id: Id51fe4b8edafa57c1152872460a2f60ace222826
2025-09-09 09:53:54 -04:00
87e38c2bf5 misc: bump daemon
This fixes an issue where Jami was looking for ringtones in the wrong
directory and was therefore forced to fall back on the default one.

Change-Id: Iba64e839e75b7e6bf4210b6398dd5002dd4adf99
2025-09-08 17:01:56 -04:00
98a300d36f SettingMaterialButton: fix method name conflict
The call to click() in SettingMaterialButton used to send a custom
signal, but now that we are on Qt 6.8, it calls the underlying button's
click method, thus resulting in an infinite loop of clicks (which
eventually gets interrupted by the QML engine with a "Maximum call stack
exceeded" error).

GitLab: #2091
Change-Id: Id56c7f1b9d7cb302c7d3363d3b11dbd01cf938db
2025-09-08 12:58:59 -04:00
5ac31130d0 misc: bump daemon
Change-Id: I882b0e074ec7e1f780d112dcd9c1e543a9f67b40
2025-09-06 08:53:37 -04:00
9c11ec6233 update version name to "Atlas"
Change-Id: Ia399907ddc18a733ae5524a29a1067b0407dbb07
2025-09-06 08:51:49 -04:00
c9ab1a8e24 donations: schedule 2025 campaign
Set donation campaign from 15 September to 15 November

Change-Id: Ifee0ed347ab786fe0d20f1545bfb02563ac09541
2025-09-06 08:51:30 -04:00
76e1bd9eb1 resources: fix stale images
This patch skips disk caching for qrc images, so images
could be updated. Currently welcome background, welcome logo,
and plugin image resources are stored. Need to be investigated
as it should not be intended to store.

Change-Id: I800649278cdb38dc0a0c732d1d5ec0760a844137
2025-09-06 08:31:04 -04:00
ffb20d6767 update welcome images
Change-Id: I47c7045714787123395daaddb8708c8a8b47eb63
2025-09-05 15:48:21 -04:00
87e63724c3 packaging: fix Linux build
GitLab: #2090
Change-Id: I7621264bebb683ed06294d9bee0bf15bddf3f0cd
2025-09-04 16:41:52 -04:00
9fad769040 macOS: bump minimum version to 12
Set the minimum deployment target to macOS 12,
as required for Qt 6.8.

Change-Id: Idb3b551567c39889020663caa1e5735983e3d05e
2025-09-04 09:32:41 -04:00
4106b8c752 snap: fix runtime issues
This commit updates LD_LIBRARY_PATH and the gnome plug in snapcraft.yaml
in order to fix runtime issues that were introduced when switching from
core20 to core22 as the Jami snap's base. It also replaces the
deprecated project variable CRAFT_ARCH_TRIPLET by
CRAFT_ARCH_TRIPLET_BUILD_FOR as recommended in snap's documentation:
https://documentation.ubuntu.com/snapcraft/stable/reference/architectures/

GitLab: #2087
Change-Id: If14efb39979af3bddf5575dc7d0d9fd66c8d3ec2
2025-09-02 13:30:15 -04:00
fd6e733433 misc: bump daemon
Change-Id: I5cae20449c9e33c40870e72dd0d85b95464168d1
2025-09-02 12:58:19 -04:00
ee0a754b6a accountmodel: rename RingNS to Nameserver
Change-Id: Ib7c82c9188adac853933d5642a85068f688cfe80
2025-08-29 11:12:04 -04:00
9278919410 build: detect correct folder in single-arch
On macOS, contrib outputs are placed under
<arch>-apple-darwin<ver> for single-arch builds and
under apple-darwin<ver> for multi-arch builds. Adjust
detection so the client picks the right include path.

Change-Id: Ia9ae2bb7b1f0d6e42cb15364b1921e94f2602836
2025-08-28 14:01:46 -04:00
8c1b79a86c build: pass IGNORE_SYSTEM_LIB flag to client
Change-Id: I7d98d49d0f990b622545cbe7b31700b2d48c0ff2
2025-08-26 09:51:50 -04:00
3e6108f167 build: add option to ignore system libs detection
Change-Id: I5ffa696df4b36cd7a62c13931c1465eeab3dc8a3
2025-08-21 17:15:48 -04:00
22be4be864 build: use cmake instead autotools
Change-Id: I73657d7fb1cd70bb150eefc2e5e60a88d1259caf
2025-08-21 17:15:22 -04:00
bb359f851b homogenize variable name: answer → accept
Follow up to the https://review.jami.net/c/jami-client-qt/+/31410 patch.

Change-Id: I83b8d3d621ebfe8930e70ef0521ef95eb28ac092
2025-08-21 16:56:48 -04:00
36730480aa src/libclient/api/account.h: cleanup
Operation was canceled. → The operation was canceled by the user.
Please verify your connection. → Please verify your connection and try again.

Change-Id: I24222b0dfc143fe6ae975b29fcfda8d706ddde6a
2025-08-21 16:44:28 -04:00
e7d626a421 misc: bump daemon submodule
Change-Id: I8837fe66385a1ae8f520f65924cfb0db80c9e1cb
2025-08-20 16:11:56 -04:00
185869824a src/libclient/api/interaction.h: change call duration format
The application currently shows the call duration as minutes:seconds,
this commit aims to have the following format: 0d 1h 2m 3s.

Change displayed call duration to include days and hours if call is
longer than 60 minutes.

GitLab: #1979
Change-Id: If2759affd5fd1b3ad3687f037f542f4149aeda4d
2025-08-20 14:10:52 -04:00
9858891fea utilsadapter: remove Kazakh (kk) from RTL languages
The language "Kazakh (kk)" we have on Transifex corresponds to the cyrillic script, which is LTR. If we want to include the arabic script of Kazakh, we must request it on Transifex and then add the corresponding code to the QStringList object of RTL languages.

GitLab: #2080
Change-Id: I321e462a1d833ce2dc7466d72cb90adcad3358b8
2025-08-20 14:09:03 -04:00
be7ec378c8 PluginAdapter: Fix missing extension store
Function getValue() of AppSettingsManager expects type Settings::Key,
but was being give a string. PluginStoreListView was placed under
InstallManuallyView, otherwise overlay occurs.

GitLab: #2012
Change-Id: If7f1c1e15e80bdc44728ace85e914092bace263f
2025-08-20 09:54:35 -04:00
cbed58544f INSTALL.md: update document for Qt 6.8.3
Change-Id: Ia3de6bd6608fd0fedefa96d2b405367e6b0e047c
2025-08-19 15:28:35 -04:00
c642c1ddfa JamiStrings.qml, KeyboardShortcutTable.qml systemtray.cpp: answer → accept
Unify with JamiStrings.qml and other clients.

Change-Id: Ieb11c992f0721dba7ff288d82dd4644021627f37
2025-08-18 16:35:13 -04:00
aa8c1edbd4 packaging: remove Ubuntu 20.04 (EOL)
GitLab: #2083
Change-Id: Ic7846ff044312e58b4333afbe80b2d8bf4d38f21
2025-08-18 14:50:31 -04:00
2a28438275 connectioninfolistmodel.cpp: cleanup
Change-Id: Ia3a8e1402c8683b7945d85f7caaff97d12f30fff
2025-08-16 21:13:14 -04:00
92945ad29f JamiStrings: unify
https://review.jami.net/c/jami-client-android/+/30551
https://review.jami.net/c/jami-client-ios/+/31199
https://review.jami.net/c/jami-client-ios/+/31247
https://review.jami.net/c/jami-docs/+/31201

all time → any time

GitLab: #2026

Change-Id: I98dcc928c33d7a30a477dfb96a9bfe141bfc2a40
2025-08-15 18:32:04 -04:00
c22260fb20 libclient: remove unused archive pin
Change-Id: Ia7d01a35d30910583ae79c94dd748c93195ffb59
2025-08-15 16:21:31 -04:00
0163ad7da1 update daemon
Change-Id: I5711f7ce3a2105a821f4d0bdb17794cb208b0cbb
2025-08-15 15:51:46 -04:00
becd7ac144 OpenDHTSettings: add proxy address/list options
- Display whether or not proxy is enabled. When enabled, current proxy
  address is shown
- Radio button selection for proxy address or proxy list url.
  Selectable regardless of enableProxy state
- JamiRadioButton.qml: radio button implemented using non-visual qt
  quick template

Change-Id: Ibf156b07b6a9a1ec535673aceb2b30e397731faf
2025-08-13 14:10:16 -04:00
8b19f733af MessageBarTextArea: fix broken spell check enabling
Enabling/disabling the spell checker is not respected until restarting
Jami. A forced check of Settings.EnableSpellCheck is needed.

GitLab: #2081
Change-Id: I0ab66c14e0b1a69df1caea494434f97e200dc278
2025-08-08 11:29:42 -04:00
25c9f0ef5c snap: use core22 as base
Use core22 (Ubuntu 22.04) instead of core20 (Ubuntu 20.04) as the base
for the snap build. This will allow us to stop building libqt-jami for
Ubuntu 20.04, which has reached its EOL.

The changes made in snapcraft.yaml are based on the following guide:
https://documentation.ubuntu.com/snapcraft/latest/how-to/change-bases/change-from-core20-to-core22/

GitLab: #1944
Change-Id: Ib1af9c28a1ca9d0c3b8e693c5b2e50fb6cbead64
2025-08-06 15:39:15 -04:00
f1895b31b8 Migrate from Qt 6.6.1 to 6.8.3
Qt 6.6 is EOL, certain UI components break when using 6.8.
- Fixed: Improper width issues on popup menus in wizard
- Fixed: Linked devices list missing entirely
- Fixed: Context menus broken: only appear on first trigger
- Fixed: Warnings from enum name clashes

Change-Id: Ia59117aaff6b9f6f72240b2027ce1406f08d5776
2025-08-06 10:41:01 -04:00
13a314bde5 qt: update to 6.8.3
GitLab: #1944
Change-Id: I3a65aba1820c6b4bafaeb43e5a8c61046d9b7807
2025-08-06 09:20:50 -04:00
8c9f6a85a3 cmake: fix libavutil linking
In preparation for the upgrade to Qt 6.8, update CMakeLists.txt to ensure
that the client links against the same version of libavutil as the one
built by the daemon.

GitLab: #1944
Change-Id: I45bbf9f698a869b9028fc0489f2cd518a1f45781
2025-08-05 15:18:10 -04:00
82eb5c59a6 CallButtonDelegate: fix audio devices index not updating
UI was not updating when an audio or video device was selected. The code
was using the currentIndex property, which is not present in
AudioDeviceModel and VideoInputDeviceModel.

They are now treated as a separate case

Change-Id: Ifbbcb99b9044daf7ab789122dad7356698595f86
2025-08-05 14:02:27 -04:00
154 changed files with 8822 additions and 3931 deletions

View File

@ -49,7 +49,7 @@ BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeComma
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 100
ColumnLimit: 120
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
@ -105,6 +105,6 @@ SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
Standard: c++17
TabWidth: 4
UseTab: Never

2
.github/FUNDING.yml vendored
View File

@ -1,2 +1,2 @@
custom: ['https://jami.net/whydonate/']
custom: ['https://jami.net/donate/']
lfx_crowdfunding: jami-a-gnu-package

1
.gitignore vendored
View File

@ -18,6 +18,7 @@ x64/
x86/
[wW]in32/
.qmake.stash
.cache/
debug/
release/
beta/

13
.vscode/settings.json vendored
View File

@ -1,15 +1,10 @@
{
"C_Cpp.default.includePath": [
"${default}",
"${workspaceFolder}/**",
"/usr/lib/libqt-jami/include/**",
"/usr/lib64/qt-jami/include/**",
],
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json",
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.cStandard": "c11",
"cmake.configureOnOpen": true,
"C_Cpp.autoAddFileAssociations": false,
"cmake.configureOnOpen": false,
"cmake.configureOnEdit": false,
"editor.formatOnSave": true,
"editor.defaultFormatter": "xaver.clang-format",
"files.eol": "\n",
"cSpell.enabled": false,
}

View File

@ -26,7 +26,7 @@ set(CMAKE_SCRIPTS_DIR ${PROJECT_SOURCE_DIR}/extras/build/cmake)
include(${CMAKE_SCRIPTS_DIR}/extra_tools.cmake)
option(WITH_DAEMON_SUBMODULE "Build with daemon submodule" ON)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" OFF)
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" ON)
option(WITH_WEBENGINE "Build with WebEngine" ON)
option(ENABLE_LIBWRAP "Enable libwrap (single process mode)" ON)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@ -58,10 +58,9 @@ else()
set(DAEMON_DIR ${PROJECT_SOURCE_DIR}/daemon)
endif()
# For now only MSVC is supported for building Jami-core within the
# client cmake.
if(JAMICORE_AS_SUBDIR)
add_subdirectory(${DAEMON_DIR})
add_subdirectory(${DAEMON_DIR} EXCLUDE_FROM_ALL)
set(LIBJAMI_LIB jami-core)
endif()
# init some variables for includes, libs, etc.
@ -92,7 +91,7 @@ if(WIN32)
list(APPEND QWINDOWKIT_OPTIONS QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS OFF)
endif()
# If qwindowkit can't find qmsetup via cmake's find_package function, it will install it and
# If qwindowkit is unable to find qmsetup via cmake's find_package function, it will install it and
# then call find_package again. Unfortunately, even the second call to find_package sometimes
# fails due to qmsetup having been installed in the wrong directory. The following patch
# ensures that qmsetup is always installed in the directory where find_package looks for it.
@ -171,7 +170,7 @@ set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests)
# Here we let find_package(<PackageName>...) try to find Qt 6,
# If it is found, find_package will succeed, and the CMake variable
# QT_VERSION_MAJOR will be defined 6.
set(QT6_MINVER_MINOR 6)
set(QT6_MINVER_MINOR 8)
if(QT6_VER AND QT6_PATH)
find_package(QT NAMES Qt6 REQUIRED
PATHS ${QT6_PATH} NO_DEFAULT_PATH)
@ -180,15 +179,9 @@ else()
find_package(QT NAMES Qt6 REQUIRED)
endif()
if (${QT_VERSION_MINOR} GREATER_EQUAL ${QT6_MINVER_MINOR})
# Enforce a minimum Qt version of 6.6.2 for the Windows build
# https://github.com/stdware/qwindowkit/issues/23
if(MSVC AND ${QT_VERSION_MINOR} EQUAL 6 AND ${QT_VERSION_PATCH} LESS 2)
message(FATAL_ERROR "Qt 6.6.2 or higher is required. Found ${QT_VERSION}")
endif()
# Qt version is 6.6 or higher
message(STATUS "Found a suitable Qt version ${QT_VERSION}")
else()
message(FATAL_ERROR "Qt 6.6 or higher is required. Found ${QT_VERSION}")
message(FATAL_ERROR "Qt 6.8 or higher is required. Found ${QT_VERSION}")
endif()
# libjamiclient
@ -240,11 +233,12 @@ cloned this repository via git, perhaps you did not initialize its \
submodules afterwards. You can do so by running \"git submodule \
update --init\" in the repository.")
endif()
set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIR})
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/extras/build/cmake/modules)
if (NOT JAMICORE_AS_SUBDIR)
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIR})
endif()
endif()
include(FindPython3)
@ -334,6 +328,7 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/audiodevicemodel.cpp
${APP_SRC_DIR}/pluginlistpreferencemodel.cpp
${APP_SRC_DIR}/audiomanagerlistmodel.cpp
${APP_SRC_DIR}/audioconfiglistmodel.cpp
${APP_SRC_DIR}/qmlregister.cpp
${APP_SRC_DIR}/utilsadapter.cpp
${APP_SRC_DIR}/moderatorlistmodel.cpp
@ -404,6 +399,7 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/audiodevicemodel.h
${APP_SRC_DIR}/pluginlistpreferencemodel.h
${APP_SRC_DIR}/audiomanagerlistmodel.h
${APP_SRC_DIR}/audioconfiglistmodel.h
${APP_SRC_DIR}/qmlregister.h
${APP_SRC_DIR}/abstractlistmodelbase.h
${APP_SRC_DIR}/quickimageproviderbase.h
@ -445,12 +441,24 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/qrcodescannermodel.h
${APP_SRC_DIR}/spellchecker.h)
set(CONTRIB_DARWIN_FOLDER "")
if(APPLE)
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
if(ARCH_LEN EQUAL 1)
# single-arch -> use <arch>-apple-darwin<ver>
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
else() # multi-arch -> use apple-darwin<ver>
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
endif()
endif()
# For libavutil/avframe.
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
PATHS
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
include_directories(${AVUTIL_INCLUDE_DIR})
@ -580,19 +588,12 @@ elseif (NOT APPLE)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
endif()
list(PREPEND CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
pkg_check_modules(LIBAVUTIL libavutil>=55.75.100)
list(REMOVE_ITEM CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
include_directories(
${LIBCLIENT_SRC_DIR}
${LIBNM_INCLUDE_DIRS}
${LIBNOTIFY_INCLUDE_DIRS}
${LIBGDKPIXBUF_INCLUDE_DIRS}
${GLIB_INCLUDE_DIRS}
${LIBAVUTIL_INCLUDE_DIRS})
${GLIB_INCLUDE_DIRS})
set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
@ -724,8 +725,8 @@ else()
endif()
# ZXing-cpp configuration
set(BUILD_EXAMPLES OFF CACHE BOOL "")
set(BUILD_BLACKBOX_TESTS OFF CACHE BOOL "")
set(ZXING_EXAMPLES OFF CACHE BOOL "")
set(ZXING_BLACKBOX_TESTS OFF CACHE BOOL "")
add_subdirectory(3rdparty/zxing-cpp EXCLUDE_FROM_ALL)
# Add ZXing-cpp to includes and libraries
@ -945,7 +946,7 @@ else()
target_sources(${PROJECT_NAME} PRIVATE ${resources})
list(APPEND CLIENT_LIBS ${libs})
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib/*.a)
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/lib/*.a)
list(APPEND CLIENT_LIBS ${CONTRIB})
find_package(Iconv REQUIRED)

View File

@ -29,7 +29,7 @@ sudo apt-get update && sudo apt-get install libqt-jami
#### Install libqt-jami, Debian based
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_11"
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_12"
```bash
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
@ -189,18 +189,20 @@ Only 64-bit MSVC build can be compiled.
- Download [Qt (Open Source)](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
- Using the online installer, install the following Qt 6.6.2 components:
- Using the online installer, install the following Qt 6.8.3 components:
- Git 2.10.2
- MSVC 2019 64-bit
- Qt 5 Compatibility Module
- MSVC 2022 64-bit
- Extension :
- Qt WebEngine
- Additional Libraries
- Qt Multimedia
- Qt Network Authorization
- Qt WebChannel
- Qt WebEngine
- Qt WebSockets
- Qt WebView
- Qt 5 Compatibility Module
- Qt Positioning
- Download [Visual Studio](https://visualstudio.microsoft.com/) (versions 2019 or 2022). _See the SDK notes below._
@ -212,7 +214,7 @@ Only 64-bit MSVC build can be compiled.
| | Qt Version |
| -------------------- | ---------- |
| Minimum requirement: | 6.6.2 |
| Minimum requirement: | 6.8.3 |
- Install [Python3](https://www.python.org/downloads/) for Windows
@ -238,11 +240,11 @@ Only 64-bit MSVC build can be compiled.
- Using a new **Non-Elevated Command Prompt**
```bash
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
```bash
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
```
> **CMake** Note: The build script does not specify what CMake generator should be used. This means CMake will search the system for the appropriate generator, which might not always select the right one if, for instance, Ninja is installed. To resolve that, the CMAKE_GENERATOR environment variable can be used, set to "Visual Studio 16 2019" or "Visual Studio 19 2022" depending on the installed Visual Studio version.
@ -293,12 +295,12 @@ Once the build has finished, you should then be able to use the Visual Studio So
**Set up**
- macOS minimum version 11.0
- macOS minimum version 12.0
- install python3
- download xcode
- install Qt 6.6
- install Qt 6.8
Qt 6.6 can be installed via brew
Qt 6.8 can be installed via brew
```bash
brew install qt

View File

@ -417,6 +417,8 @@ def run_install(args):
install_args += ('-D', args.extra_cmake_flags)
if args.enable_crash_reports:
install_args.append('-C')
if args.ignore_system_libs:
install_args.append('-i')
if args.distribution == OSX_DISTRIBUTION_NAME:
# The `universal_newlines` parameter has been renamed to `text` in
@ -769,6 +771,9 @@ def parse_args():
ap.add_argument('--enable-crash-reports',
action='store_true', default=False,
help='Enable crash reporting')
ap.add_argument('--ignore_system_libs', dest='ignore_system_libs',
default=False, action='store_true',
help='Build contrib packages regardless of system detection')
dist = choose_distribution()

2
daemon

Submodule daemon updated: 33400db731...3fd9cdacc6

View File

@ -41,7 +41,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
set(LIBJAMI_NAMES
jami-core
jami
ring
)
if(WITH_DAEMON_SUBMODULE)

View File

@ -90,7 +90,7 @@
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://docs.jami.net/user/faq.html</url>
<url type="help">https://forum.jami.net/</url>
<url type="donation">https://jami.net/whydonate/</url>
<url type="donation">https://jami.net/donate/</url>
<url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
<categories>
<category>Chat</category>

View File

@ -87,12 +87,30 @@
</developer>
<releases>
<release version="20251003.0" date="2025-10-03">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20251003</url>
</release>
<release version="20250912.0" date="2025-09-12">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250912</url>
</release>
<release version="20250815.1" date="2025-08-17">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#stable-20250817</url>
</release>
<release version="20250718.0" date="2025-07-18">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250718</url>
</release>
<release version="20250613.0" date="2025-06-13">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250613</url>
</release>
<release version="20250610.0" date="2025-06-10">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250610</url>
</release>
<release version="20250523.0" date="2025-05-23">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250523</url>
</release>
<release version="20250430.1" date="2025-04-30">
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250430</url>
</release>
</releases>
<branding>
@ -1279,9 +1297,9 @@
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="homepage">https://jami.net/</url>
<url type="donation">https://jami.net/whydonate/</url>
<url type="donation">https://jami.net/donate/</url>
<url type="faq">https://docs.jami.net/user/faq.html</url>
<url type="translate">https://explore.transifex.com/savoirfairelinux/jami/</url>
<url type="translate">https://explore.transifex.com/savoirfairelinux/</url>
<url type="contribute">https://jami.net/contribute/</url>
<url type="help">https://docs.jami.net/</url>
<url type="vcs-browser">https://git.jami.net/savoirfairelinux</url>
@ -1295,232 +1313,82 @@
<!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
<screenshots>
<screenshot type="default">
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
<caption>Send chat messages and talk with audio and video</caption>
<caption xml:lang="ab">Ачат адырраҭарақәа рышьҭра, аудиои авидеои рыла аицәажәара</caption>
<caption xml:lang="af">Stuur kletsboodskappe en praat met oudio en video</caption>
<caption xml:lang="am">የውይይት መልዕክቶችን ይላኩ እና በድምጽ እና በቪዲዮ ይናገሩ</caption>
<caption xml:lang="ar">إرسال رسائل الدردشة والتحدث بالصوت والفيديو</caption>
<caption xml:lang="az">Çat mesajları göndərin və audio və video ilə danışın</caption>
<caption xml:lang="be">Адпраўляйце паведамленні ў чаце і размаўляйце з аўдыё і відэа</caption>
<caption xml:lang="bg">Изпращайте чат съобщения и говорете с аудио и видео</caption>
<caption xml:lang="bn">চ্যাট বার্তা পাঠান এবং অডিও এবং ভিডিওর মাধ্যমে কথা বলুন</caption>
<caption xml:lang="ca">Envia missatges de xat i parla amb àudio i vídeo</caption>
<caption xml:lang="cs">Odesílejte chatové zprávy a mluvte se zvukem a videem</caption>
<caption xml:lang="da">Send chatbeskeder og tal med lyd og video</caption>
<caption xml:lang="de">Senden Sie Chatnachrichten und sprechen Sie mit Audio und Video</caption>
<caption xml:lang="el">Στείλτε μηνύματα συνομιλίας και μιλήστε με ήχο και βίντεο</caption>
<caption xml:lang="eo">Sendu babilajn mesaĝojn kaj parolu per audio kaj video</caption>
<caption xml:lang="es">Envía mensajes de chat y habla con audio y video.</caption>
<caption xml:lang="et">Saatke vestlussõnumeid ja rääkige heli ja videoga</caption>
<caption xml:lang="fa">پیام های چت بفرستید و با صدا و تصویر صحبت کنید</caption>
<caption xml:lang="fi">Lähetä chat-viestejä ja keskustele äänen ja videon avulla</caption>
<caption xml:lang="fil">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
<caption xml:lang="fr">Envoyez des messages de chat et discutez avec audio et vidéo</caption>
<caption xml:lang="gl">Envía mensaxes de chat e fala con audio e vídeo</caption>
<caption xml:lang="he">שלח הודעות צ'אט ודבר עם אודיו ווידאו</caption>
<caption xml:lang="hi">चैट संदेश भेजें और ऑडियो और वीडियो के साथ बात करें</caption>
<caption xml:lang="hr">Šaljite chat poruke i razgovarajte uz zvuk i video</caption>
<caption xml:lang="hu">Csevegőüzenetek küldése, valamint hang- és videobeszélgetés</caption>
<caption xml:lang="hy">Ուղարկեք զրույցի հաղորդագրություններ և խոսեք աուդիո և վիդեո</caption>
<caption xml:lang="id">Kirim pesan obrolan dan berbicara dengan audio dan video</caption>
<caption xml:lang="is">Sendu spjallskilaboð og talaðu með hljóði og myndböndum</caption>
<caption xml:lang="it">Invia messaggi di chat e parla con audio e video</caption>
<caption xml:lang="ja">チャットメッセージを送信し、音声とビデオで会話する</caption>
<caption xml:lang="ka">გაგზავნეთ ჩატის შეტყობინებები და ისაუბრეთ აუდიო და ვიდეოთი</caption>
<caption xml:lang="km">ផ្ញើសារជជែក និងនិយាយជាមួយអូឌីយ៉ូ និងវីដេអូ</caption>
<caption xml:lang="kn">ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊದೊಂದಿಗೆ ಮಾತನಾಡಿ</caption>
<caption xml:lang="ko">채팅 메시지를 보내고 오디오와 비디오로 대화하세요</caption>
<caption xml:lang="ky">Чат билдирүүлөрүн жөнөтүңүз жана аудио жана видео менен сүйлөшүңүз</caption>
<caption xml:lang="la">Mitte chat nuntios et colloqui cum audio et video</caption>
<caption xml:lang="lo">ສົ່ງຂໍ້ຄວາມສົນທະນາ ແລະສົນທະນາດ້ວຍສຽງ ແລະວິດີໂອ</caption>
<caption xml:lang="lt">Siųskite pokalbių pranešimus ir kalbėkite naudodami garso ir vaizdo įrašus</caption>
<caption xml:lang="lv">Sūtiet tērzēšanas ziņas un runājiet ar audio un video</caption>
<caption xml:lang="mk">Испраќајте пораки за разговор и разговарајте со аудио и видео</caption>
<caption xml:lang="ml">ചാറ്റ് സന്ദേശങ്ങൾ അയച്ച് ഓഡിയോ, വീഡിയോ ഉപയോഗിച്ച് സംസാരിക്കുക</caption>
<caption xml:lang="mn">Чат мессеж илгээж, аудио болон видеотой ярилцаарай</caption>
<caption xml:lang="mr">चॅट संदेश पाठवा आणि ऑडिओ आणि व्हिडिओसह बोल</caption>
<caption xml:lang="ms">Hantar mesej sembang dan bercakap dengan audio dan video</caption>
<caption xml:lang="my">ချတ်မက်ဆေ့ခ်ျများပို့ပြီး အသံနှင့် ဗီဒီယိုဖြင့် စကားပြောပါ။</caption>
<caption xml:lang="ne">अडियो र भिडियो मार्फत च्याट सन्देशहरू पठाउनुहोस् र कुरा गर्नुहोस्</caption>
<caption xml:lang="nl">Verstuur chatberichten en praat met audio en video</caption>
<caption xml:lang="no">Send chat-meldinger og snakk med lyd og video</caption>
<caption xml:lang="pl">Wysyłaj wiadomości czatu i rozmawiaj z dźwiękiem i obrazem</caption>
<caption xml:lang="pt-BR">Envie mensagens de bate-papo e fale com áudio e vídeo</caption>
<caption xml:lang="pt-PT">Envie mensagens de chat e fale com áudio e vídeo</caption>
<caption xml:lang="ro">Trimiteți mesaje de chat și vorbiți cu audio și video</caption>
<caption xml:lang="ru">Отправляйте сообщения в чате и общайтесь с помощью аудио и видео</caption>
<caption xml:lang="si">කතාබස් පණිවිඩ යවන්න සහ ශ්‍රව්‍ය සහ දෘශ්‍ය සමඟ කතා කරන්න</caption>
<caption xml:lang="sk">Posielajte četové správy a rozprávajte sa so zvukom a videom</caption>
<caption xml:lang="sl">Pošiljajte sporočila v klepetu in se pogovarjajte z zvokom in videom</caption>
<caption xml:lang="sq">Dërgoni mesazhe bisede dhe bisedoni me audio dhe video</caption>
<caption xml:lang="sr">Шаљите поруке за ћаскање и разговарајте уз аудио и видео</caption>
<caption xml:lang="sv">Skicka chattmeddelanden och prata med ljud och video</caption>
<caption xml:lang="sw">Tuma ujumbe wa gumzo na zungumza na sauti na video</caption>
<caption xml:lang="ta">அரட்டை செய்திகளை அனுப்பவும், ஆடியோ மற்றும் வீடியோ மூலம் பேசவும்</caption>
<caption xml:lang="te">చాట్ సందేశాలను పంపండి మరియు ఆడియో మరియు వీడియోతో మాట్లాడండి</caption>
<caption xml:lang="th">ส่งข้อความแชทและพูดคุยด้วยเสียงและวิดีโอ</caption>
<caption xml:lang="tl">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
<caption xml:lang="tr">Sohbet mesajları gönderin ve sesli ve görüntülü konuşun</caption>
<caption xml:lang="uk">Надсилайте повідомлення чату та спілкуйтеся з аудіо та відео</caption>
<caption xml:lang="vi">Gửi tin nhắn trò chuyện và nói chuyện bằng âm thanh và video</caption>
<caption xml:lang="zh-CN">发送聊天消息并通过音频和视频进行交谈</caption>
<caption xml:lang="zh-HK">發送聊天訊息並透過音訊和視訊進行交談</caption>
<caption xml:lang="zh-TW">發送聊天訊息並透過音訊和視訊進行交談</caption>
<caption xml:lang="zu">Thumela imilayezo yengxoxo futhi ukhulume ngomsindo nevidiyo</caption>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_welcome.PNG</image>
<caption>Share, freely and privately</caption>
<caption xml:lang="ab">Ацеиҩшара, хақәиҭла, хала</caption>
<caption xml:lang="af">Deel, vrylik en privaat</caption>
<caption xml:lang="am">በነጻ እና በግል ያካፍሉ።</caption>
<caption xml:lang="ar">شارك بحرية وبشكل خاص</caption>
<caption xml:lang="az">Sərbəst və gizli şəkildə paylaşın</caption>
<caption xml:lang="be">Падзяліцеся свабодна і прыватна</caption>
<caption xml:lang="bg">Споделяйте, свободно и частно</caption>
<caption xml:lang="bn">শেয়ার করুন, অবাধে এবং গোপনে</caption>
<caption xml:lang="ca">Comparteix, lliurement i de forma privada</caption>
<caption xml:lang="cs">Sdílejte svobodně a soukromě</caption>
<caption xml:lang="da">Del, frit og privat</caption>
<caption xml:lang="de">Teilen, frei und privat</caption>
<caption xml:lang="el">Κοινοποιήστε, ελεύθερα και ιδιωτικά</caption>
<caption xml:lang="eo">Kunhavigu, libere kaj private</caption>
<caption xml:lang="es">Comparte, libre y privadamente</caption>
<caption xml:lang="et">Jaga, vabalt ja privaatselt</caption>
<caption xml:lang="fa">به اشتراک بگذارید، آزادانه و خصوصی</caption>
<caption xml:lang="fi">Jaa, vapaasti ja yksityisesti</caption>
<caption xml:lang="fil">Ibahagi, libre at pribado</caption>
<caption xml:lang="fr">Partagez, librement, gratuitement et en toute confidentialité</caption>
<caption xml:lang="gl">Comparte, de xeito libre e privado</caption>
<caption xml:lang="he">שתפו, באופן חופשי ופרטי</caption>
<caption xml:lang="hi">स्वतंत्र रूप से और निजी तौर पर साझा करें</caption>
<caption xml:lang="hr">Dijelite, slobodno i privatno</caption>
<caption xml:lang="hu">Megosztás, szabadon és bizalmasan</caption>
<caption xml:lang="hy">Տարածեք, ազատ և մասնավոր</caption>
<caption xml:lang="id">Berbagi, secara bebas dan pribadi</caption>
<caption xml:lang="is">Deildu, frjálslega og einslega</caption>
<caption xml:lang="it">Condividere, liberamente e privatamente</caption>
<caption xml:lang="ja">自由に、プライベートに共有</caption>
<caption xml:lang="ka">გააზიარეთ, თავისუფლად და პირადად</caption>
<caption xml:lang="km">ចែករំលែកដោយសេរី និងឯកជន</caption>
<caption xml:lang="kn">ಮುಕ್ತವಾಗಿ ಮತ್ತು ಖಾಸಗಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ</caption>
<caption xml:lang="ko">자유롭고 비공개적으로 공유하세요</caption>
<caption xml:lang="ky">Бөлүшүү, эркин жана купуя</caption>
<caption xml:lang="la">Communicantes, libere et privatim</caption>
<caption xml:lang="lo">ແບ່ງ​ປັນ​, ຢ່າງ​ເສລີ​ແລະ​ເປັນ​ສ່ວນ​ຕົວ​</caption>
<caption xml:lang="lt">Dalintis, laisvai ir privačiai</caption>
<caption xml:lang="lv">Kopīgojiet, brīvi un privāti</caption>
<caption xml:lang="mk">Споделете, слободно и приватно</caption>
<caption xml:lang="ml">സ്വതന്ത്രമായും സ്വകാര്യമായും പങ്കിടുക</caption>
<caption xml:lang="mn">Чөлөөт, хувийн байдлаар хуваалцах</caption>
<caption xml:lang="mr">सामायिक करा, मुक्तपणे आणि खाजगीरित्य</caption>
<caption xml:lang="ms">Kongsi, secara bebas dan peribadi</caption>
<caption xml:lang="my">လွတ်လပ်စွာ သီးသန့်မျှဝေပါ။</caption>
<caption xml:lang="ne">स्वतन्त्र र गोप्य रूपमा सेयर गर्नुहोस्</caption>
<caption xml:lang="nl">Deel, vrij en privé</caption>
<caption xml:lang="no">Del, fritt og privat</caption>
<caption xml:lang="pl">Udostępniaj swobodnie i prywatnie</caption>
<caption xml:lang="pt-BR">Compartilhe, livre e privadamente</caption>
<caption xml:lang="pt-PT">Partilhe, livre e privadamente</caption>
<caption xml:lang="ro">Distribuie, în mod liber și privat</caption>
<caption xml:lang="ru">Делитесь, свободно и конфиденциально</caption>
<caption xml:lang="si">නිදහසේ සහ පෞද්ගලිකව බෙදා ගන්න</caption>
<caption xml:lang="sk">Zdieľajte, slobodne a súkromne</caption>
<caption xml:lang="sl">Delite brezplačno in zasebno</caption>
<caption xml:lang="sq">Shpërndaje, lirisht dhe privatisht</caption>
<caption xml:lang="sr">Делите, слободно и приватно</caption>
<caption xml:lang="sv">Dela, fritt och privat</caption>
<caption xml:lang="sw">Shiriki, kwa uhuru na kwa faragha</caption>
<caption xml:lang="ta">பகிரவும், சுதந்திரமாகவும் தனிப்பட்ட முறையிலும்</caption>
<caption xml:lang="te">ఉచితంగా మరియు ప్రైవేట్‌గా షేర్ చేయండి</caption>
<caption xml:lang="th">แบ่งปันได้อย่างอิสระและเป็นส่วนตัว</caption>
<caption xml:lang="tl">Ibahagi, libre at pribado</caption>
<caption xml:lang="tr">Özgürce ve özel olarak paylaşın</caption>
<caption xml:lang="uk">Поділіться вільно та приватно</caption>
<caption xml:lang="vi">Chia sẻ, tự do và riêng tư</caption>
<caption xml:lang="zh-CN">自由且私密地分享</caption>
<caption xml:lang="zh-HK">自由且私密地分享</caption>
<caption xml:lang="zh-TW">自由且私密地分享</caption>
<caption xml:lang="zu">Yabelana, ngokukhululekile nangasese</caption>
</screenshot>
<screenshot>
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
<caption>Screen sharing</caption>
<caption xml:lang="ab">Аекран аимадара</caption>
<caption xml:lang="af">Skermdeling</caption>
<caption xml:lang="am">ማያ ገጽ ማጋራት።</caption>
<caption xml:lang="ar">مشاركة الشاشة</caption>
<caption xml:lang="az">Ekran paylaşımı</caption>
<caption xml:lang="be">Агульны доступ да экрана</caption>
<caption xml:lang="bg">Споделяне на екрана</caption>
<caption xml:lang="bn">স্ক্রিন শেয়ারিং</caption>
<caption xml:lang="ca">Compartició de pantalla</caption>
<caption xml:lang="cs">Sdílení obrazovky</caption>
<caption xml:lang="da">Skærmdeling</caption>
<caption xml:lang="de">Bildschirmfreigabe</caption>
<caption xml:lang="el">Κοινή χρήση οθόνης</caption>
<caption xml:lang="eo">Kundivido de ekrano</caption>
<caption xml:lang="es">Compartir pantalla</caption>
<caption xml:lang="et">Ekraani jagamine</caption>
<caption xml:lang="fa">اشتراک گذاری صفحه نمایش</caption>
<caption xml:lang="fi">Näytön jakaminen</caption>
<caption xml:lang="fil">Pagbabahagi ng screen</caption>
<caption xml:lang="fr">Partage d'écran</caption>
<caption xml:lang="gl">Compartir pantalla</caption>
<caption xml:lang="he">שיתוף מסך</caption>
<caption xml:lang="hi">स्क्रीन शेयरिंग</caption>
<caption xml:lang="hr">Dijeljenje zaslona</caption>
<caption xml:lang="hu">Képernyőmegosztás</caption>
<caption xml:lang="hy">Էկրանի փոխանակում</caption>
<caption xml:lang="id">Berbagi layar</caption>
<caption xml:lang="is">Skjádeiling</caption>
<caption xml:lang="it">Condivisione dello schermo</caption>
<caption xml:lang="ja">画面共有</caption>
<caption xml:lang="ka">ეკრანის გაზიარება</caption>
<caption xml:lang="km">ការចែករំលែកអេក្រង់</caption>
<caption xml:lang="kn">ಪರದೆ ಹಂಚಿಕೆ</caption>
<caption xml:lang="ko">화면 공유</caption>
<caption xml:lang="ky">Экранды бөлүшүү</caption>
<caption xml:lang="la">Screen sharing</caption>
<caption xml:lang="lo">ການແບ່ງປັນໜ້າຈໍ</caption>
<caption xml:lang="lt">Ekrano bendrinimas</caption>
<caption xml:lang="lv">Ekrāna koplietošana</caption>
<caption xml:lang="mk">Споделување екран</caption>
<caption xml:lang="ml">സ്ക്രീൻ പങ്കിടൽ</caption>
<caption xml:lang="mn">Дэлгэц хуваалцах</caption>
<caption xml:lang="mr">स्क्रीन शेअरिंग</caption>
<caption xml:lang="ms">Perkongsian skrin</caption>
<caption xml:lang="my">မျက်နှာပြင်မျှဝေခြင်း။</caption>
<caption xml:lang="ne">स्क्रिन सेयरिङ</caption>
<caption xml:lang="nl">Scherm delen</caption>
<caption xml:lang="no">Skjermdeling</caption>
<caption xml:lang="pl">Udostępnianie ekranu</caption>
<caption xml:lang="pt-BR">Compartilhamento de tela</caption>
<caption xml:lang="pt-PT">Partilha de tela</caption>
<caption xml:lang="ro">Partajarea ecranului</caption>
<caption xml:lang="ru">Совместное использование экрана</caption>
<caption xml:lang="si">තිර බෙදා ගැනීම</caption>
<caption xml:lang="sk">Zdieľanie obrazovky</caption>
<caption xml:lang="sl">Skupna raba zaslona</caption>
<caption xml:lang="sq">Ndarja e ekranit</caption>
<caption xml:lang="sr">Дељење екрана</caption>
<caption xml:lang="sv">Skärmdelning</caption>
<caption xml:lang="sw">Kushiriki skrini</caption>
<caption xml:lang="ta">திரைப் பகிர்வு</caption>
<caption xml:lang="te">స్క్రీన్ షేరింగ్</caption>
<caption xml:lang="th">การแชร์หน้าจอ</caption>
<caption xml:lang="tl">Pagbabahagi ng screen</caption>
<caption xml:lang="tr">Ekran paylaşımı</caption>
<caption xml:lang="uk">Спільне використання екрана</caption>
<caption xml:lang="vi">Chia sẻ màn hình</caption>
<caption xml:lang="zh-CN">屏幕共享</caption>
<caption xml:lang="zh-HK">螢幕分享</caption>
<caption xml:lang="zh-TW">螢幕分享</caption>
<caption xml:lang="zu">Ukwabelana kwesikrini</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
<caption>Crystal clear audio</caption>
<caption xml:lang="ab">Ицқьоу аудио</caption>
<caption xml:lang="af">Kristalhelder klank</caption>
<caption xml:lang="am">ክሪስታል ግልጽ ኦዲዮ</caption>
<caption xml:lang="ar">صوت نقي للغاية</caption>
<caption xml:lang="az">Kristal təmiz səs</caption>
<caption xml:lang="be">Крышталёва чысты аўдыё</caption>
<caption xml:lang="bg">Кристално чист звук</caption>
<caption xml:lang="bn">স্ফটিক স্বচ্ছ অডিও</caption>
<caption xml:lang="ca">Àudio cristal·lí</caption>
<caption xml:lang="cs">Křišťálově čistý zvuk</caption>
<caption xml:lang="da">Krystalklar lyd</caption>
<caption xml:lang="de">Kristallklarer Klang</caption>
<caption xml:lang="el">Κρυστάλλινος ήχος</caption>
<caption xml:lang="eo">Kristalklara aŭdio</caption>
<caption xml:lang="es">Audio cristalina</caption>
<caption xml:lang="et">Kristallselge heli</caption>
<caption xml:lang="fa">صدای شفاف</caption>
<caption xml:lang="fi">Kristallinkirkas ääni</caption>
<caption xml:lang="fil">Malinaw na audio</caption>
<caption xml:lang="fr">Un son cristallin</caption>
<caption xml:lang="gl">Audio cristalino</caption>
<caption xml:lang="he">אודיו צלול</caption>
<caption xml:lang="hi">क्रिस्टल स्पष्ट ऑडियो</caption>
<caption xml:lang="hr">Kristalno čist zvuk</caption>
<caption xml:lang="hu">Kristálytiszta hang</caption>
<caption xml:lang="hy">Բյուրեղյա մաքուր աուդիո</caption>
<caption xml:lang="id">Audio sebening kristal</caption>
<caption xml:lang="is">Kristaltært hljóð</caption>
<caption xml:lang="it">Audio cristallino</caption>
<caption xml:lang="ja">非常にクリアな音声</caption>
<caption xml:lang="ka">კრისტალურად სუფთა აუდიო</caption>
<caption xml:lang="km">សំឡេងច្បាស់ល្អ</caption>
<caption xml:lang="kn">ಸ್ಫಟಿಕ ಸ್ಪಷ್ಟ ಆಡಿಯೋ</caption>
<caption xml:lang="ko">매우 선명한 오디오</caption>
<caption xml:lang="ky">Кристалл таза аудио</caption>
<caption xml:lang="la">Patet Crystal audio</caption>
<caption xml:lang="lo">ສຽງທີ່ຊັດເຈນ</caption>
<caption xml:lang="lt">Krištolo skaidrumo garsas</caption>
<caption xml:lang="lv">Kristāldzidra audio</caption>
<caption xml:lang="mk">Кристално чист звук</caption>
<caption xml:lang="ml">ക്രിസ്റ്റൽ ക്ലിയർ ഓഡിയോ</caption>
<caption xml:lang="mn">Кристал тунгалаг аудио</caption>
<caption xml:lang="mr">क्रिस्टल क्लियर ऑडिओ</caption>
<caption xml:lang="ms">Audio yang jernih</caption>
<caption xml:lang="my">ကြည်လင်ပြတ်သားသော အသံ</caption>
<caption xml:lang="ne">क्रिस्टल क्लियर अडियो</caption>
<caption xml:lang="nl">Kristalheldere audio</caption>
<caption xml:lang="no">Krystallklar lyd</caption>
<caption xml:lang="pl">Krystalicznie czysty dźwięk</caption>
<caption xml:lang="pt-BR">Áudio cristalino</caption>
<caption xml:lang="pt-PT">Áudio cristalino</caption>
<caption xml:lang="ro">Sunet clar de cristal</caption>
<caption xml:lang="ru">Кристально чистый звук</caption>
<caption xml:lang="si">ස්ඵටික පැහැදිලි ශ්‍රව්‍ය</caption>
<caption xml:lang="sk">Krištáľovo čistý zvuk</caption>
<caption xml:lang="sl">Kristalno čist zvok</caption>
<caption xml:lang="sq">Audio i pastër kristal</caption>
<caption xml:lang="sr">Кристално чист звук</caption>
<caption xml:lang="sv">Kristallklart ljud</caption>
<caption xml:lang="sw">Sauti safi kabisa</caption>
<caption xml:lang="ta">தெளிவான ஆடியோ</caption>
<caption xml:lang="te">క్రిస్టల్ క్లియర్ ఆడియో</caption>
<caption xml:lang="th">เสียงชัดใส</caption>
<caption xml:lang="tl">Malinaw na audio</caption>
<caption xml:lang="tr">Kristal netliğinde ses</caption>
<caption xml:lang="uk">Кришталево чистий звук</caption>
<caption xml:lang="vi">Âm thanh trong trẻo</caption>
<caption xml:lang="zh-CN">清晰的音频</caption>
<caption xml:lang="zh-HK">清晰的音訊</caption>
<caption xml:lang="zh-TW">清晰的音訊</caption>
<caption xml:lang="zu">Umsindo ocacile we-Crystal</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_swarm.PNG</image>
<caption>Group calls with an unlimited number of participants</caption>
<caption xml:lang="ab">Ԥынгыла змам алахәылацәа зцу агәыԥтәи аԥхьарақәа</caption>
<caption xml:lang="af">Groepoproepe met 'n onbeperkte aantal deelnemers</caption>
@ -1595,7 +1463,7 @@
<caption xml:lang="zu">Izingcingo zeqembu ezinenombolo engenamkhawulo yabahlanganyeli</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_chat_full.PNG</image>
<caption>Encrypted and secure text messaging without servers</caption>
<caption xml:lang="ab">Ишәарҭоу, насгьы ишәарҭам атексттә дырраҭарақәа асерверқәа рыда</caption>
<caption xml:lang="af">Geënkripteerde en veilige teksboodskappe sonder bedieners</caption>
@ -1669,81 +1537,6 @@
<caption xml:lang="zh-TW">無需伺服器的加密安全短信</caption>
<caption xml:lang="zu">Imiyalezo yombhalo ebethelwe futhi evikelekile ngaphandle kwamaseva</caption>
</screenshot>
<screenshot>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
<caption>Transfer files of any size</caption>
<caption xml:lang="ab">Иарбанзаалак ашәагаа змоу афаилқәа аиагара</caption>
<caption xml:lang="af">Dra lêers van enige grootte oor</caption>
<caption xml:lang="am">ማንኛውንም መጠን ያላቸውን ፋይሎች ያስተላልፉ</caption>
<caption xml:lang="ar">نقل الملفات بأي حجم</caption>
<caption xml:lang="az">İstənilən ölçüdə faylları köçürün</caption>
<caption xml:lang="be">Перадача файлаў любога памеру</caption>
<caption xml:lang="bg">Прехвърляне на файлове с всякакъв размер</caption>
<caption xml:lang="bn">যেকোনো আকারের ফাইল স্থানান্তর করুন</caption>
<caption xml:lang="ca">Transfereix fitxers de qualsevol mida</caption>
<caption xml:lang="cs">Přenášejte soubory libovolné velikosti</caption>
<caption xml:lang="da">Overfør filer af enhver størrelse</caption>
<caption xml:lang="de">Übertragen Sie Dateien jeder Größe</caption>
<caption xml:lang="el">Μεταφορά αρχείων οποιουδήποτε μεγέθους</caption>
<caption xml:lang="eo">Transloki dosierojn de ajna grandeco</caption>
<caption xml:lang="es">Transfiere archivos de cualquier tamaño</caption>
<caption xml:lang="et">Edastage mis tahes suurusega faile</caption>
<caption xml:lang="fa">انتقال فایل در هر اندازه</caption>
<caption xml:lang="fi">Siirrä minkä tahansa kokoisia tiedostoja</caption>
<caption xml:lang="fil">Maglipat ng mga file sa anumang laki</caption>
<caption xml:lang="fr">Transférer des fichiers de toute taille</caption>
<caption xml:lang="gl">Transferir ficheiros de calquera tamaño</caption>
<caption xml:lang="he">העבר קבצים בכל גודל</caption>
<caption xml:lang="hi">किसी भी आकार की फ़ाइलें स्थानांतरित करें</caption>
<caption xml:lang="hr">Prijenos datoteka bilo koje veličine</caption>
<caption xml:lang="hu">Bármilyen méretű fájl küldése</caption>
<caption xml:lang="hy">Փոխանցել ցանկացած չափի ֆայլեր</caption>
<caption xml:lang="id">Transfer file dengan ukuran apa pun</caption>
<caption xml:lang="is">Flytja skrár af hvaða stærð sem er</caption>
<caption xml:lang="it">Trasferisci file di qualsiasi dimensione</caption>
<caption xml:lang="ja">あらゆるサイズのファイルを転送</caption>
<caption xml:lang="ka">ნებისმიერი ზომის ფაილების გადატანა</caption>
<caption xml:lang="km">ផ្ទេរឯកសារគ្រប់ទំហំ</caption>
<caption xml:lang="kn">ಯಾವುದೇ ಗಾತ್ರದ ಫೈಲ್‌ಗಳನ್ನು ವರ್ಗಾಯಿಸಿ</caption>
<caption xml:lang="ko">모든 크기의 파일 전송</caption>
<caption xml:lang="ky">Каалаган өлчөмдөгү файлдарды өткөрүңүз</caption>
<caption xml:lang="la">De translatione cuiuslibet magnitudinis files</caption>
<caption xml:lang="lo">ໂອນໄຟລ໌ທຸກຂະຫນາດ</caption>
<caption xml:lang="lt">Perkelkite bet kokio dydžio failus</caption>
<caption xml:lang="lv">Pārsūtiet jebkura izmēra failus</caption>
<caption xml:lang="mk">Пренесувајте датотеки од која било големина</caption>
<caption xml:lang="ml">ഏത് വലുപ്പത്തിലുള്ള ഫയലുകളും കൈമാറുക</caption>
<caption xml:lang="mn">Ямар ч хэмжээтэй файлуудыг шилжүүлэх</caption>
<caption xml:lang="mr">कोणत्याही आकाराच्या फायली हस्तांतरित करा</caption>
<caption xml:lang="ms">Pindahkan fail dari sebarang saiz</caption>
<caption xml:lang="my">မည်သည့်အရွယ်အစား ဖိုင်များကို လွှဲပြောင်းပါ။</caption>
<caption xml:lang="ne">कुनै पनि आकारका फाइलहरू स्थानान्तरण गर्नुहोस्</caption>
<caption xml:lang="nl">Bestanden van elke grootte overbrengen</caption>
<caption xml:lang="no">Overfør filer i alle størrelser</caption>
<caption xml:lang="pl">Przesyłaj pliki o dowolnym rozmiarze</caption>
<caption xml:lang="pt-BR">Transferir arquivos de qualquer tamanho</caption>
<caption xml:lang="pt-PT">Transferir ficheiros de qualquer tamanho</caption>
<caption xml:lang="ro">Transferați fișiere de orice dimensiune</caption>
<caption xml:lang="ru">Передача файлов любого размера</caption>
<caption xml:lang="si">ඕනෑම ප්‍රමාණයක ගොනු මාරු කරන්න</caption>
<caption xml:lang="sk">Prenášajte súbory akejkoľvek veľkosti</caption>
<caption xml:lang="sl">Prenesite datoteke poljubne velikosti</caption>
<caption xml:lang="sq">Transferoni skedarë të çdo madhësie</caption>
<caption xml:lang="sr">Пренесите датотеке било које величине</caption>
<caption xml:lang="sv">Överför filer av valfri storlek</caption>
<caption xml:lang="sw">Hamisha faili za ukubwa wowote</caption>
<caption xml:lang="ta">எந்த அளவிலான கோப்புகளையும் மாற்றவும்</caption>
<caption xml:lang="te">ఏ పరిమాణంలోనైనా ఫైళ్లను బదిలీ చేయండి</caption>
<caption xml:lang="th">ถ่ายโอนไฟล์ได้ทุกขนาด</caption>
<caption xml:lang="tl">Maglipat ng mga file sa anumang laki</caption>
<caption xml:lang="tr">Herhangi bir boyuttaki dosyaları aktarın</caption>
<caption xml:lang="uk">Передача файлів будь-якого розміру</caption>
<caption xml:lang="vi">Chuyển các tập tin có bất kỳ kích thước nào</caption>
<caption xml:lang="zh-CN">传输任意大小的文件</caption>
<caption xml:lang="zh-HK">傳輸任意大小的文件</caption>
<caption xml:lang="zh-TW">傳輸任意大小的文件</caption>
<caption xml:lang="zu">Dlulisa amafayela anoma yimuphi usayizi</caption>
</screenshot>
</screenshots>
<launchable type="desktop-id">net.jami.Jami.desktop</launchable>

View File

@ -44,10 +44,10 @@ DEBIAN_DSC_FILENAME := jami_$(DEBIAN_VERSION).dsc
# Qt versions
QT_MAJOR := 6
QT_MINOR := 6
QT_PATCH := 1
QT_TARBALL_CHECKSUM := dd3668f65645fe270bc615d748bd4dc048bd17b9dc297025106e6ecc419ab95d
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-1
QT_MINOR := 8
QT_PATCH := 3
QT_TARBALL_CHECKSUM := cdd3a69967208276bb01af7ace7dba0ba53e679f886a4cbe624225c60fb73f2c
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-0
DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
QT_JAMI_PREFIX := /usr/lib/libqt-jami
@ -160,16 +160,17 @@ endif
# Traditionally built packages (in Docker containers).
#
DISTRIBUTIONS := \
debian_11 \
debian_12 \
debian_13 \
debian_testing \
debian_unstable \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_24.04 \
ubuntu_25.04 \
ubuntu_25.10 \
fedora_41 \
fedora_42 \
fedora_43 \
alma_9 \
alma_10 \
opensuse-leap_15.6 \

View File

@ -89,5 +89,6 @@ RUN dnf install -y \
xkeyboard-config \
yaml-cpp-devel \
yasm
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -100,5 +100,6 @@ RUN dnf install -y \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -18,5 +18,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -0,0 +1,26 @@
FROM debian:trixie
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update --allow-releaseinfo-change && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget \
nasm
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -11,14 +11,6 @@ RUN apt-get update --allow-releaseinfo-change && \
wget \
nasm
# As of January 2024, the default compiler on Debian testing is GCC 13.2.0, which
# is unable to build one of Qt 6.6.1's dependencies, see:
# https://github.com/qt/qtquick3d-assimp/commit/253f8bfa621a9fa6cd2c36291cdaa8c60c99322c
# The linked commit above fixes the problem and is included in more recent versions of Qt.
# For now, we use GCC 12 as a temporary workaround:
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 12
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
@ -29,5 +21,6 @@ RUN /opt/prebuild-package-debian.sh jami-deps
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -21,5 +21,6 @@ RUN /opt/prebuild-package-debian.sh jami-deps
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -94,10 +94,11 @@ RUN dnf install -y \
ninja-build \
cmake \
fmt-devel \
python3.10 \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -81,17 +81,11 @@ RUN dnf install -y \
ninja-build \
cmake \
fmt-devel \
python3.10 \
python3-html5lib \
cups-devel \
pipewire-devel
# Use GCC 14 instead of GCC 15 (the default on Fedora 42)
# because Qt 6.6.3 fails to build when using the latter.
RUN rm /usr/bin/gcc /usr/bin/g++ /usr/bin/c++ && \
ln -s /usr/bin/gcc-14 /usr/bin/gcc && \
ln -s /usr/bin/g++-14 /usr/bin/g++ && \
ln -s /usr/bin/g++-14 /usr/bin/c++
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -0,0 +1,91 @@
FROM fedora:43
RUN dnf clean all
RUN dnf update -y
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf group install -y x-software-development
RUN dnf install -y \
git \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
yasm \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc14 \
gcc14-c++ \
which \
alsa-lib-devel \
systemd-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk6.0-devel \
cryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-devel \
NetworkManager-libnm-devel \
openssl-devel \
clutter-devel \
clutter-gtk-devel \
libappindicator-gtk3-devel \
libnotify-devel \
libupnp-devel \
qrencode-devel \
libargon2-devel \
libsndfile-devel \
gperf \
bison \
clang18-devel \
llvm18-devel \
nodejs \
flex \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
libxcb* \
libxkb* \
vulkan-devel \
xcb-util-* \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
ninja-build \
cmake \
fmt-devel \
python3-html5lib \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.sh"]

View File

@ -58,21 +58,19 @@ RUN zypper --non-interactive install -y \
sqlite3-devel \
gtk3-devel\
qrencode-devel \
python310 \
python3-python-dateutil \
python3-html5lib \
python311 \
python311-python-dateutil \
python311-html5lib \
python311-six \
python311-importlib-metadata \
libsndfile-devel \
libdrm-devel \
gperf \
bison \
flex \
ffmpeg \
ffmpeg-devel \
nodejs20 \
mozilla-nss-devel \
python-xml \
python3-six \
python3-importlib-metadata \
libxcb* \
libxkb* \
libX11-devel \
@ -103,12 +101,13 @@ RUN zypper --non-interactive install -y \
pipewire-devel
# openSUSE Leap 15.6 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.6.1
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.10 /usr/bin/python3
# but we need at least 3.7 to compile Qt 6.8.3
RUN rm /usr/bin/python3 && ln -s /usr/bin/python3.11 /usr/bin/python3
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 50
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 50
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
ENV CC=gcc

View File

@ -2,7 +2,7 @@
# https://snapcraft.io/docs/build-on-docker
# https://github.com/canonical/snapcraft/issues/5079#issuecomment-2414199613
ARG UBUNTU=focal
ARG UBUNTU=noble
FROM ubuntu:$UBUNTU AS builder
ARG UBUNTU
@ -16,16 +16,6 @@ RUN apt-get install --yes \
jq \
squashfs-tools
# Download and unpack the core22 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22' | jq '.download_url' -r) --output core22.snap
RUN mkdir -p /snap/core22
RUN unsquashfs -d /snap/core22/current core22.snap
# Download and unpack the core20 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core20' | jq '.download_url' -r) --output core20.snap
RUN mkdir -p /snap/core20
RUN unsquashfs -d /snap/core20/current core20.snap
# Download and unpack the core24 snap
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core24' | jq '.download_url' -r) --output core24.snap
RUN mkdir -p /snap/core24
@ -48,8 +38,6 @@ RUN chmod +x /snap/bin/snapcraft
# time so they can be cached.
FROM ubuntu:$UBUNTU
COPY --from=builder /snap/core20 /snap/core20
COPY --from=builder /snap/core22 /snap/core22
COPY --from=builder /snap/core24 /snap/core24
COPY --from=builder /snap/snapcraft /snap/snapcraft
COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
@ -57,10 +45,6 @@ COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
# Generate locale and install dependencies.
RUN apt-get update && apt-get dist-upgrade --yes && apt-get install --yes snapd sudo apt-transport-https locales wget && locale-gen en_US.UTF-8
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
# Set the proper environment.
ENV LANG="en_US.UTF-8"
ENV LANGUAGE="en_US:en"
@ -69,6 +53,7 @@ ENV PATH="/snap/bin:/snap/snapcraft/current/usr/bin:/snap/snapcraft/current/libe
ENV SNAP="/snap/snapcraft/current"
ENV SNAP_NAME="snapcraft"
ENV SNAP_ARCH="amd64"
ENV SNAPCRAFT_BUILD_ENVIRONMENT=host
ADD extras/packaging/gnu-linux/scripts/build-package-snap.sh /opt/build-package-snap.sh
CMD ["/opt/build-package-snap.sh"]

View File

@ -1,42 +0,0 @@
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget \
curl
# Installing GCC 10 because GCC 9 (the default on Ubuntu 20.04) doesn't support
# the --std=gnu++20 option, which is used by one of Qt 6.6.1's dependencies
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 10
# nodejs
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt install nodejs -y
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on Ubuntu 20.04 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -23,5 +23,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -21,5 +21,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -18,12 +18,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Remove the libre2-dev package in order to force Qt to build using the bundled
# version of the RE2 library. This is necessary because the system version of the
# library on Ubuntu 25.04 (libre2-11) is not compatible with the one used in
# Qt 6.6.1 due to an API change:
# https://codereview.qt-project.org/c/qt/qtwebengine/+/516094
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,4 +1,4 @@
FROM debian:bullseye
FROM ubuntu:25.10
ENV DEBIAN_FRONTEND=noninteractive
@ -7,13 +7,9 @@ RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
git \
python-is-python3 \
wget \
curl
# nodejs
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt install nodejs -y
wget
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
@ -23,15 +19,6 @@ RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Install CMake 3.21 for Qt 6
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on Debian 11 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,348 +0,0 @@
From 24fb774485f719df1e84dda31605d3f69202d69f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Thu, 8 Aug 2024 14:59:17 -0400
Subject: [PATCH] qtwebengine: enable building with Python 3.12
Replace the deprecated imp module by importlib:
https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/524014
https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/534568
Update six to fix html5lib import failure:
https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/535605
https://issues.chromium.org/issues/40286977
---
.../protobufs/binary_proto_generator.py | 8 ++++++--
.../mojo/public/tools/mojom/mojom/fileutil.py | 1 -
.../tools/mojom/mojom/fileutil_unittest.py | 5 +----
.../mojom/mojom/generate/generator_unittest.py | 7 ++-----
.../mojom/mojom/generate/translate_unittest.py | 4 ----
.../tools/mojom/mojom/parse/ast_unittest.py | 6 ------
.../mojom/parse/conditional_features_unittest.py | 8 ++------
.../mojo/public/tools/mojom/mojom/parse/lexer.py | 1 -
.../tools/mojom/mojom/parse/lexer_unittest.py | 7 ++-----
.../tools/mojom/mojom/parse/parser_unittest.py | 5 -----
.../third_party/catapult/third_party/six/six.py | 16 ++++++++++++++++
11 files changed, 29 insertions(+), 39 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
index 2a1802dccdc..8b9de65ed0b 100755
--- a/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
+++ b/qtwebengine/src/3rdparty/chromium/components/resources/protobufs/binary_proto_generator.py
@@ -9,7 +9,7 @@
"""
from __future__ import print_function
import abc
-import imp
+from importlib import util as imp_util
import optparse
import os
import re
@@ -68,7 +68,11 @@ class GoogleProtobufModuleImporter:
raise ImportError(fullname)
filepath = self._fullname_to_filepath(fullname)
- return imp.load_source(fullname, filepath)
+ spec = imp_util.spec_from_file_location(fullname, filepath)
+ loaded = imp_util.module_from_spec(spec)
+ spec.loader.exec_module(loaded)
+
+ return loaded
class BinaryProtoGenerator:
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
index 29daec367c5..124f12c134b 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil.py
@@ -3,7 +3,6 @@
# found in the LICENSE file.
import errno
-import imp
import os.path
import sys
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
index 48eaf4eca94..c93d22898d2 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/fileutil_unittest.py
@@ -2,19 +2,16 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
import os.path
import shutil
-import sys
import tempfile
import unittest
from mojom import fileutil
-
class FileUtilTest(unittest.TestCase):
def testEnsureDirectoryExists(self):
- """Test that EnsureDirectoryExists fuctions correctly."""
+ """Test that EnsureDirectoryExists functions correctly."""
temp_dir = tempfile.mkdtemp()
try:
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
index 76cda3981f3..7143e07c4d7 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/generator_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os.path
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -20,12 +19,11 @@ def _GetDirAbove(dirname):
try:
- imp.find_module("mojom")
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
from mojom.generate import generator
-
class StringManipulationTest(unittest.TestCase):
"""generator contains some string utilities, this tests only those."""
@@ -69,6 +67,5 @@ class StringManipulationTest(unittest.TestCase):
self.assertEquals("SNAKE_D3D11_CASE",
generator.ToUpperSnakeCase("snakeD3d11Case"))
-
if __name__ == "__main__":
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
index 4259374513f..558e71e1193 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/generate/translate_unittest.py
@@ -2,16 +2,12 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.generate import module as mojom
from mojom.generate import translate
from mojom.parse import ast
-
class TranslateTest(unittest.TestCase):
"""Tests |parser.Parse()|."""
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
index c36376712e7..b289f7b11f6 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/ast_unittest.py
@@ -2,14 +2,10 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.parse import ast
-
class _TestNode(ast.NodeBase):
"""Node type for tests."""
@@ -20,13 +16,11 @@ class _TestNode(ast.NodeBase):
def __eq__(self, other):
return super().__eq__(other) and self.value == other.value
-
class _TestNodeList(ast.NodeListBase):
"""Node list type for tests."""
_list_item_type = _TestNode
-
class ASTTest(unittest.TestCase):
"""Tests various AST classes."""
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
index 5fc582025ee..2fa5d2be6ab 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/conditional_features_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -18,9 +17,8 @@ def _GetDirAbove(dirname):
if tail == dirname:
return path
-
try:
- imp.find_module('mojom')
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove('pylib'), 'pylib'))
import mojom.parse.ast as ast
@@ -29,7 +27,6 @@ import mojom.parse.parser as parser
ENABLED_FEATURES = frozenset({'red', 'green', 'blue'})
-
class ConditionalFeaturesTest(unittest.TestCase):
"""Tests |mojom.parse.conditional_features|."""
@@ -356,6 +353,5 @@ class ConditionalFeaturesTest(unittest.TestCase):
conditional_features.RemoveDisabledDefinitions,
definition, ENABLED_FEATURES)
-
if __name__ == '__main__':
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
index 73ca15df94c..1083a1af7bb 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer.py
@@ -2,7 +2,6 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
import os.path
import sys
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
index ce376da66e0..bc9f8354316 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/lexer_unittest.py
@@ -2,12 +2,11 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
+import importlib.util
import os.path
import sys
import unittest
-
def _GetDirAbove(dirname):
"""Returns the directory "above" this file containing |dirname| (which must
also be "above" this file)."""
@@ -18,17 +17,15 @@ def _GetDirAbove(dirname):
if tail == dirname:
return path
-
sys.path.insert(1, os.path.join(_GetDirAbove("mojo"), "third_party"))
from ply import lex
try:
- imp.find_module("mojom")
+ importlib.util.find_spec("mojom")
except ImportError:
sys.path.append(os.path.join(_GetDirAbove("pylib"), "pylib"))
import mojom.parse.lexer
-
# This (monkey-patching LexToken to make comparison value-based) is evil, but
# we'll do it anyway. (I'm pretty sure ply's lexer never cares about comparing
# for object identity.)
diff --git a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
index 0513343ec7e..0a26307b1a3 100644
--- a/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
+++ b/qtwebengine/src/3rdparty/chromium/mojo/public/tools/mojom/mojom/parse/parser_unittest.py
@@ -2,16 +2,12 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-import imp
-import os.path
-import sys
import unittest
from mojom.parse import ast
from mojom.parse import lexer
from mojom.parse import parser
-
class ParserTest(unittest.TestCase):
"""Tests |parser.Parse()|."""
@@ -1375,6 +1371,5 @@ class ParserTest(unittest.TestCase):
r" *associated\? MyInterface& a;$"):
parser.Parse(source3, "my_file.mojom")
-
if __name__ == "__main__":
unittest.main()
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/catapult/third_party/six/six.py b/qtwebengine/src/3rdparty/chromium/third_party/catapult/third_party/six/six.py
index 83f69783d1a..5e7f0ce4437 100644
--- a/qtwebengine/src/3rdparty/chromium/third_party/catapult/third_party/six/six.py
+++ b/qtwebengine/src/3rdparty/chromium/third_party/catapult/third_party/six/six.py
@@ -71,6 +71,11 @@ else:
MAXSIZE = int((1 << 63) - 1)
del X
+if PY34:
+ from importlib.util import spec_from_loader
+else:
+ spec_from_loader = None
+
def _add_doc(func, doc):
"""Add documentation to a function."""
@@ -186,6 +191,11 @@ class _SixMetaPathImporter(object):
return self
return None
+ def find_spec(self, fullname, path, target=None):
+ if fullname in self.known_modules:
+ return spec_from_loader(fullname, self)
+ return None
+
def __get_module(self, fullname):
try:
return self.known_modules[fullname]
@@ -223,6 +233,12 @@ class _SixMetaPathImporter(object):
return None
get_source = get_code # same as get_code
+ def create_module(self, spec):
+ return self.load_module(spec.name)
+
+ def exec_module(self, module):
+ pass
+
_importer = _SixMetaPathImporter(__name__)
--
2.34.1

View File

@ -0,0 +1,39 @@
From 0d0856252b48895a8d6cad7bff66c904ccfc0725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 16 Jul 2025 13:49:54 -0400
Subject: [PATCH] qtwebengine: fix build error due to missing chromium
dependency
Error:
In file included from ../../../3rdparty/chromium/ui/gl/gl_surface.h:30,
from ../../../3rdparty/chromium/tools/v8_context_snapshot/qt_overrides.cc:13:
../../../3rdparty/chromium/ui/gl/gl_implementation.h:18:10: fatal error: ui/gl/buildflags.h: No such file or directory
18 | #include "ui/gl/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Patch taken from: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/637889
---
.../src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
index 812445d934..97cd46140d 100644
--- a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
@@ -455,6 +455,10 @@ if (is_linux && !is_qtwebengine) {
output_name = "webenginedriver"
deps -= [ "//net/traffic_annotation:test_support" ]
+ if (is_linux || is_mac) {
+ deps += [ "//ui/gl:buildflags" ]
+ }
+
if (is_linux) {
sources += [
"//content/public/common/content_switches.cc",
--
2.34.1

View File

@ -1,16 +0,0 @@
qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
index 3488120543..120e47a76f 100644
--- a/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
+++ b/qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
@@ -472,7 +472,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length)
}
catch (const DeadlyImportError& e)
{
- if (!is64bits && (length > std::numeric_limits<std::uint32_t>::max())) {
+ if (!is64bits && (length > std::numeric_limits<uint32_t>::max())) {
throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (", ai_to_string(version), ") of the FBX format. (", e.what(), ")");
}
throw;

View File

@ -0,0 +1,79 @@
From 24dd03e131cd3edc89907a699369562e61d8aa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Mon, 21 Jul 2025 13:19:58 -0400
Subject: [PATCH] qtwebengine: fix ASSERT_TRIVIALLY_COPYABLE failure
Some compilers don't implement std::is_trivially_copyable correctly,
which can cause chromium's build to fail with the following error:
In file included from ../../../3rdparty/chromium/v8/src/base/bits.h:12,
from ../../../3rdparty/chromium/v8/src/base/small-vector.h:12,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/graph.h:17,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.h:9,
from ./../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.cc:5,
from gen/v8/v8_turboshaft_jumbo_1.cc:5:
../../../3rdparty/chromium/v8/src/base/small-vector.h: In instantiation of 'class v8::base::SmallVector&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt;, 16&gt;':
../../../3rdparty/chromium/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:433:11: required from here
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: error: static assertion failed: T should be trivially copyable
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: note: 'v8::base::is_trivially_copyable&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt; &gt;::value' evaluates to false
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
References:
https://chromium-review.googlesource.com/c/v8/v8/+/5679182
https://chromium-review.googlesource.com/c/v8/v8/+/5872655
https://github.com/rubyjs/libv8-node/pull/57
https://github.com/nodejs/node/issues/54576
---
qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h | 3 ++-
qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
index 93a99ec136..88c6555189 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
@@ -173,7 +173,8 @@ namespace base {
// base::is_trivially_copyable will differ for these cases.
template <typename T>
struct is_trivially_copyable {
-#if V8_CC_MSVC
+#if V8_CC_MSVC || (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) || \
+ (defined(__clang__) && __clang_major__ <= 17)
// Unfortunately, MSVC 2015 is broken in that std::is_trivially_copyable can
// be false even though it should be true according to the standard.
// (status at 2018-02-26, observed on the msvc waterfall bot).
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
index b1b5d64198..ce2e003fb9 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
@@ -22,7 +22,7 @@ template <typename T, size_t kSize, typename Allocator = std::allocator<T>>
class SmallVector {
// Currently only support trivially copyable and trivially destructible data
// types, as it uses memcpy to copy elements and never calls destructors.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
static_assert(std::is_trivially_destructible<T>::value);
public:
@@ -193,7 +193,7 @@ class SmallVector {
void resize_no_init(size_t new_size) {
// Resizing without initialization is safe if T is trivially copyable.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
if (new_size > capacity()) Grow(new_size);
end_ = begin_ + new_size;
}
--
2.34.1

View File

@ -1,26 +0,0 @@
From cf208d11dc8a9a02160a57283596ec8bab964a09 Mon Sep 17 00:00:00 2001
From: Sebastien Blin <sebastien.blin@savoirfairelinux.com>
Date: Mon, 27 May 2024 16:01:21 -0400
Subject: [PATCH] qtwayland: downgrade wl-seat to avoid high-resolution
scrolling events
---
qtwayland/src/client/qwaylandinputdevice.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/qtwayland/src/client/qwaylandinputdevice.cpp b/qtwayland/src/client/qwaylandinputdevice.cpp
index a4f8757e3c..ad0aa7941c 100644
--- a/qtwayland/src/client/qwaylandinputdevice.cpp
+++ b/qtwayland/src/client/qwaylandinputdevice.cpp
@@ -383,7 +383,7 @@ QWaylandInputDevice::Touch::~Touch()
}
QWaylandInputDevice::QWaylandInputDevice(QWaylandDisplay *display, int version, uint32_t id)
- : QtWayland::wl_seat(display->wl_registry(), id, qMin(version, 9))
+ : QtWayland::wl_seat(display->wl_registry(), id, qMin(version, 7))
, mQDisplay(display)
, mDisplay(display->wl_display())
{
--
2.45.0

View File

@ -0,0 +1,49 @@
From 5c247c7a084661932969acf2f7103096b8b0d6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Tue, 22 Jul 2025 13:40:55 -0400
Subject: [PATCH] qtwebengine: fix zygote_communication_linux dependency
Commit 42e09c7bea of qtwebengine-chromium added
content/public/browser/child_process_host.h to the list of header files
included in zygote_communication_linux.cc, which can cause the build to
fail with the following error:
In file included from ../../../3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc:21:
../../../3rdparty/chromium/content/public/browser/child_process_host.h:17:10: fatal error: content/common/buildflags.h: No such file or directory
17 | #include "content/common/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
.../content/common/zygote/zygote_communication_linux.cc | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
index 5bd9a53568..ff883d59e4 100644
--- a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
+++ b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
@@ -18,7 +18,7 @@
#include "base/posix/eintr_wrapper.h"
#include "base/posix/unix_domain_socket.h"
#include "content/common/zygote/zygote_commands_linux.h"
-#include "content/public/browser/child_process_host.h"
+#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "sandbox/policy/switches.h"
@@ -237,8 +237,11 @@ void ZygoteCommunication::Init(
base::OnceCallback<pid_t(base::CommandLine*, base::ScopedFD*)> launcher) {
CHECK(!init_);
- base::FilePath chrome_path = content::ChildProcessHost::GetChildPath(
- content::ChildProcessHost::CHILD_NORMAL);
+ base::FilePath chrome_path = base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
+ switches::kBrowserSubprocessPath);
+ if (chrome_path.empty()) {
+ base::PathService::Get(CHILD_PROCESS_EXE, &chrome_path);
+ }
base::CommandLine cmd_line(chrome_path);
cmd_line.AppendSwitchASCII(switches::kProcessType, switches::kZygoteProcess);
--
2.34.1

View File

@ -1,40 +0,0 @@
From 420b3e5ac2e91b7a99488ac34577e2798a84a68c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Tue, 6 Aug 2024 17:35:56 -0400
Subject: [PATCH] qtbase: fix CMake error
For more information, see:
https://github.com/qt/qtbase/commit/3411f2984a5325a35e3bed1f961e5973d8a565b9
---
qtbase/configure.cmake | 1 +
qtbase/src/corelib/CMakeLists.txt | 1 -
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/qtbase/configure.cmake b/qtbase/configure.cmake
index 43de2aa026..37a82dcdb6 100644
--- a/qtbase/configure.cmake
+++ b/qtbase/configure.cmake
@@ -18,6 +18,7 @@ if(TARGET ZLIB::ZLIB)
set_property(TARGET ZLIB::ZLIB PROPERTY IMPORTED_GLOBAL TRUE)
endif()
+qt_find_package(Threads PROVIDED_TARGETS Threads::Threads)
qt_find_package(WrapOpenSSLHeaders PROVIDED_TARGETS WrapOpenSSLHeaders::WrapOpenSSLHeaders MODULE_NAME core)
# openssl_headers
# OPENSSL_VERSION_MAJOR is not defined for OpenSSL 1.1.1
diff --git a/qtbase/src/corelib/CMakeLists.txt b/qtbase/src/corelib/CMakeLists.txt
index 31b81734e8..b62e2f763b 100644
--- a/qtbase/src/corelib/CMakeLists.txt
+++ b/qtbase/src/corelib/CMakeLists.txt
@@ -1,7 +1,6 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
-qt_find_package(Threads PROVIDED_TARGETS Threads::Threads)
qt_find_package(WrapPCRE2 PROVIDED_TARGETS WrapPCRE2::WrapPCRE2)
qt_find_package(WrapZLIB PROVIDED_TARGETS WrapZLIB::WrapZLIB)
--
2.34.1

View File

@ -1,40 +0,0 @@
From 4c7360faeb0fb7f1dfd995619fb8c596b4e15606 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Thu, 8 Aug 2024 10:29:43 -0400
Subject: [PATCH] qtwebengine: add missing chromium dependencies
For more information, see:
https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/555586
---
chromium/content/public/browser/BUILD.gn | 1 +
chromium/extensions/browser/api/declarative_net_request/BUILD.gn | 1 +
2 files changed, 2 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn b/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
index b25bf5764e7..dfbfb2ec77b 100644
--- a/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
@@ -515,6 +515,7 @@ jumbo_source_set("browser_sources") {
"//cc",
"//components/services/storage/public/cpp",
"//components/viz/host",
+ "//components/spellcheck:buildflags",
"//content/browser", # Must not be public_deps!
"//device/fido",
"//gpu",
diff --git a/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn b/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
index 1fc492f5a0c..13a266e22f1 100644
--- a/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
@@ -23,6 +23,7 @@ source_set("declarative_net_request") {
"//extensions/common",
"//extensions/common/api",
"//services/preferences/public/cpp",
+ "//components/web_cache/browser",
]
public_deps = [ "//extensions/browser:browser_sources" ]
--
2.34.1

View File

@ -1,49 +0,0 @@
From ab6d5bebaf68a9f4d00440b2adbaffe0e5b2ae6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Thu, 8 Aug 2024 10:55:08 -0400
Subject: [PATCH] qtwebengine: fix libxml2 build error
Version 2.12 of libxml2 introduced a change that broke chromium's build,
see: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/523633
---
.../third_party/blink/renderer/core/xml/xslt_processor.h | 5 +++++
.../blink/renderer/core/xml/xslt_processor_libxslt.cc | 4 ++++
2 files changed, 9 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor.h b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor.h
index d53835e9675..72536e4fd7d 100644
--- a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor.h
+++ b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor.h
@@ -77,7 +77,12 @@ class XSLTProcessor final : public ScriptWrappable {
void reset();
+#if LIBXML_VERSION >= 21200
+ static void ParseErrorFunc(void* user_data, const xmlError*);
+#else
static void ParseErrorFunc(void* user_data, xmlError*);
+#endif
+
static void GenericErrorFunc(void* user_data, const char* msg, ...);
// Only for libXSLT callbacks
diff --git a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc
index 133e0b3355d..e8e6a09f485 100644
--- a/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc
+++ b/qtwebengine/src/3rdparty/chromium/third_party/blink/renderer/core/xml/xslt_processor_libxslt.cc
@@ -66,7 +66,11 @@ void XSLTProcessor::GenericErrorFunc(void*, const char*, ...) {
// It would be nice to do something with this error message.
}
+#if LIBXML_VERSION >= 21200
+void XSLTProcessor::ParseErrorFunc(void* user_data, const xmlError* error) {
+#else
void XSLTProcessor::ParseErrorFunc(void* user_data, xmlError* error) {
+#endif
FrameConsole* console = static_cast<FrameConsole*>(user_data);
if (!console)
return;
--
2.34.1

View File

@ -1,34 +0,0 @@
From 6e0848a1c51c6494e3b7410c5fe38941d48fcb36 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 16 Oct 2024 22:32:12 -0400
Subject: [PATCH] qtwebengine: fix v8 build error
In file included from ../../../3rdparty/chromium/v8/src/heap/cppgc/sweeper.h:14,
from ./../../../3rdparty/chromium/v8/src/heap/cppgc/sweeper.cc:5,
from gen/v8/cppgc_base_jumbo_7.cc:5:
../../../3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h: In member function 'void cppgc::internal::StatsCollector::ForAllAllocationObservers(Callback)':
../../../3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h:401:48: error: cannot convert 'std::vector&lt;cppgc::internal::StatsCollector::AllocationObserver*&gt;::iterator' to 'const char*'
401 | std::remove(allocation_observers_.begin(), allocation_observers_.end(),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
| |
| std::vector&lt;cppgc::internal::StatsCollector::AllocationObserver*&gt;::iterator
---
.../src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
index 2cf728489d..d8414ae3c6 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
@@ -8,6 +8,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <algorithm>
#include <atomic>
#include <vector>
--
2.47.0

View File

@ -1,7 +1,3 @@
0001-qtwebengine-enable-building-with-Python-3.12.patch
0002-fix-binary-tokenizer.patch
0003-qtwayland-downgrade-wl-seat-to-avoid-high-resolution.patch
0004-qtbase-fix-CMake-error.patch
0005-qtwebengine-add-missing-chromium-dependencies.patch
0006-qtwebengine-fix-libxml2-build-error.patch
0007-qtwebengine-fix-v8-build-error.patch
0001-qtwebengine-fix-build-error-due-to-missing-chromium-dependency.patch
0002-qtwebengine-fix-ASSERT_TRIVIALLY_COPYABLE-failure.patch
0003-qtwebengine-fix-zygote_communication_linux-dependency.patch

View File

@ -12,10 +12,14 @@ override_dh_auto_configure:
-confirm-license \
-nomake examples \
-nomake tests \
-prefix "${QT_JAMI_PREFIX}"
-prefix "${QT_JAMI_PREFIX}" \
-- -DFFMPEG_DIR=/opt/libqt-jami-ffmpeg -DQT_DEPLOY_FFMPEG=ON
override_dh_auto_build:
cmake --build . --parallel
override_dh_auto_install:
cmake --install . --prefix $(CURDIR)/debian/tmp/${QT_JAMI_PREFIX}
override_dh_shlibdeps:
dh_shlibdeps -v -l$(CURDIR)/debian/libqt-jami/usr/lib/libqt-jami/lib

View File

@ -45,8 +45,7 @@ Build-Depends: debhelper (>= 9),
libvdpau-dev,
libssl-dev,
libargon2-dev | libargon2-0-dev,
# TODO: remove libpipewire-0.2-dev once we stop supporting Ubuntu 20.04
libpipewire-0.3-dev | libpipewire-0.2-dev,
libpipewire-0.3-dev,
# other
nasm,
yasm,

View File

@ -91,18 +91,18 @@ if [ -f /etc/os-release ]; then
. /etc/os-release
# Set-up Jami repository end tag
if [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
ENDTAG="debian_11"
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
if [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
ENDTAG="debian_12"
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
ENDTAG="ubuntu_20.04"
elif [ "${VERSION_CODENAME}" = "trixie" ] || [ "${ID}_${VERSION_ID}" = "debian_13" ]; then
ENDTAG="debian_13"
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then
ENDTAG="ubuntu_24.04"
elif [ "${UBUNTU_CODENAME}" = "plucky" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_25.04" ]; then
ENDTAG="ubuntu_25.04"
elif [ "${UBUNTU_CODENAME}" = "questing" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_25.10" ]; then
ENDTAG="ubuntu_25.10"
elif [ "${ID}" = "debian" ] && \
[ "$(command -v lsb_release)" ] && \
[ "$(lsb_release -rs)" = "testing" ]; then

View File

@ -45,7 +45,7 @@ QT_JAMI_PREFIX := ${QT_JAMI_PREFIX}
export PATH := $(QT_JAMI_PREFIX)/bin:${PATH}
export LD_LIBRARY_PATH := $(QT_JAMI_PREFIX)/lib:${LD_LIBRARY_PATH}
export PKG_CONFIG_PATH := $(QT_JAMI_PREFIX)/lib/pkgconfig:${PKG_CONFIG_PATH}
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX)/lib/cmake:${CMAKE_PREFIX_PATH}
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX):${CMAKE_PREFIX_PATH}
export CFLAGS := $(CFLAGS) -fno-lto
export CXXFLAGS := $(CXXFLAGS) -fno-lto
@ -95,8 +95,9 @@ override_dh_auto_build:
-DCMAKE_INSTALL_PREFIX=/usr \
-DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
-DENABLE_LIBWRAP=true \
-DBUILD_TESTING=Off \
$(CMAKE_OPTIONS) ..
make -C build -j$(NO_CPUS) V=1
make -C build -j$(NO_CPUS) VERBOSE=1
override_dh_auto_clean:
# Daemon clean

View File

@ -82,7 +82,6 @@ cd %{_builddir}/jami-%{version}/daemon/contrib/native && \
make list && \
make fetch && \
make %{_smp_mflags} V=1 && \
make %{_smp_mflags} V=1 .ffmpeg
# Configure the daemon.
cd %{_builddir}/jami-%{version}/daemon && \
./autogen.sh && \

View File

@ -16,9 +16,9 @@
%define computed_job_count_ %(echo $(( %available_memory / %memory_required_per_core / %max_parallel_builds )))
%define computed_job_count %max %computed_job_count_ 1
%define job_count %min %cpu_count %computed_job_count
# Exclude vendored Qt6 from dependency generator
# Exclude vendored Qt6 and FFmpeg libraries from dependency generator
%define __provides_exclude_from ^%{_libdir}/qt-jami/.*$
%define __requires_exclude ^libQt6.*$
%define __requires_exclude ^(libQt6.*|libavcodec.*|libavformat.*|libavutil.*|libswresample.*|libswscale.*)$
Name: %{name}
Version: %{version}
@ -29,9 +29,9 @@ License: GPLv3+
Vendor: Savoir-faire Linux Inc.
URL: https://jami.net/
Source: jami-libqt-%{version}.tar.xz
Patch0: 0001-fix-gcc14.patch
Patch1: 0002-qtwebengine-add-missing-chromium-dependencies.patch
Patch2: 0003-fix-embree-linking-errors.patch
Patch0: 0001-qtwebengine-fix-build-error-due-to-missing-chromium-dependency.patch
Patch1: 0002-qtwebengine-fix-ASSERT_TRIVIALLY_COPYABLE-failure.patch
Patch2: 0003-qtwebengine-fix-zygote_communication_linux-dependency.patch
%global gst 0.10
%if 0%{?fedora} || 0%{?rhel} > 7
@ -73,31 +73,6 @@ This package contains Qt libraries for Jami.
%build
echo "Building Qt using %{job_count} parallel jobs"
# Qt 6.4 (https://wiki.linuxfromscratch.org/blfs/ticket/14729)
sed -i 's,default=False,default=True,g' qtwebengine/src/3rdparty/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents.py
# Gcc 13
sed -i 's,std::uint32_t,uint32_t,g' qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
sed -i 's,std::uint32_t,uint32_t,g' qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
# https://bugs.gentoo.org/768261 (Qt 5.15)
sed -i 's,#include "absl/base/internal/spinlock.h"1,#include "absl/base/internal/spinlock.h"1\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc
sed -i 's,#include <stdint.h>,#include <stdint.h>\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h
# else, break build for fedora 35
sed -i 's/static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);/static const size_t kSigStackSize = std::max(size_t(16384), size_t(SIGSTKSZ));/g' qtwebengine/src/3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
# https://bugreports.qt.io/browse/QTBUG-93452 (Qt 5.15)
sed -i 's,# include <utility>,# include <utility>\n# include <limits>,g' qtbase/src/corelib/global/qglobal.h
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qendian.h
cat qtbase/src/corelib/global/qendian.h
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
cat qtwebengine/configure.cmake
#https://bugreports.qt.io/browse/QTBUG-117979
if test -f "/usr/bin/python3.10"; then
/usr/bin/python3.10 -m venv env
source env/bin/activate
python -m pip install html5lib
python -m pip install six
fi
# recent gcc version do not like lto from qt
CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) ${LDFLAGS}" ./configure \
@ -105,8 +80,8 @@ CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) $
-confirm-license \
-nomake examples \
-nomake tests \
-prefix "%{_libdir}/qt-jami"
sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
-prefix "%{_libdir}/qt-jami" \
-- -DFFMPEG_DIR=/opt/libqt-jami-ffmpeg -DQT_DEPLOY_FFMPEG=ON
# Chromium is built using Ninja, which doesn't honor MAKEFLAGS.
cmake --build . --parallel

View File

@ -74,8 +74,10 @@ cd %{_builddir}/jami-%{version} && \
-DWITH_DAEMON_SUBMODULE=true \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_VERSION=${BUILD_VERSION} \
-DCMAKE_PREFIX_PATH=%{QT_JAMI_PREFIX} \
-DBUILD_TESTING=Off \
..
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} V=2
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} VERBOSE=1
%install
DESTDIR=%{buildroot} make -C %{_builddir}/jami-%{version}/build install V=2

View File

@ -1,26 +0,0 @@
From 9721082687c9529fe6ae3c5304dcf079158e8a77 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Sun, 04 Jun 2023 04:15:16 +0100
Subject: [PATCH] heap: Add missing <algorithm> include for std::remove
GCC 14 changes some internal includes within libstdc++ so this transient
include gets lost. Include <algorithm> explicitly for std::remove.
Change-Id: Iab8a2c751a0f9c9dc6a770d6296ad6de724ef3bb
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4583222
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#88037}
---
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
index 2cf728489d..d8414ae3c6 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/heap/cppgc/stats-collector.h
@@ -8,6 +8,7 @@
#include <stddef.h>
#include <stdint.h>
+#include <algorithm>
#include <atomic>
#include <vector>

View File

@ -0,0 +1,39 @@
From 0d0856252b48895a8d6cad7bff66c904ccfc0725 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 16 Jul 2025 13:49:54 -0400
Subject: [PATCH] qtwebengine: fix build error due to missing chromium
dependency
Error:
In file included from ../../../3rdparty/chromium/ui/gl/gl_surface.h:30,
from ../../../3rdparty/chromium/tools/v8_context_snapshot/qt_overrides.cc:13:
../../../3rdparty/chromium/ui/gl/gl_implementation.h:18:10: fatal error: ui/gl/buildflags.h: No such file or directory
18 | #include "ui/gl/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
Patch taken from: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/637889
---
.../src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
index 812445d934..97cd46140d 100644
--- a/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/chrome/test/chromedriver/BUILD.gn
@@ -455,6 +455,10 @@ if (is_linux && !is_qtwebengine) {
output_name = "webenginedriver"
deps -= [ "//net/traffic_annotation:test_support" ]
+ if (is_linux || is_mac) {
+ deps += [ "//ui/gl:buildflags" ]
+ }
+
if (is_linux) {
sources += [
"//content/public/common/content_switches.cc",
--
2.34.1

View File

@ -1,40 +0,0 @@
From 04778c7f54c8a1a0e7fced75c5ef39ced82cece1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Sat, 12 Oct 2024 16:21:35 -0400
Subject: [PATCH] qtwebengine: add missing chromium dependencies
For more information, see:
https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/555586
---
chromium/content/public/browser/BUILD.gn | 1 +
chromium/extensions/browser/api/declarative_net_request/BUILD.gn | 1 +
2 files changed, 2 insertions(+)
diff --git a/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn b/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
index b25bf5764e7..dfbfb2ec77b 100644
--- a/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/content/public/browser/BUILD.gn
@@ -515,6 +515,7 @@ jumbo_source_set("browser_sources") {
"//cc",
"//components/services/storage/public/cpp",
"//components/viz/host",
+ "//components/spellcheck:buildflags",
"//content/browser", # Must not be public_deps!
"//device/fido",
"//gpu",
diff --git a/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn b/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
index 1fc492f5a0c..13a266e22f1 100644
--- a/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
+++ b/qtwebengine/src/3rdparty/chromium/extensions/browser/api/declarative_net_request/BUILD.gn
@@ -23,6 +23,7 @@ source_set("declarative_net_request") {
"//extensions/common",
"//extensions/common/api",
"//services/preferences/public/cpp",
+ "//components/web_cache/browser",
]
public_deps = [ "//extensions/browser:browser_sources" ]
--
2.47.0

View File

@ -0,0 +1,79 @@
From 24dd03e131cd3edc89907a699369562e61d8aa86 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Mon, 21 Jul 2025 13:19:58 -0400
Subject: [PATCH] qtwebengine: fix ASSERT_TRIVIALLY_COPYABLE failure
Some compilers don't implement std::is_trivially_copyable correctly,
which can cause chromium's build to fail with the following error:
In file included from ../../../3rdparty/chromium/v8/src/base/bits.h:12,
from ../../../3rdparty/chromium/v8/src/base/small-vector.h:12,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/graph.h:17,
from ../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.h:9,
from ./../../../3rdparty/chromium/v8/src/compiler/turboshaft/analyzer-iterator.cc:5,
from gen/v8/v8_turboshaft_jumbo_1.cc:5:
../../../3rdparty/chromium/v8/src/base/small-vector.h: In instantiation of 'class v8::base::SmallVector&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt;, 16&gt;':
../../../3rdparty/chromium/v8/src/compiler/turboshaft/loop-unrolling-reducer.h:433:11: required from here
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: error: static assertion failed: T should be trivially copyable
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
../../../3rdparty/chromium/v8/src/base/macros.h:206:55: note: 'v8::base::is_trivially_copyable&lt;std::pair&lt;const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex&gt; &gt;::value' evaluates to false
206 | static_assert(::v8::base::is_trivially_copyable&lt;T&gt;::value, \
| ^~~~~
../../../3rdparty/chromium/v8/src/base/small-vector.h:25:3: note: in expansion of macro 'ASSERT_TRIVIALLY_COPYABLE'
25 | ASSERT_TRIVIALLY_COPYABLE(T);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
References:
https://chromium-review.googlesource.com/c/v8/v8/+/5679182
https://chromium-review.googlesource.com/c/v8/v8/+/5872655
https://github.com/rubyjs/libv8-node/pull/57
https://github.com/nodejs/node/issues/54576
---
qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h | 3 ++-
qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
index 93a99ec136..88c6555189 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/macros.h
@@ -173,7 +173,8 @@ namespace base {
// base::is_trivially_copyable will differ for these cases.
template <typename T>
struct is_trivially_copyable {
-#if V8_CC_MSVC
+#if V8_CC_MSVC || (__GNUC__ == 12 && __GNUC_MINOR__ <= 2) || \
+ (defined(__clang__) && __clang_major__ <= 17)
// Unfortunately, MSVC 2015 is broken in that std::is_trivially_copyable can
// be false even though it should be true according to the standard.
// (status at 2018-02-26, observed on the msvc waterfall bot).
diff --git a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
index b1b5d64198..ce2e003fb9 100644
--- a/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
+++ b/qtwebengine/src/3rdparty/chromium/v8/src/base/small-vector.h
@@ -22,7 +22,7 @@ template <typename T, size_t kSize, typename Allocator = std::allocator<T>>
class SmallVector {
// Currently only support trivially copyable and trivially destructible data
// types, as it uses memcpy to copy elements and never calls destructors.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
static_assert(std::is_trivially_destructible<T>::value);
public:
@@ -193,7 +193,7 @@ class SmallVector {
void resize_no_init(size_t new_size) {
// Resizing without initialization is safe if T is trivially copyable.
- ASSERT_TRIVIALLY_COPYABLE(T);
+ // ASSERT_TRIVIALLY_COPYABLE(T);
if (new_size > capacity()) Grow(new_size);
end_ = begin_ + new_size;
}
--
2.34.1

View File

@ -1,29 +0,0 @@
From 709d0b0cf45b920f63960a70725138dbaf7ec721 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Wed, 18 Jun 2025 15:53:55 -0400
Subject: [PATCH] Fix embree linking errors
Patch taken from:
https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=37bd373cd33c36f8dd44e71be25fa6ea24cf4588
---
qtquick3d/src/3rdparty/embree/CMakeLists.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/qtquick3d/src/3rdparty/embree/CMakeLists.txt b/qtquick3d/src/3rdparty/embree/CMakeLists.txt
index cf27196de2..332bbd17ca 100644
--- a/qtquick3d/src/3rdparty/embree/CMakeLists.txt
+++ b/qtquick3d/src/3rdparty/embree/CMakeLists.txt
@@ -62,6 +62,9 @@ if (IOS)
endif()
# Use SSE2 only, ignore AVX/SSE4.2 for now
+if (TEST_architecture_arch STREQUAL x86_64)
+ qt_internal_extend_target(BundledEmbree COMPILE_OPTIONS -mno-avx -mno-sse4.2)
+endif()
qt_internal_extend_target(BundledEmbree DEFINES
EMBREE_TARGET_SSE2
__SSE2__
--
2.34.1

View File

@ -0,0 +1,49 @@
From 5c247c7a084661932969acf2f7103096b8b0d6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
Date: Tue, 22 Jul 2025 13:40:55 -0400
Subject: [PATCH] qtwebengine: fix zygote_communication_linux dependency
Commit 42e09c7bea of qtwebengine-chromium added
content/public/browser/child_process_host.h to the list of header files
included in zygote_communication_linux.cc, which can cause the build to
fail with the following error:
In file included from ../../../3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc:21:
../../../3rdparty/chromium/content/public/browser/child_process_host.h:17:10: fatal error: content/common/buildflags.h: No such file or directory
17 | #include "content/common/buildflags.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---
.../content/common/zygote/zygote_communication_linux.cc | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
index 5bd9a53568..ff883d59e4 100644
--- a/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
+++ b/qtwebengine/src/3rdparty/chromium/content/common/zygote/zygote_communication_linux.cc
@@ -18,7 +18,7 @@
#include "base/posix/eintr_wrapper.h"
#include "base/posix/unix_domain_socket.h"
#include "content/common/zygote/zygote_commands_linux.h"
-#include "content/public/browser/child_process_host.h"
+#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/common/result_codes.h"
#include "sandbox/policy/switches.h"
@@ -237,8 +237,11 @@ void ZygoteCommunication::Init(
base::OnceCallback<pid_t(base::CommandLine*, base::ScopedFD*)> launcher) {
CHECK(!init_);
- base::FilePath chrome_path = content::ChildProcessHost::GetChildPath(
- content::ChildProcessHost::CHILD_NORMAL);
+ base::FilePath chrome_path = base::CommandLine::ForCurrentProcess()->GetSwitchValuePath(
+ switches::kBrowserSubprocessPath);
+ if (chrome_path.empty()) {
+ base::PathService::Get(CHILD_PROCESS_EXE, &chrome_path);
+ }
base::CommandLine cmd_line(chrome_path);
cmd_line.AppendSwitchASCII(switches::kProcessType, switches::kZygoteProcess);
--
2.34.1

View File

@ -98,13 +98,13 @@ description: |
confinement: strict
grade: stable
base: core20
base: core24
plugs:
gnome-3-38-2004:
gnome-46-2404:
interface: content
target: $SNAP/gnome-platform
default-provider: gnome-3-38-2004:gnome-3-38-2004
default-provider: gnome-46-2404
gtk-3-themes:
interface: content
target: $SNAP/data-dir/themes
@ -117,6 +117,10 @@ plugs:
interface: content
target: $SNAP/data-dir/sounds
default-provider: gtk-common-themes:sounds-themes
gpu-2404:
interface: content
target: $SNAP/gpu-2404
default-provider: mesa-2404
slots:
dbus-jami:
@ -129,22 +133,24 @@ slots:
name: cx.ring.Ring
layout:
/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib:
bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib
/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib
/usr/share/alsa:
bind: $SNAP/usr/share/alsa
/usr/share/X11/xkb:
bind: $SNAP/usr/share/X11/xkb
/usr/share/X11/XErrorDB:
symlink: $SNAP/gpu-2404/X11/XErrorDB
environment:
XDG_CURRENT_DESKTOP: Unity
QT_BASE_DIR: "/usr/lib/libqt-jami"
LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP$QT_BASE_DIR/lib"
LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SNAP$QT_BASE_DIR/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pulseaudio:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy"
apps:
jami:
command: usr/bin/jami
command-chain:
- bin/gpu-2404-wrapper
- bin/desktop-launch
- snap/command-chain/alsa-launch
- bin/jami-wrapper
@ -153,8 +159,8 @@ apps:
desktop: usr/share/applications/net.jami.Jami.desktop
environment:
PIPEWIRE_CONFIG_NAME: "$SNAP/usr/share/pipewire/pipewire.conf"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/spa-0.2"
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/spa-0.2"
slots:
- dbus-jami
- dbus-ring
@ -185,7 +191,7 @@ package-repositories:
components: [main]
suites: [jami]
key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
url: https://dl.jami.net/internal/ubuntu_20.04/
url: https://dl.jami.net/internal/ubuntu_24.04/
parts:
desktop-launch:
@ -201,14 +207,14 @@ parts:
- devscripts
- equivs
override-pull: |
snapcraftctl pull
craftctl default
sed -i -E 's|\. \$SNAP/flavor-select|USE_gtk3=true|' gtk/launcher-specific
sed -i -E 's|\. \$SNAP/flavor-select|USE_qt5=true|' qt/launcher-specific
sed -i -E 's|(append_dir GTK_PATH \$RUNTIME/usr/lib/\$ARCH/gtk-2.0)|#\1|' qt/launcher-specific
sed -i -E 's|\$RUNTIME|$SNAP|g' qt/launcher-specific
sed -i -E 's|\$WITH_RUNTIME|no|g' qt/launcher-specific
override-build: |
snapcraftctl build
craftctl default
gcc -Wall -O2 -o bindtextdomain.so -fPIC -shared src/bindtextdomain.c -ldl
echo "#!/bin/bash" > desktop-launch
@ -224,10 +230,10 @@ parts:
cat common/mark-and-exec >> desktop-launch
install -D -m755 desktop-launch $SNAPCRAFT_PART_INSTALL/bin/desktop-launch
install -D -m644 bindtextdomain.so $SNAPCRAFT_PART_INSTALL/lib/bindtextdomain.so
install -D -m755 desktop-launch $CRAFT_PART_INSTALL/bin/desktop-launch
install -D -m644 bindtextdomain.so $CRAFT_PART_INSTALL/lib/bindtextdomain.so
mkdir -pv $SNAPCRAFT_PART_INSTALL/gnome-platform
mkdir -pv $CRAFT_PART_INSTALL/gnome-platform
scripts:
plugin: dump
@ -244,10 +250,15 @@ parts:
- -usr/lib/x86_64-linux-gnu/libproxy.so*
- -usr/share/doc/libp11-kit0/changelog.Debian.gz
- -usr/share/doc/libproxy1v5/changelog.Debian.gz
- -usr/lib/x86_64-linux-gnu/gio/modules/libdconfsettings.so
- -usr/lib/x86_64-linux-gnu/libdconf.so.1.0.0
- -usr/libexec/dconf-service
- -usr/share/doc/libdconf1/changelog.Debian.gz
- -usr/share/man/man1/dconf-service.1.gz
build-packages:
- libasound2-dev
stage-packages:
- libasound2
- libasound2t64
- libasound2-plugins
- yad
@ -264,53 +275,53 @@ parts:
build-environment:
- QT_BASE_DIR: "/usr/lib/libqt-jami"
- PATH: "$QT_BASE_DIR/bin:$PATH"
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib:$LD_LIBRARY_PATH"
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH"
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
override-pull: |
ls
snapcraftctl pull
craftctl default
sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg|' extras/data/net.jami.Jami.desktop
override-build: |
$SNAPCRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
cd $SNAPCRAFT_PART_BUILD/daemon/contrib
cd $CRAFT_PART_BUILD/daemon/contrib
mkdir -p native
cd native
../bootstrap
make .ffmpeg
make
cd $SNAPCRAFT_PART_BUILD/daemon
cd $CRAFT_PART_BUILD/daemon
./autogen.sh
./configure --prefix=/usr --without-dbus
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
cd $SNAPCRAFT_PART_BUILD/
mkdir build
cd $CRAFT_PART_BUILD/
mkdir -p build
cd build
cmake .. -DENABLE_LIBWRAP=true \
-DLIBJAMI_BUILD_DIR=$SNAPCRAFT_PART_BUILD/daemon/src \
-DLIBJAMI_BUILD_DIR=$CRAFT_PART_BUILD/daemon/src \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
-DCMAKE_PREFIX_PATH=$QT_BASE_DIR \
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER \
-DBUILD_TESTING=Off
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
build-packages:
- autoconf
- autoconf-archive
- automake
- autopoint
- bzip2
- cmake
- curl
- gcc
- g++
- gettext
- gzip
- libnotify-dev
- libpipewire-0.3-dev
- libqrencode-dev
- libsndfile1-dev
- libspeex-dev
- python3
- python3-dev
@ -318,13 +329,9 @@ parts:
- yasm
- wget
- nasm # ffmpeg
- libavcodec-dev
- libavdevice-dev
- libavformat-dev
- libswscale-dev
- libva-dev
- libvdpau-dev
- libargon2-0-dev # opendht
- libargon2-dev # opendht
- libexpat1-dev
- libjsoncpp-dev
- libnm-dev # connectivityChanged()
@ -337,54 +344,45 @@ parts:
- libgl-dev
- libvulkan-dev
- libgnutls28-dev # TLS
- gnutls-bin
- libssl-dev
- git # PipeWire build dependencies
- libasound2-dev #
- libdbus-1-dev # These packages are needed by the
- libglib2.0-dev # install-pipewire-from-source.sh
- ninja-build # script in order to build PipeWire
- pkg-config # from source.
stage-packages:
- libgnutls30
- libavutil56
- libdouble-conversion3
- libegl1
- libgbm1
- libgudev-1.0-0
- libjsoncpp1
- libllvm12
- libminizip1
- libjsoncpp25
- libminizip1t64
- libnm0
- libnotify4
- libnspr4
- libnss3
- libopengl0
- libopus0
- liborc-0.4-0
- libpcre2-16-0
- libpcre2-8-0
- pipewire-bin
- libqrencode4
- libqt-jami
- libsnappy1v5
- libspeex1
- libproxy1v5
- libwayland-server0
- libwebpdemux2
- libwebpmux3
- libxkbfile1
- libxtst6
- ocl-icd-libopencl1
- libva-drm2
- libva-glx2
- libva-wayland2
- libva2
- libvdpau-va-gl1
- libvdpau1
- va-driver-all
prime:
- -usr/lib/libqt-jami/bin/
- -usr/lib/libqt-jami/docs/
- -usr/lib/libqt-jami/examples/
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libLLVM-*.so*
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libclang-*.so*
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libflite*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libLLVM-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libclang-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite*.so*
gpu-2404:
after: [jami]
source: https://github.com/canonical/gpu-snap.git
plugin: dump
override-prime: |
craftctl default
${CRAFT_PART_SRC}/bin/gpu-2404-cleanup mesa-2404
# Workaround for https://bugs.launchpad.net/snapd/+bug/2055273
mkdir -p "${CRAFT_PRIME}/gpu-2404"
prime:
- bin/gpu-2404-wrapper

View File

@ -44,30 +44,12 @@ QUILT_REFRESH_ARGS="-p 1"
if [ ! -f "${qt_deb_path}" ] || [ "${FORCE_REBUILD_QT}" = "true" ]; then
(
# HACK: For now on ubuntu 24.04 there is no python3.10 package
# So create a PyEnv environment to install the required packages
# NOTE: We use this on Ubuntu 25.04 and Debian 13 ("trixie") too
# because otherwise we get a ModuleNotFoundError when building
# Qt 6.6.1 (specifically the chromium submodule in QtWebEngine)
# due to the version of python used (3.13) being too recent.
if cat /etc/os-release | grep -Eq "24.04|25.04|trixie"; then
apt-get install git gcc make python3-pip libssl-dev curl libreadline-dev -y
curl https://pyenv.run | bash
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
pyenv install 3.10.0
pyenv local 3.10.0
python -m pip install html5lib
python -m pip install six
fi
flock 9 # block until the lock file is gone
test -f "${qt_deb_path}" && exit 0 # check again
# Build and install the correct version of FFmpeg.
/opt/install-ffmpeg-for-qt.sh
# Build Qt.
mkdir /opt/libqt-jami-build
cd /opt/libqt-jami-build

View File

@ -38,9 +38,9 @@ QT_JAMI_PREFIX="/usr/lib64/qt-jami"
PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
LD_LIBRARY_PATH="${QT_JAMI_PREFIX}/lib:${LD_LIBRARY_PATH}"
PKG_CONFIG_PATH="${QT_JAMI_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}:${CMAKE_PREFIX_PATH}"
QT_MAJOR=6
QT_MINOR=6
QT_MINOR=8
QT_PATCH=3
QT_RELEASE_PATCH=0
@ -50,7 +50,7 @@ QT_MAJOR_MINOR_PATCH=${QT_MAJOR}.${QT_MINOR}.${QT_PATCH}
QT_TARBALL_URL=https://download.qt.io/archive/qt/$QT_MAJOR_MINOR/\
$QT_MAJOR_MINOR_PATCH/single/qt-everywhere-src-$QT_MAJOR_MINOR_PATCH.tar.xz
QT_TARBALL_SHA256="69d0348fef415da98aa890a34651e9cfb232f1bffcee289b7b4e21386bf36104"
QT_TARBALL_SHA256="cdd3a69967208276bb01af7ace7dba0ba53e679f886a4cbe624225c60fb73f2c"
QT_TARBALL_FILE_NAME=$(basename "$QT_TARBALL_URL")
CACHED_QT_TARBALL=$TARBALLS/$QT_TARBALL_FILE_NAME
@ -67,6 +67,10 @@ if [ ! -f "${RPM_PATH}" ]; then
flock 9 # block until the lock is available
test -f "$RPM_PATH" && exit 0 # check again
# Build and install the correct version of FFmpeg.
/opt/install-ffmpeg-for-qt.sh
# Build Qt.
mkdir /opt/qt-jami-build
cd /opt/qt-jami-build
tar xf "/src/$RELEASE_TARBALL_FILENAME" \
@ -105,6 +109,8 @@ if [ ! -f "${RPM_PATH}" ]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc41.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_42" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc42.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_43" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc43.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "alma_9" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el9.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "alma_10" ]]; then
@ -132,7 +138,10 @@ rpmbuild --define "debug_package %{nil}" -ba jami-libclient.spec
rpmbuild --define "debug_package %{nil}" -ba jami-qt.spec
# Build the Qt client.
rpmbuild --define "debug_package %{nil}" --define "BUILD_VERSION ${BUILD_VERSION}" -ba jami.spec
rpmbuild --define "debug_package %{nil}" \
--define "BUILD_VERSION ${BUILD_VERSION}" \
--define "QT_JAMI_PREFIX ${QT_JAMI_PREFIX}" \
-ba jami.spec
# Move the built packages to the output directory.
mv /root/rpmbuild/RPMS/*/* /opt/output

View File

@ -32,7 +32,7 @@ sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" snapcraft.yaml
# set the build version of the app
sed -i "s/BUILD_VERSION_PLACEHOLDER/${BUILD_VERSION}/g" snapcraft.yaml
snapcraft # requires snapcraft >= 4.8
snapcraft pack
# move the built snap to output
mv *.snap /opt/output/

View File

@ -0,0 +1,28 @@
#!/usr/bin/env bash
# Building Qt Multimedia requires the FFmpeg headers and libraries to be installed:
# https://doc.qt.io/qt-6.8/qtmultimedia-building-from-source.html
# For Qt 6.8.3, the recommended FFmpeg version is 7.1:
# https://doc.qt.io/qt-6.8/qtmultimedia-index.html#target-platform-and-backend-notes
# This script is based on the instructions at:
# https://doc.qt.io/qt-6.8/qtmultimedia-building-ffmpeg-linux.html
set -e
INSTALL_DIR=/opt/libqt-jami-ffmpeg
cd /tmp
git clone --branch n11.1.5.2 https://github.com/FFmpeg/nv-codec-headers.git nv-codec-headers
cd nv-codec-headers
make -j install
cd /tmp
git clone --branch n7.1.1 https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
mkdir build
cd build
../configure --prefix=${INSTALL_DIR} --disable-doc --enable-network --enable-shared
make -j install
cd /tmp
rm -rf nv-codec-headers ffmpeg

View File

@ -1,35 +0,0 @@
#!/usr/bin/env bash
# The purpose of this script is to build PipeWire from source in a snap based on core20 / Ubuntu 20.04
# It must be called in the "override-build" section of the relevant part in snapcraft.yaml
set -e
OLD_WD=$(pwd)
cd /tmp
# Get a version of Meson that's recent enough to build PipeWire 1.0.5 (the one available via apt is too old)
wget -q https://github.com/mesonbuild/meson/releases/download/0.61.1/meson-0.61.1.tar.gz
echo "feb2cefb325b437dbf36146df7c6b87688ddff0b0205caa31dc64055c6da410c meson-0.61.1.tar.gz" | sha256sum --check
tar xzf meson-0.61.1.tar.gz
# Build PipeWire 1.0.5 and install it in the /usr directory of the build environment
wget -q https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/1.0.5/pipewire-1.0.5.tar.gz
echo "c5a5de26d684a1a84060ad7b6131654fb2835e03fccad85059be92f8e3ffe993 pipewire-1.0.5.tar.gz" | sha256sum --check
tar xzf pipewire-1.0.5.tar.gz
cd pipewire-1.0.5
../meson-0.61.1/meson.py setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
../meson-0.61.1/meson.py compile -C builddir
../meson-0.61.1/meson.py install -C builddir
# The files installed by the previous command are only for the "Build" step of the snap
# creation process (https://snapcraft.io/docs/how-snapcraft-builds). In order to ensure
# that PipeWire is installed in the final snap archive, we also need to copy all the
# required files under the $SNAPCRAFT_PART_INSTALL directory.
../meson-0.61.1/meson.py configure builddir -Dprefix=$SNAPCRAFT_PART_INSTALL/usr/
../meson-0.61.1/meson.py install -C builddir
# Cleanup
cd /tmp
rm -rf meson-0.61.1 meson-0.61.1.tar.gz pipewire-1.0.5 pipewire-1.0.5.tar.gz
cd $OLD_WD

View File

@ -34,7 +34,7 @@ cat << EOFILE > ${REPO_FOLDER}/${SPARKLE_FILE}
<pubDate>$DATE_RFC2822</pubDate>
<sparkle:version>${BUILD}</sparkle:version>
<sparkle:shortVersionString>${VERSION}</sparkle:shortVersionString>
<sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
<sparkle:minimumSystemVersion>12.0</sparkle:minimumSystemVersion>
<enclosure url="${REPO_URL}/$(basename ${PACKAGE})" type="application/octet-stream" $(./sign_update ${PACKAGE}) />
</item>
$(echo -e "${ITEMS}")

View File

@ -32,6 +32,7 @@ export OSTYPE
# -A: enable AddressSanitizer
# -D: extra CMake flags for the client
# -C: enable crash reporting
# -i: ignore system libraries and build everything regardless of system detection
set -ex
@ -51,8 +52,9 @@ extra_cmake_flags=''
arch=''
enable_testing=false
enable_crashreports=false
ignore_system_libs=false
while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
while getopts gsc:dQ:P:p:uWwa:AtD:Ci OPT; do
case "$OPT" in
g)
global='true'
@ -96,6 +98,9 @@ while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
C)
enable_crashreports='true'
;;
i)
ignore_system_libs='true'
;;
\?)
exit 1
;;
@ -124,79 +129,86 @@ else
BUILD_DIR="build"
fi
# jamid
DAEMON="${TOP}/daemon"
BUILD_TYPE="Release"
if [ "${debug}" = "true" ]; then
BUILD_TYPE="Debug"
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
sh "${TOP}"/extras/scripts/build_daemon_macos.sh -a "$arch" -d "$debug"
else
cd "$DAEMON"
# Build the contribs.
mkdir -p contrib/native
(
cd contrib/native
../bootstrap ${prefix:+"--prefix=$prefix"} ${asan:+"--enable-asan"}
make -j"${proc}"
)
if [[ "${enable_libwrap}" != "true" ]]; then
# Disable shared if requested
if [[ "$OSTYPE" != "darwin"* ]]; then
CONFIGURE_FLAGS+=" --disable-shared"
fi
else
CONFIGURE_FLAGS+="--without-dbus"
fi
BUILD_TYPE="Release"
if [ "${debug}" = "true" ]; then
BUILD_TYPE="Debug"
CONFIGURE_FLAGS+=" --enable-debug"
fi
if [ "${asan}" = "true" ]; then
CONFIGURE_FLAGS+=" --enable-asan"
fi
# Build the daemon itself.
test -f configure || ./autogen.sh
if [ "${global}" = "true" ]; then
./configure ${CONFIGURE_FLAGS} ${prefix:+"--prefix=$prefix"}
else
./configure ${CONFIGURE_FLAGS} --prefix="${INSTALL_DIR}"
fi
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
fi
# jamid
DAEMON="${TOP}/daemon"
cd "$DAEMON"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
daemon_cmake_flags=(-DCMAKE_BUILD_TYPE="${BUILD_TYPE}")
if [ "${asan}" = "true" ]; then
daemon_cmake_flags+=(-DENABLE_ASAN=On)
fi
if [ "${ignore_system_libs}" = "true" ]; then
daemon_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_libwrap}" = "false" ]; then
daemon_cmake_flags+=(-DJAMI_DBUS=On)
else
daemon_cmake_flags+=(-DJAMI_DBUS=Off)
fi
if [ "${enable_testing}" = "true" ]; then
daemon_cmake_flags+=(-DBUILD_TESTING=On)
else
daemon_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${global}" = "true" ]; then
daemon_cmake_flags+=(${prefix:+"-DCMAKE_INSTALL_PREFIX=$prefix"})
else
daemon_cmake_flags+=(-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}")
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
daemon_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
fi
cmake .. "${daemon_cmake_flags[@]}"
make -j"${proc}" V=1
make_install "${global}" "${priv_install}"
# Verify system's version if no path provided.
if [ -z "$qtpath" ]; then
sys_qtver=""
if command -v qmake6 &> /dev/null; then
sys_qtver=$(qmake6 -v)
elif command -v qmake-qt6 &> /dev/null; then
sys_qtver=$(qmake-qt6 -v) # Fedora
elif command -v qmake &> /dev/null; then
sys_qtver=$(qmake -v)
else
echo "No valid Qt found"; exit 1;
fi
sys_qtver=${sys_qtver#*Qt version}
sys_qtver=${sys_qtver%\ in\ *}
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
if [[ $installed_qtver -ge $required_qtver ]] ; then
# Set qtpath to empty in order to use system's Qt.
qtpath=""
else
echo "No valid Qt found"; exit 1;
fi
fi
# fi
# client
cd "${TOP}"
mkdir -p "${BUILD_DIR}"
@ -217,6 +229,10 @@ else
client_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [ "${ignore_system_libs}" = "true" ]; then
client_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
fi
if [ "${enable_crashreports}" = "true" ]; then
client_cmake_flags+=(-DENABLE_CRASHREPORTS=ON)
else
@ -224,13 +240,6 @@ else
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
if [[ "$arch" == 'unified' ]]; then
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
elif [[ "$arch" != '' ]]; then
CMAKE_OSX_ARCHITECTURES="$arch"
fi
client_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
# build qrencode
(

View File

@ -17,7 +17,7 @@
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<string>12.0</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>LSApplicationCategoryType</key>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 522 KiB

After

Width:  |  Height:  |  Size: 298 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 KiB

After

Width:  |  Height:  |  Size: 410 KiB

View File

@ -2,11 +2,13 @@
<h4 align="left"><span style="font-weight:600">%2</span></h4>
<p>Abhishek Ojha<br>
Adrien Béraud<br>
Alassane Yattara<br>
Albert Babí<br>
Alexander Lussier-Cullen<br>
Alexandr Sergheev<br>
Alexandre Eberhardt<br>
Alexandre Lision<br>
Alexandre Savard<br>
Alexandre Viau<br>
Aline Bonnet<br>
Aline Gondim Santos<br>
@ -14,18 +16,24 @@ Alireza Toghiani<br>
Amin Bandali<br>
AmirHossein Naghshzan<br>
Amna Snene<br>
Andreas Hatziiliou<br>
Andreas Traczyk<br>
Anthony Léonard<br>
Brando Tovar<br>
Capucine Berthet<br>
Charles-Francis Damedey<br>
Christophe Villemer<br>
Cyrille Béraud<br>
Dorina Mosku<br>
Eden Abitbol<br>
Édric Milaret<br>
Éloi Bail<br>
Emma Falkiewitz<br>
Emmanuel Lepage-Vallée<br>
Emmanuel Milou<br>
Eric Bjarstal<br>
Fadi Shehadeh<br>
Félix Boucher<br>
Franck Laurent<br>
François-Simon Fauteux-Chapleau<br>
Frédéric Guimont<br>
@ -33,35 +41,47 @@ Guillaume Heller<br>
Guillaume Roguez<br>
Hadrien De Sousa<br>
Hugo Lefeuvre<br>
Hussein Abdallah<br>
Ilyas Erdogan<br>
Io Daza-Dillon<br>
Jérôme Lamy<br>
Julien Grossholtz<br>
Julien Robert<br>
Kateryna Kostiuk<br>
Kessler DuPont-Teevin<br>
Lanius-collaris<br>
Larbi Gharib<br>
Léo Banno-Cloutier<br>
Léopold Chappuis<br>
Liam Courdoson<br>
Loïc Siret<br>
Louis Maillard<br>
Mathéo Joseph<br>
Maxim Cournoyer<br>
Michel Schmit<br>
Mingrui Zhang<br>
Mohamed Chibani<br>
Mohamed Amine Younes Bouacida<br>
Mohamed Chibani<br>
Nghia Dam<br>
Nicolas Jäger<br>
Nicolas Reynaud<br>
Nicolas Vengeon<br>
Olivier Gregoire<br>
Olivier Soldano<br>
Page Magnier-Slimani<br>
Patrick Keroulas<br>
Pavan Koushik Nellore<br>
Peymane Marandi<br>
Philippe Gorley<br>
Pierre Duchemin<br>
Pierre Lespagnol<br>
Pierre Nicolas<br>
Raphaël Brulé<br>
Rawaha El Houssayni<br>
Rayan Osseiran<br>
Romain Bertozzi<br>
Saher Azer<br>
Samuel Kayode<br>
Sébastien Blin<br>
Seva Ivanov<br>
Silbino Gonçalves Matado<br>
@ -75,17 +95,16 @@ Vitalii Nikitchyn<br>
Vsevolod Ivanov<br>
Xavier Jouslin de Noray<br>
Yang Wang<br>
</p>
Ziwei Wang</p>
<h4 align="left"><span style="font-weight:600"> %3</span></h4>
<p>Charlotte Hoffmann<br>
Marianne Forget<br></p>
Marianne Forget</p>
<h4 align="left"><span style="font-weight:600"> %4</span></h4>
<p>Dorina Mosku<br>
Cabrel Tambue<br>
Loïc Bogino<br></p>
Loïc Bogino</p>
<h4 align="left"><span style="font-weight:600"> %5</span></h4>
<p>Anna<br>
Elys<br>
VeroJeanLuc<br>
</p>
VeroJeanLuc</p>
<p>%6</p>

View File

@ -171,7 +171,6 @@ AccountAdapter::createJamiAccount(const QVariantMap& settings)
settings["alias"].toString(),
settings["archivePath"].toString(),
settings["password"].toString(),
settings["archivePin"].toString(),
"");
});
}
@ -219,7 +218,6 @@ AccountAdapter::createSIPAccount(const QVariantMap& settings)
settings["alias"].toString(),
settings["archivePath"].toString(),
"",
"",
settings["username"].toString());
});
}

View File

@ -84,9 +84,9 @@ extern const QString defaultDownloadPath;
// Additional key-value pairs for non-APPSTORE builds including donation
// related settings.
#define KEYS COMMON_KEYS \
X(Donation2023VisibleDate, "2023-11-27 05:00") \
X(Donation2025StartDate, "2025-09-15 00:00") \
X(IsDonationVisible, true) \
X(Donation2023EndDate2, "2024-04-01 00:00")
X(Donation2025EndDate, "2025-11-16 00:00")
#endif
/*

View File

@ -0,0 +1,82 @@
/*
* Copyright (C) 2025 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "audioconfiglistmodel.h"
AudioConfigListModel::AudioConfigListModel(QObject* parent)
: QAbstractListModel(parent)
{}
int
AudioConfigListModel::rowCount(const QModelIndex& parent) const
{
if (!parent.isValid())
return audioConfigOptions.size();
/*
* A valid QModelIndex returns 0 as no entry has sub-elements.
*/
return 0;
}
int
AudioConfigListModel::columnCount(const QModelIndex& parent) const
{
Q_UNUSED(parent);
/*
* Only need one column.
*/
return 1;
}
QVariant
AudioConfigListModel::data(const QModelIndex& index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
switch (role) {
case Role::AudioConfigOption:
return QVariant(audioConfigOptions.at(index.row()));
}
return QVariant();
}
QHash<int, QByteArray>
AudioConfigListModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[Role::AudioConfigOption] = "AudioConfigOption";
return roles;
}
int
AudioConfigListModel::getCurrentSettingIndex(const QString& currentSelection) const
{
if (currentSelection == "auto") // Auto (default)
return 0;
else if (currentSelection == "system") // System (if available)
return 1;
else if (currentSelection == "audioProcessor") // Built-in
return 2;
else if (currentSelection == "off") // Disabled
return 3;
return 0;
}

View File

@ -0,0 +1,52 @@
/*
* Copyright (C) 2025 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <QAbstractListModel>
class AudioConfigListModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Role { AudioConfigOption = Qt::UserRole + 1 };
Q_ENUM(Role);
AudioConfigListModel(QObject* parent = 0);
/*
* QAbstractListModel override.
*/
int rowCount(const QModelIndex& parent = QModelIndex()) const override;
int columnCount(const QModelIndex& parent = QModelIndex()) const override;
QVariant data(const QModelIndex& index, int role) const override;
/*
* Override role name as access point in qml.
*/
QHash<int, QByteArray> roleNames() const override;
/*
* This function gets the current device ID in the daemon.
*/
Q_INVOKABLE int getCurrentSettingIndex(const QString& currentSelection) const;
private:
QList<QString> audioConfigOptions = {QString("Auto (default)"),
QString("System (if available)"),
QString("Built-in"),
QString("Disabled")};
};

View File

@ -67,7 +67,7 @@ CallAdapter::CallAdapter(AppSettingsManager* settingsManager,
#ifdef Q_OS_LINUX
// notification responses (gnu/linux currently)
connect(systemTray_,
&SystemTray::answerCallActivated,
&SystemTray::acceptCallActivated,
this,
[this](const QString& accountId, const QString& convUid) {
acceptACall(accountId, convUid);

View File

@ -34,9 +34,11 @@ Popup {
property bool closeButtonVisible: true
property int button1Role
property int button2Role
property int button3Role
property alias button1: action1
property alias button2: action2
property alias button3: action3
property alias popupContentLoadStatus: containerSubContentLoader.status
property alias popupContent: containerSubContentLoader.sourceComponent
@ -133,28 +135,19 @@ Popup {
ScrollBar.horizontal.visible: false
}
DialogButtonBox {
RowLayout {
id: buttonBox
Layout.alignment: Qt.AlignRight
Layout.fillWidth: true
Layout.alignment: (action1.visible && action2.visible && action3.visible) ? Qt.AlignHCenter : Qt.AlignRight
Layout.rightMargin: !(action1.visible && action2.visible && action3.visible) ? buttonMargin : 0
spacing: 1.5
background: Rectangle {
color: "transparent"
width: buttonBox.childrenRect.width
height: buttonBox.childrenRect.height
}
visible: action1.text.length > 0
contentHeight: childrenRect.height + 14
MaterialButton {
id: action1
visible: text.length > 0
rightPadding: buttonMargin
leftPadding: buttonMargin
horizontalPadding: buttonMargin
tertiary: true
autoAccelerator: true
@ -165,13 +158,23 @@ Popup {
id: action2
visible: text.length > 0
rightPadding: buttonMargin
leftPadding: buttonMargin
horizontalPadding: buttonMargin
tertiary: true
autoAccelerator: true
DialogButtonBox.buttonRole: root.button2Role
}
MaterialButton {
id: action3
visible: text.length > 0
horizontalPadding: buttonMargin
tertiary: true
autoAccelerator: true
DialogButtonBox.buttonRole: root.button3Role
}
}
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2025 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Controls.impl
import QtQuick.Templates as T
import net.jami.Constants 1.1
T.RadioButton {
id: control
property bool showText: false
implicitWidth: Math.max(implicitBackgroundWidth + leftInset + rightInset,
implicitContentWidth + leftPadding + rightPadding)
implicitHeight: Math.max(implicitBackgroundHeight + topInset + bottomInset,
implicitContentHeight + topPadding + bottomPadding,
implicitIndicatorHeight + topPadding + bottomPadding)
padding: 6
spacing: 6
indicator: Rectangle {
id: outerCircle
implicitWidth: 20
implicitHeight: 20
x: control.text ? (control.mirrored ? control.width - width - control.rightPadding : control.leftPadding) : control.leftPadding + (control.availableWidth - width) / 2
y: control.topPadding + (control.availableHeight - height) / 2
radius: width / 2
color: control.enabled ? JamiTheme.transparentColor : JamiTheme.darkGreyColorOpacity
border.color: control.enabled ? JamiTheme.radioBorderColor : JamiTheme.darkGreyColorOpacity
border.width: control.visualFocus ? 2 : 1
Rectangle {
id: innerCircle
x: (parent.width - width) / 2
y: (parent.height - height) / 2
width: 12
height: 12
radius: width / 2
color: JamiTheme.radioCheckedColor
visible: control.checked
}
}
contentItem: CheckLabel {
leftPadding: control.indicator && !control.mirrored ? control.indicator.width + control.spacing : 0
rightPadding: control.indicator && control.mirrored ? control.indicator.width + control.spacing : 0
text: control.text
font: control.font
color: JamiTheme.textColor
visible: control.showText
}
}

View File

@ -32,7 +32,6 @@ ContextMenuAutoLoader {
property var selectionEnd
property bool customizePaste: false
property bool selectOnly: false
property bool spellCheckEnabled: false
property var suggestionList
property var menuItemsLength
property var language
@ -41,7 +40,7 @@ ContextMenuAutoLoader {
SpellLanguageContextMenu {
id: spellLanguageContextMenu
active: spellCheckEnabled
active: isSpellCheckActive()
}
property list<GeneralMenuItem> menuItems: [
@ -78,7 +77,7 @@ ContextMenuAutoLoader {
},
GeneralMenuItem {
id: textLanguage
canTrigger: spellCheckEnabled && SpellCheckAdapter.installedDictionaryCount > 0
canTrigger: isSpellCheckActive() && SpellCheckAdapter.installedDictionaryCount > 0
itemName: JamiStrings.textLanguage
hasIcon: false
onClicked: {
@ -88,7 +87,7 @@ ContextMenuAutoLoader {
GeneralMenuItem {
id: manageLanguages
itemName: JamiStrings.dictionaryManager
canTrigger: spellCheckEnabled
canTrigger: isSpellCheckActive()
hasIcon: false
onClicked: {
viewCoordinator.presentDialog(appWindow, "commoncomponents/DictionaryManagerDialog.qml");
@ -171,5 +170,23 @@ ContextMenuAutoLoader {
}
}
function isSpellCheckActive() {
return AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang);
}
Connections {
target: UtilsAdapter
function onEnableSpellCheckChanged() {
textLanguage.canTrigger = isSpellCheckActive() && SpellCheckAdapter.installedDictionaryCount > 0;
manageLanguages.canTrigger = isSpellCheckActive();
}
function onSpellLanguageChanged() {
textLanguage.canTrigger = isSpellCheckActive() && SpellCheckAdapter.installedDictionaryCount > 0;
manageLanguages.canTrigger = isSpellCheckActive();
}
}
Component.onCompleted: menuItemsToLoad = menuItems
}

View File

@ -106,9 +106,5 @@ Menu {
}
}
Component.onDestruction: {
for (var i = 0; i < generalMenuSeparatorList.length; ++i) {
generalMenuSeparatorList[i].destroy();
}
}
Component.onDestruction: menuItemsToLoad.forEach(item => item.parent = null)
}

View File

@ -61,13 +61,13 @@ ConnectionInfoListModel::data(const QModelIndex& index, int role) const
}
case ConnectionInfoList::ConnectionDatas: {
QString peerString;
peerString += "Peer:" + peerId;
peerString += "Peer: " + peerId;
for (const auto& device : peerData.keys()) {
peerString += "{";
peerString += "Device:" + device + ",";
peerString += "Status:" + peerData[device]["status"].toString() + ",";
peerString += "Channels:" + peerData[device]["channels"].toString() + ",";
peerString += "Remote Address" + peerData[device]["remoteAddress"].toString();
peerString += ",\n {";
peerString += "Device: " + device;
peerString += ", Status: " + peerData[device]["status"].toString();
peerString += ", Channel(s): " + peerData[device]["channels"].toString();
peerString += ", Remote IP address: " + peerData[device]["remoteAddress"].toString();
peerString += "}";
}
return peerString;

View File

@ -222,7 +222,7 @@ ConversationListModelBase::dataForItem(item_t item, int role) const
try {
contact = contactModel->getContact(peerUri);
} catch (const std::exception&) {
C_WARN << "Can't find contact" << peerUri << "for account"
C_WARN << "Unable to find contact" << peerUri << "for account"
<< lrcInstance_->accountModel().bestNameForAccount(accInfo.id)
<< "- Conv:" << item.uid;
}

View File

@ -153,6 +153,9 @@ CurrentAccount::updateData()
set_publishedSameAsLocal(accConfig.publishedSameAsLocal, true);
set_allowIPAutoRewrite(accConfig.allowIPAutoRewrite, true);
set_proxyServer(accConfig.proxyServer, true);
set_currentProxyServer(accConfig.currentProxyServer, true);
set_dhtProxyListUrl(accConfig.dhtProxyListUrl, true);
set_proxyListEnabled(accConfig.proxyListEnabled, true);
set_routeset(accConfig.routeset, true);
set_username(accConfig.username, true);
set_hostname(accConfig.hostname, true);

View File

@ -127,6 +127,9 @@ class CurrentAccount final : public QObject
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(bool, publishedSameAsLocal)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(bool, allowIPAutoRewrite)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, proxyServer)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, currentProxyServer)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(bool, proxyListEnabled)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, dhtProxyListUrl)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, routeset)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, username)
QML_ACCOUNT_CONFIG_SETTINGS_PROPERTY(QString, hostname)

View File

@ -29,13 +29,17 @@ BaseModalDialog {
margins: JamiTheme.preferredMarginSize
title: JamiStrings.aboutJami
button1.text: JamiStrings.contribute
button2.text: JamiStrings.feedback
button1.text: JamiStrings.donation
button2.text: JamiStrings.contribute
button3.text: JamiStrings.feedback
button1.onClicked: {
Qt.openUrlExternally("https://jami.net/contribute/");
Qt.openUrlExternally("https://jami.net/donate/");
}
button2.onClicked: {
Qt.openUrlExternally("https://jami.net/contribute/");
}
button3.onClicked: {
Qt.openUrlExternally("mailto:jami@gnu.org");
}

View File

@ -84,6 +84,12 @@ Item {
}
function updateImageSource(downloadUrl, localPath, defaultImage) {
// TODO: this is a temporary fix to load bundled resources directly from qrc
// we need to investigate why we use a cached image for bundled resources
if (downloadUrl.startsWith("qrc:")) {
image.source = downloadUrl;
return;
}
if (downloadUrl === "") {
image.source = defaultImage;
return;

View File

@ -98,6 +98,7 @@ Control {
id: audioInputMenuAction
text: JamiStrings.selectAudioInputDevice
Component.onCompleted: enabled = audioInputDeviceListModel.rowCount()
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
property var listModel: AudioDeviceModel {
id: audioInputDeviceListModel
lrcInstance: LRCInstance
@ -113,6 +114,7 @@ Control {
id: audioOutputMenuAction
text: JamiStrings.selectAudioOutputDevice
Component.onCompleted: enabled = audioOutputDeviceListModel.rowCount()
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
property var listModel: AudioDeviceModel {
id: audioOutputDeviceListModel
lrcInstance: LRCInstance
@ -272,6 +274,7 @@ Control {
id: videoInputMenuAction
enabled: VideoDevices.listSize !== 0
text: JamiStrings.selectVideoDevice
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
property var listModel: VideoDevices.deviceSourceModel
function accept(index) {
VideoDevices.setDefaultDevice(index);

View File

@ -181,9 +181,23 @@ ItemDelegate {
Connections {
target: menuAction !== undefined ? menuAction : null
function onTriggered() {
if (menuAction.popupMode !== CallActionBar.ActionPopupMode.ListElement) {
var index = menuAction.listModel.currentIndex;
itemListView.currentIndex = index !== undefined ? index : 0;
var index;
switch (menuAction.popupMode) {
case CallActionBar.ActionPopupMode.MediaDevice:
index = menuAction.listModel.getCurrentIndex();
break;
case CallActionBar.ActionPopupMode.LayoutOption:
index = menuAction.listModel.currentIndex;
break;
case CallActionBar.ActionPopupMode.ListElement:
index = menuAction.listModel.currentIndex;
break;
default:
console.warn("Unknown popup mode: " + menuAction.popupMode);
return;
}
if (index !== undefined) {
itemListView.currentIndex = index;
}
}
}

View File

@ -42,9 +42,6 @@ Popup {
onAboutToShow: {
actionsModel.clear();
actionsModel.append({
"Top": true
});
if (root.isOnLocal)
actionsModel.append({
"Name": JamiStrings.mirrorLocalVideo,
@ -59,10 +56,6 @@ Popup {
"Name": JamiStrings.advancedInformation,
"IconSource": JamiResources.informations_black_24dp_svg
});
actionsModel.append({
"Bottom": true
});
itemListView.implicitHeight = 20 + 45 * (actionsModel.count - 2);
}
onAboutToHide: {
@ -79,84 +72,74 @@ Popup {
contentItem: Rectangle {
id: container
width: childrenRect.width
height: childrenRect.height
implicitWidth: 200
implicitHeight: actionsModel.count * 45
color: "#c4272727"
radius: 4
ColumnLayout {
anchors.topMargin: 8
anchors.bottomMargin: 8
ListView {
id: itemListView
ListView {
id: itemListView
orientation: ListView.Vertical
implicitWidth: 200
implicitHeight: 100
interactive: false
orientation: ListView.Vertical
implicitWidth: 200
implicitHeight: parent.height
model: actionsModel
model: actionsModel
delegate: ItemDelegate {
id: menuItem
delegate: ItemDelegate {
id: menuItem
width: 200
height: Top || Bottom ? 10 : 45
width: 200
height: 45
background: Rectangle {
radius: 5
visible: !Top && !Bottom
anchors.fill: parent
anchors.leftMargin: 5
anchors.rightMargin: 5
color: menuItem.down ? "#c4aaaaaa" : menuItem.hovered ? "#c4777777" : "transparent"
background: Rectangle {
radius: 5
anchors.fill: parent
anchors.margins: 5
color: menuItem.down ? "#c4aaaaaa" : menuItem.hovered ? "#c4777777" : "transparent"
}
RowLayout {
anchors.fill: menuItem
ResponsiveImage {
Layout.leftMargin: JamiTheme.preferredMarginSize
source: IconSource
color: "white"
width: 20
height: 20
}
RowLayout {
anchors.fill: parent
anchors.leftMargin: 5
anchors.rightMargin: 5
visible: !Top && !Bottom
ResponsiveImage {
Layout.leftMargin: JamiTheme.preferredMarginSize
source: IconSource
color: "white"
width: 20
height: 20
}
Text {
Layout.fillWidth: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
text: Name
elide: Text.ElideRight
font.pointSize: JamiTheme.participantFontSize
color: "white"
}
Text {
Layout.fillWidth: true
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
text: Name
elide: Text.ElideRight
font.pointSize: JamiTheme.participantFontSize
color: "white"
}
}
onClicked: {
switch (Name) {
case JamiStrings.advancedInformation:
CallAdapter.startTimerInformation();
callInformationOverlay.open();
break;
case JamiStrings.tileScreenshot:
if (CallAdapter.takeScreenshot(videoProvider.captureRawVideoFrame(hoveredOverlaySinkId), UtilsAdapter.getDirScreenshot())) {
screenshotTaken();
}
break;
case JamiStrings.mirrorLocalVideo:
UtilsAdapter.setAppValue(Settings.FlipSelf, !UtilsAdapter.getAppValue(Settings.FlipSelf));
CurrentCall.flipSelf = UtilsAdapter.getAppValue(Settings.FlipSelf);
break;
onClicked: {
switch (Name) {
case JamiStrings.advancedInformation:
CallAdapter.startTimerInformation();
callInformationOverlay.open();
break;
case JamiStrings.tileScreenshot:
if (CallAdapter.takeScreenshot(videoProvider.captureRawVideoFrame(hoveredOverlaySinkId), UtilsAdapter.getDirScreenshot())) {
screenshotTaken();
}
root.close();
break;
case JamiStrings.mirrorLocalVideo:
UtilsAdapter.setAppValue(Settings.FlipSelf, !UtilsAdapter.getAppValue(Settings.FlipSelf));
CurrentCall.flipSelf = UtilsAdapter.getAppValue(Settings.FlipSelf);
break;
}
root.close();
}
onHoveredChanged: {
if (Name === JamiStrings.tileScreenshot) {
screenshotButtonHovered = hovered;
}
onHoveredChanged: {
if (Name === JamiStrings.tileScreenshot) {
screenshotButtonHovered = hovered;
}
}
}

View File

@ -45,6 +45,7 @@ Rectangle {
color: JamiTheme.chatviewBgColor
property var mapPositions: PositionManager.mapStatus
property bool isConversationEndedFlag: false
// The purpose of this alias is to make the message bar
// accessible to the EmojiPicker
@ -85,6 +86,32 @@ Rectangle {
}
}
function isConversationEnded() {
if (!CurrentConversation.isSwarm)
return false;
var myRole = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, CurrentAccount.uri);
var info = ConversationsAdapter.getConvInfoMap(CurrentConversation.id);
var peers = info && info.uris ? info.uris : [];
peers = peers.filter(function(u) { return u !== CurrentAccount.uri; });
for (var i = 0; i < peers.length; i++) {
var role = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, peers[i]);
if (!(role === Member.Role.LEFT || role === Member.Role.BANNED)) {
return false;
}
}
if (CurrentConversation.isCoreDialog) {
return true
}
return myRole !== Member.Role.ADMIN;
}
function updateConversationEndedFlag() {
var newVal = isConversationEnded();
if (isConversationEndedFlag !== newVal) {
isConversationEndedFlag = newVal;
}
}
// Used externally to switch to a extras panel.
function switchToPanel(panel, toggle = true) {
extrasPanel.switchToPanel(panel, toggle);
@ -102,16 +129,33 @@ Rectangle {
}
}
Connections {
target: LRCInstance
function onConversationUpdated(convId, accountId) {
if (convId === CurrentConversation.id) {
updateConversationEndedFlag();
}
}
}
Connections {
target: CurrentConversation.members
function onCountChanged() {
updateConversationEndedFlag();
}
}
Connections {
target: CurrentConversation
function onIdChanged() {
MessagesAdapter.loadMoreMessages();
updateConversationEndedFlag();
}
}
onVisibleChanged: {
if (visible) {
chatViewSplitView.resolvePanes(true);
Qt.callLater(updateConversationEndedFlag);
}
}
@ -196,6 +240,29 @@ Rectangle {
visible: false
}
Control {
id: conversationEndedBanner
Layout.fillWidth: true
visible: isConversationEndedFlag
padding: 10
background: Rectangle {
color: JamiTheme.infoRectangleColor
radius: 5
}
contentItem: RowLayout {
spacing: 8
Label {
text: JamiStrings.conversationEnded
color: JamiTheme.textColor
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
Layout.alignment: Qt.AlignHCenter
Layout.fillWidth: true
}
}
}
NotificationArea {
id: notificationArea
Layout.fillWidth: true
@ -333,6 +400,8 @@ Rectangle {
return false;
else if (CurrentConversation.isRequest)
return false;
else if (isConversationEndedFlag)
return false;
return CurrentConversation.isSwarm || CurrentConversation.isTemporary;
}

View File

@ -73,28 +73,37 @@ ContextMenuAutoLoader {
onClicked: MessagesAdapter.clearConversationHistory(responsibleAccountId, responsibleConvUid)
},
GeneralMenuItem {
id: removeContact
id: removeConversation
canTrigger: !hasCall && !root.isBanned
itemName: {
if (mode !== Conversation.Mode.NON_SWARM)
return JamiStrings.removeConversation;
else
return JamiStrings.removeContact;
}
itemName: mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.removeConversation : JamiStrings.leaveGroup
iconSource: JamiResources.ic_hangup_participant_24dp_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmLeaveConversation,
"confirmLabel": JamiStrings.optionLeave
});
"title": JamiStrings.confirmAction,
"textLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.confirmRemoveOneToOneConversation : JamiStrings.confirmLeaveGroup,
"confirmLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.optionRemove : JamiStrings.optionLeave
});
dlg.accepted.connect(function () {
if (mode !== Conversation.Mode.NON_SWARM)
MessagesAdapter.removeConversation(responsibleConvUid);
else
MessagesAdapter.removeContact(responsibleConvUid);
});
MessagesAdapter.removeConversation(responsibleConvUid, true);
});
}
},
GeneralMenuItem {
id: removeContact
canTrigger: !hasCall && !root.isBanned && mode === Conversation.Mode.ONE_TO_ONE
itemName: JamiStrings.removeContact
iconSource: JamiResources.kick_member_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmRemoveContact,
"confirmLabel": JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeContact(responsibleConvUid);
});
}
},
GeneralMenuItem {
@ -129,13 +138,13 @@ ContextMenuAutoLoader {
iconSource: JamiResources.block_black_24dp_svg
onClicked: {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmBlockConversation,
"confirmLabel": JamiStrings.optionBlock
});
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmBlockContact,
"confirmLabel": JamiStrings.optionBlock
});
dlg.accepted.connect(function () {
MessagesAdapter.blockConversation(responsibleConvUid);
});
MessagesAdapter.blockConversation(responsibleConvUid);
});
}
},
GeneralMenuItem {
@ -155,11 +164,11 @@ ContextMenuAutoLoader {
onClicked: {
if (isCoreDialog) {
viewCoordinator.presentDialog(appWindow, "mainview/components/UserProfile.qml", {
"aliasText": aliasText,
"registeredNameText": registeredNameText,
"idText": idText,
"convId": responsibleConvUid
});
"aliasText": aliasText,
"registeredNameText": registeredNameText,
"idText": idText,
"convId": responsibleConvUid
});
} else {
root.showSwarmDetails();
}

View File

@ -32,7 +32,7 @@ Control {
// Calculate the time 7 days from now
var futureDate = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000);
var formattedDate = Qt.formatDateTime(futureDate, "yyyy-MM-dd hh:mm");
UtilsAdapter.setAppValue(Settings.Key.Donation2023VisibleDate, formattedDate);
UtilsAdapter.setAppValue(Settings.Key.Donation2025StartDate, formattedDate);
}
MouseArea {

View File

@ -117,7 +117,7 @@ Window {
}
ListElement {
shortcut: "Ctrl+Y"
description: qsTr("Answer incoming call")
description: qsTr("Accept call")
}
ListElement {
shortcut: "Ctrl+D"

View File

@ -72,7 +72,6 @@ JamiFlickable {
lineEditObj: textArea
customizePaste: true
spellCheckEnabled: root.spellCheckEnabled
onContextMenuRequirePaste: {
// Intercept paste event to use C++ QMimeData
@ -113,15 +112,13 @@ JamiFlickable {
}
}
property bool spellCheckEnabled: AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang) !== ""
// Spell check is active under the following conditions:
// 1. Spell check is enabled in settings
// 2. The selected spell language is not ""
// 3. We are not in preview mode
readonly property bool spellCheckActive: spellCheckEnabled && !showPreview
onSpellCheckActiveChanged: textArea.updateSpellCorrection()
function isSpellCheckActive() {
return AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang) !== "" && !showPreview;
}
TextArea.flickable: TextArea {
id: textArea
@ -190,7 +187,7 @@ JamiFlickable {
onReleased: function (event) {
if (event.button === Qt.RightButton) {
if (spellCheckActive && SpellCheckAdapter.hasLoadedDictionary) {
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
var position = textArea.positionAt(event.x, event.y);
textArea.moveCursorSelection(position, TextInput.SelectWords);
textArea.selectWord();
@ -252,7 +249,7 @@ JamiFlickable {
function updateSpellCorrection() {
clearUnderlines();
// We iterate over the whole text to find words to check and underline them if needed
if (spellCheckActive && SpellCheckAdapter.hasLoadedDictionary) {
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
var text = textArea.text;
var words = SpellCheckAdapter.findWords(text);
if (!words)

View File

@ -297,7 +297,7 @@ Rectangle {
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: JamiTheme.preferredMarginSize
text: JamiStrings.leaveConversation
text: CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.leaveGroup : JamiStrings.removeConversation
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
font.kerning: true
elide: Text.ElideRight
@ -312,13 +312,49 @@ Rectangle {
enabled: parent.visible
onTapped: function onTapped(eventPoint) {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmLeaveConversation,
"confirmLabel": JamiStrings.optionLeave
});
"title": JamiStrings.confirmAction,
"textLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.confirmLeaveGroup : JamiStrings.confirmRemoveOneToOneConversation,
"confirmLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.optionLeave : JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
});
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid, true);
});
}
}
}
SwarmDetailsItem {
Layout.fillWidth: true
Layout.preferredHeight: JamiTheme.settingsFontSize + 2 * JamiTheme.preferredMarginSize + 4
visible: CurrentConversation.isCoreDialog
Text {
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: JamiTheme.preferredMarginSize
text: JamiStrings.removeContact
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
font.kerning: true
elide: Text.ElideRight
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
color: JamiTheme.textColor
}
TapHandler {
target: parent
enabled: parent.visible
onTapped: function onTapped(eventPoint) {
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
"title": JamiStrings.confirmAction,
"textLabel": JamiStrings.confirmRemoveContact,
"confirmLabel": JamiStrings.optionRemove
});
dlg.accepted.connect(function () {
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
});
}
}
}
@ -500,8 +536,6 @@ Rectangle {
verticalAlignment: Text.AlignVCenter
color: JamiTheme.textColor
}
Text {

View File

@ -38,7 +38,7 @@ Item {
property string description: JamiStrings.hereIsIdentifier
property real contentWidth: welcomeInfo.width - 2 * JamiTheme.mainViewMargin
width : JamiTheme.mainViewPaneMinWidth
function getHeight() {
return bgRect.height;
}

View File

@ -77,10 +77,7 @@ MessagesAdapter::MessagesAdapter(AppSettingsManager* settingsManager,
connect(timestampTimer_, &QTimer::timeout, this, &MessagesAdapter::timestampUpdated);
timestampTimer_->start(timestampUpdateIntervalMs_);
connect(lrcInstance_,
&LRCInstance::currentAccountIdChanged,
this,
&MessagesAdapter::connectConversationModel);
connect(lrcInstance_, &LRCInstance::currentAccountIdChanged, this, &MessagesAdapter::connectConversationModel);
connectConversationModel();
}
@ -99,8 +96,7 @@ MessagesAdapter::loadMoreMessages()
try {
const auto& convInfo = lrcInstance_->getConversationFromConvUid(convId, accountId);
if (convInfo.isSwarm())
lrcInstance_->getCurrentConversationModel()->loadConversationMessages(convId,
loadChunkSize_);
lrcInstance_->getCurrentConversationModel()->loadConversationMessages(convId, loadChunkSize_);
} catch (const std::exception& e) {
qWarning() << e.what();
}
@ -185,9 +181,7 @@ MessagesAdapter::editMessage(const QString& convId, const QString& newBody, cons
}
void
MessagesAdapter::removeEmojiReaction(const QString& convId,
const QString& emoji,
const QString& messageId)
MessagesAdapter::removeEmojiReaction(const QString& convId, const QString& emoji, const QString& messageId)
{
try {
// check if this emoji has already been added by this author
@ -198,9 +192,7 @@ MessagesAdapter::removeEmojiReaction(const QString& convId,
}
void
MessagesAdapter::addEmojiReaction(const QString& convId,
const QString& emoji,
const QString& messageId)
MessagesAdapter::addEmojiReaction(const QString& convId, const QString& emoji, const QString& messageId)
{
try {
lrcInstance_->getCurrentConversationModel()->reactMessage(convId, emoji, messageId);
@ -216,10 +208,7 @@ MessagesAdapter::sendFile(const QString& message)
QString fileName = fi.fileName();
try {
auto convUid = lrcInstance_->get_selectedConvUid();
lrcInstance_->getCurrentConversationModel()->sendFile(convUid,
message,
fileName,
replyToId_);
lrcInstance_->getCurrentConversationModel()->sendFile(convUid, message, fileName, replyToId_);
} catch (...) {
qDebug() << "Exception during sendFile";
}
@ -231,20 +220,14 @@ MessagesAdapter::sendFileToUid(const QString& message, const QString& convUid)
QFileInfo fi(message);
QString fileName = fi.fileName();
try {
lrcInstance_->getCurrentConversationModel()->sendFile(convUid,
message,
fileName,
replyToId_);
lrcInstance_->getCurrentConversationModel()->sendFile(convUid, message, fileName, replyToId_);
} catch (...) {
qDebug() << "Exception during sendFile";
}
}
void
MessagesAdapter::joinCall(const QString& uri,
const QString& deviceId,
const QString& confId,
bool isAudioOnly)
MessagesAdapter::joinCall(const QString& uri, const QString& deviceId, const QString& confId, bool isAudioOnly)
{
lrcInstance_->getCurrentConversationModel()->joinCall(lrcInstance_->get_selectedConvUid(),
uri,
@ -324,9 +307,8 @@ MessagesAdapter::onPaste()
// Save temp data into a temp file.
QPixmap pixmap = qvariant_cast<QPixmap>(mimeData->imageData());
auto img_name_hash
= QCryptographicHash::hash(QString::number(pixmap.cacheKey()).toLocal8Bit(),
QCryptographicHash::Sha1);
auto img_name_hash = QCryptographicHash::hash(QString::number(pixmap.cacheKey()).toLocal8Bit(),
QCryptographicHash::Sha1);
QString fileName = "img_" + QString(img_name_hash.toHex()) + ".png";
QString path = QDir::temp().filePath(fileName);
@ -377,8 +359,7 @@ MessagesAdapter::userIsComposing(bool isComposing)
{
if (lrcInstance_->get_selectedConvUid().isEmpty())
return;
lrcInstance_->getCurrentConversationModel()->setIsComposing(lrcInstance_->get_selectedConvUid(),
isComposing);
lrcInstance_->getCurrentConversationModel()->setIsComposing(lrcInstance_->get_selectedConvUid(), isComposing);
}
void
@ -480,10 +461,10 @@ MessagesAdapter::clearConversationHistory(const QString& accountId, const QStrin
}
void
MessagesAdapter::removeConversation(const QString& convUid)
MessagesAdapter::removeConversation(const QString& convUid, bool keepContact)
{
auto& accInfo = lrcInstance_->getCurrentAccountInfo();
accInfo.conversationModel->removeConversation(convUid);
accInfo.conversationModel->removeConversation(convUid, false, keepContact);
}
void
@ -526,19 +507,14 @@ MessagesAdapter::onConversationMessagesLoaded(uint32_t loadingRequestId, const Q
}
void
MessagesAdapter::parseMessage(const QString& msgId,
const QString& msg,
bool showPreview,
const QColor& linkColor,
const QColor& backgroundColor)
MessagesAdapter::parseMessage(
const QString& msgId, const QString& msg, bool showPreview, const QColor& linkColor, const QColor& backgroundColor)
{
messageParser_->parseMessage(msgId, msg, showPreview, linkColor, backgroundColor);
}
void
MessagesAdapter::onComposingStatusChanged(const QString& convId,
const QString& contactUri,
bool isComposing)
MessagesAdapter::onComposingStatusChanged(const QString& convId, const QString& contactUri, bool isComposing)
{
Q_UNUSED(contactUri)
if (lrcInstance_->get_selectedConvUid() == convId) {
@ -588,9 +564,7 @@ MessagesAdapter::isLocalImage(const QString& mimename)
QList<QByteArray> supportedFormats = reader.supportedImageFormats();
auto iterator = std::find_if(supportedFormats.begin(),
supportedFormats.end(),
[fileFormat](QByteArray format) {
return format == fileFormat;
});
[fileFormat](const QByteArray& format) { return format == fileFormat; });
if (iterator != supportedFormats.end() && *iterator == "gif") {
return {{"isAnimatedImage", true}};
}
@ -603,11 +577,10 @@ QVariantMap
MessagesAdapter::getMediaInfo(const QString& msg)
{
auto filePath = QFileInfo(msg).absoluteFilePath();
static const QString html
= "<body style='margin:0;padding:0;'>"
"<%1 style='width:100%;height:%2;outline:none;background-color:#f1f3f4;"
"object-fit:cover;' "
"controls controlsList='nodownload noplaybackrate' src='file://%3' type='%4'/></body>";
static const QString html = "<body style='margin:0;padding:0;'>"
"<%1 style='width:100%;height:%2;outline:none;background-color:#f1f3f4;"
"object-fit:cover;' "
"controls controlsList='nodownload noplaybackrate' src='file://%3' type='%4'/></body>";
QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(filePath);
QVariantMap fileInfo = isLocalImage(mime.name());
@ -644,9 +617,8 @@ bool
MessagesAdapter::isRemoteImage(const QString& msg)
{
// TODO: test if all these open in the AnimatedImage component
const static QRegularExpression
imageRe("[^\\s]+(.*?)\\.(jpg|jpeg|png|gif|apng|webp|avif|flif)$",
QRegularExpression::CaseInsensitiveOption);
const static QRegularExpression imageRe("[^\\s]+(.*?)\\.(jpg|jpeg|png|gif|apng|webp|avif|flif)$",
QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = imageRe.match(msg);
return match.hasMatch();
}
@ -656,15 +628,10 @@ MessagesAdapter::getFormattedTime(const quint64 timestamp)
{
const auto currentTime = QDateTime::currentDateTime();
const auto seconds = currentTime.toSecsSinceEpoch() - timestamp;
auto interval = qFloor(seconds / 60);
if (interval > 1) {
auto curLang = settingsManager_->getLanguage();
auto curLocal = QLocale(curLang);
if (seconds > 60) {
auto curLocal = QLocale(settingsManager_->getLanguage());
auto curTime = QDateTime::fromSecsSinceEpoch(timestamp).time();
QString timeLocale;
timeLocale = curLocal.toString(curTime, curLocal.ShortFormat).toLower();
return timeLocale;
return curLocal.toString(curTime, curLocal.ShortFormat).toLower();
}
return QObject::tr("Just now");
}
@ -689,13 +656,8 @@ MessagesAdapter::getFormattedDay(const quint64 timestamp)
if (timestampDate.daysTo(currentDate) == 1)
return QObject::tr("Yesterday");
auto curLang = settingsManager_->getLanguage();
auto curLocal = QLocale(curLang);
auto curDate = QDateTime::fromSecsSinceEpoch(timestamp).date();
QString dateLocale;
dateLocale = curLocal.toString(curDate, curLocal.ShortFormat);
return dateLocale;
auto curLocal = QLocale(settingsManager_->getLanguage());
return curLocal.toString(timestampDate, curLocal.ShortFormat);
}
void
@ -711,10 +673,7 @@ MessagesAdapter::startSearch(const QString& text, bool isMedia)
auto convId = lrcInstance_->get_selectedConvUid();
try {
lrcInstance_->getCurrentConversationModel()->getConvMediasInfos(accountId,
convId,
text,
isMedia);
lrcInstance_->getCurrentConversationModel()->getConvMediasInfos(accountId, convId, text, isMedia);
} catch (...) {
qDebug() << "Exception during startSearch()";
}

View File

@ -113,7 +113,7 @@ public:
Q_INVOKABLE void loadMoreMessages();
Q_INVOKABLE void connectConversationModel();
Q_INVOKABLE void sendConversationRequest();
Q_INVOKABLE void removeConversation(const QString& convUid);
Q_INVOKABLE void removeConversation(const QString& convUid, bool keepContact = false);
Q_INVOKABLE void addConversationMember(const QString& convUid, const QString& participantUri);
Q_INVOKABLE void removeConversationMember(const QString& convUid, const QString& participantUri);
Q_INVOKABLE void removeContact(const QString& convUid, bool banContact = false);

View File

@ -103,8 +103,8 @@ Item {
// The banner is visible if the current date is after the date set in the settings and before the end date
// And if the donation toggle is checked
const isVisible = UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible);
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023EndDate2));
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023VisibleDate));
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025EndDate));
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025StartDate));
const now = new Date();
return isVisible && now < endDate && now >= startDate;
}

View File

@ -46,7 +46,7 @@ Item {
property string buildID: qsTr("Build ID")
property string version: qsTr("Version")
property string declarationYear: "Copyright © 20152025"
property string slogan: "Εἰρήνη"
property string slogan: "Atlas"
property string declaration: qsTr('Jami, a GNU package, is software for universal and distributed peer-to-peer communication that respects the freedom and privacy of its users. Visit <a href="https://jami.net" style="color: ' + JamiTheme.buttonTintedBlue + '">jami.net</a>' + ' to learn more.')
property string noWarranty: qsTr('This program comes with absolutely no warranty. See the <a href="https://www.gnu.org/licenses/gpl-3.0.html" style="color: ' + JamiTheme.buttonTintedBlue + '">GNU General Public License</a>, version 3 or later for details.')
property string contribute: qsTr('Contribute')
@ -100,7 +100,7 @@ Item {
// AdvancedCallSettings
property string allowCallsUnknownContacs: qsTr("Allow incoming calls from unknown contacts")
property string rendezVous: qsTr("Convert your account into a rendezvous point")
property string autoAnswerCalls: qsTr("Automatically answer incoming calls")
property string autoAcceptCalls: qsTr("Automatically accept calls")
property string enableCustomRingtone: qsTr("Enable custom ringtone")
property string selectCustomRingtone: qsTr("Select custom ringtone")
property string selectNewRingtone: qsTr("Select a new ringtone")
@ -118,10 +118,6 @@ Item {
property string assignmentIndication: qsTr("Press the key to be assigned to push-to-talk shortcut")
property string assign: qsTr("Assign")
// AdvancedChatSettings
property string enableReadReceipts: qsTr("Enable read receipts")
property string enableReadReceiptsTooltip: qsTr("Send and receive receipts indicating that messages have been displayed.")
// AdvancedVoiceMailSettings
property string voiceMail: qsTr("Voicemail")
property string voiceMailDialCode: qsTr("Voicemail dial code")
@ -189,7 +185,10 @@ Item {
property string openDHTConfig: qsTr("OpenDHT configuration")
property string enableProxy: qsTr("Enable proxy")
property string proxyAddress: qsTr("Proxy address")
property string proxyListURL: qsTr("Proxy list URL")
property string bootstrap: qsTr("Bootstrap")
property string usingProxy: qsTr("Using proxy:")
property string proxyDisabled: qsTr("Proxy disabled")
// SettingsHeader
property string back: qsTr("Back")
@ -206,6 +205,7 @@ Item {
// AudioSettings
property string audio: qsTr("Audio")
property string devices: qsTr("Devices")
property string microphone: qsTr("Microphone")
property string selectAudioInputDevice: qsTr("Select audio input device")
property string outputDevice: qsTr("Output device")
@ -214,6 +214,9 @@ Item {
property string selectRingtoneOutputDevice: qsTr("Select ringtone output device")
property string audioManager: qsTr("Audio manager")
property string soundTest: qsTr("Sound test")
property string noiseReduction: qsTr("Noise reduction")
property string echoSuppression: qsTr("Echo suppression")
property string voiceActivityDetection: qsTr("Voice activity detection")
// VideoSettings
property string video: qsTr("Video")
@ -277,16 +280,19 @@ Item {
property string cut: qsTr("Cut")
property string copy: qsTr("Copy")
property string paste: qsTr("Paste")
property string language: qsTr("Language")
// ConversationContextMenu
property string startAudioCall: qsTr("Start audio call")
property string startVideoCall: qsTr("Start video call")
property string deleteConversation: qsTr("Delete conversation")
property string confirmAction: qsTr("Confirm action")
property string removeConversation: qsTr("Leave conversation")
property string confirmLeaveConversation: qsTr("Do you want to leave this conversation?")
property string confirmBlockConversation: qsTr("Do you want to block this conversation?")
property string removeConversation: qsTr("Remove conversation")
property string confirmRemoveConversation: qsTr("Do you want to leave this conversation?")
property string leaveGroup: qsTr("Leave group")
property string confirmLeaveGroup: qsTr("Are you sure you want to leave this group?")
property string confirmRemoveContact: qsTr("Do you want to remove this contact? The existing conversation will be deleted.")
property string confirmBlockContact: qsTr("Do you want to block this contact?")
property string confirmRemoveOneToOneConversation: qsTr("Are you sure you want to remove this conversation? The contact will not be removed.")
property string removeContact: qsTr("Remove contact")
property string blockContact: qsTr("Block contact")
property string convDetails: qsTr("Conversation details")
@ -349,13 +355,13 @@ Item {
property string pinWindow: qsTr("Pin")
property string positionShareDuration: qsTr("Position share duration")
property string locationSharingLabel: qsTr("Location sharing")
property string minLocationDuration: qsTr("1m")
property string maxLocationDuration: qsTr("Unlimited")
property string minLocationDuration: qsTr("1 min")
property string xhourxmin: qsTr("%1h%2min")
property string xhour: qsTr("%1h")
property string xminxsec: qsTr("%1min%2s")
property string xmin: qsTr("%1min")
property string xsec: qsTr("%sec")
property string xsec: qsTr("%L1s")
property string xmin: qsTr("%L1m")
property string xminxsec: qsTr("%L1m %L2s")
property string xhour: qsTr("%L1h")
property string xhourxmin: qsTr("%L1h %L2m")
// Chatview header
property string hideChat: qsTr("Hide chat")
@ -368,6 +374,9 @@ Item {
property string deletedMedia: qsTr("%1 deleted a media")
property string returnToCall: qsTr("Return to call")
// Conversation ended banner
property string conversationEnded: qsTr("This conversation has ended.")
// MessagesResearch
property string jumpTo: qsTr("Jump to")
property string messages: qsTr("Messages")
@ -426,8 +435,8 @@ Item {
property string displayName: qsTr("Display name")
// accountSettingsPages
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts.\nYour picture and your display name can be changed at all time in the settings of your account.")
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami.\nIf a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts. You can customize your profile at any time.")
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami. If a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
property string encryptAccountDescription: qsTr("Your Jami account is registered only on this device as an archive containing the keys of your account. Access to this archive can be protected with a password.")
property string saveAccountTitle: qsTr("Backup account")
property string saveAccountDescription: qsTr("This Jami account exists only on this device. The account will be lost if this device is lost or the application is uninstalled. It is recommended to make a backup of this account.")
@ -508,8 +517,10 @@ Item {
property string defaultSettings: qsTr("Default settings")
// ChatviewSettings
property string enableTypingIndicator: qsTr("Enable typing indicators")
property string enableTypingIndicator: qsTr("Typing indicator")
property string enableTypingIndicatorDescription: qsTr("Send and receive typing indicators showing when messages are being typed.")
property string enableReadReceipts: qsTr("Read receipts")
property string enableReadReceiptsTooltip: qsTr("Send and request delivery and read receipts to be sent when messages are delivered or read.")
property string displayHyperlinkPreviews: qsTr("Web link previews")
property string displayHyperlinkPreviewsDescription: qsTr("Preview requires downloading content from third-party servers.")
@ -606,13 +617,13 @@ Item {
property string enterPasswordPinCode: qsTr("This account is password encrypted, enter the password to generate a PIN code.")
property string addDevice: qsTr("Add Device")
property string linkNewDevice: qsTr("Link new device")
property string linkDeviceConnecting: qsTr("Connecting to your new device…")
property string linkDeviceConnecting: qsTr("Connecting to the new device…")
property string linkDeviceInProgress: qsTr("The export account operation to the new device is in progress.\nPlease confirm the import on the new device.")
property string linkDeviceScanQR: qsTr("On the new device, initiate a new account.\nSelect Add account → Connect from another device.\nWhen ready, scan the QR code.")
property string linkDeviceEnterManually: qsTr("Alternatively, enter the authentication code manually.")
property string linkDeviceEnterCodePlaceholder: qsTr("Enter authentication code")
property string linkDeviceAllSet: qsTr("The account was imported successfully.")
property string linkDeviceFoundAddress: qsTr("New device found at address below. Is that you?\nClicking on confirm will continue transfering account.")
property string linkDeviceFoundAddress: qsTr("New device connected at the following IP address. Is that you? To continue the export account operation, click Confirm.")
property string linkDeviceNewDeviceIP: qsTr("New device IP address: %1")
property string linkDeviceCloseWarningTitle: qsTr("Do you want to exit?")
property string linkDeviceCloseWarningMessage: qsTr("Exiting will cancel the import account operation.")
@ -818,7 +829,7 @@ Item {
property string invitationViewWaitingForSync: qsTr("Waiting for %1\nto connect to synchronize the conversation…")
// SwarmDetailsPanel (group conversation panel)
property string members: qsTr("%1 Members")
property string members: qsTr("%L1 members")
property string member: qsTr("Member")
property string groupName: qsTr("Group name")
property string contactName: qsTr("Contact name")
@ -828,7 +839,6 @@ Item {
property string ignoreNotificationsTooltip: qsTr("Ignore all notifications from this conversation")
property string chooseAColor: qsTr("Color")
property string defaultCallHost: qsTr("Default host (calls)")
property string leaveConversation: qsTr("Leave conversation")
property string typeOfSwarm: qsTr("Conversation type")
property string none: qsTr("None")
@ -886,7 +896,7 @@ Item {
property string zoomLevel: qsTr("Text zoom level")
// Donation campaign
property string donationTipBoxText: qsTr("Free and private sharing. <a href=\"https://jami.net/whydonate/\">Donate</a> to expand it.")
property string donationTipBoxText: qsTr("Free and private sharing. <a href=\"https://jami.net/donate/\">Donate</a> to expand it.")
property string donation: qsTr("Donate")
property string donationText: qsTr("If you enjoy using Jami and believe in our mission, do you want to make a donation?")
property string notNow: qsTr("Not now")

View File

@ -696,11 +696,12 @@ Item {
property color darkThemeBackgroundColor: JamiTheme.darkTheme ? JamiTheme.blackColor : JamiTheme.bgDarkMode_
property color darkThemeCheckedColor: "#03B9E9"
property color darkThemeBorderColor: "#03B9E9"
property color radioCheckedColor: darkTheme ? darkThemeCheckedColor : lightThemeCheckedColor
// Donation campaign
property color donationButtonTextColor: "#005699"
property color donationBackgroundColor: "#D5E4EF"
property string donationUrl: "https://jami.net/whydonate/"
property string donationUrl: "https://jami.net/donate/"
//Connection monitoring
property color connectionMonitoringTableColor1: darkTheme ? "#4D4D4D" : "#f0efef"

View File

@ -215,7 +215,7 @@ PluginAdapter::checkVersionStatus(const QString& pluginId)
QString
PluginAdapter::baseUrl() const
{
return settingsManager_->getValue("PluginStoreEndpoint").toString();
return settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString();
}
QString

View File

@ -104,7 +104,7 @@ public:
return;
}
parent_.sendGetRequest(
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/versions/"
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/versions/"
+ plugin.id + "?arch=" + lrcInstance_->pluginModel().getPlatformInfo()["os"]),
[this, plugin](const QByteArray& data) {
// `data` represents the version in this case.
@ -122,7 +122,7 @@ public:
void installRemotePlugin(const QString& pluginId)
{
parent_.downloadFile(
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/download/"
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/download/"
+ lrcInstance_->pluginModel().getPlatformInfo()["os"] + "/" + pluginId),
pluginId,
0,

View File

@ -42,6 +42,7 @@
#include "mediacodeclistmodel.h"
#include "audiodevicemodel.h"
#include "audiomanagerlistmodel.h"
#include "audioconfiglistmodel.h"
#include "bannedlistmodel.h"
#include "moderatorlistmodel.h"
#include "deviceitemlistmodel.h"
@ -240,6 +241,7 @@ registerTypes(QQmlEngine* engine,
QML_REGISTERTYPE(NS_MODELS, MediaCodecListModel);
QML_REGISTERTYPE(NS_MODELS, AudioDeviceModel);
QML_REGISTERTYPE(NS_MODELS, AudioManagerListModel);
QML_REGISTERTYPE(NS_MODELS, AudioConfigListModel);
QML_REGISTERTYPE(NS_MODELS, PreferenceItemListModel);
QML_REGISTERTYPE(NS_MODELS, PluginListPreferenceModel);
QML_REGISTERTYPE(NS_MODELS, FilesToSendListModel);

View File

@ -65,7 +65,7 @@ ColumnLayout {
titleField: JamiStrings.caCertificate
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -80,7 +80,7 @@ ColumnLayout {
titleField: JamiStrings.userCertificate
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -95,7 +95,7 @@ ColumnLayout {
titleField: JamiStrings.privateKey
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}

View File

@ -16,6 +16,7 @@
*/
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
@ -44,7 +45,7 @@ ColumnLayout {
ColumnLayout {
Layout.fillWidth: true
SettingSpinBox {
SettingSpinBox {
id: dhtPortUsed
visible: !root.isSIP
@ -76,6 +77,7 @@ ColumnLayout {
id: checkBoxEnableProxy
labelText: JamiStrings.enableProxy
descText: checked ? JamiStrings.usingProxy + ' ' + CurrentAccount.currentProxyServer : JamiStrings.proxyDisabled
Layout.fillWidth: true
checked: CurrentAccount.proxyEnabled
@ -83,19 +85,94 @@ ColumnLayout {
onSwitchToggled: CurrentAccount.proxyEnabled = checked
}
SettingsMaterialTextEdit {
id: lineEditProxy
RowLayout {
id: lineEditProxyServer
Layout.fillWidth: true
enabled: checkBoxEnableProxy.checked
Text {
text: JamiStrings.proxyAddress
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
color: JamiTheme.textColor
staticText: CurrentAccount.proxyServer
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
Layout.fillWidth: true
}
itemWidth: root.itemWidth
titleField: JamiStrings.proxyAddress
ModalTextEdit {
id: modalTextEditProxyServer
TextMetrics {
text: modalTextEditProxyServer.staticText
elide: Text.ElideRight
elideWidth: itemWidth - 20
font.pixelSize: JamiTheme.materialLineEditPixelSize
}
onEditFinished: CurrentAccount.proxyServer = dynamicText
visible: true
focus: visible
isSettings: true
Layout.preferredWidth: itemWidth - proxyServerRadioButton.indicator.width - proxyServerRadioButton.spacing - proxyServerRadioButton.horizontalPadding
staticText: CurrentAccount.proxyServer
placeholderText: JamiStrings.proxyAddress
onAccepted: CurrentAccount.proxyServer = dynamicText
}
JamiRadioButton {
id: proxyServerRadioButton
checked: !CurrentAccount.proxyListEnabled
leftPadding: 2
rightPadding: 0
spacing: 0
onPressed: CurrentAccount.proxyListEnabled = !CurrentAccount.proxyListEnabled
}
}
RowLayout {
id: lineEditProxyListURL
Layout.fillWidth: true
Text {
text: JamiStrings.proxyListURL
font.pointSize: JamiTheme.settingsFontSize
font.kerning: true
color: JamiTheme.textColor
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignVCenter
Layout.fillWidth: true
}
ModalTextEdit {
id: modalTextEditProxyListURL
TextMetrics {
text: modalTextEditProxyListURL.staticText
elide: Text.ElideRight
elideWidth: itemWidth - 40
font.pixelSize: JamiTheme.materialLineEditPixelSize
}
visible: true
focus: visible
isSettings: true
Layout.preferredWidth: itemWidth - proxyListURLRadioButton.indicator.width - proxyListURLRadioButton.spacing - proxyListURLRadioButton.horizontalPadding
staticText: CurrentAccount.dhtProxyListUrl
placeholderText: JamiStrings.proxyListURL
onAccepted: CurrentAccount.dhtProxyListUrl = dynamicText
}
JamiRadioButton {
id: proxyListURLRadioButton
checked: CurrentAccount.proxyListEnabled
rightPadding: 0
leftPadding: 2
spacing: 0
onPressed: CurrentAccount.proxyListEnabled = !CurrentAccount.proxyListEnabled
}
}
SettingsMaterialTextEdit {

View File

@ -84,7 +84,7 @@ ColumnLayout {
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) : JamiStrings.selectCACertDefault
itemWidth: root.itemWidth
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -99,7 +99,7 @@ ColumnLayout {
itemWidth: root.itemWidth
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) : JamiStrings.selectCACertDefault
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}
@ -114,7 +114,7 @@ ColumnLayout {
itemWidth: root.itemWidth
textField: UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) : JamiStrings.selectCACertDefault
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
})
}

Some files were not shown because too many files have changed in this diff Show More