1
0
Fork 0
mirror of https://git.jami.net/savoirfairelinux/jami-client-qt.git synced 2025-03-28 14:56:19 +01:00

packaging: add global installation support for linux

- avoid using fixed paths and find LRC either when globally installed or located in custom directory
- add installation rules for binaries, .desktop files, .appdata.xml, logo and doc
- add support for generating and copying runtime files (webresources and translations)
- add launcher script (client qt/gnome/kde selector)
- add uninstall support
- add missing sources (moderatorlistmodel)
- update README

Gitlab: #160, #230, #263, #264

Change-Id: I3fee77a917be038072a20c7f99b510f9a8bf65b4
This commit is contained in:
ababi 2021-01-12 17:26:52 +01:00 committed by Albert Babí Oller
parent b55be608f3
commit 69db8684a1
16 changed files with 1206 additions and 70 deletions

View file

@ -12,24 +12,11 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(SRC_DIR ${CMAKE_SOURCE_DIR}/src)
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
set(QML_RESOURCES ${CMAKE_SOURCE_DIR}/resources.qrc)
set(QML_RESOURCES_QML ${CMAKE_SOURCE_DIR}/qml.qrc)
if(NOT DEFINED LRC)
set(LRC ${CMAKE_CURRENT_SOURCE_DIR}/../install/lrc)
set(LRCPATH ${LRC}/include/libringclient)
set(LRCLIBDIR ${LRC}/lib)
else()
set(LRCPATH ${LRC}/src)
if (NOT DEFINED LRCBUILD)
set(LRCLIBDIR ${LRC}/build)
else()
set(LRCLIBDIR ${LRCBUILD})
endif()
endif()
set(QML_RESOURCES ${PROJECT_SOURCE_DIR}/resources.qrc)
set(QML_RESOURCES_QML ${PROJECT_SOURCE_DIR}/qml.qrc)
set(QML_LIBS
Qt5::Quick
@ -80,7 +67,8 @@ set(COMMON_SOURCES
${SRC_DIR}/qmlregister.cpp
${SRC_DIR}/utilsadapter.cpp
${SRC_DIR}/dbuserrorhandler.cpp
${SRC_DIR}/xrectsel.c)
${SRC_DIR}/xrectsel.c
${SRC_DIR}/moderatorlistmodel.cpp)
set(COMMON_HEADERS
${SRC_DIR}/avatarimageprovider.h
@ -130,7 +118,8 @@ set(COMMON_HEADERS
${SRC_DIR}/qtutils.h
${SRC_DIR}/utilsadapter.h
${SRC_DIR}/dbuserrorhandler.h
${SRC_DIR}/xrectsel.h)
${SRC_DIR}/xrectsel.h
${SRC_DIR}/moderatorlistmodel.h)
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBNM libnm)
@ -140,66 +129,169 @@ if(LIBNM_FOUND)
endif()
if(QT5_VER AND QT5_PATH)
string(REPLACE "." ";" VERSION_LIST ${QT5_VER})
list(GET VERSION_LIST 0 QT5_VER_MAJOR)
list(GET VERSION_LIST 1 QT5_VER_MINOR)
list(GET VERSION_LIST 2 QT5_VER_PATCH)
string(REPLACE "." ";" VERSION_LIST ${QT5_VER})
list(GET VERSION_LIST 0 QT5_VER_MAJOR)
list(GET VERSION_LIST 1 QT5_VER_MINOR)
list(GET VERSION_LIST 2 QT5_VER_PATCH)
if ((${QT5_VER_MAJOR} GREATER_EQUAL 5) AND (${QT5_VER_MINOR} GREATER_EQUAL 14))
message(STATUS "Using custom Qt version")
find_package(Qt5 ${QT5_VER} REQUIRED
COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
endif()
if((${QT5_VER_MAJOR} GREATER_EQUAL 5) AND (${QT5_VER_MINOR} GREATER_EQUAL 14))
message(STATUS "Using custom Qt version")
find_package(Qt5 ${QT5_VER} REQUIRED COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
find_package(Qt5LinguistTools ${QT5_VER}
PATHS ${QT5_PATH} NO_DEFAULT_PATH)
endif()
else()
find_package(Qt5 REQUIRED
COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus)
find_package(Qt5 REQUIRED COMPONENTS
Core
Quick
QuickWidgets
Network
Svg
QuickControls2
WebEngine
DBus)
find_package(Qt5LinguistTools)
endif()
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
# If LRC is not globally installed, it's path should be specified
# by setting variable LRC. If library is not inside LRC + suffixes
# lib, build or build-local, it's path should be set with LRCLIB.
if(DEFINED LRC)
if(EXISTS ${LRC}/include/libringclient)
set(LRC_SRC_PATH ${LRC}/include/libringclient)
else()
set(LRC_SRC_PATH ${LRC}/src)
endif()
if(NOT DEFINED LRCLIB)
set(LRCLIB ${LRC})
endif()
find_library(ringclient ringclient
PATHS ${LRCLIB}
PATH_SUFFIXES lib build build-local NO_DEFAULT_PATH)
message("Will expect lrc library in ${LRCLIB} (including \
subdirs /lib, /build and /build-local)")
set(LRC_LIB_NAME ${ringclient})
else()
find_package(LibRingClient REQUIRED)
if (LibRingClient_FOUND)
set(LRC_SRC_PATH ${LIB_RING_CLIENT_INCLUDE_DIR})
set(LRC_LIB_NAME ${LIB_RING_CLIENT_LIBRARY})
else()
message("lrc not found!")
endif()
endif()
include_directories(${CMAKE_CURRENT_SOURCE_DIR}
${SRC_DIR}
${LRCPATH}
${LIBNM_INCLUDE_DIRS})
message("Will expect lrc headers in ${LRC_SRC_PATH}")
link_libraries(${LIBNM_LIBRARIES})
include_directories(${PROJECT_SOURCE_DIR}
${SRC_DIR}
${LRC_SRC_PATH}
${LIBNM_INCLUDE_DIRS})
add_executable(${PROJECT_NAME}
${SRC_DIR}/main.cpp
${COMMON_HEADERS}
${COMMON_SOURCES}
${QML_RESOURCES}
${QML_RESOURCES_QML})
${QML_RESOURCES_QML}
${LRC_SRC_PATH}/webresource.qrc)
message(${LRCLIBDIR})
find_library(ringclient ringclient ${LRCLIBDIR} NO_DEFAULT_PATH)
find_library(qrencode qrencode)
find_library(X11 X11)
target_link_libraries(jami-qt
${QML_LIBS}
${ringclient}
${LRC_LIB_NAME}
${qrencode}
${X11}
)
${LIBNM_LIBRARIES})
if(ENABLE_TESTS)
message("Add Jami tests")
add_subdirectory(tests)
endif()
# Installation rules
install(TARGETS jami-qt
RUNTIME DESTINATION bin)
# install .desktop in XDG desktop dir so that it is recognized by the system
install(FILES ${PROJECT_SOURCE_DIR}/jami-qt.desktop
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
# logos
install(FILES images/jami.svg
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps)
install(FILES images/jami-48px.png
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps
RENAME jami.png)
install(FILES images/jami-32px.xpm
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps
RENAME jami.xpm)
install(FILES jami-qt.appdata.xml
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
# install jami launcher that selects between clients
install(
FILES
"${PROJECT_SOURCE_DIR}/src/jami"
DESTINATION
${CMAKE_INSTALL_PREFIX}/bin
PERMISSIONS
WORLD_READ
OWNER_WRITE
OWNER_READ
GROUP_READ
OWNER_EXECUTE
GROUP_EXECUTE
WORLD_EXECUTE)
# add a target to generate API documentation with Doxygen
find_package(Doxygen)
if(DOXYGEN_FOUND)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile @ONLY)
add_custom_target(doc
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc
COMMENT "Generating API documentation with Doxygen" VERBATIM)
# create doc/README.md symlink to README since Doxygen doesn't understand file with no extension
add_custom_command(
TARGET doc
PRE_BUILD
COMMAND ln -sf ${CMAKE_CURRENT_SOURCE_DIR}/README ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.md)
endif(DOXYGEN_FOUND)
# translations
if(Qt5LinguistTools_FOUND)
message("Releasing and copying translation files")
file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
qt5_add_translation(QM_FILES ${TS_FILES})
add_custom_target(translations ALL DEPENDS ${QM_FILES})
install(FILES ${QM_FILES}
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/libringclient/translations")
endif()
# uninstall
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

View file

@ -71,6 +71,9 @@ Then, you can build daemon, lrc and client-qt with:
And you will have the daemon in `daemon/bin/dring` and the client in `client-qt/build-local/jami-qt`. You also can run it with
If you use a Qt version that is not wide-system installed you need to specify its path after the `--qt` flag, i. e., `./make-ring.py --install --qt /home/<username>/Qt/5.15.0/gcc_64
```bash
./make-ring.py --run --qt
```
@ -81,10 +84,23 @@ And you will have the daemon in `daemon/bin/dring` and the client in `client-qt/
cd client-qt
mkdir build
cd build
${YOUR_QT5_gcc64_PATH}/bin/qmake ../jami-qt.pro
make -j9
cmake .. -DQT5_VER=5.15.0 -DQT5_PATH=/home/<username>/Qt/5.15.0/gcc_64 -DLRC=<path_to_lrc> -DCMAKE_INSTALL_PREFIX=<installation_path>
make -j
```
Variables `QT5_VER` and `QT5_PATH` are used to specify version and path for a custom installation of Qt.
If lrc library is installed in a custom directory you can set its path with the variable LRC. Additionally you can specify built library location with `LRCLIB` (otherwise it will seach inside LRC with the suffixes `/lib`, `/build` and `/build-local`).
After the build has finished, you are finally ready to launch jami-qt in your build directory.
If you want to install it to the path provided by `CMAKE_INSTALL_PREFIX` you can run:
```bash
make install
```
If you want more details, or separately build other projects you can check [this page](https://git.jami.net/savoirfairelinux/ring-project/wikis/technical/Build-instructions).
## Building On Native Windows
@ -184,7 +200,6 @@ Only 64-bit MSVC build can be compiled.
```bash
cd client-windows
pandoc -f markdown -t html5 -o changelog.html changelog.md
python make-client.py -d
python make-client.py -b
powershell -ExecutionPolicy Unrestricted -File copy-runtime-files.ps1

View file

@ -0,0 +1,41 @@
# Taken from:
# https://cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F
#
# Copyright (C) 2021 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
exec_program(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
endif(NOT "${rm_retval}" STREQUAL 0)
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
endforeach(file)

View file

@ -195,7 +195,7 @@ def compile_and_copy_web_resources():
print(bcolors.FAIL + "No rcc found!" + bcolors.ENDC)
sys.exit()
lrc_web_resources_path = globalVar.lrc_path + os.sep + 'webresource.qrc'
lrc_web_resources_path = globalVar.lrc_path + os.sep + "src" + os.sep + 'webresource.qrc'
execute_cmd(rcc + ' -binary ' + lrc_web_resources_path +
' -o ' + globalVar.output_path + os.sep + 'webresource.rcc')

10
doc/Doxyfile Normal file
View file

@ -0,0 +1,10 @@
PROJECT_NAME = "jami-qt"
PROJECT_NUMBER =
INPUT = /home/ababi/ring-project/client-qt
RECURSIVE = YES
EXCLUDE = /home/ababi/ring-project/client-qt/build-local
FILE_PATTERNS = *.cpp *.h *.c *.md
INPUT_ENCODING = UTF-8
USE_MDFILE_AS_MAINPAGE = /home/ababi/ring-project/client-qt/doc/README.md
EXTRACT_ALL = YES
EXTRACT_LOCAL_CLASSES = YES

10
doc/Doxyfile.in Normal file
View file

@ -0,0 +1,10 @@
PROJECT_NAME = "@CMAKE_PROJECT_NAME@"
PROJECT_NUMBER = @PROJECT_VERSION@
INPUT = @PROJECT_SOURCE_DIR@
RECURSIVE = YES
EXCLUDE = @PROJECT_BINARY_DIR@
FILE_PATTERNS = *.cpp *.h *.c *.md
INPUT_ENCODING = UTF-8
USE_MDFILE_AS_MAINPAGE = @PROJECT_SOURCE_DIR@/doc/README.md
EXTRACT_ALL = YES
EXTRACT_LOCAL_CLASSES = YES

21
doc/jami-qt.1 Normal file
View file

@ -0,0 +1,21 @@
.\" Manpage for jami-qt.
.TH man 8 "08 April 2021" "1.0" "jami-qt man page"
.SH NAME
jami-qt \- Qt client for jami.net
.SH SYNOPSIS
jami-qt [options]
.SH DESCRIPTION
jami-qt is a qt client for jami.net
.SH OPTIONS
.B \-v, \-\-version
Display the version and exit.
.TP
.B \-d, \-\-debug
Enable debug.
.TP
.B \-h, \-\-help
Display help text and exit.
.SH SEE ALSO
dring(1)
.SH AUTHOR
Alexandre Viau (alexandre.viau@savoirfairelinux.net)

392
images/jami-32px.xpm Normal file
View file

@ -0,0 +1,392 @@
/* XPM */
static char * jami_xpm[] = {
"32 32 357 2",
" c None",
". c #2B5B92",
"+ c #202654",
"@ c #262F5E",
"# c #252C5A",
"$ c #252F5D",
"% c #2865A0",
"& c #2767A2",
"* c #2569A5",
"= c #26305F",
"- c #293868",
"; c #2B4070",
"> c #2B3D6D",
", c #2B3E6E",
"' c #256BA6",
") c #2868A3",
"! c #2171AF",
"~ c #2073B2",
"{ c #1C77B7",
"] c #197ABA",
"^ c #284172",
"/ c #2C4172",
"( c #2D4879",
"_ c #2E4C7E",
": c #2E4B7D",
"< c #2E4E7F",
"[ c #2E4C7D",
"} c #2C5183",
"| c #1A7AB8",
"1 c #2074B0",
"2 c #256CA8",
"3 c #1A79B9",
"4 c #177CBC",
"5 c #147EBF",
"6 c #127FC1",
"7 c #1080C2",
"8 c #265A90",
"9 c #2D497A",
"0 c #2E4779",
"a c #2D4172",
"b c #2D5487",
"c c #2D5386",
"d c #27649A",
"e c #0D85C3",
"f c #1380BD",
"g c #1A7AB7",
"h c #2173AF",
"i c #266CA7",
"j c #117FC2",
"k c #1080C3",
"l c #0F80C3",
"m c #0F81C4",
"n c #0E81C4",
"o c #1F6EAB",
"p c #2E4B7C",
"q c #2E4678",
"r c #2C4070",
"s c #2C4A7C",
"t c #2D568A",
"u c #1F79B3",
"v c #0A8ECC",
"w c #0B8AC8",
"x c #0E85C3",
"y c #147FBD",
"z c #1B79B6",
"A c #2074B1",
"B c #0E81C5",
"C c #147DBE",
"D c #2D4577",
"E c #2C3E6F",
"F c #2B4576",
"G c #2D568B",
"H c #138FCC",
"I c #0A94D3",
"J c #0A91CF",
"K c #0A8DCB",
"L c #0B89C7",
"M c #0E84C2",
"N c #1180C2",
"O c #137EC0",
"P c #157DBE",
"Q c #275D93",
"R c #293B6A",
"S c #2B4E81",
"T c #2C4F82",
"U c #26679C",
"V c #0B9AD9",
"W c #0B98D7",
"X c #0B96D5",
"Y c #0A94D2",
"Z c #0B8DCB",
"` c #1E76B5",
" . c #2172B0",
".. c #2368A2",
"+. c #273261",
"@. c #294374",
"#. c #2A4577",
"$. c #1B86C1",
"%. c #0D9BDB",
"&. c #0C9BDB",
"*. c #0C99D9",
"=. c #0B96D4",
"-. c #1C77B6",
";. c #1F73B1",
">. c #2075B2",
",. c #2079B6",
"'. c #207EBA",
"). c #2080BC",
"!. c #1D85C1",
"~. c #1980B9",
"{. c #1980BA",
"]. c #187FB8",
"^. c #187BB4",
"/. c #1973AD",
"(. c #2069A2",
"_. c #275D94",
":. c #26669C",
"<. c #0F9CDC",
"[. c #0E9CDC",
"}. c #0D9CDC",
"|. c #0C9BDA",
"1. c #0B99D9",
"2. c #0A93D1",
"3. c #1092D0",
"4. c #0E98D8",
"5. c #0E9DDD",
"6. c #109EDE",
"7. c #0F9DDD",
"8. c #0B99D8",
"9. c #0A95D3",
"0. c #0E85C2",
"a. c #1C78B5",
"b. c #2769A4",
"c. c #1D8ECC",
"d. c #0F9EDE",
"e. c #158AC9",
"f. c #1C78B9",
"g. c #1181BF",
"h. c #0B8BC9",
"i. c #0A93D2",
"j. c #0B98D8",
"k. c #1083C1",
"l. c #1E76B3",
"m. c #2676B0",
"n. c #119EDD",
"o. c #0E9BDB",
"p. c #1C78B7",
"q. c #1D77B7",
"r. c #2074B2",
"s. c #1F75B2",
"t. c #1083C0",
"u. c #0B8CCA",
"v. c #1C94D1",
"w. c #168ECD",
"x. c #2073B1",
"y. c #2669A4",
"z. c #2769A5",
"A. c #1D77B4",
"B. c #0B97D6",
"C. c #137FBD",
"D. c #1F85C1",
"E. c #109DDD",
"F. c #1C7BB9",
"G. c #1C78B8",
"H. c #2072B1",
"I. c #2768A3",
"J. c #2C598E",
"K. c #266BA7",
"L. c #1B79B7",
"M. c #0D86C4",
"N. c #0A8FCD",
"O. c #0A96D4",
"P. c #0C9ADA",
"Q. c #0A92D0",
"R. c #157FBD",
"S. c #1196D4",
"T. c #178DCB",
"U. c #1D77B6",
"V. c #2C588C",
"W. c #246EAA",
"X. c #197BB9",
"Y. c #0C87C5",
"Z. c #0A90CE",
"`. c #0C9AD9",
" + c #149EDD",
".+ c #1697D4",
"++ c #1790CD",
"@+ c #1486C3",
"#+ c #1285C3",
"$+ c #0E9ADA",
"%+ c #2866A1",
"&+ c #2D578B",
"*+ c #2370AC",
"=+ c #177DBA",
"-+ c #1095D4",
";+ c #198AC6",
">+ c #207EB7",
",+ c #2674AA",
"'+ c #2A6FA5",
")+ c #2D679A",
"!+ c #2D598D",
"~+ c #2D5488",
"{+ c #2C5A8F",
"]+ c #2A6097",
"^+ c #1A7CB5",
"/+ c #24679E",
"(+ c #2070AB",
"_+ c #1B78B7",
":+ c #28669F",
"<+ c #2172AF",
"[+ c #147FBC",
"}+ c #157FBB",
"|+ c #216EA5",
"1+ c #285689",
"2+ c #2C4272",
"3+ c #2C4171",
"4+ c #2B5C91",
"5+ c #29639A",
"6+ c #27679F",
"7+ c #256BA4",
"8+ c #236EA9",
"9+ c #2172AD",
"0+ c #1F75B1",
"a+ c #187DBA",
"b+ c #1380BE",
"c+ c #0F8ECA",
"d+ c #273B6A",
"e+ c #2A3969",
"f+ c #2C4071",
"g+ c #294E81",
"h+ c #265E95",
"i+ c #2469A5",
"j+ c #28659E",
"k+ c #2D5689",
"l+ c #236FAA",
"m+ c #285D93",
"n+ c #2D4D7F",
"o+ c #2A5B90",
"p+ c #1C79B5",
"q+ c #197BB8",
"r+ c #167EBB",
"s+ c #1082C0",
"t+ c #0F85C2",
"u+ c #0D87C4",
"v+ c #1683C1",
"w+ c #225E91",
"x+ c #2A3A6A",
"y+ c #2A3C6D",
"z+ c #2D4A7C",
"A+ c #2C5488",
"B+ c #2D5588",
"C+ c #2E568B",
"D+ c #1B7AB5",
"E+ c #0B93D1",
"F+ c #1C71AA",
"G+ c #2B3F6F",
"H+ c #2C4374",
"I+ c #2D4B7E",
"J+ c #2C5C94",
"K+ c #2B5C95",
"L+ c #29639B",
"M+ c #0E90CE",
"N+ c #0B94D2",
"O+ c #0C97D5",
"P+ c #0C98D6",
"Q+ c #0C99D7",
"R+ c #1195D3",
"S+ c #266DA8",
"T+ c #256CA7",
"U+ c #2B4B7D",
"V+ c #2D4576",
"W+ c #2D4778",
"X+ c #2D487A",
"Y+ c #2E4A7C",
"Z+ c #2C5B92",
"`+ c #2A6099",
" @ c #2A5D95",
".@ c #2A5F98",
"+@ c #2A609A",
"@@ c #2179B4",
"#@ c #0D9AD8",
"$@ c #0D9BD9",
"%@ c #0E9BD9",
"&@ c #0E9CDA",
"*@ c #0E9CDB",
"=@ c #1691CE",
"-@ c #2B588D",
";@ c #2C568B",
">@ c #2A5F99",
",@ c #2D4678",
"'@ c #2B4475",
")@ c #294576",
"!@ c #274779",
"~@ c #264F83",
"{@ c #2275B1",
"]@ c #1B8AC5",
"^@ c #0F9DDB",
"/@ c #0F9DDC",
"(@ c #1B88C3",
"_@ c #2E4D7F",
":@ c #2E4A7D",
"<@ c #2E5488",
"[@ c #2E5083",
"}@ c #2D4475",
"|@ c #2A3D6D",
"1@ c #1B72AC",
"2@ c #1F75B4",
"3@ c #1496D4",
"4@ c #109EDD",
"5@ c #1E81BA",
"6@ c #2E4A7B",
"7@ c #2E487A",
"8@ c #2E5487",
"9@ c #1D74B1",
"0@ c #117FC1",
"a@ c #187BBB",
"b@ c #1F74B2",
"c@ c #2373AF",
"d@ c #119CDC",
"e@ c #1F7DB6",
"f@ c #2E4778",
"g@ c #2D4375",
"h@ c #2D4173",
"i@ c #2E4F81",
"j@ c #2E5285",
"k@ c #2E5589",
"l@ c #1B77B5",
"m@ c #127FC0",
"n@ c #197ABB",
"o@ c #1F7CB8",
"p@ c #1C81BB",
"q@ c #2B3C6C",
"r@ c #2A3767",
"s@ c #2D4374",
"t@ c #2E497A",
"u@ c #2A5A90",
"v@ c #187ABA",
"w@ c #0F80C4",
"x@ c #1A7ABA",
"y@ c #1C83C0",
"z@ c #0B97D5",
"A@ c #1489C5",
"B@ c #245081",
"C@ c #272F5E",
"D@ c #252D5C",
"E@ c #26629B",
"F@ c #137EBF",
"G@ c #2270AE",
"H@ c #1574AC",
"I@ c #1B78B8",
"J@ c #147DBF",
"K@ c #0D87C5",
"L@ c #1182BF",
"M@ c #167DBB",
"N@ c #1E77B3",
"O@ c #236FAB",
"P@ c #2669A3",
" ",
" . + @ # $ % ",
" & * = - ; > > , ' ) ",
" ! ~ { ] ^ / ( _ : < [ [ [ } | 1 2 ) ",
" 3 4 5 6 7 8 9 _ : 0 a b c c c c d e f g h i ",
" 6 j k l m n o _ p q r s t t t t t u v w x y z A ",
" m m B B m m C _ D E F G G G G G G H I J K L M f ",
" m l k N O P Q > R S T T T T T U V W X Y J Z ",
" 6 5 4 3 ` ...+.@.#.#.#.#.#.#.$.%.&.*.W =.Y ",
" -.;.>.,.'.).!.~.{.].^./.(._.:.<.[.}.%.|.1.W ",
" 2.3.4.}.5.6.7.[.%.8.9.v 0.a.b.c.d.7.5.[.}.&.e.f. ",
" g.h.i.W &.}.7.6.7.[.&.j.I Z k.l.m.n.d.6.d.7.5.o.p.f.q.r. ",
" s.t.u.I W &.[.7.6.7.}.&.W Y u.g.1 v.[.5.7.d.6.d.w.q.f.q.x.y. ",
"z.A.M v 9.8.&.[.7.6.7.}.|.B.2.w C.D.o.%.}.[.5.7.E.F.G.G.q.H.I.J.",
"K.L.M.N.O.*.%.[.7.6.5.}.P.B.Q.L R.S.W *.&.}.}.[.T.` G.G.U. .& V.",
"W.X.Y.Z.X `.}.5.d.d.7.n. +.+++@+#+J I X W `.&.$+>.U.G.G.U. .%+&+",
"*+=+L J X -+;+>+,+'+)+!+~+&+{+]+f L K Q.9.X W ^+/+(+_+f.U.! :+t ",
"<+[+}+|+1+2+3+3+2+4+5+6+7+8+9+0+a+b+e w v Q.c+d+e+3+f+g+h+i+j+k+",
"l+m+n+n+n+n+n+n+n+o+p+q+r+f s+t+u+v+g b+M.w w+x+y+z+n+n+n+n+A+B+",
"C+C+C+C+C+C+C+C+C+C+D+L h.Z v Z.Q.E+,.A q+F+G+/ H+I+C+C+C+C+C+ ",
" J+K+K+K+K+K+K+K+L+M+N+=.=.O+P+Q+R+S+T+U+V+W+X+Y+Z+K+K+J+ ",
" `+ @.@+@+@+@+@@@#@$@%@&@&@*@*@=@-@9 Y+[ _ _ ;@>@ ",
" _ ,@'@)@!@~@{@]@^@^@/@/@/@/@7.(@_@_ _ _ : :@ ",
" <@[@: }@|@1@2@T+3@E.4@4@6.6.6.6.5@: Y+6@7@0 ",
" G t 8@[@9@0@a@b@c@d@7.7.7.7.5.5.[.e@f@V+g@h@ ",
" i@j@k@J.l@m l m@n@x.o@[.[.}.}.}.%.&.&.p@H+q@e+r@ ",
" s@t@u@v@w@B m l O x@! y@&.P.`.1.8.W B.z@A@B@C@D@ ",
" E@-.P 7 m B m k F@3 G@W X O.9.Y 2.J Z.v u.H@ ",
" ! I@J@7 m B m k 5 J v u.w L K@x t.L@ ",
" 3 F@k m B b+M@q+a.N@ ",
" a@O l O@y.P@ ",
" "};

BIN
images/jami-48px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

358
images/jami.svg Normal file
View file

@ -0,0 +1,358 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 116.3 116.3" style="enable-background:new 0 0 116.3 116.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:url(#SVGID_2_);}
.st2{fill:url(#SVGID_3_);}
.st3{fill:url(#SVGID_4_);}
.st4{fill:url(#SVGID_5_);}
.st5{fill:url(#SVGID_6_);}
.st6{opacity:0.4;fill:url(#SVGID_7_);enable-background:new ;}
.st7{fill:url(#SVGID_8_);}
.st8{fill:url(#SVGID_9_);}
.st9{fill:url(#SVGID_10_);}
.st10{fill:url(#SVGID_11_);}
.st11{fill:url(#SVGID_12_);}
.st12{fill:url(#SVGID_13_);}
.st13{fill:url(#SVGID_14_);}
.st14{fill:url(#SVGID_15_);}
.st15{fill:url(#SVGID_16_);}
.st16{opacity:0.2;fill:url(#SVGID_17_);enable-background:new ;}
.st17{fill:url(#SVGID_18_);}
.st18{fill:url(#SVGID_19_);}
.st19{opacity:0.25;fill:url(#SVGID_20_);enable-background:new ;}
.st20{fill:url(#SVGID_21_);}
.st21{fill:url(#SVGID_22_);}
.st22{opacity:0.2;fill:url(#SVGID_23_);enable-background:new ;}
.st23{fill:url(#SVGID_24_);}
</style>
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="69.0328" y1="454.9245" x2="64.4435" y2="449.5703" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<polygon class="st0" points="54.9,55.8 62,55.6 58.4,62.2 "/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="108.534" y1="457.2333" x2="108.534" y2="494.0327" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
<stop offset="0.2165" style="stop-color:#2E5589"/>
<stop offset="0.3608" style="stop-color:#2B5E97"/>
<stop offset="0.5" style="stop-color:#29629C"/>
<stop offset="0.6392" style="stop-color:#2B5E97"/>
<stop offset="0.7835" style="stop-color:#2E5589"/>
<stop offset="0.9296" style="stop-color:#2D4576"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st1" d="M85.5,57.5c26.1,4.2,29.8,10.7,29.8,10.7c0,0.4,0,0.8,0,1.2c0,0.2-0.1,0.4-0.2,0.7c-0.1,0.3-2.7,5.7-19.6,9.3
L85.5,57.5z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="26.7686" y1="496.8278" x2="38.7091" y2="475.5678" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#252B59"/>
<stop offset="8.590000e-02" style="stop-color:#2B3A69"/>
<stop offset="0.2267" style="stop-color:#2E4A7C"/>
<stop offset="0.3658" style="stop-color:#2E5487"/>
<stop offset="0.5" style="stop-color:#2D578C"/>
<stop offset="0.6342" style="stop-color:#2E5487"/>
<stop offset="0.7733" style="stop-color:#2E4A7C"/>
<stop offset="0.9141" style="stop-color:#2B3A69"/>
<stop offset="1" style="stop-color:#252B59"/>
</linearGradient>
<path class="st2" d="M19.8,78.5c-5.9,15.7-2.9,20.6-2.7,21c0.1,0.2,0.2,0.4,0.4,0.5c0.4,0,0.8-0.1,1.2-0.2c0,0,10.7-0.5,23.2-18.3
L19.8,78.5z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="60.8512" y1="424.6486" x2="41.0872" y2="401.5905" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#181844"/>
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
<stop offset="0.1353" style="stop-color:#283261"/>
<stop offset="0.2468" style="stop-color:#2D4172"/>
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
<stop offset="0.5" style="stop-color:#2E4D7F"/>
<stop offset="0.6177" style="stop-color:#2D4576"/>
<stop offset="0.8125" style="stop-color:#273160"/>
<stop offset="1" style="stop-color:#181844"/>
</linearGradient>
<path class="st3" d="M58.8,18.6C44.5,2.9,37.5,3.8,37.1,3.9c-0.2,0-0.5,0.1-0.7,0.2c-0.5,0.2-1,1.8-1,1.8s-3,8.7,9.1,31.9
L58.8,18.6z"/>
<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="99.9721" y1="499.3526" x2="84.7036" y2="450.1664" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#181844"/>
<stop offset="2.840000e-02" style="stop-color:#1E1E4C"/>
<stop offset="0.1353" style="stop-color:#283261"/>
<stop offset="0.2468" style="stop-color:#2D4172"/>
<stop offset="0.3647" style="stop-color:#2E4A7C"/>
<stop offset="0.5" style="stop-color:#2E4D7F"/>
<stop offset="0.6177" style="stop-color:#2D4576"/>
<stop offset="0.8125" style="stop-color:#273160"/>
<stop offset="1" style="stop-color:#181844"/>
</linearGradient>
<path class="st4" d="M71.2,78.8C90.6,101,97.4,99.8,97.4,99.8c0.4,0.1,0.9,0.2,1.3,0.2c0.2-0.1,0.3-0.3,0.4-0.5
c0.3-0.4,5.8-9.4-12.8-41.8L71.2,78.8z"/>
<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="31.6447" y1="457.2331" x2="31.6447" y2="494.0317" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="7.040000e-02" style="stop-color:#2D4576"/>
<stop offset="0.2165" style="stop-color:#2E5589"/>
<stop offset="0.3608" style="stop-color:#2B5E97"/>
<stop offset="0.5" style="stop-color:#29629C"/>
<stop offset="0.6392" style="stop-color:#2B5E97"/>
<stop offset="0.7835" style="stop-color:#2E5589"/>
<stop offset="0.9296" style="stop-color:#2D4576"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st5" d="M46.1,82.2c-40-1.7-44.8-11.6-45-12.1C1.1,69.9,1,69.7,1,69.5c0.1-0.7,1.5-2,1.5-2s10.6-6.5,28.3-10
L46.1,82.2z"/>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="51.8906" y1="421.1236" x2="66.337" y2="421.1236" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st6" d="M57.6,17.4c-5,5.4-9.6,11.2-13.8,17.2h1c3.1-3.9,10.8-13.7,13.4-16.5L57.6,17.4z"/>
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="70.9709" y1="436.4003" x2="70.9709" y2="401.6908" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#252B59"/>
<stop offset="0.5" style="stop-color:#2D578C"/>
<stop offset="0.6934" style="stop-color:#2D5588"/>
<stop offset="0.8038" style="stop-color:#2E4F80"/>
<stop offset="0.8932" style="stop-color:#2D4474"/>
<stop offset="0.971" style="stop-color:#283463"/>
<stop offset="1" style="stop-color:#252B59"/>
</linearGradient>
<path class="st7" d="M73.8,35.4C84.2,10.7,80.2,5,80.2,5c-0.1-0.3-0.2-0.7-0.3-1c-0.2-0.1-0.4-0.1-0.7-0.2
c-0.5-0.1-11.4-1.5-34.4,30.7L73.8,35.4z"/>
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="39.2669" y1="503.7654" x2="102.6764" y2="407.9172" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="8.239999e-02" style="stop-color:#177EBC"/>
<stop offset="0.1675" style="stop-color:#0E91D1"/>
<stop offset="0.2527" style="stop-color:#10A2E1"/>
<stop offset="0.337" style="stop-color:#18ACEA"/>
<stop offset="0.42" style="stop-color:#24B1ED"/>
<stop offset="0.5" style="stop-color:#28B1ED"/>
<stop offset="0.58" style="stop-color:#24B1ED"/>
<stop offset="0.663" style="stop-color:#18ACEA"/>
<stop offset="0.7473" style="stop-color:#10A2E1"/>
<stop offset="0.8325" style="stop-color:#0E91D1"/>
<stop offset="0.9176" style="stop-color:#177EBC"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st8" d="M58,97.4c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8l-17.3-11c7.3-1.6,16.3-10.2,25.7-21.3
L58,97.4z"/>
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="33.568" y1="505.6873" x2="58.683" y2="483.2007" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
<stop offset="0.1808" style="stop-color:#1B79B9"/>
<stop offset="0.3007" style="stop-color:#1080C2"/>
<stop offset="0.5" style="stop-color:#0E81C5"/>
<stop offset="0.6993" style="stop-color:#1080C2"/>
<stop offset="0.8192" style="stop-color:#1B79B9"/>
<stop offset="0.9178" style="stop-color:#246EAB"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st9" d="M58.6,98c-14.2,15.4-21,14.5-21.4,14.5c-0.6-0.2-1.2-0.5-1.7-0.8L17.6,100c7.3-1.6,16.9-9.6,26.3-20.7
L58.6,98z"/>
<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="31.3212" y1="407.2591" x2="89.6399" y2="504.4568" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="1.760000e-02" style="stop-color:#2A6199"/>
<stop offset="0.1407" style="stop-color:#1C79B7"/>
<stop offset="0.2631" style="stop-color:#0A8CCA"/>
<stop offset="0.3837" style="stop-color:#0B97D4"/>
<stop offset="0.5" style="stop-color:#0E9AD8"/>
<stop offset="0.6163" style="stop-color:#0B97D4"/>
<stop offset="0.7369" style="stop-color:#0A8CCA"/>
<stop offset="0.8593" style="stop-color:#1C79B7"/>
<stop offset="0.9824" style="stop-color:#2A6199"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st10" d="M20.7,38c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2l17.3-11c-1.5,7.1,2.3,18,8.2,30.7L20.7,38z"/>
<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="94.4028" y1="503.8655" x2="56.9038" y2="456.6339" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="2.570000e-02" style="stop-color:#2A6199"/>
<stop offset="0.2053" style="stop-color:#1C79B7"/>
<stop offset="0.384" style="stop-color:#0A8CCA"/>
<stop offset="0.5599" style="stop-color:#0B97D4"/>
<stop offset="0.7296" style="stop-color:#0E9AD8"/>
<stop offset="0.7925" style="stop-color:#0B97D4"/>
<stop offset="0.8577" style="stop-color:#0A8CCA"/>
<stop offset="0.9239" style="stop-color:#1C79B7"/>
<stop offset="0.9905" style="stop-color:#2A6199"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st11" d="M57.2,57.2c-8.7,0-17.4,0.7-26,1.9c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41
c0.6-0.2,1.2-0.5,1.7-0.8l17.3-11C87,97.5,70.6,78.2,57.2,57.2z"/>
<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="40.2175" y1="431.0724" x2="32.9164" y2="404.7886" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2C5D95"/>
<stop offset="8.220001e-02" style="stop-color:#246EAB"/>
<stop offset="0.1808" style="stop-color:#1B79B9"/>
<stop offset="0.3007" style="stop-color:#1080C2"/>
<stop offset="0.5" style="stop-color:#0E81C5"/>
<stop offset="0.6993" style="stop-color:#1080C2"/>
<stop offset="0.8192" style="stop-color:#1B79B9"/>
<stop offset="0.9178" style="stop-color:#246EAB"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st12" d="M20.1,38.5c-6.3-16.2-3.2-21.3-3-21.6c0.4-0.5,0.9-0.9,1.4-1.2L36.5,4.1c-1.5,7.1,1.7,18.6,7.6,31.2
L20.1,38.5z"/>
<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="122.9025" y1="448.7971" x2="9.1479" y2="448.7971" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="1.280000e-02" style="stop-color:#256BA7"/>
<stop offset="0.1121" style="stop-color:#0B83C3"/>
<stop offset="0.2115" style="stop-color:#1797D8"/>
<stop offset="0.3099" style="stop-color:#25A3E2"/>
<stop offset="0.4066" style="stop-color:#27ABE7"/>
<stop offset="0.5" style="stop-color:#2AAEEA"/>
<stop offset="0.5934" style="stop-color:#27ABE7"/>
<stop offset="0.6901" style="stop-color:#25A3E2"/>
<stop offset="0.7885" style="stop-color:#1797D8"/>
<stop offset="0.8879" style="stop-color:#0B83C3"/>
<stop offset="0.9872" style="stop-color:#256BA7"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st13" d="M85.5,59.6c13.5,1.9,24.7,4.7,29.8,9.8V48.9c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,59.6z"/>
<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="90.2941" y1="447.1362" x2="122.8074" y2="448.8884" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2E5284"/>
<stop offset="6.100000e-03" style="stop-color:#2E5486"/>
<stop offset="9.120000e-02" style="stop-color:#29649D"/>
<stop offset="0.1876" style="stop-color:#236FAD"/>
<stop offset="0.3049" style="stop-color:#1D77B6"/>
<stop offset="0.5" style="stop-color:#1C78B9"/>
<stop offset="0.6951" style="stop-color:#1D77B6"/>
<stop offset="0.8124" style="stop-color:#236FAD"/>
<stop offset="0.9088" style="stop-color:#29649D"/>
<stop offset="0.9939" style="stop-color:#2E5486"/>
<stop offset="1" style="stop-color:#2E5284"/>
</linearGradient>
<path class="st14" d="M85.5,58.8c13.5,1.9,24.7,5.5,29.8,10.6V48.1c0-0.6-0.1-1.3-0.2-1.9c-0.1-0.3-2.7-5.6-19-9.1L85.5,58.8z"/>
<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="9.0577" y1="447.1912" x2="67.7186" y2="447.1912" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="2.250000e-02" style="stop-color:#256BA7"/>
<stop offset="0.1971" style="stop-color:#0B83C3"/>
<stop offset="0.3718" style="stop-color:#1797D8"/>
<stop offset="0.5447" style="stop-color:#25A3E2"/>
<stop offset="0.7147" style="stop-color:#27ABE7"/>
<stop offset="0.8788" style="stop-color:#2AAEEA"/>
<stop offset="0.9015" style="stop-color:#27ABE7"/>
<stop offset="0.9249" style="stop-color:#25A3E2"/>
<stop offset="0.9487" style="stop-color:#1797D8"/>
<stop offset="0.9728" style="stop-color:#0B83C3"/>
<stop offset="0.9969" style="stop-color:#256BA7"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st15" d="M73.2,35.1c-3-0.1-9.5-0.4-15.1-0.4C7.1,34.7,1.4,46.5,1.2,47C1,47.6,1,48.3,1,48.9v20.6
c5-5,15.9-7.7,29.2-9.7c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C60.8,57.8,76.3,35.2,73.2,35.1z"/>
<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="50.3126" y1="432.0108" x2="28.2664" y2="428.9106" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st16" d="M44.1,33.5c-10.7,0.5-18.4,1.3-24.8,3.1l0.3,0.8c0.6-0.1,1.3-0.3,1.9-0.4c7.7-1.2,15.4-2,23.1-2.3L44.1,33.5
z"/>
<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="72.7451" y1="450.8669" x2="10.4435" y2="442.1056" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st17" d="M73.2,34.3c-3-0.1-9.5-0.4-15.1-0.4c-51.1,0-56.7,11.8-57,12.4C1,46.8,1,47.5,1,48.1v21.4
c5-5,15.9-8.5,29.2-10.5c8.6-1.2,17.2-1.9,25.9-2c1.6,0,3.2,0,4.8,0C63.2,57.1,76.3,34.4,73.2,34.3z"/>
<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="101.6202" y1="407.733" x2="71.9933" y2="458.7571" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="0.1238" style="stop-color:#177EBC"/>
<stop offset="0.2516" style="stop-color:#0E91D1"/>
<stop offset="0.3797" style="stop-color:#10A2E1"/>
<stop offset="0.5064" style="stop-color:#18ACEA"/>
<stop offset="0.631" style="stop-color:#24B1ED"/>
<stop offset="0.7513" style="stop-color:#28B1ED"/>
<stop offset="0.7911" style="stop-color:#24B1ED"/>
<stop offset="0.8324" style="stop-color:#18ACEA"/>
<stop offset="0.8743" style="stop-color:#10A2E1"/>
<stop offset="0.9167" style="stop-color:#0E91D1"/>
<stop offset="0.959" style="stop-color:#177EBC"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st18" d="M58.2,58.8C72.1,37.9,82.4,16,79.8,4.1l17.3,11c0.5,0.3,1,0.7,1.4,1.2c0.3,0.5,7.1,11.7-20.7,54.5
c-2,3.2-3.9,6.9-4.6,7.2c-4.1-4-12.6-15.6-14.7-18.5C58.3,59.1,58.2,58.8,58.2,58.8z"/>
<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="105.3445" y1="433.3988" x2="94.5575" y2="453.6416" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st19" d="M96.6,37.2c-3.1,7.8-6.8,15.3-11.1,22.4l1.3,0.2c5.5-9.5,8.7-16.5,10.9-22.4L96.6,37.2z"/>
<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="100.6479" y1="408.8533" x2="70.927" y2="464.6275" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st20" d="M78.5,71.4c27.8-42.8,21-54,20.7-54.5c-0.4-0.5-0.9-0.9-1.4-1.2L79.8,4.1c2.5,11.8-7.4,34.6-21.2,55.5
c4.6,7.1,9.4,14,14.5,19.9C74.1,78.3,76.7,74.3,78.5,71.4z"/>
<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="102.9539" y1="410.1097" x2="72.9714" y2="466.375" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2867A2"/>
<stop offset="3.820000e-02" style="stop-color:#2174B1"/>
<stop offset="0.1177" style="stop-color:#0B86C4"/>
<stop offset="0.2081" style="stop-color:#0A94D2"/>
<stop offset="0.3177" style="stop-color:#0C9BDB"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6823" style="stop-color:#0C9BDB"/>
<stop offset="0.7919" style="stop-color:#0A94D2"/>
<stop offset="0.8823" style="stop-color:#0B86C4"/>
<stop offset="0.9618" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2867A2"/>
</linearGradient>
<path class="st21" d="M72.6,80.2c0.1-0.1,0.2-0.1,0.2-0.2c-5.3-6.2-10.2-12.8-14.7-19.7c-0.1,0.1-0.2,0.2-0.2,0.4
C57.9,60.6,67.6,75.9,72.6,80.2z"/>
<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="54.5637" y1="474.0854" x2="62.254" y2="494.9197" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2B3B6A"/>
<stop offset="1" style="stop-color:#2B3B6A"/>
</linearGradient>
<path class="st22" d="M58.2,98.4C57.9,98.1,47.7,86.1,43.1,79l-0.8,0.9C46.9,86.6,52,93,57.6,99L58.2,98.4z"/>
<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="69.1674" y1="452.6575" x2="78.2209" y2="509.0225" gradientTransform="matrix(1 0 0 1 -8.0854 -395.1333)">
<stop offset="0" style="stop-color:#2E5284"/>
<stop offset="2.440000e-02" style="stop-color:#2C5C92"/>
<stop offset="8.880000e-02" style="stop-color:#2075B1"/>
<stop offset="0.1599" style="stop-color:#0B86C4"/>
<stop offset="0.2403" style="stop-color:#0A94D2"/>
<stop offset="0.3378" style="stop-color:#0E9CDA"/>
<stop offset="0.5" style="stop-color:#109EDE"/>
<stop offset="0.6718" style="stop-color:#0C9BDB"/>
<stop offset="0.7751" style="stop-color:#0A94D2"/>
<stop offset="0.8603" style="stop-color:#0B86C4"/>
<stop offset="0.9351" style="stop-color:#2174B1"/>
<stop offset="1" style="stop-color:#2C5D95"/>
</linearGradient>
<path class="st23" d="M72.9,79.9c-5.3-6.2-10.2-12.8-14.7-19.7c-0.5-0.8-1.1-1.6-1.6-2.4c-8.7,0-17.4,0.7-26,1.9
c0.3,0.5,4.3,7.2,7.2,11.7c27.8,42.8,40.8,41.1,41.4,41c0.6-0.2,1.2-0.5,1.7-0.8L98.8,100C91.4,98.4,82.1,90.6,72.9,79.9z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

89
jami-qt.appdata.xml Normal file
View file

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2015-2020 Savoir-faire Linux -->
<component type="desktop-application">
<id>net.jami.Jami</id>
<metadata_license>CC-BY-SA-3.0</metadata_license>
<project_license>GPL-3.0+</project_license>
<name>Jami</name>
<summary>Privacy-oriented voice, video, chat, and conference platform</summary>
<icon type="stock">jami</icon>
<description>
<p>
An end-to-end encrypted secure and distributed voice, video, and
chat communication platform that requires no central server and
leaves the power of privacy and freedom in the hands of users.
</p>
<p>
Jami supports the following key features:
</p>
<ul>
<li>One-to-one conversations</li>
<li>File sharing</li>
<li>Audio calls and conferences</li>
<li>Video calls and conferences</li>
<li>Screen sharing in video calls and conferences</li>
<li>Recording and sending audio messages</li>
<li>Recording and sending video messages</li>
<li>Functioning as a SIP phone software</li>
</ul>
<p>
Client applications for GNU/Linux, Windows, macOS, iOS, Android,
and Android TV are available, making Jami an interoperable and
cross-platform communication framework.
</p>
</description>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
<!-- Maximum caption length is 60 characters -->
<!-- Officially GIF is not an allowed video format, but it appears to work nonetheless -->
<screenshots>
<screenshot type="default">
<caption>Send Audio, Video and Chat messages</caption>
<image type="source" width="1310" height="650">https://dl.jami.net/media-resources/screenshots/jami_linux_audiovideo.png</image>
</screenshot>
<screenshot>
<caption>Easily share desktop contents</caption>
<image type="source" width="1016" height="659">https://dl.jami.net/media-resources/screenshots/jami_linux_screenshare.png</image>
</screenshot>
<screenshot>
<caption>Crystal clear audio calls between Jami users</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/audio-call_web.webm</video>
</screenshot>
<screenshot>
<caption>Conference calls with an unlimited participants</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/conference_web.webm</video>
</screenshot>
<screenshot>
<caption>Encrypted and secure text messaging, no servers</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/chat_web.webm</video>
</screenshot>
<screenshot>
<caption>Send files of all sizes</caption>
<video container="webm" codec="vp9" width="600" height="400">https://dl.jami.net/media-resources/gifs_features/conversiongif_webm/files-share_web.webm</video>
</screenshot>
</screenshots>
<launchable type="desktop-id">jami-qt.desktop</launchable>
<provides><binary>jami-qt</binary><binary>jami</binary></provides>
<categories>
<category>Network</category>
<category>P2P</category>
<category>InstantMessaging</category>
<category>FileTransfer</category>
</categories>
<translation type="gettext">jami-client-qt</translation>
<content_rating type="oars-1.1">
<content_attribute id="social-chat">intense</content_attribute>
<content_attribute id="social-audio">intense</content_attribute>
</content_rating>
<requires><id>net.jami.daemon</id></requires>
</component>

11
jami-qt.desktop Normal file
View file

@ -0,0 +1,11 @@
[Desktop Entry]
Name=Jami
GenericName=Jami
Comment=Jami is a secured and distributed communication software
Exec=jami-qt %u
Icon=jami
StartupNotify=true
Terminal=false
Type=Application
Categories=Network;Telephony;
Keywords=Qt;chat;talk;im;message;voip;

10
jami-qt.desktop.autostart Normal file
View file

@ -0,0 +1,10 @@
[Desktop Entry]
Name=Jami
GenericName=Jami
Comment=Jami is a secured and distributed communication software
Exec=jami-qt
Icon=jami
StartupNotify=true
Terminal=false
Type=Application
Categories=Qt;Network;Telephony;

View file

@ -95,29 +95,48 @@ unix {
QMAKE_CXXFLAGS += -std=c++17
}
INCLUDEPATH += ../src
# Client source path
INCLUDEPATH += $$PWD/src
isEmpty(LRC) {
LRC=$$PWD/../install/lrc
# Default LRC path
isEmpty(LRC) { LRC=$$PWD/../install/lrc }
# Check if LRC is installed or in project dir
exists($${LRC}/include/libringclient) {
INCLUDEPATH += $${LRC}/include/libringclient
LIBDIR = $${LRC}/lib
message(Will expect lrc headers in $${LRC}/include/libringclient)
} else {
INCLUDEPATH += $${LRC}/src
isEmpty(LRCBUILD) {
LIBDIR = $${LRC}/build
message(Will expect lrc headers in $${LRC}/src)
}
# TODO: subdirs should be added as suffixes to $${LRC}
isEmpty(LRCLIB) {
exists($${LRC}/lib) {
LRCLIB = $${LRC}/lib
} else {
LIBDIR = $${LRCBUILD}
LRCLIB = $${LRC}/build-local
}
}
QMAKE_RPATHDIR += $${LIBDIR}
LIBS += -L$${LIBDIR} -lringclient
# Include LRC lib path if custom installation
contains(LRCLIB, .*/usr.*) {
LIBS += -lringclient
message(Will expect lrc library in /usr)
} else {
QMAKE_RPATHDIR += $${LRCLIB}
LIBS += -L$${LRCLIB} -lringclient
message(Will expect lrc library in $${LRCLIB})
}
LIBS += -lqrencode
LIBS += -lX11
CONFIG += link_pkgconfig
PKGCONFIG += libnm
# TODO: set global installation like cmake (correct
# installation paths, desktop files, autostart...)
isEmpty(PREFIX) { PREFIX = /tmp/$${TARGET}/bin }
target.path = $$PREFIX/bin
INSTALLS += target

68
src/jami Normal file
View file

@ -0,0 +1,68 @@
#!/bin/bash
#
# Copyright (C) 2015-2021 Savoir-faire Linux Inc.
# Author: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
# Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
# Author: Albert Babí <albert.babi@savoirfairelinux.com>
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
HAS_KDE=0
HAS_GNOME=0
HAS_QT=0
if type "ring-kde" > /dev/null 2> /dev/null; then
HAS_KDE=1
fi
if type "jami-gnome" > /dev/null 2> /dev/null; then
HAS_GNOME=1
fi
if type "jami-qt" > /dev/null 2> /dev/null; then
HAS_QT=1
fi
# client-qt always top priority
if [ $HAS_QT == "1" ]; then
jami-qt $*
exit $?
fi
# No clients installed
if [ $HAS_KDE == "0" ] && [ $HAS_GNOME == "0" ]; then
echo "Jami not found" >&2
exit 1
fi
# Only one client is installed
if [ $HAS_KDE == "1" ] && [ $HAS_GNOME == "0" ]; then
ring-kde $*
exit $?
elif [ $HAS_KDE == "0" ] && [ $HAS_GNOME == "1" ]; then
jami-gnome $*
exit $?
fi
# Both clients installed: run KDE client if KDE wm is running
# else use the Gnome client.
if [ -z "$(ps aux | grep kwin | grep -v grep)" ]; then
jami-gnome $*
exit $?
else
ring-kde $*
exit $?
fi

View file

@ -293,7 +293,7 @@ Rectangle {
messageWebView.runJavaScript(UtilsAdapter.getStyleSheet(
"chatwin",
UtilsAdapter.qStringFromFile(
":/chatview-windows.css")))
":/chatview-qt.css")))
messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
":/linkify.js"))
messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(