mirror of
				https://git.jami.net/savoirfairelinux/jami-client-qt.git
				synced 2025-11-04 08:10:18 +08:00 
			
		
		
		
	Compare commits
	
		
			49 Commits
		
	
	
		
			nightly/20
			...
			nightly/20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c22260fb20 | |||
| 0163ad7da1 | |||
| becd7ac144 | |||
| 8b19f733af | |||
| 25c9f0ef5c | |||
| f1895b31b8 | |||
| 13a314bde5 | |||
| 8c9f6a85a3 | |||
| 82eb5c59a6 | |||
| 84a9ba4196 | |||
| 6dac4d2ee3 | |||
| 674bf38766 | |||
| 52f3a9bc28 | |||
| abce881b50 | |||
| 666b149033 | |||
| eb10ccbd4a | |||
| f513358236 | |||
| 3c00829afb | |||
| 84a59889e3 | |||
| 6c35561817 | |||
| 6ffdda7b81 | |||
| a51078c900 | |||
| 76a710e2ab | |||
| bc324aa8bb | |||
| 5c772960bc | |||
| da2acefced | |||
| 524c9b0ed4 | |||
| 8677349c4a | |||
| 905b2e858e | |||
| 6fc2e75a33 | |||
| c738caa3a4 | |||
| cb13d4f771 | |||
| 436e11a6a4 | |||
| 869aef8929 | |||
| e0f939318e | |||
| 136dea011f | |||
| af09269d81 | |||
| 5a5ef4711d | |||
| 1dd745d446 | |||
| 3dd2d26d86 | |||
| eb6b6a2b93 | |||
| b15d692a0e | |||
| e76bcbd555 | |||
| b5a979e6b1 | |||
| 898444dd3c | |||
| 99f246016d | |||
| e24f3d91e8 | |||
| 3a7850b398 | |||
| 1e1750024b | 
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
 | 
			
		||||
@ -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
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								daemon
									
									
									
									
									
								
							 Submodule daemon updated: 41384122a8...7fb78a0b06
									
								
							@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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})
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
 | 
			
		||||
@ -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
											
										
									
								
							
							
								
								
									
										4
									
								
								extras/packaging/gnu-linux/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								extras/packaging/gnu-linux/Jenkinsfile
									
									
									
									
										vendored
									
									
								
							@ -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 {
 | 
			
		||||
 | 
			
		||||
@ -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 \
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
@ -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"]
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"]
 | 
			
		||||
@ -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"]
 | 
			
		||||
 | 
			
		||||
@ -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"
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
@ -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<std::pair<const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex>, 16>':
 | 
			
		||||
    ../../../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<T>::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<std::pair<const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex> >::value' evaluates to false
 | 
			
		||||
      206 |   static_assert(::v8::base::is_trivially_copyable<T>::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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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<cppgc::internal::StatsCollector::AllocationObserver*>::iterator' to 'const char*'
 | 
			
		||||
  401 |         std::remove(allocation_observers_.begin(), allocation_observers_.end(),
 | 
			
		||||
      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
 | 
			
		||||
      |                                                |
 | 
			
		||||
      |                                                std::vector<cppgc::internal::StatsCollector::AllocationObserver*>::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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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" ] && \
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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 && \
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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>
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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<std::pair<const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex>, 16>':
 | 
			
		||||
    ../../../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<T>::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<std::pair<const v8::internal::compiler::turboshaft::PhiOp*, const v8::internal::compiler::turboshaft::OpIndex> >::value' evaluates to false
 | 
			
		||||
      206 |   static_assert(::v8::base::is_trivially_copyable<T>::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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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*
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										28
									
								
								extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh
									
									
									
									
									
										Executable 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
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB  | 
| 
		 Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB  | 
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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());
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -140,6 +140,7 @@ public:
 | 
			
		||||
 | 
			
		||||
Q_SIGNALS:
 | 
			
		||||
    void mouseMoved(QQuickItem* item);
 | 
			
		||||
    void focusKeyPressed();
 | 
			
		||||
    void pttKeyPressed();
 | 
			
		||||
    void pttKeyReleased();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -80,6 +80,8 @@ Popup {
 | 
			
		||||
 | 
			
		||||
            JamiPushButton { QWKSetParentHitTestVisible {}
 | 
			
		||||
                id: closeButton
 | 
			
		||||
                Accessible.role: Accessible.Button
 | 
			
		||||
                Accessible.name: JamiStrings.close
 | 
			
		||||
 | 
			
		||||
                visible: closeButtonVisible
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										72
									
								
								src/app/commoncomponents/JamiRadioButton.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/app/commoncomponents/JamiRadioButton.qml
									
									
									
									
									
										Normal 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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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.
 | 
			
		||||
 | 
			
		||||
@ -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");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -43,6 +43,9 @@ TabButton {
 | 
			
		||||
    hoverEnabled: true
 | 
			
		||||
    onClicked: selected()
 | 
			
		||||
 | 
			
		||||
    Accessible.name: root.labelText
 | 
			
		||||
    Accessible.role: Accessible.Button
 | 
			
		||||
 | 
			
		||||
    Rectangle {
 | 
			
		||||
        id: contentRect
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -25,4 +25,6 @@ PushButton {
 | 
			
		||||
 | 
			
		||||
    normalColor: JamiTheme.chatviewBgColor
 | 
			
		||||
    imageColor: hovered ? JamiTheme.chatviewButtonColor : JamiTheme.chatViewFooterImgColor
 | 
			
		||||
    Accessible.role: Accessible.Button
 | 
			
		||||
    Accessible.description: toolTipText
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
@ -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
		Reference in New Issue
	
	Block a user