When having the dialog open that allows to set a custom nickname to
another client (UserLocalNicknameDialog) pressing Esc would crash
Mumble. This is due to the Esc key triggering the dialog's reject()
function in which the dialog's smart-pointer object is removed from a
global list and therefore goes out of scope.
This results in the dialog getting deleted, but since this is done in a
member function of the dialog, there is still code accessing the now
deleted object (in Qt's internals) and this is causing the segmentation
fault.
The fix is to use a custom deleter function for the dialog pointer that
instead of using delete on it, calls deleteLater() on it. Thus the
deletion of the object is left to Qt which can then do it at a point at
which it is done with it.
As this is something that could get useful in other locations as well,
the custom deleter function was outsourced into its own file.
Fixes#4666
As of 3d2a196830 the client would always log
"This server does not allow sending images." to the chat area when pasting anything
to the chatbar (regardless of whether it actually contains an image) if the client is connected
to a server that doesn't allow HTML messages.
Fixes#4660
Currently pasting or dragging and dropping images in the Mumble chat is
difficult because:
1. They are rejected because they exceed the allowed size. As a user I
would not expect it to transmitted losslessly but I would hope that the
client compresses it to a size the server allows.
2. Images are rejected because the server does not allow html. When
inserting an image via drag and drop you aren't notified what went
wrong.
Currently pasting or dragging and dropping images in the Mumble chat is
difficult because:
1) They are rejected because they exceed the allowed size. As a user I
would not expect it to transmitted losslessly but I would hope that the
client compresses it to a size the server allows.
2) Images are rejected because the server does not allow html. When
inserting an image via drag and drop you aren't notified what went
wrong.
This feature allows users to set local nicknames for other users. It is saved in the client database for persistence. This feature could be helpful for faster identifying of users with similar names or as a means to hide potentially inappropriate usernames with a setting that only shows the nicknames.
Fixes#3967
As requested in #3967 this commit implements the ability to set
nicknames for other users when connected to the same server. The change
is added to the client database by the user id for persistence. In order
to set a nickname, a user can right click on that user and click Set
Nickname. This opens a window where the user can enter the new nickname.
If the text field is cleared, no nickname is displayed.
Implements #3967
It turned out that it is absolutely impossible to only overwrite
specific properties via a styleSheet without also overwriting all other
properties that have been set via styleSheet on that object before.
Therefore a myWidget->setStyleSheet("background: red") will not only set
the background color to red but also erase everything that has been
written to the StyleSheet before this point.
As this is very inconvenient and always appending the most recent
property to the existing StyleSheet is not an option (the StyleSheet
will just keep growing in size and also this doesn't work well once one
starts using selectors), this commit introduces a wrapper class that can
be used for fine-tuned control of a widget's style.
This works by storing the desired properties in a separate class and
re-generate and re-apply the StyleSheet every time one of these
properties changes.
Currently the only implemented properties are font-size and
background-color.
NOTE: The wrapper only works as long as no other calls to setStyleSheet
are made to the object the wrapper acts upon.
The mentioned wrapper was then incorporated into the UI elements of the
TalkingUI.
It turned out that it is absolutely impossible to only overwrite
specific properties via a styleSheet without also overwriting all other
properties that have been set via styleSheet on that object before.
Therefore a myWidget->setStyleSheet("background: red") will not only set
the background color to red but also erase everything that has been
written to the StyleSheet before this point.
As this is very inconvenient and always appending the most recent
property to the existing StyleSheet is not an option (the StyleSheet
will just keep growing in size and also this doesn't work well once one
starts using selectors), this commit introduces a wrapper class that can
be used for fine-tuned control of a widget's style.
This works by storing the desired properties in a separate class and
re-generate and re-apply the StyleSheet every time one of these
properties changes.
Currently the only implemented properties are font-size and
background-color.
NOTE: The wrapper only works as long as no other calls to setStyleSheet
are made to the object the wrapper acts upon.
The mentioned wrapper was then incorporated into the UI elements of the
TalkingUI.
This reverts commit 7d0b933.
The issue with theses changes is that they cause
AudioInput::encodeAudioframe from no longer being called if the user is
muted. The functionality packed inside the mentioned function relies on
being continually being called even if there is no audio to send.
Thus no longer calling them affects the following things (maybe more):
local user's talking state (can get stuck in a certain state)
Audio cues for begin/end of a transmission
Idle actions
Framesize stuffing when using Opus
Resetting of certain variables (iBitrate)
Clearing/Handling of whisper targets (for last audio frame)
Properly updating bPreviousVoice
In order to use the changes originally made by that commit, the audio
system has to be refactored first so that these things no longer rely on
this function being called continuously.
Ref: #171
Old workaround for parts of this issue: #4018
If the font size for the TalkingUI was set to something different than
100%, the TalkingUI's icon sizes would be incorrect.
This is due to the icon size being initialized to the widget's
font-size. This doesn't seem to have been affected by inherited
StyleSheets right after construction and therefore they'd always report
the default font-size.
This commit fixes this by explicitly setting the icon-size after an
entry is created.
In this context the method of calculating the current line height has
been overhauled as well as this would also depend on when the respective
function was called. This is probably due to Qt not having stored the
display's DPI correctly yet and thus the conversion from point size to
pixel size is flawed.
This reverts commit 7d0b933a7e.
The issue with theses changes is that they cause
AudioInput::encodeAudioframe from no longer being called if the user is
muted. The functionality packed inside the mentioned function relies on
being continually being called even if there is no audio to send.
Thus no longer calling them affects the following things (maybe more):
- local user's talking state (can get stuck in a certain state)
- Audio cues for begin/end of a transmission
- Idle actions
- Framesize stuffing when using Opus
- Resetting of certain variables (iBitrate)
- Clearing/Handling of whisper targets (for last audio frame)
- Properly updating bPreviousVoice
In order to use the changes originally made by that commit, the audio
system has to be refactored first so that these things no longer rely on
this function being called continuously.
Ref: #171
Old workaround for parts of this issue: #4018
- Remove CPack and previous WiX installer projects and sources
- Add toolset for WixSharp to facilitate client and server builds
individually or collectively.
- Add multilanguage build with packaging=ON and translations=ON, and
standard build with packaging=ON. Builds are also aware of client and
server option settings.
- Add correct LICENSE to installer
Fixes: #4488
WixSharp: https://github.com/oleg-shilo/wixsharp
Remove CPack and previous WiX installer projects and sources
Add toolset and for WixSharp to facilitate client and server builds
individually or collectively.
Add multilanguage build with packaging=ON and translations=ON, and
standard build with packaging=ON. Builds are also aware of client and
server option settings.
Add correct LICENSE to installer
Before this commit, the code on the server made sure that a
ChannelListener would always receive audio that was being shouted to a
channel. It didn't respect though if the shout was actually restricted
to be received by only a specific group.
This patch now makes sure that listeners are also checked for their
group so that a listener that doesn't belong to the target group (if one
is set) won't receive the audio either.
The race condition was that the channel of a user could be modified
and before it gets updated in the TalkingUI as well, the talking state
of that user changes. Then inside the talkingStateChanged function the
code would assume that the TalkingUIUser is in the container representing
the current channel of that user but in fact in the TalkingUI this user
is still in its own channel, causing the user-search to return nullptr
which then yields a SegFault as soon as the returned pointer gets
dereferenced.
Before this commit, the code on the server made sure that a
ChannelListener would always receive audio that was being shouted to a
channel. It didn't respect though if the shout was actually restricted
to be received by only a specific group.
This patch now makes sure that listeners are also checked for their
group so that a listener that doesn't belong to the target group (if one
is set) won't receive the audio either.
In cases where the TalkingUI was overlaying the MainWindow, it could
happen that a context menu triggered from the TalkingUI would actually
be created using another element (listener, channel, user) as the
context for that menu. This would happen because in these cases there is
an entry below the cursor (behind the TalkingUI) that would
automatically be recognized as the desired target.
The fix works by explicitly disabling the position-dependent target
search and using explicitly defined targets instead.
This improves readability, especially when the keys combination and/or the keys' name is long.
Previously, the tooltip only showed "Shortcut button combination.".
Libraries should only be installed if they are built as shared
libraries. Static libraries should only be needed during Mumble's
compilation and are therefore no required dependencies that have to be
installed alongside Mumble.
It seems that the quotes added in a target_add_compile_definitions call
are taken literal and will be part of the actual macro definition.
What we actually wanted was that paths with spaces are properly covered
which can be achieved by placing the starting quote a bit differently.
Previously the user only had the choice of setting the settings on the
current settings page to their default value. Therefore, if you wanted
to reset all settings, you had to visit every page and reset it
individually.
With this commit, there is now a reset-all button that can be used
instead.
Previously the user only had the choice of setting the settings on the
current settings page to their default value. Therefore, if you wanted
to reset all settings, you had to visit every page and reset it
individually.
With this commit, there is now a reset-all button that can be used
instead.
Co-authored-by: Davide Beatrici <github@davidebeatrici.dev>
Installation paths can now be fine-tuned by setting the respective
MUMBLE_INSTALLATION_* variables when invoking cmake.
Additionally some components that only had install rules for a certain
OS are now installed on all OSes as these components should be needed
there as well.
We are using a custom FindGRPC.cmake script in order to locate the gRPC
targets as not all distribution variants of gRPC include the respective
cmake support. Those that do however will use "gRPC" (note the lowercase
"g") as the target's name and therefore our current way of searching for
it via find_pkg won't find them.
The solution is to first look for "gRPC" and only if that fails, check
for "GRPC". This way the official target "gRPC" should be found and
preferred if present.
Fixes#4508
Installation paths can now be fine-tuned by setting the respective
MUMBLE_INSTALLATION_* variables when invoking cmake.
Additionally some components that only had install rules for a certain
OS are now installed on all OSes as these components should be needed
there as well.
We are using a custom FindGRPC.cmake script in order to locate the gRPC
targets as not all distribution variants of gRPC include the respective
cmake support. Those that do however will use "gRPC" (note the lowercase
"g") as the target's name and therefore our current way of searching for
it via find_pkg won't find them.
The solution is to first look for "gRPC" and only if that fails, check
for "GRPC". This way the official target "gRPC" should be found and
preferred if present.
Fixes#4508
Co-Authored-By: Thomas Lange <thomas-lange2@gmx.de>
The new tool provided at https://github.com/probonopd/go-appimage/blob/master/src/appimagetool doesn't have the restriction of having to be run on the latest still supported Ubuntu version. Thus this allows us to upgrade our Linux CI on Azure to Bionic.
Note however that the AppImage produced this way doesn't seem to be working.
The old AppImage tool required to be run on the oldest still supported
Ubuntu LTS. On anything else it would quit with an error.
There is a new tool from the same author though that does not have this
limitation due to bundling more of its dependencies into the AppImage.
The tool is taken from https://github.com/probonopd/go-appimage.