mirror of
https://git.jami.net/savoirfairelinux/jami-client-qt.git
synced 2025-11-04 08:10:18 +08:00
Compare commits
52 Commits
beta/20250
...
stable/202
| Author | SHA1 | Date | |
|---|---|---|---|
| f8d74fb170 | |||
| 7a03b4d410 | |||
| 77a9b447f1 | |||
| 98f868fb5e | |||
| 0ff0ee2bd8 | |||
| 002af53f81 | |||
| 4289545f94 | |||
| bd3552a049 | |||
| 03bcd905e5 | |||
| 9bfd149d45 | |||
| 6c5ab1e483 | |||
| faba758254 | |||
| d8f548261d | |||
| fe504827fa | |||
| ca02cf172a | |||
| ba44b70f97 | |||
| 87e38c2bf5 | |||
| 98a300d36f | |||
| 5ac31130d0 | |||
| 9c11ec6233 | |||
| c9ab1a8e24 | |||
| 76e1bd9eb1 | |||
| ffb20d6767 | |||
| 87e63724c3 | |||
| 9fad769040 | |||
| 4106b8c752 | |||
| fd6e733433 | |||
| ee0a754b6a | |||
| 9278919410 | |||
| 8c1b79a86c | |||
| 3e6108f167 | |||
| 22be4be864 | |||
| bb359f851b | |||
| 36730480aa | |||
| e7d626a421 | |||
| 185869824a | |||
| 9858891fea | |||
| be7ec378c8 | |||
| cbed58544f | |||
| c642c1ddfa | |||
| aa8c1edbd4 | |||
| 2a28438275 | |||
| 92945ad29f | |||
| c22260fb20 | |||
| 0163ad7da1 | |||
| becd7ac144 | |||
| 8b19f733af | |||
| 25c9f0ef5c | |||
| f1895b31b8 | |||
| 13a314bde5 | |||
| 8c9f6a85a3 | |||
| 82eb5c59a6 |
@ -26,7 +26,7 @@ set(CMAKE_SCRIPTS_DIR ${PROJECT_SOURCE_DIR}/extras/build/cmake)
|
||||
include(${CMAKE_SCRIPTS_DIR}/extra_tools.cmake)
|
||||
|
||||
option(WITH_DAEMON_SUBMODULE "Build with daemon submodule" ON)
|
||||
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" OFF)
|
||||
option(JAMICORE_AS_SUBDIR "Build Jami-core as a subdir dependency" ON)
|
||||
option(WITH_WEBENGINE "Build with WebEngine" ON)
|
||||
option(ENABLE_LIBWRAP "Enable libwrap (single process mode)" ON)
|
||||
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||
@ -58,10 +58,9 @@ else()
|
||||
set(DAEMON_DIR ${PROJECT_SOURCE_DIR}/daemon)
|
||||
endif()
|
||||
|
||||
# For now only MSVC is supported for building Jami-core within the
|
||||
# client cmake.
|
||||
if(JAMICORE_AS_SUBDIR)
|
||||
add_subdirectory(${DAEMON_DIR})
|
||||
add_subdirectory(${DAEMON_DIR} EXCLUDE_FROM_ALL)
|
||||
set(LIBJAMI_LIB jami-core)
|
||||
endif()
|
||||
|
||||
# init some variables for includes, libs, etc.
|
||||
@ -171,7 +170,7 @@ set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests)
|
||||
# Here we let find_package(<PackageName>...) try to find Qt 6,
|
||||
# If it is found, find_package will succeed, and the CMake variable
|
||||
# QT_VERSION_MAJOR will be defined 6.
|
||||
set(QT6_MINVER_MINOR 6)
|
||||
set(QT6_MINVER_MINOR 8)
|
||||
if(QT6_VER AND QT6_PATH)
|
||||
find_package(QT NAMES Qt6 REQUIRED
|
||||
PATHS ${QT6_PATH} NO_DEFAULT_PATH)
|
||||
@ -180,15 +179,9 @@ else()
|
||||
find_package(QT NAMES Qt6 REQUIRED)
|
||||
endif()
|
||||
if (${QT_VERSION_MINOR} GREATER_EQUAL ${QT6_MINVER_MINOR})
|
||||
# Enforce a minimum Qt version of 6.6.2 for the Windows build
|
||||
# https://github.com/stdware/qwindowkit/issues/23
|
||||
if(MSVC AND ${QT_VERSION_MINOR} EQUAL 6 AND ${QT_VERSION_PATCH} LESS 2)
|
||||
message(FATAL_ERROR "Qt 6.6.2 or higher is required. Found ${QT_VERSION}")
|
||||
endif()
|
||||
# Qt version is 6.6 or higher
|
||||
message(STATUS "Found a suitable Qt version ${QT_VERSION}")
|
||||
else()
|
||||
message(FATAL_ERROR "Qt 6.6 or higher is required. Found ${QT_VERSION}")
|
||||
message(FATAL_ERROR "Qt 6.8 or higher is required. Found ${QT_VERSION}")
|
||||
endif()
|
||||
|
||||
# libjamiclient
|
||||
@ -240,11 +233,12 @@ cloned this repository via git, perhaps you did not initialize its \
|
||||
submodules afterwards. You can do so by running \"git submodule \
|
||||
update --init\" in the repository.")
|
||||
endif()
|
||||
set(CMAKE_MODULE_PATH
|
||||
${CMAKE_MODULE_PATH} "${EXTRAS_DIR}/build/cmake/modules")
|
||||
find_package(LibJami REQUIRED)
|
||||
if(LIBJAMI_FOUND)
|
||||
include_directories(${LIBJAMI_INCLUDE_DIR})
|
||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/extras/build/cmake/modules)
|
||||
if (NOT JAMICORE_AS_SUBDIR)
|
||||
find_package(LibJami REQUIRED)
|
||||
if(LIBJAMI_FOUND)
|
||||
include_directories(${LIBJAMI_INCLUDE_DIRS})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
include(FindPython3)
|
||||
@ -445,12 +439,24 @@ set(COMMON_HEADERS
|
||||
${APP_SRC_DIR}/qrcodescannermodel.h
|
||||
${APP_SRC_DIR}/spellchecker.h)
|
||||
|
||||
set(CONTRIB_DARWIN_FOLDER "")
|
||||
if(APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
|
||||
if(ARCH_LEN EQUAL 1)
|
||||
# single-arch -> use <arch>-apple-darwin<ver>
|
||||
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
|
||||
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
|
||||
else() # multi-arch -> use apple-darwin<ver>
|
||||
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# For libavutil/avframe.
|
||||
set(LIBJAMI_CONTRIB_DIR "${DAEMON_DIR}/contrib")
|
||||
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
|
||||
PATHS
|
||||
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
|
||||
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
|
||||
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
|
||||
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
|
||||
include_directories(${AVUTIL_INCLUDE_DIR})
|
||||
|
||||
@ -580,19 +586,12 @@ elseif (NOT APPLE)
|
||||
add_definitions(${LIBGDKPIXBUF_CFLAGS})
|
||||
endif()
|
||||
|
||||
list(PREPEND CMAKE_PREFIX_PATH
|
||||
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
|
||||
pkg_check_modules(LIBAVUTIL libavutil>=55.75.100)
|
||||
list(REMOVE_ITEM CMAKE_PREFIX_PATH
|
||||
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg/libavutil)
|
||||
|
||||
include_directories(
|
||||
${LIBCLIENT_SRC_DIR}
|
||||
${LIBNM_INCLUDE_DIRS}
|
||||
${LIBNOTIFY_INCLUDE_DIRS}
|
||||
${LIBGDKPIXBUF_INCLUDE_DIRS}
|
||||
${GLIB_INCLUDE_DIRS}
|
||||
${LIBAVUTIL_INCLUDE_DIRS})
|
||||
${GLIB_INCLUDE_DIRS})
|
||||
|
||||
set(JAMI_DATA_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
|
||||
|
||||
@ -945,7 +944,7 @@ else()
|
||||
target_sources(${PROJECT_NAME} PRIVATE ${resources})
|
||||
list(APPEND CLIENT_LIBS ${libs})
|
||||
|
||||
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib/*.a)
|
||||
file(GLOB CONTRIB ${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/lib/*.a)
|
||||
list(APPEND CLIENT_LIBS ${CONTRIB})
|
||||
|
||||
find_package(Iconv REQUIRED)
|
||||
|
||||
24
INSTALL.md
24
INSTALL.md
@ -29,7 +29,7 @@ sudo apt-get update && sudo apt-get install libqt-jami
|
||||
|
||||
#### Install libqt-jami, Debian based
|
||||
|
||||
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_11"
|
||||
To install libqt-jami on Debian, execute these commands replacing `debian_<VERSION>` by your distribution version. For example "debian_12"
|
||||
|
||||
```bash
|
||||
sudo apt install gnupg dirmngr ca-certificates curl --no-install-recommends
|
||||
@ -189,18 +189,20 @@ Only 64-bit MSVC build can be compiled.
|
||||
|
||||
- Download [Qt (Open Source)](https://www.qt.io/download-open-source?hsCtaTracking=9f6a2170-a938-42df-a8e2-a9f0b1d6cdce%7C6cb0de4f-9bb5-4778-ab02-bfb62735f3e5)
|
||||
|
||||
- Using the online installer, install the following Qt 6.6.2 components:
|
||||
- Using the online installer, install the following Qt 6.8.3 components:
|
||||
|
||||
- Git 2.10.2
|
||||
- MSVC 2019 64-bit
|
||||
- Qt 5 Compatibility Module
|
||||
- MSVC 2022 64-bit
|
||||
- Extension :
|
||||
- Qt WebEngine
|
||||
- Additional Libraries
|
||||
- Qt Multimedia
|
||||
- Qt Network Authorization
|
||||
- Qt WebChannel
|
||||
- Qt WebEngine
|
||||
- Qt WebSockets
|
||||
- Qt WebView
|
||||
- Qt 5 Compatibility Module
|
||||
- Qt Positioning
|
||||
|
||||
- Download [Visual Studio](https://visualstudio.microsoft.com/) (versions 2019 or 2022). _See the SDK notes below._
|
||||
|
||||
@ -212,7 +214,7 @@ Only 64-bit MSVC build can be compiled.
|
||||
|
||||
| | Qt Version |
|
||||
| -------------------- | ---------- |
|
||||
| Minimum requirement: | 6.6.2 |
|
||||
| Minimum requirement: | 6.8.3 |
|
||||
|
||||
- Install [Python3](https://www.python.org/downloads/) for Windows
|
||||
|
||||
@ -238,11 +240,11 @@ Only 64-bit MSVC build can be compiled.
|
||||
- Using a new **Non-Elevated Command Prompt**
|
||||
|
||||
```bash
|
||||
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
|
||||
python build.py --init --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
|
||||
```
|
||||
|
||||
```bash
|
||||
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
|
||||
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.8.3/msvc2022_64)
|
||||
```
|
||||
> **CMake** Note: The build script does not specify what CMake generator should be used. This means CMake will search the system for the appropriate generator, which might not always select the right one if, for instance, Ninja is installed. To resolve that, the CMAKE_GENERATOR environment variable can be used, set to "Visual Studio 16 2019" or "Visual Studio 19 2022" depending on the installed Visual Studio version.
|
||||
|
||||
@ -293,12 +295,12 @@ Once the build has finished, you should then be able to use the Visual Studio So
|
||||
|
||||
**Set up**
|
||||
|
||||
- macOS minimum version 11.0
|
||||
- macOS minimum version 12.0
|
||||
- install python3
|
||||
- download xcode
|
||||
- install Qt 6.6
|
||||
- install Qt 6.8
|
||||
|
||||
Qt 6.6 can be installed via brew
|
||||
Qt 6.8 can be installed via brew
|
||||
|
||||
```bash
|
||||
brew install qt
|
||||
|
||||
5
build.py
5
build.py
@ -417,6 +417,8 @@ def run_install(args):
|
||||
install_args += ('-D', args.extra_cmake_flags)
|
||||
if args.enable_crash_reports:
|
||||
install_args.append('-C')
|
||||
if args.ignore_system_libs:
|
||||
install_args.append('-i')
|
||||
|
||||
if args.distribution == OSX_DISTRIBUTION_NAME:
|
||||
# The `universal_newlines` parameter has been renamed to `text` in
|
||||
@ -769,6 +771,9 @@ def parse_args():
|
||||
ap.add_argument('--enable-crash-reports',
|
||||
action='store_true', default=False,
|
||||
help='Enable crash reporting')
|
||||
ap.add_argument('--ignore_system_libs', dest='ignore_system_libs',
|
||||
default=False, action='store_true',
|
||||
help='Build contrib packages regardless of system detection')
|
||||
|
||||
dist = choose_distribution()
|
||||
|
||||
|
||||
2
daemon
2
daemon
Submodule daemon updated: 33400db731...798c1fcf69
@ -41,7 +41,6 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so;.dll")
|
||||
set(LIBJAMI_NAMES
|
||||
jami-core
|
||||
jami
|
||||
ring
|
||||
)
|
||||
|
||||
if(WITH_DAEMON_SUBMODULE)
|
||||
|
||||
@ -87,12 +87,27 @@
|
||||
</developer>
|
||||
|
||||
<releases>
|
||||
<release version="20250912.0" date="2025-09-12">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250912</url>
|
||||
</release>
|
||||
<release version="20250815.1" date="2025-08-17">
|
||||
<url type="detials">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#stable-20250817</url>
|
||||
</release>
|
||||
<release version="20250718.0" date="2025-07-18">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250718</url>
|
||||
</release>
|
||||
<release version="20250613.0" date="2025-06-13">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250613</url>
|
||||
</release>
|
||||
<release version="20250610.0" date="2025-06-10">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250610</url>
|
||||
</release>
|
||||
<release version="20250523.0" date="2025-05-23">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250523</url>
|
||||
</release>
|
||||
<release version="20250430.1" date="2025-04-30">
|
||||
<url type="details">https://git.jami.net/savoirfairelinux/jami-client-qt/-/wikis/Changelog#nightlystable-20250430</url>
|
||||
</release>
|
||||
</releases>
|
||||
|
||||
<branding>
|
||||
@ -1295,232 +1310,82 @@
|
||||
<!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
|
||||
<caption>Send chat messages and talk with audio and video</caption>
|
||||
<caption xml:lang="ab">Ачат адырраҭарақәа рышьҭра, аудиои авидеои рыла аицәажәара</caption>
|
||||
<caption xml:lang="af">Stuur kletsboodskappe en praat met oudio en video</caption>
|
||||
<caption xml:lang="am">የውይይት መልዕክቶችን ይላኩ እና በድምጽ እና በቪዲዮ ይናገሩ</caption>
|
||||
<caption xml:lang="ar">إرسال رسائل الدردشة والتحدث بالصوت والفيديو</caption>
|
||||
<caption xml:lang="az">Çat mesajları göndərin və audio və video ilə danışın</caption>
|
||||
<caption xml:lang="be">Адпраўляйце паведамленні ў чаце і размаўляйце з аўдыё і відэа</caption>
|
||||
<caption xml:lang="bg">Изпращайте чат съобщения и говорете с аудио и видео</caption>
|
||||
<caption xml:lang="bn">চ্যাট বার্তা পাঠান এবং অডিও এবং ভিডিওর মাধ্যমে কথা বলুন</caption>
|
||||
<caption xml:lang="ca">Envia missatges de xat i parla amb àudio i vídeo</caption>
|
||||
<caption xml:lang="cs">Odesílejte chatové zprávy a mluvte se zvukem a videem</caption>
|
||||
<caption xml:lang="da">Send chatbeskeder og tal med lyd og video</caption>
|
||||
<caption xml:lang="de">Senden Sie Chatnachrichten und sprechen Sie mit Audio und Video</caption>
|
||||
<caption xml:lang="el">Στείλτε μηνύματα συνομιλίας και μιλήστε με ήχο και βίντεο</caption>
|
||||
<caption xml:lang="eo">Sendu babilajn mesaĝojn kaj parolu per audio kaj video</caption>
|
||||
<caption xml:lang="es">Envía mensajes de chat y habla con audio y video.</caption>
|
||||
<caption xml:lang="et">Saatke vestlussõnumeid ja rääkige heli ja videoga</caption>
|
||||
<caption xml:lang="fa">پیام های چت بفرستید و با صدا و تصویر صحبت کنید</caption>
|
||||
<caption xml:lang="fi">Lähetä chat-viestejä ja keskustele äänen ja videon avulla</caption>
|
||||
<caption xml:lang="fil">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
|
||||
<caption xml:lang="fr">Envoyez des messages de chat et discutez avec audio et vidéo</caption>
|
||||
<caption xml:lang="gl">Envía mensaxes de chat e fala con audio e vídeo</caption>
|
||||
<caption xml:lang="he">שלח הודעות צ'אט ודבר עם אודיו ווידאו</caption>
|
||||
<caption xml:lang="hi">चैट संदेश भेजें और ऑडियो और वीडियो के साथ बात करें</caption>
|
||||
<caption xml:lang="hr">Šaljite chat poruke i razgovarajte uz zvuk i video</caption>
|
||||
<caption xml:lang="hu">Csevegőüzenetek küldése, valamint hang- és videobeszélgetés</caption>
|
||||
<caption xml:lang="hy">Ուղարկեք զրույցի հաղորդագրություններ և խոսեք աուդիո և վիդեո</caption>
|
||||
<caption xml:lang="id">Kirim pesan obrolan dan berbicara dengan audio dan video</caption>
|
||||
<caption xml:lang="is">Sendu spjallskilaboð og talaðu með hljóði og myndböndum</caption>
|
||||
<caption xml:lang="it">Invia messaggi di chat e parla con audio e video</caption>
|
||||
<caption xml:lang="ja">チャットメッセージを送信し、音声とビデオで会話する</caption>
|
||||
<caption xml:lang="ka">გაგზავნეთ ჩატის შეტყობინებები და ისაუბრეთ აუდიო და ვიდეოთი</caption>
|
||||
<caption xml:lang="km">ផ្ញើសារជជែក និងនិយាយជាមួយអូឌីយ៉ូ និងវីដេអូ</caption>
|
||||
<caption xml:lang="kn">ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಆಡಿಯೋ ಮತ್ತು ವೀಡಿಯೊದೊಂದಿಗೆ ಮಾತನಾಡಿ</caption>
|
||||
<caption xml:lang="ko">채팅 메시지를 보내고 오디오와 비디오로 대화하세요</caption>
|
||||
<caption xml:lang="ky">Чат билдирүүлөрүн жөнөтүңүз жана аудио жана видео менен сүйлөшүңүз</caption>
|
||||
<caption xml:lang="la">Mitte chat nuntios et colloqui cum audio et video</caption>
|
||||
<caption xml:lang="lo">ສົ່ງຂໍ້ຄວາມສົນທະນາ ແລະສົນທະນາດ້ວຍສຽງ ແລະວິດີໂອ</caption>
|
||||
<caption xml:lang="lt">Siųskite pokalbių pranešimus ir kalbėkite naudodami garso ir vaizdo įrašus</caption>
|
||||
<caption xml:lang="lv">Sūtiet tērzēšanas ziņas un runājiet ar audio un video</caption>
|
||||
<caption xml:lang="mk">Испраќајте пораки за разговор и разговарајте со аудио и видео</caption>
|
||||
<caption xml:lang="ml">ചാറ്റ് സന്ദേശങ്ങൾ അയച്ച് ഓഡിയോ, വീഡിയോ ഉപയോഗിച്ച് സംസാരിക്കുക</caption>
|
||||
<caption xml:lang="mn">Чат мессеж илгээж, аудио болон видеотой ярилцаарай</caption>
|
||||
<caption xml:lang="mr">चॅट संदेश पाठवा आणि ऑडिओ आणि व्हिडिओसह बोला</caption>
|
||||
<caption xml:lang="ms">Hantar mesej sembang dan bercakap dengan audio dan video</caption>
|
||||
<caption xml:lang="my">ချတ်မက်ဆေ့ခ်ျများပို့ပြီး အသံနှင့် ဗီဒီယိုဖြင့် စကားပြောပါ။</caption>
|
||||
<caption xml:lang="ne">अडियो र भिडियो मार्फत च्याट सन्देशहरू पठाउनुहोस् र कुरा गर्नुहोस्</caption>
|
||||
<caption xml:lang="nl">Verstuur chatberichten en praat met audio en video</caption>
|
||||
<caption xml:lang="no">Send chat-meldinger og snakk med lyd og video</caption>
|
||||
<caption xml:lang="pl">Wysyłaj wiadomości czatu i rozmawiaj z dźwiękiem i obrazem</caption>
|
||||
<caption xml:lang="pt-BR">Envie mensagens de bate-papo e fale com áudio e vídeo</caption>
|
||||
<caption xml:lang="pt-PT">Envie mensagens de chat e fale com áudio e vídeo</caption>
|
||||
<caption xml:lang="ro">Trimiteți mesaje de chat și vorbiți cu audio și video</caption>
|
||||
<caption xml:lang="ru">Отправляйте сообщения в чате и общайтесь с помощью аудио и видео</caption>
|
||||
<caption xml:lang="si">කතාබස් පණිවිඩ යවන්න සහ ශ්රව්ය සහ දෘශ්ය සමඟ කතා කරන්න</caption>
|
||||
<caption xml:lang="sk">Posielajte četové správy a rozprávajte sa so zvukom a videom</caption>
|
||||
<caption xml:lang="sl">Pošiljajte sporočila v klepetu in se pogovarjajte z zvokom in videom</caption>
|
||||
<caption xml:lang="sq">Dërgoni mesazhe bisede dhe bisedoni me audio dhe video</caption>
|
||||
<caption xml:lang="sr">Шаљите поруке за ћаскање и разговарајте уз аудио и видео</caption>
|
||||
<caption xml:lang="sv">Skicka chattmeddelanden och prata med ljud och video</caption>
|
||||
<caption xml:lang="sw">Tuma ujumbe wa gumzo na zungumza na sauti na video</caption>
|
||||
<caption xml:lang="ta">அரட்டை செய்திகளை அனுப்பவும், ஆடியோ மற்றும் வீடியோ மூலம் பேசவும்</caption>
|
||||
<caption xml:lang="te">చాట్ సందేశాలను పంపండి మరియు ఆడియో మరియు వీడియోతో మాట్లాడండి</caption>
|
||||
<caption xml:lang="th">ส่งข้อความแชทและพูดคุยด้วยเสียงและวิดีโอ</caption>
|
||||
<caption xml:lang="tl">Magpadala ng mga mensahe sa chat at makipag-usap gamit ang audio at video</caption>
|
||||
<caption xml:lang="tr">Sohbet mesajları gönderin ve sesli ve görüntülü konuşun</caption>
|
||||
<caption xml:lang="uk">Надсилайте повідомлення чату та спілкуйтеся з аудіо та відео</caption>
|
||||
<caption xml:lang="vi">Gửi tin nhắn trò chuyện và nói chuyện bằng âm thanh và video</caption>
|
||||
<caption xml:lang="zh-CN">发送聊天消息并通过音频和视频进行交谈</caption>
|
||||
<caption xml:lang="zh-HK">發送聊天訊息並透過音訊和視訊進行交談</caption>
|
||||
<caption xml:lang="zh-TW">發送聊天訊息並透過音訊和視訊進行交談</caption>
|
||||
<caption xml:lang="zu">Thumela imilayezo yengxoxo futhi ukhulume ngomsindo nevidiyo</caption>
|
||||
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_welcome.PNG</image>
|
||||
<caption>Share, freely and privately</caption>
|
||||
<caption xml:lang="ab">Ацеиҩшара, хақәиҭла, хала</caption>
|
||||
<caption xml:lang="af">Deel, vrylik en privaat</caption>
|
||||
<caption xml:lang="am">በነጻ እና በግል ያካፍሉ።</caption>
|
||||
<caption xml:lang="ar">شارك بحرية وبشكل خاص</caption>
|
||||
<caption xml:lang="az">Sərbəst və gizli şəkildə paylaşın</caption>
|
||||
<caption xml:lang="be">Падзяліцеся свабодна і прыватна</caption>
|
||||
<caption xml:lang="bg">Споделяйте, свободно и частно</caption>
|
||||
<caption xml:lang="bn">শেয়ার করুন, অবাধে এবং গোপনে</caption>
|
||||
<caption xml:lang="ca">Comparteix, lliurement i de forma privada</caption>
|
||||
<caption xml:lang="cs">Sdílejte svobodně a soukromě</caption>
|
||||
<caption xml:lang="da">Del, frit og privat</caption>
|
||||
<caption xml:lang="de">Teilen, frei und privat</caption>
|
||||
<caption xml:lang="el">Κοινοποιήστε, ελεύθερα και ιδιωτικά</caption>
|
||||
<caption xml:lang="eo">Kunhavigu, libere kaj private</caption>
|
||||
<caption xml:lang="es">Comparte, libre y privadamente</caption>
|
||||
<caption xml:lang="et">Jaga, vabalt ja privaatselt</caption>
|
||||
<caption xml:lang="fa">به اشتراک بگذارید، آزادانه و خصوصی</caption>
|
||||
<caption xml:lang="fi">Jaa, vapaasti ja yksityisesti</caption>
|
||||
<caption xml:lang="fil">Ibahagi, libre at pribado</caption>
|
||||
<caption xml:lang="fr">Partagez, librement, gratuitement et en toute confidentialité</caption>
|
||||
<caption xml:lang="gl">Comparte, de xeito libre e privado</caption>
|
||||
<caption xml:lang="he">שתפו, באופן חופשי ופרטי</caption>
|
||||
<caption xml:lang="hi">स्वतंत्र रूप से और निजी तौर पर साझा करें</caption>
|
||||
<caption xml:lang="hr">Dijelite, slobodno i privatno</caption>
|
||||
<caption xml:lang="hu">Megosztás, szabadon és bizalmasan</caption>
|
||||
<caption xml:lang="hy">Տարածեք, ազատ և մասնավոր</caption>
|
||||
<caption xml:lang="id">Berbagi, secara bebas dan pribadi</caption>
|
||||
<caption xml:lang="is">Deildu, frjálslega og einslega</caption>
|
||||
<caption xml:lang="it">Condividere, liberamente e privatamente</caption>
|
||||
<caption xml:lang="ja">自由に、プライベートに共有</caption>
|
||||
<caption xml:lang="ka">გააზიარეთ, თავისუფლად და პირადად</caption>
|
||||
<caption xml:lang="km">ចែករំលែកដោយសេរី និងឯកជន</caption>
|
||||
<caption xml:lang="kn">ಮುಕ್ತವಾಗಿ ಮತ್ತು ಖಾಸಗಿಯಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ</caption>
|
||||
<caption xml:lang="ko">자유롭고 비공개적으로 공유하세요</caption>
|
||||
<caption xml:lang="ky">Бөлүшүү, эркин жана купуя</caption>
|
||||
<caption xml:lang="la">Communicantes, libere et privatim</caption>
|
||||
<caption xml:lang="lo">ແບ່ງປັນ, ຢ່າງເສລີແລະເປັນສ່ວນຕົວ</caption>
|
||||
<caption xml:lang="lt">Dalintis, laisvai ir privačiai</caption>
|
||||
<caption xml:lang="lv">Kopīgojiet, brīvi un privāti</caption>
|
||||
<caption xml:lang="mk">Споделете, слободно и приватно</caption>
|
||||
<caption xml:lang="ml">സ്വതന്ത്രമായും സ്വകാര്യമായും പങ്കിടുക</caption>
|
||||
<caption xml:lang="mn">Чөлөөт, хувийн байдлаар хуваалцах</caption>
|
||||
<caption xml:lang="mr">सामायिक करा, मुक्तपणे आणि खाजगीरित्या</caption>
|
||||
<caption xml:lang="ms">Kongsi, secara bebas dan peribadi</caption>
|
||||
<caption xml:lang="my">လွတ်လပ်စွာ သီးသန့်မျှဝေပါ။</caption>
|
||||
<caption xml:lang="ne">स्वतन्त्र र गोप्य रूपमा सेयर गर्नुहोस्</caption>
|
||||
<caption xml:lang="nl">Deel, vrij en privé</caption>
|
||||
<caption xml:lang="no">Del, fritt og privat</caption>
|
||||
<caption xml:lang="pl">Udostępniaj swobodnie i prywatnie</caption>
|
||||
<caption xml:lang="pt-BR">Compartilhe, livre e privadamente</caption>
|
||||
<caption xml:lang="pt-PT">Partilhe, livre e privadamente</caption>
|
||||
<caption xml:lang="ro">Distribuie, în mod liber și privat</caption>
|
||||
<caption xml:lang="ru">Делитесь, свободно и конфиденциально</caption>
|
||||
<caption xml:lang="si">නිදහසේ සහ පෞද්ගලිකව බෙදා ගන්න</caption>
|
||||
<caption xml:lang="sk">Zdieľajte, slobodne a súkromne</caption>
|
||||
<caption xml:lang="sl">Delite brezplačno in zasebno</caption>
|
||||
<caption xml:lang="sq">Shpërndaje, lirisht dhe privatisht</caption>
|
||||
<caption xml:lang="sr">Делите, слободно и приватно</caption>
|
||||
<caption xml:lang="sv">Dela, fritt och privat</caption>
|
||||
<caption xml:lang="sw">Shiriki, kwa uhuru na kwa faragha</caption>
|
||||
<caption xml:lang="ta">பகிரவும், சுதந்திரமாகவும் தனிப்பட்ட முறையிலும்</caption>
|
||||
<caption xml:lang="te">ఉచితంగా మరియు ప్రైవేట్గా షేర్ చేయండి</caption>
|
||||
<caption xml:lang="th">แบ่งปันได้อย่างอิสระและเป็นส่วนตัว</caption>
|
||||
<caption xml:lang="tl">Ibahagi, libre at pribado</caption>
|
||||
<caption xml:lang="tr">Özgürce ve özel olarak paylaşın</caption>
|
||||
<caption xml:lang="uk">Поділіться вільно та приватно</caption>
|
||||
<caption xml:lang="vi">Chia sẻ, tự do và riêng tư</caption>
|
||||
<caption xml:lang="zh-CN">自由且私密地分享</caption>
|
||||
<caption xml:lang="zh-HK">自由且私密地分享</caption>
|
||||
<caption xml:lang="zh-TW">自由且私密地分享</caption>
|
||||
<caption xml:lang="zu">Yabelana, ngokukhululekile nangasese</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
|
||||
<caption>Screen sharing</caption>
|
||||
<caption xml:lang="ab">Аекран аимадара</caption>
|
||||
<caption xml:lang="af">Skermdeling</caption>
|
||||
<caption xml:lang="am">ማያ ገጽ ማጋራት።</caption>
|
||||
<caption xml:lang="ar">مشاركة الشاشة</caption>
|
||||
<caption xml:lang="az">Ekran paylaşımı</caption>
|
||||
<caption xml:lang="be">Агульны доступ да экрана</caption>
|
||||
<caption xml:lang="bg">Споделяне на екрана</caption>
|
||||
<caption xml:lang="bn">স্ক্রিন শেয়ারিং</caption>
|
||||
<caption xml:lang="ca">Compartició de pantalla</caption>
|
||||
<caption xml:lang="cs">Sdílení obrazovky</caption>
|
||||
<caption xml:lang="da">Skærmdeling</caption>
|
||||
<caption xml:lang="de">Bildschirmfreigabe</caption>
|
||||
<caption xml:lang="el">Κοινή χρήση οθόνης</caption>
|
||||
<caption xml:lang="eo">Kundivido de ekrano</caption>
|
||||
<caption xml:lang="es">Compartir pantalla</caption>
|
||||
<caption xml:lang="et">Ekraani jagamine</caption>
|
||||
<caption xml:lang="fa">اشتراک گذاری صفحه نمایش</caption>
|
||||
<caption xml:lang="fi">Näytön jakaminen</caption>
|
||||
<caption xml:lang="fil">Pagbabahagi ng screen</caption>
|
||||
<caption xml:lang="fr">Partage d'écran</caption>
|
||||
<caption xml:lang="gl">Compartir pantalla</caption>
|
||||
<caption xml:lang="he">שיתוף מסך</caption>
|
||||
<caption xml:lang="hi">स्क्रीन शेयरिंग</caption>
|
||||
<caption xml:lang="hr">Dijeljenje zaslona</caption>
|
||||
<caption xml:lang="hu">Képernyőmegosztás</caption>
|
||||
<caption xml:lang="hy">Էկրանի փոխանակում</caption>
|
||||
<caption xml:lang="id">Berbagi layar</caption>
|
||||
<caption xml:lang="is">Skjádeiling</caption>
|
||||
<caption xml:lang="it">Condivisione dello schermo</caption>
|
||||
<caption xml:lang="ja">画面共有</caption>
|
||||
<caption xml:lang="ka">ეკრანის გაზიარება</caption>
|
||||
<caption xml:lang="km">ការចែករំលែកអេក្រង់</caption>
|
||||
<caption xml:lang="kn">ಪರದೆ ಹಂಚಿಕೆ</caption>
|
||||
<caption xml:lang="ko">화면 공유</caption>
|
||||
<caption xml:lang="ky">Экранды бөлүшүү</caption>
|
||||
<caption xml:lang="la">Screen sharing</caption>
|
||||
<caption xml:lang="lo">ການແບ່ງປັນໜ້າຈໍ</caption>
|
||||
<caption xml:lang="lt">Ekrano bendrinimas</caption>
|
||||
<caption xml:lang="lv">Ekrāna koplietošana</caption>
|
||||
<caption xml:lang="mk">Споделување екран</caption>
|
||||
<caption xml:lang="ml">സ്ക്രീൻ പങ്കിടൽ</caption>
|
||||
<caption xml:lang="mn">Дэлгэц хуваалцах</caption>
|
||||
<caption xml:lang="mr">स्क्रीन शेअरिंग</caption>
|
||||
<caption xml:lang="ms">Perkongsian skrin</caption>
|
||||
<caption xml:lang="my">မျက်နှာပြင်မျှဝေခြင်း။</caption>
|
||||
<caption xml:lang="ne">स्क्रिन सेयरिङ</caption>
|
||||
<caption xml:lang="nl">Scherm delen</caption>
|
||||
<caption xml:lang="no">Skjermdeling</caption>
|
||||
<caption xml:lang="pl">Udostępnianie ekranu</caption>
|
||||
<caption xml:lang="pt-BR">Compartilhamento de tela</caption>
|
||||
<caption xml:lang="pt-PT">Partilha de tela</caption>
|
||||
<caption xml:lang="ro">Partajarea ecranului</caption>
|
||||
<caption xml:lang="ru">Совместное использование экрана</caption>
|
||||
<caption xml:lang="si">තිර බෙදා ගැනීම</caption>
|
||||
<caption xml:lang="sk">Zdieľanie obrazovky</caption>
|
||||
<caption xml:lang="sl">Skupna raba zaslona</caption>
|
||||
<caption xml:lang="sq">Ndarja e ekranit</caption>
|
||||
<caption xml:lang="sr">Дељење екрана</caption>
|
||||
<caption xml:lang="sv">Skärmdelning</caption>
|
||||
<caption xml:lang="sw">Kushiriki skrini</caption>
|
||||
<caption xml:lang="ta">திரைப் பகிர்வு</caption>
|
||||
<caption xml:lang="te">స్క్రీన్ షేరింగ్</caption>
|
||||
<caption xml:lang="th">การแชร์หน้าจอ</caption>
|
||||
<caption xml:lang="tl">Pagbabahagi ng screen</caption>
|
||||
<caption xml:lang="tr">Ekran paylaşımı</caption>
|
||||
<caption xml:lang="uk">Спільне використання екрана</caption>
|
||||
<caption xml:lang="vi">Chia sẻ màn hình</caption>
|
||||
<caption xml:lang="zh-CN">屏幕共享</caption>
|
||||
<caption xml:lang="zh-HK">螢幕分享</caption>
|
||||
<caption xml:lang="zh-TW">螢幕分享</caption>
|
||||
<caption xml:lang="zu">Ukwabelana kwesikrini</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
|
||||
<caption>Crystal clear audio</caption>
|
||||
<caption xml:lang="ab">Ицқьоу аудио</caption>
|
||||
<caption xml:lang="af">Kristalhelder klank</caption>
|
||||
<caption xml:lang="am">ክሪስታል ግልጽ ኦዲዮ</caption>
|
||||
<caption xml:lang="ar">صوت نقي للغاية</caption>
|
||||
<caption xml:lang="az">Kristal təmiz səs</caption>
|
||||
<caption xml:lang="be">Крышталёва чысты аўдыё</caption>
|
||||
<caption xml:lang="bg">Кристално чист звук</caption>
|
||||
<caption xml:lang="bn">স্ফটিক স্বচ্ছ অডিও</caption>
|
||||
<caption xml:lang="ca">Àudio cristal·lí</caption>
|
||||
<caption xml:lang="cs">Křišťálově čistý zvuk</caption>
|
||||
<caption xml:lang="da">Krystalklar lyd</caption>
|
||||
<caption xml:lang="de">Kristallklarer Klang</caption>
|
||||
<caption xml:lang="el">Κρυστάλλινος ήχος</caption>
|
||||
<caption xml:lang="eo">Kristalklara aŭdio</caption>
|
||||
<caption xml:lang="es">Audio cristalina</caption>
|
||||
<caption xml:lang="et">Kristallselge heli</caption>
|
||||
<caption xml:lang="fa">صدای شفاف</caption>
|
||||
<caption xml:lang="fi">Kristallinkirkas ääni</caption>
|
||||
<caption xml:lang="fil">Malinaw na audio</caption>
|
||||
<caption xml:lang="fr">Un son cristallin</caption>
|
||||
<caption xml:lang="gl">Audio cristalino</caption>
|
||||
<caption xml:lang="he">אודיו צלול</caption>
|
||||
<caption xml:lang="hi">क्रिस्टल स्पष्ट ऑडियो</caption>
|
||||
<caption xml:lang="hr">Kristalno čist zvuk</caption>
|
||||
<caption xml:lang="hu">Kristálytiszta hang</caption>
|
||||
<caption xml:lang="hy">Բյուրեղյա մաքուր աուդիո</caption>
|
||||
<caption xml:lang="id">Audio sebening kristal</caption>
|
||||
<caption xml:lang="is">Kristaltært hljóð</caption>
|
||||
<caption xml:lang="it">Audio cristallino</caption>
|
||||
<caption xml:lang="ja">非常にクリアな音声</caption>
|
||||
<caption xml:lang="ka">კრისტალურად სუფთა აუდიო</caption>
|
||||
<caption xml:lang="km">សំឡេងច្បាស់ល្អ</caption>
|
||||
<caption xml:lang="kn">ಸ್ಫಟಿಕ ಸ್ಪಷ್ಟ ಆಡಿಯೋ</caption>
|
||||
<caption xml:lang="ko">매우 선명한 오디오</caption>
|
||||
<caption xml:lang="ky">Кристалл таза аудио</caption>
|
||||
<caption xml:lang="la">Patet Crystal audio</caption>
|
||||
<caption xml:lang="lo">ສຽງທີ່ຊັດເຈນ</caption>
|
||||
<caption xml:lang="lt">Krištolo skaidrumo garsas</caption>
|
||||
<caption xml:lang="lv">Kristāldzidra audio</caption>
|
||||
<caption xml:lang="mk">Кристално чист звук</caption>
|
||||
<caption xml:lang="ml">ക്രിസ്റ്റൽ ക്ലിയർ ഓഡിയോ</caption>
|
||||
<caption xml:lang="mn">Кристал тунгалаг аудио</caption>
|
||||
<caption xml:lang="mr">क्रिस्टल क्लियर ऑडिओ</caption>
|
||||
<caption xml:lang="ms">Audio yang jernih</caption>
|
||||
<caption xml:lang="my">ကြည်လင်ပြတ်သားသော အသံ</caption>
|
||||
<caption xml:lang="ne">क्रिस्टल क्लियर अडियो</caption>
|
||||
<caption xml:lang="nl">Kristalheldere audio</caption>
|
||||
<caption xml:lang="no">Krystallklar lyd</caption>
|
||||
<caption xml:lang="pl">Krystalicznie czysty dźwięk</caption>
|
||||
<caption xml:lang="pt-BR">Áudio cristalino</caption>
|
||||
<caption xml:lang="pt-PT">Áudio cristalino</caption>
|
||||
<caption xml:lang="ro">Sunet clar de cristal</caption>
|
||||
<caption xml:lang="ru">Кристально чистый звук</caption>
|
||||
<caption xml:lang="si">ස්ඵටික පැහැදිලි ශ්රව්ය</caption>
|
||||
<caption xml:lang="sk">Krištáľovo čistý zvuk</caption>
|
||||
<caption xml:lang="sl">Kristalno čist zvok</caption>
|
||||
<caption xml:lang="sq">Audio i pastër kristal</caption>
|
||||
<caption xml:lang="sr">Кристално чист звук</caption>
|
||||
<caption xml:lang="sv">Kristallklart ljud</caption>
|
||||
<caption xml:lang="sw">Sauti safi kabisa</caption>
|
||||
<caption xml:lang="ta">தெளிவான ஆடியோ</caption>
|
||||
<caption xml:lang="te">క్రిస్టల్ క్లియర్ ఆడియో</caption>
|
||||
<caption xml:lang="th">เสียงชัดใส</caption>
|
||||
<caption xml:lang="tl">Malinaw na audio</caption>
|
||||
<caption xml:lang="tr">Kristal netliğinde ses</caption>
|
||||
<caption xml:lang="uk">Кришталево чистий звук</caption>
|
||||
<caption xml:lang="vi">Âm thanh trong trẻo</caption>
|
||||
<caption xml:lang="zh-CN">清晰的音频</caption>
|
||||
<caption xml:lang="zh-HK">清晰的音訊</caption>
|
||||
<caption xml:lang="zh-TW">清晰的音訊</caption>
|
||||
<caption xml:lang="zu">Umsindo ocacile we-Crystal</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
|
||||
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_swarm.PNG</image>
|
||||
<caption>Group calls with an unlimited number of participants</caption>
|
||||
<caption xml:lang="ab">Ԥынгыла змам алахәылацәа зцу агәыԥтәи аԥхьарақәа</caption>
|
||||
<caption xml:lang="af">Groepoproepe met 'n onbeperkte aantal deelnemers</caption>
|
||||
@ -1595,7 +1460,7 @@
|
||||
<caption xml:lang="zu">Izingcingo zeqembu ezinenombolo engenamkhawulo yabahlanganyeli</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
|
||||
<image>https://dl.jami.net/media-resources/screenshots/flathub/jami_linux_chat_full.PNG</image>
|
||||
<caption>Encrypted and secure text messaging without servers</caption>
|
||||
<caption xml:lang="ab">Ишәарҭоу, насгьы ишәарҭам атексттә дырраҭарақәа асерверқәа рыда</caption>
|
||||
<caption xml:lang="af">Geënkripteerde en veilige teksboodskappe sonder bedieners</caption>
|
||||
@ -1669,81 +1534,6 @@
|
||||
<caption xml:lang="zh-TW">無需伺服器的加密安全短信</caption>
|
||||
<caption xml:lang="zu">Imiyalezo yombhalo ebethelwe futhi evikelekile ngaphandle kwamaseva</caption>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
|
||||
<caption>Transfer files of any size</caption>
|
||||
<caption xml:lang="ab">Иарбанзаалак ашәагаа змоу афаилқәа аиагара</caption>
|
||||
<caption xml:lang="af">Dra lêers van enige grootte oor</caption>
|
||||
<caption xml:lang="am">ማንኛውንም መጠን ያላቸውን ፋይሎች ያስተላልፉ</caption>
|
||||
<caption xml:lang="ar">نقل الملفات بأي حجم</caption>
|
||||
<caption xml:lang="az">İstənilən ölçüdə faylları köçürün</caption>
|
||||
<caption xml:lang="be">Перадача файлаў любога памеру</caption>
|
||||
<caption xml:lang="bg">Прехвърляне на файлове с всякакъв размер</caption>
|
||||
<caption xml:lang="bn">যেকোনো আকারের ফাইল স্থানান্তর করুন</caption>
|
||||
<caption xml:lang="ca">Transfereix fitxers de qualsevol mida</caption>
|
||||
<caption xml:lang="cs">Přenášejte soubory libovolné velikosti</caption>
|
||||
<caption xml:lang="da">Overfør filer af enhver størrelse</caption>
|
||||
<caption xml:lang="de">Übertragen Sie Dateien jeder Größe</caption>
|
||||
<caption xml:lang="el">Μεταφορά αρχείων οποιουδήποτε μεγέθους</caption>
|
||||
<caption xml:lang="eo">Transloki dosierojn de ajna grandeco</caption>
|
||||
<caption xml:lang="es">Transfiere archivos de cualquier tamaño</caption>
|
||||
<caption xml:lang="et">Edastage mis tahes suurusega faile</caption>
|
||||
<caption xml:lang="fa">انتقال فایل در هر اندازه</caption>
|
||||
<caption xml:lang="fi">Siirrä minkä tahansa kokoisia tiedostoja</caption>
|
||||
<caption xml:lang="fil">Maglipat ng mga file sa anumang laki</caption>
|
||||
<caption xml:lang="fr">Transférer des fichiers de toute taille</caption>
|
||||
<caption xml:lang="gl">Transferir ficheiros de calquera tamaño</caption>
|
||||
<caption xml:lang="he">העבר קבצים בכל גודל</caption>
|
||||
<caption xml:lang="hi">किसी भी आकार की फ़ाइलें स्थानांतरित करें</caption>
|
||||
<caption xml:lang="hr">Prijenos datoteka bilo koje veličine</caption>
|
||||
<caption xml:lang="hu">Bármilyen méretű fájl küldése</caption>
|
||||
<caption xml:lang="hy">Փոխանցել ցանկացած չափի ֆայլեր</caption>
|
||||
<caption xml:lang="id">Transfer file dengan ukuran apa pun</caption>
|
||||
<caption xml:lang="is">Flytja skrár af hvaða stærð sem er</caption>
|
||||
<caption xml:lang="it">Trasferisci file di qualsiasi dimensione</caption>
|
||||
<caption xml:lang="ja">あらゆるサイズのファイルを転送</caption>
|
||||
<caption xml:lang="ka">ნებისმიერი ზომის ფაილების გადატანა</caption>
|
||||
<caption xml:lang="km">ផ្ទេរឯកសារគ្រប់ទំហំ</caption>
|
||||
<caption xml:lang="kn">ಯಾವುದೇ ಗಾತ್ರದ ಫೈಲ್ಗಳನ್ನು ವರ್ಗಾಯಿಸಿ</caption>
|
||||
<caption xml:lang="ko">모든 크기의 파일 전송</caption>
|
||||
<caption xml:lang="ky">Каалаган өлчөмдөгү файлдарды өткөрүңүз</caption>
|
||||
<caption xml:lang="la">De translatione cuiuslibet magnitudinis files</caption>
|
||||
<caption xml:lang="lo">ໂອນໄຟລ໌ທຸກຂະຫນາດ</caption>
|
||||
<caption xml:lang="lt">Perkelkite bet kokio dydžio failus</caption>
|
||||
<caption xml:lang="lv">Pārsūtiet jebkura izmēra failus</caption>
|
||||
<caption xml:lang="mk">Пренесувајте датотеки од која било големина</caption>
|
||||
<caption xml:lang="ml">ഏത് വലുപ്പത്തിലുള്ള ഫയലുകളും കൈമാറുക</caption>
|
||||
<caption xml:lang="mn">Ямар ч хэмжээтэй файлуудыг шилжүүлэх</caption>
|
||||
<caption xml:lang="mr">कोणत्याही आकाराच्या फायली हस्तांतरित करा</caption>
|
||||
<caption xml:lang="ms">Pindahkan fail dari sebarang saiz</caption>
|
||||
<caption xml:lang="my">မည်သည့်အရွယ်အစား ဖိုင်များကို လွှဲပြောင်းပါ။</caption>
|
||||
<caption xml:lang="ne">कुनै पनि आकारका फाइलहरू स्थानान्तरण गर्नुहोस्</caption>
|
||||
<caption xml:lang="nl">Bestanden van elke grootte overbrengen</caption>
|
||||
<caption xml:lang="no">Overfør filer i alle størrelser</caption>
|
||||
<caption xml:lang="pl">Przesyłaj pliki o dowolnym rozmiarze</caption>
|
||||
<caption xml:lang="pt-BR">Transferir arquivos de qualquer tamanho</caption>
|
||||
<caption xml:lang="pt-PT">Transferir ficheiros de qualquer tamanho</caption>
|
||||
<caption xml:lang="ro">Transferați fișiere de orice dimensiune</caption>
|
||||
<caption xml:lang="ru">Передача файлов любого размера</caption>
|
||||
<caption xml:lang="si">ඕනෑම ප්රමාණයක ගොනු මාරු කරන්න</caption>
|
||||
<caption xml:lang="sk">Prenášajte súbory akejkoľvek veľkosti</caption>
|
||||
<caption xml:lang="sl">Prenesite datoteke poljubne velikosti</caption>
|
||||
<caption xml:lang="sq">Transferoni skedarë të çdo madhësie</caption>
|
||||
<caption xml:lang="sr">Пренесите датотеке било које величине</caption>
|
||||
<caption xml:lang="sv">Överför filer av valfri storlek</caption>
|
||||
<caption xml:lang="sw">Hamisha faili za ukubwa wowote</caption>
|
||||
<caption xml:lang="ta">எந்த அளவிலான கோப்புகளையும் மாற்றவும்</caption>
|
||||
<caption xml:lang="te">ఏ పరిమాణంలోనైనా ఫైళ్లను బదిలీ చేయండి</caption>
|
||||
<caption xml:lang="th">ถ่ายโอนไฟล์ได้ทุกขนาด</caption>
|
||||
<caption xml:lang="tl">Maglipat ng mga file sa anumang laki</caption>
|
||||
<caption xml:lang="tr">Herhangi bir boyuttaki dosyaları aktarın</caption>
|
||||
<caption xml:lang="uk">Передача файлів будь-якого розміру</caption>
|
||||
<caption xml:lang="vi">Chuyển các tập tin có bất kỳ kích thước nào</caption>
|
||||
<caption xml:lang="zh-CN">传输任意大小的文件</caption>
|
||||
<caption xml:lang="zh-HK">傳輸任意大小的文件</caption>
|
||||
<caption xml:lang="zh-TW">傳輸任意大小的文件</caption>
|
||||
<caption xml:lang="zu">Dlulisa amafayela anoma yimuphi usayizi</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<launchable type="desktop-id">net.jami.Jami.desktop</launchable>
|
||||
|
||||
@ -44,10 +44,10 @@ DEBIAN_DSC_FILENAME := jami_$(DEBIAN_VERSION).dsc
|
||||
|
||||
# Qt versions
|
||||
QT_MAJOR := 6
|
||||
QT_MINOR := 6
|
||||
QT_PATCH := 1
|
||||
QT_TARBALL_CHECKSUM := dd3668f65645fe270bc615d748bd4dc048bd17b9dc297025106e6ecc419ab95d
|
||||
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-1
|
||||
QT_MINOR := 8
|
||||
QT_PATCH := 3
|
||||
QT_TARBALL_CHECKSUM := cdd3a69967208276bb01af7ace7dba0ba53e679f886a4cbe624225c60fb73f2c
|
||||
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-0
|
||||
DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
|
||||
QT_JAMI_PREFIX := /usr/lib/libqt-jami
|
||||
|
||||
@ -160,11 +160,10 @@ endif
|
||||
# Traditionally built packages (in Docker containers).
|
||||
#
|
||||
DISTRIBUTIONS := \
|
||||
debian_11 \
|
||||
debian_12 \
|
||||
debian_13 \
|
||||
debian_testing \
|
||||
debian_unstable \
|
||||
ubuntu_20.04 \
|
||||
ubuntu_22.04 \
|
||||
ubuntu_24.04 \
|
||||
ubuntu_25.04 \
|
||||
|
||||
@ -89,5 +89,6 @@ RUN dnf install -y \
|
||||
xkeyboard-config \
|
||||
yaml-cpp-devel \
|
||||
yasm
|
||||
ADD extras/packaging/gnu-linux/scripts/install-ffmpeg-for-qt.sh /opt/install-ffmpeg-for-qt.sh
|
||||
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh
|
||||
CMD ["/opt/build-package-rpm.sh"]
|
||||
@ -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"]
|
||||
@ -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"]
|
||||
|
||||
@ -1,19 +1,15 @@
|
||||
FROM debian:bullseye
|
||||
FROM debian:trixie
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get clean
|
||||
RUN apt-get update && \
|
||||
RUN apt-get update --allow-releaseinfo-change && \
|
||||
apt-get install -y -o Acquire::Retries=10 \
|
||||
devscripts \
|
||||
equivs \
|
||||
python-is-python3 \
|
||||
wget \
|
||||
curl
|
||||
|
||||
# nodejs
|
||||
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
|
||||
RUN apt install nodejs -y
|
||||
nasm
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
|
||||
|
||||
@ -23,15 +19,8 @@ RUN /opt/prebuild-package-debian.sh qt-deps
|
||||
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
|
||||
RUN /opt/prebuild-package-debian.sh jami-deps
|
||||
|
||||
# Install CMake 3.21 for Qt 6
|
||||
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
|
||||
RUN /opt/install-cmake.sh
|
||||
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
|
||||
|
||||
# Setting this variable so that FFmpeg gets built without pipewiregrab
|
||||
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
|
||||
# We rely on PipeWire for screen sharing on Wayland, but the version available on Debian 11 is too old.
|
||||
ENV DISABLE_PIPEWIRE=true
|
||||
|
||||
CMD ["/opt/build-package-debian.sh"]
|
||||
@ -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"]
|
||||
|
||||
@ -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"]
|
||||
|
||||
@ -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=noble
|
||||
|
||||
FROM ubuntu:$UBUNTU AS builder
|
||||
ARG UBUNTU
|
||||
@ -16,16 +16,6 @@ RUN apt-get install --yes \
|
||||
jq \
|
||||
squashfs-tools
|
||||
|
||||
# Download and unpack the core22 snap
|
||||
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core22' | jq '.download_url' -r) --output core22.snap
|
||||
RUN mkdir -p /snap/core22
|
||||
RUN unsquashfs -d /snap/core22/current core22.snap
|
||||
|
||||
# Download and unpack the core20 snap
|
||||
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core20' | jq '.download_url' -r) --output core20.snap
|
||||
RUN mkdir -p /snap/core20
|
||||
RUN unsquashfs -d /snap/core20/current core20.snap
|
||||
|
||||
# Download and unpack the core24 snap
|
||||
RUN curl -L $(curl -H 'X-Ubuntu-Series: 16' 'https://api.snapcraft.io/api/v1/snaps/details/core24' | jq '.download_url' -r) --output core24.snap
|
||||
RUN mkdir -p /snap/core24
|
||||
@ -48,8 +38,6 @@ RUN chmod +x /snap/bin/snapcraft
|
||||
# time so they can be cached.
|
||||
FROM ubuntu:$UBUNTU
|
||||
|
||||
COPY --from=builder /snap/core20 /snap/core20
|
||||
COPY --from=builder /snap/core22 /snap/core22
|
||||
COPY --from=builder /snap/core24 /snap/core24
|
||||
COPY --from=builder /snap/snapcraft /snap/snapcraft
|
||||
COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
|
||||
@ -57,10 +45,6 @@ COPY --from=builder /snap/bin/snapcraft /snap/bin/snapcraft
|
||||
# Generate locale and install dependencies.
|
||||
RUN apt-get update && apt-get dist-upgrade --yes && apt-get install --yes snapd sudo apt-transport-https locales wget && locale-gen en_US.UTF-8
|
||||
|
||||
# Install CMake 3.21 for Qt 6
|
||||
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
|
||||
RUN /opt/install-cmake.sh
|
||||
|
||||
# Set the proper environment.
|
||||
ENV LANG="en_US.UTF-8"
|
||||
ENV LANGUAGE="en_US:en"
|
||||
@ -69,6 +53,7 @@ ENV PATH="/snap/bin:/snap/snapcraft/current/usr/bin:/snap/snapcraft/current/libe
|
||||
ENV SNAP="/snap/snapcraft/current"
|
||||
ENV SNAP_NAME="snapcraft"
|
||||
ENV SNAP_ARCH="amd64"
|
||||
ENV SNAPCRAFT_BUILD_ENVIRONMENT=host
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/build-package-snap.sh /opt/build-package-snap.sh
|
||||
CMD ["/opt/build-package-snap.sh"]
|
||||
|
||||
@ -1,42 +0,0 @@
|
||||
FROM ubuntu:20.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get clean
|
||||
RUN apt-get update && \
|
||||
apt-get install -y -o Acquire::Retries=10 \
|
||||
devscripts \
|
||||
equivs \
|
||||
python-is-python3 \
|
||||
wget \
|
||||
curl
|
||||
|
||||
# Installing GCC 10 because GCC 9 (the default on Ubuntu 20.04) doesn't support
|
||||
# the --std=gnu++20 option, which is used by one of Qt 6.6.1's dependencies
|
||||
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
|
||||
RUN /opt/install-gcc-debian.sh 10
|
||||
|
||||
# nodejs
|
||||
RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
|
||||
RUN apt install nodejs -y
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
|
||||
|
||||
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
|
||||
RUN /opt/prebuild-package-debian.sh qt-deps
|
||||
|
||||
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
|
||||
RUN /opt/prebuild-package-debian.sh jami-deps
|
||||
|
||||
# Install CMake 3.21 for Qt 6
|
||||
ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
|
||||
RUN /opt/install-cmake.sh
|
||||
|
||||
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
|
||||
|
||||
# Setting this variable so that FFmpeg gets built without pipewiregrab
|
||||
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
|
||||
# We rely on PipeWire for screen sharing on Wayland, but the version available on Ubuntu 20.04 is too old.
|
||||
ENV DISABLE_PIPEWIRE=true
|
||||
|
||||
CMD ["/opt/build-package-debian.sh"]
|
||||
@ -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"]
|
||||
|
||||
@ -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"]
|
||||
|
||||
@ -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
|
||||
|
||||
@ -45,8 +45,7 @@ Build-Depends: debhelper (>= 9),
|
||||
libvdpau-dev,
|
||||
libssl-dev,
|
||||
libargon2-dev | libargon2-0-dev,
|
||||
# TODO: remove libpipewire-0.2-dev once we stop supporting Ubuntu 20.04
|
||||
libpipewire-0.3-dev | libpipewire-0.2-dev,
|
||||
libpipewire-0.3-dev,
|
||||
# other
|
||||
nasm,
|
||||
yasm,
|
||||
|
||||
@ -91,12 +91,10 @@ if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
|
||||
# Set-up Jami repository end tag
|
||||
if [ "${VERSION_CODENAME}" = "bullseye" ] || [ "${ID}_${VERSION_ID}" = "debian_11" ]; then
|
||||
ENDTAG="debian_11"
|
||||
elif [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
|
||||
if [ "${VERSION_CODENAME}" = "bookworm" ] || [ "${ID}_${VERSION_ID}" = "debian_12" ]; then
|
||||
ENDTAG="debian_12"
|
||||
elif [ "${UBUNTU_CODENAME}" = "focal" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_20.04" ]; then
|
||||
ENDTAG="ubuntu_20.04"
|
||||
elif [ "${VERSION_CODENAME}" = "trixie" ] || [ "${ID}_${VERSION_ID}" = "debian_13" ]; then
|
||||
ENDTAG="debian_13"
|
||||
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
|
||||
ENDTAG="ubuntu_22.04"
|
||||
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then
|
||||
|
||||
@ -45,7 +45,7 @@ QT_JAMI_PREFIX := ${QT_JAMI_PREFIX}
|
||||
export PATH := $(QT_JAMI_PREFIX)/bin:${PATH}
|
||||
export LD_LIBRARY_PATH := $(QT_JAMI_PREFIX)/lib:${LD_LIBRARY_PATH}
|
||||
export PKG_CONFIG_PATH := $(QT_JAMI_PREFIX)/lib/pkgconfig:${PKG_CONFIG_PATH}
|
||||
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX)/lib/cmake:${CMAKE_PREFIX_PATH}
|
||||
export CMAKE_PREFIX_PATH := $(QT_JAMI_PREFIX):${CMAKE_PREFIX_PATH}
|
||||
export CFLAGS := $(CFLAGS) -fno-lto
|
||||
export CXXFLAGS := $(CXXFLAGS) -fno-lto
|
||||
|
||||
@ -95,8 +95,9 @@ override_dh_auto_build:
|
||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||
-DLIBJAMI_BUILD_DIR=$(CURDIR)/daemon/src \
|
||||
-DENABLE_LIBWRAP=true \
|
||||
-DBUILD_TESTING=Off \
|
||||
$(CMAKE_OPTIONS) ..
|
||||
make -C build -j$(NO_CPUS) V=1
|
||||
make -C build -j$(NO_CPUS) VERBOSE=1
|
||||
|
||||
override_dh_auto_clean:
|
||||
# Daemon clean
|
||||
|
||||
@ -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,9 +29,9 @@ License: GPLv3+
|
||||
Vendor: Savoir-faire Linux Inc.
|
||||
URL: https://jami.net/
|
||||
Source: jami-libqt-%{version}.tar.xz
|
||||
Patch0: 0001-fix-gcc14.patch
|
||||
Patch1: 0002-qtwebengine-add-missing-chromium-dependencies.patch
|
||||
Patch2: 0003-fix-embree-linking-errors.patch
|
||||
Patch0: 0001-qtwebengine-fix-build-error-due-to-missing-chromium-dependency.patch
|
||||
Patch1: 0002-qtwebengine-fix-ASSERT_TRIVIALLY_COPYABLE-failure.patch
|
||||
Patch2: 0003-qtwebengine-fix-zygote_communication_linux-dependency.patch
|
||||
|
||||
%global gst 0.10
|
||||
%if 0%{?fedora} || 0%{?rhel} > 7
|
||||
@ -73,31 +73,6 @@ This package contains Qt libraries for Jami.
|
||||
|
||||
%build
|
||||
echo "Building Qt using %{job_count} parallel jobs"
|
||||
# Qt 6.4 (https://wiki.linuxfromscratch.org/blfs/ticket/14729)
|
||||
sed -i 's,default=False,default=True,g' qtwebengine/src/3rdparty/chromium/third_party/catapult/tracing/tracing_build/generate_about_tracing_contents.py
|
||||
# Gcc 13
|
||||
sed -i 's,std::uint32_t,uint32_t,g' qt3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
sed -i 's,std::uint32_t,uint32_t,g' qtquick3d/src/3rdparty/assimp/src/code/AssetLib/FBX/FBXBinaryTokenizer.cpp
|
||||
# https://bugs.gentoo.org/768261 (Qt 5.15)
|
||||
sed -i 's,#include "absl/base/internal/spinlock.h"1,#include "absl/base/internal/spinlock.h"1\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc
|
||||
sed -i 's,#include <stdint.h>,#include <stdint.h>\n#include <limits>,g' qtwebengine/src/3rdparty/chromium/third_party/perfetto/src/trace_processor/containers/string_pool.h
|
||||
# else, break build for fedora 35
|
||||
sed -i 's/static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);/static const size_t kSigStackSize = std::max(size_t(16384), size_t(SIGSTKSZ));/g' qtwebengine/src/3rdparty/chromium/third_party/breakpad/breakpad/src/client/linux/handler/exception_handler.cc
|
||||
# https://bugreports.qt.io/browse/QTBUG-93452 (Qt 5.15)
|
||||
sed -i 's,# include <utility>,# include <utility>\n# include <limits>,g' qtbase/src/corelib/global/qglobal.h
|
||||
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qendian.h
|
||||
cat qtbase/src/corelib/global/qendian.h
|
||||
sed -i 's,#include <string.h>,#include <string.h>\n#include <limits>,g' qtbase/src/corelib/global/qfloat16.h
|
||||
sed -i 's,#include <QtCore/qbytearray.h>,#include <QtCore/qbytearray.h>\n#include <limits>,g' qtbase/src/corelib/text/qbytearraymatcher.h
|
||||
cat qtwebengine/configure.cmake
|
||||
|
||||
#https://bugreports.qt.io/browse/QTBUG-117979
|
||||
if test -f "/usr/bin/python3.10"; then
|
||||
/usr/bin/python3.10 -m venv env
|
||||
source env/bin/activate
|
||||
python -m pip install html5lib
|
||||
python -m pip install six
|
||||
fi
|
||||
|
||||
# recent gcc version do not like lto from qt
|
||||
CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) ${LDFLAGS}" ./configure \
|
||||
@ -105,8 +80,8 @@ CXXFLAGS="${CXXFLAGS} -fno-lto" CFLAGS="${CFLAGS} -fno-lto" LDFLAGS="$(CFLAGS) $
|
||||
-confirm-license \
|
||||
-nomake examples \
|
||||
-nomake tests \
|
||||
-prefix "%{_libdir}/qt-jami"
|
||||
sed -i 's,bin/python,bin/env python3,g' qtbase/mkspecs/features/uikit/devices.py
|
||||
-prefix "%{_libdir}/qt-jami" \
|
||||
-- -DFFMPEG_DIR=/opt/libqt-jami-ffmpeg -DQT_DEPLOY_FFMPEG=ON
|
||||
# Chromium is built using Ninja, which doesn't honor MAKEFLAGS.
|
||||
cmake --build . --parallel
|
||||
|
||||
|
||||
@ -74,8 +74,10 @@ cd %{_builddir}/jami-%{version} && \
|
||||
-DWITH_DAEMON_SUBMODULE=true \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DBUILD_VERSION=${BUILD_VERSION} \
|
||||
-DCMAKE_PREFIX_PATH=%{QT_JAMI_PREFIX} \
|
||||
-DBUILD_TESTING=Off \
|
||||
..
|
||||
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} V=2
|
||||
make -C %{_builddir}/jami-%{version}/build %{_smp_mflags} VERBOSE=1
|
||||
|
||||
%install
|
||||
DESTDIR=%{buildroot} make -C %{_builddir}/jami-%{version}/build install V=2
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1,29 +0,0 @@
|
||||
From 709d0b0cf45b920f63960a70725138dbaf7ec721 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Fran=C3=A7ois-Simon=20Fauteux-Chapleau?=
|
||||
<francois-simon.fauteux-chapleau@savoirfairelinux.com>
|
||||
Date: Wed, 18 Jun 2025 15:53:55 -0400
|
||||
Subject: [PATCH] Fix embree linking errors
|
||||
|
||||
Patch taken from:
|
||||
https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=37bd373cd33c36f8dd44e71be25fa6ea24cf4588
|
||||
---
|
||||
qtquick3d/src/3rdparty/embree/CMakeLists.txt | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/qtquick3d/src/3rdparty/embree/CMakeLists.txt b/qtquick3d/src/3rdparty/embree/CMakeLists.txt
|
||||
index cf27196de2..332bbd17ca 100644
|
||||
--- a/qtquick3d/src/3rdparty/embree/CMakeLists.txt
|
||||
+++ b/qtquick3d/src/3rdparty/embree/CMakeLists.txt
|
||||
@@ -62,6 +62,9 @@ if (IOS)
|
||||
endif()
|
||||
|
||||
# Use SSE2 only, ignore AVX/SSE4.2 for now
|
||||
+if (TEST_architecture_arch STREQUAL x86_64)
|
||||
+ qt_internal_extend_target(BundledEmbree COMPILE_OPTIONS -mno-avx -mno-sse4.2)
|
||||
+endif()
|
||||
qt_internal_extend_target(BundledEmbree DEFINES
|
||||
EMBREE_TARGET_SSE2
|
||||
__SSE2__
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@ -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,13 +98,13 @@ description: |
|
||||
|
||||
confinement: strict
|
||||
grade: stable
|
||||
base: core20
|
||||
base: core24
|
||||
|
||||
plugs:
|
||||
gnome-3-38-2004:
|
||||
gnome-46-2404:
|
||||
interface: content
|
||||
target: $SNAP/gnome-platform
|
||||
default-provider: gnome-3-38-2004:gnome-3-38-2004
|
||||
default-provider: gnome-46-2404
|
||||
gtk-3-themes:
|
||||
interface: content
|
||||
target: $SNAP/data-dir/themes
|
||||
@ -117,6 +117,10 @@ plugs:
|
||||
interface: content
|
||||
target: $SNAP/data-dir/sounds
|
||||
default-provider: gtk-common-themes:sounds-themes
|
||||
gpu-2404:
|
||||
interface: content
|
||||
target: $SNAP/gpu-2404
|
||||
default-provider: mesa-2404
|
||||
|
||||
slots:
|
||||
dbus-jami:
|
||||
@ -129,22 +133,24 @@ slots:
|
||||
name: cx.ring.Ring
|
||||
|
||||
layout:
|
||||
/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib:
|
||||
bind: $SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/alsa-lib
|
||||
/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib:
|
||||
bind: $SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/alsa-lib
|
||||
/usr/share/alsa:
|
||||
bind: $SNAP/usr/share/alsa
|
||||
/usr/share/X11/xkb:
|
||||
bind: $SNAP/usr/share/X11/xkb
|
||||
/usr/share/X11/XErrorDB:
|
||||
symlink: $SNAP/gpu-2404/X11/XErrorDB
|
||||
|
||||
environment:
|
||||
XDG_CURRENT_DESKTOP: Unity
|
||||
QT_BASE_DIR: "/usr/lib/libqt-jami"
|
||||
LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP$QT_BASE_DIR/lib"
|
||||
LD_LIBRARY_PATH: "${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$SNAP$QT_BASE_DIR/lib:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pulseaudio:$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libproxy"
|
||||
|
||||
apps:
|
||||
jami:
|
||||
command: usr/bin/jami
|
||||
command-chain:
|
||||
- bin/gpu-2404-wrapper
|
||||
- bin/desktop-launch
|
||||
- snap/command-chain/alsa-launch
|
||||
- bin/jami-wrapper
|
||||
@ -153,8 +159,8 @@ apps:
|
||||
desktop: usr/share/applications/net.jami.Jami.desktop
|
||||
environment:
|
||||
PIPEWIRE_CONFIG_NAME: "$SNAP/usr/share/pipewire/pipewire.conf"
|
||||
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/pipewire-0.3"
|
||||
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/spa-0.2"
|
||||
PIPEWIRE_MODULE_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/pipewire-0.3"
|
||||
SPA_PLUGIN_DIR: "$SNAP/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/spa-0.2"
|
||||
slots:
|
||||
- dbus-jami
|
||||
- dbus-ring
|
||||
@ -185,7 +191,7 @@ package-repositories:
|
||||
components: [main]
|
||||
suites: [jami]
|
||||
key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
|
||||
url: https://dl.jami.net/internal/ubuntu_20.04/
|
||||
url: https://dl.jami.net/internal/ubuntu_24.04/
|
||||
|
||||
parts:
|
||||
desktop-launch:
|
||||
@ -201,14 +207,14 @@ parts:
|
||||
- devscripts
|
||||
- equivs
|
||||
override-pull: |
|
||||
snapcraftctl pull
|
||||
craftctl default
|
||||
sed -i -E 's|\. \$SNAP/flavor-select|USE_gtk3=true|' gtk/launcher-specific
|
||||
sed -i -E 's|\. \$SNAP/flavor-select|USE_qt5=true|' qt/launcher-specific
|
||||
sed -i -E 's|(append_dir GTK_PATH \$RUNTIME/usr/lib/\$ARCH/gtk-2.0)|#\1|' qt/launcher-specific
|
||||
sed -i -E 's|\$RUNTIME|$SNAP|g' qt/launcher-specific
|
||||
sed -i -E 's|\$WITH_RUNTIME|no|g' qt/launcher-specific
|
||||
override-build: |
|
||||
snapcraftctl build
|
||||
craftctl default
|
||||
gcc -Wall -O2 -o bindtextdomain.so -fPIC -shared src/bindtextdomain.c -ldl
|
||||
|
||||
echo "#!/bin/bash" > desktop-launch
|
||||
@ -224,10 +230,10 @@ parts:
|
||||
|
||||
cat common/mark-and-exec >> desktop-launch
|
||||
|
||||
install -D -m755 desktop-launch $SNAPCRAFT_PART_INSTALL/bin/desktop-launch
|
||||
install -D -m644 bindtextdomain.so $SNAPCRAFT_PART_INSTALL/lib/bindtextdomain.so
|
||||
install -D -m755 desktop-launch $CRAFT_PART_INSTALL/bin/desktop-launch
|
||||
install -D -m644 bindtextdomain.so $CRAFT_PART_INSTALL/lib/bindtextdomain.so
|
||||
|
||||
mkdir -pv $SNAPCRAFT_PART_INSTALL/gnome-platform
|
||||
mkdir -pv $CRAFT_PART_INSTALL/gnome-platform
|
||||
|
||||
scripts:
|
||||
plugin: dump
|
||||
@ -244,10 +250,15 @@ parts:
|
||||
- -usr/lib/x86_64-linux-gnu/libproxy.so*
|
||||
- -usr/share/doc/libp11-kit0/changelog.Debian.gz
|
||||
- -usr/share/doc/libproxy1v5/changelog.Debian.gz
|
||||
- -usr/lib/x86_64-linux-gnu/gio/modules/libdconfsettings.so
|
||||
- -usr/lib/x86_64-linux-gnu/libdconf.so.1.0.0
|
||||
- -usr/libexec/dconf-service
|
||||
- -usr/share/doc/libdconf1/changelog.Debian.gz
|
||||
- -usr/share/man/man1/dconf-service.1.gz
|
||||
build-packages:
|
||||
- libasound2-dev
|
||||
stage-packages:
|
||||
- libasound2
|
||||
- libasound2t64
|
||||
- libasound2-plugins
|
||||
- yad
|
||||
|
||||
@ -264,53 +275,53 @@ parts:
|
||||
build-environment:
|
||||
- QT_BASE_DIR: "/usr/lib/libqt-jami"
|
||||
- PATH: "$QT_BASE_DIR/bin:$PATH"
|
||||
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib:$LD_LIBRARY_PATH"
|
||||
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||
- LD_LIBRARY_PATH: "$QT_BASE_DIR/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||
- PKG_CONFIG_PATH: "$QT_BASE_DIR/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}"
|
||||
override-pull: |
|
||||
ls
|
||||
snapcraftctl pull
|
||||
craftctl default
|
||||
sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
|
||||
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/net.jami.Jami.svg|' extras/data/net.jami.Jami.desktop
|
||||
override-build: |
|
||||
$SNAPCRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
|
||||
|
||||
cd $SNAPCRAFT_PART_BUILD/daemon/contrib
|
||||
cd $CRAFT_PART_BUILD/daemon/contrib
|
||||
mkdir -p native
|
||||
cd native
|
||||
../bootstrap
|
||||
make .ffmpeg
|
||||
make
|
||||
|
||||
cd $SNAPCRAFT_PART_BUILD/daemon
|
||||
cd $CRAFT_PART_BUILD/daemon
|
||||
./autogen.sh
|
||||
./configure --prefix=/usr --without-dbus
|
||||
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
|
||||
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
|
||||
make -j$CRAFT_PARALLEL_BUILD_COUNT
|
||||
DESTDIR=$CRAFT_PART_INSTALL make install
|
||||
|
||||
cd $SNAPCRAFT_PART_BUILD/
|
||||
mkdir build
|
||||
cd $CRAFT_PART_BUILD/
|
||||
mkdir -p build
|
||||
cd build
|
||||
cmake .. -DENABLE_LIBWRAP=true \
|
||||
-DLIBJAMI_BUILD_DIR=$SNAPCRAFT_PART_BUILD/daemon/src \
|
||||
-DLIBJAMI_BUILD_DIR=$CRAFT_PART_BUILD/daemon/src \
|
||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER
|
||||
make -j$SNAPCRAFT_PARALLEL_BUILD_COUNT
|
||||
DESTDIR=$SNAPCRAFT_PART_INSTALL make install
|
||||
-DCMAKE_PREFIX_PATH=$QT_BASE_DIR \
|
||||
-DBUILD_VERSION=BUILD_VERSION_PLACEHOLDER \
|
||||
-DBUILD_TESTING=Off
|
||||
make -j$CRAFT_PARALLEL_BUILD_COUNT
|
||||
DESTDIR=$CRAFT_PART_INSTALL make install
|
||||
build-packages:
|
||||
- autoconf
|
||||
- autoconf-archive
|
||||
- automake
|
||||
- autopoint
|
||||
- bzip2
|
||||
- cmake
|
||||
- curl
|
||||
- gcc
|
||||
- g++
|
||||
- gettext
|
||||
- gzip
|
||||
- libnotify-dev
|
||||
- libpipewire-0.3-dev
|
||||
- libqrencode-dev
|
||||
- libsndfile1-dev
|
||||
- libspeex-dev
|
||||
- python3
|
||||
- python3-dev
|
||||
@ -318,13 +329,9 @@ parts:
|
||||
- yasm
|
||||
- wget
|
||||
- nasm # ffmpeg
|
||||
- libavcodec-dev
|
||||
- libavdevice-dev
|
||||
- libavformat-dev
|
||||
- libswscale-dev
|
||||
- libva-dev
|
||||
- libvdpau-dev
|
||||
- libargon2-0-dev # opendht
|
||||
- libargon2-dev # opendht
|
||||
- libexpat1-dev
|
||||
- libjsoncpp-dev
|
||||
- libnm-dev # connectivityChanged()
|
||||
@ -337,54 +344,45 @@ parts:
|
||||
- libgl-dev
|
||||
- libvulkan-dev
|
||||
- libgnutls28-dev # TLS
|
||||
- gnutls-bin
|
||||
- libssl-dev
|
||||
- git # PipeWire build dependencies
|
||||
- libasound2-dev #
|
||||
- libdbus-1-dev # These packages are needed by the
|
||||
- libglib2.0-dev # install-pipewire-from-source.sh
|
||||
- ninja-build # script in order to build PipeWire
|
||||
- pkg-config # from source.
|
||||
stage-packages:
|
||||
- libgnutls30
|
||||
- libavutil56
|
||||
- libdouble-conversion3
|
||||
- libegl1
|
||||
- libgbm1
|
||||
- libgudev-1.0-0
|
||||
- libjsoncpp1
|
||||
- libllvm12
|
||||
- libminizip1
|
||||
- libjsoncpp25
|
||||
- libminizip1t64
|
||||
- libnm0
|
||||
- libnotify4
|
||||
- libnspr4
|
||||
- libnss3
|
||||
- libopengl0
|
||||
- libopus0
|
||||
- liborc-0.4-0
|
||||
- libpcre2-16-0
|
||||
- libpcre2-8-0
|
||||
- pipewire-bin
|
||||
- libqrencode4
|
||||
- libqt-jami
|
||||
- libsnappy1v5
|
||||
- libspeex1
|
||||
- libproxy1v5
|
||||
- libwayland-server0
|
||||
- libwebpdemux2
|
||||
- libwebpmux3
|
||||
- libxkbfile1
|
||||
- libxtst6
|
||||
- ocl-icd-libopencl1
|
||||
- libva-drm2
|
||||
- libva-glx2
|
||||
- libva-wayland2
|
||||
- libva2
|
||||
- libvdpau-va-gl1
|
||||
- libvdpau1
|
||||
- va-driver-all
|
||||
prime:
|
||||
- -usr/lib/libqt-jami/bin/
|
||||
- -usr/lib/libqt-jami/docs/
|
||||
- -usr/lib/libqt-jami/examples/
|
||||
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libLLVM-*.so*
|
||||
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libclang-*.so*
|
||||
- -usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libflite*.so*
|
||||
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libLLVM-*.so*
|
||||
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libclang-*.so*
|
||||
- -usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/libflite*.so*
|
||||
|
||||
gpu-2404:
|
||||
after: [jami]
|
||||
source: https://github.com/canonical/gpu-snap.git
|
||||
plugin: dump
|
||||
override-prime: |
|
||||
craftctl default
|
||||
${CRAFT_PART_SRC}/bin/gpu-2404-cleanup mesa-2404
|
||||
# Workaround for https://bugs.launchpad.net/snapd/+bug/2055273
|
||||
mkdir -p "${CRAFT_PRIME}/gpu-2404"
|
||||
prime:
|
||||
- bin/gpu-2404-wrapper
|
||||
@ -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" \
|
||||
@ -132,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}" --define "BUILD_VERSION ${BUILD_VERSION}" -ba jami.spec
|
||||
rpmbuild --define "debug_package %{nil}" \
|
||||
--define "BUILD_VERSION ${BUILD_VERSION}" \
|
||||
--define "QT_JAMI_PREFIX ${QT_JAMI_PREFIX}" \
|
||||
-ba jami.spec
|
||||
|
||||
# Move the built packages to the output directory.
|
||||
mv /root/rpmbuild/RPMS/*/* /opt/output
|
||||
|
||||
@ -32,7 +32,7 @@ sed -i "s/RELEASE_VERSION/${RELEASE_VERSION}/g" snapcraft.yaml
|
||||
# set the build version of the app
|
||||
sed -i "s/BUILD_VERSION_PLACEHOLDER/${BUILD_VERSION}/g" snapcraft.yaml
|
||||
|
||||
snapcraft # requires snapcraft >= 4.8
|
||||
snapcraft pack
|
||||
|
||||
# move the built snap to output
|
||||
mv *.snap /opt/output/
|
||||
|
||||
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,35 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# The purpose of this script is to build PipeWire from source in a snap based on core20 / Ubuntu 20.04
|
||||
# It must be called in the "override-build" section of the relevant part in snapcraft.yaml
|
||||
|
||||
set -e
|
||||
|
||||
OLD_WD=$(pwd)
|
||||
cd /tmp
|
||||
|
||||
# Get a version of Meson that's recent enough to build PipeWire 1.0.5 (the one available via apt is too old)
|
||||
wget -q https://github.com/mesonbuild/meson/releases/download/0.61.1/meson-0.61.1.tar.gz
|
||||
echo "feb2cefb325b437dbf36146df7c6b87688ddff0b0205caa31dc64055c6da410c meson-0.61.1.tar.gz" | sha256sum --check
|
||||
tar xzf meson-0.61.1.tar.gz
|
||||
|
||||
# Build PipeWire 1.0.5 and install it in the /usr directory of the build environment
|
||||
wget -q https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/1.0.5/pipewire-1.0.5.tar.gz
|
||||
echo "c5a5de26d684a1a84060ad7b6131654fb2835e03fccad85059be92f8e3ffe993 pipewire-1.0.5.tar.gz" | sha256sum --check
|
||||
tar xzf pipewire-1.0.5.tar.gz
|
||||
cd pipewire-1.0.5
|
||||
../meson-0.61.1/meson.py setup builddir -Dsession-managers=media-session -Dalsa=disabled -Dprefix=/usr
|
||||
../meson-0.61.1/meson.py compile -C builddir
|
||||
../meson-0.61.1/meson.py install -C builddir
|
||||
|
||||
# The files installed by the previous command are only for the "Build" step of the snap
|
||||
# creation process (https://snapcraft.io/docs/how-snapcraft-builds). In order to ensure
|
||||
# that PipeWire is installed in the final snap archive, we also need to copy all the
|
||||
# required files under the $SNAPCRAFT_PART_INSTALL directory.
|
||||
../meson-0.61.1/meson.py configure builddir -Dprefix=$SNAPCRAFT_PART_INSTALL/usr/
|
||||
../meson-0.61.1/meson.py install -C builddir
|
||||
|
||||
# Cleanup
|
||||
cd /tmp
|
||||
rm -rf meson-0.61.1 meson-0.61.1.tar.gz pipewire-1.0.5 pipewire-1.0.5.tar.gz
|
||||
cd $OLD_WD
|
||||
@ -34,7 +34,7 @@ cat << EOFILE > ${REPO_FOLDER}/${SPARKLE_FILE}
|
||||
<pubDate>$DATE_RFC2822</pubDate>
|
||||
<sparkle:version>${BUILD}</sparkle:version>
|
||||
<sparkle:shortVersionString>${VERSION}</sparkle:shortVersionString>
|
||||
<sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
|
||||
<sparkle:minimumSystemVersion>12.0</sparkle:minimumSystemVersion>
|
||||
<enclosure url="${REPO_URL}/$(basename ${PACKAGE})" type="application/octet-stream" $(./sign_update ${PACKAGE}) />
|
||||
</item>
|
||||
$(echo -e "${ITEMS}")
|
||||
|
||||
@ -32,6 +32,7 @@ export OSTYPE
|
||||
# -A: enable AddressSanitizer
|
||||
# -D: extra CMake flags for the client
|
||||
# -C: enable crash reporting
|
||||
# -i: ignore system libraries and build everything regardless of system detection
|
||||
|
||||
set -ex
|
||||
|
||||
@ -51,8 +52,9 @@ extra_cmake_flags=''
|
||||
arch=''
|
||||
enable_testing=false
|
||||
enable_crashreports=false
|
||||
ignore_system_libs=false
|
||||
|
||||
while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
|
||||
while getopts gsc:dQ:P:p:uWwa:AtD:Ci OPT; do
|
||||
case "$OPT" in
|
||||
g)
|
||||
global='true'
|
||||
@ -96,6 +98,9 @@ while getopts gsc:dQ:P:p:uWwa:AtD:C OPT; do
|
||||
C)
|
||||
enable_crashreports='true'
|
||||
;;
|
||||
i)
|
||||
ignore_system_libs='true'
|
||||
;;
|
||||
\?)
|
||||
exit 1
|
||||
;;
|
||||
@ -124,79 +129,86 @@ else
|
||||
BUILD_DIR="build"
|
||||
fi
|
||||
|
||||
# jamid
|
||||
DAEMON="${TOP}/daemon"
|
||||
BUILD_TYPE="Release"
|
||||
if [ "${debug}" = "true" ]; then
|
||||
BUILD_TYPE="Debug"
|
||||
fi
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
sh "${TOP}"/extras/scripts/build_daemon_macos.sh -a "$arch" -d "$debug"
|
||||
else
|
||||
cd "$DAEMON"
|
||||
|
||||
# Build the contribs.
|
||||
mkdir -p contrib/native
|
||||
(
|
||||
cd contrib/native
|
||||
../bootstrap ${prefix:+"--prefix=$prefix"} ${asan:+"--enable-asan"}
|
||||
make -j"${proc}"
|
||||
)
|
||||
|
||||
if [[ "${enable_libwrap}" != "true" ]]; then
|
||||
# Disable shared if requested
|
||||
if [[ "$OSTYPE" != "darwin"* ]]; then
|
||||
CONFIGURE_FLAGS+=" --disable-shared"
|
||||
fi
|
||||
else
|
||||
CONFIGURE_FLAGS+="--without-dbus"
|
||||
fi
|
||||
|
||||
BUILD_TYPE="Release"
|
||||
if [ "${debug}" = "true" ]; then
|
||||
BUILD_TYPE="Debug"
|
||||
CONFIGURE_FLAGS+=" --enable-debug"
|
||||
fi
|
||||
|
||||
if [ "${asan}" = "true" ]; then
|
||||
CONFIGURE_FLAGS+=" --enable-asan"
|
||||
fi
|
||||
|
||||
# Build the daemon itself.
|
||||
test -f configure || ./autogen.sh
|
||||
|
||||
if [ "${global}" = "true" ]; then
|
||||
./configure ${CONFIGURE_FLAGS} ${prefix:+"--prefix=$prefix"}
|
||||
else
|
||||
./configure ${CONFIGURE_FLAGS} --prefix="${INSTALL_DIR}"
|
||||
fi
|
||||
make -j"${proc}" V=1
|
||||
make_install "${global}" "${priv_install}"
|
||||
|
||||
# Verify system's version if no path provided.
|
||||
if [ -z "$qtpath" ]; then
|
||||
sys_qtver=""
|
||||
if command -v qmake6 &> /dev/null; then
|
||||
sys_qtver=$(qmake6 -v)
|
||||
elif command -v qmake-qt6 &> /dev/null; then
|
||||
sys_qtver=$(qmake-qt6 -v) # Fedora
|
||||
elif command -v qmake &> /dev/null; then
|
||||
sys_qtver=$(qmake -v)
|
||||
else
|
||||
echo "No valid Qt found"; exit 1;
|
||||
fi
|
||||
|
||||
sys_qtver=${sys_qtver#*Qt version}
|
||||
sys_qtver=${sys_qtver%\ in\ *}
|
||||
|
||||
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
|
||||
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
|
||||
|
||||
if [[ $installed_qtver -ge $required_qtver ]] ; then
|
||||
# Set qtpath to empty in order to use system's Qt.
|
||||
qtpath=""
|
||||
else
|
||||
echo "No valid Qt found"; exit 1;
|
||||
fi
|
||||
#detect arch for macos
|
||||
CMAKE_OSX_ARCHITECTURES="arm64"
|
||||
if [[ "$arch" == 'unified' ]]; then
|
||||
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
|
||||
elif [[ "$arch" != '' ]]; then
|
||||
CMAKE_OSX_ARCHITECTURES="$arch"
|
||||
fi
|
||||
fi
|
||||
|
||||
# jamid
|
||||
DAEMON="${TOP}/daemon"
|
||||
cd "$DAEMON"
|
||||
|
||||
mkdir -p "${BUILD_DIR}"
|
||||
cd "${BUILD_DIR}"
|
||||
daemon_cmake_flags=(-DCMAKE_BUILD_TYPE="${BUILD_TYPE}")
|
||||
if [ "${asan}" = "true" ]; then
|
||||
daemon_cmake_flags+=(-DENABLE_ASAN=On)
|
||||
fi
|
||||
if [ "${ignore_system_libs}" = "true" ]; then
|
||||
daemon_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
|
||||
fi
|
||||
if [ "${enable_libwrap}" = "false" ]; then
|
||||
daemon_cmake_flags+=(-DJAMI_DBUS=On)
|
||||
else
|
||||
daemon_cmake_flags+=(-DJAMI_DBUS=Off)
|
||||
fi
|
||||
if [ "${enable_testing}" = "true" ]; then
|
||||
daemon_cmake_flags+=(-DBUILD_TESTING=On)
|
||||
else
|
||||
daemon_cmake_flags+=(-DBUILD_TESTING=Off)
|
||||
fi
|
||||
if [ "${global}" = "true" ]; then
|
||||
daemon_cmake_flags+=(${prefix:+"-DCMAKE_INSTALL_PREFIX=$prefix"})
|
||||
else
|
||||
daemon_cmake_flags+=(-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}")
|
||||
fi
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
daemon_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
|
||||
fi
|
||||
|
||||
cmake .. "${daemon_cmake_flags[@]}"
|
||||
make -j"${proc}" V=1
|
||||
make_install "${global}" "${priv_install}"
|
||||
|
||||
# Verify system's version if no path provided.
|
||||
if [ -z "$qtpath" ]; then
|
||||
sys_qtver=""
|
||||
if command -v qmake6 &> /dev/null; then
|
||||
sys_qtver=$(qmake6 -v)
|
||||
elif command -v qmake-qt6 &> /dev/null; then
|
||||
sys_qtver=$(qmake-qt6 -v) # Fedora
|
||||
elif command -v qmake &> /dev/null; then
|
||||
sys_qtver=$(qmake -v)
|
||||
else
|
||||
echo "No valid Qt found"; exit 1;
|
||||
fi
|
||||
|
||||
sys_qtver=${sys_qtver#*Qt version}
|
||||
sys_qtver=${sys_qtver%\ in\ *}
|
||||
|
||||
installed_qtver=$(echo "$sys_qtver" | cut -d'.' -f 2)
|
||||
required_qtver=$(echo $QT_MIN_VER | cut -d'.' -f 2)
|
||||
|
||||
if [[ $installed_qtver -ge $required_qtver ]] ; then
|
||||
# Set qtpath to empty in order to use system's Qt.
|
||||
qtpath=""
|
||||
else
|
||||
echo "No valid Qt found"; exit 1;
|
||||
fi
|
||||
fi
|
||||
# fi
|
||||
|
||||
# client
|
||||
cd "${TOP}"
|
||||
mkdir -p "${BUILD_DIR}"
|
||||
@ -217,6 +229,10 @@ else
|
||||
client_cmake_flags+=(-DBUILD_TESTING=Off)
|
||||
fi
|
||||
|
||||
if [ "${ignore_system_libs}" = "true" ]; then
|
||||
client_cmake_flags+=(-DIGNORE_SYSTEM_LIBS=On)
|
||||
fi
|
||||
|
||||
if [ "${enable_crashreports}" = "true" ]; then
|
||||
client_cmake_flags+=(-DENABLE_CRASHREPORTS=ON)
|
||||
else
|
||||
@ -224,13 +240,6 @@ else
|
||||
fi
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
#detect arch for macos
|
||||
CMAKE_OSX_ARCHITECTURES="arm64"
|
||||
if [[ "$arch" == 'unified' ]]; then
|
||||
CMAKE_OSX_ARCHITECTURES="x86_64;arm64"
|
||||
elif [[ "$arch" != '' ]]; then
|
||||
CMAKE_OSX_ARCHITECTURES="$arch"
|
||||
fi
|
||||
client_cmake_flags+=(-DCMAKE_OSX_ARCHITECTURES="${CMAKE_OSX_ARCHITECTURES}")
|
||||
# build qrencode
|
||||
(
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>11.0</string>
|
||||
<string>12.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 522 KiB After Width: | Height: | Size: 298 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 528 KiB After Width: | Height: | Size: 410 KiB |
@ -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());
|
||||
});
|
||||
}
|
||||
|
||||
@ -84,9 +84,9 @@ extern const QString defaultDownloadPath;
|
||||
// Additional key-value pairs for non-APPSTORE builds including donation
|
||||
// related settings.
|
||||
#define KEYS COMMON_KEYS \
|
||||
X(Donation2023VisibleDate, "2023-11-27 05:00") \
|
||||
X(Donation2025StartDate, "2025-09-15 00:00") \
|
||||
X(IsDonationVisible, true) \
|
||||
X(Donation2023EndDate2, "2024-04-01 00:00")
|
||||
X(Donation2025EndDate, "2025-11-16 00:00")
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@ -67,7 +67,7 @@ CallAdapter::CallAdapter(AppSettingsManager* settingsManager,
|
||||
#ifdef Q_OS_LINUX
|
||||
// notification responses (gnu/linux currently)
|
||||
connect(systemTray_,
|
||||
&SystemTray::answerCallActivated,
|
||||
&SystemTray::acceptCallActivated,
|
||||
this,
|
||||
[this](const QString& accountId, const QString& convUid) {
|
||||
acceptACall(accountId, convUid);
|
||||
|
||||
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: {
|
||||
@ -88,7 +87,7 @@ ContextMenuAutoLoader {
|
||||
GeneralMenuItem {
|
||||
id: manageLanguages
|
||||
itemName: JamiStrings.dictionaryManager
|
||||
canTrigger: spellCheckEnabled
|
||||
canTrigger: isSpellCheckActive()
|
||||
hasIcon: false
|
||||
onClicked: {
|
||||
viewCoordinator.presentDialog(appWindow, "commoncomponents/DictionaryManagerDialog.qml");
|
||||
@ -171,5 +170,23 @@ ContextMenuAutoLoader {
|
||||
}
|
||||
}
|
||||
|
||||
function isSpellCheckActive() {
|
||||
return AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang);
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: UtilsAdapter
|
||||
|
||||
function onEnableSpellCheckChanged() {
|
||||
textLanguage.canTrigger = isSpellCheckActive() && SpellCheckAdapter.installedDictionaryCount > 0;
|
||||
manageLanguages.canTrigger = isSpellCheckActive();
|
||||
}
|
||||
|
||||
function onSpellLanguageChanged() {
|
||||
textLanguage.canTrigger = isSpellCheckActive() && SpellCheckAdapter.installedDictionaryCount > 0;
|
||||
manageLanguages.canTrigger = isSpellCheckActive();
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: menuItemsToLoad = menuItems
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
@ -61,13 +61,13 @@ ConnectionInfoListModel::data(const QModelIndex& index, int role) const
|
||||
}
|
||||
case ConnectionInfoList::ConnectionDatas: {
|
||||
QString peerString;
|
||||
peerString += "Peer:" + peerId;
|
||||
peerString += "Peer: " + peerId;
|
||||
for (const auto& device : peerData.keys()) {
|
||||
peerString += "{";
|
||||
peerString += "Device:" + device + ",";
|
||||
peerString += "Status:" + peerData[device]["status"].toString() + ",";
|
||||
peerString += "Channels:" + peerData[device]["channels"].toString() + ",";
|
||||
peerString += "Remote Address" + peerData[device]["remoteAddress"].toString();
|
||||
peerString += ",\n {";
|
||||
peerString += "Device: " + device;
|
||||
peerString += ", Status: " + peerData[device]["status"].toString();
|
||||
peerString += ", Channel(s): " + peerData[device]["channels"].toString();
|
||||
peerString += ", Remote IP address: " + peerData[device]["remoteAddress"].toString();
|
||||
peerString += "}";
|
||||
}
|
||||
return peerString;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -84,6 +84,12 @@ Item {
|
||||
}
|
||||
|
||||
function updateImageSource(downloadUrl, localPath, defaultImage) {
|
||||
// TODO: this is a temporary fix to load bundled resources directly from qrc
|
||||
// we need to investigate why we use a cached image for bundled resources
|
||||
if (downloadUrl.startsWith("qrc:")) {
|
||||
image.source = downloadUrl;
|
||||
return;
|
||||
}
|
||||
if (downloadUrl === "") {
|
||||
image.source = defaultImage;
|
||||
return;
|
||||
|
||||
@ -98,6 +98,7 @@ Control {
|
||||
id: audioInputMenuAction
|
||||
text: JamiStrings.selectAudioInputDevice
|
||||
Component.onCompleted: enabled = audioInputDeviceListModel.rowCount()
|
||||
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
|
||||
property var listModel: AudioDeviceModel {
|
||||
id: audioInputDeviceListModel
|
||||
lrcInstance: LRCInstance
|
||||
@ -113,6 +114,7 @@ Control {
|
||||
id: audioOutputMenuAction
|
||||
text: JamiStrings.selectAudioOutputDevice
|
||||
Component.onCompleted: enabled = audioOutputDeviceListModel.rowCount()
|
||||
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
|
||||
property var listModel: AudioDeviceModel {
|
||||
id: audioOutputDeviceListModel
|
||||
lrcInstance: LRCInstance
|
||||
@ -272,6 +274,7 @@ Control {
|
||||
id: videoInputMenuAction
|
||||
enabled: VideoDevices.listSize !== 0
|
||||
text: JamiStrings.selectVideoDevice
|
||||
property int popupMode: CallActionBar.ActionPopupMode.MediaDevice
|
||||
property var listModel: VideoDevices.deviceSourceModel
|
||||
function accept(index) {
|
||||
VideoDevices.setDefaultDevice(index);
|
||||
|
||||
@ -181,9 +181,23 @@ ItemDelegate {
|
||||
Connections {
|
||||
target: menuAction !== undefined ? menuAction : null
|
||||
function onTriggered() {
|
||||
if (menuAction.popupMode !== CallActionBar.ActionPopupMode.ListElement) {
|
||||
var index = menuAction.listModel.currentIndex;
|
||||
itemListView.currentIndex = index !== undefined ? index : 0;
|
||||
var index;
|
||||
switch (menuAction.popupMode) {
|
||||
case CallActionBar.ActionPopupMode.MediaDevice:
|
||||
index = menuAction.listModel.getCurrentIndex();
|
||||
break;
|
||||
case CallActionBar.ActionPopupMode.LayoutOption:
|
||||
index = menuAction.listModel.currentIndex;
|
||||
break;
|
||||
case CallActionBar.ActionPopupMode.ListElement:
|
||||
index = menuAction.listModel.currentIndex;
|
||||
break;
|
||||
default:
|
||||
console.warn("Unknown popup mode: " + menuAction.popupMode);
|
||||
return;
|
||||
}
|
||||
if (index !== undefined) {
|
||||
itemListView.currentIndex = index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,6 +45,7 @@ Rectangle {
|
||||
color: JamiTheme.chatviewBgColor
|
||||
|
||||
property var mapPositions: PositionManager.mapStatus
|
||||
property bool isConversationEndedFlag: false
|
||||
|
||||
// The purpose of this alias is to make the message bar
|
||||
// accessible to the EmojiPicker
|
||||
@ -85,6 +86,32 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
function isConversationEnded() {
|
||||
if (!CurrentConversation.isSwarm)
|
||||
return false;
|
||||
var myRole = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, CurrentAccount.uri);
|
||||
var info = ConversationsAdapter.getConvInfoMap(CurrentConversation.id);
|
||||
var peers = info && info.uris ? info.uris : [];
|
||||
peers = peers.filter(function(u) { return u !== CurrentAccount.uri; });
|
||||
for (var i = 0; i < peers.length; i++) {
|
||||
var role = UtilsAdapter.getParticipantRole(CurrentAccount.id, CurrentConversation.id, peers[i]);
|
||||
if (!(role === Member.Role.LEFT || role === Member.Role.BANNED)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (CurrentConversation.isCoreDialog) {
|
||||
return true
|
||||
}
|
||||
return myRole !== Member.Role.ADMIN;
|
||||
}
|
||||
|
||||
function updateConversationEndedFlag() {
|
||||
var newVal = isConversationEnded();
|
||||
if (isConversationEndedFlag !== newVal) {
|
||||
isConversationEndedFlag = newVal;
|
||||
}
|
||||
}
|
||||
|
||||
// Used externally to switch to a extras panel.
|
||||
function switchToPanel(panel, toggle = true) {
|
||||
extrasPanel.switchToPanel(panel, toggle);
|
||||
@ -102,16 +129,33 @@ Rectangle {
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: LRCInstance
|
||||
function onConversationUpdated(convId, accountId) {
|
||||
if (convId === CurrentConversation.id) {
|
||||
updateConversationEndedFlag();
|
||||
}
|
||||
}
|
||||
}
|
||||
Connections {
|
||||
target: CurrentConversation.members
|
||||
function onCountChanged() {
|
||||
updateConversationEndedFlag();
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: CurrentConversation
|
||||
function onIdChanged() {
|
||||
MessagesAdapter.loadMoreMessages();
|
||||
updateConversationEndedFlag();
|
||||
}
|
||||
}
|
||||
|
||||
onVisibleChanged: {
|
||||
if (visible) {
|
||||
chatViewSplitView.resolvePanes(true);
|
||||
Qt.callLater(updateConversationEndedFlag);
|
||||
}
|
||||
}
|
||||
|
||||
@ -196,6 +240,29 @@ Rectangle {
|
||||
visible: false
|
||||
}
|
||||
|
||||
Control {
|
||||
id: conversationEndedBanner
|
||||
Layout.fillWidth: true
|
||||
visible: isConversationEndedFlag
|
||||
|
||||
padding: 10
|
||||
background: Rectangle {
|
||||
color: JamiTheme.infoRectangleColor
|
||||
radius: 5
|
||||
}
|
||||
contentItem: RowLayout {
|
||||
spacing: 8
|
||||
Label {
|
||||
text: JamiStrings.conversationEnded
|
||||
color: JamiTheme.textColor
|
||||
wrapMode: Text.WordWrap
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NotificationArea {
|
||||
id: notificationArea
|
||||
Layout.fillWidth: true
|
||||
@ -333,6 +400,8 @@ Rectangle {
|
||||
return false;
|
||||
else if (CurrentConversation.isRequest)
|
||||
return false;
|
||||
else if (isConversationEndedFlag)
|
||||
return false;
|
||||
return CurrentConversation.isSwarm || CurrentConversation.isTemporary;
|
||||
}
|
||||
|
||||
|
||||
@ -73,28 +73,37 @@ ContextMenuAutoLoader {
|
||||
onClicked: MessagesAdapter.clearConversationHistory(responsibleAccountId, responsibleConvUid)
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: removeContact
|
||||
id: removeConversation
|
||||
|
||||
canTrigger: !hasCall && !root.isBanned
|
||||
itemName: {
|
||||
if (mode !== Conversation.Mode.NON_SWARM)
|
||||
return JamiStrings.removeConversation;
|
||||
else
|
||||
return JamiStrings.removeContact;
|
||||
}
|
||||
itemName: mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.removeConversation : JamiStrings.leaveGroup
|
||||
iconSource: JamiResources.ic_hangup_participant_24dp_svg
|
||||
onClicked: {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmLeaveConversation,
|
||||
"confirmLabel": JamiStrings.optionLeave
|
||||
});
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.confirmRemoveOneToOneConversation : JamiStrings.confirmLeaveGroup,
|
||||
"confirmLabel": mode === Conversation.Mode.ONE_TO_ONE ? JamiStrings.optionRemove : JamiStrings.optionLeave
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
if (mode !== Conversation.Mode.NON_SWARM)
|
||||
MessagesAdapter.removeConversation(responsibleConvUid);
|
||||
else
|
||||
MessagesAdapter.removeContact(responsibleConvUid);
|
||||
});
|
||||
MessagesAdapter.removeConversation(responsibleConvUid, true);
|
||||
});
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
id: removeContact
|
||||
|
||||
canTrigger: !hasCall && !root.isBanned && mode === Conversation.Mode.ONE_TO_ONE
|
||||
itemName: JamiStrings.removeContact
|
||||
iconSource: JamiResources.kick_member_svg
|
||||
onClicked: {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmRemoveContact,
|
||||
"confirmLabel": JamiStrings.optionRemove
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
MessagesAdapter.removeContact(responsibleConvUid);
|
||||
});
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
@ -129,13 +138,13 @@ ContextMenuAutoLoader {
|
||||
iconSource: JamiResources.block_black_24dp_svg
|
||||
onClicked: {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmBlockConversation,
|
||||
"confirmLabel": JamiStrings.optionBlock
|
||||
});
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmBlockContact,
|
||||
"confirmLabel": JamiStrings.optionBlock
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
MessagesAdapter.blockConversation(responsibleConvUid);
|
||||
});
|
||||
MessagesAdapter.blockConversation(responsibleConvUid);
|
||||
});
|
||||
}
|
||||
},
|
||||
GeneralMenuItem {
|
||||
@ -155,11 +164,11 @@ ContextMenuAutoLoader {
|
||||
onClicked: {
|
||||
if (isCoreDialog) {
|
||||
viewCoordinator.presentDialog(appWindow, "mainview/components/UserProfile.qml", {
|
||||
"aliasText": aliasText,
|
||||
"registeredNameText": registeredNameText,
|
||||
"idText": idText,
|
||||
"convId": responsibleConvUid
|
||||
});
|
||||
"aliasText": aliasText,
|
||||
"registeredNameText": registeredNameText,
|
||||
"idText": idText,
|
||||
"convId": responsibleConvUid
|
||||
});
|
||||
} else {
|
||||
root.showSwarmDetails();
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ Control {
|
||||
// Calculate the time 7 days from now
|
||||
var futureDate = new Date(new Date().getTime() + 7 * 24 * 60 * 60 * 1000);
|
||||
var formattedDate = Qt.formatDateTime(futureDate, "yyyy-MM-dd hh:mm");
|
||||
UtilsAdapter.setAppValue(Settings.Key.Donation2023VisibleDate, formattedDate);
|
||||
UtilsAdapter.setAppValue(Settings.Key.Donation2025StartDate, formattedDate);
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
|
||||
@ -117,7 +117,7 @@ Window {
|
||||
}
|
||||
ListElement {
|
||||
shortcut: "Ctrl+Y"
|
||||
description: qsTr("Answer incoming call")
|
||||
description: qsTr("Accept call")
|
||||
}
|
||||
ListElement {
|
||||
shortcut: "Ctrl+D"
|
||||
|
||||
@ -72,7 +72,6 @@ JamiFlickable {
|
||||
|
||||
lineEditObj: textArea
|
||||
customizePaste: true
|
||||
spellCheckEnabled: root.spellCheckEnabled
|
||||
|
||||
onContextMenuRequirePaste: {
|
||||
// Intercept paste event to use C++ QMimeData
|
||||
@ -113,15 +112,13 @@ JamiFlickable {
|
||||
}
|
||||
}
|
||||
|
||||
property bool spellCheckEnabled: AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang) !== ""
|
||||
|
||||
// Spell check is active under the following conditions:
|
||||
// 1. Spell check is enabled in settings
|
||||
// 2. The selected spell language is not ""
|
||||
// 3. We are not in preview mode
|
||||
readonly property bool spellCheckActive: spellCheckEnabled && !showPreview
|
||||
|
||||
onSpellCheckActiveChanged: textArea.updateSpellCorrection()
|
||||
function isSpellCheckActive() {
|
||||
return AppSettingsManager.getValue(Settings.EnableSpellCheck) && AppSettingsManager.getValue(Settings.SpellLang) !== "" && !showPreview;
|
||||
}
|
||||
|
||||
TextArea.flickable: TextArea {
|
||||
id: textArea
|
||||
@ -190,7 +187,7 @@ JamiFlickable {
|
||||
|
||||
onReleased: function (event) {
|
||||
if (event.button === Qt.RightButton) {
|
||||
if (spellCheckActive && SpellCheckAdapter.hasLoadedDictionary) {
|
||||
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
|
||||
var position = textArea.positionAt(event.x, event.y);
|
||||
textArea.moveCursorSelection(position, TextInput.SelectWords);
|
||||
textArea.selectWord();
|
||||
@ -252,7 +249,7 @@ JamiFlickable {
|
||||
function updateSpellCorrection() {
|
||||
clearUnderlines();
|
||||
// We iterate over the whole text to find words to check and underline them if needed
|
||||
if (spellCheckActive && SpellCheckAdapter.hasLoadedDictionary) {
|
||||
if (isSpellCheckActive() && SpellCheckAdapter.hasLoadedDictionary) {
|
||||
var text = textArea.text;
|
||||
var words = SpellCheckAdapter.findWords(text);
|
||||
if (!words)
|
||||
|
||||
@ -297,7 +297,7 @@ Rectangle {
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: JamiTheme.preferredMarginSize
|
||||
text: JamiStrings.leaveConversation
|
||||
text: CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.leaveGroup : JamiStrings.removeConversation
|
||||
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
|
||||
font.kerning: true
|
||||
elide: Text.ElideRight
|
||||
@ -312,13 +312,49 @@ Rectangle {
|
||||
enabled: parent.visible
|
||||
onTapped: function onTapped(eventPoint) {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmLeaveConversation,
|
||||
"confirmLabel": JamiStrings.optionLeave
|
||||
});
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.confirmLeaveGroup : JamiStrings.confirmRemoveOneToOneConversation,
|
||||
"confirmLabel": CurrentConversation.modeString.indexOf("group") >= 0 ? JamiStrings.optionLeave : JamiStrings.optionRemove
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
|
||||
});
|
||||
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid, true);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SwarmDetailsItem {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: JamiTheme.settingsFontSize + 2 * JamiTheme.preferredMarginSize + 4
|
||||
visible: CurrentConversation.isCoreDialog
|
||||
|
||||
Text {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: JamiTheme.preferredMarginSize
|
||||
text: JamiStrings.removeContact
|
||||
font.pixelSize: JamiTheme.settingsDescriptionPixelSize
|
||||
font.kerning: true
|
||||
elide: Text.ElideRight
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
color: JamiTheme.textColor
|
||||
}
|
||||
|
||||
TapHandler {
|
||||
target: parent
|
||||
enabled: parent.visible
|
||||
onTapped: function onTapped(eventPoint) {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/ConfirmDialog.qml", {
|
||||
"title": JamiStrings.confirmAction,
|
||||
"textLabel": JamiStrings.confirmRemoveContact,
|
||||
"confirmLabel": JamiStrings.optionRemove
|
||||
});
|
||||
dlg.accepted.connect(function () {
|
||||
MessagesAdapter.removeConversation(LRCInstance.selectedConvUid);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -500,8 +536,6 @@ Rectangle {
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
color: JamiTheme.textColor
|
||||
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
|
||||
@ -480,10 +480,10 @@ MessagesAdapter::clearConversationHistory(const QString& accountId, const QStrin
|
||||
}
|
||||
|
||||
void
|
||||
MessagesAdapter::removeConversation(const QString& convUid)
|
||||
MessagesAdapter::removeConversation(const QString& convUid, bool keepContact)
|
||||
{
|
||||
auto& accInfo = lrcInstance_->getCurrentAccountInfo();
|
||||
accInfo.conversationModel->removeConversation(convUid);
|
||||
accInfo.conversationModel->removeConversation(convUid, false, keepContact);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@ -113,7 +113,7 @@ public:
|
||||
Q_INVOKABLE void loadMoreMessages();
|
||||
Q_INVOKABLE void connectConversationModel();
|
||||
Q_INVOKABLE void sendConversationRequest();
|
||||
Q_INVOKABLE void removeConversation(const QString& convUid);
|
||||
Q_INVOKABLE void removeConversation(const QString& convUid, bool keepContact = false);
|
||||
Q_INVOKABLE void addConversationMember(const QString& convUid, const QString& participantUri);
|
||||
Q_INVOKABLE void removeConversationMember(const QString& convUid, const QString& participantUri);
|
||||
Q_INVOKABLE void removeContact(const QString& convUid, bool banContact = false);
|
||||
|
||||
@ -103,8 +103,8 @@ Item {
|
||||
// The banner is visible if the current date is after the date set in the settings and before the end date
|
||||
// And if the donation toggle is checked
|
||||
const isVisible = UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible);
|
||||
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023EndDate2));
|
||||
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2023VisibleDate));
|
||||
const endDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025EndDate));
|
||||
const startDate = Date.parse(UtilsAdapter.getAppValue(Settings.Key.Donation2025StartDate));
|
||||
const now = new Date();
|
||||
return isVisible && now < endDate && now >= startDate;
|
||||
}
|
||||
|
||||
@ -46,7 +46,7 @@ Item {
|
||||
property string buildID: qsTr("Build ID")
|
||||
property string version: qsTr("Version")
|
||||
property string declarationYear: "Copyright © 2015–2025"
|
||||
property string slogan: "Εἰρήνη"
|
||||
property string slogan: "Atlas"
|
||||
property string declaration: qsTr('Jami, a GNU package, is software for universal and distributed peer-to-peer communication that respects the freedom and privacy of its users. Visit <a href="https://jami.net" style="color: ' + JamiTheme.buttonTintedBlue + '">jami.net</a>' + ' to learn more.')
|
||||
property string noWarranty: qsTr('This program comes with absolutely no warranty. See the <a href="https://www.gnu.org/licenses/gpl-3.0.html" style="color: ' + JamiTheme.buttonTintedBlue + '">GNU General Public License</a>, version 3 or later for details.')
|
||||
property string contribute: qsTr('Contribute')
|
||||
@ -100,7 +100,7 @@ Item {
|
||||
// AdvancedCallSettings
|
||||
property string allowCallsUnknownContacs: qsTr("Allow incoming calls from unknown contacts")
|
||||
property string rendezVous: qsTr("Convert your account into a rendezvous point")
|
||||
property string autoAnswerCalls: qsTr("Automatically answer incoming calls")
|
||||
property string autoAcceptCalls: qsTr("Automatically accept calls")
|
||||
property string enableCustomRingtone: qsTr("Enable custom ringtone")
|
||||
property string selectCustomRingtone: qsTr("Select custom ringtone")
|
||||
property string selectNewRingtone: qsTr("Select a new ringtone")
|
||||
@ -118,10 +118,6 @@ Item {
|
||||
property string assignmentIndication: qsTr("Press the key to be assigned to push-to-talk shortcut")
|
||||
property string assign: qsTr("Assign")
|
||||
|
||||
// AdvancedChatSettings
|
||||
property string enableReadReceipts: qsTr("Enable read receipts")
|
||||
property string enableReadReceiptsTooltip: qsTr("Send and receive receipts indicating that messages have been displayed.")
|
||||
|
||||
// AdvancedVoiceMailSettings
|
||||
property string voiceMail: qsTr("Voicemail")
|
||||
property string voiceMailDialCode: qsTr("Voicemail dial code")
|
||||
@ -189,7 +185,10 @@ Item {
|
||||
property string openDHTConfig: qsTr("OpenDHT configuration")
|
||||
property string enableProxy: qsTr("Enable proxy")
|
||||
property string proxyAddress: qsTr("Proxy address")
|
||||
property string proxyListURL: qsTr("Proxy list URL")
|
||||
property string bootstrap: qsTr("Bootstrap")
|
||||
property string usingProxy: qsTr("Using proxy:")
|
||||
property string proxyDisabled: qsTr("Proxy disabled")
|
||||
|
||||
// SettingsHeader
|
||||
property string back: qsTr("Back")
|
||||
@ -277,16 +276,19 @@ Item {
|
||||
property string cut: qsTr("Cut")
|
||||
property string copy: qsTr("Copy")
|
||||
property string paste: qsTr("Paste")
|
||||
property string language: qsTr("Language")
|
||||
|
||||
// ConversationContextMenu
|
||||
property string startAudioCall: qsTr("Start audio call")
|
||||
property string startVideoCall: qsTr("Start video call")
|
||||
property string deleteConversation: qsTr("Delete conversation")
|
||||
property string confirmAction: qsTr("Confirm action")
|
||||
property string removeConversation: qsTr("Leave conversation")
|
||||
property string confirmLeaveConversation: qsTr("Do you want to leave this conversation?")
|
||||
property string confirmBlockConversation: qsTr("Do you want to block this conversation?")
|
||||
property string removeConversation: qsTr("Remove conversation")
|
||||
property string confirmRemoveConversation: qsTr("Do you want to leave this conversation?")
|
||||
property string leaveGroup: qsTr("Leave group")
|
||||
property string confirmLeaveGroup: qsTr("Are you sure you want to leave this group?")
|
||||
property string confirmRemoveContact: qsTr("Do you want to remove this contact? The existing conversation will be deleted.")
|
||||
property string confirmBlockContact: qsTr("Do you want to block this contact?")
|
||||
property string confirmRemoveOneToOneConversation: qsTr("Are you sure you want to remove this conversation? The contact will not be removed.")
|
||||
property string removeContact: qsTr("Remove contact")
|
||||
property string blockContact: qsTr("Block contact")
|
||||
property string convDetails: qsTr("Conversation details")
|
||||
@ -368,6 +370,9 @@ Item {
|
||||
property string deletedMedia: qsTr("%1 deleted a media")
|
||||
property string returnToCall: qsTr("Return to call")
|
||||
|
||||
// Conversation ended banner
|
||||
property string conversationEnded: qsTr("This conversation has ended.")
|
||||
|
||||
// MessagesResearch
|
||||
property string jumpTo: qsTr("Jump to")
|
||||
property string messages: qsTr("Messages")
|
||||
@ -426,8 +431,8 @@ Item {
|
||||
property string displayName: qsTr("Display name")
|
||||
|
||||
// accountSettingsPages
|
||||
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts.\nYour picture and your display name can be changed at all time in the settings of your account.")
|
||||
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami.\nIf a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
|
||||
property string customizeAccountDescription: qsTr("Your profile is only shared with your contacts. You can customize your profile at any time.")
|
||||
property string usernameAccountDescription: qsTr("A chosen username can help to be found more easily on Jami. If a username is not chosen, a randomly generated 40-character identifier will be assigned to this account as a username. It is more difficult to be found and reached with this identifier.")
|
||||
property string encryptAccountDescription: qsTr("Your Jami account is registered only on this device as an archive containing the keys of your account. Access to this archive can be protected with a password.")
|
||||
property string saveAccountTitle: qsTr("Backup account")
|
||||
property string saveAccountDescription: qsTr("This Jami account exists only on this device. The account will be lost if this device is lost or the application is uninstalled. It is recommended to make a backup of this account.")
|
||||
@ -508,8 +513,10 @@ Item {
|
||||
property string defaultSettings: qsTr("Default settings")
|
||||
|
||||
// ChatviewSettings
|
||||
property string enableTypingIndicator: qsTr("Enable typing indicators")
|
||||
property string enableTypingIndicator: qsTr("Typing indicator")
|
||||
property string enableTypingIndicatorDescription: qsTr("Send and receive typing indicators showing when messages are being typed.")
|
||||
property string enableReadReceipts: qsTr("Read receipts")
|
||||
property string enableReadReceiptsTooltip: qsTr("Send and request delivery and read receipts to be sent when messages are delivered or read.")
|
||||
property string displayHyperlinkPreviews: qsTr("Web link previews")
|
||||
property string displayHyperlinkPreviewsDescription: qsTr("Preview requires downloading content from third-party servers.")
|
||||
|
||||
@ -606,13 +613,13 @@ Item {
|
||||
property string enterPasswordPinCode: qsTr("This account is password encrypted, enter the password to generate a PIN code.")
|
||||
property string addDevice: qsTr("Add Device")
|
||||
property string linkNewDevice: qsTr("Link new device")
|
||||
property string linkDeviceConnecting: qsTr("Connecting to your new device…")
|
||||
property string linkDeviceConnecting: qsTr("Connecting to the new device…")
|
||||
property string linkDeviceInProgress: qsTr("The export account operation to the new device is in progress.\nPlease confirm the import on the new device.")
|
||||
property string linkDeviceScanQR: qsTr("On the new device, initiate a new account.\nSelect Add account → Connect from another device.\nWhen ready, scan the QR code.")
|
||||
property string linkDeviceEnterManually: qsTr("Alternatively, enter the authentication code manually.")
|
||||
property string linkDeviceEnterCodePlaceholder: qsTr("Enter authentication code")
|
||||
property string linkDeviceAllSet: qsTr("The account was imported successfully.")
|
||||
property string linkDeviceFoundAddress: qsTr("New device found at address below. Is that you?\nClicking on confirm will continue transfering account.")
|
||||
property string linkDeviceFoundAddress: qsTr("New device connected at the following IP address. Is that you? To continue the export account operation, click Confirm.")
|
||||
property string linkDeviceNewDeviceIP: qsTr("New device IP address: %1")
|
||||
property string linkDeviceCloseWarningTitle: qsTr("Do you want to exit?")
|
||||
property string linkDeviceCloseWarningMessage: qsTr("Exiting will cancel the import account operation.")
|
||||
@ -828,7 +835,6 @@ Item {
|
||||
property string ignoreNotificationsTooltip: qsTr("Ignore all notifications from this conversation")
|
||||
property string chooseAColor: qsTr("Color")
|
||||
property string defaultCallHost: qsTr("Default host (calls)")
|
||||
property string leaveConversation: qsTr("Leave conversation")
|
||||
property string typeOfSwarm: qsTr("Conversation type")
|
||||
property string none: qsTr("None")
|
||||
|
||||
|
||||
@ -696,6 +696,7 @@ Item {
|
||||
property color darkThemeBackgroundColor: JamiTheme.darkTheme ? JamiTheme.blackColor : JamiTheme.bgDarkMode_
|
||||
property color darkThemeCheckedColor: "#03B9E9"
|
||||
property color darkThemeBorderColor: "#03B9E9"
|
||||
property color radioCheckedColor: darkTheme ? darkThemeCheckedColor : lightThemeCheckedColor
|
||||
|
||||
// Donation campaign
|
||||
property color donationButtonTextColor: "#005699"
|
||||
|
||||
@ -215,7 +215,7 @@ PluginAdapter::checkVersionStatus(const QString& pluginId)
|
||||
QString
|
||||
PluginAdapter::baseUrl() const
|
||||
{
|
||||
return settingsManager_->getValue("PluginStoreEndpoint").toString();
|
||||
return settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString();
|
||||
}
|
||||
|
||||
QString
|
||||
|
||||
@ -104,7 +104,7 @@ public:
|
||||
return;
|
||||
}
|
||||
parent_.sendGetRequest(
|
||||
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/versions/"
|
||||
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/versions/"
|
||||
+ plugin.id + "?arch=" + lrcInstance_->pluginModel().getPlatformInfo()["os"]),
|
||||
[this, plugin](const QByteArray& data) {
|
||||
// `data` represents the version in this case.
|
||||
@ -122,7 +122,7 @@ public:
|
||||
void installRemotePlugin(const QString& pluginId)
|
||||
{
|
||||
parent_.downloadFile(
|
||||
QUrl(settingsManager_->getValue("PluginStoreEndpoint").toString() + "/download/"
|
||||
QUrl(settingsManager_->getValue(Settings::Key::PluginStoreEndpoint).toString() + "/download/"
|
||||
+ lrcInstance_->pluginModel().getPlatformInfo()["os"] + "/" + pluginId),
|
||||
pluginId,
|
||||
0,
|
||||
|
||||
@ -65,7 +65,7 @@ ColumnLayout {
|
||||
titleField: JamiStrings.caCertificate
|
||||
itemWidth: root.itemWidth
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
@ -80,7 +80,7 @@ ColumnLayout {
|
||||
titleField: JamiStrings.userCertificate
|
||||
itemWidth: root.itemWidth
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
@ -95,7 +95,7 @@ ColumnLayout {
|
||||
titleField: JamiStrings.privateKey
|
||||
itemWidth: root.itemWidth
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
|
||||
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
*/
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
@ -44,7 +45,7 @@ ColumnLayout {
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
SettingSpinBox {
|
||||
SettingSpinBox {
|
||||
id: dhtPortUsed
|
||||
|
||||
visible: !root.isSIP
|
||||
@ -76,6 +77,7 @@ ColumnLayout {
|
||||
id: checkBoxEnableProxy
|
||||
|
||||
labelText: JamiStrings.enableProxy
|
||||
descText: checked ? JamiStrings.usingProxy + ' ' + CurrentAccount.currentProxyServer : JamiStrings.proxyDisabled
|
||||
Layout.fillWidth: true
|
||||
|
||||
checked: CurrentAccount.proxyEnabled
|
||||
@ -83,19 +85,94 @@ ColumnLayout {
|
||||
onSwitchToggled: CurrentAccount.proxyEnabled = checked
|
||||
}
|
||||
|
||||
SettingsMaterialTextEdit {
|
||||
id: lineEditProxy
|
||||
|
||||
RowLayout {
|
||||
id: lineEditProxyServer
|
||||
Layout.fillWidth: true
|
||||
|
||||
enabled: checkBoxEnableProxy.checked
|
||||
Text {
|
||||
text: JamiStrings.proxyAddress
|
||||
font.pointSize: JamiTheme.settingsFontSize
|
||||
font.kerning: true
|
||||
color: JamiTheme.textColor
|
||||
|
||||
staticText: CurrentAccount.proxyServer
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
itemWidth: root.itemWidth
|
||||
titleField: JamiStrings.proxyAddress
|
||||
ModalTextEdit {
|
||||
id: modalTextEditProxyServer
|
||||
TextMetrics {
|
||||
text: modalTextEditProxyServer.staticText
|
||||
elide: Text.ElideRight
|
||||
elideWidth: itemWidth - 20
|
||||
font.pixelSize: JamiTheme.materialLineEditPixelSize
|
||||
}
|
||||
|
||||
onEditFinished: CurrentAccount.proxyServer = dynamicText
|
||||
visible: true
|
||||
focus: visible
|
||||
isSettings: true
|
||||
|
||||
Layout.preferredWidth: itemWidth - proxyServerRadioButton.indicator.width - proxyServerRadioButton.spacing - proxyServerRadioButton.horizontalPadding
|
||||
staticText: CurrentAccount.proxyServer
|
||||
placeholderText: JamiStrings.proxyAddress
|
||||
|
||||
onAccepted: CurrentAccount.proxyServer = dynamicText
|
||||
}
|
||||
|
||||
JamiRadioButton {
|
||||
id: proxyServerRadioButton
|
||||
checked: !CurrentAccount.proxyListEnabled
|
||||
leftPadding: 2
|
||||
rightPadding: 0
|
||||
spacing: 0
|
||||
|
||||
onPressed: CurrentAccount.proxyListEnabled = !CurrentAccount.proxyListEnabled
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: lineEditProxyListURL
|
||||
Layout.fillWidth: true
|
||||
|
||||
Text {
|
||||
text: JamiStrings.proxyListURL
|
||||
font.pointSize: JamiTheme.settingsFontSize
|
||||
font.kerning: true
|
||||
color: JamiTheme.textColor
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
ModalTextEdit {
|
||||
id: modalTextEditProxyListURL
|
||||
TextMetrics {
|
||||
text: modalTextEditProxyListURL.staticText
|
||||
elide: Text.ElideRight
|
||||
elideWidth: itemWidth - 40
|
||||
font.pixelSize: JamiTheme.materialLineEditPixelSize
|
||||
}
|
||||
|
||||
visible: true
|
||||
focus: visible
|
||||
isSettings: true
|
||||
|
||||
Layout.preferredWidth: itemWidth - proxyListURLRadioButton.indicator.width - proxyListURLRadioButton.spacing - proxyListURLRadioButton.horizontalPadding
|
||||
staticText: CurrentAccount.dhtProxyListUrl
|
||||
placeholderText: JamiStrings.proxyListURL
|
||||
|
||||
onAccepted: CurrentAccount.dhtProxyListUrl = dynamicText
|
||||
}
|
||||
JamiRadioButton {
|
||||
id: proxyListURLRadioButton
|
||||
checked: CurrentAccount.proxyListEnabled
|
||||
rightPadding: 0
|
||||
leftPadding: 2
|
||||
spacing: 0
|
||||
|
||||
onPressed: CurrentAccount.proxyListEnabled = !CurrentAccount.proxyListEnabled
|
||||
}
|
||||
}
|
||||
|
||||
SettingsMaterialTextEdit {
|
||||
|
||||
@ -84,7 +84,7 @@ ColumnLayout {
|
||||
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateListFile_TLS) : JamiStrings.selectCACertDefault
|
||||
itemWidth: root.itemWidth
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectCACert, CurrentAccount.certificateListFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
CurrentAccount.certificateListFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
@ -99,7 +99,7 @@ ColumnLayout {
|
||||
itemWidth: root.itemWidth
|
||||
textField: UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.certificateFile_TLS) : JamiStrings.selectCACertDefault
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectUserCert, CurrentAccount.certificateFile_TLS, JamiStrings.certificateFile, function (file) {
|
||||
CurrentAccount.certificateFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
@ -114,7 +114,7 @@ ColumnLayout {
|
||||
itemWidth: root.itemWidth
|
||||
textField: UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) !== "" ? UtilsAdapter.toFileInfoName(CurrentAccount.privateKeyFile_TLS) : JamiStrings.selectCACertDefault
|
||||
|
||||
onClick: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
|
||||
onSettingMaterialButtonClicked: openFileDialog(JamiStrings.selectPrivateKey, CurrentAccount.privateKeyFile_TLS, JamiStrings.keyFile, function (file) {
|
||||
CurrentAccount.privateKeyFile_TLS = UtilsAdapter.getAbsPath(file.toString());
|
||||
})
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import QtQuick.Controls
|
||||
@ -90,7 +91,7 @@ SettingsPageBase {
|
||||
ToggleSwitch {
|
||||
id: checkBoxAutoAnswer
|
||||
|
||||
labelText: JamiStrings.autoAnswerCalls
|
||||
labelText: JamiStrings.autoAcceptCalls
|
||||
checked: CurrentAccount.autoAnswer
|
||||
onSwitchToggled: CurrentAccount.autoAnswer = checked
|
||||
}
|
||||
@ -153,7 +154,7 @@ SettingsPageBase {
|
||||
titleField: JamiStrings.selectCustomRingtone
|
||||
itemWidth: root.itemWidth
|
||||
|
||||
onClick: {
|
||||
onSettingMaterialButtonClicked: {
|
||||
var dlg = viewCoordinator.presentDialog(appWindow, "commoncomponents/JamiFileDialog.qml", {
|
||||
"title": JamiStrings.selectNewRingtone,
|
||||
"fileMode": JamiFileDialog.OpenFile,
|
||||
|
||||
@ -18,10 +18,10 @@ import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import SortFilterProxyModel 0.2
|
||||
import net.jami.Enums 1.1
|
||||
import net.jami.Models 1.1
|
||||
import net.jami.Adapters 1.1
|
||||
import net.jami.Constants 1.1
|
||||
import net.jami.Enums 1.1
|
||||
import "../../commoncomponents"
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
@ -70,16 +70,17 @@ SettingsPageBase {
|
||||
}
|
||||
}
|
||||
}
|
||||
InstallManuallyView {
|
||||
Layout.fillWidth: true
|
||||
spacing: 10
|
||||
}
|
||||
|
||||
// View of available plugins in the store
|
||||
PluginStoreListView {
|
||||
id: pluginRemoteList
|
||||
Layout.alignment: Qt.AlignBottom | Qt.AlignHCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
InstallManuallyView {
|
||||
Layout.fillWidth: true
|
||||
spacing: 10
|
||||
}
|
||||
}
|
||||
}
|
||||
property real previousDetailsWidth: 500
|
||||
|
||||
@ -31,7 +31,7 @@ RowLayout {
|
||||
property string source
|
||||
property int itemWidth
|
||||
|
||||
signal click
|
||||
signal settingMaterialButtonClicked
|
||||
|
||||
Text {
|
||||
id: title
|
||||
@ -59,6 +59,6 @@ RowLayout {
|
||||
iconSource: root.source
|
||||
secondary: true
|
||||
|
||||
onClicked: click()
|
||||
onClicked: settingMaterialButtonClicked()
|
||||
}
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ SettingsPageBase {
|
||||
onSwitchToggled: {
|
||||
UtilsAdapter.setAppValue(Settings.Key.IsDonationVisible, checked);
|
||||
if (checked) {
|
||||
UtilsAdapter.setToDefault(Settings.Key.Donation2023VisibleDate);
|
||||
UtilsAdapter.setToDefault(Settings.Key.Donation2025StartDate);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -246,7 +246,7 @@ SettingsPageBase {
|
||||
UtilsAdapter.setToDefault(Settings.Key.LANG);
|
||||
UtilsAdapter.setToDefault(Settings.Key.EnableExperimentalSwarm);
|
||||
UtilsAdapter.setToDefault(Settings.Key.IsDonationVisible);
|
||||
UtilsAdapter.setToDefault(Settings.Key.Donation2023VisibleDate);
|
||||
UtilsAdapter.setToDefault(Settings.Key.Donation2025StartDate);
|
||||
enableDonation.checked = Qt.binding(() => UtilsAdapter.getAppValue(Settings.Key.IsDonationVisible));
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,10 +53,10 @@ refusePending(NotifyNotification*, char* action, SystemTray* nm)
|
||||
}
|
||||
|
||||
void
|
||||
answerCall(NotifyNotification*, char* action, SystemTray* nm)
|
||||
acceptCall(NotifyNotification*, char* action, SystemTray* nm)
|
||||
{
|
||||
QStringList sl = QString(action).split(";");
|
||||
Q_EMIT nm->answerCallActivated(sl.at(1), sl.at(2));
|
||||
Q_EMIT nm->acceptCallActivated(sl.at(1), sl.at(2));
|
||||
}
|
||||
|
||||
void
|
||||
@ -221,7 +221,7 @@ SystemTray::showNotification(const QString& id,
|
||||
|
||||
if (pimpl_->actions) {
|
||||
if (type == NotificationType::CALL) {
|
||||
pimpl_->addNotificationAction(n, tr("Answer call"), (void*) answerCall);
|
||||
pimpl_->addNotificationAction(n, tr("Accept call"), (void*) acceptCall);
|
||||
pimpl_->addNotificationAction(n, tr("Decline call"), (void*) declineCall);
|
||||
} else {
|
||||
pimpl_->addNotificationAction(n, tr("Open conversation"), (void*) openConversation);
|
||||
|
||||
@ -49,7 +49,7 @@ Q_SIGNALS:
|
||||
void openConversationActivated(const QString& accountId, const QString& convUid);
|
||||
void acceptPendingActivated(const QString& accountId, const QString& peerUri);
|
||||
void refusePendingActivated(const QString& accountId, const QString&);
|
||||
void answerCallActivated(const QString& accountId, const QString&);
|
||||
void acceptCallActivated(const QString& accountId, const QString&);
|
||||
void declineCallActivated(const QString& accountId, const QString&);
|
||||
#else
|
||||
void showNotification(const QString& message,
|
||||
|
||||
@ -100,8 +100,8 @@ UtilsAdapter::setAppValue(const Settings::Key key, const QVariant& value)
|
||||
#if !APPSTORE
|
||||
// Any donation campaign-related keys can trigger a donation campaign check
|
||||
else if (key == Settings::Key::IsDonationVisible
|
||||
|| key == Settings::Key::Donation2023VisibleDate
|
||||
|| key == Settings::Key::Donation2023EndDate2)
|
||||
|| key == Settings::Key::Donation2025StartDate
|
||||
|| key == Settings::Key::Donation2025EndDate)
|
||||
Q_EMIT donationCampaignSettingsChanged();
|
||||
#endif
|
||||
}
|
||||
@ -826,8 +826,9 @@ UtilsAdapter::isRTL()
|
||||
"dv", // Dhivehi (Maldivian)
|
||||
"yi", // Yiddish
|
||||
"am", // Amharic
|
||||
"ti", // Tigrinya
|
||||
"kk" // Kazakh (in Arabic script)
|
||||
"ti" // Tigrinya
|
||||
// Since we haven't requested the Arabic script of Kazakh in Transifex, we cannot include it here.
|
||||
// However we have the Cyrillic script of Kazakh which is LTR (code: "kk").
|
||||
};
|
||||
return rtlLanguages.contains(pref);
|
||||
}
|
||||
|
||||
@ -291,7 +291,7 @@ Rectangle {
|
||||
id: confirmButton
|
||||
text: JamiStrings.optionConfirm
|
||||
primary: true
|
||||
enabled: !passwordField.visible || passwordField.dynamicText.length > 0
|
||||
enabled: true
|
||||
onClicked: {
|
||||
AccountAdapter.provideAccountAuthentication(passwordField.visible ? passwordField.dynamicText : "");
|
||||
}
|
||||
|
||||
@ -55,7 +55,7 @@ BaseModalDialog {
|
||||
Accessible.role: Accessible.Dialog
|
||||
Accessible.name: title
|
||||
Accessible.description: JamiStrings.joinJamiNoPassword
|
||||
width: root.width - 2 * root.popupMargins
|
||||
width: 400 - 2 * popupMargins
|
||||
font.pixelSize: JamiTheme.popuptextSize
|
||||
|
||||
lineHeight: JamiTheme.wizardViewTextLineHeight
|
||||
|
||||
@ -435,11 +435,11 @@ Rectangle {
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.margins: JamiTheme.wizardViewPageBackButtonMargins
|
||||
Accessible.role: Accessible.ComboBox
|
||||
Accessible.name: JamiStrings.language
|
||||
Accessible.name: JamiStrings.userInterfaceLanguage
|
||||
Accessible.description: JamiStrings.languageComboBoxExplanation
|
||||
|
||||
labelText: JamiStrings.userInterfaceLanguage
|
||||
tipText: JamiStrings.language
|
||||
tipText: JamiStrings.userInterfaceLanguage
|
||||
comboModel: ListModel {
|
||||
id: langModel
|
||||
Component.onCompleted: {
|
||||
|
||||
@ -169,10 +169,8 @@ if(QT6_VER AND QT6_PATH)
|
||||
else()
|
||||
find_package(QT NAMES Qt6 REQUIRED)
|
||||
endif()
|
||||
if (${QT_VERSION_MAJOR} STRLESS 6)
|
||||
if (${QT_VERSION_MINOR} STRLESS 6)
|
||||
message(FATAL_ERROR "Qt 6.6 or higher is required.")
|
||||
endif()
|
||||
if (${QT_VERSION_MAJOR} LESS 6 OR (${QT_VERSION_MAJOR} EQUAL 6 AND ${QT_VERSION_MINOR} LESS 8))
|
||||
message(FATAL_ERROR "Qt 6.8 or higher is required.")
|
||||
endif()
|
||||
|
||||
set(QT_MODULES Core Gui Sql)
|
||||
@ -193,12 +191,6 @@ else()
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBWRAP)
|
||||
# The daemon is only required for when using direct linking
|
||||
if(NOT LIBJAMI_LIB)
|
||||
message(FATAL_ERROR "Jami daemon library is required when \
|
||||
building with ENABLE_LIBWRAP")
|
||||
endif()
|
||||
|
||||
# Use native calls (no DBus)
|
||||
add_definitions(-DENABLE_LIBWRAP=true)
|
||||
if (NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC"))
|
||||
@ -313,10 +305,23 @@ set(LIBCLIENT_HEADERS_API
|
||||
# For libavutil/avframe.
|
||||
set(LIBJAMI_CONTRIB_DIR
|
||||
"${DAEMON_DIR}/contrib")
|
||||
|
||||
set(CONTRIB_DARWIN_FOLDER "")
|
||||
if(APPLE)
|
||||
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_LEN)
|
||||
if(ARCH_LEN EQUAL 1)
|
||||
# single-arch -> use <arch>-apple-darwin<ver>
|
||||
set(DARWIN_ARCH "${CMAKE_OSX_ARCHITECTURES}")
|
||||
set(CONTRIB_DARWIN_FOLDER "${DARWIN_ARCH}-apple-darwin${CMAKE_SYSTEM_VERSION}")
|
||||
else() # multi-arch -> use apple-darwin<ver>
|
||||
set(CONTRIB_DARWIN_FOLDER "apple-darwin${CMAKE_SYSTEM_VERSION}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h
|
||||
PATHS
|
||||
${LIBJAMI_CONTRIB_DIR}/native/ffmpeg
|
||||
${LIBJAMI_CONTRIB_DIR}/apple-darwin/include/
|
||||
${LIBJAMI_CONTRIB_DIR}/${CONTRIB_DARWIN_FOLDER}/include/
|
||||
${LIBJAMI_CONTRIB_DIR}/build/ffmpeg/Build/win32/x64/include)
|
||||
include_directories(${AVUTIL_INCLUDE_DIR})
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
@ -326,10 +331,6 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||
else()
|
||||
set(CC_MACHINE "")
|
||||
endif()
|
||||
find_library(AVUTIL_LIBRARY avutil
|
||||
HINTS
|
||||
${LIBJAMI_CONTRIB_DIR}/${CC_MACHINE}/lib
|
||||
${LIBJAMI_CONTRIB_DIR}/apple-darwin/lib)
|
||||
|
||||
if(ENABLE_LIBWRAP)
|
||||
list(APPEND LIBCLIENT_HEADERS directrenderer.h)
|
||||
@ -480,7 +481,7 @@ if(NOT(APPLE OR MSVC))
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBWRAP)
|
||||
target_link_libraries(${LIBCLIENT_NAME} qtwrapper ${LIBJAMI_LIB})
|
||||
target_link_libraries(${LIBCLIENT_NAME} qtwrapper)
|
||||
if (NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC"))
|
||||
target_link_libraries(${LIBCLIENT_NAME} ${AVUTIL_LIBRARY})
|
||||
endif()
|
||||
|
||||
@ -554,7 +554,7 @@ void
|
||||
AccountModelPimpl::slotAccountStatusChanged(const QString& accountID,
|
||||
const api::account::Status status)
|
||||
{
|
||||
if (status == api::account::Status::INVALID) {
|
||||
if (status == api::account::Status::STATUS_INVALID) {
|
||||
Q_EMIT linked.invalidAccountDetected(accountID);
|
||||
return;
|
||||
}
|
||||
@ -630,6 +630,10 @@ AccountModelPimpl::slotVolatileAccountDetailsChanged(const QString& accountId,
|
||||
if (new_deviceId != details.end())
|
||||
accountInfo.confProperties.deviceId = new_deviceId.value();
|
||||
|
||||
auto currentProxyServer = details.find(libjami::Account::ConfProperties::PROXY_SERVER);
|
||||
if (currentProxyServer != details.end())
|
||||
accountInfo.confProperties.currentProxyServer = currentProxyServer.value();
|
||||
|
||||
Q_EMIT linked.profileUpdated(accountId);
|
||||
}
|
||||
|
||||
@ -657,7 +661,7 @@ AccountModelPimpl::slotNameRegistrationEnded(const QString& accountId,
|
||||
int status,
|
||||
const QString& name)
|
||||
{
|
||||
account::RegisterNameStatus convertedStatus = account::RegisterNameStatus::INVALID;
|
||||
account::RegisterNameStatus convertedStatus = account::RegisterNameStatus::RNS_INVALID;
|
||||
switch (status) {
|
||||
case 0: {
|
||||
convertedStatus = account::RegisterNameStatus::SUCCESS;
|
||||
@ -674,7 +678,7 @@ AccountModelPimpl::slotNameRegistrationEnded(const QString& accountId,
|
||||
convertedStatus = account::RegisterNameStatus::WRONG_PASSWORD;
|
||||
break;
|
||||
case 2:
|
||||
convertedStatus = account::RegisterNameStatus::INVALID_NAME;
|
||||
convertedStatus = account::RegisterNameStatus::RNS_INVALID_NAME;
|
||||
break;
|
||||
case 3:
|
||||
convertedStatus = account::RegisterNameStatus::ALREADY_TAKEN;
|
||||
@ -695,13 +699,13 @@ AccountModelPimpl::slotRegisteredNameFound(const QString& accountId,
|
||||
const QString& address,
|
||||
const QString& registeredName)
|
||||
{
|
||||
account::LookupStatus convertedStatus = account::LookupStatus::INVALID;
|
||||
account::LookupStatus convertedStatus = account::LookupStatus::LOOKUP_INVALID;
|
||||
switch (status) {
|
||||
case 0:
|
||||
convertedStatus = account::LookupStatus::SUCCESS;
|
||||
break;
|
||||
case 1:
|
||||
convertedStatus = account::LookupStatus::INVALID_NAME;
|
||||
convertedStatus = account::LookupStatus::LOOKUP_INVALID_NAME;
|
||||
break;
|
||||
case 2:
|
||||
convertedStatus = account::LookupStatus::NOT_FOUND;
|
||||
@ -897,7 +901,6 @@ account::Info::fromDetails(const MapStringString& details)
|
||||
confProperties.archivePassword = details[ConfProperties::ARCHIVE_PASSWORD];
|
||||
confProperties.archiveHasPassword = toBool(details[ConfProperties::ARCHIVE_HAS_PASSWORD]);
|
||||
confProperties.archivePath = details[ConfProperties::ARCHIVE_PATH];
|
||||
confProperties.archivePin = details[ConfProperties::ARCHIVE_PIN];
|
||||
confProperties.proxyEnabled = toBool(details[ConfProperties::PROXY_ENABLED]);
|
||||
confProperties.proxyServer = details[ConfProperties::PROXY_SERVER];
|
||||
confProperties.proxyPushToken = details[ConfProperties::PROXY_PUSH_TOKEN];
|
||||
@ -908,6 +911,7 @@ account::Info::fromDetails(const MapStringString& details)
|
||||
confProperties.keepAliveEnabled = toBool(details[ConfProperties::KEEP_ALIVE_ENABLED]);
|
||||
confProperties.bootstrapListUrl = QString(details[ConfProperties::BOOTSTRAP_LIST_URL]);
|
||||
confProperties.dhtProxyListUrl = QString(details[ConfProperties::DHT_PROXY_LIST_URL]);
|
||||
confProperties.proxyListEnabled = toBool(details[ConfProperties::PROXY_LIST_ENABLED]);
|
||||
confProperties.defaultModerators = QString(details[ConfProperties::DEFAULT_MODERATORS]);
|
||||
confProperties.localModeratorsEnabled = toBool(
|
||||
details[ConfProperties::LOCAL_MODERATORS_ENABLED]);
|
||||
@ -961,8 +965,8 @@ account::Info::fromDetails(const MapStringString& details)
|
||||
confProperties.DHT.PublicInCalls = toBool(details[ConfProperties::DHT::PUBLIC_IN_CALLS]);
|
||||
confProperties.DHT.AllowFromTrusted = toBool(details[ConfProperties::DHT::ALLOW_FROM_TRUSTED]);
|
||||
// RingNS
|
||||
confProperties.RingNS.uri = details[ConfProperties::RingNS::URI];
|
||||
confProperties.RingNS.account = details[ConfProperties::RingNS::ACCOUNT];
|
||||
confProperties.RingNS.uri = details[ConfProperties::Nameserver::URI];
|
||||
confProperties.RingNS.account = details[ConfProperties::Nameserver::ACCOUNT];
|
||||
// Jams
|
||||
confProperties.managerUri = details[ConfProperties::MANAGER_URI];
|
||||
confProperties.managerUsername = details[ConfProperties::MANAGER_USERNAME];
|
||||
@ -1009,7 +1013,6 @@ account::ConfProperties_t::toDetails() const
|
||||
details[ConfProperties::ARCHIVE_PASSWORD] = this->archivePassword;
|
||||
details[ConfProperties::ARCHIVE_HAS_PASSWORD] = toQString(this->archiveHasPassword);
|
||||
details[ConfProperties::ARCHIVE_PATH] = this->archivePath;
|
||||
details[ConfProperties::ARCHIVE_PIN] = this->archivePin;
|
||||
// ConfProperties::DEVICE_NAME name is set with DeviceModel interface
|
||||
details[ConfProperties::PROXY_ENABLED] = toQString(this->proxyEnabled);
|
||||
details[ConfProperties::PROXY_SERVER] = this->proxyServer;
|
||||
@ -1020,6 +1023,7 @@ account::ConfProperties_t::toDetails() const
|
||||
details[ConfProperties::ACCOUNT_PUBLISH] = toQString(this->accountPublish);
|
||||
details[ConfProperties::KEEP_ALIVE_ENABLED] = toQString(this->keepAliveEnabled);
|
||||
details[ConfProperties::BOOTSTRAP_LIST_URL] = this->bootstrapListUrl;
|
||||
details[ConfProperties::PROXY_LIST_ENABLED] = toQString(this->proxyListEnabled);
|
||||
details[ConfProperties::DHT_PROXY_LIST_URL] = this->dhtProxyListUrl;
|
||||
details[ConfProperties::DEFAULT_MODERATORS] = this->defaultModerators;
|
||||
details[ConfProperties::LOCAL_MODERATORS_ENABLED] = toQString(this->localModeratorsEnabled);
|
||||
@ -1072,8 +1076,8 @@ account::ConfProperties_t::toDetails() const
|
||||
details[ConfProperties::DHT::PUBLIC_IN_CALLS] = toQString(this->DHT.PublicInCalls);
|
||||
details[ConfProperties::DHT::ALLOW_FROM_TRUSTED] = toQString(this->DHT.AllowFromTrusted);
|
||||
// RingNS
|
||||
details[ConfProperties::RingNS::URI] = this->RingNS.uri;
|
||||
details[ConfProperties::RingNS::ACCOUNT] = this->RingNS.account;
|
||||
details[ConfProperties::Nameserver::URI] = this->RingNS.uri;
|
||||
details[ConfProperties::Nameserver::ACCOUNT] = this->RingNS.account;
|
||||
// Manager
|
||||
details[ConfProperties::MANAGER_URI] = this->managerUri;
|
||||
details[ConfProperties::MANAGER_USERNAME] = this->managerUsername;
|
||||
@ -1090,7 +1094,6 @@ AccountModel::createNewAccount(profile::Type type,
|
||||
const QString& displayName,
|
||||
const QString& archivePath,
|
||||
const QString& password,
|
||||
const QString& pin,
|
||||
const QString& uri)
|
||||
{
|
||||
// Get the template for the account type to prefill the details
|
||||
@ -1117,7 +1120,6 @@ AccountModel::createNewAccount(profile::Type type,
|
||||
details[ConfProperties::ALIAS] = displayName;
|
||||
details[ConfProperties::UPNP_ENABLED] = "true";
|
||||
details[ConfProperties::ARCHIVE_PASSWORD] = password;
|
||||
details[ConfProperties::ARCHIVE_PIN] = pin;
|
||||
details[ConfProperties::ARCHIVE_PATH] = archivePath;
|
||||
|
||||
// Override the username with the provided URI if it's a SIP account
|
||||
|
||||
@ -42,13 +42,13 @@ namespace account {
|
||||
Q_NAMESPACE
|
||||
Q_CLASSINFO("RegisterEnumClassesUnscoped", "false")
|
||||
|
||||
enum class Type { INVALID, JAMI, SIP };
|
||||
enum class Type { TYPE_INVALID, JAMI, SIP };
|
||||
Q_ENUM_NS(Type)
|
||||
|
||||
#pragma push_macro("REGISTERED")
|
||||
#undef REGISTERED
|
||||
|
||||
enum class Status { INVALID, ERROR_NEED_MIGRATION, INITIALIZING, UNREGISTERED, TRYING, REGISTERED };
|
||||
enum class Status { STATUS_INVALID, ERROR_NEED_MIGRATION, INITIALIZING, UNREGISTERED, TRYING, REGISTERED };
|
||||
Q_ENUM_NS(Status)
|
||||
|
||||
static inline account::Status
|
||||
@ -65,7 +65,7 @@ to_status(const QString& type)
|
||||
else if (type == "ERROR_NEED_MIGRATION")
|
||||
return account::Status::ERROR_NEED_MIGRATION;
|
||||
else
|
||||
return account::Status::INVALID;
|
||||
return account::Status::STATUS_INVALID;
|
||||
}
|
||||
|
||||
#pragma pop_macro("REGISTERED")
|
||||
@ -108,6 +108,7 @@ struct ConfProperties_t
|
||||
QString archivePin;
|
||||
bool proxyEnabled;
|
||||
QString proxyServer;
|
||||
QString currentProxyServer;
|
||||
QString proxyPushToken;
|
||||
bool peerDiscovery;
|
||||
int dhtPort;
|
||||
@ -117,6 +118,7 @@ struct ConfProperties_t
|
||||
bool keepAliveEnabled;
|
||||
QString bootstrapListUrl;
|
||||
QString dhtProxyListUrl;
|
||||
bool proxyListEnabled;
|
||||
QString defaultModerators;
|
||||
bool localModeratorsEnabled;
|
||||
VectorMapStringString credentials;
|
||||
@ -202,7 +204,7 @@ enum class DeviceAuthState {
|
||||
Q_ENUM_NS(DeviceAuthState)
|
||||
|
||||
enum class DeviceLinkError {
|
||||
WRONG_PASSWORD, // auth_error, invalid_credentials
|
||||
WRONG_DEVICE_PASSWORD, // auth_error, invalid_credentials
|
||||
NETWORK, // network
|
||||
TIMEOUT, // timeout
|
||||
STATE, // state
|
||||
@ -216,7 +218,7 @@ inline DeviceLinkError
|
||||
mapLinkDeviceError(const std::string& error)
|
||||
{
|
||||
if (error == "auth_error" || error == "invalid_credentials")
|
||||
return DeviceLinkError::WRONG_PASSWORD;
|
||||
return DeviceLinkError::WRONG_DEVICE_PASSWORD;
|
||||
if (error == "network")
|
||||
return DeviceLinkError::NETWORK;
|
||||
if (error == "timeout")
|
||||
@ -232,40 +234,40 @@ inline QString
|
||||
getLinkDeviceString(DeviceLinkError error)
|
||||
{
|
||||
switch (error) {
|
||||
case DeviceLinkError::WRONG_PASSWORD:
|
||||
case DeviceLinkError::WRONG_DEVICE_PASSWORD:
|
||||
return QObject::tr(
|
||||
"An authentication error occurred.\nPlease check credentials and try again.");
|
||||
"An authentication error occurred while linking the device. Please check credentials and try again.");
|
||||
case DeviceLinkError::NETWORK:
|
||||
return QObject::tr("A network error occurred.\nPlease verify your connection.");
|
||||
return QObject::tr("A network error occurred while linking the account. Please verify your connection and try again.");
|
||||
case DeviceLinkError::TIMEOUT:
|
||||
return QObject::tr("The operation has timed out.\nPlease try again.");
|
||||
return QObject::tr("The operation timed out. Please try again.");
|
||||
case DeviceLinkError::STATE:
|
||||
return QObject::tr("An error occurred while exporting the account.\nPlease try again.");
|
||||
return QObject::tr("An error occurred while exporting the account. Please try again.");
|
||||
case DeviceLinkError::CANCELED:
|
||||
return QObject::tr("Operation was canceled.");
|
||||
return QObject::tr("The operation was canceled by the user.");
|
||||
case DeviceLinkError::UNKNOWN:
|
||||
default:
|
||||
return QObject::tr("An unexpected error occurred.\nPlease try again.");
|
||||
return QObject::tr("An unexpected error occurred while linking the device. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
enum class RegisterNameStatus {
|
||||
SUCCESS = 0,
|
||||
WRONG_PASSWORD = 1,
|
||||
INVALID_NAME = 2,
|
||||
RNS_INVALID_NAME = 2,
|
||||
ALREADY_TAKEN = 3,
|
||||
NETWORK_ERROR = 4,
|
||||
INVALID
|
||||
RNS_INVALID
|
||||
};
|
||||
Q_ENUM_NS(RegisterNameStatus)
|
||||
|
||||
enum class LookupStatus { SUCCESS = 0, INVALID_NAME = 1, NOT_FOUND = 2, ERROR = 3, INVALID };
|
||||
enum class LookupStatus { SUCCESS = 0, LOOKUP_INVALID_NAME = 1, NOT_FOUND = 2, ERROR = 3, LOOKUP_INVALID };
|
||||
Q_ENUM_NS(LookupStatus)
|
||||
|
||||
struct Info
|
||||
{
|
||||
QString registeredName;
|
||||
Status status = account::Status::INVALID;
|
||||
Status status = account::Status::STATUS_INVALID;
|
||||
std::unique_ptr<lrc::api::CallModel> callModel;
|
||||
std::unique_ptr<lrc::api::ContactModel> contactModel;
|
||||
std::unique_ptr<lrc::api::ConversationModel> conversationModel;
|
||||
|
||||
@ -201,7 +201,6 @@ public:
|
||||
const QString& displayName = "",
|
||||
const QString& archivePath = "",
|
||||
const QString& password = "",
|
||||
const QString& pin = "",
|
||||
const QString& uri = "");
|
||||
|
||||
/**
|
||||
|
||||
@ -191,8 +191,9 @@ public:
|
||||
* Remove a conversation and the contact if it's a dialog
|
||||
* @param uid of the conversation
|
||||
* @param banned if we want to ban the contact.
|
||||
* @param keepContact if we want to keep the contact. New conversation could be created
|
||||
*/
|
||||
void removeConversation(const QString& uid, bool banned = false);
|
||||
void removeConversation(const QString& uid, bool banned = false, bool keepContact = false);
|
||||
/**
|
||||
* Get the action wanted by the user when they click on the conversation
|
||||
* @param uid of the conversation
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user