Compare commits

..

49 Commits

Author SHA1 Message Date
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
84a9ba4196 misc: bump daemon submodule
Change-Id: I6296622528575369160a1aa68249229a92cd790f
2025-08-04 15:30:42 -04:00
6dac4d2ee3 packaging: remove Ubuntu 24.10 (EOL)
Change-Id: Id0e69c2c61d3c0d45b31a73768a27f2dfce75a7f
2025-07-30 14:24:27 -04:00
674bf38766 JamiStrings.qml: spell checker dictionary
Change-Id: I37c9b4aceb26ddfe10b62d89fe5a22fc5b291b19
2025-07-28 17:41:33 -04:00
52f3a9bc28 *.desktop and *.metainfo.xml: localize
Follow up to the https://review.jami.net/c/jami-client-qt/+/31007 patch.

Change-Id: I624aecdc9a4608fe4300db0838f57885588b33fe
GitLab: #1955
2025-07-24 17:24:27 -04:00
abce881b50 tests: fix building of previewengine_unittest
This test started failing to build with Qt 6.8.2 and/or GCC 14 in
Guix:

   error: ‘class QHttpServer’ has no member named ‘listen’
      31 |         server->listen(QHostAddress::LocalHost, 8000);

Adjust to use what the Qt documentation suggests, which is to bind the
server to a distinct QTcpServer instance.

Fixes: #1144
Change-Id: I3308acab793b3cdf74458f8196933bca26b41bb1
2025-07-22 15:43:21 -04:00
666b149033 Metainfo: Add latest stable/20250718.0 release details
Change-Id: I8fc881e707c5ef3c6d461e69f19aef92d3c2bae6
2025-07-22 10:34:04 -04:00
eb10ccbd4a misc: bump daemon submodule
Change-Id: I9f9efa528bc929d85bb072e599c2ca30c4c5488d
2025-07-21 14:02:42 -04:00
f513358236 LayoutManager: respect WITH_WEBENGINE flag
This patch updates LayoutManager to use WebEngine only
when WITH_WEBENGINE is set to true.

Change-Id: Idcfc99af9fb4d74c68aac8fc9029cde2bc05b4eb
2025-07-18 14:10:39 -04:00
3c00829afb packaging: use new icon filename
Follow-up to commit 5c772960bc.

Change-Id: Ib5c0b4bc1c5e3f5112bbd49bf323aeb4cc87c75e
2025-07-18 13:30:23 -04:00
84a59889e3 tests/qml: fix undefined references to appWindow
GitLab: #1780
Change-Id: I166f68c7abdf0f21d8d5dcec85e377c27de798a3
2025-07-16 16:17:16 -04:00
6c35561817 Reinstate "cmake: Simplify lookup logic for libjami headers." (again).
This reinstates commit f6c8197cba, which was seemingly reverted by
mistake in 4d2c55348b ("packaging: migrate from Qt 6.2.3 to
6.4.3").

Change-Id: I603e004431be0503be0acdd7ce37fa5aaa4ecd91
2025-07-16 12:58:01 -04:00
6ffdda7b81 tests: Fix WITH_WEBENGINE check.
Use #if, not #ifdef, to test the integer value of WITH_WEBENGINE, not
just whether it's defined.  Otherwise, -DWITH_WEBENGINE=OFF would not
work.

* tests/qml/main.cpp: Replace '#ifdef WITH_WEBENGINE' with '#if
WITH_WEBENGINE'.

Change-Id: Ieda8c46fa696afa1e4118acc7d4fecd4b7f9a171
2025-07-16 12:03:56 -04:00
a51078c900 tests: Avoid takeFirst-caused segfaults on empty arrays.
Replace EXPECT_EQ with ASSERT_EQ where a failure should be
fatal (abort execution).

Relates-to: <https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1507>.
Change-Id: I4b5e38cdc399c1d1a51f72abab23cce963578541
2025-07-16 11:59:26 -04:00
76a710e2ab Fix running tests when building out of the source tree.
CMake's enable_testing needs to be called from the root of the project
as well for CTest to discover the tests in the build tree.  This is
covered in CMake's manual in section 7.2.17 enable_testing.

Change-Id: I7c9b845c52064ff83e39b483b76137b529c1a9a4
2025-07-16 11:57:28 -04:00
bc324aa8bb build: update guix manifest for build.py
Change-Id: I878ad4b2ae4adee4ebc623e4ab40362fd9e1034a
2025-07-16 11:56:55 -04:00
5c772960bc Adhere to flatpak/flathub requirements
- Developer id must be rDns identifier of developer
- Exported icons should match rDNS of app id
- Release version and dates should be included
- Added light and dark branding colours for Flathub banner
- Contact url removed - does not pass appstream validation

Change-Id: Ic5e2a5abeab4310ea87a34cc81363d1851135bcd
2025-07-16 11:31:12 -04:00
da2acefced packaging: add AlmaLinux 10
GitLab: #2065
Change-Id: I4252e2c128f72b3f6a78204a4134374b44155b80
2025-07-14 16:58:06 -04:00
524c9b0ed4 misc: bump daemon submodule
Change-Id: I98aed9601ef2c5dbaf5430ee4abf4d3ee3741f63
2025-07-14 13:29:10 -04:00
8677349c4a accessibility: fix chatview
Add keyboard and screen-reader navigation for the chat view.

Change-Id: I11a5dc1ee3b0d6303f4598f10008ecc6979bb777
2025-07-11 15:08:43 -04:00
905b2e858e build: Guard against potential unset CMAKE_BUILD_TYPE.
This would fail the build with the error:

  CMake Error at tests/CMakeLists.txt:74 (string):
    string no output variable specified

* tests/CMakeLists.txt [CMAKE_BUILD_TYPE]: Make BUILD_TYPE variable
assignment conditional.

Change-Id: I610fe296ed18bd038b2d23d4acd530f05f9526ce
2025-07-11 17:07:56 +09:00
6fc2e75a33 CMakeLists.txt: use system <md4c, tidy>
Search for libraries in the system first, falling back to bundled
copies in case they aren't found.

Change-Id: I10e154f18c569d87dbdcbee3341316ceed57f13c
GitLab: #1506
2025-07-10 10:59:30 -04:00
c738caa3a4 accessibility: fix the messagebar
Add proper labels to the messagebar and remove the existing
keyboard trap in the showmore menu.

Change-Id: Ib70ca29979dc3909585383d612d1062259df83a8
2025-07-09 11:58:49 -04:00
cb13d4f771 accessibility: fix the tip row
Indicate correctly what tips are on the main page.

Change-Id: I142cde7ab3e553cf981a59090b363694dab08775
2025-07-09 11:58:49 -04:00
436e11a6a4 accessibility: fix buttons
Fix the frameless, conversations and invitations buttons for
accessibility.

GitLab: #2049
Change-Id: I82b6722de53c40a260e706a2517aa7cb37dd99a5
2025-07-09 11:58:46 -04:00
869aef8929 accessibility: fix call action bar
Make the call action bar usable with only a keyboard and a
screen-reader by makint it visible using tab and inplementing
proper labels.

GitLab: #2049
Change-Id: Ifa1f1463f27b30bcfffae228058223729f00e51d
2025-07-08 16:40:31 -04:00
e0f939318e accessibility: fix the account creation wizard
Add support for screen readers and keyboard navigation for the account
creation.

GitLab: #2049
Change-Id: Ie91d7222388a9fb627d5a981ba9e7d8afdebcd55
2025-07-08 15:12:42 -04:00
136dea011f accessibility: fix accountlist
Allow to naviguate with keyboard inside of the accountlist and label
the accounts properly

GitLab: #2049

Change-Id: I53e5e97f344df86d6390ab444a642dcabea61cde
2025-07-08 14:16:36 -04:00
af09269d81 conversationmodel: fix multi-device file transfers
The current logic for handling received messages assumes that files sent
by the user don't need to be downloaded. However, this assumption is
incorrect when the user's account is present on multiple devices.

GitLab: #2069
Change-Id: I4e6a53389d736aec4aa86cd39862b7905b9b09ad
2025-06-26 15:30:20 -04:00
5a5ef4711d *.desktop and *.metainfo.xml: update
https://github.com/flathub/net.jami.Jami/blob/master/files/jami-client-qt_appdata.patch
https://docs.flathub.org/docs/for-app-authors/metainfo-guidelines
https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html
https://specifications.freedesktop.org/desktop-entry-spec/latest/file-naming.html
https://specifications.freedesktop.org/desktop-entry-spec/latest/localized-keys.html
https://www.rfc-editor.org/rfc/bcp/bcp47.txt
https://review.jami.net/c/jami-client-android/+/30260
https://review.jami.net/c/jami-client-qt/+/29902

GitLab: #1955

Change-Id: Ib6a3c9770693cdae0f5d6a6a0ccee624febeabe3
2025-06-17 19:34:51 -04:00
1dd745d446 packaging: remove EOL distributions
GitLab: #2064
Change-Id: I566936c16512e7cc3db085a362fbd30f32bb693f
2025-06-17 13:30:12 -04:00
3dd2d26d86 versioning: add build version to snap packaging
GitLab: #2045
Change-Id: I173342d3b9351644a4bad4f70e033d29f06a6cd8
2025-06-16 16:45:33 -04:00
eb6b6a2b93 versioning: add build version to rpm packaging
GitLab: #2045
Change-Id: I44e1c6862305706bb177b1d8f4b1900f1c0098a5
2025-06-16 16:45:10 -04:00
b15d692a0e spellchecker: fix codec segfault
Fix the segfault happening when a codec is not properly loaded by
only activated spellcheck when a dictionnary has been successfully
loaded, initializing a default codec and adding error handling.

GitLab: #2063

Change-Id: I48339ce6d13120cfbae3c6c7eb6f40e87f16f084
2025-06-13 16:03:38 -04:00
e76bcbd555 versioning: add build version to debian packaging
GitLab: #2045
Change-Id: If0f8e2fef4ed38ae9cd4238bb725158526d24658
2025-06-13 10:21:43 -04:00
b5a979e6b1 versioning: add build version propagation for unix packaging system
The application on linux systems currently has a different build version
built into it than the build version generated on Jenkins which dictates
the filenames for release packages. This commit aims to propagate a
build version defined in the gnu-linux Jenkinsfile down to the
build-package-*.sh scripts.

Changes:
- create build version (timestamp) in Jenkinsfile
- propagate build version to Makefile, then the docker containers that
will execute the build-package-*.sh scripts

GitLab: #2045
Change-Id: Ia7cbb2f707c233741039dc7bfd3e5bd6a96c2270
2025-06-12 13:32:03 -04:00
898444dd3c versioning: add build version as windows build argument
The application currently has a different build version than the one set
in Jenkins. This causes issues in the crash reports on windows where
they contain a different build version than the one defined on Jenkins.
This leads to the names of the build artifacts on dl.jami.net not
matching the crash report's build version.

Changes:
- Add build version as parameter to the build-windows.py script.
- Propagate build version value to the application through the
BUILD_VERSION symbol.
- Deprecate version.h file and VERSION_STRING symbol.

GitLab: #2045
Change-Id: I7986679aaeebf2bcbbd63a781499f5a50e089712
2025-06-12 13:31:59 -04:00
99f246016d cmake : fix output directory for windows builds
The output directory for windows builds currently matches either Release
or Beta. This does not work as Beta is only a build option, not a build
type. Changes :

- Change build output directory to match the cmake build type (Release
or Debug)
- Change Beta output path references to Release

Change-Id: Ib513f177d93e3c9fb529e00aa160443ac2e804b5
2025-06-12 13:31:54 -04:00
e24f3d91e8 spellchecker: fix greek
greek spell correction wasn't working. this is because  modern greek
is in a special encoding : ISO8859-7. The text in Jami is in utf-8.
Therefore this patch detect the encoding and decode/encode informations
in the relevent encoding between the client and the hunspell library.

GitLab: #2062
Change-Id: Ia33f154e3bf4b84f8337f669df81152ddcd25ec6
2025-06-10 10:29:11 -04:00
3a7850b398 theme: add dark mode support in keyboard shortcuts window
GitLab: #1891
Change-Id: I1e0746b00776564cc7ddbe12e4ad5665f037a092
2025-06-10 10:28:22 -04:00
1e1750024b JamiStrings: spellChecker name
Change-Id: Id163c032c7507496254061f2d707debefe7ab1b5
2025-06-06 01:52:10 -04:00
142 changed files with 3857 additions and 1869 deletions

View File

@ -84,10 +84,8 @@ if(WIN32)
if(BETA)
message(STATUS "Beta config enabled")
add_definitions(-DBETA)
set(JAMI_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Beta)
else()
set(JAMI_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/Release)
endif()
set(JAMI_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/x64/${CMAKE_BUILD_TYPE})
endif()
if(WIN32)
@ -173,7 +171,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)
@ -182,15 +180,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
@ -246,7 +238,7 @@ set(CMAKE_MODULE_PATH
${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
find_package(LibJami REQUIRED)
if(LIBJAMI_FOUND)
include_directories(${LIBJAMI_INCLUDE_DIRS})
include_directories(${LIBJAMI_INCLUDE_DIR})
endif()
include(FindPython3)
@ -266,6 +258,7 @@ add_custom_target(
-DAPP_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
-DCORE_SOURCE_DIR=${DAEMON_DIR}
-DCPP_INT_FILE=${VERSION_INFO_DIR}/version_info.cpp.in
-DBUILD_VERSION=${BUILD_VERSION}
-P ${CMAKE_SCRIPTS_DIR}/generate_version_info.cmake
)
list(APPEND CLIENT_INCLUDE_DIRS ${VERSION_INFO_DIR})
@ -379,7 +372,6 @@ set(COMMON_HEADERS
${APP_SRC_DIR}/appversionmanager.h
${APP_SRC_DIR}/utils.h
${APP_SRC_DIR}/bannedlistmodel.h
${APP_SRC_DIR}/version.h
${APP_SRC_DIR}/accountlistmodel.h
${APP_SRC_DIR}/instancemanager.h
${APP_SRC_DIR}/connectivitymonitor.h
@ -582,19 +574,25 @@ elseif (NOT APPLE)
add_definitions(${LIBGDKPIXBUF_CFLAGS})
endif()
# Link against the version of libavutil built in the daemon's contribs to
# make sure we don't have ABI incompatibility issues.
set(ARCHITECTURE ${CMAKE_LIBRARY_ARCHITECTURE})
if (NOT ARCHITECTURE)
execute_process(COMMAND gcc -dumpmachine COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE)
endif()
list(PREPEND CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
pkg_check_modules(LIBAVUTIL libavutil>=55.75.100)
${LIBJAMI_CONTRIB_DIR}/${ARCHITECTURE})
pkg_check_modules(avutil REQUIRED IMPORTED_TARGET libavutil=58.2.100)
list(REMOVE_ITEM CMAKE_PREFIX_PATH
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
${LIBJAMI_CONTRIB_DIR}/${ARCHITECTURE})
list(APPEND CLIENT_LIBS PkgConfig::avutil)
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")
@ -696,20 +694,34 @@ add_subdirectory(3rdparty/SortFilterProxyModel)
set(SFPM_OBJECTS $<TARGET_OBJECTS:SortFilterProxyModel>)
# md4c
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Don't build md2html executable" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
list(APPEND CLIENT_LIBS md4c-html)
find_package(md4c)
if(md4c_FOUND)
message(STATUS "Using system-provided md4c-html")
list(APPEND CLIENT_LIBS md4c::md4c-html)
else()
message("Using bundled md4c-html library")
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Don't build md2html executable" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
list(APPEND CLIENT_INCLUDE_DIRS ${MD4C_SOURCE_DIR}/src)
list(APPEND CLIENT_LIBS md4c-html)
endif()
# tidy-html5
set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
list(APPEND CLIENT_LIBS tidy-static)
pkg_check_modules(tidy IMPORTED_TARGET tidy)
if(tidy_FOUND)
message(STATUS "Using system-provided tidy")
list(APPEND CLIENT_LIBS PkgConfig::tidy)
else()
message("Using bundled tidy library")
set(BUILD_SHARED_LIB OFF CACHE BOOL "Don't build shared tidy library" FORCE)
set(SUPPORT_CONSOLE_APP OFF CACHE BOOL "Don't build tidy console app" FORCE)
add_subdirectory(3rdparty/tidy-html5 EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${tidy_BINARY_DIR}/Release)
list(APPEND CLIENT_INCLUDE_DIRS ${tidy_SOURCE_DIR}/include)
list(APPEND CLIENT_LIBS tidy-static)
endif()
# ZXing-cpp configuration
set(BUILD_EXAMPLES OFF CACHE BOOL "")
@ -835,12 +847,12 @@ elseif (NOT APPLE)
# Logos
install(
FILES resources/images/jami.svg
FILES resources/images/net.jami.Jami.svg
DESTINATION
${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
install(
FILES resources/images/jami-48px.png
FILES resources/images/net.jami.Jami-48px.png
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
RENAME jami.png)
@ -1018,5 +1030,6 @@ qt_finalize_executable(${PROJECT_NAME})
# tests
if(BUILD_TESTING)
message("Add Jami tests")
enable_testing()
add_subdirectory(${TESTS_DIR})
endif()

View File

@ -4,10 +4,5 @@
<?define ExeName="Jami" ?>
<?define AppName="Jami" ?>
<?define Manufacturer="Savoir-Faire Linux"?>
<?if $(var.Configuration) = Release ?>
<?define ReleaseDir="..\x64\Release"?>
<?else?>
<?define ReleaseDir="..\x64\Beta"?>
<?endif ?>
</Include>

View File

@ -16,9 +16,9 @@
<InstallerPlatform>x64</InstallerPlatform>
<DefineSolutionProperties>false</DefineSolutionProperties>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<PropertyGroup>
<OutputPath>bin\Release\</OutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<DefineConstants>AppHarvestPath=..\x64\Release;CrtHarvestPath=$(VC_CRT_Dir)</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
@ -26,16 +26,6 @@
<WixVariables>
</WixVariables>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Beta|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>AppHarvestPath=..\x64\Beta;CrtHarvestPath=$(VC_CRT_Dir)</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
<WixVariables>
</WixVariables>
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />
<Compile Include="AppComponents.wxs" />
@ -70,7 +60,7 @@
<Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
</Target>
<Target Name="BeforeBuild">
<HeatDirectory Directory="..\x64\$(Configuration)"
<HeatDirectory Directory="..\x64\Release"
PreprocessorVariable="var.AppHarvestPath"
OutputFile="AppComponents.wxs"
ComponentGroupName="AppHeatGenerated"

2
daemon

Submodule daemon updated: 41384122a8...7fb78a0b06

View File

@ -24,6 +24,7 @@ set(CMAKE_CURRENT_BINARY_DIR ${APP_BINARY_DIR})
# Generate the version string for the application and core
configure_version_string(${APP_SOURCE_DIR} APP_VERSION_STRING)
configure_version_string(${CORE_SOURCE_DIR} CORE_VERSION_STRING)
set(BUILD_VERSION_STRING ${BUILD_VERSION})
# Get output file names with the .in extension removed
get_filename_component(VERSION_CPP_FILENAME ${CPP_INT_FILE} NAME_WE)

View File

@ -16,30 +16,19 @@
# Once done, this find module will set:
#
# LIBJAMI_INCLUDE_DIRS - libjami include directories
# LIBJAMI_INCLUDE_DIR - libjami include directory
# LIBJAMI_FOUND - whether it was able to find the include directories
# LIBJAMI_LIB - path to libjami or libring library
set(LIBJAMI_FOUND true)
if(WITH_DAEMON_SUBMODULE)
set(LIBJAMI_INCLUDE_DIRS ${DAEMON_DIR}/src/jami)
set(LIBJAMI_INCLUDE_DIR ${DAEMON_DIR}/src/jami)
else()
if(EXISTS ${LIBJAMI_INCLUDE_DIR}/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_INCLUDE_DIR})
elseif(EXISTS ${LIBJAMI_BUILD_DIR}/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${LIBJAMI_BUILD_DIR}/jami)
elseif(EXISTS ${RING_INCLUDE_DIR}/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${RING_INCLUDE_DIR})
elseif(EXISTS ${RING_BUILD_DIR}/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${RING_BUILD_DIR}/jami)
elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/include/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include/jami)
elseif(EXISTS ${CMAKE_INSTALL_PREFIX}/daemon/include/jami/jami.h)
set(LIBJAMI_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/daemon/include/jami)
else()
find_path(LIBJAMI_INCLUDE_DIR jami.h PATH_SUFFIXES jami)
if(NOT LIBJAMI_INCLUDE_DIR)
message(STATUS "Jami daemon headers not found!
Set -DLIBJAMI_BUILD_DIR or -DCMAKE_INSTALL_PREFIX")
To build using the daemon git submodule, set -DWITH_DAEMON_SUBMODULE")
set(LIBJAMI_FOUND false)
endif()
endif()
@ -121,5 +110,5 @@ endif()
# Restore the original value of CMAKE_FIND_LIBRARY_SUFFIXES.
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_orig})
message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIRS})
message(STATUS "Jami daemon headers are in " ${LIBJAMI_INCLUDE_DIR})
message(STATUS "Jami daemon library is at " ${LIBJAMI_LIB})

View File

@ -85,7 +85,7 @@
<id>net.jami.daemon</id>
</requires>
<launchable type="desktop-id">net.jami.Jami.desktop</launchable>
<icon type="stock">jami</icon>
<icon type="stock">net.jami.Jami</icon>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://docs.jami.net/user/faq.html</url>

View File

@ -1,14 +1,83 @@
[Desktop Entry]
Name=Jami
GenericName=Jami
Comment=Privacy-oriented voice, video, chat, and conference platform
Comment[hu]=Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform
Comment[ru]=Jami — приложение для защищённой связи с распределённой архитектурой
Comment=Share, freely and privately
Comment[ab]=Ацеиҩшара, хақәиҭла, хала
Comment[af]=Deel, vrylik en privaat
Comment[am]=በነጻ እና በግል ያካፍሉ።
Comment[ar]=شارك بحرية وبشكل خاص
Comment[az]=Sərbəst və gizli şəkildə paylaşın
Comment[be]=Падзяліцеся свабодна і прыватна
Comment[bg]=Споделяйте, свободно и частно
Comment[bn]=শেয়ার করুন, অবাধে এবং গোপনে
Comment[ca]=Comparteix, lliurement i de forma privada
Comment[cs]=Sdílejte svobodně a soukromě
Comment[da]=Del, frit og privat
Comment[de]=Teilen, frei und privat
Comment[el]=Κοινοποιήστε, ελεύθερα και ιδιωτικά
Comment[eo]=Kunhavigu, libere kaj private
Comment[es]=Comparte, libre y privadamente
Comment[et]=Jaga, vabalt ja privaatselt
Comment[fa]=به اشتراک بگذارید، آزادانه و خصوصی
Comment[fi]=Jaa, vapaasti ja yksityisesti
Comment[fil]=Ibahagi, libre at pribado
Comment[fr]=Partagez, librement, gratuitement et en toute confidentialité
Comment[gl]=Comparte, de xeito libre e privado
Comment[he]=שתפו, באופן חופשי ופרטי
Comment[hi]=स्वतंत्र रूप से और निजी तौर पर साझा करें
Comment[hr]=Dijelite, slobodno i privatno
Comment[hu]=Megosztás, szabadon és bizalmasan
Comment[hy]=Տարածեք, ազատ և մասնավոր
Comment[id]=Berbagi, secara bebas dan pribadi
Comment[is]=Deildu, frjálslega og einslega
Comment[it]=Condividere, liberamente e privatamente
Comment[ja]=自由に、プライベートに共有
Comment[ka]=გააზიარეთ, თავისუფლად და პირადად
Comment[km]=ចែករំលែកដោយសេរី និងឯកជន
Comment[kn]=ಮುಕ್ತವಾಗಿ ಮತ್ತು ಖಾಸಗಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ
Comment[ko]=자유롭고 비공개적으로 공유하세요
Comment[ky]=Бөлүшүү, эркин жана купуя
Comment[la]=Communicantes, libere et privatim
Comment[lo]=ແບ່ງ​ປັນ​, ຢ່າງ​ເສລີ​ແລະ​ເປັນ​ສ່ວນ​ຕົວ​
Comment[lt]=Dalintis, laisvai ir privačiai
Comment[lv]=Kopīgojiet, brīvi un privāti
Comment[mk]=Споделете, слободно и приватно
Comment[ml]=സ്വതന്ത്രമായും സ്വകാര്യമായും പങ്കിടുക
Comment[mn]=Чөлөөт, хувийн байдлаар хуваалцах
Comment[mr]=सामायिक करा, मुक्तपणे आणि खाजगीरित्या
Comment[ms]=Kongsi, secara bebas dan peribadi
Comment[my]=လွတ်လပ်စွာ သီးသန့်မျှဝေပါ။
Comment[ne]=स्वतन्त्र र गोप्य रूपमा सेयर गर्नुहोस्
Comment[nl]=Deel, vrij en privé
Comment[no]=Del, fritt og privat
Comment[pl]=Udostępniaj swobodnie i prywatnie
Comment[pt_BR]=Compartilhe, livre e privadamente
Comment[pt_PT]=Partilhe, livre e privadamente
Comment[ro]=Distribuie, în mod liber și privat
Comment[ru]=Делитесь, свободно и конфиденциально
Comment[si]=නිදහසේ සහ පෞද්ගලිකව බෙදා ගන්න
Comment[sk]=Zdieľajte, slobodne a súkromne
Comment[sl]=Delite brezplačno in zasebno
Comment[sq]=Shpërndaje, lirisht dhe privatisht
Comment[sr]=Делите, слободно и приватно
Comment[sv]=Dela, fritt och privat
Comment[sw]=Shiriki, kwa uhuru na kwa faragha
Comment[ta]=பகிரவும், சுதந்திரமாகவும் தனிப்பட்ட முறையிலும்
Comment[te]=ఉచితంగా మరియు ప్రైవేట్‌గా షేర్ చేయండి
Comment[th]=แบ่งปันได้อย่างอิสระและเป็นส่วนตัว
Comment[tl]=Ibahagi, libre at pribado
Comment[tr]=Özgürce ve özel olarak paylaşın
Comment[uk]=Поділіться вільно та приватно
Comment[vi]=Chia sẻ, tự do và riêng tư
Comment[zh_CN]=自由且私密地分享
Comment[zh_HK]=自由且私密地分享
Comment[zh_TW]=自由且私密地分享
Comment[zu]=Yabelana, ngokukhululekile nangasese
Exec=jami %u
Icon=jami
Icon=net.jami.Jami
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;Telephony;
Categories=Chat;FileTransfer;InstantMessaging;Network;P2P;Telephony;VideoConference;
Keywords=Qt;chat;talk;im;message;voip;
MimeType=x-scheme-handler/jami;
MimeType=x-scheme-handler/jami;

File diff suppressed because it is too large Load Diff

View File

@ -85,6 +85,10 @@ pipeline {
environment {
TARBALLS = '/var/cache/jami' // set the cache directory
BUILD_VERSION = sh(
returnStdout: true,
script: 'date +"%Y%m%d%H%M"'
).trim()
}
stages {

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
@ -167,14 +167,11 @@ DISTRIBUTIONS := \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_24.04 \
ubuntu_24.10 \
ubuntu_25.04 \
fedora_39 \
fedora_40 \
fedora_41 \
fedora_42 \
alma_9 \
opensuse-leap_15.5 \
alma_10 \
opensuse-leap_15.6 \
snap
@ -194,6 +191,7 @@ $(1)-docker-image-name := jami-packaging-$(1)
$(1)-docker-image-file := .docker-image-$$($(1)-docker-image-name)
$(1)-docker-run-command := docker run \
--rm --privileged --security-opt apparmor=docker-default \
-e BUILD_VERSION=${BUILD_VERSION} \
-e RELEASE_VERSION="$(RELEASE_VERSION)" \
-e RELEASE_DIRNAME="$(RELEASE_DIRNAME)" \
-e RELEASE_TARBALL_FILENAME="$(RELEASE_TARBALL_FILENAME)" \
@ -253,7 +251,7 @@ define guix-pack-command
guix pack -C xz -f $(1) -m $(CURDIR)/extras/packaging/gnu-linux/guix/guix-pack-manifest.scm -v3 \
-S /usr/bin/jami=bin/jami \
-S /usr/share/applications/net.jami.Jami.desktop=share/applications/net.jami.Jami.desktop \
-S /usr/share/icons/hicolor/scalable/apps/jami.svg=share/icons/hicolor/scalable/apps/jami.svg \
-S /usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg=share/icons/hicolor/scalable/apps/net.jami.Jami.svg \
-S /usr/share/icons/hicolor/48x48/apps/jami.png=share/icons/hicolor/48x48/apps/jami.png \
-S /usr/share/metainfo/net.jami.Jami.metainfo.xml=share/metainfo/net.jami.Jami.metainfo.xml \
-S /usr/share/swcatalog/xml/jami.xml=share/swcatalog/xml/jami.xml \

View File

@ -1,105 +1,94 @@
FROM fedora:39
RUN dnf clean all
RUN dnf update -y
FROM almalinux:10
RUN dnf clean all && dnf update -y
RUN dnf install -y epel-release
RUN dnf install -y 'dnf-command(config-manager)'
RUN dnf config-manager --set-enabled crb
RUN dnf config-manager --set-enabled appstream
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN yum install -y xorg-x11-xauth
RUN dnf install -y \
git \
rpm-build \
tar \
make \
alsa-lib-devel \
astyle \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
bison \
check \
chrpath \
clang15-devel \
cmake \
cryptopp-devel \
cups-devel \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-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 \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
nodejs \
flex \
fmt-devel \
gcc-c++ \
gettext-devel \
git \
gnutls-devel \
gperf \
gsm-devel \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-bad-free-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
jsoncpp-devel \
libX11-devel \
libXext-devel \
libXfixes-devel \
libXrender-devel \
libappindicator-gtk3-devel \
libargon2-devel \
libcanberra-devel \
libcurl-devel \
libdrm \
libnatpmp-devel \
libnotify \
libnotify-devel \
libsndfile-devel \
libstdc++-static \
libtool \
libupnp-devel \
libuuid-devel \
libva-devel \
libvdpau-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
llvm15-devel \
make \
mesa-dri-drivers \
mesa-libgbm-devel \
msgpack-devel \
nasm \
nettle-devel \
NetworkManager-libnm-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3.10 \
cups-devel \
pipewire-devel
nodejs \
nss-devel \
openssl-devel \
opus-devel \
pcre2-devel \
perl-English \
perl-generators \
pipewire-devel \
pulseaudio-libs-devel \
python3-html5lib \
qrencode-devel \
speex-devel \
speexdsp-devel \
sqlite-devel \
systemd-devel \
uuid-devel \
vulkan-devel \
webkitgtk6.0-devel \
wget \
which \
xcb-util-* \
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"]
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

@ -27,6 +27,7 @@ RUN /opt/prebuild-package-debian.sh jami-deps
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

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

@ -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

@ -1,105 +0,0 @@
FROM fedora:40
RUN dnf clean all
RUN dnf update -y
RUN dnf install -y dnf-command\(builddep\) rpmdevtools && \
dnf install -y mock
RUN dnf groupinstall -y "X Software Development"
RUN dnf install -y \
git \
rpm-build \
tar \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
pulseaudio-libs-devel \
libcanberra-devel \
libcurl-devel \
libtool \
mesa-libgbm-devel \
mesa-dri-drivers \
dbus-devel \
expat-devel \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
gsm-devel \
chrpath \
check \
astyle \
uuid-c++-devel \
gettext-devel \
gcc-c++ \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
gnutls-devel \
nettle-devel \
opus-devel \
patch \
jsoncpp-devel \
libnatpmp-devel \
webkitgtk4-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 \
libdrm \
gperf \
bison \
clang \
clang-devel \
llvm-devel \
nodejs \
flex \
gstreamer1 gstreamer1-devel \
gstreamer1-plugins-base-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
nss-devel \
libxcb* \
libxkb* \
libX11-devel \
vulkan-devel \
libXrender-devel \
xcb-util-* \
xz \
xkeyboard-config \
libnotify \
wget \
libstdc++-static \
sqlite-devel \
perl-generators \
perl-English \
libxshmfence-devel \
ninja-build \
clang \
cmake \
fmt-devel \
python3.10 \
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
CMD ["/opt/build-package-rpm.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

@ -1,117 +0,0 @@
FROM opensuse/leap:15.5
RUN zypper --gpg-auto-import-keys refresh
RUN zypper --non-interactive install -y \
dnf \
dnf-command\(builddep\) \
rpmdevtools \
Mesa-dri-devel Mesa-dri \
git \
gcc10 \
gcc10-c++ \
rpm-build \
tar \
make \
autoconf \
automake \
nasm \
speexdsp-devel \
libpulse-devel \
libcanberra-devel \
libcurl-devel \
libtool \
pcre-devel \
yaml-cpp-devel \
libXext-devel \
libXfixes-devel \
yasm \
speex-devel \
libgsm-devel \
chrpath \
check \
astyle \
gettext-devel \
which \
alsa-lib-devel \
systemd-devel \
libuuid-devel \
uuid-devel \
libopus-devel \
patch \
jsoncpp-devel \
webkit2gtk3-devel \
libcryptopp-devel \
libva-devel \
libvdpau-devel \
msgpack-c-devel \
msgpack-cxx-devel \
clutter-devel \
openssl-devel \
clutter-gtk-devel \
libnma-devel \
libcryptopp-devel \
libexpat-devel \
gnome-icon-theme-symbolic \
libgsm-devel \
gtk3-devel \
libappindicator-devel \
sqlite-devel \
ffmpeg-4-libavutil-devel \
gtk3-devel\
qrencode-devel \
python310 \
python3-python-dateutil \
python3-html5lib \
libsndfile-devel \
libdrm \
gperf \
bison \
flex \
ffmpeg ffmpeg-devel \
nodejs20 \
mozilla-nss-devel \
python-xml \
python3-six \
python3-importlib-metadata \
libxcb* \
libxkb* \
libX11-devel \
libXrender-devel \
libfreetype6 \
xcb-util-image-devel \
xcb-util-keysyms-devel \
xcb-util-renderutil-devel \
xcb-util-wm-devel \
xorg-x11-devel \
xz \
xkeyboard-config \
libnotify \
argon2-devel \
libxshmfence-devel \
xproto-devel \
xcb-proto-devel \
xcb-* \
xorg-* \
vulkan-devel \
ninja \
gstreamer-devel \
gstreamer-plugins-good \
gstreamer-plugins-bad-devel \
gstreamer-plugins-base-devel \
cmake \
wget \
pipewire-devel
# openSUSE Leap 15.5 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
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/build-package-rpm.sh /opt/build-package-rpm.sh
ENV CC=gcc
ENV CXX=g++
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=jammy
FROM ubuntu:$UBUNTU AS builder
ARG UBUNTU
@ -21,11 +21,6 @@ RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/sna
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,7 +43,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
@ -57,10 +51,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 +59,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

@ -32,6 +32,7 @@ RUN /opt/prebuild-package-debian.sh jami-deps
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

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

@ -1,29 +0,0 @@
FROM ubuntu:24.10
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
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
# 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 24.10 (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/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

@ -24,7 +24,10 @@
(list
;; Minimal requirements of the daemon contrib build system.
"coreutils"
"gcc-toolchain"
;; When using GCC 15, Jami fails to link with errors like:
;; ld: CMakeFiles/jami.dir/src/app/main.cpp.o:(.rodata+0x0):
;; multiple definition of `QtPrivate::IsFloatType_v<_Float16>'
"gcc-toolchain@14"
"git-minimal"
"grep"
"gzip"
@ -42,18 +45,12 @@
"alsa-lib"
"autoconf"
"automake"
"asio"
"bash"
"bzip2"
"cmake"
"dbus"
;; Bundled because broken with GCC 7 upstream (unmaintained). When
;; attempting to use it, it would cause confusing errors such as
;; "ld: ../src/.libs/libring.a(libupnpcontrol_la-upnp_context.o): in
;; function `jami::upnp::UPnPContext::updateMappingList(bool)':
;; upnp_context.cpp:(.text+0xa4be): undefined reference to
;; `std::__cxx11::basic_ostringstream<char, std::char_traits<char>,
;; std::allocator<char> >::basic_ostringstream()'
;;"dbus-c++" ;for dbusxx-xml2cpp
;;"dhtnet" ;bundled because tightly coupled
"diffutils"
"doxygen"
"eudev" ;udev library
@ -67,6 +64,7 @@
"gsm"
"gtk-doc"
"http-parser"
"jack@0"
"jsoncpp"
"libarchive"
"libgit2"
@ -84,16 +82,24 @@
"patch"
"pcre"
"perl"
"pipewire"
;;"pjproject" ;bundled because patched
"pulseaudio"
"sdbus-c++@1"
"speex"
"speexdsp"
"webrtc-audio-processing@0"
"which"
"yaml-cpp"
"yasm"
;; For the Qt client.
"glib"
"hunspell"
"libnotify"
"libxcb"
"libxkbcommon"
"md4c"
"network-manager" ;libnm
"qrencode"
"qtbase"
@ -103,10 +109,13 @@
"qtnetworkauth"
"qtpositioning"
"qtsvg"
"qwindowkit"
"qttools"
"qtwebchannel"
"qtwebengine"
"tidy-html"
"vulkan-headers"
"zxing-cpp"
;; For tests and debugging.
"file"

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

@ -101,8 +101,6 @@ if [ -f /etc/os-release ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then
ENDTAG="ubuntu_24.04"
elif [ "${UBUNTU_CODENAME}" = "oracular" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.10" ]; then
ENDTAG="ubuntu_24.10"
elif [ "${UBUNTU_CODENAME}" = "plucky" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_25.04" ]; then
ENDTAG="ubuntu_25.04"
elif [ "${ID}" = "debian" ] && \

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
@ -91,11 +91,12 @@ override_dh_auto_build:
mkdir build && \
cd build && \
cmake \
-DBUILD_VERSION=$(BUILD_VERSION) \
-DCMAKE_INSTALL_PREFIX=/usr \
-DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
-DENABLE_LIBWRAP=true \
$(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

@ -49,7 +49,7 @@ BuildRequires: libXfixes-devel
BuildRequires: libuuid-devel
BuildRequires: libva-devel
BuildRequires: libvdpau-devel
BuildRequires: pcre-devel
BuildRequires: (pcre-devel or pcre2-devel)
BuildRequires: pipewire-devel
BuildRequires: uuid-devel
BuildRequires: yaml-cpp-devel
@ -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,8 +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
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
@ -68,34 +69,10 @@ This package contains Qt libraries for Jami.
%setup -n qt-everywhere-src-%{version}
%patch -P 0 -p1
%patch -P 1 -p1
%patch -P 2 -p1
%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 \
@ -103,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

@ -1,16 +1,7 @@
%define name jami
%define version RELEASE_VERSION
%define release 0
# The AppStream 1.0 spec says that the catalog file must be put in /usr/share/swcatalog/xml
# (see https://www.freedesktop.org/software/appstream/docs/chap-CatalogData.html).
#
# However, openSUSE Leap still uses the legacy path /usr/share/app-info/xmls as of version 15.5.
%if 0%{?sle_version} && 0%{?sle_version} <= 150500
%define appstream_catalog_dir /share/app-info/xmls
%else
%define appstream_catalog_dir /share/swcatalog/xml
%endif
# Exclude vendored Qt6 from dependency generator
%define __requires_exclude ^libQt6.*$
@ -82,8 +73,10 @@ cd %{_builddir}/jami-%{version} && \
-DAPPSTREAM_CATALOG_DIR=%{appstream_catalog_dir} \
-DWITH_DAEMON_SUBMODULE=true \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_VERSION=${BUILD_VERSION} \
-DCMAKE_PREFIX_PATH=%{QT_JAMI_PREFIX} \
..
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
@ -93,7 +86,7 @@ DESTDIR=%{buildroot} make -C %{_builddir}/jami-%{version}/build install V=2
%{_bindir}/jami
%{_datadir}/applications/net.jami.Jami.desktop
%{_datadir}/jami/net.jami.Jami.desktop
%{_datadir}/icons/hicolor/scalable/apps/jami.svg
%{_datadir}/icons/hicolor/scalable/apps/net.jami.Jami.svg
%{_datadir}/icons/hicolor/48x48/apps/jami.png
%{_datadir}/pixmaps/jami.xpm
%{_datadir}/metainfo/net.jami.Jami.metainfo.xml

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

@ -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,7 +98,7 @@ description: |
confinement: strict
grade: stable
base: core20
base: core22
plugs:
gnome-3-38-2004:
@ -129,8 +129,8 @@ 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/alsa-lib:
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/alsa-lib
/usr/share/alsa:
bind: $SNAP/usr/share/alsa
/usr/share/X11/xkb:
@ -139,7 +139,7 @@ layout:
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"
apps:
jami:
@ -153,8 +153,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/pipewire-0.3"
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET/spa-0.2"
slots:
- dbus-jami
- dbus-ring
@ -185,7 +185,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_22.04/
parts:
desktop-launch:
@ -201,14 +201,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 +224,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
@ -264,44 +264,47 @@ 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/jami.svg|' extras/data/net.jami.Jami.desktop
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
$CRAFT_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/
cd $CRAFT_PART_BUILD/
mkdir 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
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$QT_BASE_DIR \
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER
make -j$CRAFT_PARALLEL_BUILD_COUNT
DESTDIR=$CRAFT_PART_INSTALL make install
build-packages:
- autoconf
- autoconf-archive
- automake
- autopoint
- bzip2
- cmake
- curl
- gcc
- g++
@ -339,6 +342,7 @@ parts:
- gnutls-bin
- libssl-dev
- git # PipeWire build dependencies
- meson #
- libasound2-dev #
- libdbus-1-dev # These packages are needed by the
- libglib2.0-dev # install-pipewire-from-source.sh
@ -351,7 +355,7 @@ parts:
- libegl1
- libgbm1
- libgudev-1.0-0
- libjsoncpp1
- libjsoncpp25
- libllvm12
- libminizip1
- libnm0
@ -384,6 +388,6 @@ parts:
- -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/libLLVM-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET/libclang-*.so*
- -usr/lib/$CRAFT_ARCH_TRIPLET/libflite*.so*

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" \
@ -101,16 +105,14 @@ if [ ! -f "${RPM_PATH}" ]; then
# Cache the built Qt RPM package.
if [[ "${DISTRIBUTION:0:4}" == "rhel" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el8.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_39" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc39.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_40" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc40.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_41" ]]; 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}" == "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
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el10.x86_64.rpm "${RPM_PATH}"
else
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-*.rpm "${RPM_PATH}"
fi
@ -134,7 +136,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}" -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

@ -29,6 +29,9 @@ cp -r extras/packaging/gnu-linux/rules/snap/${SNAP_PKG_NAME}/snapcraft.yaml .
# set the version and tarball filename
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
# move the built snap to 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,6 +1,6 @@
#!/usr/bin/env bash
# The purpose of this script is to build PipeWire from source in a snap based on core20 / Ubuntu 20.04
# The purpose of this script is to build PipeWire from source in a snap based on core22 / Ubuntu 22.04
# It must be called in the "override-build" section of the relevant part in snapcraft.yaml
set -e
@ -8,28 +8,23 @@ 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
meson setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
meson compile -C builddir
meson 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
meson configure builddir -Dprefix=$SNAPCRAFT_PART_INSTALL/usr/
meson 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
rm -rf pipewire-1.0.5 pipewire-1.0.5.tar.gz
cd $OLD_WD

View File

@ -263,7 +263,7 @@ def cmake_build(config_str, env_vars, cmake_build_dir):
return True
def build(config_str, qt_dir, tests, enable_crash_reports, crash_report_url=None):
def build(config_str, qt_dir, tests, build_version, enable_crash_reports, crash_report_url=None):
"""Use cmake to build the project."""
print("Building with Qt at " + qt_dir)
@ -294,6 +294,9 @@ def build(config_str, qt_dir, tests, enable_crash_reports, crash_report_url=None
else:
cmake_options.append("-DENABLE_CRASHREPORTS=OFF")
if build_version:
cmake_options.append("-DBUILD_VERSION=" + build_version)
# Make sure the build directory exists.
if not os.path.exists(build_dir):
os.makedirs(build_dir)
@ -307,11 +310,11 @@ def build(config_str, qt_dir, tests, enable_crash_reports, crash_report_url=None
sys.exit(1)
def deploy_runtimes(config_str, qt_dir):
def deploy_runtimes(qt_dir):
"""Deploy the dependencies to the runtime directory."""
print("Deploying runtime dependencies")
runtime_dir = os.path.join(repo_root_dir, "x64", config_str)
runtime_dir = os.path.join(repo_root_dir, "x64", "Release")
stamp_file = os.path.join(runtime_dir, ".deploy.stamp")
if os.path.exists(stamp_file):
return
@ -470,6 +473,8 @@ def parse_args():
help='Sets the Qt root path')
parser.add_argument(
"-a", "--arch", default="x64", help="Sets the build architecture")
parser.add_argument(
"--build-version", help="Sets the build version string used for defining app build version")
parser.add_argument(
"-t", "--tests", action="store_true", help="Build and run tests")
parser.add_argument(
@ -552,10 +557,11 @@ def main():
def do_build(do_tests):
if not parsed_args.skip_build:
build(config_str, parsed_args.qt, do_tests,
parsed_args.build_version,
parsed_args.enable_crash_reports,
parsed_args.crash_report_url)
if not parsed_args.skip_deploy:
deploy_runtimes(config_str, parsed_args.qt)
deploy_runtimes(parsed_args.qt)
if parsed_args.subcommand == "pack":
do_build(False)

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -17,7 +17,6 @@
import QtQuick
import QtQuick.Controls
import QtWebEngine
import net.jami.Adapters 1.1
import net.jami.Enums 1.1
@ -253,9 +252,15 @@ QtObject {
isCallFullscreen = fullScreenItems
.filter(o => o.item.objectName === "callViewLoader")
.length
isWebFullscreen = fullScreenItems
.filter(o => o.item instanceof WebEngineView)
.length
isWebFullscreen = WITH_WEBENGINE ? fullScreenItems
.filter(o => o.item && (
o.item.objectName === JamiQmlUtils.webEngineNames.mediaPreview ||
o.item.objectName === JamiQmlUtils.webEngineNames.videoPreview ||
o.item.objectName === JamiQmlUtils.webEngineNames.map ||
o.item.objectName === JamiQmlUtils.webEngineNames.general ||
o.item.objectName === JamiQmlUtils.webEngineNames.emojiPicker
))
.length : 0
}
// Listen for a hangup combined with a fullscreen call state and

View File

@ -41,15 +41,20 @@ ApplicationWindow {
onActiveFocusItemChanged: {
focusOverlay.margin = -5;
if (activeFocusItem && ((activeFocusItem.focusReason === Qt.TabFocusReason) || (activeFocusItem.focusReason === Qt.BacktabFocusReason))) {
if (activeFocusItem.focusOnChild) {
focusOverlay.parent = activeFocusItem.parent;
} else if (activeFocusItem.dontShowFocusState) {
focusOverlay.parent = null;
if (activeFocusItem) {
const goodReasonToChangeFocus = activeFocusItem instanceof ItemDelegate || ((activeFocusItem.focusReason === Qt.TabFocusReason) || (activeFocusItem.focusReason === Qt.BacktabFocusReason));
if (goodReasonToChangeFocus) {
if (activeFocusItem.focusOnChild) {
focusOverlay.parent = activeFocusItem.parent;
} else if (activeFocusItem.dontShowFocusState) {
focusOverlay.parent = null;
} else {
if (activeFocusItem.showFocusMargin)
focusOverlay.margin = 0;
focusOverlay.parent = activeFocusItem;
}
} else {
if (activeFocusItem.showFocusMargin)
focusOverlay.margin = 0;
focusOverlay.parent = activeFocusItem;
focusOverlay.parent = null;
}
} else {
focusOverlay.parent = null;

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

@ -18,7 +18,7 @@
#include "appversionmanager.h"
#include "lrcinstance.h"
#include "version.h"
#include "version_info.h"
#include <QProcess>
#include <QTimer>
@ -73,7 +73,7 @@ struct AppVersionManager::Impl : public QObject
Q_EMIT parent_.updateCheckReplyReceived(false);
return;
}
auto currentVersion = QString(VERSION_STRING).toULongLong();
auto currentVersion = BUILD_VERSION_STRING.toULongLong();
auto latestVersion = latestVersionString.toULongLong();
const QString channelStr = isBeta ? "beta" : "stable";
const auto newVersionFound = latestVersion > currentVersion;

View File

@ -401,6 +401,16 @@ CallOverlayModel::eventFilter(QObject* object, QEvent* event)
}
}
}
// Tab or BackTab key events should trigger a signal that we can use to
// prevent the overlay from fading and to allow the user to navigate
// through the controls.
if (event->type() == QEvent::KeyPress && (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Tab)
|| (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Backtab)) {
Q_EMIT focusKeyPressed();
// Don't absorb the event so that the focus can be changed
// to the next or previous control.
return false;
}
#ifndef HAVE_GLOBAL_PTT
else if (event->type() == QEvent::KeyPress && listener_->getPttState()) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);

View File

@ -140,6 +140,7 @@ public:
Q_SIGNALS:
void mouseMoved(QQuickItem* item);
void focusKeyPressed();
void pttKeyPressed();
void pttKeyReleased();

View File

@ -80,6 +80,8 @@ Popup {
JamiPushButton { QWKSetParentHitTestVisible {}
id: closeButton
Accessible.role: Accessible.Button
Accessible.name: JamiStrings.close
visible: closeButtonVisible

View File

@ -23,12 +23,12 @@ import net.jami.Adapters 1.1
import net.jami.Constants 1.1
SBSMessageBase {
id: root
id: rootDelegate
property var confId: ConfId
property var currentCallId: CurrentCall.id
component JoinCallButton: MaterialButton {
visible: root.isActive && root.currentCallId !== root.confId
visible: rootDelegate.isActive && rootDelegate.currentCallId !== rootDelegate.confId
toolTipText: JamiStrings.joinCall
color: JamiTheme.blackColor
background.opacity: hovered ? 0.2 : 0.1
@ -40,6 +40,20 @@ SBSMessageBase {
textRightPadding: 9
}
Accessible.role: Accessible.StaticText
Accessible.name: {
let name = isOutgoing ? JamiStrings.inReplyToYou : UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author);
return name + ": " + callLabel.text + " " + formattedDay;
}
Accessible.description: {
let status = "";
if (bubble.isEdited)
status += JamiStrings.edited + " ";
return status + (readers.length > 0 ? JamiStrings.readBy + " " + readers.map(function (uri) {
return UtilsAdapter.getBestNameForUri(CurrentAccount.id, uri);
}).join(", ") : "");
}
property bool isRemoteImage
isOutgoing: Author === CurrentAccount.uri
@ -48,17 +62,17 @@ SBSMessageBase {
formattedTime: MessagesAdapter.getFormattedTime(Timestamp)
bubble.border.color: CurrentConversation.color
bubble.border.width: root.isActive ? 1.5 : 0
bubble.border.width: rootDelegate.isActive ? 1.5 : 0
bubble.color: JamiTheme.messageInBgColor
bubble.opacity: 1
Connections {
target: CurrentConversation
enabled: root.isActive
enabled: rootDelegate.isActive
function onActiveCallsChanged() {
root.isActive = LRCInstance.indexOfActiveCall(root.confId, ActionUri, DeviceId) !== -1;
if (root.isActive) {
rootDelegate.isActive = LRCInstance.indexOfActiveCall(rootDelegate.confId, ActionUri, DeviceId) !== -1;
if (rootDelegate.isActive) {
bubble.mask.border.color = CurrentConversation.color;
bubble.mask.border.width = 1.5;
bubble.mask.z = -2;
@ -66,8 +80,8 @@ SBSMessageBase {
}
}
property bool isActive: LRCInstance.indexOfActiveCall(root.confId, ActionUri, DeviceId) !== -1
visible: isActive || root.confId === "" || Duration > 0
property bool isActive: LRCInstance.indexOfActiveCall(rootDelegate.confId, ActionUri, DeviceId) !== -1
visible: isActive || rootDelegate.confId === "" || Duration > 0
property var baseColor: JamiTheme.messageInBgColor
@ -76,7 +90,7 @@ SBSMessageBase {
id: msg
anchors.right: isOutgoing ? parent.right : undefined
spacing: 10
visible: root.visible
visible: rootDelegate.visible
Image {
id: statusIcon
@ -84,10 +98,10 @@ SBSMessageBase {
width: 10
height: 10
verticalAlignment: Qt.AlignVCenter
visible: !root.isActive
visible: !rootDelegate.isActive
source: {
if (root.isOutgoing) {
if (rootDelegate.isOutgoing) {
if (Duration > 0)
return "qrc:/icons/outgoing-call.svg";
else
@ -104,12 +118,11 @@ SBSMessageBase {
effect: ColorOverlay {
color: {
if (Duration > 0)
return UtilsAdapter.luma(root.baseColor) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
return JamiTheme.redColor
return UtilsAdapter.luma(rootDelegate.baseColor) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark;
return JamiTheme.redColor;
}
}
}
}
Text {
@ -120,11 +133,11 @@ SBSMessageBase {
bottomPadding: 8
Layout.fillWidth: true
Layout.rightMargin: root.isActive && root.currentCallId !== root.confId ? 0 : root.timeWidth + 16
Layout.leftMargin: root.isActive ? 10 : -5 /* spacing is 10 and we want 5px with icon */
Layout.rightMargin: rootDelegate.isActive && rootDelegate.currentCallId !== rootDelegate.confId ? 0 : rootDelegate.timeWidth + 16
Layout.leftMargin: rootDelegate.isActive ? 10 : -5 /* spacing is 10 and we want 5px with icon */
text: {
if (root.isActive)
if (rootDelegate.isActive)
return JamiStrings.startedACall;
return Body;
}
@ -136,7 +149,7 @@ SBSMessageBase {
renderType: Text.NativeRendering
textFormat: Text.MarkdownText
color: UtilsAdapter.luma(root.baseColor) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
color: UtilsAdapter.luma(rootDelegate.baseColor) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
}
JoinCallButton {
@ -146,7 +159,7 @@ SBSMessageBase {
Layout.bottomMargin: 4
text: JamiStrings.joinWithAudio
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, root.confId, true)
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, rootDelegate.confId, true)
}
JoinCallButton {
@ -156,20 +169,20 @@ SBSMessageBase {
Layout.topMargin: 4
Layout.bottomMargin: 4
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, root.confId)
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, rootDelegate.confId)
Layout.rightMargin: 4
}
}
]
opacity: 0
Behavior on opacity {
Behavior on opacity {
NumberAnimation {
duration: 100
}
}
Component.onCompleted: {
bubble.timestampItem.visible = !root.isActive || root.currentCallId === root.confId;
bubble.timestampItem.visible = !rootDelegate.isActive || rootDelegate.currentCallId === rootDelegate.confId;
opacity = 1;
}
}

View File

@ -21,8 +21,8 @@ import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
Column {
id: root
Control {
id: rootDelegate
property bool showTime: false
property bool showDay: false
@ -36,21 +36,41 @@ Column {
height: timestampItem.height + textLabel.height
spacing: 0
Item {
Accessible.name: {
let name = UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author);
return name + ": " + Body + " " + formattedTime + " " + formattedDay;
}
Accessible.description: {
let status = "";
if (IsLastSent)
status += JamiStrings.sent + " ";
return status;
}
background: Rectangle {
id: focusIndicator
visible: rootDelegate.activeFocus
border.color: JamiTheme.tintedBlue
border.width: 2
radius: 10
color: "transparent"
z: 1
}
contentItem: Item {
anchors.horizontalCenter: parent.horizontalCenter
height: timestampItem.height + textLabel.height
TimestampInfo {
id: timestampItem
showDay: root.showDay
showTime: root.showTime
formattedTime: root.formattedTime
formattedDay: root.formattedDay
showDay: rootDelegate.showDay
showTime: rootDelegate.showTime
formattedTime: rootDelegate.formattedTime
formattedDay: rootDelegate.formattedDay
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
}
Label {
@ -67,7 +87,7 @@ Column {
}
}
opacity: 0
Behavior on opacity {
Behavior on opacity {
NumberAnimation {
duration: 100
}

View File

@ -24,20 +24,32 @@ import net.jami.Constants 1.1
import net.jami.Adapters 1.1
Loader {
id: root
id: rootDelegate
property var mediaInfo
property bool showTime
property bool showDay
property int timestamp: Timestamp
property string formattedTime: MessagesAdapter.getFormattedTime(root.timestamp)
property string formattedDay: MessagesAdapter.getFormattedDay(root.timestamp)
property string formattedTime: MessagesAdapter.getFormattedTime(rootDelegate.timestamp)
property string formattedDay: MessagesAdapter.getFormattedDay(rootDelegate.timestamp)
property int seq: MsgSeq.single
property string author: Author
property string body: Body
property var tid: TID
property int transferStatus: TransferStatus
Accessible.name: {
let name = UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author);
return JamiStrings.dataTransfer + name + ": " + JamiStrings.status + TransferStatus + Body + " " + formattedTime + " " + formattedDay;
}
Accessible.description: {
let status = "";
if (IsLastSent)
status += JamiStrings.sent + " ";
return status;
}
onTidChanged: {
if (tid === "") {
sourceComponent = deletedMsgComp;
@ -48,7 +60,7 @@ Loader {
sourceComponent = deletedMsgComp;
return;
} else if (transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED) {
mediaInfo = MessagesAdapter.getMediaInfo(root.body);
mediaInfo = MessagesAdapter.getMediaInfo(rootDelegate.body);
if (Object.keys(mediaInfo).length !== 0 && WITH_WEBENGINE) {
sourceComponent = localMediaMsgComp;
return;
@ -74,13 +86,13 @@ Loader {
id: deletedItem
isOutgoing: Author === CurrentAccount.uri
showTime: root.showTime
seq: root.seq
showTime: rootDelegate.showTime
seq: rootDelegate.seq
author: Author
readers: Readers
timestamp: root.timestamp
formattedTime: root.formattedTime
formattedDay: root.formattedTime
timestamp: rootDelegate.timestamp
formattedTime: rootDelegate.formattedTime
formattedDay: rootDelegate.formattedTime
extraHeight: 0
textContentWidth: textEditId.width
textContentHeight: textEditId.height
@ -122,34 +134,34 @@ Loader {
id: dataTransferItem
transferId: Id
property var transferStats: MessagesAdapter.getTransferStats(transferId, root.transferStatus)
property bool canOpen: root.transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED || isOutgoing
property real maxMsgWidth: root.width - senderMargin - 2 * hPadding - avatarBlockWidth - buttonsLoader.width - 24 - 6 - 24
property var transferStats: MessagesAdapter.getTransferStats(transferId, rootDelegate.transferStatus)
property bool canOpen: rootDelegate.transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED || isOutgoing
property real maxMsgWidth: rootDelegate.width - senderMargin - 2 * hPadding - avatarBlockWidth - buttonsLoader.width - 24 - 6 - 24
// Timer to update the translation bar
Loader {
id: timerLoader
active: root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
active: rootDelegate.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
sourceComponent: Timer {
interval: 1000 // Update every second
running: true
repeat: true
onTriggered: {
transferStats = MessagesAdapter.getTransferStats(transferId, root.transferStatus);
transferStats = MessagesAdapter.getTransferStats(transferId, rootDelegate.transferStatus);
}
}
}
isOutgoing: Author === CurrentAccount.uri
showTime: root.showTime
seq: root.seq
showTime: rootDelegate.showTime
seq: rootDelegate.seq
author: Author
location: Body
transferName: TransferName
readers: Readers
timestamp: root.timestamp
formattedTime: root.formattedTime
formattedDay: root.formattedTime
timestamp: rootDelegate.timestamp
formattedTime: rootDelegate.formattedTime
formattedDay: rootDelegate.formattedTime
extraHeight: progressBar.visible ? 25 : 0
innerContent.children: [
@ -178,7 +190,7 @@ Loader {
Layout.margins: 8
sourceComponent: {
switch (root.transferStatus) {
switch (rootDelegate.transferStatus) {
case Interaction.TransferStatus.TRANSFER_CREATED:
case Interaction.TransferStatus.TRANSFER_FINISHED:
iconSource = JamiResources.link_black_24dp_svg;
@ -225,7 +237,7 @@ Loader {
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: {
if (root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING) {
if (rootDelegate.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING) {
MessagesAdapter.cancelFile(transferId);
} else {
buttonsLoader.iconSource = JamiResources.connecting_black_24dp_svg;
@ -287,7 +299,7 @@ Loader {
ProgressBar {
id: progressBar
visible: root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
visible: rootDelegate.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
height: visible * implicitHeight
value: transferStats.progress / transferStats.totalSize
width: transferItem.width
@ -305,15 +317,15 @@ Loader {
isOutgoing: Author === CurrentAccount.uri
transferId: Id
property var transferStats: MessagesAdapter.getTransferStats(transferId, root.transferStatus)
showTime: root.showTime
seq: root.seq
property var transferStats: MessagesAdapter.getTransferStats(transferId, rootDelegate.transferStatus)
showTime: rootDelegate.showTime
seq: rootDelegate.seq
author: Author
location: Body
transferName: TransferName
readers: Readers
formattedTime: MessagesAdapter.getFormattedTime(root.timestamp)
formattedDay: MessagesAdapter.getFormattedDay(root.timestamp)
formattedTime: MessagesAdapter.getFormattedTime(rootDelegate.timestamp)
formattedDay: MessagesAdapter.getFormattedDay(rootDelegate.timestamp)
property real contentWidth

View File

@ -23,12 +23,12 @@ import "../commoncomponents/contextmenu"
BaseModalDialog {
id: root
objectName: "manageDictionariesDialog"
objectName: "dictionaryManagerDialog"
title: JamiStrings.manageDictionaries
title: JamiStrings.dictionaryManager
popupContent: DictionaryInstallView {
Accessible.name: JamiStrings.manageDictionaries
Accessible.name: JamiStrings.dictionaryManager
Accessible.role: Accessible.PopupMenu
width: 400
height: 500

View File

@ -21,7 +21,7 @@ import net.jami.Adapters 1.1
import net.jami.Constants 1.1
Column {
id: root
id: rootDelegate
property bool showTime: false
property bool showDay: false
@ -34,6 +34,18 @@ Column {
spacing: 2
topPadding: 12
bottomPadding: 12
Accessible.name: {
let name = UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author);
return name + ": " + Body + " " + formattedTime + " " + formattedDay;
}
Accessible.description: {
let status = "";
if (IsLastSent)
status += JamiStrings.sent + " ";
return status;
}
ColumnLayout {
width: parent.width
@ -42,10 +54,10 @@ Column {
TimestampInfo {
id: timestampItem
showDay: root.showDay
showTime: root.showTime
formattedTime: root.formattedTime
formattedDay: root.formattedDay
showDay: rootDelegate.showDay
showTime: rootDelegate.showTime
formattedTime: rootDelegate.formattedTime
formattedDay: rootDelegate.formattedDay
Layout.alignment: Qt.AlignHCenter
}
@ -60,7 +72,7 @@ Column {
}
opacity: 0
Behavior on opacity {
Behavior on opacity {
NumberAnimation {
duration: 100
}

View File

@ -28,6 +28,10 @@ Control {
property string title: ""
property string description: ""
Accessible.role: Accessible.StaticText
Accessible.name: title
Accessible.description: description
width: 190
height: infos.implicitHeight

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: {
@ -87,11 +86,11 @@ ContextMenuAutoLoader {
},
GeneralMenuItem {
id: manageLanguages
itemName: JamiStrings.manageDictionaries
canTrigger: spellCheckEnabled
itemName: JamiStrings.dictionaryManager
canTrigger: isSpellCheckActive()
hasIcon: false
onClicked: {
viewCoordinator.presentDialog(appWindow, "commoncomponents/ManageDictionariesDialog.qml");
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

@ -86,6 +86,7 @@ BaseModalDialog {
JamiPushButton {
id: takePhotoButton
Accessible.name: objectName
objectName: "takePhotoButton"
@ -136,6 +137,8 @@ BaseModalDialog {
height: buttonSize
width: buttonSize
Accessible.name: objectName
normalColor: "transparent"
source: JamiResources.add_photo_alternate_black_24dp_svg
imageColor: hovered ? JamiTheme.textColor : JamiTheme.buttonTintedGreyHovered

View File

@ -37,12 +37,16 @@ Row {
SystemButton {
id: minButton
Accessible.name: JamiStrings.minimize
Accessible.role: Accessible.Button
source: JamiResources.window_bar_minimize_svg
onClicked: appWindow.showMinimized()
}
SystemButton {
id: maxButton
Accessible.name: JamiStrings.maximize
Accessible.role: Accessible.Button
source: appWindow.visibility === Window.Maximized ?
JamiResources.window_bar_restore_svg :
JamiResources.window_bar_maximize_svg
@ -53,6 +57,8 @@ Row {
SystemButton {
id: closeButton
Accessible.name: JamiStrings.closeApplication
Accessible.role: Accessible.Button
source: JamiResources.window_bar_close_svg
baseColor: "#e81123"
onClicked: appWindow.close()

View File

@ -24,6 +24,7 @@ import net.jami.Constants 1.1
Control {
id: root
Accessible.role: Accessible.StaticText
property alias avatarBlockWidth: avatarBlock.width
property alias innerContent: innerContent
@ -64,6 +65,7 @@ Control {
property bool bigMsg
property bool timeUnderBubble: false
property var type: Type
property var shouldBeVisible: msgRowlayout.msgHovered || root.activeFocus || reply.activeFocus || more.activeFocus || share.activeFocus
// If the ListView attached properties are not available,
// then the root delegate is likely a Loader.
@ -81,6 +83,16 @@ Control {
rightPadding: hPadding
leftPadding: hPadding
background: Rectangle {
id: focusIndicator
visible: rootDelegate.activeFocus
radius: 4
border.color: JamiTheme.tintedBlue
border.width: 2
color: "transparent"
z: 1
}
contentItem: ColumnLayout {
id: mainColumnLayout
@ -301,7 +313,7 @@ Control {
anchors.verticalCenter: parent.verticalCenter
anchors.right: isOutgoing ? optionButtonItem.right : undefined
anchors.left: !isOutgoing ? optionButtonItem.left : undefined
visible: msgRowlayout.msgHovered
visible: shouldBeVisible
source: JamiResources.more_vert_24dp_svg
width: optionButtonItem.width / 4
height: optionButtonItem.height
@ -311,7 +323,7 @@ Control {
function setBindings() {
more.isOpen = false;
visible = Qt.binding(() => msgRowlayout.msgHovered);
visible = Qt.binding(() => shouldBeVisible);
imageColor = Qt.binding(() => hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor);
normalColor = Qt.binding(() => JamiTheme.primaryBackgroundColor);
}
@ -356,7 +368,7 @@ Control {
anchors.rightMargin: 5
anchors.right: isOutgoing ? more.left : undefined
anchors.left: !isOutgoing ? more.right : undefined
visible: msgRowlayout.msgHovered
visible: shouldBeVisible
onClicked: {
MessagesAdapter.editId = "";
@ -380,13 +392,14 @@ Control {
anchors.rightMargin: 5
anchors.right: isOutgoing ? reply.left : undefined
anchors.left: !isOutgoing ? reply.right : undefined
visible: msgRowlayout.msgHovered
visible: shouldBeVisible
property bool isOpen: false
property var obj: undefined
function setBindings() { // when the popup is closed, setBindings is called to reset the icon's visual settings
share.isOpen = false;
visible = Qt.binding(() => msgRowlayout.msgHovered);
visible = Qt.binding(() => shouldBeVisible);
imageColor = Qt.binding(() => hovered ? JamiTheme.chatViewFooterImgHoverColor : JamiTheme.chatViewFooterImgColor);
normalColor = Qt.binding(() => JamiTheme.primaryBackgroundColor);
}

View File

@ -22,6 +22,7 @@ import "contextmenu"
BaseContextMenu {
id: root
property var modelList
signal audioRecordMessageButtonClicked
signal videoRecordMessageButtonClicked
@ -31,35 +32,63 @@ BaseContextMenu {
GeneralMenuItem {
id: audioMessage
Accessible.role: Accessible.MenuItem
Accessible.name: itemName
focusPolicy: Qt.StrongFocus
Keys.onReturnPressed: clicked()
canTrigger: true
iconSource: JamiResources.message_audio_black_24dp_svg
itemName: JamiStrings.leaveAudioMessage
onClicked: {
root.audioRecordMessageButtonClicked();
root.close()
}
KeyNavigation.tab: videoMessage
KeyNavigation.backtab: shareLocation
},
GeneralMenuItem {
id: videoMessage
Accessible.role: Accessible.MenuItem
Accessible.name: itemName
focusPolicy: Qt.StrongFocus
Keys.onReturnPressed: clicked()
canTrigger: true
iconSource: JamiResources.message_video_black_24dp_svg
itemName: JamiStrings.leaveVideoMessage
isActif: VideoDevices.listSize !== 0
onClicked: {
root.videoRecordMessageButtonClicked();
root.close()
}
KeyNavigation.tab: shareLocation
KeyNavigation.backtab: audioMessage
},
GeneralMenuItem {
id: shareLocation
Accessible.role: Accessible.MenuItem
Accessible.name: itemName
focusPolicy: Qt.StrongFocus
Keys.onReturnPressed: clicked()
canTrigger: true
iconSource: JamiResources.localisation_sharing_send_pin_svg
itemName: JamiStrings.shareLocation
onClicked: {
root.showMapClicked();
root.close()
}
KeyNavigation.tab: audioMessage
KeyNavigation.backtab: videoMessage
}
]

View File

@ -24,7 +24,21 @@ import net.jami.Constants 1.1
import net.jami.Enums 1.1
SBSMessageBase {
id: root
id: rootDelegate
Accessible.role: Accessible.StaticText
Accessible.name: {
let name = isOutgoing ? JamiStrings.inReplyToYou : UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author);
return name + ": " + Body + " " + formattedTime;
}
Accessible.description: {
let status = "";
if (bubble.isEdited)
status += JamiStrings.edited + " ";
return status + (readers.length > 0 ? JamiStrings.readBy + " " + readers.map(function (uri) {
return UtilsAdapter.getBestNameForUri(CurrentAccount.id, uri);
}).join(", ") : "");
}
property bool isRemoteImage
property bool isEmojiOnly: IsEmojiOnly
@ -34,11 +48,11 @@ SBSMessageBase {
Connections {
target: bubble
function onColorChanged(color) {
root.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark;
root.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark;
rootDelegate.colorUrl = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewLinkColorLight : JamiTheme.chatviewLinkColorDark;
rootDelegate.colorText = UtilsAdapter.luma(bubble.color) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark;
// Update parsed body with correct colors
if (Body !== "")
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), rootDelegate.colorUrl, bubble.color);
}
}
@ -53,7 +67,7 @@ SBSMessageBase {
textContentWidth: textEditId.width
textContentHeight: textEditId.height
bigMsg: textContentWidth >= (2 / 3) * root.maxMsgWidth || extraContent.active
bigMsg: textContentWidth >= (2 / 3) * rootDelegate.maxMsgWidth || extraContent.active
innerContent.children: [
TextEdit {
@ -63,10 +77,10 @@ SBSMessageBase {
topPadding: bubble.isDeleted ? 6 : 10
bottomPadding: bubble.isDeleted ? 6 : 10
anchors.right: isOutgoing ? parent.right : undefined
anchors.rightMargin: isOutgoing && !isEmojiOnly && !bigMsg ? root.timeWidth + root.editedWidth : 0
anchors.rightMargin: isOutgoing && !isEmojiOnly && !bigMsg ? rootDelegate.timeWidth + rootDelegate.editedWidth : 0
text: {
if (Body !== "" && ParsedBody.length === 0) {
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), root.colorUrl, bubble.color);
MessagesAdapter.parseMessage(Id, Body, UtilsAdapter.getAppValue(Settings.DisplayHyperlinkPreviews), rootDelegate.colorUrl, bubble.color);
return "";
}
if (ParsedBody !== "")
@ -82,11 +96,11 @@ SBSMessageBase {
width: {
if (extraContent.active)
Math.max(extraContent.width, Math.min((2 / 3) * root.maxMsgWidth, implicitWidth - avatarBlockWidth, extraContent.minSize) - senderMargin);
Math.max(extraContent.width, Math.min((2 / 3) * rootDelegate.maxMsgWidth, implicitWidth - avatarBlockWidth, extraContent.minSize) - senderMargin);
else if (isEmojiOnly)
Math.min((2 / 3) * root.maxMsgWidth, implicitWidth, innerContent.width - senderMargin - (innerContent.width - senderMargin) % (JamiTheme.chatviewEmojiSize + 2));
Math.min((2 / 3) * rootDelegate.maxMsgWidth, implicitWidth, innerContent.width - senderMargin - (innerContent.width - senderMargin) % (JamiTheme.chatviewEmojiSize + 2));
else
Math.min((2 / 3) * root.maxMsgWidth, implicitWidth + 5, innerContent.width - senderMargin + 5);
Math.min((2 / 3) * rootDelegate.maxMsgWidth, implicitWidth + 5, innerContent.width - senderMargin + 5);
}
wrapMode: Label.WrapAtWordBoundaryOrAnywhere
@ -96,7 +110,7 @@ SBSMessageBase {
renderType: Text.NativeRendering
textFormat: Text.RichText
clip: true
onLinkHovered: root.hoveredLink = hoveredLink
onLinkHovered: rootDelegate.hoveredLink = hoveredLink
onLinkActivated: Qt.openUrlExternally(new URL(hoveredLink))
readOnly: true
color: (ParsedBody !== "") ? getBaseColor() : (UtilsAdapter.luma(bubble.color) ? "white" : "dark")
@ -150,7 +164,7 @@ SBSMessageBase {
HoverHandler {
target: previewContent
onHoveredChanged: {
root.hoveredLink = hovered ? LinkPreviewInfo.url : "";
rootDelegate.hoveredLink = hovered ? LinkPreviewInfo.url : "";
}
cursorShape: Qt.PointingHandCursor
}
@ -204,7 +218,7 @@ SBSMessageBase {
wrapMode: Label.WrapAtWordBoundaryOrAnywhere
renderType: Text.NativeRendering
textFormat: TextEdit.RichText
color: root.colorText
color: rootDelegate.colorText
visible: LinkPreviewInfo.title.length > 0
text: LinkPreviewInfo.title
lineHeight: 1.3
@ -217,9 +231,9 @@ SBSMessageBase {
renderType: Text.NativeRendering
textFormat: TextEdit.RichText
visible: LinkPreviewInfo.description.length > 0
font.underline: root.hoveredLink
font.underline: rootDelegate.hoveredLink
text: LinkPreviewInfo.description
color: root.colorUrl
color: rootDelegate.colorUrl
lineHeight: 1.3
}
Label {
@ -229,7 +243,7 @@ SBSMessageBase {
wrapMode: Label.WrapAtWordBoundaryOrAnywhere
renderType: Text.NativeRendering
textFormat: TextEdit.RichText
color: root.colorText
color: rootDelegate.colorText
text: LinkPreviewInfo.domain
lineHeight: 1.3
}

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

@ -17,7 +17,6 @@
#pragma once
#include "version.h"
#include "version_info.h"
#include <QVariantMap>
@ -108,7 +107,7 @@ protected:
{"platform", QSysInfo::prettyProductName() + "_" + QSysInfo::currentCpuArchitecture()},
{"client_sha", APP_VERSION_STRING},
{"jamicore_sha", CORE_VERSION_STRING},
{"build_id", QString(VERSION_STRING)},
{"build_id", BUILD_VERSION_STRING},
#if defined(Q_OS_WIN) && defined(BETA)
{"build_variant", "beta"},
#endif

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

@ -17,7 +17,7 @@
#include "mainapplication.h"
#include "instancemanager.h"
#include "version.h"
#include "version_info.h"
#if defined(Q_OS_MACOS)
#include <os/macos/macutils.h>
#endif
@ -66,7 +66,7 @@ main(int argc, char* argv[])
QApplication::setApplicationName(QStringLiteral("Jami"));
QApplication::setOrganizationDomain(QStringLiteral("jami.net"));
QApplication::setQuitOnLastWindowClosed(false);
QCoreApplication::setApplicationVersion(QString(VERSION_STRING));
QCoreApplication::setApplicationVersion(BUILD_VERSION_STRING);
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QApplication::setHighDpiScaleFactorRoundingPolicy(
Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);

View File

@ -464,7 +464,7 @@ MainApplication::initQmlLayer()
void
MainApplication::initSystray()
{
systemTray_->setIcon(QIcon(":/images/jami.svg"));
systemTray_->setIcon(QIcon(":/images/net.jami.Jami.svg"));
QMenu* menu {nullptr};
// If there was a previous menu, reuse it, otherwise create a new one.

View File

@ -85,7 +85,6 @@ Popup {
anchors.rightMargin: 15
spacing: 10
Avatar {
id: avatar
objectName: "accountComboBoxPopupAvatar"
@ -164,8 +163,13 @@ Popup {
imageColor: hovered ? JamiTheme.textColor : JamiTheme.buttonTintedGreyHovered
hoveredColor: JamiTheme.hoverColor
Accessible.role: Accessible.Button
Accessible.name: toolTipText
Accessible.description: JamiStrings.qrCodeExplanation
onClicked: {
viewCoordinator.presentDialog(appWindow, "mainview/components/WelcomePageQrDialog.qml");
listView.currentIndex = -1;
root.close();
}
}
@ -184,34 +188,40 @@ Popup {
toolTipText: !inSettings ? JamiStrings.openSettings : JamiStrings.closeSettings
Accessible.role: Accessible.Button
Accessible.name: toolTipText
KeyNavigation.backtab: shareButton
onClicked: {
!inSettings ? viewCoordinator.present("SettingsView") : viewCoordinator.dismiss("SettingsView");
root.close();
}
KeyNavigation.tab: addAccountItem
}
}
}
}
Rectangle{
Layout.alignment: Qt.AlignHCenter
height: 1
Layout.fillWidth: true
Layout.leftMargin: 15
Layout.rightMargin: 15
color: JamiTheme.smartListHoveredColor
}
JamiListView {
ListView {
id: listView
objectName: "accountList"
Accessible.name: JamiStrings.accountList
Accessible.role: Accessible.List
Accessible.description: JamiStrings.accountListDescription
layer.mipmap: false
clip: true
maximumFlickVelocity: 1024
// HACK: remove after migration to Qt 6.7+
boundsBehavior: Flickable.StopAtBounds
Layout.fillHeight: true
Layout.preferredWidth: parent.width
activeFocusOnTab: true
focus: true
currentIndex: -1 // Set to -1 to avoid initial highlighting
model: SortFilterProxyModel {
sourceModel: AccountListModel
filters: ValueFilter {
@ -221,10 +231,35 @@ Popup {
}
}
highlight: Rectangle {
color: "transparent"
border.color: JamiTheme.primaryBackgroundColor
border.width: 2
radius: 5
Rectangle {
anchors.fill: parent
color: JamiTheme.hoverColor
radius: 5
opacity: 0.3
}
}
delegate: AccountItemDelegate {
height: JamiTheme.accountListItemHeight
width: root.width
Accessible.role: Accessible.ListItem
Accessible.name: Alias || Username
Accessible.description: JamiStrings.switchToAccount
// Update the background to show focus state
background: Rectangle {
color: parent.activeFocus || parent.hovered ? JamiTheme.hoverColor : "transparent"
opacity: parent.activeFocus ? 0.3 : 1
radius: 5
}
onClicked: {
root.close();
// This is a workaround for the synchronicity issue
@ -235,7 +270,7 @@ Popup {
}
}
Rectangle{
Rectangle {
Layout.alignment: Qt.AlignHCenter
height: 1
Layout.fillWidth: true
@ -248,19 +283,24 @@ Popup {
id: addAccountItem
Layout.preferredHeight: 45
Layout.preferredWidth: parent.width -10
Layout.preferredWidth: parent.width - 10
Layout.alignment: Qt.AlignLeft
Layout.leftMargin: 5
Accessible.name: JamiStrings.addAccount
focusPolicy: Qt.StrongFocus
Accessible.name: addAccountText.text
Accessible.role: Accessible.Button
KeyNavigation.tab: manageAccountItem
KeyNavigation.up: listView
KeyNavigation.down: manageAccountItem
background: Rectangle {
color: addAccountItem.hovered ? JamiTheme.hoverColor : JamiTheme.accountComboBoxBackgroundColor
radius: 5
}
RowLayout{
RowLayout {
anchors.left: parent.left
anchors.leftMargin: 18
anchors.verticalCenter: parent.verticalCenter
@ -274,6 +314,7 @@ Popup {
}
Text {
id: addAccountText
Layout.alignment: Qt.AlignLeft
text: JamiStrings.addAccount
textFormat: TextEdit.PlainText
@ -285,18 +326,21 @@ Popup {
root.close();
viewCoordinator.present("WizardView");
}
KeyNavigation.tab: manageAccountItem
}
ItemDelegate {
id: manageAccountItem
focusPolicy: Qt.StrongFocus
Accessible.role: Accessible.Button
Accessible.name: JamiStrings.manageAccount
Accessible.name: manageAccountText.text
KeyNavigation.backtab: addAccountItem
KeyNavigation.tab: shareButton
KeyNavigation.up: addAccountItem
Layout.preferredHeight: 45
Layout.preferredWidth: parent.width-10
Layout.preferredWidth: parent.width - 10
Layout.leftMargin: 5
Layout.bottomMargin: 5
@ -305,7 +349,7 @@ Popup {
radius: 5
}
RowLayout{
RowLayout {
anchors.left: parent.left
anchors.leftMargin: 18
anchors.verticalCenter: parent.verticalCenter
@ -319,8 +363,8 @@ Popup {
color: manageAccountItem.hovered ? JamiTheme.textColor : JamiTheme.buttonTintedGreyHovered
}
Text {
id: manageAccountText
text: JamiStrings.manageAccount
textFormat: TextEdit.PlainText
color: JamiTheme.textColor
font.pointSize: JamiTheme.textFontSize
@ -328,7 +372,7 @@ Popup {
}
onClicked: {
root.close();
viewCoordinator.present("SettingsView")
viewCoordinator.present("SettingsView");
}
}
}

View File

@ -28,17 +28,24 @@ ItemDelegate {
height: JamiTheme.accountListItemHeight
background: Rectangle {
width: root.width - 10
anchors.horizontalCenter: parent.horizontalCenter
anchors {
left: parent ? parent.left : undefined
right: parent ? parent.right : undefined
leftMargin: 5
rightMargin: 5
}
radius: 5
Rectangle{
Rectangle {
id: separationLine
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors {
left: parent.left
right: parent.right
top: parent.top
leftMargin: 10
rightMargin: 10
}
height: 1
width: parent.width - 20
color: JamiTheme.hoverColor
visible: index !== 0
}

View File

@ -25,6 +25,13 @@ import "../../commoncomponents"
Item {
id: root
property string tipTitle: title.text
property string tipDescription: opened ? description.text : JamiStrings.whyBackupAccount
Accessible.name: tipTitle
Accessible.description: tipDescription
width: parent.width
height: backupLayout.height

View File

@ -55,15 +55,30 @@ Control {
signal fullScreenClicked
signal swarmDetailsClicked
// For Keyboard naviguation
property bool isInternalNavigation: false
function exitBarNavigation() {
isInternalNavigation = false;
// Let the parent control take over focus handling
parent.forceActiveFocus();
}
Component {
id: buttonDelegate
CallButtonDelegate {
id: delegateItem
width: root.height
height: width
barWidth: root.width
onSubMenuVisibleChanged: subMenuOpen = subMenuVisible
onHoveredChanged: root.barHovered = hovered
focusPolicy: Qt.StrongFocus
focus: false
Keys.onEscapePressed: root.exitBarNavigation()
}
}
@ -83,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
@ -98,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
@ -257,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);
@ -567,6 +585,34 @@ Control {
ComboBox {
id: overflowButton
Accessible.role: Accessible.Button
Accessible.name: JamiStrings.more
Accessible.description: JamiStrings.moreOptions
KeyNavigation.tab: {
if (popup.opened) {
return popup.contentItem.itemAtIndex(0);
}
// Exit bar navigation if we've reached the end
root.exitBarNavigation();
return null;
}
KeyNavigation.backtab: {
if (overflowItemListView.count > 0) {
return overflowItemListView.itemAtIndex(overflowItemListView.count - 1);
}
return itemListView.itemAtIndex(itemListView.count - 1);
}
Keys.onEscapePressed: {
if (popup.opened) {
popup.close();
} else {
root.exitBarNavigation();
}
}
visible: CallOverlayModel.overflowIndex < overflowItemCount - 2
width: root.height
height: width

View File

@ -42,8 +42,18 @@ ItemDelegate {
text: ""
Accessible.role: Accessible.Button
Accessible.name: text
Accessible.description: text
Accessible.name: ItemAction.text
Accessible.description: {
if (!ItemAction?.text)
return "";
if (ItemAction.checkable) {
return JamiStrings.pressToToggle.arg(ItemAction.text).arg(ItemAction.checked ? JamiStrings.active : JamiStrings.inactive);
}
return JamiStrings.pressToAction.arg(ItemAction.text);
}
Accessible.pressed: pressed
Accessible.checkable: ItemAction ? ItemAction.checkable : false
Accessible.checked: ItemAction ? ItemAction.checked : false
z: index
@ -77,7 +87,7 @@ ItemDelegate {
return HalfPill.None;
}
Behavior on color {
Behavior on color {
ColorAnimation {
duration: JamiTheme.shortFadeDuration
}
@ -94,7 +104,7 @@ ItemDelegate {
radius: isLast ? 5 : width / 2
type: isLast ? HalfPill.Right : HalfPill.None
Behavior on color {
Behavior on color {
ColorAnimation {
duration: JamiTheme.shortFadeDuration
}
@ -113,7 +123,7 @@ ItemDelegate {
source: ItemAction ? ItemAction.icon.source : ""
color: ItemAction ? (ItemAction.enabled ? ItemAction.icon.color : Qt.lighter(ItemAction.icon.color)) : null
SequentialAnimation on opacity {
SequentialAnimation on opacity {
loops: Animation.Infinite
running: ItemAction !== undefined && ItemAction.blinksWhenChecked !== undefined && ItemAction.blinksWhenChecked && checked
onStopped: icon.opacity = 1
@ -171,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;
}
}
}
@ -188,7 +212,7 @@ ItemDelegate {
radius: 4
}
onActivated: index => menuAction.accept(index);
onActivated: index => menuAction.accept(index)
model: visible ? menuAction.listModel : null
delegate: ItemDelegate {
id: menuItem
@ -313,7 +337,6 @@ ItemDelegate {
// it fits within the overlay, with an extra leftward margin of 24 pixels.
return diff > 0 ? xValue - diff - 24 : xValue;
}
}
implicitWidth: contentItem.implicitWidth

View File

@ -26,6 +26,12 @@ ColumnLayout {
id: column
width: parent.width
property string tipTitle: JamiStrings.customize
property string tipDescription: JamiStrings.customizeText
Accessible.name: tipTitle
Accessible.description: tipDescription
property var iconSize: 26
property var margin: 5
property var prefWidth: 170

View File

@ -24,6 +24,13 @@ import "../../commoncomponents"
Item {
id: root
property string tipTitle: title.text
property string tipDescription: content.text
Accessible.name: tipTitle
Accessible.description: tipDescription
focus: true
width: parent.width
height: backupLayout.height

View File

@ -43,6 +43,9 @@ TabButton {
hoverEnabled: true
onClicked: selected()
Accessible.name: root.labelText
Accessible.role: Accessible.Button
Rectangle {
id: contentRect

View File

@ -26,6 +26,12 @@ ColumnLayout {
id: column
width: parent.width
property alias tipTitle: title.text
property alias tipDescription: description.text
Accessible.name: tipTitle
Accessible.description: tipDescription
property real maxHeight: 250
property var iconSize: 26

View File

@ -25,4 +25,6 @@ PushButton {
normalColor: JamiTheme.chatviewBgColor
imageColor: hovered ? JamiTheme.chatviewButtonColor : JamiTheme.chatViewFooterImgColor
Accessible.role: Accessible.Button
Accessible.description: toolTipText
}

View File

@ -228,6 +228,11 @@ Window {
anchors.fill: parent
background: Rectangle {
anchors.fill: parent
color: JamiTheme.backgroundColor
}
// make a list view of keyboardShortcutsModelList[selectionBar.currentIndex]
JamiListView {
id: keyboardShortcutsListView
@ -262,6 +267,7 @@ Window {
Layout.topMargin: 8
Layout.leftMargin: 20
text: description
color: JamiTheme.textColor
background: Rectangle {
width: parent.width + 16
height: parent.height + 16
@ -269,6 +275,7 @@ Window {
border.width: 2
radius: 5
anchors.centerIn: parent
color: JamiTheme.backgroundColor
}
}
Label {
@ -277,6 +284,7 @@ Window {
Layout.topMargin: 8
Layout.rightMargin: 20
text: shortcut
color: JamiTheme.textColor
background: Rectangle {
width: parent.width + 16
height: parent.height + 16
@ -284,6 +292,7 @@ Window {
border.width: 2
radius: 5
anchors.centerIn: parent
color: JamiTheme.backgroundColor
}
}
}
@ -300,6 +309,10 @@ Window {
focus: true
background: Rectangle {
color: JamiTheme.backgroundColor
}
Repeater {
model: [JamiStrings.generalSettingsTitle, JamiStrings.conversationKeyboardShortcuts, JamiStrings.callKeyboardShortcuts, JamiStrings.markdownKeyboardShortcuts, JamiStrings.settings]
@ -339,9 +352,16 @@ Window {
footer: Item {
height: JamiTheme.keyboardShortcutTabBarSize
PageIndicator {
id: pageIndicator
anchors.centerIn: parent
count: selectionBar.count
currentIndex: selectionBar.currentIndex
delegate: Rectangle {
width: 6
height: 6
radius: 3
color: index === pageIndicator.currentIndex ? JamiTheme.textColor : JamiTheme.textColorHoveredHighContrast
}
}
}
}

View File

@ -26,6 +26,17 @@ Item {
property string timeText: "00:00"
property string remoteRecordingLabel
property bool isKeyboardSelectionActive: {
if (!appWindow || !appWindow.activeFocusItem)
return false;
let parent = appWindow.activeFocusItem.parent;
while (parent && parent !== appWindow && parent !== root && parent !== null) {
if (parent.objectName === "callActionBar")
return true;
parent = parent.parent;
}
return false;
}
Connections {
target: CurrentCall
@ -42,7 +53,11 @@ Item {
property alias callActionBar: __callActionBar
property bool frozen: callActionBar.overflowOpen || callActionBar.barHovered || callActionBar.subMenuOpen || participantCallInStatusView.visible
property bool frozen: callActionBar.overflowOpen ||
callActionBar.barHovered ||
callActionBar.subMenuOpen ||
participantCallInStatusView.visible ||
isKeyboardSelectionActive
property string muteAlertMessage: ""
property bool muteAlertActive: false
@ -59,15 +74,27 @@ Item {
Component.onDestruction: CallOverlayModel.setEventFilterActive(appWindow, this, false)
onVisibleChanged: CallOverlayModel.setEventFilterActive(appWindow, this, visible)
function kickOverlay() {
root.opacity = 1;
fadeOutTimer.restart();
}
Connections {
target: CallOverlayModel
function onMouseMoved(item) {
if (item === root) {
root.opacity = 1;
fadeOutTimer.restart();
kickOverlay();
}
}
// This is part of a mechanism used to show the overlay when a focus key is pressed
// and keep it open in the case that the user is navigating with the keyboard over
// the call action bar.
function onFocusKeyPressed() {
// Always show the overlay when a focus key (Tab/BackTab) is pressed
kickOverlay();
}
}
Shortcut {
@ -76,8 +103,7 @@ Item {
context: Qt.ApplicationShortcut
onActivated: {
CallAdapter.muteAudioToggle();
root.opacity = 1;
fadeOutTimer.restart();
kickOverlay();
}
}
@ -87,8 +113,7 @@ Item {
context: Qt.ApplicationShortcut
onActivated: {
CallAdapter.muteCameraToggle();
root.opacity = 1;
fadeOutTimer.restart();
kickOverlay();
}
}

View File

@ -72,7 +72,6 @@ JamiFlickable {
lineEditObj: textArea
customizePaste: true
spellCheckEnabled: root.spellCheckEnabled
onContextMenuRequirePaste: {
// Intercept paste event to use C++ QMimeData
@ -113,17 +112,13 @@ JamiFlickable {
}
}
readonly 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
@ -192,7 +187,7 @@ JamiFlickable {
onReleased: function (event) {
if (event.button === Qt.RightButton) {
if (spellCheckActive) {
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
var position = textArea.positionAt(event.x, event.y);
textArea.moveCursorSelection(position, TextInput.SelectWords);
textArea.selectWord();
@ -254,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) {
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
var text = textArea.text;
var words = SpellCheckAdapter.findWords(text);
if (!words)

View File

@ -479,6 +479,9 @@ Rectangle {
anchors.bottom: parent.bottom
enabled: !showPreview
hoverEnabled: !showPreview
Accessible.name: JamiStrings.showMoreMessagingOptions
Accessible.role: Accessible.ComboBox
Accessible.description: JamiStrings.showMoreMessagingOptionsDescription
// Used to choose the correct color for the button.
readonly property bool highlight: down || hovered

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