Compare commits

...

214 Commits

Author SHA1 Message Date
9771e291c8 misc: bump daemon submodule
Includes dhtnet bump with UPnP fixes.

Change-Id: I58d6d5e8930e5f830d5273907262e5328b979c59
2024-12-17 16:00:21 -05:00
b37720e27f misc: bump daemon
Change-Id: I58a3e4fff562c336c2a4def7a008c270cf1e9b55
2024-12-09 14:58:33 -05:00
d3a7df2f18 docs: update install readme
- Give a hint on how to troubleshoot the contribs build.
- Add instruction for debugging runtime crashes using GDB.

Change-Id: I6ad931223ce0904fb292a59090d37a2cec422ae8
2024-12-06 16:16:21 -05:00
6093689cc4 update-profile: fix dbus build issue
The dbus build was failing due to updateProfile having an incorrect number of arguments.

Change-Id: I0045554e2fc62851fc2cffdac27c8ab1cb905547
2024-12-06 11:02:56 -05:00
d188284245 update-profile: Handle ProfileReceived Signal for SIP Accounts
Since SIP accounts lack a URI, we need to address scenarios where the daemon includes the accountID in the uri parameter. Refer to 29623 for more details.

Change-Id: Ib58e77dc953269c87d67d4068866c93432d08aae
2024-12-05 11:16:56 -04:00
a01b578099 update-profile: moved to new API for setting Avatar
This change only impacts avatar updates; moving to the new API for updating the displayName is still pending and may require additional work. Specifically, we need to provide the current profile picture path to prevent its removal during the update process.

Change-Id: Idbc1592eda2b533b633cc366c72224f5e1bdce98
2024-12-05 09:33:51 -05:00
04fca1fc75 callparticipantsmodel: fix typo
Change-Id: I32e7aa66466108b8ebac8a472a00f9f08e91a3b6
2024-12-05 09:29:05 -05:00
a5621a1af1 Shortcuts: remove unused shortcut
Change-Id: I28e5ef7dfca2e82fa65e40b2450db8c30a465926
2024-12-04 16:06:36 -05:00
a1c2b8adef account_archive: unify archive file type
When creating an account archive, there would be no default
suffix. Then, when importing the archives, we would filter
for .gz files by name. The goal is to implement a .jami
file extension for archives across all platforms.

Todo: implement custom MIME type for custom icons.

GitLab: #1256
Change-Id: I202ae5670c928f35b0eaf711abf7249ec3f304b9
2024-12-04 16:05:59 -05:00
7424227f00 i18n: automatic bump
Change-Id: I32516ba524aa9dec6b9c579f606cccdc7c5dbff8
2024-12-02 16:42:31 -05:00
b69d703e56 macOS: fix qrencode build
Sometimes qrencode failed when built from Jenkins.
This patch:
- Uses cmake for build.
- Automatically detect host architecture if none is specified.

Change-Id: I18dc90099e3b9efc531c7887b00fc615f69c50fa
2024-12-02 14:18:13 -05:00
bfe9128755 updateStatus: prevent status reduction
A very minor adjustment to ensure the status cannot be downgraded.

Change-Id: I1e0fe5461ad05f5cf9f88174b4253e0e63caa3bd
2024-11-29 11:07:33 -05:00
8b17b9e3cf instancemanager.cpp: fix typo
Change-Id: Ib1fb914135056fc4f87c8b0f461219473495c8dc
2024-11-26 23:57:58 -04:00
c2d5c3b764 misc: bump daemon submodule
This includes fixes for Windows and bumps to opendht and dhtnet.

Change-Id: I3deddd747943afe69b8b821ee12f886916fd596f
2024-11-26 16:33:40 -04:00
41f5d151d9 misc: unify terminology
Accept contact request → Accept invitation
Accept in audio → Accept with audio
Accept in video → Accept with video
Automatically answer calls → Automatically answer incoming calls
Decline call request → Decline call
Decline contact request → Decline invitation
Delete your account → Delete account
just now → Just now
Mute → Mute microphone
Type → Conversation type (https://review.jami.net/c/jami-client-android/+/29546)
Unmute → Unmute microphone

Change-Id: Ie88eabeb12514e2b0f0918c8ab77beaa0d90aecf
GitLab: #1730
2024-11-24 05:08:38 -04:00
542bd54c6b read_receipt: add logic when alone in a conversation
No logic was implemented when you were alone in a conversation
(either conv with yourself or swarm with 1 member). This adds
the logic. Currently the receipts will change in swarms
if you add a member.

GitLab: #1867
GitLab: #1017
Change-Id: Iff2ea5978ac988d30edef32d803c0b5b70b11d90
2024-11-21 13:36:36 -05:00
eb60b68747 misc: bump daemon
Change-Id: I67a6f538612ca1e6d8d3d2e4c7b7235472ce4fe3
2024-11-20 16:11:47 -05:00
950e32e9a6 avatars: fix duplication glitch when switching accounts
There was a timing issue between when a new account is connected
and the moment where the avatar cache is cleared. Thus, the ui
would use the cache of the previous account for certain
conversations.

GitLab: #1832
GitLab: #1559
Change-Id: I0319b3d81e0b6dfec9b5408806dfd48ff220ea9d
2024-11-19 14:24:15 -04:00
6ddd6a7f9e misc: bump daemon
Change-Id: Id63f29920e3d13f4082c186df92a90299503cb43
2024-11-18 13:34:21 -05:00
9ab5e52c8d contactmodel: look up name at most once per peer
The ContactModel::bestNameForContact function currently performs a
lookup on the name server every time it is called if its argument is the
URI of a peer which isn't a contact and doesn't have a registered name.
This patch modifies the function's behavior so that it doesn't perform
more than one lookup per peer, thus preventing the server from getting
spammed with large numbers of unnecessary requests.

GitLab: #1882
Change-Id: I7b7ef6a41d3db1001fc1418f8f35bd06b0932624
2024-11-18 10:36:59 -05:00
56401d4125 swarms: add camera MRL for host
When starting a swarm call with video, the MRL for the host
wasn't set. Thus, the camera button would appear muted and
starting/stopping video would have unintended behavior.

GitLab: #1869

Change-Id: I6ee2204d5b49b856bfc72fb560f6623f9c7c874f
2024-11-18 10:15:04 -05:00
7fdd2f5740 add_contact: refactor and change behavior
Change-Id: Ie8cfa5a39b25cd34c7706596a1c607dd1b8c8060
2024-11-14 17:27:34 -05:00
0f7e33cf33 misc: bump daemon
Change-Id: I37dc0b49217a2262ebf27ac83f4788b81b62fbbc
2024-11-12 16:38:38 -05:00
73258efdf7 i18n: automatic bump
Change-Id: Ice4cf7f5f34603b131e3ee070e141e9a2d196658
2024-11-11 16:42:30 -05:00
a29d5f791f message_bar: unify layout to be more coherent
The goal of this patch is to make the messagebar (and more broadly
the chatViewFooter) more coherent in its behavior and look/feel.

GitLab: #1846
GitLab: #1848
GitLab: #1639
GitLab: #1420
Change-Id: I0d0ed207df9eba50f724c69fa49f956dc8aaa573
2024-11-06 17:19:08 -05:00
5186c27325 chatview: fix issue with layout stacking
When the conversationview was resized horizontally to be small enough
so that only one pane is visible, the chatview header and footer would be visible, but clicking them would interact with the objects of
the pane below (the left side panel)

GitLab: #1868

Change-Id: Ic1fac91ef30fcc3078223e1705f10c8a112c2091
2024-11-06 15:31:00 -05:00
7e926a3e23 misc: ux/ui rename “swarm” to “group”
A(n) [type] error occurred while {verb} {noun}
createSwarm → createGroup → newGroup
Create swarm → Create new group
startSwarm → startGroup → newGroup
Start swarm → Create new group
swarmName → groupName
Swarm name → Group name

Change-Id: I9cb6f7b124d3db193bd190d2e52b5b27ea10ecf3
GitLab: #1845
2024-11-06 11:32:47 -05:00
93cde493d8 user_search: fix issue with user display incorrectly being updated
When searching for a user, if the user was found, a signal would be
sent to update the display name with incorrect formatting across the
application.

Change-Id: I20a453e2eddf1e1a402985ff741c8e7c7ea6f99f
2024-11-06 09:16:53 -05:00
cb829676e3 file_attachments: fix behaviour when changing conversations
Fixes an issue where the files that were loaded are not cleared
when switching conversations. Implements the correct behavior
for restoring the files as was done with text drafts.

GitLab: #1847
GitLab: #1528

Change-Id: Id04c9820d08f25ef247002da66d99ae893d8495a
2024-11-06 09:15:08 -05:00
112c6a4d7a chatview: disable visibility of sidepanel when adding contact
GitLab: #1871

Change-Id: I1949c0da388c637123801db39310a1c9fd8c7b99
2024-11-05 16:19:55 -05:00
188f487695 chatview: change visibility of reply component
Make it so that the reply/more/share buttons are visible
whenever the cursor hovers over the horizontal area
that a message takes up. Add message highlighting.
Fix small issue with "more" button not being deselected
after choosing an emoji

GitLab: #1870

Change-Id: I4db5230c2a50ce4640eececc69f8e88348356d79
2024-11-05 16:19:19 -05:00
0af01cc62d i18n: automatic bump
Change-Id: I552add4e22956ac7c9b8fd50704a9612e32c133e
2024-11-04 16:42:41 -05:00
a8acc71830 msi-installer: deploy VC CRT files locally with the application
This avoids merge modules which may crush system runtimes files. We've had several issues packaging vc_redist binaries also, so this seems to a better option for now.

Gitlab: #1865
Change-Id: I9ac3d3a1945136d7f78cf5be2de5d05cf377e126
2024-11-04 11:49:03 -05:00
eaf409d6d3 msi-installer: reformat xml
Switches formatter to one not dependant on JDK
- https://github.com/DotJoshJohnson/vscode-xml
- {
      "xmlTools.xmlFormatterImplementation": "v2",
      "xmlTools.splitAttributesOnFormat": true,
  }

Gitlab: #1453
Gitlab: #1865
Change-Id: I82e65d3097ac366f7873ac4c0e1d5beed3ee486e
2024-11-04 12:48:41 -04:00
42e3eeabf6 msi-installer: remove deployment of Windows 7 support runtimes
Gitlab: #1873
Change-Id: I239566f4cfa4dfbdfd08ccc496aa0bc206ece855
2024-11-04 12:47:54 -04:00
41cb6528c2 misc: unify terminology
{Noun} {verb} successfully
A(n) [type] error occurred while [attempting to] {verb} {noun}.
placeAudioCall → startAudioCall
placeVideoCall → startVideoCall
reconnectTry → reconnectAttempt

Change-Id: I918961894fc23989920727009031cc6a2ac1d8f3
GitLab: #1730
2024-11-01 15:30:44 -04:00
b6aa9eedfa misc: update jami.appdata.xml
<image> tag must be before <caption> tag
To translate <description>, tag must include xml:lang
Update URL addresses
Update description to include extensions, JAMS etc

GitLab: #1262

Change-Id: I8b313a02b119f5ddeaa2b9d760cac7ac5c147b7a
2024-11-01 15:14:02 -04:00
3c1b2c22b2 misc: bump daemon
Change-Id: Ica8a83b1ab8a7deaabec41f7fa6a1b72963913c5
2024-10-31 20:40:21 -04:00
fb660b928f about-dialog: only show the project versions if available
This is a workaround for an issue that occurs due to the way Linux
packaging is done, where the git repository is not available in the
build source at configure time, which is when the version files are
generated, so we prevent a "." from being displayed if the version
string is not available.

Gitlab: #1857
Change-Id: I2f6a281eb89ec0f977749d135da68fe5b7c9c2da
2024-10-31 17:23:07 -04:00
2f163846c7 i18n: automatic bump
Change-Id: Idbcacb51bb113174f455221f0b340bde571c9d35
2024-10-28 16:42:27 -04:00
c6f79f4132 misc: bump daemon
Change-Id: I1dc5b074a171311610fd884b6f9e2a26ad8a6395
2024-10-23 16:40:02 -04:00
6b9cb684ec call_notifications: fix editable state of call notifications
Text message notificaitons sent regarding the status of a call
(i.e. busy, call lasted xx:yy mins, etc) were editable due to being
a TextEdit and not a Text

Change-Id: I9ded20a9b4dbdbaee034b0de6ae42e1eca2c02a0
2024-10-23 09:53:55 -04:00
1d0fa772e2 UI : fix bi-colour message telling there was a call
setting message opacity to 1 to only have the messageInBgColor

Gitlab: #1799

Change-Id: I37d0a354412ec8f2e7127203a2d0adf185674cea
2024-10-23 09:52:38 -04:00
51c716d718 misc: bump daemon
Change-Id: I6fad7b305754f86b602a204977de1d8ed0add0ad
2024-10-22 16:00:39 -04:00
5e4556f786 snap: fix build error
GitLab: #1862
Change-Id: If7f13cc16c02d823dd98af84007b24a829579262
2024-10-22 13:35:30 -04:00
da667056fd About: fix binding loop
"anchors.centerIn: parent" caused a binding loop
with parent implicitHeight using contentHeight in Control.qml
Removing "anchors.centerIn: parent" fixed the warning while the
popup remains in the center of the page

Gitlab: #1508

Change-Id: I0d05597100e4c2b306180e83a7b88b6d5ee22f40
2024-10-22 12:10:22 -04:00
9d00c4f4e3 chatview: default view to chat instead of side-panel
When the application window or screen is too small and
the user opens the details side-panel, it will display
over the chat. This change makes it so that switching
conversation's defaults the view back to the chat and not
to the side-panel.

Change-Id: I3cffba24a7d23d7635937329c2078979722031c4
2024-10-22 11:35:11 -04:00
f5743da2d6 username: fix multiple usernames associated to one account
Added logic check to prevent disabled accounts from registering
multiple usernames after being restored from an archive.

https://git.jami.net/savoirfairelinux/jami-client-android/-/issues/1765

Change-Id: I58e3e018c85e335f043f232e391286e716201481
2024-10-21 15:13:19 -04:00
7152b51597 screenshare: fix issue where screenshare didnt close
When joining a callSwarm as a participant, your mediaList would
contain 3 medias if a stream and video were active. The logic
behind this function didn't take that into account. In the future
it would be good to re-write this for arbitrary amounts of
medias.

Change-Id: If128650c535ae8ba9b02ec4738e8ef103f4994df
2024-10-19 10:47:25 -04:00
4a53397561 misc: bump daemon
Change-Id: I8c3de76b2d8e77cd568e904dfd9fbacb3b1899dc
2024-10-19 09:06:54 -04:00
d86a90207a packaging: add Fedora 41
Change-Id: I2baeaecd66af8e4a9e64072e85b5e5ca35c240ad
2024-10-18 16:56:12 -04:00
7b298deee8 packaging: fix Qt build on Fedora 40
GitLab: #1858
Change-Id: Ib0cfa7a1c458faecdb9c82359c182d4debadc6ab
2024-10-18 16:56:02 -04:00
056cf14613 packaging: add Ubuntu 24.10
Change-Id: I8d176e7e2a72e8185442ea81c9c943e6ab5fb912
2024-10-17 10:00:13 -04:00
2e75dd8777 misc: bump daemon
Change-Id: I5e6ff040101d9662cbdbc8e37ccb17c9ed014bc3
2024-10-11 15:58:24 -04:00
8bda8da414 packaging: fix Docker build error
The libpcre3-dev package doesn't exist on Debian testing, which caused
an error when trying to build Dockerfile_debian_testing. Adding the
newer libpcre2-dev package as an alternative in the debian/control file
fixes the issue.

GitLab: #1856
Change-Id: I3f9068a67101597eb2ffe7cb5a358870e7284e5b
2024-10-10 22:13:53 -04:00
b7fb63ae40 versioning: use app/jamicore git SHAs as the version
Currently, the user-facing version number in the about dialog, is a
build-time timestamp that does help us isolate the project versions
accurately. Ultimately, we need to be able to reproduce issues
present in specific versions of Jami. This commit introduces a new
version number in the form: <client_sha>.<jamicore_sha>, allowing
us to reproduce builds more accurately.

Gitlab: #1820
Change-Id: Ie7e20b20da65284e33e745996c410f539b65080c
2024-10-08 16:19:20 -04:00
31bd0392da share message: add share feature
A share feature have been requested to share
to contacts pictures or text received from other contacts
you can access it by hovering the message you want to share

Gitlab: #1830
Change-Id: I2555433417867371161f927e9fc78bb47fec68d3
2024-10-08 14:41:30 -04:00
59f3aa7c44 i18n: automatic bump
Change-Id: Ib77c972963786716b5794baffbeedb5f6b0fd738
2024-10-07 16:46:35 -04:00
9aeb405644 doc: update documentation regarding the install path of libqt on certain os
Change-Id: I684ecb448479059be0a163c29ab8673f908f31a0
2024-10-02 14:51:44 -04:00
9e1d8e3e56 messagebar: move js into js file, simplify markdown editing
This will make the code easier to read/debug and get us closer to
adhering to the coding guidelines regarding QML file length.

Gitlab: #1639
Change-Id: I6d6e9604c4a54e9fe354c0d24ef66b41ebbbff2a
2024-10-02 13:44:51 -04:00
b65774add0 about: add special thanks & translation on credits
git.jami.net/savoirfairelinux/jami-client-android/-/issues/1607

Change-Id: I3e3029550d91adc36c620c80c1f9c8e1de24a74b
2024-10-01 12:00:23 -04:00
c55486988f misc: unify terminology
smart quotes {“,”,’}
remove spaces in keyboard shortcuts, eg Ctrl + F → Ctrl+F
add participant → invite member
A(n) [type] error occurred while [attempting to] {verb} {noun}.
avatar → profile picture
ban → block
join in… → join with…
mute camera → stop camera
plugin → extension
request → invitation
unmute camera → start camera

GitLab: #1730
Change-Id: Ied169aea3b15b341ff467bc838c70da6a3d5050f
2024-10-01 11:06:04 -04:00
39833924af i18n: automatic bump
Change-Id: Ibab0cadf2e8338c3c2e8cb5725c7e630cf37df47
2024-09-30 16:42:30 -04:00
a194e86d7a screenshare: fix bug on certain wayland systems
Fixed logic error which was causing screen sharing to stop working on certain Wayland environments.

GitLab: #1676

Change-Id: Idf3beb97a53d2eb88e082cee710be56c90c6df05
2024-09-26 21:34:39 -04:00
8cfd9bc3fc macos: use clang with c++17 standard
Change-Id: I0bcf97bc3cc338a1e6e182089638e0d62f2994af
2024-09-26 09:53:48 -04:00
bdec942d72 shortcuts: fix unintended menu behavior
Fixed small issue where the button to bring up the keyboard
shortcuts menu would not be brought up if it was previously
hidden or minimized.

Change-Id: I89b021ca7a00c67325c992fde9cd14fbb8b82cf3
2024-09-25 21:49:09 -04:00
35d5595401 searchbar: fix warnings for invalid regular expressions
Certain characters such as @ or < were being treated as invalid
regular expressions and caused warnings to be raised. Added check
for validity of expression.

GitLab: #1628

Change-Id: I8b66ebfcf029cd0568bccdcba96672d9005846a9
2024-09-23 13:29:31 -04:00
7330a87082 JamiSplitView: fix crash for right-to-left languages
GitLab: #1829
Change-Id: I273d23ae5a8cfb38862259ab413a0aa778ab0341
2024-08-23 15:02:15 -04:00
7243b10e81 interaction: move Info implementation to a cpp file
This fixes the no-libwrap build, which was broken by commit
96c00ff019 due to an additional header
file included in interaction.h

GitLab: #1828
Change-Id: Ic3490a64fdc1514e0b6533a380cb7115568ae9f1
2024-08-23 11:13:30 -04:00
964c8e0553 build.py : Added missing dependence pipewire to build.py
libpipewire-0.3-dev is used since commit Ia54dbc512aa87ae1cb1df7c1ffe71c153a4937a2

Change-Id: Ia1299ec938091a844581f8bea3c7c5486bd43f14
2024-08-23 09:30:32 -04:00
96c00ff019 interaction: set body and transferStatus of DATA_TRANSFER messages
This patch adds code in the interaction::Info::init function so that the
"body" and "transferStatus" fields are always set when an Info struct is
constructed for a message of type DATA_TRANSFER.

This removes some code duplication in conversationmodel.cpp, where these
fields were being set as an extra step after construction in three
different places.

It also fixes a bug in the ConversationModelPimpl::slotMessageUpdated
function, which did *not* set the "body" of DATA_TRANSFER messages. The
body was therefore empty instead of containing a file path, which is
what caused the image preview bug described in the following issue:
GitLab: #1671

The patch also reverts a change that was made in the
MessageListModel::update function by commit
d2eba1d91e. This change was a workaround
for the above bug, but it is no longer necessary (and it broke message
deletion, which relies on the body of the deleted message being set to
the empty string).
GitLab: #1825

Change-Id: I5848b93a12c1ef7b3735c5c6db6b32a9bbc4041d
2024-08-22 11:48:48 -04:00
c8716d1113 misc: unify terminology
Start audio call
Start video call
https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1730#note_51880

GitLab: #1730

Change-Id: I976a6ca890c4b28501da9754cbbee012a2993d73
2024-08-21 15:06:15 -04:00
630e5e9fe4 Added a line to thanks volunteers in credits
I added "And the volunteers who contribute to this project!" at the bottom of the credits in the "about Jami" pop-up.
It's already on the jami-client-android version.

Issue #1689 on gitlab

Change-Id: I59967e5b9e1e7eac0519c9b4960692c14c80dab7
2024-08-20 09:58:25 -04:00
f447327c02 i18n: automatic bump
Change-Id: Ia68b3566b33d82ed31401345e397474499339cba
2024-08-13 14:27:22 -04:00
650f98636b misc: bump daemon
Change-Id: I93d6954cb0e30831b8a4cf036b5cc2c3eefa9196
2024-08-13 10:54:57 -04:00
b92cd902b9 packaging: fix Qt build on Debian testing/unstable
This commit adds four patches to fix various issues that were preventing
Qt 6.6.1 from building on Debian testing and Debian unstable. These
patches are backports of fixes that were applied in later versions of
Qt; links to the relevant commits are included in the description at the
top of each patch.

There are also two changes in the Dockerfiles for Debian testing and
Debian unstable:
1) CMake 3.21 is no longer installed via the install-cmake.sh script.
   This is not necessary anymore given that Debian testing and Debian
   unstable now both come with more recent versions of CMake by default
   (3.29 and 3.30 respectively).
2) The libre2-dev package (which is part of the dependencies in
   debian-qt/control) is removed from the Docker image 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 testing and
   unstable (libre2-11) is not compatible with earlier versions due to
   an API change, c.f.
   https://codereview.qt-project.org/c/qt/qtwebengine/+/516094

GitLab: #1822
Change-Id: I763fb6692949052e2a846b3f4ce54619e6d98108
2024-08-13 10:40:20 -04:00
b99c2674b4 tests: fix account accumulation on Linux systems
On non-dockerized Linux systems, the accounts generated during tests are
only cleaned up occassionally. The test suite design implements
consistent account cleanup post test. Accumulation of these accounts
interfere with subsequent test runs, rendering the test suite ineffective.

The main test scripts incorrectly utilize a Jami Windows environment
variable for Linux systems. In adherence with the Jami client design,
this patch utilizes the correct environment variable for Linux systems.
Windows formatted paths were also modified to allow recogntion in Linux
enironments

GitLab: #1801
Change-Id: I633dbd168af1e6d20ccee53d1109cd179bd1a187
2024-08-08 11:48:31 -04:00
1524ba0177 i18n: automatic bump
Change-Id: Ic9bd89443178a6f899caea1383d1621c7cfc4aeb
2024-08-05 16:42:31 -04:00
5503769023 packaging: remove Ubuntu 23.04 (EOL)
Support for Ubuntu 23.04 ended in January 2024.

Change-Id: Ib4a7a045762a391552da69ace333e46f10afdfb9
2024-08-02 11:37:31 -04:00
89354a07e1 conversation model: split logic for SIP and Jami
GitLab: #1794
Change-Id: Ief688df6778fe2758882ff1538371def8ba75d64
2024-07-26 15:46:50 -04:00
69400bee2a misc: bump daemon submodule
Brings in some changes intended to correct/improve CI building
on Windows.

https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1027
Change-Id: I7047cd343b5711adaf4c992b99dc07097e9ff05b
2024-07-26 14:50:10 -04:00
0e07f9cee7 JamiIdentifier: fix binding for Jami ID
GitLab: #1805
Change-Id: Ic847bb61ccb2c75873d91a35cd851caaedaf518d
2024-07-23 11:20:52 -04:00
d2eba1d91e chatview: fix datatransfer messages not showing
99254f8d02 introduced 2 issues:
- transfer messages not notifying the UI
- some file URLs being erased after loading the conversation
This commit addresses both of them.

Gitlab: #1671
Change-Id: I67a003ea1149c27e749efffe496f4c9ce86615ea
2024-07-22 12:10:25 -04:00
78389d8c28 data transfer model: fix warning
Change-Id: Ia4fcc47c9f033a8f136d6f6de0fc4bb666a1cdfc
2024-07-18 14:52:28 -04:00
e6d820850a misc: bump daemon submodule
In addition to integrating the new UPnP code introduced into
dhtnet, this bump also includes numerous bug-fixes:
https://git.jami.net/savoirfairelinux/jami-client-qt/-/issues/1637
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1021
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1033
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1026
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/952
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1025

Change-Id: Ic7242e3dfe14550221d9d0de48ff84605b7fefd8
2024-07-16 14:09:50 -04:00
0a7f9349a9 smartlist: don't display misleading 'last interaction' date
If a conversation has no interactions (which shouldn't happen normally,
but sometimes occurs in practice), then its LastInteractionTimeStamp
will be zero, which causes the last interaction date in the smartlist to
be wrongly displayed as 31/12/1969 or 1/1/1970. This patch adds a check
to prevent this.

GitLab: #1794
Change-Id: I1384d6675c9fcaa1904bb6e1706589305b7618e9
2024-07-12 09:56:50 -04:00
99254f8d02 messagelistmodel: add support for file deletion
+ Add button to delete messages on file transfer
+ Show "Deleted media" on deleted files.
+ Update last interaction
+ Update icon for saving file, we're in 2024, no more floppy disk

Change-Id: I607b1a6beda443db85c60d8cf95a9aae29ce1f7c
GitLab: #1287
2024-07-10 16:00:39 -04:00
010a2c4eea linkdevicedialog: fix what seems to have been a copy-paste error
The "success" property of the wrong component was being set in the
"on-link-device" signal handler. This commit fixes that.

Gitlab: #1788
Change-Id: I99c9abbfa31ea9ea6e7828dbbed0a21081f8be19
2024-07-05 15:56:01 -04:00
61163037d4 misc: bump daemon submodule
This bump will include changes to fix failing builds on Windows.
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1022

Change-Id: Ic34a097fbcea5723c8fe44da9c5887368dce2258
2024-07-04 16:03:20 -04:00
3577982a93 testing: added account switcher box
Change-Id: I76b67b819cd8e028062406b96583a36ae6a6d509
2024-07-04 15:53:04 -04:00
3ad0b92dcd link-preview: use non-ASCII UTF-8 characters in a UTF-8 test
Non-ASCII characters in UTF-8 are encoded with multiple bytes. Testing with these characters ensures that the decoder correctly interprets multi-byte sequences.

Gitlab: #1536
Change-Id: I0a92ee91b6cd26d70daab1f9baef3a9577aee02e
2024-07-04 13:01:02 -04:00
91475c3a3f misc: bump daemon
This fixes a serious issue on version 6.9 of the Linux kernel that is
already impacting some users:
https://git.jami.net/savoirfairelinux/jami-daemon/-/issues/1006

Change-Id: Id78643d51f38799be448034236364f746dbdfb10
2024-06-27 10:59:02 -04:00
9379af23ec callmodel: don't send profile
profile was not saved at reception anymore, this was wasting bandwidth

Change-Id: I3cbc1f1683a1e5a4b14616404cde5e27e07623e5
2024-06-21 14:30:53 -04:00
406a251c85 accountmodel: improve handling for account list reordering
This update fixes an issue where a stale account list might be used
in AccountListModel by synchronizing list invalidation with a newly
introduced signal (accountsReordered). This change prevents a data race
that could occur due to the asynchronous nature of setting the account
order over D-Bus, or when queuing the signal handling for
accountsChanged, which is emitted only once the reordering is saved.

As a result, QAbstractItemModel mutations are now performed within AccountListModel instead of in the UI.

Gitlab: #1638 (Account list in popup is incorrect after selection)
Change-Id: I7ed6eeb45eb319f21e40554f3d023ad24e139a6f
2024-06-10 10:29:24 -04:00
20e2852e44 misc: bump daemon (fixes missing API on macOS)
Change-Id: I9a04c1a87875a15b2d465982ddf5c3fa143a2dc0
2024-06-07 10:20:44 -04:00
3225f90ce8 misc: deploy and use ringtones on macOS
Gitlab: #1619
Change-Id: I7c19dfa4556f4f9dae827a1d0c967c9ebce7cc86
2024-06-04 12:36:41 -04:00
df3e76a1cf interaction: split status and transferStatus
This allow to show the correct sending/sent/state for the interaction
separated from the status of the dataTransfer. Else, we see a sent
check for a file even if the peer didn't receive the file

Change-Id: I15b9f0abc6a26a2ffd007be26827e9a37e859bca
2024-05-31 14:38:26 -04:00
c5e15d26a0 contactmodel: cache profiles for non contacts profile
If we're a member of a group swarm, we will receive profiles from
non contact (the other members of a conversation).
This patch try to get from cache before calling getContact() to be
able to retrieve profiles from non contacts if stored by the daemon

Change-Id: I864f1d5dd9f65232751e170b930606d23241d283
2024-05-31 10:22:12 -04:00
77e019b02b accountmodel: re-add save profile for JAMS account
JAMS account still use AccountProfileReceived

Change-Id: I010d459564a9230b7f06f4be55de668ec3526abd
2024-05-31 10:22:03 -04:00
89bed2bf85 avatar: fix image cropping
Take into consideration the vertical margin when cropping the image.

Change-Id: I140c96f54d2c1ae732bd104fb21ad04d66d97e9a
2024-05-30 15:09:55 -04:00
519871e458 DataTransferMessageDelegate: fix Url not defined
GitLab: #1563
Change-Id: Ie4ec46bbd7adb0fb0abf9da29224d7b87bcf0aa7
2024-05-30 11:45:53 -04:00
0a842042b0 ci/docker: add cppunit
Change-Id: I3abcdfa8d6a32eedbfd99ab0302d18b5bad6dae6
2024-05-30 10:55:55 -04:00
9aeb2377dc packaging: macos: simplify macdeployqt execution
Don't use a post build step, as it's only needed for packaging.

Change-Id: I1be4e7ac8042e1f211b4eeb15bc869e16eda1682
2024-05-29 12:45:41 -04:00
6ad5f4b850 snap: fix wayland scroll
GitLab: #1629
Change-Id: I74a651728c6d2d9c55b39772a11090d60231b3d5
2024-05-29 09:11:51 -05:00
f5c63d24fb packaging: fix opensuse leap 15.5
Change-Id: I555d6722fae688ba25c4eb2266088aeec0240528
2024-05-29 10:10:40 -04:00
5cb34bd31c misc: bump daemon
Change-Id: Id4f6d28423104965827d6b130533412dd918d536
2024-05-29 10:09:30 -04:00
e56a966de1 contactmodel: fix account avatar on link device
We do not need to write an empty profile since the daemon fully
manages the profile. Just update it from cache when new profile
is detected

GitLab: #1627
Change-Id: I31035f0666925d13f339f387e614f148b0eece8b
2024-05-29 10:08:10 -04:00
acc0c97234 contactmodel: fix contact initialization when linking a new device
getContacts() is called before sync is finished. This should be
done like conversations, after first initializing.
This fix the presence showing after sync.

GitLab: #1627
Change-Id: I4ec9b7e34b5bd93b9ae4437e6c6719dbc3b78a98
2024-05-29 10:08:10 -04:00
665af7c0c3 i18n: automatic bump
Change-Id: I1a004c1d7b2ad51eb3e59951f9e7158bc312c313
2024-05-27 16:42:57 -04:00
fa51e042e5 misc: update release name to Astarte
Change-Id: I64e7b601bbadc9055da912a7d6fe2304aa7a5169
2024-05-27 14:29:23 -04:00
3b9fb0bfca misc: bump daemon
Change-Id: I2c515128f5d2958f2e8e598f0bfd92d2ec5f1d1b
2024-05-24 14:40:00 -04:00
3673b0646c conversations: hide call view when swarm call is finished.
In the current implementation, the chatViewContainer of callStackView
is not destroyed for a swarm conference call because there are no
signals for call changes.This patch ensures chatViewContainer is used
when there is no call.

GitLab: #1625
Change-Id: Iefc39b747d92543244d30aa987eda134ff0a03f3
2024-05-24 14:39:20 -04:00
2e2f6423f8 misc: bump daemon
Change-Id: I38901aa3e8b5db4ec14c70f9b6df65a4f43eaad4
2024-05-22 08:58:16 -04:00
28c1cbbb34 call-swarm: follow daemon changes
Change-Id: I32e83c2ccf82be78fbdd6e9932105228dd6dee8b
2024-05-21 08:48:01 -04:00
87c215deb7 i18n: automatic bump
Change-Id: Ic221ee76c9b9310edea106aea28203a36fbe0617
2024-05-20 16:42:34 -04:00
77eddcd962 callmodel: fix bug in getProposed function
GitLab: #1607
Change-Id: I49062e2e02b4d8f39221243dcef49298117e2f9e
2024-05-17 13:22:48 -04:00
043a715c59 systray: restore original behaviour for systrayicon check
In response to an issue that would cause a lost window when minimizing to tray on a system without a systray, commit 316750a introduced a bug for versions of Qt that would return null icon geometry even when the icon was visible. Subsequently, this was byspassed with commit f25e66a which only applied to GNU/Linux systems, leaving the hack inplace for Windows and macOS where the bug had not originally occured.

This commit:
- makes the "MinimizeOnClose" option always visible
- uses Qt's built-in method for "isSystemTrayIconVisible"
- changes the default "MinimizeOnClose" setting to true

Gitlab: #1623
Change-Id: I3b99c7fb952eedea63ae9c12d207ceb3c9bd4988
2024-05-15 16:14:46 -04:00
5bd3ead22d chatview: do not show "Edited" on deleted message
Change-Id: I38b4f45cb3220bc52ab227976acd65a6c2d1ef93
2024-05-13 08:36:10 -04:00
a9aa1cac80 linkdevice: use a white border for the QR code regardless of theme
Change-Id: If177414fbb4223432e5c5769ef51a1b3ad745ce5
2024-05-08 10:26:54 -04:00
409ba70258 i18n: automatic bump
Change-Id: I63bea7d1001aefca8bbb1f8b4556841599fa7e88
2024-05-06 16:42:55 -04:00
dc50f19815 bump minimum macOS version
MacOS 11 is required from qt 6.5

Change-Id: I4cde10a3dccffe5d2b4778ceda5db9d3a20dd447
2024-04-30 11:41:35 -04:00
d83895dcc9 misc: bump daemon
Change-Id: If11353d884129b98652dabae6068d4dfd5222786
2024-04-30 08:23:44 -04:00
e24a3d6a4d packaging: Add Ubuntu 24.04 LTS
Change-Id: I3dc28375adfc9fa20d162f46d8c46f54a28dca7e
2024-04-30 08:23:21 -04:00
06de33e1be packaging: Add Fedora 40
Change-Id: Id7fdb845446cf226061a8eef3523698c1a4967cd
2024-04-30 08:14:38 -04:00
c8fbcd8c6b i18n: automatic bump
Change-Id: I3323e91f731240c5fc2219b3260d46705291d369
2024-04-29 16:42:33 -04:00
31269fe8fc misc: bump daemon
Change-Id: I44793c0aca9850e210be9f616598c4473d0261ba
2024-04-26 18:15:16 -04:00
a676ad395a callmodel: don't turn video on when accepting a call in audio
The function which is responsible for muting the camera when accepting
a call in audio assumes that the call's mediaList has already been
initialized, but this wasn't actually the case. This caused a bug where
the 'Accept in audio' button behaved exactly like the 'Accept in video'
button.

GitLab: #1621
Change-Id: I26251f51862cf5cd9b6d4daaf15270943c0e3c4e
2024-04-25 12:10:28 -04:00
04c71d02e0 snap: build PipeWire from source
This is necessary because we use the core20 base snap, which is built
from Ubuntu 20.04 and therefore doesn't have a recent enough version of
PipeWire available by default.

Change-Id: Id039ec446f4b3f0e89b9ec27f37f81cfd6b3587e
2024-04-19 09:40:44 -04:00
1fe60b9c33 i18n: automatic bump
Change-Id: I593de1332807a18464d4bbff51346980e90f1117
2024-04-16 09:51:34 -04:00
51ef7a83da snapcraft: fix build
Change-Id: I8ac570f0ad859b2ea2ee83ca8fe3927848148ff3
2024-04-16 09:51:17 -04:00
588a8abdac misc: remove some mac-specific compiler warnings
Change-Id: I507637344e781273974fac2482e67556b4473ed3
2024-04-15 21:55:37 -04:00
8a149b6c4f callview: use dynamic loading for call views
This commit replaces a StackLayout with a Loader allowing us to load initial and ongoing call views dynamically based on the current conversation's call state.

This may fix several issues related to conversation loading including a possible uncaught binding loop based on observing CurrentConversation.id changes.

- small header clean up

Change-Id: Idfc723d8b39f19aafb026c19f26590910b5c26cd
2024-04-15 13:24:01 -04:00
6105f4f7ce misc: improve vscode integration
- adds a task to toggle testing configuration
- removes the test run launch configuration (now a task)
- adds macOS support and fixes gtest CMake integration
- removes the IPC launch configuration as it doesn't work correctly without delaying the client

Change-Id: I89e1f3abd0e050e0bcf205f1331596c660dd0d34
2024-04-11 16:04:45 -04:00
92341b27b6 rpm: Exclude vendored libraries from the list of provides
The RPM automatic dependency generator adds provides for all
libraries under %{_libdir}. When vendoring libraries you must disable
this behaviour, otherwise other packages that link against Qt will
not pull in the distro qt packages if jami-libqt is already installed

Change-Id: I3f0a018ea12be7f29d04ca4441cbfdebc2efb909
2024-04-11 08:21:07 -04:00
f39afdac4c misc: add vscode project settings file
- specifies some include paths
- enforces LF eol
- encourages clang-format use
- adds a comment regarding the IPC task

Note: currently GNU/Linux-specific

Change-Id: Ib208aca33026bf1c15a3ef18020805ceb20aa55f
2024-04-10 15:29:00 -04:00
690f2dd85c misc: add vscode task/launch configurations
This is a good start, but will need to be adapted for other platforms and improved over time.

Change-Id: Ib64046e852c3aa9cc9b492d0af8cee33ee1ff5de
2024-04-10 15:19:14 -04:00
bd45d6a406 misc: fix argument warning for non-debug builds
The `test` option is not used in non-debug builds.

Change-Id: I25eef5b414f987ae4acc435213173f8c78390866
2024-04-09 11:26:34 -05:00
5b92e4708a splitviews: fix non-transparent handle hover zone
This commit adds configurable size to the handle, as it will likely be made transparent soon.

Gitlab: #1611

Change-Id: I1574089d57b5993b59e29732e6a0c573ef91f606
2024-04-09 12:24:23 -04:00
63c01f1439 misc: filter some noisy logs
Change-Id: I799e8f66e2008323817c73292f94e8c625564d67
2024-04-08 15:35:31 -04:00
73aeb02ebd misc: bump daemon submodule
Change-Id: I800aad6362be0124a33904b834ff8e04b560d6a8
2024-04-08 15:11:47 -04:00
9d91317089 snap: add libpipewire to build dependencies
Change-Id: Ie2d24de1aabe59c9506786cfb5fa18fcf4e8cad2
2024-04-07 12:32:32 -04:00
474bc5f6a4 incalllocalvideo: allow resizing/changing opacity of local video
This feature was accidentally removed in a recent refactoring of the
local video preview:
https://review.jami.net/c/jami-client-qt/+/27740

Change-Id: I8b621d4f692124311f0807d1bc0be0e96717a499
2024-04-04 11:39:44 -04:00
f5b64e955b i18n: automatic bump
Change-Id: I0589f432edc46aba5effaaca85f1a53df00760dd
2024-04-01 16:42:26 -04:00
b88627d125 misc: bump daemon
Change-Id: Ifcbfe71e3f9d3ab8966ddfa3af8fb70a4d3b0c7d
2024-03-25 08:57:23 -04:00
200978a044 screensharing: add Wayland support
Change-Id: Ida5516630c6f95b16aa45f31ee8111a924273b3f
2024-03-22 10:47:45 -04:00
a673ff9890 chatviewheader: show details panel when syncing
Change-Id: Ifd0caafc6ec6cf10b0a834875e9dcf6daf527868
2024-03-21 10:01:46 -04:00
7803dd0991 i18n: automatic bump
Change-Id: Ic551429e2416c8ae81640a80788d0fa6412c8653
2024-03-18 16:42:27 -04:00
a8a736bc8c misc: bump daemon submodule
Change-Id: Ifb9bca812499d5b324223dc6fabe1a109ded662d
2024-03-12 17:58:13 -04:00
ff7acf9932 localvideo: refactor preview component device control
Change-Id: Ibcd88c5a3c73a0e67f94d70bc420845aa7b8c822
2024-03-12 16:33:21 -04:00
afde816b23 i18n: automatic bump
Change-Id: I50b14a21c3c442f7dd4b805a018d9af11c2c8305
2024-03-11 16:42:29 -04:00
0745c3b798 misc: bump daemon
Change-Id: I5148eabbe57f708dce6d92673d0a86329999a063
2024-03-06 12:07:47 -05:00
1376ee1f4b MessageBar: avoid multiple composing status changed
Change-Id: I6bd2a7d961228584a74a731beb73b291f6c9a6bf
2024-03-05 15:22:42 -05:00
2b03107bd5 ReadStatus: fix visibility for multiple readers
Change-Id: Iff3ff0a9ff7a8d7b175375582e6bd42937a80b1c
2024-03-05 08:40:14 -05:00
cd1ab0ed12 i18n: automatic bump
Change-Id: I08361b0ed6402bde159bea25f250e47086f28115
2024-03-05 08:10:54 -05:00
a13c6ae0e7 ongoingcallpage: resize + change opacity of local preview
This is an experimental feature and is unadvertised for now.

Change-Id: I40aa84f54c135c2060552231d4ed7c2de4976ca3
2024-03-05 08:10:30 -05:00
1ef9a85148 QWK: enforce a min Qt version of 6.6.2 on Windows
This will prevent a graphical issue present when disabling QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS to avoid the Windows 10 top border issue for the frameless window option. This allows us to remove the temp workaround that likely introduces side effects.

Gitlab: #1581
Change-Id: I36801064d31e2380312d73f88233e8ed9b757403
2024-03-04 15:40:18 -05:00
072eafbaf4 presence: show connected with self
GitLab: #1589
Change-Id: Iaa753a5ed9a690a63bba75442a4e04d1c9d9218c
2024-03-04 13:10:41 -05:00
201f3182ca videoview: prevent stale rendered frame from showing on start
Gitlab: #1576
Change-Id: I85d0b18bd15f531b1d029de1f0a88dea2d34a4c4
2024-02-29 16:10:53 -05:00
23130a5752 misc: bump daemon (contains fixes for Windows build)
Change-Id: If2d7f3879f15dd8e9d54544793e68958a5c16cd8
2024-02-29 16:10:47 -05:00
f28d47bc51 misc: bump daemon
Change-Id: Id32a2a306fd80a2d009f96117f06c8ea860df835
2024-02-29 11:19:14 -05:00
ee7818eefb AccountListModel: avoid calling getAccountList when unneeded
Gitlab: #1459
Change-Id: I962f38935acd8e97895587076a448125213fc4bc
2024-02-29 09:24:35 -05:00
f25e66aa6a utilsadapter: avoid wrong geometry when getting systray visibility
Change-Id: I05d9770b7198e784356c10164c935b0844cd53b0
2024-02-29 09:13:38 -05:00
79b19aec01 conversation: use account config for send typing indicator
git.jami.net/savoirfairelinux/jami-daemon/-/issues/951

Change-Id: I0d952d6916ad5c4a8c51cbb80998f46665af9141
2024-02-29 09:13:06 -05:00
4c92cb9936 chatview: add check for last sent message
Change-Id: I233d5df05432371adf6b2bdf8e8de25bd7e65058
2024-02-29 09:12:58 -05:00
1c81553245 conversationmodel: do not add wrong call to wrong conversation
GitLab: #1578
Change-Id: Ibe980844acf1b44afb0ea6aa0e105ffa99e5c36f
2024-02-29 09:12:32 -05:00
5c2fec53da conversationmodel: avoid to emit needsHost multiple time
Only do it for current account, this avoid to emit needsHost() for
all accounts with the same conversation

GitLab: #1579
Change-Id: I147b2f72fd4c1000949500309eae1970cdbd033f
2024-02-29 09:12:03 -05:00
f706abe5a6 CallMessageDelegate: do not show button to join current call
GitLab: #963
Change-Id: If26b9413e5a94e1b9da0842b84eaf8019b08140f
2024-02-29 08:55:41 -05:00
610c27f751 contactmodel: refactor profile loading
Loading the profile elements from disk is now deferred to consumption. Implements a basic caching mechanism for the displayname and avatar elements.

Gitlab: #1459
Change-Id: Ic5aeec6649c198f617b9269409ded647c7536b8f
2024-02-28 14:53:28 -05:00
6d20d3b515 misc: bump daemon
Change-Id: Ie720ef7deac208a869d32a0a49e6d653d40e7fb0
2024-02-27 15:30:43 -05:00
a0b583aa8d misc: update some strings
Change-Id: I635c527b8a5b83b91f70008ce6471af8f72f6aa9
2024-02-27 15:19:26 -05:00
3855a5e951 chatview: fix footer visibility
Change-Id: I4bb6268547da6549a143da1d64b56f70cdd7dcc7
2024-02-22 15:39:15 -05:00
6689bce782 Revert "callactionbar: add forward call for jami accounts"
This reverts commit ef716d657d.

Reason for revert: Missing a lot of design

Change-Id: I9f289d107dab25251e3de98a64c90446f9bf7c12
2024-02-22 14:58:29 -05:00
860ddf22b6 chatview: hide extra panels if interactions buttons are absent
Change-Id: I8e56fc3e0a456bc214baf321e4c9e60b77004d2c
GitLab: #1476
2024-02-21 15:56:34 -05:00
ef716d657d callactionbar: add forward call for jami accounts
Change-Id: I3559ef5398c73cd7c76196fe3b61cf005bc2408d
2024-02-21 15:56:00 -05:00
b0fe0251d1 Reply: ellide too long display names
GitLab: #1550
Change-Id: I0234d9c6993438fe4580961a85d86632def1c354
2024-02-21 15:55:09 -05:00
1ec2d5f27b conversationmodel: fix insert last interaction for conv request
GitLab: #1571
Change-Id: I848c6f8e1867f552a55105a4d528f51a59676ce4
2024-02-21 15:54:42 -05:00
23316993e5 accountcombobox: remove first line in list
GitLab: #1559
Change-Id: I8bc70c95354546b5c31a376daf07f60a96b1ede0
2024-02-21 15:53:57 -05:00
d42fe78676 presence: fix presence status for swarm with multiple members
Change-Id: Ic2e86b932c4805016689ffc41e4cede26b715954
2024-02-21 15:53:04 -05:00
78724c2a7b call: clarify call messages if call fails
Change-Id: I0dca1ef919cb6f60e53c57c3a3ccf81c2333c231
2024-02-21 15:53:04 -05:00
e14fbe9437 CallMessageDelegate: add icon and follow font-size
GitLab: #1463
Change-Id: I8c61d1c526ddf69ae910627d0804608fd17b5c45
2024-02-21 15:53:04 -05:00
82c63d5a89 tests: add dummy mock data for conversationListView and MessageListView
Change-Id: I64e145754843513a36e7b52dca9be90f2ab7688d
2024-02-21 15:52:56 -05:00
a72af9cba5 tests: add example for mocking datas
Change-Id: I060a991726bc8c1cd57f267d97833dcd04519bab
2024-02-21 15:52:50 -05:00
d7c642a2fe revoke: fix revocation with pwd
GitLab: #1573
Change-Id: I55dacf92ceeeba077b52488835e8d48b8ccd39a2
2024-02-21 15:24:55 -05:00
08f3339693 accountconfig: avoid duplication between dhtPort and DHT.port
Also show it in advanced settings

Change-Id: I8de880657530c4a957846ca334332f7ccf79ef8c
2024-02-21 09:03:36 -05:00
402515365d presence: follow daemon changes for presence indicator
Change-Id: Ie82a15da023ab97f133c8beadb8ddeb81b67666f
2024-02-20 12:47:11 -05:00
df102068bc i18n: automatic bump
Change-Id: I39656f5fe57b37316138680345d9c52a7675a968
2024-02-20 08:08:17 -05:00
d40e884a1f misc: remove wrong logs
Change-Id: I4010660c6bef3af553019deb9bcabc65a4b484fc
2024-02-19 16:55:27 -05:00
5371dac882 misc: use BUILD_TESTING like the daemon and update instructions
Change-Id: I5e92e47ada4c4225c68065179245d96723397575
2024-02-19 16:32:04 -05:00
0f62829588 misc: remove legacy mocking inclusion
Change-Id: Ie187f459b136c36fbb65c21fdaa4f05958244474
2024-02-19 16:31:55 -05:00
39da97396c contactmodel: fix add on second request
GitLab: #1572
Change-Id: If588d22b80ea2f77b21f2ddd081ba32fdffefc7c
2024-02-19 13:50:59 -05:00
406edda453 conversationmodel: fix status update for messages other than text
Change-Id: I0f1cb45a6cca9c8e95366c81a9d7813c740e2987
2024-02-19 13:26:08 -05:00
bbbeda6a26 EmojiPicker: fix reference error
GitLab: #1545
Change-Id: Ie0cdc650a8f1468ed14cb43ccfd223167ddf8b7e
2024-02-19 11:13:03 -05:00
6b3efff7cc misc: use logical or instead of bitwise
No impact on logic. Just clarifies intention and allows short-circuiting.

Change-Id: If18f9d28cf4f4ead58a4f94b0ba0e4514ac9eea1
2024-02-16 08:14:42 -05:00
3531b8b354 ManageAccountPage: fix polish loop
Change-Id: I31c05a8163cc03f8d181b5509e966df348814515
GitLab: #1541
2024-02-15 17:08:33 -05:00
487446cbc3 sidepanel: fix excess margin above donation box
The top margin is unnecessary when the invitations tab is not present.

Change-Id: Ic0aafdd72d3d99f3764eeac72b2efe0c11a604ed
2024-02-15 16:58:48 -05:00
d5349490f5 conversation: follow daemon changes for sending status
cf jami-docs/developer/delivery-status
+ Basically this patch uses the new SwarmMessage.status to show
current interaction status.
+ setRead only updates the status if the interaction is newer (else,
because signal are not guaranteed to be ordered, this can cause the
lastDisplayed_ to be incorrect).
+ Some old code is removed and unused signal
+ MessageReceived updates status if needed

GitLab: #1487
Change-Id: I4d4d5dce8dc12ab638e89e3f8431810b29a72087
2024-02-15 16:15:51 -05:00
7650f45d6f misc: libclient: remove legacy account database migration mechanism
Removes all migration mechanisms and support for database versions that haven't been used for several years. Also cleans up some includes.

Change-Id: Iaf071a455f77dd4daa57f16f9924703961aa64e0
2024-02-15 15:16:00 -05:00
a98f6ca4e3 SettingSpinBox: fix binding loop
Change-Id: I0426d7cea16aedff3dc5ed0f493422ffb091d45e
GitLab: #1543
2024-02-15 14:27:46 -05:00
0b96cf5f1f SBSMessageBase: add text metrics on author
Change-Id: Idf3aee2c667c86ea9a224d68624f733a2250e83a
GitLab: #1551
2024-02-15 14:27:46 -05:00
07e0b10478 tests: avoid initializing the ViewCoordinator root view
This doesn't make much sense with our current test structure, and will add a StackView component on top of the UUT.

Change-Id: Ice3425bfea0b5229c87caf3fa22b181ce6aa520d
2024-02-15 13:33:41 -05:00
b38e216721 ongoingcallpage: local-preview: add a hide-preview feature
Gitlab: #1555
Change-Id: Ifa196b91fed4d13d1cd0acf535cc3e1802c22a29
2024-02-15 10:46:49 -05:00
91f32f2421 ongoingcallpage: refactor local preview corner snapping
Uses a more declarative approach to anchor the local preview.

Change-Id: I2544428a0c2585a8629639566c808dfc2808fd14
2024-02-15 10:46:49 -05:00
06c3ffa6ce testing: add a configuration tool to the dev-testing window
This will allow the addition of custom parameters to a second anchored window.

"Conversation ID" and "Force local preview" are implemented.

Change-Id: I2366b57e6bb36efb568b06e40ef124a440a39397
2024-02-15 10:46:49 -05:00
ae53d92c2e testing: add a way to test individual QML components
This is a WIP and is intended to be adapted continuously to support more and more UI elements and reduce the time spent debugging components.

Some components will require additional configuration (e.g. the conversation ID must be set), which may require additional changes.

Change-Id: Iaa5d49693f874202439e746a274da4911adf7d15
2024-02-15 10:46:49 -05:00
97e477416a misc: bump daemon
Change-Id: Id39ed7d7135b0757f233a00039b59276257e0c6a
2024-02-14 11:10:48 -05:00
3d3b4612df chat-view: fix loading data transfer items
- Avoids manually building local file URIs which was causing long load times for conversations on Windows.

- Fixes an issue where missing images were caused by a interaction updates erasing the message bodies.

Change-Id: I4c65f73cf9f46da5a9ae899940cb205cb34ffae2
2024-02-13 17:06:26 -05:00
7060afe467 build.py: add an argument to add client cmake flags
Change-Id: I6b0eae47d4fd52935cc4cef02d79115b80f3d809
2024-02-13 11:27:06 -05:00
f56026439a i18n: automatic bump
Change-Id: Id74cec7e9ff47a6bc53864ef53788bb697b9f9a8
2024-02-12 16:42:45 -05:00
0a24bec5ec 3rdparty: md4c: bump version + turn off building md2html executable
Change-Id: Ib7c978e2b5ea8e16115c8818afc387988c13d72a
2024-02-12 15:09:39 -05:00
38b7880d5f misc: improve logging for the client and libclient projects
- Declares global logging categories for libclient and the app
- Introduces some macros for categorized logging
- Removes the noisy namedirectory logs by default
- Logs file/line number URIs in debug mode

Change-Id: I9dadadc6e93ef91cc70d206b7225aeb7a06f8773
2024-02-12 11:14:17 -05:00
71a88b75ab misc: bump daemon submodule
Change-Id: I9971b5bf1236387f42663b5ef0193f4ef5b75bb3
2024-02-09 15:00:40 -05:00
37e1780762 snap: update cmake
Change-Id: I89fe8ef4bcf7c2f1f437517d1ea7978435157604
2024-02-09 11:41:13 -05:00
e054fc9592 misc: fix missing account avatar
Change-Id: I69acb78e60e04f74382561e130185a1aca8064d6
2024-02-08 15:31:01 -05:00
8305c0a082 misc: bump daemon submodule
Change-Id: I19c1faaaef77aa8d26e82a794a8e4af8f1a5da94
2024-02-08 14:18:22 -05:00
387 changed files with 107790 additions and 90563 deletions

13
.gitignore vendored
View File

@ -1,9 +1,18 @@
*.user
doc/Doxyfile
### VisualStudioCode ###
.vscode/**/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
### VisualStudioCode Patch ###
# Ignore all local history of files
**/.history
GeneratedFiles/
.vs/
.vscode/
x64/
x86/
[wW]in32/

49
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,49 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Jami-Client-Debug",
"type": "cppdbg",
"request": "launch",
"program": "",
"linux":{
"MIMode": "gdb",
"program": "${workspaceFolder}/build/jami",
"args": [
"-d",
],
},
"osx": {
"MIMode": "lldb",
"program": "${workspaceFolder}/build/Jami.app/Contents/MacOS/Jami",
"environment": [
{
"name": "NO_COLOR",
"value": "true",
}
],
},
"cwd": "${workspaceFolder}",
"preLaunchTask": "cmake-build",
"externalConsole": false, // A macOS dev may want to set this to true.
},
{
// Using this configuration will require manually reconfiguring the project using
// build.py --no-libwrap, otherwise the daemon executable will not be built and the
// client will not be built with ENABLE_LIBWRAP=False.
"name": "Jami-Daemon-Debug",
"type": "cppdbg",
"request": "launch",
"linux": {
"MIMode": "gdb",
"program": "${workspaceFolder}/daemon/bin/dbus/jamid",
},
"program": "",
"args": [
"-cdp",
],
"cwd": "${workspaceFolder}",
"preLaunchTask": "cmake-build",
}
]
}

15
.vscode/settings.json vendored Normal file
View File

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

93
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,93 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "run-tests",
"type": "shell",
"command": "ctest",
"options": {
"cwd": "${workspaceFolder}/build/tests",
"env": {
"HOME": "/tmp"
}
},
"args": [
"-V",
"-R"
],
"group": {
"kind": "test",
"isDefault": true
},
"problemMatcher": [],
"detail": "Run the tests using CTest."
},
{
"label": "cmake-configure",
"type": "shell",
"command": "cmake",
"args": [
"-S", ".",
"-B", "build",
"-DCMAKE_BUILD_TYPE=Debug",
"-DCMAKE_PREFIX_PATH=\"/usr/lib64/qt-jami;/usr/lib/libqt-jami\"",
],
"group": "build",
"problemMatcher": [],
"detail": "Generate the build system files with CMake."
},
{
"label": "cmake-configure-tests",
"type": "shell",
"command": "cmake",
"args": [
"-S", ".",
"-B", "build",
"-DBUILD_TESTING=${input:buildTestingInput}"
],
"group": "build",
"problemMatcher": [],
"detail": "Generate the build system files with CMake."
},
{
"label": "cmake-build",
"type": "shell",
"command": "cmake",
"args": [
"--build", "build",
"-j$(nproc)",
],
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": [
"$gcc"
],
"detail": "Compile the project using the generated build system.",
"dependsOn": [
"cmake-configure"
]
},
{
"label": "cmake-clean",
"type": "shell",
"command": "rm",
"args": [
"-rf",
"build"
],
"group": "build",
"problemMatcher": [],
"detail": "Clean the build directory."
}
],
"inputs": [
{
"id": "buildTestingInput",
"type": "pickString",
"description": "Do you want to enable testing?",
"options": ["True", "False"],
}
]
}

2
3rdparty/md4c vendored

View File

@ -29,11 +29,11 @@ else()
project(jami)
endif()
include(${PROJECT_SOURCE_DIR}/extras/build/cmake/extra_tools.cmake)
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(ENABLE_TESTS "Build with tests" OFF)
option(WITH_WEBENGINE "Build with WebEngine" ON)
option(ENABLE_LIBWRAP "Enable libwrap (single process mode)" ON)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
@ -88,7 +88,6 @@ list(APPEND QWINDOWKIT_OPTIONS
)
if(WIN32)
list(APPEND QWINDOWKIT_PATCHES ${EXTRA_PATCHES_DIR}/0002-workaround-right-margin.patch)
list(APPEND QWINDOWKIT_OPTIONS QWINDOWKIT_ENABLE_WINDOWS_SYSTEM_BORDERS OFF)
endif()
@ -119,6 +118,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
# src
set(LIBCLIENT_SRC_DIR ${PROJECT_SOURCE_DIR}/src/libclient)
set(APP_SRC_DIR ${PROJECT_SOURCE_DIR}/src/app)
set(VERSION_INFO_DIR ${PROJECT_SOURCE_DIR}/src/version_info)
# doc
set(DOC_DIR ${PROJECT_SOURCE_DIR}/doc)
# extras
@ -141,6 +141,11 @@ 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()
@ -207,6 +212,23 @@ include(FindPython3)
find_package(Python3 3.6 REQUIRED COMPONENTS Interpreter)
set(PYTHON_EXEC ${Python3_EXECUTABLE})
# Versioning and build ID generation
set(VERSION_FILE ${CMAKE_CURRENT_BINARY_DIR}/version_info.cpp)
# Touch the file to make sure it exists at configure time as
# we add it to the target_sources below.
file(TOUCH ${VERSION_FILE})
add_custom_target(
generate_version_info ALL
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND}
-DAPP_SOURCE_DIR=${CMAKE_SOURCE_DIR}
-DAPP_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}
-DCORE_SOURCE_DIR=${DAEMON_DIR}
-DCPP_INT_FILE=${VERSION_INFO_DIR}/version_info.cpp.in
-P ${CMAKE_SCRIPTS_DIR}/generate_version_info.cmake
)
list(APPEND CLIENT_INCLUDE_DIRS ${VERSION_INFO_DIR})
# Resource auto-gen
# QML and related code files
# Check files in the app's src directory and force a reconfigure if it
@ -244,6 +266,7 @@ set(QML_IMPORT_PATH ${QML_DIRS}
add_definitions(-DQT_NO_KEYWORDS)
set(COMMON_SOURCES
${VERSION_FILE}
${APP_SRC_DIR}/bannedlistmodel.cpp
${APP_SRC_DIR}/accountlistmodel.cpp
${APP_SRC_DIR}/networkmanager.cpp
@ -303,6 +326,7 @@ set(COMMON_SOURCES
${APP_SRC_DIR}/pluginversionmanager.cpp)
set(COMMON_HEADERS
${APP_SRC_DIR}/global.h
${APP_SRC_DIR}/avatarimageprovider.h
${APP_SRC_DIR}/networkmanager.h
${APP_SRC_DIR}/smartlistmodel.h
@ -451,10 +475,12 @@ elseif (NOT APPLE)
${APP_SRC_DIR}/xrectsel.c
${APP_SRC_DIR}/connectivitymonitor.cpp
${APP_SRC_DIR}/dbuserrorhandler.cpp
${APP_SRC_DIR}/appversionmanager.cpp)
${APP_SRC_DIR}/appversionmanager.cpp
${APP_SRC_DIR}/screencastportal.cpp)
list(APPEND COMMON_HEADERS
${APP_SRC_DIR}/xrectsel.h
${APP_SRC_DIR}/dbuserrorhandler.h)
${APP_SRC_DIR}/dbuserrorhandler.h
${APP_SRC_DIR}/screencastportal.h)
list(APPEND QT_MODULES DBus)
find_package(PkgConfig REQUIRED)
@ -469,6 +495,11 @@ elseif (NOT APPLE)
add_definitions(${GIO_CFLAGS})
endif()
pkg_check_modules(GIOUNIX REQUIRED gio-unix-2.0)
if(GIOUNIX_FOUND)
add_definitions(${GIOUNIX_CFLAGS})
endif()
pkg_check_modules(LIBNM libnm)
if(LIBNM_FOUND)
add_definitions(-DUSE_LIBNM)
@ -580,6 +611,7 @@ include_directories(
if(ENABLE_LIBWRAP)
list(APPEND COMMON_HEADERS
${LIBCLIENT_SRC_DIR}/qtwrapper/instancemanager_wrap.h)
add_definitions(-DENABLE_LIBWRAP=true)
endif()
# SFPM
@ -588,6 +620,7 @@ add_subdirectory(3rdparty/SortFilterProxyModel)
set(SFPM_OBJECTS $<TARGET_OBJECTS:SortFilterProxyModel>)
# md4c
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Don't build md2html executable" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Don't build shared md4c library" FORCE)
add_subdirectory(3rdparty/md4c EXCLUDE_FROM_ALL)
list(APPEND CLIENT_LINK_DIRS ${MD4C_BINARY_DIR}/src)
@ -613,6 +646,9 @@ qt_add_executable(
${QML_RESOURCES_QML}
${SFPM_OBJECTS})
# Make sure we can find the generated version file
add_dependencies(${PROJECT_NAME} generate_version_info)
foreach(MODULE ${QT_MODULES})
list(APPEND QT_LIBS "Qt::${MODULE}")
endforeach()
@ -806,12 +842,20 @@ else()
"-framework Security"
compression
resolv
)
)
set(APP_CONTAINER "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app/Contents")
# ringtones. Copy the entire directory to the app bundle.
# daemon/ringtones -> Jami.app/Contents/Resources/ringtones
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy_directory
${DAEMON_DIR}/ringtones
${APP_CONTAINER}/Resources/ringtones
)
# translations
if(Qt${QT_VERSION_MAJOR}LinguistTools_FOUND)
set(APP_CONTAINER
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app/Contents")
file(GLOB TS_FILES ${PROJECT_SOURCE_DIR}/translations/*.ts)
# Generate lproj folders.
@ -839,26 +883,26 @@ else()
MACOSX_BUNDLE_SHORT_VERSION_STRING "${JAMI_VERSION}"
MACOSX_BUNDLE_BUNDLE_VERSION "${JAMI_BUILD}"
MACOSX_BUNDLE_COPYRIGHT "${PROJ_COPYRIGHT}")
if(APPSTORE)
message(STATUS "app store version")
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/appstore/Jami.entitlements")
else()
set_target_properties(${PROJECT_NAME} PROPERTIES
SPARKLE_URL "${SPARKLE_URL}"
SPARKLE_PUBLIC_KEY "${SPARKLE_PUBLIC_KEY}"
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/Jami.entitlements"
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME TRUE)
endif()
if(DEPLOY)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -DQML_SRC_DIR=${SRC_DIR}
-DMAC_DEPLOY_QT_PATH=${CMAKE_PREFIX_PATH}/bin
-DEXE_NAME="${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app"
-DSPARKLE_PATH=${SPARKLE_FRAMEWORK}
-DENABLE_SPARKLE=${ENABLE_SPARKLE}
-P ${EXTRAS_DIR}/build/cmake/macos_qt_deploy.cmake)
endif()
if(APPSTORE)
message(STATUS "app store version")
set_target_properties(${PROJECT_NAME} PROPERTIES
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/appstore/Jami.entitlements")
else()
set_target_properties(${PROJECT_NAME} PROPERTIES
SPARKLE_URL "${SPARKLE_URL}"
SPARKLE_PUBLIC_KEY "${SPARKLE_PUBLIC_KEY}"
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/entitlements/Jami.entitlements"
XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME TRUE)
endif()
if(DEPLOY)
execute_process(COMMAND
"${CMAKE_PREFIX_PATH}/bin/macdeployqt"
"${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app"
-qmldir=${QML_SRC_DIR})
if(${ENABLE_SPARKLE} MATCHES true)
file(COPY ${SPARKLE_FRAMEWORK} DESTINATION ${EXE_NAME}/Contents/Frameworks/)
endif()
endif()
endif()
target_include_directories(${PROJECT_NAME} PRIVATE ${CLIENT_INCLUDE_DIRS})
@ -869,7 +913,7 @@ qt_import_qml_plugins(${PROJECT_NAME})
qt_finalize_executable(${PROJECT_NAME})
# tests
if(ENABLE_TESTS)
if(BUILD_TESTING)
message("Add Jami tests")
add_subdirectory(${TESTS_DIR})
endif()

View File

@ -14,7 +14,7 @@ So, you will need to get Qt 6.6 first. For this, there is 3 methods:
### Qt from our repo (recommended)
If your distribution is supported, we provide a Qt package (libqt-jami) on our repo.
The files will be installed in `/usr/lib/libqt-jami`.
The files will be installed to `/usr/lib/libqt-jami` on Debian-like distributions. For RPM based distributions the files will be installed to `/usr/lib64/qt-jami`.
#### Install libqt-jami, Ubuntu based
@ -131,6 +131,11 @@ Notes:
- `--global-install` to install client-qt globally under /usr/local
- `--prefix` to change the destination of the install.
+ For developers:
+ `--asan` add address sanitizer on the binary
+ `--debug` enable debug symbols
+ `--testing` will build the tests for both the daemon and client
+ `--no-libwrap` will build the DBUS version.
## Build only the client
@ -207,7 +212,7 @@ Only 64-bit MSVC build can be compiled.
| | Qt Version |
| -------------------- | ---------- |
| Minimum requirement: | 6.6.1 |
| Minimum requirement: | 6.6.2 |
- Install [Python3](https://www.python.org/downloads/) for Windows
@ -233,7 +238,7 @@ Only 64-bit MSVC build can be compiled.
- Using a new **Non-Elevated Command Prompt**
```bash
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.1/msvc2019_64)
python build.py --install --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
```
> **SDK** Note:
@ -276,14 +281,14 @@ Once the build has finished, you should then be able to use the Visual Studio So
```
python extras\scripts\build-windows.py --init
python extras\scripts\build-windows.py --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.1/msvc2019_64)
python extras\scripts\build-windows.py --qt <path-to-qt-bin-folder> (e.g. C:/Qt/6.6.2/msvc2019_64)
```
## Building On MacOS
**Set up**
- macOS minimum version 10.15
- macOS minimum version 11.0
- install python3
- download xcode
- install Qt 6.6
@ -338,9 +343,24 @@ Built client could be find in `build/Jami`
- These environment variables will be temporarily set when using build-windows.py to run tests.
## Troubleshooting
Build errors may occur if daemon dependencies have been updated since the last build, as the script may not fully detect or rebuild them in the correct order. For the same reason, you may also occasionally encounter linker errors.
To resolve this, clean and restart the installation to ensure a fresh rebuild of all components (delete all temporary files generated by the build process):
```bash
./build.py --clean
./build.py --install
```
## Debugging
Compile the client with with `-DCMAKE_BUILD_TYPE=Debug`.
Compile the client with `-DCMAKE_BUILD_TYPE=Debug`. Then, if you want to enable logging when running `jami`, launch it with `-d` or `--debug`.
Then, if you want to enable logging when running `jami`, launch it
with `-d` or `--debug`.
To diagnose a crash, use GDB:
```sh
./build.py --install --debug
gdb -ex run --args ./jami --debug
```

View File

@ -1,3 +1,4 @@
/obj
/bin
Components.wxs
AppComponents.wxs
CrtComponents.wxs

View File

@ -3,13 +3,11 @@
<?define Name="Jami" ?>
<?define ExeName="Jami" ?>
<?define AppName="Jami" ?>
<?define Manufacturer="Savoir-Faire Linux"?>
<?if $(var.Configuration) = Release ?>
<?define ReleaseDir="..\x64\Release"?>
<?else?>
<?define ReleaseDir="..\x64\Beta"?>
<?endif ?>
<?define Manufacturer="Savoir-Faire Linux"?>
<?define UcrtDir="C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\x64"?>
</Include>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-16"?>
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DeployedProjects />
<DirectoryMappings />
<FileMappings />

View File

@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" InitialTargets="EnsureWixToolsetInstalled" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Project ToolsVersion="4.0"
DefaultTargets="Build"
InitialTargets="EnsureWixToolsetInstalled"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x64</Platform>
@ -16,7 +19,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>HarvestPath=..\x64\Release</DefineConstants>
<DefineConstants>AppHarvestPath=..\x64\Release;CrtHarvestPath=$(VC_CRT_Dir)</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
@ -26,7 +29,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Beta|x64' ">
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
<DefineConstants>HarvestPath=..\x64\Beta</DefineConstants>
<DefineConstants>AppHarvestPath=..\x64\Beta;CrtHarvestPath=$(VC_CRT_Dir)</DefineConstants>
<SuppressPdbOutput>True</SuppressPdbOutput>
<CompilerAdditionalOptions>
</CompilerAdditionalOptions>
@ -35,8 +38,8 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="Product.wxs" />
<Compile Include="StandardComponents.wxs" />
<Compile Include="Components.wxs" />
<Compile Include="AppComponents.wxs" />
<Compile Include="CrtComponents.wxs" />
</ItemGroup>
<ItemGroup>
<Content Include="Config.wxi" />
@ -58,13 +61,36 @@
<ItemGroup>
<EmbeddedResource Include="Localization.wxl" />
</ItemGroup>
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
<Import Project="$(WixTargetsPath)"
Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets"
Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
<Target Name="EnsureWixToolsetInstalled"
Condition=" '$(WixTargetsImported)' != 'true' ">
<Error Text="The WiX Toolset v3.11 (or newer) build tools must be installed to build this project. To download the WiX Toolset, see http://wixtoolset.org/releases/" />
</Target>
<Target Name="BeforeBuild">
<HeatDirectory Directory="..\x64\$(Configuration)" PreprocessorVariable="var.HarvestPath" OutputFile="Components.wxs" ComponentGroupName="HeatGenerated" DirectoryRefId="APPLICATIONFOLDER" AutogenerateGuids="true" ToolPath="$(WixToolPath)" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" Transforms="HarvestFilter.xslt" />
<HeatDirectory Directory="..\x64\$(Configuration)"
PreprocessorVariable="var.AppHarvestPath"
OutputFile="AppComponents.wxs"
ComponentGroupName="AppHeatGenerated"
DirectoryRefId="APPLICATIONFOLDER"
AutogenerateGuids="true"
ToolPath="$(WixToolPath)"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true"
Transforms="HarvestFilter.xslt" />
<HeatDirectory Directory="$(VC_CRT_Dir)"
PreprocessorVariable="var.CrtHarvestPath"
OutputFile="CrtComponents.wxs"
ComponentGroupName="CrtHeatGenerated"
DirectoryRefId="APPLICATIONFOLDER"
AutogenerateGuids="true"
ToolPath="$(WixToolPath)"
SuppressFragments="true"
SuppressRegistry="true"
SuppressRootDirectory="true" />
</Target>
<Target Name="AfterBuild">
</Target>

View File

@ -2,6 +2,14 @@
<WixLocalization Culture="en-us"
xmlns="http://schemas.microsoft.com/wix/2006/localization">
<String Id="AdvancedWelcomeEulaDlgDescriptionPerMachine">By installing this software you agree to the terms in the license agreement</String>
<UI Dialog="ExitDialog" Control="OptionalCheckBox" Width="10" Height="10" X="135" Y="110" />
<UI Dialog="ExitDialog" Control="OptionalText" X="150" Y="110" />
<UI Dialog="ExitDialog"
Control="OptionalCheckBox"
Width="10"
Height="10"
X="135"
Y="110" />
<UI Dialog="ExitDialog"
Control="OptionalText"
X="150"
Y="110" />
</WixLocalization>

View File

@ -1,134 +1,220 @@
<?xml version="1.0" encoding="UTF-8"?>
<?include Config.wxi?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="$(var.Name)" Language="1033" Version="$(fun.AutoVersion(1.0))" Manufacturer="$(var.Manufacturer)" UpgradeCode="7c45b52b-0390-4fe8-947a-3f13e82dd346">
<Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" />
<Product Id="*"
Name="$(var.Name)"
Language="1033"
Version="$(fun.AutoVersion(1.0))"
Manufacturer="$(var.Manufacturer)"
UpgradeCode="7c45b52b-0390-4fe8-947a-3f13e82dd346">
<Package InstallerVersion="301"
Compressed="yes"
InstallScope="perMachine" />
<MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="yes"/>
<MediaTemplate EmbedCab="yes" CompressionLevel="high" MaximumUncompressedMediaSize="4" />
<MajorUpgrade Schedule="afterInstallInitialize"
AllowDowngrades="yes"/>
<MediaTemplate EmbedCab="yes"
CompressionLevel="high"
MaximumUncompressedMediaSize="4" />
<!--Disables interaction of the package with the Restart Manager.-->
<Property Id="MSIRESTARTMANAGERCONTROL" Value="Disable" />
<Property Id="MSIRESTARTMANAGERCONTROL"
Value="Disable" />
<!--Icon File should be in release folder(not wix project), otherwise cannot be read-->
<Icon Id="icon.ico" SourceFile="$(var.ReleaseDir)\jami.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<Property Id="ARPNOMODIFY" Value="1" />
<Icon Id="icon.ico"
SourceFile="$(var.ReleaseDir)\jami.ico" />
<Property Id="ARPPRODUCTICON"
Value="icon.ico" />
<Property Id="ARPNOMODIFY"
Value="1" />
<!-- It seems that QtWebEngineProcess.exe versioning requires us to force reinstall. -->
<Property Id="REINSTALLMODE" Value="dms" />
<Property Id="REINSTALLMODE"
Value="dms" />
<Feature Id="ProductFeature" Title="Main" Level="1" Absent="disallow">
<ComponentGroupRef Id="StandardComponents" Primary="yes" />
<ComponentGroupRef Id="HeatGenerated" />
<Feature Id="ProductFeature"
Title="Main"
Level="1"
Absent="disallow">
<ComponentGroupRef Id="MainExecutable"
Primary="yes" />
<ComponentGroupRef Id="AppHeatGenerated" />
<ComponentGroupRef Id="CrtHeatGenerated" />
<ComponentRef Id="ApplicationShortcutDesktop" />
<ComponentRef Id="ApplicationShortcutStartMenu" />
<ComponentRef Id="RegistryEntries" />
<ComponentRef Id="URLProtocolRegistryEntries" />
</Feature>
<!--Visual C++ Redist merge module-->
<DirectoryRef Id="TARGETDIR">
<Merge Id="VCRedist" SourceFile="$(env.VCRedistMergeModule)" DiskId="1" Language="0" />
</DirectoryRef>
<Feature Id="VCRedist" Title="Visual C++ Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedist"/>
</Feature>
<SetProperty After="FindRelatedProducts" Id="FirstInstall" Value="true">
<SetProperty After="FindRelatedProducts"
Id="FirstInstall"
Value="true">
NOT Installed AND NOT WIX_UPGRADE_DETECTED AND NOT WIX_DOWNGRADE_DETECTED
</SetProperty>
<SetProperty After="SetFirstInstall" Id="Upgrading" Value="true">
<SetProperty After="SetFirstInstall"
Id="Upgrading"
Value="true">
WIX_UPGRADE_DETECTED AND NOT (REMOVE="ALL")
</SetProperty>
<SetProperty After="RemoveExistingProducts" Id="RemovingForUpgrade" Sequence="execute" Value="true">
(REMOVE="ALL") AND UPGRADINGPRODUCTCODE
<SetProperty After="RemoveExistingProducts"
Id="RemovingForUpgrade"
Sequence="execute"
Value="true"> (REMOVE="ALL") AND UPGRADINGPRODUCTCODE
</SetProperty>
<SetProperty After="SetUpgrading" Id="Uninstalling" Value="true">
<SetProperty After="SetUpgrading"
Id="Uninstalling"
Value="true">
Installed AND (REMOVE="ALL") AND NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE)
</SetProperty>
<SetProperty After="SetUninstalling" Id="Maintenance" Value="true">
<SetProperty After="SetUninstalling"
Id="Maintenance"
Value="true">
Installed AND NOT Upgrading AND NOT Uninstalling AND NOT UPGRADINGPRODUCTCODE
</SetProperty>
<!--SetDirectory of APPLICATIONFOLDER -->
<SetDirectory Id="APPLICATIONFOLDER" Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<SetProperty Id="ARPINSTALLLOCATION" Value="[APPLICATIONFOLDER]" After="CostFinalize" />
<SetDirectory Id="APPLICATIONFOLDER"
Value="[ProgramFiles64Folder][ApplicationFolderName]">APPLICATIONFOLDER=""</SetDirectory>
<SetProperty Id="ARPINSTALLLOCATION"
Value="[APPLICATIONFOLDER]"
After="CostFinalize" />
<UIRef Id="CustomUI" />
<WixVariable Id="WixUIInfoIcon" Value="icon.ico"/>
<WixVariable Id="WixUIBannerBmp" Value="top-banner.bmp" />
<WixVariable Id="WixUIDialogBmp" Value="main-banner.bmp" />
<WixVariable Id="WixUISupportPerUser" Value="0" />
<WixVariable Id="WixUIInfoIcon"
Value="icon.ico"/>
<WixVariable Id="WixUIBannerBmp"
Value="top-banner.bmp" />
<WixVariable Id="WixUIDialogBmp"
Value="main-banner.bmp" />
<WixVariable Id="WixUISupportPerUser"
Value="0" />
<CustomAction Id="RemoveOldJamiFiles"
Directory="APPLICATIONFOLDER"
ExeCommand="cmd /c &quot;del vc_redist.x64.exe; del uninstall.exe; del WinSparkle.dll;&quot;"
Execute="deferred"
Return="ignore"
HideTarget="no"
Impersonate="no"/>
Directory="APPLICATIONFOLDER"
ExeCommand="cmd /c &quot;del vc_redist.x64.exe; del uninstall.exe; del WinSparkle.dll;&quot;"
Execute="deferred"
Return="ignore"
HideTarget="no"
Impersonate="no"/>
<Property Id="QtExecCmdLine"
Value='"[APPLICATIONFOLDER]/$(var.ExeName).exe" --term'/>
Value='"[APPLICATIONFOLDER]/$(var.ExeName).exe" --term'/>
<CustomAction Id="TerminateAppProcess"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="immediate"
Return="ignore"/>
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="immediate"
Return="ignore"/>
</Product>
<Fragment Id="DirectoryStructure">
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="TARGETDIR"
Name="SourceDir">
<Directory Id="ProgramFiles64Folder">
<Directory Id="APPLICATIONFOLDER" Name="$(var.Name)" />
<Directory Id="APPLICATIONFOLDER"
Name="$(var.Name)" />
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
<Directory Id="DesktopFolder"
Name="Desktop" />
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" />
</Directory>
<Directory Id="WindowsFolder" Name="WINDOWS"/>
<Directory Id="WindowsFolder"
Name="WINDOWS"/>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="MainExecutable"
Directory="APPLICATIONFOLDER">
<Component Id="cmp9CFEE34E3A162AB05264E8B756EC1DEC"
Guid="*">
<File Id="fileMain.exe"
KeyPath="yes"
Source="$(var.ReleaseDir)\$(var.ExeName).exe" />
</Component>
</ComponentGroup>
</Fragment>
<Fragment Id="Shortcuts">
<DirectoryRef Id="DesktopFolder">
<Component Id="ApplicationShortcutDesktop" Guid="*" Win64="yes">
<Shortcut Id="ApplicationShortcutDesktop" Name="$(var.Name)" Description="Launch $(var.Name)" Target="[#fileMain.exe]" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.Name)" Name="desktop" Type="integer" Value="1" KeyPath="yes" />
<Component Id="ApplicationShortcutDesktop"
Guid="*"
Win64="yes">
<Shortcut Id="ApplicationShortcutDesktop"
Name="$(var.Name)"
Description="Launch $(var.Name)"
Target="[#fileMain.exe]"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="DesktopFolder"
On="uninstall" />
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.Name)"
Name="desktop"
Type="integer"
Value="1"
KeyPath="yes" />
<Condition>FirstInstall</Condition>
</Component>
</DirectoryRef>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcutStartMenu" Guid="*" Win64="yes">
<Shortcut Id="ApplicationShortcutStartMenu" Name="$(var.Name)" Description="Launch $(var.Name)" Target="[#fileMain.exe]" WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="StartMenuFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.Name)" Name="startmenu" Type="integer" Value="1" KeyPath="yes" />
<Component Id="ApplicationShortcutStartMenu"
Guid="*"
Win64="yes">
<Shortcut Id="ApplicationShortcutStartMenu"
Name="$(var.Name)"
Description="Launch $(var.Name)"
Target="[#fileMain.exe]"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="StartMenuFolder"
On="uninstall" />
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.Name)"
Name="startmenu"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment Id="OtherRegistryEntries">
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntries" Guid="*" Win64="yes">
<RegistryValue Root="HKCU" Key="Software\jami.net\$(var.AppName)" Name="hasRun" Type="integer" Value="0" KeyPath="yes" />
<Component Id="RegistryEntries"
Guid="*"
Win64="yes">
<RegistryValue Root="HKCU"
Key="Software\jami.net\$(var.AppName)"
Name="hasRun"
Type="integer"
Value="0"
KeyPath="yes" />
</Component>
</DirectoryRef>
</Fragment>
<Fragment Id="URLProtocol">
<DirectoryRef Id="TARGETDIR">
<Component Id="URLProtocolRegistryEntries" Guid="*" Win64="yes">
<RegistryKey Root="HKCR" Key="jami" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryValue Type="string" Name="URL Protocol" Value="" />
<RegistryValue Type="string" Value="URL:jami"/>
<Component Id="URLProtocolRegistryEntries"
Guid="*"
Win64="yes">
<RegistryKey Root="HKCR"
Key="jami"
ForceCreateOnInstall="yes"
ForceDeleteOnUninstall="yes">
<RegistryValue Type="string"
Name="URL Protocol"
Value="" />
<RegistryValue Type="string"
Value="URL:jami"/>
<RegistryKey Key="DefaultIcon">
<RegistryValue Type="string" Value="[APPLICATIONFOLDER]$(var.ExeName).exe" />
<RegistryValue Type="string"
Value="[APPLICATIONFOLDER]$(var.ExeName).exe" />
</RegistryKey>
<RegistryKey Key="shell\open\command">
<RegistryValue Type="string" Value='"[APPLICATIONFOLDER]$(var.ExeName).exe" "%1"' />
<RegistryValue Type="string"
Value='"[APPLICATIONFOLDER]$(var.ExeName).exe" "%1"' />
</RegistryKey>
</RegistryKey>
</Component>
@ -137,47 +223,88 @@
<Fragment Id="UI">
<UI Id="CustomUI">
<Property Id="WixAppFolder" Value="WixPerMachineFolder" />
<Property Id="WixAppFolder"
Value="WixPerMachineFolder" />
<!--APPLICATIONFOLDER required by WixUI_Advanced, ApplicationFolderName reset APPLICATIONFOLDER path-->
<Property Id="ApplicationFolderName" Value="$(var.Manufacturer)\$(var.AppName)" />
<Property Id="ApplicationFolderName"
Value="$(var.Manufacturer)\$(var.AppName)" />
<UIRef Id="WixUI_Advanced" />
<!--Remove User Exit Dialog-->
<Publish Dialog="AdvancedWelcomeEulaDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="InstallDirDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="FeaturesDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="MaintenanceTypeDlg" Control="Cancel" Property="AbortInstall" Value="1">1</Publish>
<Publish Dialog="AdvancedWelcomeEulaDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="FeaturesDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="MaintenanceWelcomeDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<Publish Dialog="MaintenanceTypeDlg"
Control="Cancel"
Property="AbortInstall"
Value="1">1</Publish>
<!--Launch Program If Checkbox is clicked-->
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
<InstallUISequence>
<Show Dialog="UserExit" OnExit="cancel">NOT AbortInstall = 1</Show>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Show Dialog="UserExit"
OnExit="cancel">NOT AbortInstall = 1</Show>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder"
After="WixSetDefaultPerMachineFolder" />
</InstallUISequence>
</UI>
<InstallExecuteSequence>
<Custom Action='TerminateAppProcess' Before='InstallValidate'/>
<Custom Action="RemoveOldJamiFiles" After="RemoveFiles" />
<Custom Action="LaunchApplication_nonUI" After="InstallFinalize"> WIXNONUILAUNCH </Custom>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Custom Action='TerminateAppProcess'
Before='InstallValidate'/>
<Custom Action="RemoveOldJamiFiles"
After="RemoveFiles" />
<Custom Action="LaunchApplication_nonUI"
After="InstallFinalize"> WIXNONUILAUNCH </Custom>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder"
After="WixSetDefaultPerMachineFolder" />
</InstallExecuteSequence>
<!--License check box text, Launch check box text (auto check)-->
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALTEXT"
Value="Launch $(var.Name)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT"
Value="Launch $(var.Name)" />
<!--CheckBox Default Set to One-->
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
<Property Id="LicenseAccepted" Value="1"/>
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX"
Value="1"/>
<Property Id="LicenseAccepted"
Value="1"/>
<Property Id="WixShellExecTarget" Value="[#fileMain.exe]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<CustomAction Id="LaunchApplication_nonUI" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes"/>
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder" Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" />
<Property Id="WixShellExecTarget"
Value="[#fileMain.exe]" />
<CustomAction Id="LaunchApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Impersonate="yes" />
<CustomAction Id="LaunchApplication_nonUI"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Impersonate="yes"/>
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder"
Property="WixPerMachineFolder"
Value="[ProgramFiles64Folder][ApplicationFolderName]"
Execute="immediate" />
<!--License File-->
<WixVariable Id="WixUILicenseRtf" Value="$(var.ReleaseDir)\License.rtf"/>
<WixVariable Id="WixUILicenseRtf"
Value="$(var.ReleaseDir)\License.rtf"/>
</Fragment>
</Wix>

View File

@ -1,86 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Generated with WiX's heat tool using the command:
heat.exe dir x64\Release -ag -cg ProductComponents -dr APPLICATIONFOLDER -srd -var var.ReleaseDir -out JamiInstaller\Components.wxs
Includes:
- the api-ms-win dlls missing parts of vc merge module for windows 7 support
- Jami.exe with a named Id so we can reference it in Product.wxs to launch after install
We run heat in the prebuild step on x64\Release without Jami.exe (instead of an XSLT file), to harvest everything else.
-->
<?include Config.wxi?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<ComponentGroup Id="StandardComponents">
<Component Id="cmp9C61F84AF9761955FBF397AFAE21C11B" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil2089BEC9A7AB899CED5A5EE501789299" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-file-l1-2-0.dll" />
</Component>
<Component Id="cmp03BB2697EE10869C4A329E3EA987EFAA" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil44C27F2C97596734BB3BEB7C21F7B71C" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-file-l2-1-0.dll" />
</Component>
<Component Id="cmp6B6AA7AEA5A4D324A4EE7DAE1B1193E0" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil1D16BE23D323A1E37FC1FC7354A9305F" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-localization-l1-2-0.dll" />
</Component>
<Component Id="cmpB5454FB66442C9BFD2145AE30B32D7A9" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil031B78DF53F7A3AC109410907624FC3E" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-processthreads-l1-1-1.dll" />
</Component>
<Component Id="cmp9F6D22CD9B1739E4F75F92F3A07E4CA1" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE9A3672FA504AA8E518DD72A02CD3E77" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-synch-l1-2-0.dll" />
</Component>
<Component Id="cmp9451422B7074D46F019614C3DE73BD17" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil3C902CA2889BB8855D285C3FBABB334F" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-core-timezone-l1-1-0.dll" />
</Component>
<Component Id="cmp349250459EC2D8C328EED5138B073E7A" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil2466F3D9FBA095A007D0909040D4D688" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-conio-l1-1-0.dll" />
</Component>
<Component Id="cmpCC880F2B054A87EF5FC68232652231BF" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil605A691486569535A1C3548F7DCE753C" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-convert-l1-1-0.dll" />
</Component>
<Component Id="cmpD6CB40D5A5AFF2161B7B4B4F06F03301" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil09AE032A32E2E542A232F7941AC77320" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-environment-l1-1-0.dll" />
</Component>
<Component Id="cmpC02538029646A27A9F786AD690EB3C8E" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil7DE9C3CADCA188356922B0CBD8E313E7" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-filesystem-l1-1-0.dll" />
</Component>
<Component Id="cmp8E50197B377636123F0F1F94FFB004E7" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil584F158D11B8A380C73F1EFE8BBA92B4" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-heap-l1-1-0.dll" />
</Component>
<Component Id="cmp7F729C94A363C73DC4D91B6F48E4F859" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil4BE19B924B98D56F3155B66496D574E5" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-locale-l1-1-0.dll" />
</Component>
<Component Id="cmp7C573E66B0904BA73880788F7057AF88" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE8495C446FA1237E92562498D20261AA" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-math-l1-1-0.dll" />
</Component>
<Component Id="cmp7A91CED53D8F6E5F20F2049B3B5CD143" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil06951EB208628753677745AF15CC12A5" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-multibyte-l1-1-0.dll" />
</Component>
<Component Id="cmp1CE713C705A95306A1D246AC3AB9DE25" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil8D102BB81768F998470C34797459E306" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-private-l1-1-0.dll" />
</Component>
<Component Id="cmp35840DFBF4D6AE827AFC4EF2A17BB3EB" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filC6C457BD901F940DCB673D271728F9FE" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-process-l1-1-0.dll" />
</Component>
<Component Id="cmpEBB86BDA48FE3B9E2043C1A80D26ACD5" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filE1B2095225B01DEFA5DA9895B432FBCB" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-runtime-l1-1-0.dll" />
</Component>
<Component Id="cmp80C8534B553078EA8B86F100FF542776" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filDAFE58019AD70832B8304DCEA534B5EE" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-stdio-l1-1-0.dll" />
</Component>
<Component Id="cmpCFC348111B5343749A2273A62421C07C" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil1F1B38DB330CA413655F715578D4BE1A" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-string-l1-1-0.dll" />
</Component>
<Component Id="cmp7D5450E04EC419244107942A00DF7DDF" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filEB03BCF3155C5BAE2C2EDBF036EB659D" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-time-l1-1-0.dll" />
</Component>
<Component Id="cmp5456679BDCC818B2E9476B416F71AAA5" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fil5B120DD384CABED37DFC2652C6462666" KeyPath="yes" Source="$(var.UcrtDir)\api-ms-win-crt-utility-l1-1-0.dll" />
</Component>
<Component Id="cmpF23755F862A15FFCBD109C85599B7F20" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="filD6887AD9110E4A8D49143C9A8F0B5843" KeyPath="yes" Source="$(var.UcrtDir)\ucrtbase.dll" />
</Component>
<Component Id="cmp9CFEE34E3A162AB05264E8B756EC1DEC" Directory="APPLICATIONFOLDER" Guid="*">
<File Id="fileMain.exe" KeyPath="yes" Source="$(var.ReleaseDir)\$(var.ExeName).exe" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>

View File

@ -100,7 +100,7 @@ ZYPPER_DEPENDENCIES = [
'speexdsp-devel', 'speex-devel', 'libdbus-c++-devel', 'jsoncpp-devel', 'yaml-cpp-devel',
'yasm', 'libuuid-devel', 'libnettle-devel', 'libopus-devel', 'libexpat-devel',
'libgnutls-devel', 'msgpack-c-devel', 'msgpack-cxx-devel', 'libavcodec-devel', 'libavdevice-devel', 'pcre-devel',
'alsa-devel', 'libpulse-devel', 'libudev-devel', 'libva-devel', 'libvdpau-devel',
'alsa-devel', 'libpulse-devel', 'libudev-devel', 'libva-devel', 'libvdpau-devel', 'pipewire-devel',
'libopenssl-devel', 'libavutil-devel',
]
@ -130,7 +130,7 @@ DNF_DEPENDENCIES = [
'gcc-c++', 'which', 'alsa-lib-devel', 'systemd-devel', 'libuuid-devel',
'uuid-devel', 'gnutls-devel', 'nettle-devel', 'opus-devel', 'speexdsp-devel',
'yaml-cpp-devel', 'swig', 'jsoncpp-devel',
'patch', 'libva-devel', 'openssl-devel', 'libvdpau-devel', 'msgpack-devel',
'patch', 'libva-devel', 'openssl-devel', 'libvdpau-devel', 'pipewire-devel', 'msgpack-devel',
'sqlite-devel', 'openssl-static', 'pandoc', 'nasm',
'bzip2'
]
@ -154,7 +154,7 @@ APT_DEPENDENCIES = [
'libopus-dev', 'libpcre3-dev', 'libpulse-dev', 'libssl-dev',
'libspeex-dev', 'libspeexdsp-dev', 'libswscale-dev', 'libtool',
'libudev-dev', 'libyaml-cpp-dev', 'sip-tester', 'swig',
'uuid-dev', 'yasm', 'libjsoncpp-dev', 'libva-dev', 'libvdpau-dev', 'libmsgpack-dev',
'uuid-dev', 'yasm', 'libjsoncpp-dev', 'libva-dev', 'libvdpau-dev', 'libpipewire-0.3-dev', 'libmsgpack-dev',
'pandoc', 'nasm', 'dpkg-dev', 'libsystemd-dev'
]
@ -389,6 +389,8 @@ def run_install(args):
install_args.append('-u')
if args.debug:
install_args.append('-d')
if args.testing:
install_args.append('-t')
if args.asan:
install_args.append('-A')
if args.no_libwrap:
@ -397,6 +399,8 @@ def run_install(args):
install_args.append('-w')
if args.arch:
install_args += ('-a', args.arch)
if args.extra_cmake_flags:
install_args += ('-D', args.extra_cmake_flags)
if args.distribution == OSX_DISTRIBUTION_NAME:
# The `universal_newlines` parameter has been renamed to `text` in
@ -725,6 +729,9 @@ def parse_args():
default=True, action='store_false')
ap.add_argument('--qt', type=str,
help='Use the Qt path supplied')
ap.add_argument('--testing', dest='testing',
default=False, action='store_true',
help='Enable testing for both client and daemon')
ap.add_argument('--no-libwrap', dest='no_libwrap',
default=False, action='store_true',
help='Disable libwrap. Also set --disable-shared option to daemon configure')
@ -740,6 +747,9 @@ def parse_args():
ap.add_argument('--pywinmake', dest='pywinmake',
default=False, action='store_true',
help='Build Jami for Windows using pywinmake')
# Allow supplying extra congifure flags to the client cmake.
ap.add_argument('--extra-cmake-flags', type=str,
help='Extra flags to pass to the client cmake')
dist = choose_distribution()

2
daemon

Submodule daemon updated: 609188283a...ef441f56dd

View File

@ -0,0 +1,34 @@
find_package(Git QUIET REQUIRED)
message(STATUS "Generating version information...")
function(configure_version_string SOURCE_DIR VERSION_STRING_OUT)
# Get short git SHA
execute_process(
COMMAND "${GIT_EXECUTABLE}" rev-parse --short HEAD
WORKING_DIRECTORY "${SOURCE_DIR}"
OUTPUT_VARIABLE _GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Output the VERSION_STRING_OUT to the caller
set(${VERSION_STRING_OUT} "${_GIT_SHA}" PARENT_SCOPE)
endfunction()
# These need to be set to the parent scripts values for configure_file to work,
# as it prepends CMAKE_CURRENT_SOURCE_DIR to the <input> and CMAKE_CURRENT_BINARY_DIR
# to <output>.
set(CMAKE_CURRENT_SOURCE_DIR ${APP_SOURCE_DIR})
set(CMAKE_CURRENT_BINARY_DIR ${APP_BINARY_DIR})
# Generate the version string for the application and core
configure_version_string(${APP_SOURCE_DIR} APP_VERSION_STRING)
configure_version_string(${CORE_SOURCE_DIR} CORE_VERSION_STRING)
# Get output file names with the .in extension removed
get_filename_component(VERSION_CPP_FILENAME ${CPP_INT_FILE} NAME_WE)
set(VERSION_CPP_FILE "${CMAKE_CURRENT_BINARY_DIR}/${VERSION_CPP_FILENAME}.cpp")
message(STATUS "infiles: ${CPP_INT_FILE}")
message(STATUS "outfiles: ${VERSION_CPP_FILE}")
configure_file(${CPP_INT_FILE} ${VERSION_CPP_FILE})

View File

@ -1,7 +0,0 @@
message("Qt deploying in dir " ${QML_SRC_DIR})
execute_process(COMMAND "${MAC_DEPLOY_QT_PATH}/macdeployqt"
${EXE_NAME}
-qmldir=${QML_SRC_DIR})
if(${ENABLE_SPARKLE} MATCHES true)
file(COPY ${SPARKLE_PATH} DESTINATION ${EXE_NAME}/Contents/Frameworks/)
endif()

View File

@ -1,4 +1,4 @@
FROM ubuntu:20.04
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND noninteractive
ENV QT_QUICK_BACKEND software
@ -10,7 +10,7 @@ RUN apt-get update && \
RUN apt install gnupg dirmngr ca-certificates curl --no-install-recommends
RUN curl -s https://dl.jami.net/public-key.gpg | tee /usr/share/keyrings/jami-archive-keyring.gpg > /dev/null
RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/internal/ubuntu_20.04/ jami main' > /etc/apt/sources.list.d/jami.list"
RUN sh -c "echo 'deb [signed-by=/usr/share/keyrings/jami-archive-keyring.gpg] https://dl.jami.net/internal/ubuntu_22.04/ jami main' > /etc/apt/sources.list.d/jami.list"
RUN apt-get update && apt-get install libqt-jami -y
RUN apt-get install -y -o Acquire::Retries=10 \
@ -51,6 +51,7 @@ RUN apt-get install -y -o Acquire::Retries=10 \
libswscale-dev \
libavdevice-dev \
libopus-dev \
libpipewire-0.3-dev \
libudev-dev \
libgsm1-dev \
libjsoncpp-dev \
@ -65,6 +66,7 @@ RUN apt-get install -y -o Acquire::Retries=10 \
libvdpau-dev \
libssl-dev
RUN apt-get install -y pandoc \
libcppunit-dev \
googletest \
libgtest-dev \
wget

View File

@ -113,7 +113,7 @@ pipeline {
cd ${dockerTopDir}
./build.py --install --qt /usr/lib/libqt-jami/
cd build
cmake .. -DENABLE_TESTS=True
cmake .. -DBUILD_TESTING=True
make -j${cpuCount}
""")
// Run tests

View File

@ -1,131 +1,240 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (C) 2015-2024 Savoir-faire Linux Inc. -->
<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>
<summary xml:lang="hu">Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform</summary>
<icon type="stock">jami</icon>
<description>
<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>
<summary xml:lang="hu">Adatvédelem-orientált hang-, video-, csevegés- és konferenciaplatform</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.
Jami [1], a GNU package, is software for universal and
distributed peer-to-peer communication that respects the
freedom and privacy of its users.
</p>
<p>
Jami supports the following key features:
Jami is the simplest and easiest way to connect with people
(and devices) with instant messaging, audio and video calls
over the Internet and LAN/WAN intranets.
</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
Jami is a free/libre, end-to-end encrypted, and private
communication platform.
</p>
<p>
Jami which used to be known as Ring is also an
open-source alternative (to Facebook Messenger, Signal,
Skype, Teams, Telegram, TikTok, Viber, WhatsApp, Zoom) that
prioritizes the privacy of its users.
</p>
<p>
Jami has a professional-looking design and is available for
a wide range of platforms. Unlike the alternatives, calls
using Jami are directly between users as it does not use
servers to handle calls.
</p>
<p>
This gives the greatest privacy as the distributed nature
of Jami means your calls are only between participants.
</p>
<p>
One-to-one and group conversations with Jami are enhanced
with: instant messaging; audio and video calling;
recording and sending audio and video messages;
file transfers; screen sharing; and, location sharing.
</p>
<p>
Jami can also function as a SIP client.
</p>
<p>
Jami has multiple extensions [2] available:
Audio Filter; Auto Answer; Green Screen; Watermark; and,
Whisper Transcript.
</p>
<p>
Jami can be easily deployed in organizations with the
“Jami Account Management Server” (JAMS) [3], allowing users
to connect with their corporate credentials or create local
accounts. JAMS allows you to manage your own Jami community
while taking advantage of Jamis distributed network
architecture.
</p>
<p>
Jami is available for GNU/Linux, Windows, macOS, iOS,
Android, and Android TV, making Jami an interoperable and
cross-platform communication framework.
</p>
<p xml:lang="hu">
Végpontokig titkosított biztonságos és elosztott hang-, videó-
és csevegés-kommunikációs platform, amely nem igényel központi
kiszolgálót, és a felhasználók kezében hagyja a magánélet és a
szabadság hatalmát.
<p>
Manage multiple SIP accounts, Jami accounts and JAMS
accounts with the Jami client installed on one or multiple
devices.
</p>
<p xml:lang="hu">
A Jami a következő főbb funkciókat támogatja:
<p>
Jami is free, unlimited, private, advertising free,
compatible, fast, autonomous, and anonymous.
</p>
<ul>
<li xml:lang="hu">Személyes beszélgetések</li>
<li xml:lang="hu">Fájlmegosztás</li>
<li xml:lang="hu">Hanghívások és konferenciák</li>
<li xml:lang="hu">Videohívások és konferenciák</li>
<li xml:lang="hu">Képernyőmegosztás videohívásokban és
konferenciákon</li>
<li xml:lang="hu">Hangüzenetek rögzítése és küldése</li>
<li xml:lang="hu">Videoüzenetek rögzítése és küldése</li>
<li xml:lang="hu">SIP-telefonszoftverként működik</li>
</ul>
<p xml:lang="hu">
Elérhetők a GNU/Linux, Windows, macOS, iOS, Android és Android TV
ügyfélalkalmazásai, így a Jami interoperábilis és többplatformos
kommunikációs keretrendszerré válik.
<p>
[1] https://jami.net/
</p>
<p>
[2] https://jami.net/extensions/
</p>
<p>
[3] https://jami.biz/
</p>
</description>
</description>
<description xml:lang="hu">
<p>
A Jami [1], egy GNU-csomag, egy univerzális és elosztott
társ-társ kommunikációra szolgáló szoftver, amely
tiszteletben tartja a felhasználók szabadságát és
magánéletét.
</p>
<p>
A Jami a legegyszerűbb és legegyszerűbb módja annak, hogy
azonnali üzenetküldéssel, hang- és videohívásokkal
kapcsolódjon az emberekhez (és eszközökhöz) az interneten és
a LAN/WAN intraneteken keresztül.
</p>
<p>
A Jami egy ingyenes, teljes körűen titkosított és privát
kommunikációs platform.
</p>
<p>
A Jami amelyet korábban Ring néven ismertek egy nyílt
forráskódú alternatíva is (a Facebook Messenger, a Signal,
a Skype, a Teams, a Telegram, a TikTok, a Viber, a WhatsApp,
a Zoom számára), amely előtérbe helyezi a felhasználók
magánéletét.
</p>
<p>
A Jami professzionális megjelenésű, és platformok széles
skálájához elérhető. Az alternatívákkal ellentétben a Jami-t
használó hívások közvetlenül a felhasználók között zajlanak,
mivel nem használ kiszolgálókat a hívások kezelésére.
</p>
<p>
Ez biztosítja a legnagyobb magánéletet, mivel a Jami
elosztott jellege azt jelenti, hogy a hívások csak a
résztvevők között zajlanak.
</p>
<p>
A Jamival folytatott személyes és csoportos beszélgetéseket
a következők javítják: azonnali üzenetküldés; hang- és
videohívások; hang- és videoüzenetek rögzítése és küldése;
fájlátvitel; képernyőmegosztás; és helymegosztás.
</p>
<p>
A Jami SIP-ügyfélként is működhet.
</p>
<p>
A Jami-nek több bővítménye [2] is elérhető: hangszűrő;
automatikus válasz; zöld képernyő; vízjel; és, suttogó
átirat.
</p>
<p>
A Jami könnyen telepíthető a szervezetekben
a „Jami fiókkezelő kiszolgálóval” (JAMS) [3], amely lehetővé
teszi a felhasználók számára, hogy csatlakozzanak vállalati
hitelesítő adataikhoz, vagy helyi fiókokat hozzanak létre.
A JAMS lehetővé teszi saját Jami közösségének kezelését,
miközben kihasználja a Jami elosztott hálózati
architektúráját.
</p>
<p>
A Jami elérhető GNU/Linux, Windows, macOS, iOS, Android és
Android TV rendszereken, így a Jami egy interoperábilis és
platformok közötti kommunikációs keretrendszer.
</p>
<p>
Kezeljen több SIP-fiókot, Jami-fiókot és JAMS-fiókot az egy
vagy több eszközre telepített Jami-ügyféllel.
</p>
<p>
A Jami ingyenes, korlátlan, privát, reklámmentes,
kompatibilis, gyors, autonóm és névtelen.
</p>
<p>
[1] https://jami.net/hu/
</p>
<p>
[2] https://jami.net/hu/extensions/
</p>
<p>
[3] https://jami.biz/
</p>
</description>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://jami.net/help/</url>
<url type="help">https://docs.jami.net</url>
<url type="donation">https://www.paypal.com/donate/?hosted_button_id=MGUDJLQZ4TP5W</url>
<url type="translate">https://www.transifex.com/savoirfairelinux/jami</url>
<url type="homepage">https://jami.net/</url>
<url type="bugtracker">https://git.jami.net/savoirfairelinux/jami-client-qt/issues</url>
<url type="faq">https://docs.jami.net/user/faq.html</url>
<url type="help">https://forum.jami.net/</url>
<url type="donation">https://jami.net/whydonate/</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>
<caption xml:lang="hu">Hang-, video- és csevegőüzeneteket küldhet</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>
<caption xml:lang="hu">Könnyen megoszthatja az asztali tartalmat</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>
<caption xml:lang="hu">Kristálytiszta hanghívások a Jami felhasználók között</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>
<caption xml:lang="hu">Konferenciahívások korlátlan számú résztvevővel</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>
<caption xml:lang="hu">Titkosított és biztonságos csevegési üzenetküldés, kiszolgálók nélkül</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 any size</caption>
<caption xml:lang="hu">Bármilyen méretű fájl küldése</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>
<!-- Maximum caption length is 60 characters -->
<!-- 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="hu">Csevegőüzenetek küldése, valamint hang- és videobeszélgetés</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="hu">Képernyőmegosztás</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 calls between Jami users</caption>
<caption xml:lang="hu">Kristálytiszta hanghívások a Jami felhasználók között</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>
<caption>Conference calls with an unlimited number of participants</caption>
<caption xml:lang="hu">Konferenciahívások korlátlan számú résztvevővel</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>
<caption>Encrypted and secure text messaging without servers</caption>
<caption xml:lang="hu">Titkosított és biztonságos csevegési üzenetküldés, kiszolgálók nélkül</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="hu">Bármilyen méretű fájl küldése</caption>
</screenshot>
</screenshots>
<launchable type="desktop-id">jami.desktop</launchable>
<launchable type="desktop-id">jami.desktop</launchable>
<provides><binary>jami</binary></provides>
<provides><binary>jami</binary></provides>
<!-- https://specifications.freedesktop.org/menu-spec/latest/apa.html -->
<!-- https://specifications.freedesktop.org/menu-spec/latest/apas02.html -->
<categories>
<category>Chat</category>
<category>Communication</category>
<category>FileTransfer</category>
<category>InstantMessaging</category>
<category>Network</category>
<category>P2P</category>
<category>Productivity</category>
</categories>
<!-- https://specifications.freedesktop.org/menu-spec/latest/apa.html -->
<!-- https://specifications.freedesktop.org/menu-spec/latest/apas02.html -->
<categories>
<category>Chat</category>
<category>Communication</category>
<category>FileTransfer</category>
<category>InstantMessaging</category>
<category>Network</category>
<category>P2P</category>
<category>Productivity</category>
</categories>
<translation type="gettext">jami-client-qt</translation>
<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>
<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>
<requires><id>net.jami.daemon</id></requires>
</component>

View File

@ -49,7 +49,7 @@ QT_MAJOR := 6
QT_MINOR := 6
QT_PATCH := 1
QT_TARBALL_CHECKSUM := dd3668f65645fe270bc615d748bd4dc048bd17b9dc297025106e6ecc419ab95d
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-0
DEBIAN_QT_VERSION := $(QT_MAJOR).$(QT_MINOR).$(QT_PATCH)-1
DEBIAN_QT_DSC_FILENAME := libqt-jami_$(DEBIAN_QT_VERSION).dsc
QT_JAMI_PREFIX := /usr/lib/libqt-jami
@ -166,11 +166,14 @@ DISTRIBUTIONS := \
debian_unstable \
ubuntu_20.04 \
ubuntu_22.04 \
ubuntu_23.04 \
ubuntu_23.10 \
ubuntu_24.04 \
ubuntu_24.10 \
fedora_37 \
fedora_38 \
fedora_39 \
fedora_40 \
fedora_41 \
alma_9 \
opensuse-leap_15.4 \
opensuse-leap_15.5 \

View File

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

View File

@ -28,4 +28,10 @@ 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 Debian 11 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -27,9 +27,7 @@ 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/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -27,9 +27,7 @@ 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/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -98,6 +98,7 @@ RUN dnf install -y \
clang \
cmake \
fmt-devel \
pipewire-devel \
cups-devel #Chromium for Qt
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh

View File

@ -98,7 +98,8 @@ RUN dnf install -y \
cmake \
fmt-devel \
python3-html5lib \
cups-devel
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh

View File

@ -97,7 +97,8 @@ RUN dnf install -y \
cmake \
fmt-devel \
python3.10 \
cups-devel
cups-devel \
pipewire-devel
ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-rpm.sh

View File

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

View File

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

View File

@ -99,7 +99,8 @@ RUN zypper --non-interactive install -y \
gstreamer-plugins-bad-devel \
gstreamer-plugins-base-devel \
cmake \
wget
wget \
pipewire-devel
# openSUSE Leap 15.4 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.6.1
@ -112,4 +113,10 @@ ADD extras/packaging/gnu-linux/scripts/build-package-rpm.sh /opt/build-package-r
ENV CC=gcc
ENV CXX=g++
# 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 openSUSE Leap 15.4 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-rpm.sh"]

View File

@ -1,6 +1,6 @@
FROM opensuse/leap:15.5
RUN zypper refresh
RUN zypper --gpg-auto-import-keys refresh
RUN zypper --non-interactive install -y \
dnf \
@ -100,7 +100,8 @@ RUN zypper --non-interactive install -y \
gstreamer-plugins-bad-devel \
gstreamer-plugins-base-devel \
cmake \
wget
wget \
pipewire-devel
# openSUSE Leap 15.5 comes with Python 3.6 by default,
# but we need at least 3.7 to compile Qt 6.6.1

View File

@ -69,7 +69,11 @@ COPY --from=builder /snap/snapcraft /snap/snapcraft
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 && locale-gen en_US.UTF-8
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"

View File

@ -33,4 +33,10 @@ ADD extras/packaging/gnu-linux/scripts/install-cmake.sh /opt/install-cmake.sh
RUN /opt/install-cmake.sh
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
# Setting this variable so that FFmpeg gets built without pipewiregrab
# (see daemon/contrib/bootstrap and daemon/contrib/src/ffmpeg/rules.mak)
# We rely on PipeWire for screen sharing on Wayland, but the version available on Ubuntu 20.04 is too old.
ENV DISABLE_PIPEWIRE=true
CMD ["/opt/build-package-debian.sh"]

View File

@ -1,4 +1,4 @@
FROM ubuntu:23.04
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
@ -10,6 +10,9 @@ RUN apt-get update && \
python-is-python3 \
wget
ADD extras/packaging/gnu-linux/scripts/install-gcc-debian.sh /opt/install-gcc-debian.sh
RUN /opt/install-gcc-debian.sh 13
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

View File

@ -0,0 +1,29 @@
FROM ubuntu:24.10
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get clean
RUN apt-get update && \
apt-get install -y -o Acquire::Retries=10 \
devscripts \
equivs \
python-is-python3 \
wget
ADD extras/packaging/gnu-linux/scripts/prebuild-package-debian.sh /opt/prebuild-package-debian.sh
COPY extras/packaging/gnu-linux/rules/debian-qt/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh qt-deps
COPY extras/packaging/gnu-linux/rules/debian/control /tmp/builddeps/debian/control
RUN /opt/prebuild-package-debian.sh jami-deps
# Remove the libre2-dev package in order to force Qt to build using the bundled
# version of the RE2 library. This is necessary because the system version of the
# library on Ubuntu 24.10 (libre2-11) is not compatible with the one used in
# Qt 6.6.1 due to an API change:
# https://codereview.qt-project.org/c/qt/qtwebengine/+/516094
RUN apt-get remove -y libre2-dev libre2-11
ADD extras/packaging/gnu-linux/scripts/build-package-debian.sh /opt/build-package-debian.sh
CMD ["/opt/build-package-debian.sh"]

View File

@ -92,6 +92,7 @@ Build-Depends: debhelper (>= 9),
libgl1-mesa-dri,
# pkg-kde-tools (>= 0.15.17~),
python3:any,
python3-bs4,
python3-html5lib,
# qtbase5-private-dev (>= 5.15.2+dfsg~),
xauth <!nocheck>,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,7 @@
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

View File

@ -22,7 +22,7 @@ Build-Depends: debhelper (>= 9),
libpulse-dev,
libasound2-dev,
libexpat1-dev,
libpcre3-dev,
libpcre3-dev | libpcre2-dev,
libyaml-cpp-dev,
libboost-dev,
libxext-dev,
@ -45,6 +45,8 @@ 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,
# other
nasm,
yasm,

View File

@ -99,10 +99,12 @@ if [ -f /etc/os-release ]; then
ENDTAG="ubuntu_20.04"
elif [ "${UBUNTU_CODENAME}" = "jammy" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_22.04" ]; then
ENDTAG="ubuntu_22.04"
elif [ "${UBUNTU_CODENAME}" = "lunar" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.04" ]; then
ENDTAG="ubuntu_23.04"
elif [ "${UBUNTU_CODENAME}" = "mantic" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_23.10" ]; then
ENDTAG="ubuntu_23.10"
elif [ "${UBUNTU_CODENAME}" = "noble" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.04" ]; then
ENDTAG="ubuntu_24.04"
elif [ "${UBUNTU_CODENAME}" = "oracular" ] || [ "${ID}_${VERSION_ID}" = "ubuntu_24.10" ]; then
ENDTAG="ubuntu_24.10"
elif [ "${ID}" = "debian" ] && \
[ "$(command -v lsb_release)" ] && \
[ "$(lsb_release -rs)" = "testing" ]; then

View File

@ -50,6 +50,7 @@ BuildRequires: libuuid-devel
BuildRequires: libva-devel
BuildRequires: libvdpau-devel
BuildRequires: pcre-devel
BuildRequires: pipewire-devel
BuildRequires: uuid-devel
BuildRequires: yaml-cpp-devel

View File

@ -16,6 +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
%define __provides_exclude_from ^%{_libdir}/qt-jami/.*$
%define __requires_exclude ^libQt6.*$
Name: %{name}
Version: %{version}
@ -26,6 +29,8 @@ 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
%global gst 0.10
%if 0%{?fedora} || 0%{?rhel} > 7
@ -61,6 +66,8 @@ This package contains Qt libraries for Jami.
%prep
%setup -n qt-everywhere-src-%{version}
%patch -P 0 -p1
%patch -P 1 -p1
%build
echo "Building Qt using %{job_count} parallel jobs"

View File

@ -2,6 +2,9 @@
%define version RELEASE_VERSION
%define release 0
# Exclude vendored Qt6 from dependency generator
%define __requires_exclude ^libQt6.*$
Name: %{name}
Version: %{version}
Release: %{release}%{?dist}

View File

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

View File

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

View File

@ -138,6 +138,10 @@ apps:
autostart: jami.desktop
common-id: net.jami.Jami
desktop: usr/share/applications/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"
slots:
- dbus-jami
- dbus-ring
@ -168,7 +172,7 @@ package-repositories:
components: [main]
suites: [jami]
key-id: A295D773307D25A33AE72F2F64CD5FA175348F84
url: https://dl.jami.net/nightly/ubuntu_20.04/
url: https://dl.jami.net/internal/ubuntu_20.04/
parts:
desktop-launch:
@ -255,6 +259,8 @@ parts:
sed -i -E 's|(tmpName) << (PACKAGE_NAME << "_shm_")|\1 << "snap.jami." << \2|' ./daemon/src/media/video/sinkclient.cpp
sed -i -E 's|^Icon=.*|Icon=${SNAP}/usr/share/icons/hicolor/scalable/apps/jami.svg|' extras/data/jami.desktop
override-build: |
$SNAPCRAFT_PART_BUILD/extras/packaging/gnu-linux/scripts/install-pipewire-from-source.sh
cd $SNAPCRAFT_PART_BUILD/daemon/contrib
mkdir -p native
cd native
@ -319,6 +325,12 @@ parts:
- 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

View File

@ -44,6 +44,23 @@ 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
if cat /etc/os-release | grep -Eq "24.04"; 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

View File

@ -35,6 +35,7 @@ rpmdev-setuptree
# Copy the source tarball.
cp --reflink=auto "/src/$RELEASE_TARBALL_FILENAME" /root/rpmbuild/SOURCES
cp patches/*.patch /root/rpmbuild/SOURCES/
QT_JAMI_PREFIX="/usr/lib64/qt-jami"
PATH="${QT_JAMI_PREFIX}/bin:${PATH}"
@ -43,7 +44,7 @@ PKG_CONFIG_PATH="${QT_JAMI_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}"
CMAKE_PREFIX_PATH="${QT_JAMI_PREFIX}/lib/cmake:${CMAKE_PREFIX_PATH}"
QT_MAJOR=6
QT_MINOR=6
QT_PATCH=1
QT_PATCH=3
QT_RELEASE_PATCH=0
QT_MAJOR_MINOR=${QT_MAJOR}.${QT_MINOR}
@ -52,7 +53,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="dd3668f65645fe270bc615d748bd4dc048bd17b9dc297025106e6ecc419ab95d"
QT_TARBALL_SHA256="69d0348fef415da98aa890a34651e9cfb232f1bffcee289b7b4e21386bf36104"
QT_TARBALL_FILE_NAME=$(basename "$QT_TARBALL_URL")
CACHED_QT_TARBALL=$TARBALLS/$QT_TARBALL_FILE_NAME
@ -111,6 +112,10 @@ if [ ! -f "${RPM_PATH}" ]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc38.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_39" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc39.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_40" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc40.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "fedora_41" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.fc41.x86_64.rpm "${RPM_PATH}"
elif [[ "${DISTRIBUTION}" == "alma_9" ]]; then
cp /root/rpmbuild/RPMS/x86_64/jami-libqt-$QT_MAJOR_MINOR_PATCH-*.el9.x86_64.rpm "${RPM_PATH}"
else

View File

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

View File

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

View File

@ -1,34 +0,0 @@
From ca2be6466c150d1b82a646d97b27df35b45d90f1 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Tue, 9 Jan 2024 15:25:19 -0500
Subject: [PATCH] workaround right margin
---
src/core/contexts/win32windowcontext.cpp | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index 3f6623e..9ee7752 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -402,6 +402,17 @@ namespace QWK {
return true;
}
}
+
+#if !QWINDOWKIT_CONFIG(ENABLE_WINDOWS_SYSTEM_BORDERS)
+ if (msg->message == WM_MOVE || msg->message == WM_SIZE ||
+ (msg->message == WM_IME_SETCONTEXT && (GetForegroundWindow() == msg->hwnd))) {
+ static const auto flags = SWP_FRAMECHANGED | SWP_NOMOVE |
+ SWP_NOSIZE | SWP_NOZORDER |
+ SWP_NOOWNERZORDER;
+ SetWindowPos(msg->hwnd, NULL, 0, 0, 0, 0, flags);
+ }
+#endif
+
return false;
}
--
2.7.4

View File

@ -28,7 +28,7 @@ mutually exclusive required arguments:
-z, --zip Build portable archive
examples:
1. build.py --qt=C:/Qt/6.6.1/msvc2019_64 # Build the app using a specific Qt
1. build.py --qt=C:/Qt/6.6.2/msvc2019_64 # Build the app using a specific Qt
2. build.py --init pack --msi # Build the app and an MSI installer
3. build.py --init --tests # Build the app and run tests
build.py pack --zip --skip-build # Generate a 7z archive of the app
@ -280,7 +280,7 @@ def build(config_str, qt_dir, tests):
"-DCMAKE_INSTALL_PREFIX=" + os.getcwd(),
"-DCMAKE_SYSTEM_VERSION=" + WIN_SDK_VERSION,
"-DCMAKE_BUILD_TYPE=" + "Release",
"-DENABLE_TESTS=" + str(tests).lower(),
"-DBUILD_TESTING=" + str(tests).lower(),
"-DBETA=" + str((0, 1)[config_str == "Beta"]),
]

View File

@ -99,6 +99,12 @@ for ARCH in "${ARCHS[@]}"; do
echo "$ARCH"
cd "$DAEMON"
HOST="${ARCH}-apple-darwin"
SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
CC="xcrun -sdk macosx clang"
CXX="xcrun -sdk macosx clang++"
CFLAGS="-arch $ARCH -isysroot $SDKROOT"
CXXFLAGS="-std=c++17 $CFLAGS"
CONFIGURE_FLAGS=" --without-dbus --host=${HOST} -with-contrib=$DAEMON/contrib/${ARCH}-apple-darwin${OS_VER} --prefix=${INSTALL}/daemon/$ARCH"
if [ "${debug}" = "true" ]; then
@ -113,7 +119,11 @@ for ARCH in "${ARCHS[@]}"; do
mkdir -p "build-macos-${ARCH}"
cd "build-macos-${ARCH}"
"$DAEMON"/configure $CONFIGURE_FLAGS ARCH="$ARCH" || exit 1
"$DAEMON"/configure $CONFIGURE_FLAGS ARCH="$ARCH" \
CC="$CC $CFLAGS" \
CXX="$CXX $CXXFLAGS" \
CFLAGS="$CFLAGS" \
CXXFLAGS="$CXXFLAGS" || exit 1
echo "$CONFIGURE_FLAGS"

View File

@ -1,61 +1,89 @@
#!/usr/bin/env bash
set -e
# Flags:
# -a: architecture to build. Accepted values arm64, x86_64, unified
# Usage:
# ./build_qrencode.sh -a <architecture>
# Accepted architectures: arm64, x86_64, unified
# If no architecture is specified, the script builds for the host architecture.
# Initialize variables
arch=''
while getopts "a:" OPT; do
case "$OPT" in
a)
arch="${OPTARG}"
;;
\?)
exit 1
;;
a)
arch="${OPTARG}"
;;
\?)
echo "Invalid option: -$OPTARG" >&2
echo "Usage: $0 [-a architecture]"
echo "Accepted architectures: arm64, x86_64, unified"
exit 1
;;
esac
done
# Determine architectures to build
if [[ "$arch" == 'unified' ]]; then
ARCHS=("arm64" "x86_64")
elif [[ "$arch" == '' ]]; then
ARCHS=("arm64")
# Detect host architecture
HOST_ARCH=$(uname -m)
case "$HOST_ARCH" in
x86_64|arm64)
ARCHS=("$HOST_ARCH")
;;
*)
echo "Unsupported host architecture: $HOST_ARCH"
echo "Supported architectures are: arm64, x86_64, unified"
exit 1
;;
esac
else
ARCHS=("$arch")
# Validate specified architecture
case "$arch" in
x86_64|arm64)
ARCHS=("$arch")
;;
*)
echo "Invalid architecture specified: $arch"
echo "Accepted architectures are: arm64, x86_64, unified"
exit 1
;;
esac
fi
TOP="$(pwd)"
QRENCODEDIR="${TOP}/3rdparty/libqrencode"
if [ -z "$NPROC" ]; then
NPROC=$(sysctl -n hw.ncpu || echo -n 1)
fi
BUILDDIR="${QRENCODEDIR}/build-libqrencode"
LIBDIR="${QRENCODEDIR}/lib"
INCLUDEDIR="${QRENCODEDIR}/include"
for ARCH in "${ARCHS[@]}"; do
cd "$QRENCODEDIR" || exit 1
BUILDDIR="$ARCH-libqrencode"
mkdir "$BUILDDIR"
make clean
./autogen.sh
./configure --host="$ARCH" --without-png --prefix="${QRENCODEDIR}/${BUILDDIR}" CFLAGS=" -arch $ARCH $CFLAGS"
make -j"$NPROC"
make install
done
mkdir -p "$QRENCODEDIR"/lib
mkdir -p "$QRENCODEDIR"/include
# Clean up build directory
echo "Preparing clean build directory"
rm -rf "$BUILDDIR"
mkdir -p "$BUILDDIR"
if ((${#ARCHS[@]} == "2")); then
echo "Making fat lib for ${ARCHS[0]} and ${ARCHS[1]}"
LIBFILES="$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/*.a"
for f in $LIBFILES; do
libFile=${f##*/}
echo "$libFile"
lipo -create "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/$libFile" \
"$QRENCODEDIR/${ARCHS[1]}-libqrencode/lib/$libFile" \
-output "${QRENCODEDIR}/lib/$libFile"
done
else
echo "No need for fat lib"
rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/lib/"*.a "${QRENCODEDIR}/lib/"
fi
# Clean output directories
rm -rf "$LIBDIR" "$INCLUDEDIR"
mkdir -p "$LIBDIR"
mkdir -p "$INCLUDEDIR"
rsync -ar --delete "$QRENCODEDIR/${ARCHS[0]}-libqrencode/include/"* "${QRENCODEDIR}/include/"
# Convert architectures to semicolon-separated format for cmake
ARCHS_SEMICOLON_SEPARATED=$(IFS=";"; echo "${ARCHS[*]}")
echo "Configuring CMake for architectures: ${ARCHS[*]}"
cd "$BUILDDIR"
cmake "$QRENCODEDIR" \
-DCMAKE_OSX_ARCHITECTURES="$ARCHS_SEMICOLON_SEPARATED" \
-DCMAKE_INSTALL_PREFIX="$QRENCODEDIR" \
-DWITHOUT_PNG=ON \
-DBUILD_SHARED_LIBS=OFF \
-G "Xcode"
echo "Building libqrencode for architectures: ${ARCHS[*]}"
cmake --build . --config Release
echo "Installing libqrencode to $LIBDIR and $INCLUDEDIR"
cmake --install . --config Release
echo "Build and installation completed successfully, with outputs in $LIBDIR and $INCLUDEDIR."

View File

@ -29,6 +29,8 @@ export OSTYPE
# -W: disable libwrap and shared library
# -w: do not use Qt WebEngine
# -a: arch to build
# -A: enable AddressSanitizer
# -D: extra CMake flags for the client
set -ex
@ -44,9 +46,11 @@ priv_install=true
enable_libwrap=true
enable_webengine=true
asan=
extra_cmake_flags=''
arch=''
enable_testing=false
while getopts gsc:dQ:P:p:uWwa:A OPT; do
while getopts gsc:dQ:P:p:uWwa:AtD: OPT; do
case "$OPT" in
g)
global='true'
@ -81,6 +85,12 @@ while getopts gsc:dQ:P:p:uWwa:A OPT; do
A)
asan='true'
;;
t)
enable_testing='true'
;;
D)
extra_cmake_flags="${OPTARG}"
;;
\?)
exit 1
;;
@ -196,6 +206,12 @@ if [ "${asan}" = "true" ]; then
client_cmake_flags+=(-DENABLE_ASAN=true)
fi
if [ "${enable_testing}" = "true" ]; then
client_cmake_flags+=(-DBUILD_TESTING=On)
else
client_cmake_flags+=(-DBUILD_TESTING=Off)
fi
if [[ "$OSTYPE" == "darwin"* ]]; then
#detect arch for macos
CMAKE_OSX_ARCHITECTURES="arm64"
@ -220,6 +236,11 @@ else
-DWITH_DAEMON_SUBMODULE=true)
fi
# Add extra flags for the client
if [ -n "${extra_cmake_flags}" ]; then
client_cmake_flags+=(${extra_cmake_flags})
fi
echo "info: Configuring $client client with flags: ${client_cmake_flags[*]}"
cmake .. "${client_cmake_flags[@]}"
make -j"${proc}" V=1

View File

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

View File

@ -0,0 +1,10 @@
<svg id="Receive" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="12" height="12" viewBox="0 0 12 12">
<defs>
<clipPath id="clip-path">
<rect id="Rectangle_429" data-name="Rectangle 429" width="12" height="12" fill="none"/>
</clipPath>
</defs>
<g id="Group_225" data-name="Group 225" clip-path="url(#clip-path)">
<path id="Path_333" data-name="Path 333" d="M6.43,8.784,3.007,5.362,4.06,4.309l2.37,2.37,4.314-4.314A5.966,5.966,0,0,0,6,0c-.032,0-.061.008-.094.01A5.98,5.98,0,0,0,.094,5.074,5.911,5.911,0,0,0,0,6a5.911,5.911,0,0,0,.094.926A5.98,5.98,0,0,0,5.906,11.99c.032,0,.061.01.094.01a6,6,0,0,0,5.533-8.32Z" fill="#60c880"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 702 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22.08" height="22.08" viewBox="0 0 22.08 22.08">
<path id="noun-arrow-1167262" d="M35.45,26.488l-4.476,4.476V18.9H28.916V30.964l-4.476-4.476L23,27.955,29.945,34.9l6.971-6.945Z" transform="translate(8.913 -29.202) rotate(45)" stroke="#000" stroke-width="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 316 B

View File

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="8.814" viewBox="0 0 16 8.814">
<g id="noun-missed-3555066" transform="translate(-23.455 -28)">
<g id="Group_82" data-name="Group 82" transform="translate(23.455 28)">
<path id="Path_289" data-name="Path 289" d="M37.727,37.615a2.761,2.761,0,0,1-1.964-.815L31.17,32.211l1.782-1.782,4.589,4.593a.268.268,0,0,0,.368,0l5.852-5.852,1.782,1.782L39.691,36.8A2.761,2.761,0,0,1,37.727,37.615Z" transform="translate(-29.543 -28.802)"/>
<path id="Path_290" data-name="Path 290" d="M28.518,35.555H26v-6.3A1.259,1.259,0,0,1,27.259,28h6.3v2.518H28.518Z" transform="translate(-26 -28)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 672 B

View File

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="8.814" viewBox="0 0 16 8.814">
<g id="noun-missed-3555066" transform="translate(-0.001)">
<g id="Group_82" data-name="Group 82" transform="translate(0.001)">
<path id="Path_289" data-name="Path 289" d="M38.986,37.615A2.761,2.761,0,0,0,40.95,36.8l4.593-4.589-1.782-1.782-4.589,4.593a.268.268,0,0,1-.368,0L32.952,29.17,31.17,30.952,37.022,36.8A2.761,2.761,0,0,0,38.986,37.615Z" transform="translate(-31.17 -28.802)"/>
<path id="Path_290" data-name="Path 290" d="M31.036,35.555h2.518v-6.3A1.259,1.259,0,0,0,32.3,28H26v2.518h5.036Z" transform="translate(-17.555 -28)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 666 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="22.08" height="22.08" viewBox="0 0 22.08 22.08">
<path id="noun-arrow-1167262" d="M12.45,7.589,7.974,12.064V0H5.916V12.064L1.44,7.588,0,9.055,6.945,16l6.971-6.945Z" transform="translate(10.267 21.654) rotate(-135)" stroke="#000" stroke-width="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 306 B

View File

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="48" width="48"><path d="M42 13.85V39q0 1.2-.9 2.1-.9.9-2.1.9H9q-1.2 0-2.1-.9Q6 40.2 6 39V9q0-1.2.9-2.1Q7.8 6 9 6h25.15Zm-3 1.35L32.8 9H9v30h30ZM24 35.75q2.15 0 3.675-1.525T29.2 30.55q0-2.15-1.525-3.675T24 25.35q-2.15 0-3.675 1.525T18.8 30.55q0 2.15 1.525 3.675T24 35.75ZM11.65 18.8h17.9v-7.15h-17.9ZM9 15.2V39 9Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 -960 960 960" width="48px" fill="#e8eaed"><path d="M480-313 287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193ZM220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Z"/></svg>

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 268 B

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
<path d="M17.1,15.7c-0.8,0-1.5,0.3-2.1,0.8l-5.3-3.3C9.9,12.8,10,12.4,10,12c0-0.4-0.1-0.8-0.3-1.2l5.3-3.3c0.6,0.5,1.3,0.8,2.1,0.8
c1.7,0,3.1-1.4,3.1-3.1S18.9,2,17.1,2C15.4,2,14,3.4,14,5.1c0,0.4,0.1,0.8,0.3,1.2L8.9,9.6C8.3,9.1,7.6,8.9,6.9,8.9
c-1.7,0-3.1,1.4-3.1,3.1s1.4,3.1,3.1,3.1c0.8,0,1.5-0.3,2.1-0.8l5.3,3.3C14.1,18,14,18.4,14,18.9c0,1.7,1.4,3.1,3.1,3.1
c1.7,0,3.1-1.4,3.1-3.1S18.9,15.7,17.1,15.7z M17.1,20.6c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8c1,0,1.8,0.8,1.8,1.8
S18.1,20.6,17.1,20.6z M17.1,3.4c1,0,1.8,0.8,1.8,1.8s-0.8,1.8-1.8,1.8c-1,0-1.8-0.8-1.8-1.8S16.2,3.4,17.1,3.4z M6.9,13.8
c-1,0-1.8-0.8-1.8-1.8s0.8-1.8,1.8-1.8S8.6,11,8.6,12S7.8,13.8,6.9,13.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 1019 B

View File

@ -1,10 +1,13 @@
<h4 align="left"><span style="font-weight:600"> Created by</span></h4>
<p>Adrien Béraud<br>
<p>%1</p>
<h4 align="left"><span style="font-weight:600">%2</span></h4>
<p>Abhishek Ojha<br>
Adrien Béraud<br>
Albert Babí<br>
Alexandre Lision<br>
Alexandr Sergheev<br>
Alexandre Viau<br>
Alexander Lussier-Cullen<br>
Alexandr Sergheev<br>
Alexandre Eberhardt<br>
Alexandre Lision<br>
Alexandre Viau<br>
Aline Bonnet<br>
Aline Gondim Santos<br>
Alireza Toghiani<br>
@ -17,7 +20,6 @@ Brando Tovar<br>
Capucine Berthet<br>
Charles-Francis Damedey<br>
Cyrille Béraud<br>
Dorina Mosku<br>
Eden Abitbol<br>
Édric Milaret<br>
Éloi Bail<br>
@ -25,17 +27,23 @@ Emma Falkiewitz<br>
Emmanuel Lepage-Vallée<br>
Fadi Shehadeh<br>
Franck Laurent<br>
François-Simon Fauteux-Chapleau<br>
Frédéric Guimont<br>
Guillaume Heller<br>
Guillaume Roguez<br>
Hadrien De Sousa<br>
Hugo Lefeuvre<br>
Julien Grossholtz<br>
Julien Robert<br>
Kateryna Kostiuk<br>
Kessler DuPont-Teevin<br>
Léo Banno-Cloutier<br>
Léopold Chappuis<br>
Liam Courdoson<br>
Loïc Siret<br>
Louis Maillard<br>
Mathéo Joseph<br>
Michel Schmit<br>
Mingrui Zhang<br>
Mohamed Chibani<br>
Mohamed Amine Younes Bouacida<br>
@ -55,6 +63,7 @@ Rayan Osseiran<br>
Romain Bertozzi<br>
Saher Azer<br>
Sébastien Blin<br>
Seva Ivanov<br>
Silbino Gonçalves Matado<br>
Simon Désaulniers<br>
Simon Zeni<br>
@ -62,9 +71,21 @@ Stepan Salenikovich<br>
Thibault Wittemberg<br>
Thomas Ballasi<br>
Trevor Tabah<br>
Vitalii Nikitchyn<br>
Vsevolod Ivanov<br>
Xavier Jouslin de Noray<br>
Yang Wang<br></p>
<h4 align="left"><span style="font-weight:600"> Artwork by</span></h4>
Yang Wang<br>
</p>
<h4 align="left"><span style="font-weight:600"> %3</span></h4>
<p>Charlotte Hoffmann<br>
Marianne Forget<br></p>
<h4 align="left"><span style="font-weight:600"> %4</span></h4>
<p>Dorina Mosku<br>
Cabrel Tambue<br>
Loïc Bogino<br></p>
<h4 align="left"><span style="font-weight:600"> %5</span></h4>
<p>Anna<br>
Elys<br>
VeroJeanLuc<br>
</p>
<p>%6</p>

View File

@ -0,0 +1,217 @@
/*
* Copyright (C) 2024 Savoir-faire Linux Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt.labs.qmlmodels
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Enums 1.1
import net.jami.Helpers 1.1
import net.jami.Constants 1.1
import "mainview"
import "mainview/components"
import "wizardview"
import "commoncomponents"
// A window into which we can load a QML file for testing.
ApplicationWindow {
id: appWindow
visible: true
width: testWidth || loader.implicitWidth || 800
height: testHeight || loader.implicitHeight || 600
title: testComponentURI
// WARNING: The following currently must be maintained in tandem with MainApplicationWindow.qml
// Used to manage full screen mode and save/restore window geometry.
readonly property bool useFrameless: false
property bool isRTL: UtilsAdapter.isRTL
LayoutMirroring.enabled: isRTL
LayoutMirroring.childrenInherit: isRTL
property LayoutManager layoutManager: LayoutManager {
appContainer: null
}
// Used to manage dynamic view loading and unloading.
property ViewManager viewManager: ViewManager {}
// Used to manage the view stack and the current view.
property ViewCoordinator viewCoordinator: ViewCoordinator {}
Loader {
id: loader
source: Qt.resolvedUrl(testComponentURI)
onStatusChanged: {
console.log("Status changed to:", loader.status)
if (loader.status == Loader.Error || loader.status == Loader.Null) {
console.error("Couldn't load component:", source)
Qt.exit(1);
} else if (loader.status == Loader.Ready) {
console.info("Loaded component:", source);
// If any of the dimensions are not set, set them to the appWindow's dimensions
item.width = item.width || Qt.binding(() => appWindow.width);
item.height = item.height || Qt.binding(() => appWindow.height);
}
}
}
// Closing this window should always exit the application.
onClosing: Qt.quit()
// A window to modify properties for Jamified components.
// Sometimes we need to modify properties including current conversation ID, account ID, etc.
// This window should have a simple layout: a list of editable parameters within a scroll view.
Window {
id: configTool
width: 400
height: 400
title: "Config tool"
visible: true
// Cannot be closed.
flags: Qt.SplashScreen
// Anchor the window to the right of the parent window.
x: appWindow.x + appWindow.width
y: appWindow.y
color: "lightgray"
Page {
anchors.fill: parent
header: Control {
contentItem: Text {
horizontalAlignment: Text.AlignHCenter
text: "Config tool"
}
background: Rectangle { color: configTool.color }
}
contentItem: Control {
background: Rectangle { color: Qt.lighter(configTool.color, 1.1) }
padding: 10
contentItem: ListView {
// Declare types of controls. TODO: add as needed.
Component {
id: checkComponent
CheckBox {
text: label
onCheckedChanged: checkChangedCb(checked)
}
}
Component {
id: comboComponent
Control {
contentItem: RowLayout {
Text { text: label }
ComboBox {
id: comboBox
displayText: CurrentConversation.title || "undefined"
model: getDataModel()
delegate: ItemDelegate {
highlighted: comboBox.highlightedIndex === index
width: parent.width
text: JamiQmlUtils.getModelData(comboBox.model, index, displayRole)
}
onCurrentIndexChanged: onIndexChanged(model, currentIndex)
}
}
}
}
spacing: 5
model: ListModel {
ListElement {
label: "Conversation ID"
type: "combobox"
getDataModel: () => ConversationsAdapter.convListProxyModel
displayRole: ConversationList.Title
onIndexChanged: function(model, index) {
const convUid = JamiQmlUtils.getModelData(model, index, ConversationList.UID);
LRCInstance.selectConversation(convUid);
}
}
ListElement {
label: "Account ID"
type: "combobox"
getDataModel: () => AccountListModel
displayRole: AccountList.Username
onIndexChanged: function(model, index) {
const accountId = JamiQmlUtils.getModelData(model, index, AccountList.ID);
LRCInstance.currentAccountId = accountId;
}
}
ListElement {
label: "Force local preview"
type: "checkbox"
value: false
checkChangedCb: function(checked) {
// Find any child component of type `LocalVideo` and start it.
const localVideo = findChild(loader.item, LocalVideo, "type");
if (localVideo) {
if (checked) {
localVideo.startWithId(VideoDevices.getDefaultDevice());
} else {
localVideo.startWithId("");
}
} else {
console.error("LocalVideo not found");
}
}
}
}
delegate: DelegateChooser {
role: "type"
DelegateChoice {
roleValue: "checkbox"
delegate: checkComponent
}
DelegateChoice {
roleValue: "combobox"
delegate: comboComponent
}
}
}
}
}
}
// From TestCase.qml, refactored to find a child by type or name.
function findChild(parent, searchValue, searchBy = "name") {
if (!parent || parent.children === undefined) {
console.error("No children found");
return null;
}
// Search directly under the given parent
for (var i = 0; i < parent.children.length; ++i) {
var child = parent.children[i];
var match = false;
if (searchBy === "name" && child.objectName === searchValue) {
match = true;
} else if (searchBy === "type" && child instanceof searchValue) {
match = true;
}
if (match) return child;
}
// Recursively search in child objects
for (i = 0; i < parent.children.length; ++i) {
var found = findChild(parent.children[i], searchValue, searchBy);
if (found) return found;
}
return null;
}
}

View File

@ -85,7 +85,7 @@ ApplicationWindow {
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.topMargin: preferredMargin
text: connectionFailed ? JamiStrings.reconnectWarn : JamiStrings.reconnectTry
text: connectionFailed ? JamiStrings.reconnectWarn : JamiStrings.reconnectAttempt
font.pointSize: 11
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter

View File

@ -41,6 +41,20 @@ QtObject {
// Used to store if a OngoingCallPage component is fullscreened.
property bool isCallFullscreen: false
// QWK: Provide spacing for widgets that may be occluded by the system buttons.
property QtObject qwkSystemButtonSpacing: QtObject {
id: qwkSystemButtonSpacing
readonly property bool isMacOS: Qt.platform.os.toString() === "osx"
// macOS buttons are on the left.
readonly property real left: {
appWindow.useFrameless && isMacOS && viewCoordinator.isInSinglePaneMode ? 80 : 0
}
// Windows and Linux buttons are on the right.
readonly property real right: {
appWindow.useFrameless && !isMacOS && !root.isFullscreen ? sysBtnsLoader.width + 24 : 0
}
}
// Restore a visible windowed mode.
function restoreApp() {
if (isHidden) {

View File

@ -41,14 +41,11 @@ import QWindowKit
ApplicationWindow {
id: appWindow
readonly property bool useFrameless: UtilsAdapter.getAppValue(Settings.Key.UseFramelessWindow)
property bool isRTL: UtilsAdapter.isRTL
LayoutMirroring.enabled: isRTL
LayoutMirroring.childrenInherit: isRTL
// This needs to be set from the start.
readonly property bool useFrameless: UtilsAdapter.getAppValue(Settings.Key.UseFramelessWindow)
onActiveFocusItemChanged: {
focusOverlay.margin = -5;
if (activeFocusItem && ((activeFocusItem.focusReason === Qt.TabFocusReason) || (activeFocusItem.focusReason === Qt.BacktabFocusReason))) {
@ -94,16 +91,10 @@ ApplicationWindow {
id: layoutManager
appContainer: fullscreenContainer
}
// Used to manage dynamic view loading and unloading.
ViewManager {
id: viewManager
}
property ViewManager viewManager: ViewManager {}
// Used to manage the view stack and the current view.
ViewCoordinator {
id: viewCoordinator
}
property ViewCoordinator viewCoordinator: ViewCoordinator {}
// Used to prevent the window from being visible until the
// window geometry has been restored and the view stack has
@ -125,7 +116,8 @@ ApplicationWindow {
function close(force = false) {
// If we're in the onboarding wizard or 'MinimizeOnClose'
// is set, then we can quit
if (force || !UtilsAdapter.getAppValue(Settings.MinimizeOnClose) || !UtilsAdapter.getAccountListSize()) {
var minimizeToTray = UtilsAdapter.getAppValue(Settings.MinimizeOnClose) && UtilsAdapter.isSystemTrayIconVisible();
if (force || !minimizeToTray || !UtilsAdapter.getAccountListSize()) {
Qt.quit();
} else {
layoutManager.closeToTray();
@ -234,17 +226,6 @@ ApplicationWindow {
anchors.fill: parent
}
// QWK: Provide spacing for widgets that may be occluded by the system buttons.
QtObject {
id: qwkSystemButtonSpacing
readonly property bool isMacOS: Qt.platform.os.toString() === "osx"
readonly property bool isFullscreen: layoutManager.isFullScreen
// macOS buttons are on the left.
readonly property real left: useFrameless && isMacOS && viewCoordinator.isInSinglePaneMode ? 80 : 0
// Windows and Linux buttons are on the right.
readonly property real right: useFrameless && !isMacOS && !isFullscreen ? sysBtnsLoader.width + 24 : 0
}
// QWK: Window Title bar
Item {
id: titleBar
@ -289,6 +270,12 @@ ApplicationWindow {
raise();
layoutManager.restoreApp();
}
function onCurrentAccountRemoved() {
if (UtilsAdapter.getAccountListSize() === 0) {
viewCoordinator.present("WizardView");
}
}
}
Connections {
@ -375,7 +362,7 @@ ApplicationWindow {
function onUpdateCheckReplyReceived(ok, found) {
if (!ok) {
// Show an error dialog describing that we could not successfully check for an update.
// Show an error dialog describing that an update check failed.
presentUpdateInfoDialog(JamiStrings.updateCheckError);
return;
}

View File

@ -145,7 +145,7 @@ QtObject {
if (!view.managed)
view.presented();
}, props)) {
print("could not create view:", viewName);
print("An error occurred while creating view:", viewName);
}
}
@ -184,7 +184,7 @@ QtObject {
} else
view = rootView.pop(StackView.Immediate);
if (!view) {
print("could not pop view:", obj.objectName);
print("An error occurred while attempting to pop view:", obj.objectName);
resolveStack();
return;
}
@ -194,7 +194,7 @@ QtObject {
if (view.managed) {
var objectName = view ? view.objectName : obj.objectName;
if (!viewManager.destroyView(resources[objectName])) {
print("could not destroy view:", objectName);
print("An error occurred while attempting to destroy view:", objectName);
} else {
print("destroyed view:", objectName);
}

View File

@ -114,7 +114,7 @@ AccountAdapter::createJamiAccount(const QVariantMap& settings)
&lrcInstance_->accountModel(),
&lrc::api::AccountModel::accountAdded,
[this, registeredName, settings](const QString& accountId) {
lrcInstance_->accountModel().setAvatar(accountId, settings["avatar"].toString());
lrcInstance_->accountModel().setAvatar(accountId, settings["avatar"].toString(), true,1);
Utils::oneShotConnect(&lrcInstance_->accountModel(),
&lrc::api::AccountModel::accountDetailsChanged,
[this](const QString& accountId) {
@ -227,7 +227,7 @@ AccountAdapter::createJAMSAccount(const QVariantMap& settings)
&lrcInstance_->accountModel(),
&lrc::api::AccountModel::accountAdded,
[this](const QString& accountId) {
if (!lrcInstance_->accountModel().getAccountList().size())
if (!lrcInstance_->accountModel().getAccountCount())
return;
Utils::oneShotConnect(&lrcInstance_->accountModel(),
@ -303,13 +303,8 @@ AccountAdapter::setCurrentAccountAvatarFile(const QString& source)
return;
}
QByteArray ba;
QBuffer bu(&ba);
bu.open(QIODevice::WriteOnly);
image.save(&bu, "PNG");
auto str = QString::fromLocal8Bit(ba.toBase64());
auto accountId = lrcInstance_->get_currentAccountId();
lrcInstance_->accountModel().setAvatar(accountId, str);
lrcInstance_->accountModel().setAvatar(accountId, source);
});
}
@ -318,7 +313,7 @@ AccountAdapter::setCurrentAccountAvatarBase64(const QString& data)
{
auto futureResult = QtConcurrent::run([this, data]() {
auto accountId = lrcInstance_->get_currentAccountId();
lrcInstance_->accountModel().setAvatar(accountId, data);
lrcInstance_->accountModel().setAvatar(accountId, data, true, 1);
});
}

View File

@ -29,13 +29,42 @@ AccountListModel::AccountListModel(LRCInstance* instance, QObject* parent)
: AbstractListModelBase(parent)
{
lrcInstance_ = instance;
// Avoid resetting/redrawing the model when the account status changes.
QObject::connect(&lrcInstance_->accountModel(),
&AccountModel::accountStatusChanged,
this,
[&](const QString& accountId) {
auto accountList = lrcInstance_->accountModel().getAccountList();
auto index = accountList.indexOf(accountId);
if (index != -1) {
QModelIndex modelIndex = QAbstractListModel::index(index, 0);
Q_EMIT dataChanged(modelIndex, modelIndex /*, ALL ROLES */);
}
});
// If there's a reorder, it's reasonable to reset the model for simplicity, instead
// of computing the difference. The same goes for accounts being added and removed.
// These operations will only occur when the list is hidden, unless dbus is used while
// the list is visible.
QObject::connect(&lrcInstance_->accountModel(),
&AccountModel::accountsReordered,
this,
&AccountListModel::reset);
QObject::connect(&lrcInstance_->accountModel(),
&AccountModel::accountAdded,
this,
&AccountListModel::reset);
QObject::connect(&lrcInstance_->accountModel(),
&AccountModel::accountRemoved,
this,
&AccountListModel::reset);
}
int
AccountListModel::rowCount(const QModelIndex& parent) const
{
if (!parent.isValid() && lrcInstance_) {
return lrcInstance_->accountModel().getAccountList().size();
return lrcInstance_->accountModel().getAccountCount();
}
return 0;
}
@ -71,7 +100,7 @@ AccountListModel::data(const QModelIndex& index, int role) const
void
AccountListModel::updateNotifications()
{
for (int i = 0; i < lrcInstance_->accountModel().getAccountList().size(); ++i) {
for (int i = 0; i < lrcInstance_->accountModel().getAccountCount(); ++i) {
QModelIndex modelIndex = QAbstractListModel::index(i, 0);
Q_EMIT dataChanged(modelIndex, modelIndex, {Role::NotificationCount});
}
@ -91,6 +120,7 @@ AccountListModel::roleNames() const
void
AccountListModel::reset()
{
// Used to invalidate proxy models.
beginResetModel();
endResetModel();
}

View File

@ -20,6 +20,8 @@
#include "appsettingsmanager.h"
#include "global.h"
#include <QCoreApplication>
#include <QLibraryInfo>
@ -101,7 +103,7 @@ AppSettingsManager::loadTranslations()
installedTr_.clear();
QString locale_name = getLanguage();
qDebug() << QString("Using locale: %1").arg(locale_name);
C_INFO << QString("Using locale: %1").arg(locale_name);
QString locale_lang = locale_name.split('_')[0];
QTranslator* qtTranslator_lang = new QTranslator(qApp);

View File

@ -43,11 +43,10 @@ extern const QString defaultDownloadPath;
// Common key-value pairs for both APPSTORE and non-APPSTORE builds
#define COMMON_KEYS \
X(MinimizeOnClose, false) \
X(MinimizeOnClose, true) \
X(DownloadPath, defaultDownloadPath) \
X(ScreenshotPath, {}) \
X(EnableNotifications, true) \
X(EnableTypingIndicator, true) \
X(EnableReadReceipt, true) \
X(AcceptTransferBelow, 20) \
X(AutoAcceptFiles, true) \

View File

@ -25,7 +25,11 @@
#include "api/devicemodel.h"
#ifdef Q_OS_LINUX
#include "screencastportal.h"
#include "xrectsel.h"
#ifndef ENABLE_LIBWRAP
#include <sys/prctl.h>
#endif
#endif
#include <QtConcurrent/QtConcurrent>
@ -58,6 +62,12 @@ AvAdapter::AvAdapter(LRCInstance* instance, QObject* parent)
&lrc::api::AVModel::onRendererFpsChange,
this,
&AvAdapter::updateRenderersFPSInfo);
#ifdef Q_OS_LINUX
connect(&lrcInstance_->behaviorController(),
&BehaviorController::callStatusChanged,
this,
&AvAdapter::onCallStatusChanged);
#endif
}
// The top left corner of primary screen is (0, 0).
@ -119,6 +129,93 @@ AvAdapter::shareEntireScreen(int screenNumber)
->addMedia(callId, resource, lrc::api::CallModel::MediaRequestType::SCREENSHARING);
}
#ifdef Q_OS_LINUX
static std::map<QString, std::unique_ptr<ScreenCastPortal>> callPortal;
void
AvAdapter::onCallStatusChanged(const QString& accountId, const QString& callId)
{
auto& accInfo = lrcInstance_->accountModel().getAccountInfo(accountId);
auto& callModel = accInfo.callModel;
const auto call = callModel->getCall(callId);
if (call.status == lrc::api::call::Status::ENDED) {
closePortal(callId);
}
}
void
AvAdapter::closePortal(const QString& callId)
{
if (callPortal.count(callId)) {
lrcInstance_->avModel().stopPreview(callPortal[callId]->videoInputId);
callPortal.erase(callId);
}
}
void
AvAdapter::shareWayland(bool entireScreen)
{
QString callId = lrcInstance_->getCurrentCallId();
closePortal(callId);
PortalCaptureType captureType = entireScreen ? PortalCaptureType::SCREEN
: PortalCaptureType::WINDOW;
auto portal = std::make_unique<ScreenCastPortal>(captureType);
int err = portal->getPipewireFd();
if (err == EACCES) {
qInfo() << "Can't share screen: permission denied";
return;
} else if (err != 0) {
qWarning() << "Failed to get PipeWire fd. Error code:" << err;
return;
}
QString resource = QString("%1%2pipewire pid:%3 fd:%4 node:%5")
.arg(libjami::Media::VideoProtocolPrefix::DISPLAY)
.arg(libjami::Media::VideoProtocolPrefix::SEPARATOR)
.arg(getpid())
.arg(portal->pipewireFd)
.arg(portal->pipewireNode);
#ifndef ENABLE_LIBWRAP
// If the daemon is running as a separate process, then it can't directly use the
// PipeWire file descriptor opened by the client, so it will attempt to duplicate
// it using the pidfd_getfd system call. This requires the daemon process to have
// ptrace permission on the client process. On some systems, this will be true by
// default (as long as the client and daemon processes have the same uid), but it
// may not be if the Yama Linux Security Module is used. The call to prctl below
// will grant permission if the Yama LSM is enabled and set to mode 1.
//
// References:
// https://man7.org/linux/man-pages/man2/pidfd_getfd.2.html
// https://man7.org/linux/man-pages/man2/prctl.2.html
// https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/LSM/Yama.rst
prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY);
#endif
// We open the video input here (instead of letting the daemon do it) to ensure
// that the daemon doesn't try to restart it while we still need it, since this
// would require getting a new file descriptor for PipeWire.
portal->videoInputId = lrcInstance_->avModel().startPreview(resource);
callPortal[callId] = std::move(portal);
muteCamera_ = !isCapturing();
lrcInstance_->getCurrentCallModel()
->addMedia(callId, resource, lrc::api::CallModel::MediaRequestType::SCREENSHARING);
}
void
AvAdapter::shareEntireScreenWayland()
{
shareWayland(true);
}
void
AvAdapter::shareWindowWayland()
{
shareWayland(false);
}
#endif // Q_OS_LINUX
void
AvAdapter::shareAllScreens()
{
@ -204,10 +301,14 @@ AvAdapter::shareFile(const QString& filePath)
&lrc::api::AVModel::fileOpened,
this,
[this, callId, filePath, resource](bool hasAudio, bool hasVideo) {
lrcInstance_->avModel().setAutoRestart(resource, true);
lrcInstance_->getCurrentCallModel()
->addMedia(callId, filePath, lrc::api::CallModel::MediaRequestType::FILESHARING, false, hasAudio);
lrcInstance_->avModel().pausePlayer(resource, false);
lrcInstance_->avModel().setAutoRestart(resource, true);
lrcInstance_->getCurrentCallModel()
->addMedia(callId,
filePath,
lrc::api::CallModel::MediaRequestType::FILESHARING,
false,
hasAudio);
lrcInstance_->avModel().pausePlayer(resource, false);
});
lrcInstance_->avModel().createMediaPlayer(resource);
@ -307,6 +408,9 @@ void
AvAdapter::stopSharing(const QString& source)
{
auto callId = lrcInstance_->getCurrentCallId();
#ifdef Q_OS_LINUX
closePortal(callId);
#endif
if (!source.isEmpty() && !callId.isEmpty()) {
if (source.startsWith(libjami::Media::VideoProtocolPrefix::DISPLAY)) {
qDebug() << "Stopping display: " << source;

View File

@ -69,9 +69,18 @@ protected:
*/
Q_INVOKABLE bool hasCamera() const;
// Share the screen specificed by screen number.
// Share the screen specificed by screen number (all platforms except Wayland).
Q_INVOKABLE void shareEntireScreen(int screenNumber);
#ifdef Q_OS_LINUX
// Share a screen on Wayland.
// Sharing a screen on Wayland requires getting permission from the user. The logic for
// this is handled by the ScreenCastPortal class using xdg-desktop-portal.
// The choice of screen is also handled by xdg-desktop-portal, which is why we don't need
// an argument for it (whereas we do on other platforms, cf. shareEntireScreen above).
Q_INVOKABLE void shareEntireScreenWayland();
#endif
// Share the all screens connected.
Q_INVOKABLE void shareAllScreens();
@ -87,9 +96,18 @@ protected:
// Select screen area to display (from all screens).
Q_INVOKABLE void shareScreenArea(unsigned x, unsigned y, unsigned width, unsigned height);
// Select window to display.
// Select window to display (all platforms except Wayland).
Q_INVOKABLE void shareWindow(const QString& windowProcessId, const QString& windowId);
#ifdef Q_OS_LINUX
// Share a window on Wayland.
// Sharing a window on Wayland requires getting permission from the user. The logic for
// this is handled by the ScreenCastPortal class using xdg-desktop-portal.
// The choice of window is also handled by xdg-desktop-portal, which is why we don't need
// arguments for it (whereas we do on other platforms, cf. shareWindow above).
Q_INVOKABLE void shareWindowWayland();
#endif
// Returns the screensharing resource
Q_INVOKABLE QString getSharingResource(int screenId = -2,
const QString& windowProcessId = "",
@ -121,11 +139,25 @@ private Q_SLOTS:
void onAudioDeviceEvent();
void onRendererStarted(const QString& id, const QSize& size);
void onRendererStopped(const QString& id);
#ifdef Q_OS_LINUX
// This function needs to be called whenever a screen/window share stops on Wayland.
// Failure to do so can cause subsequent sharing attempts to fail.
void closePortal(const QString& callId);
// On Wayland, we need to be informed of call status changes so that we can call
// closePortal if a call ends while a screen/window share was in progress.
void onCallStatusChanged(const QString& accountId, const QString& callId);
#endif
private:
// Get screens arrangement rect relative to primary screen.
const QRect getAllScreensBoundingRect();
#ifdef Q_OS_LINUX
// Used internally by shareEntireScreenWayland and shareWindowWayland
void shareWayland(bool entireScreen);
#endif
// Get the screen number
int getScreenNumber(int screenId = 0) const;

View File

@ -25,52 +25,74 @@
#include <QImage>
class AvatarImageProvider : public QuickImageProviderBase
class AsyncAvatarImageResponseRunnable : public AsyncImageResponseRunnable
{
Q_OBJECT
public:
AvatarImageProvider(LRCInstance* instance = nullptr)
: QuickImageProviderBase(QQuickImageProvider::Image,
QQmlImageProviderBase::ForceAsynchronousImageLoading,
instance)
AsyncAvatarImageResponseRunnable(const QString& id,
const QSize& requestedSize,
LRCInstance* lrcInstance)
: AsyncImageResponseRunnable(id, requestedSize, lrcInstance)
{}
QImage requestImage(const QString& id, QSize* size, const QSize& requestedSize) override
void run() override
{
Q_UNUSED(size)
if (requestedSize == QSize(0, 0)) {
qWarning() << Q_FUNC_INFO << "Image request has no dimensions";
return {};
// For avatar images, the requested size should be a square. Anything else
// is a request made prior to an aspect ratio guard calculation.
if (requestedSize_ == QSize(0, 0) || requestedSize_.width() != requestedSize_.height()) {
return;
}
// the first string is the item uri and the second is a uid
// that is used for trigger a reload of the underlying image
// data and can be discarded at this point
auto idInfo = id.split("_");
auto idInfo = id_.split("_");
if (idInfo.size() < 2) {
qWarning() << Q_FUNC_INFO << "Missing element(s) in the image url";
return {};
return;
}
const auto& imageId = idInfo.at(1);
if (!imageId.size()) {
qWarning() << Q_FUNC_INFO << "Missing id in the image url";
return {};
return;
}
QImage image;
const auto& type = idInfo.at(0);
if (type == "conversation") {
if (imageId == "temp")
return Utils::tempConversationAvatar(requestedSize);
return Utils::conversationAvatar(lrcInstance_, imageId, requestedSize);
image = Utils::tempConversationAvatar(requestedSize_);
else
image = Utils::conversationAvatar(lrcInstance_, imageId, requestedSize_);
} else if (type == "account") {
image = Utils::accountPhoto(lrcInstance_, imageId, requestedSize_);
} else if (type == "contact") {
image = Utils::contactPhoto(lrcInstance_, imageId, requestedSize_);
} else {
qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url";
return;
}
if (type == "account")
return Utils::accountPhoto(lrcInstance_, imageId, requestedSize);
if (type == "contact")
return Utils::contactPhoto(lrcInstance_, imageId, requestedSize);
qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url";
return {};
Q_EMIT done(image);
}
};
class AvatarImageProvider : public AsyncImageProviderBase
{
public:
AvatarImageProvider(LRCInstance* instance = nullptr)
: AsyncImageProviderBase(instance)
{}
QQuickImageResponse* requestImageResponse(const QString& id, const QSize& requestedSize) override
{
auto response = new AsyncImageResponse<AsyncAvatarImageResponseRunnable>(id,
requestedSize,
&pool_,
lrcInstance_);
return response;
}
};

View File

@ -33,8 +33,7 @@ AvatarRegistry::AvatarRegistry(LRCInstance* instance, QObject* parent)
connect(&lrcInstance_->accountModel(),
&AccountModel::profileUpdated,
this,
&AvatarRegistry::addOrUpdateImage,
Qt::UniqueConnection);
&AvatarRegistry::addOrUpdateImage);
connect(lrcInstance_, &LRCInstance::base64SwarmAvatarChanged, this, [&] {
addOrUpdateImage("temp");
@ -57,11 +56,15 @@ AvatarRegistry::addOrUpdateImage(const QString& id)
}
return uid;
}
// HACK: There is still a timing issue with when this function is called.
// The reason that avatar duplication was happening is that when the LRC account id is changed via
// the account combobox, the ui updates itself and calls getUID for the avatars that it needs to
// load, although by this point, the cache has not yet been cleared here. This ends up executing
// after the getUID calls.
void
AvatarRegistry::connectAccount()
{
uidMap_.clear();
clearCache();
connect(lrcInstance_->getCurrentContactModel(),
&ContactModel::profileUpdated,
this,
@ -94,3 +97,9 @@ AvatarRegistry::getUid(const QString& id)
}
return it.value();
}
void
AvatarRegistry::clearCache()
{
uidMap_.clear();
}

View File

@ -43,7 +43,9 @@ public:
Q_INVOKABLE QString getUid(const QString& id);
// add or update a specific image in the cache
QString addOrUpdateImage(const QString& id);
Q_SLOT QString addOrUpdateImage(const QString& id);
Q_INVOKABLE void clearCache();
Q_SIGNALS:
void avatarUidChanged(const QString& id);

View File

@ -20,6 +20,9 @@
#include "bannedlistmodel.h"
#include "lrcinstance.h"
#include "global.h"
#include <api/contact.h>
BannedListModel::BannedListModel(QObject* parent)
: AbstractListModelBase(parent)
@ -106,7 +109,13 @@ void
BannedListModel::reset()
{
beginResetModel();
bannedlist_ = lrcInstance_->getCurrentAccountInfo().contactModel->getBannedContacts();
auto contactModel = lrcInstance_->getCurrentContactModel();
if (!contactModel) {
C_DBG << "Contact model is not available.";
bannedlist_.clear();
} else {
bannedlist_ = contactModel->getBannedContacts();
}
endResetModel();
set_count(rowCount());
}

View File

@ -354,10 +354,11 @@ CallAdapter::onCallInfosChanged(const QString& accountId, const QString& callId)
}
void
CallAdapter::onCallAddedToConference(const QString& callId, const QString& confId)
CallAdapter::onCallAddedToConference(const QString& callId, const QString& conversationId, const QString& confId)
{
Q_UNUSED(callId)
Q_UNUSED(confId)
Q_UNUSED(conversationId)
saveConferenceSubcalls();
}
@ -389,16 +390,13 @@ CallAdapter::hangUpACall(const QString& accountId, const QString& convUid)
}
void
CallAdapter::setCallMedia(const QString& accountId, const QString& convUid, bool video)
CallAdapter::setCallMedia(const QString& accountId, const QString& convUid, bool videoMuted)
{
const auto& convInfo = lrcInstance_->getConversationFromConvUid(convUid, accountId);
if (convInfo.uid.isEmpty())
return;
try {
lrcInstance_->getAccountInfo(accountId).callModel->updateCallMediaList(convInfo.callId,
video);
} catch (...) {
}
lrcInstance_->getAccountInfo(accountId).callModel->setVideoMuted(convInfo.callId, videoMuted);
}
void

View File

@ -67,7 +67,7 @@ public:
Q_INVOKABLE void placeAudioOnlyCall();
Q_INVOKABLE void placeCall();
Q_INVOKABLE void hangUpACall(const QString& accountId, const QString& convUid);
Q_INVOKABLE void setCallMedia(const QString& accountId, const QString& convUid, bool video);
Q_INVOKABLE void setCallMedia(const QString& accountId, const QString& convUid, bool videoMuted);
Q_INVOKABLE void acceptACall(const QString& accountId, const QString& convUid);
Q_INVOKABLE void connectCallModel(const QString& accountId);
@ -122,7 +122,7 @@ public Q_SLOTS:
void onAccountChanged();
void onCallStatusChanged(const QString& accountId, const QString& callId);
void onCallStatusChanged(const QString& callId, int code);
void onCallAddedToConference(const QString& callId, const QString& confId);
void onCallAddedToConference(const QString& callId, const QString& conversationId, const QString& confId);
void onCallStarted(const QString& callId);
void onCallEnded(const QString& callId);
void onCallInfosChanged(const QString& accountId, const QString& callId);

View File

@ -19,6 +19,8 @@
#include "calloverlaymodel.h"
#include "global.h"
#include <QEvent>
#include <QMouseEvent>
#include <QQuickWindow>
@ -360,23 +362,33 @@ CallOverlayModel::clearControls()
}
void
CallOverlayModel::registerFilter(QQuickWindow* object, QQuickItem* item)
CallOverlayModel::setEventFilterActive(QObject* object, QQuickItem* item, bool isActive)
{
if (!object || !item || watchedItems_.contains(item))
QQuickWindow* window = qobject_cast<QQuickWindow*>(object);
if (!window || !item) {
C_WARN << "Attempting to" << (isActive ? "register" : "unregister")
<< "an invalid object or item" << window << item;
return;
watchedItems_.push_back(item);
if (watchedItems_.size() == 1)
object->installEventFilter(this);
}
void
CallOverlayModel::unregisterFilter(QQuickWindow* object, QQuickItem* item)
{
if (!object || !item || !watchedItems_.contains(item))
return;
watchedItems_.removeOne(item);
if (watchedItems_.size() == 0)
object->removeEventFilter(this);
}
if (isActive) {
if (watchedItems_.contains(item)) {
C_DBG << "Item already registered" << item;
} else {
watchedItems_.push_back(item);
if (watchedItems_.size() == 1) {
window->installEventFilter(this);
}
}
} else {
if (!watchedItems_.contains(item)) {
C_DBG << "Item not registered" << item;
} else {
watchedItems_.removeOne(item);
if (watchedItems_.size() == 0) {
window->removeEventFilter(this);
}
}
}
}
bool

View File

@ -137,8 +137,7 @@ public:
Q_INVOKABLE QVariant overflowHiddenModel();
Q_INVOKABLE QVariant pendingConferenceesModel();
Q_INVOKABLE void registerFilter(QQuickWindow* object, QQuickItem* item);
Q_INVOKABLE void unregisterFilter(QQuickWindow* object, QQuickItem* item);
Q_INVOKABLE void setEventFilterActive(QObject* object, QQuickItem* item, bool isActive);
bool eventFilter(QObject* object, QEvent* event) override;
Q_SIGNALS:

View File

@ -57,7 +57,6 @@ Popup {
id: container
property color color: JamiTheme.secondaryBackgroundColor
anchors.centerIn: parent
leftPadding: popupMargins
bottomPadding: action1.visible || action2.visible ? 10 :popupMargins

View File

@ -18,6 +18,7 @@
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import net.jami.Models 1.1
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
@ -25,8 +26,10 @@ import net.jami.Constants 1.1
SBSMessageBase {
id: root
property var confId: ConfId
property var currentCallId: CurrentCall.id
component JoinCallButton: MaterialButton {
visible: root.isActive
visible: root.isActive && root.currentCallId !== root.confId
toolTipText: JamiStrings.joinCall
color: JamiTheme.blackColor
background.opacity: hovered ? 0.2 : 0.1
@ -47,13 +50,15 @@ SBSMessageBase {
bubble.border.color: CurrentConversation.color
bubble.border.width: root.isActive ? 1.5 : 0
bubble.color: JamiTheme.messageInBgColor
bubble.opacity: 1
Connections {
target: CurrentConversation
enabled: root.isActive
function onActiveCallsChanged() {
root.isActive = LRCInstance.indexOfActiveCall(ConfId, ActionUri, DeviceId) !== -1;
root.isActive = LRCInstance.indexOfActiveCall(root.confId, ActionUri, DeviceId) !== -1;
if (root.isActive) {
bubble.mask.border.color = CurrentConversation.color;
bubble.mask.border.width = 1.5;
@ -62,10 +67,10 @@ SBSMessageBase {
}
}
property bool isActive: LRCInstance.indexOfActiveCall(ConfId, ActionUri, DeviceId) !== -1
visible: isActive || ConfId === "" || Duration > 0
property bool isActive: LRCInstance.indexOfActiveCall(root.confId, ActionUri, DeviceId) !== -1
visible: isActive || root.confId === "" || Duration > 0
property var baseColor: isOutgoing? CurrentConversation.color : JamiTheme.messageInBgColor
property var baseColor: JamiTheme.messageInBgColor
innerContent.children: [
RowLayout {
@ -74,22 +79,60 @@ SBSMessageBase {
spacing: 10
visible: root.visible
Label {
id: callLabel
Image {
id: statusIcon
Layout.leftMargin: 8
width: 10
height: 10
verticalAlignment: Qt.AlignVCenter
visible: !root.isActive
source: {
if (root.isOutgoing) {
if (Duration > 0)
return "qrc:/icons/outgoing-call.svg";
else
return "qrc:/icons/missed-outgoing-call.svg";
} else {
if (Duration > 0)
return "qrc:/icons/incoming-call.svg";
else
return "qrc:/icons/missed-incoming-call.svg";
}
}
layer {
enabled: true
effect: ColorOverlay {
color: {
if (Duration > 0)
return UtilsAdapter.luma(root.baseColor) ? JamiTheme.chatviewTextColorLight : JamiTheme.chatviewTextColorDark
return JamiTheme.redColor
}
}
}
}
Text {
id: callLabel
objectName: "callLabel"
topPadding: 8
bottomPadding: 8
Layout.margins: 8
Layout.fillWidth: true
Layout.rightMargin: root.isActive ? 0 : root.timeWidth + 16
Layout.leftMargin: root.isActive ? 10 : 8
Layout.rightMargin: root.isActive && root.currentCallId !== root.confId ? 0 : root.timeWidth + 16
Layout.leftMargin: root.isActive ? 10 : -5 /* spacing is 10 and we want 5px with icon */
text: {
if (root.isActive)
return JamiStrings.startedACall;
return Body;
}
verticalAlignment: Qt.AlignVCenter
horizontalAlignment: Qt.AlignHCenter
font.pointSize: JamiTheme.mediumFontSize
font.pointSize: JamiTheme.smallFontSize
font.hintingPreference: Font.PreferNoHinting
renderType: Text.NativeRendering
textFormat: Text.MarkdownText
@ -98,21 +141,23 @@ SBSMessageBase {
}
JoinCallButton {
id: joinCallInAudio
id: joinCallWithAudio
objectName: "joinCallWithAudio"
Layout.topMargin: 4
Layout.bottomMargin: 4
text: JamiStrings.joinInAudio
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, ConfId, true)
text: JamiStrings.joinWithAudio
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, root.confId, true)
}
JoinCallButton {
id: joinCallInVideo
text: JamiStrings.joinInVideo
id: joinCallWithVideo
objectName: "joinCallWithVideo"
text: JamiStrings.joinWithVideo
Layout.topMargin: 4
Layout.bottomMargin: 4
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, ConfId)
onClicked: MessagesAdapter.joinCall(ActionUri, DeviceId, root.confId)
Layout.rightMargin: 4
}
}
@ -125,7 +170,7 @@ SBSMessageBase {
}
}
Component.onCompleted: {
bubble.timestampItem.visible = !root.isActive;
bubble.timestampItem.visible = !root.isActive || root.currentCallId === root.confId;
opacity = 1;
}
}

View File

@ -40,23 +40,81 @@ Loader {
property int seq: MsgSeq.single
property string author: Author
property string body: Body
property var transferStatus: Status
property var tid: TID
property int transferStatus: TransferStatus
onTidChanged: {
if (tid === "") {
sourceComponent = deletedMsgComp
}
}
onTransferStatusChanged: {
if (tid === "") {
sourceComponent = deletedMsgComp
return;
} else if (transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED) {
mediaInfo = MessagesAdapter.getMediaInfo(root.body);
if (Object.keys(mediaInfo).length !== 0 && WITH_WEBENGINE) {
sourceComponent = localMediaMsgComp;
return;
}
}
sourceComponent = dataTransferMsgComp;
}
width: ListView.view ? ListView.view.width : 0
sourceComponent: {
if (root.transferStatus === Interaction.Status.TRANSFER_FINISHED) {
mediaInfo = MessagesAdapter.getMediaInfo(root.body)
if (Object.keys(mediaInfo).length !== 0 && WITH_WEBENGINE)
return localMediaMsgComp
}
return dataTransferMsgComp
}
opacity: 0
Behavior on opacity { NumberAnimation { duration: 100 } }
onLoaded: opacity = 1
Component {
id: deletedMsgComp
SBSMessageBase {
id: deletedItem
isOutgoing: Author === CurrentAccount.uri
showTime: root.showTime
seq: root.seq
author: Author
readers: Readers
timestamp: root.timestamp
formattedTime: root.formattedTime
formattedDay: root.formattedTime
extraHeight: 0
textContentWidth: textEditId.width
textContentHeight: textEditId.height
innerContent.children: [
TextEdit {
id: textEditId
anchors.right: isOutgoing ? parent.right : undefined
anchors.rightMargin: isOutgoing ? timeWidth : 0
bottomPadding: 6
topPadding: 6
leftPadding: 10
text: UtilsAdapter.getBestNameForUri(CurrentAccount.id, Author) + " " + JamiStrings.deletedMedia ;
horizontalAlignment: Text.AlignLeft
width: Math.min((2 / 3) * parent.width, implicitWidth + 18, innerContent.width - senderMargin + 18)
font.pointSize: JamiTheme.smallFontSize
font.hintingPreference: Font.PreferNoHinting
renderType: Text.NativeRendering
textFormat: Text.RichText
clip: true
readOnly: true
color: getBaseColor()
opacity: 0.5
function getBaseColor() {
bubble.isDeleted = true
return UtilsAdapter.luma(bubble.color) ? "white" : "dark"
}
}
]
}
}
Component {
id: dataTransferMsgComp
@ -65,7 +123,7 @@ Loader {
transferId: Id
property var transferStats: MessagesAdapter.getTransferStats(transferId, root.transferStatus)
property bool canOpen: root.transferStatus === Interaction.Status.TRANSFER_FINISHED || isOutgoing
property bool canOpen: root.transferStatus === Interaction.TransferStatus.TRANSFER_FINISHED || isOutgoing
property real maxMsgWidth: root.width - senderMargin -
2 * hPadding - avatarBlockWidth
- buttonsLoader.width - 24 - 6 - 24
@ -111,18 +169,18 @@ Loader {
sourceComponent: {
switch (root.transferStatus) {
case Interaction.Status.TRANSFER_CREATED:
case Interaction.Status.TRANSFER_FINISHED:
case Interaction.TransferStatus.TRANSFER_CREATED:
case Interaction.TransferStatus.TRANSFER_FINISHED:
iconSource = JamiResources.link_black_24dp_svg
return terminatedComp
case Interaction.Status.TRANSFER_CANCELED:
case Interaction.Status.TRANSFER_ERROR:
case Interaction.Status.TRANSFER_UNJOINABLE_PEER:
case Interaction.Status.TRANSFER_TIMEOUT_EXPIRED:
case Interaction.Status.TRANSFER_AWAITING_HOST:
case Interaction.TransferStatus.TRANSFER_CANCELED:
case Interaction.TransferStatus.TRANSFER_ERROR:
case Interaction.TransferStatus.TRANSFER_UNJOINABLE_PEER:
case Interaction.TransferStatus.TRANSFER_TIMEOUT_EXPIRED:
case Interaction.TransferStatus.TRANSFER_AWAITING_HOST:
iconSource = JamiResources.download_black_24dp_svg
return optionsComp
case Interaction.Status.TRANSFER_ONGOING:
case Interaction.TransferStatus.TRANSFER_ONGOING:
iconSource = JamiResources.close_black_24dp_svg
return optionsComp
default:
@ -157,7 +215,7 @@ Loader {
normalColor: JamiTheme.chatviewBgColor
imageColor: JamiTheme.chatviewButtonColor
onClicked: {
if (root.transferStatus === Interaction.Status.TRANSFER_ONGOING) {
if (root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING) {
return MessagesAdapter.cancelFile(transferId)
} else {
return MessagesAdapter.acceptFile(transferId)
@ -190,7 +248,7 @@ Loader {
onClicked: function (mouse) {
if (canOpen) {
dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(location)
Qt.openUrlExternally(new Url(dataTransferItem.hoveredLink))
Qt.openUrlExternally(new URL(dataTransferItem.hoveredLink))
} else {
dataTransferItem.hoveredLink = ""
}
@ -222,11 +280,11 @@ Loader {
: JamiTheme.chatviewTextColorDark
}
}
}
,ProgressBar {
},
ProgressBar {
id: progressBar
visible: root.transferStatus === Interaction.Status.TRANSFER_ONGOING
visible: root.transferStatus === Interaction.TransferStatus.TRANSFER_ONGOING
height: visible * implicitHeight
value: transferStats.progress / transferStats.totalSize
width: transferItem.width
@ -294,8 +352,6 @@ Loader {
return avComp
}
Component {
id: avComp
@ -304,7 +360,7 @@ Loader {
var qml = WITH_WEBENGINE ?
"qrc:/webengine/MediaPreviewBase.qml" :
"qrc:/nowebengine/MediaPreviewBase.qml"
setSource( qml, { isVideo: mediaInfo.isVideo, html:mediaInfo.html } )
setSource( qml, { isVideo: mediaInfo.isVideo, html: mediaInfo.html } )
}
}
}
@ -383,9 +439,11 @@ Loader {
antialiasing: true
autoTransform: true
asynchronous: true
source: Body !== undefined ? UtilsAdapter.urlFromLocalPath(Body) : ''
Component.onCompleted: localMediaMsgItem.bubble.imgSource = source
Component.onCompleted: {
source = UtilsAdapter.urlFromLocalPath(Body);
localMediaMsgItem.bubble.imgSource = source;
}
// The sourceSize represents the maximum source dimensions.
// This should not be a dynamic binding, as property changes
@ -401,7 +459,6 @@ Loader {
if (img.status == Image.Ready && aspectRatio) {
height = Qt.binding(() => JamiQmlUtils.clamp(idealWidth / aspectRatio, 64, 256))
width = Qt.binding(() => height * aspectRatio)
}
}

View File

@ -73,7 +73,7 @@ BaseModalDialog {
Layout.bottomMargin: 5
color: JamiTheme.textColor
text: JamiStrings.confirmDeleteQuestion
text: JamiStrings.confirmDeleteAccount
font.pointSize: JamiTheme.textFontSize
font.kerning: true

View File

@ -121,10 +121,7 @@ Item {
font.pixelSize : text.length > 16 ? JamiTheme.jamiIdSmallFontSize : JamiTheme.bigFontSize
property string registeredName: CurrentAccount.registeredName
property string infohash: CurrentAccount.uri
text: registeredName ? registeredName : infohash
onRegisteredNameChanged: {
text = registeredName ? registeredName : infohash
}
text: (btnId.clicked && registeredName) ? registeredName : infohash
}
}
}
@ -154,7 +151,7 @@ Item {
JamiIdControlButton {
id: btnEdit
anchors.leftMargin: JamiTheme.pushButtonMargins
visible: CurrentAccount.registeredName === ""
visible: CurrentAccount.registeredName === "" && CurrentAccount.enabled
imageColor: enabled ? JamiTheme.tintedBlue : JamiTheme.buttonTintedBlack
border.color: usernameTextEdit.editMode ? jamiId.contentColor : "transparent"
enabled: {
@ -231,11 +228,9 @@ Item {
toolTipText: JamiStrings.identifierURI
onClicked: {
if (clicked) {
usernameLabel.text = Qt.binding(function() {return CurrentAccount.uri} );
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.uri} );
btnId.toolTipText = JamiStrings.identifierRegisterName;
} else {
usernameLabel.text = Qt.binding(function() {return CurrentAccount.registeredName} );
usernameTextEdit.staticText = Qt.binding(function() {return CurrentAccount.registeredName} );
btnId.toolTipText = JamiStrings.identifierURI;
}

View File

@ -1,83 +1,97 @@
/*
* Copyright (C) 2024 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
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
// A SplitView that supports dynamic RTL and splitView state saving.
SplitView {
id: root
property bool isRTL: UtilsAdapter.isRTL
property bool isSinglePane: false
property bool isSwapped: false
onIsRTLChanged: {
if (isRTL && isSinglePane && !isSwapped)
return
if ((isRTL && !isSwapped) || (!isRTL && isSwapped))
swapItems()
}
onIsSinglePaneChanged: {
if (isSwapped || isRTL)
swapItems()
}
property string splitViewStateKey: objectName
property bool autoManageState: !(parent instanceof BaseView)
function saveSplitViewState() {
UtilsAdapter.setAppValue("sv_" + splitViewStateKey, root.saveState());
}
function restoreSplitViewState() {
root.restoreState(UtilsAdapter.getAppValue("sv_" + splitViewStateKey));
}
onResizingChanged: if (!resizing)
saveSplitViewState()
onVisibleChanged: {
if (!autoManageState)
return;
visible ? restoreSplitViewState() : saveSplitViewState();
}
function swapItems() {
isSwapped = !isSwapped
var qqci = children[0];
if (qqci.children.length > 1) {
// swap the children
var tempPane = qqci.children[0];
qqci.children[0] = qqci.children[1];
qqci.children.push(tempPane);
}
}
handle: Rectangle {
visible: !isSinglePane
implicitWidth: JamiTheme.splitViewHandlePreferredWidth
implicitHeight: root.height
color: JamiTheme.primaryBackgroundColor
Rectangle {
anchors.left: parent.left
implicitWidth: 1
implicitHeight: root.height
color: JamiTheme.tabbarBorderColor
}
}
}
/*
* Copyright (C) 2024 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
import net.jami.Adapters 1.1
import net.jami.Constants 1.1
// A SplitView that supports dynamic RTL and splitView state saving.
SplitView {
id: control
property bool isRTL: UtilsAdapter.isRTL
property bool isSinglePane: false
property bool isSwapped: false
property real handleSize: 1
onIsRTLChanged: {
if (isRTL && isSinglePane && !isSwapped)
return
if ((isRTL && !isSwapped) || (!isRTL && isSwapped))
swapItems()
}
onIsSinglePaneChanged: {
if (isSwapped || isRTL)
swapItems()
}
property string splitViewStateKey: objectName
property bool autoManageState: !(parent instanceof BaseView)
function saveSplitViewState() {
UtilsAdapter.setAppValue("sv_" + splitViewStateKey, control.saveState());
}
function restoreSplitViewState() {
control.restoreState(UtilsAdapter.getAppValue("sv_" + splitViewStateKey));
}
onResizingChanged: if (!resizing)
saveSplitViewState()
onVisibleChanged: {
if (!autoManageState)
return;
visible ? restoreSplitViewState() : saveSplitViewState();
}
function swapItems() {
isSwapped = !isSwapped
var qqci = children[0];
if (qqci.children.length > 1) {
// swap the children
var tempPane = qqci.children[0];
qqci.children[0] = qqci.children[1];
qqci.children.push(tempPane);
}
}
handle: Rectangle {
id: handleRoot
readonly property int defaultSize: control.handleSize
implicitWidth: control.orientation === Qt.Horizontal ? handleRoot.defaultSize : control.width
implicitHeight: control.orientation === Qt.Horizontal ? control.height : handleRoot.defaultSize
color: JamiTheme.tabbarBorderColor
containmentMask: Item {
// In the default configuration, the total handle size is the sum of the default size of the
// handle and the extra handle size (4). If the layout is not right-to-left (RTL), the handle
// is positioned at 0 on the X-axis, otherwise it's positioned to the left by the extra handle
// size (4 pixels). This is done to make it easier to grab small scroll-view handles that are
// adjacent to the SplitView handle. Note: vertically oriented handles are not offset.
readonly property real extraHandleSize: 4
readonly property real handleXPosition: !UtilsAdapter.isRTL ? 0 : -extraHandleSize
readonly property real handleSize: handleRoot.defaultSize + extraHandleSize
x: control.orientation === Qt.Horizontal ? handleXPosition : 0
width: control.orientation === Qt.Horizontal ? handleSize : handleRoot.width
height: control.orientation === Qt.Horizontal ? handleRoot.height : handleSize
}
}
}

View File

@ -23,19 +23,28 @@ import net.jami.Adapters 1.1
VideoView {
id: root
property bool visibilityCondition: true
crop: true
visible: isRendering && visibilityCondition
Component.onDestruction: VideoDevices.stopDevice(rendererId);
function startWithId(id, force = false) {
if (id !== undefined && id.length === 0) {
VideoDevices.stopDevice(rendererId);
rendererId = id;
} else {
const forceRestart = rendererId === id;
if (!forceRestart) {
// Stop previous device
VideoDevices.stopDevice(rendererId);
}
rendererId = VideoDevices.startDevice(id, forceRestart);
stop();
return;
}
const forceRestart = rendererId === id || force;
if (!forceRestart) {
// Stop previous device
VideoDevices.stopDevice(rendererId);
}
rendererId = VideoDevices.startDevice(id, forceRestart);
}
function stop() {
VideoDevices.stopDevice(rendererId);
rendererId = "";
}
}

View File

@ -164,7 +164,7 @@ BaseModalDialog {
appWindow,
"commoncomponents/JamiFileDialog.qml",
{
title: JamiStrings.selectAvatarImage,
title: JamiStrings.selectProfilePicture,
fileMode: JamiFileDialog.OpenFile,
folder: StandardPaths.writableLocation(
StandardPaths.PicturesLocation),

View File

@ -29,6 +29,17 @@ Rectangle {
property int status: Account.Status.REGISTERED
property int size: 15
MaterialToolTip {
visible: text !== "" && hoverHandler.hovered
delay: Qt.styleHints.mousePressAndHoldInterval
text: status === 2 ? qsTr("Connected") : status === 1 ? qsTr("Available") : ""
}
HoverHandler {
id: hoverHandler
target: parent
}
width: size
height: size
radius: size * 0.5
@ -41,6 +52,10 @@ Rectangle {
return JamiTheme.presenceGreen;
else if (status === Account.Status.TRYING)
return JamiTheme.unPresenceOrange;
else if (status === 2)
return JamiTheme.presenceGreen;
else if (status === 1)
return JamiTheme.unPresenceOrange;
return JamiTheme.notificationRed;
}
}

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