diff --git a/INSTALL.md b/INSTALL.md index e94510b1a..63cefe8a1 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,8 +1,8 @@ #Install Instructions - [Dependencies](#dependencies) -- [Windows](#windows) - [Linux](#linux) - [OS X](#osx) +- [Windows](#windows) ##Dependencies @@ -15,6 +15,196 @@ | OpenCV | >= 2.4.9 | core, highgui, imgproc | | OpenAL Soft | >= 1.16.0 | | + + +##Linux +###Simple install +Easy qTox install is provided for variety of distributions: +https://wiki.tox.im/Binaries#Apt.2FAptitude_.28Debian.2C_Ubuntu.2C_Mint.2C_etc..29 + +If your distribution is not listed, or you want/need to compile qTox, there are provided instructions. + +**Please note that installing toxcore/qTox from AUR is not supported**, although installing other dependencies, provided that they met requirements, should be fine, unless you are installing cryptography library from AUR, which should rise red flags by itself… + +---- + +Most of the dependencies should be available through your package manger. You may either follow the directions below, or simply run `./simple_make.sh` after cloning, which will attempt to automatically download dependencies followed by compilation. + + +###Cloning the Repository +In order to clone the qTox repository you need Git. + +Arch Linux: +```bash +sudo pacman -S --needed git +``` + +Debian: +```bash +sudo apt-get install git +``` + +Fedora: +```bash +yum install git +``` + +Ubuntu: +```bash +sudo apt-get install git +``` + +Afterwards open a new Terminal, change to a directory of your choice and clone the repository: +```bash +cd /home/user/qTox +git clone https://github.com/tux3/qTox.git qTox +``` + +The following steps assumes that you cloned the repository at "/home/user/qTox". If you decided to choose another location, replace corresponding parts. + +###GCC, Qt, OpenCV and OpanAL Soft + +Arch Linux: +```bash +sudo pacman -S --needed base-devel qt5 opencv openal libxss +``` + +Debian: +```bash +sudo apt-get install build-essential qt5-qmake qt5-default libopenal-dev libopencv-dev libxss-dev +``` + +Fedora: +```bash +yum groupinstall "Development Tools" +yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libXScrnSaver-devel +``` + +Slackware: + +You can grab slackbuilds of the needed dependencies here: + +http://slackbuilds.org/repository/14.1/libraries/OpenAL/ + +http://slackbuilds.org/repository/14.1/libraries/qt5/ + +http://slackbuilds.org/repository/14.1/libraries/opencv/ + +Ubuntu: +```bash +sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libopenal-dev libopencv-dev libxss-dev +``` + +###Tox Core + +First of all install the dependencies of Tox Core. + +Arch Linux: +```bash +sudo pacman -S --needed opus vpx +``` + +``` +Debian: +```bash +sudo apt-get install libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev +``` + +Fedora: +```bash +yum install libtool autoconf automake check check-devel +``` + +Ubuntu: +```bash +sudo apt-get install libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev +``` + +Now you can either follow the instructions at https://github.com/irungentoo/toxcore/blob/master/INSTALL.md#unix or use the "bootstrap.sh" script located at "/home/user/qTox". +The script will automatically download and install Tox Core and libsodium to "/home/user/qTox/libs": +```bash +cd /home/user/qTox +./bootstrap.sh # use -h or --help for more information +``` + +After all the dependencies are thus reeady to go, compiling should be as simple as +```bash +qmake +make +``` + +###Building packages + +Alternately, qTox now has the experimental and probably-dodgy ability to package itself (in .deb +form natively, and .rpm form with alien). + +After installing the required dependencies, run `bootstrap.sh` and then run the +`buildPackages.sh` script, found in the tools folder. It will automatically get the +packages necessary for building .debs, so be prepared to type your password for sudo. + + + +##OS X + +###OSX Easy Install + +Since https://github.com/ReDetection/homebrew-qtox you can easily install qtox with homebrew +```bash +brew install --HEAD ReDetection/qtox/qtox +``` + + +###OSX Full Install Guide + +This guide is intended for people who wish to use an existing or new ProjectTox-Core installation separate to the bundled installation with qTox, if you do not wish to use a separate installation you can skip to the section titled 'Final Steps'. + +Installation on OSX, isn't quite straight forward, here is a quick guide on how to install; + +Note that qTox now requires OpenCV and OpenAL for video and audio. + +The first thing you need to do is install ProjectTox-Core with a/v support. Refer to the INSTALL guide in the PrjectTox-Core github repo. + +Next you need to download QtTools (http://qt-project.org/downloads), at the time of writing this is at version .3.0. +Make sure you deselect all the unnecessary components from the 5.3 checkbox (iOS/Android libs) otherwise you will end up with a very large download. + +Once that is installed you will most likely need to set the path for qmake. To do this, open up terminal and paste in the following; + +```bash +export PATH=/location/to/qmake/binary:$PATH +``` + +For myself, the qmake binary was located in /Users/mouseym/Qt/5.3/clang_64/bin/. + +This is not a permanent change, it will revert when you close the terminal window, to add it permanently you will need to add echo the above line to your .profile/.bash_profile. + +Once this is installed, do the following; + +```bash +git clone https://github.com/tux3/qTox +cd toxgui +qmake +``` + +Now, we need to create a symlink to /usr/local/lib/ and /usr/local/include/ +``` +mkdir -p $HOME/qTox/libs +sudo ln -s /usr/local/lib $HOME/qTox/libs/lib +sudo ln -s /usr/local/include $HOME/qTox/libs/include +``` +####Final Steps + +The final step is to run +```bash +make +``` +in the qTox directory, or if you are using the bundled tox core installation, you can use +```bash +./bootstrap.sh +make +``` +Assuming all went well you should now have a qTox.app file within the directory. Double click and it should open! + + ##Windows @@ -74,168 +264,4 @@ As for OpenCV there are no prebuild packages of OpenAL Softe compiled with MinGW make make install ``` -Copy the dll "OpenAL32.dll" located at "C:\qTox\libs\openal-build\install\bin" to "C:\qTox\libs\lib". Finally, copy the directory "AL" located at "C:\qTox\libs\openal-build\install\include" to "C:\qTox\libs\include". Unlike OpenCV you don't need to patch any files. Feel free to delete the directories "openal-soft-x.y.z" and "openal-build", but you don't need to. - - -##Linux -Most of the dependencies should be available through your package manger. You may either follow the directions below, or simply run `./simple_make.sh` after cloning, which will attempt to automatically download dependencies followed by compilation. - -###Cloning the Repository -In order to clone the qTox repository you need Git. - -Debian: -```bash -sudo apt-get install git -``` - -Ubuntu: -```bash -sudo apt-get install git -``` - -Arch Linux: -```bash -sudo pacman -S --needed git -``` - -Fedora: -```bash -yum install git -``` - -Afterwards open a new Terminal, change to a directory of your choice and clone the repository: -```bash -cd /home/user/qTox -git clone https://github.com/tux3/qTox.git qTox -``` - -The following steps assumes that you cloned the repository at "/home/user/qTox". If you decided to choose another location, replace corresponding parts. - -###GCC, Qt, OpenCV and OpanAL Soft - -Debian: -```bash -sudo apt-get install build-essential qt5-qmake qt5-default libopenal-dev libopencv-dev libxss-dev -``` - -Ubuntu: -```bash -sudo apt-get install build-essential qt5-qmake qt5-default qttools5-dev-tools libopenal-dev libopencv-dev libxss-dev -``` - -Arch Linux: -```bash -sudo pacman -S --needed base-devel qt5 opencv openal libxss -``` - -Fedora: -```bash -yum groupinstall "Development Tools" -yum install qt-devel qt-doc qt-creator opencv-devel openal-soft-devel libXScrnSaver-devel -``` - -###Tox Core - -First of all install the dependencies of Tox Core. - -Debian: -```bash -sudo apt-get install libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev -``` - -Ubuntu: -```bash -sudo apt-get install libtool autotools-dev automake checkinstall check libopus-dev libvpx-dev -``` - -Arch Linux: (Arch Linux provides the package "tox-git" in AUR) -```bash -sudo pacman -S --needed opus vpx -``` - -Fedora: -```bash -yum install libtool autoconf automake check check-devel -``` - -Now you can either follow the instructions at https://github.com/irungentoo/toxcore/blob/master/INSTALL.md#unix or use the "bootstrap.sh" script located at "/home/user/qTox". -The script will automatically download and install Tox Core and libsodium to "/home/user/qTox/libs": -```bash -cd /home/user/qTox -./bootstrap.sh # use -h or --help for more information -``` - -After all the dependencies are thus reeady to go, compiling should be as simple as -```bash -qmake -make -``` - -###Building packages - -Alternately, qTox now has the experimental and probably-dodgy ability to package itself (in .deb -form natively, and .rpm form with alien). - -After installing the required dependencies, run `bootstrap.sh` and then run the -`buildPackages.sh` script, found in the tools folder. It will automatically get the -packages necessary for building .debs, so be prepared to type your password for sudo. - - -##OS X - -###OSX Easy Install - -Since https://github.com/ReDetection/homebrew-qtox you can easily install qtox with homebrew -```bash -brew install --HEAD ReDetection/qtox/qtox -``` - -###OSX Full Install Guide - -This guide is intended for people who wish to use an existing or new ProjectTox-Core installation separate to the bundled installation with qTox, if you do not wish to use a separate installation you can skip to the section titled 'Final Steps'. - -Installation on OSX, isn't quite straight forward, here is a quick guide on how to install; - -Note that qTox now requires OpenCV and OpenAL for video and audio. - -The first thing you need to do is install ProjectTox-Core with a/v support. Refer to the INSTALL guide in the PrjectTox-Core github repo. - -Next you need to download QtTools (http://qt-project.org/downloads), at the time of writing this is at version .3.0. -Make sure you deselect all the unnecessary components from the 5.3 checkbox (iOS/Android libs) otherwise you will end up with a very large download. - -Once that is installed you will most likely need to set the path for qmake. To do this, open up terminal and paste in the following; - -```bash -export PATH=/location/to/qmake/binary:$PATH -``` - -For myself, the qmake binary was located in /Users/mouseym/Qt/5.3/clang_64/bin/. - -This is not a permanent change, it will revert when you close the terminal window, to add it permanently you will need to add echo the above line to your .profile/.bash_profile. - -Once this is installed, do the following; - -```bash -git clone https://github.com/tux3/qTox -cd toxgui -qmake -``` - -Now, we need to create a symlink to /usr/local/lib/ and /usr/local/include/ -``` -mkdir -p $HOME/qTox/libs -sudo ln -s /usr/local/lib $HOME/qTox/libs/lib -sudo ln -s /usr/local/include $HOME/qTox/libs/include -``` -####Final Steps - -The final step is to run -```bash -make -``` -in the qTox directory, or if you are using the bundled tox core installation, you can use -```bash -./bootstrap.sh -make -``` -Assuming all went well you should now have a qTox.app file within the directory. Double click and it should open! +Copy the dll "OpenAL32.dll" located at "C:\qTox\libs\openal-build\install\bin" to "C:\qTox\libs\lib". Finally, copy the directory "AL" located at "C:\qTox\libs\openal-build\install\include" to "C:\qTox\libs\include". Unlike OpenCV you don't need to patch any files. Feel free to delete the directories "openal-soft-x.y.z" and "openal-build", but you don't need to. \ No newline at end of file diff --git a/img/taskbar/dark/taskbar_busy.png b/img/taskbar/dark/taskbar_busy.png new file mode 100644 index 000000000..451b4b4ef Binary files /dev/null and b/img/taskbar/dark/taskbar_busy.png differ diff --git a/img/taskbar/dark/taskbar_busy_2x.png b/img/taskbar/dark/taskbar_busy_2x.png new file mode 100644 index 000000000..274bf330d Binary files /dev/null and b/img/taskbar/dark/taskbar_busy_2x.png differ diff --git a/img/taskbar/dark/taskbar_idle.png b/img/taskbar/dark/taskbar_idle.png new file mode 100644 index 000000000..21c9eabc6 Binary files /dev/null and b/img/taskbar/dark/taskbar_idle.png differ diff --git a/img/taskbar/dark/taskbar_idle_2x.png b/img/taskbar/dark/taskbar_idle_2x.png new file mode 100644 index 000000000..118826fcc Binary files /dev/null and b/img/taskbar/dark/taskbar_idle_2x.png differ diff --git a/img/taskbar/dark/taskbar_invisible.png b/img/taskbar/dark/taskbar_invisible.png new file mode 100644 index 000000000..81b07550b Binary files /dev/null and b/img/taskbar/dark/taskbar_invisible.png differ diff --git a/img/taskbar/dark/taskbar_invisible_2x.png b/img/taskbar/dark/taskbar_invisible_2x.png new file mode 100644 index 000000000..f02f7e047 Binary files /dev/null and b/img/taskbar/dark/taskbar_invisible_2x.png differ diff --git a/img/taskbar/dark/taskbar_offline.png b/img/taskbar/dark/taskbar_offline.png new file mode 100644 index 000000000..e3a2cece5 Binary files /dev/null and b/img/taskbar/dark/taskbar_offline.png differ diff --git a/img/taskbar/dark/taskbar_offline_2x.png b/img/taskbar/dark/taskbar_offline_2x.png new file mode 100644 index 000000000..6c39ec350 Binary files /dev/null and b/img/taskbar/dark/taskbar_offline_2x.png differ diff --git a/img/taskbar/dark/taskbar_online.png b/img/taskbar/dark/taskbar_online.png new file mode 100644 index 000000000..24b9a8d4b Binary files /dev/null and b/img/taskbar/dark/taskbar_online.png differ diff --git a/img/taskbar/dark/taskbar_online_2x.png b/img/taskbar/dark/taskbar_online_2x.png new file mode 100644 index 000000000..44e6013b7 Binary files /dev/null and b/img/taskbar/dark/taskbar_online_2x.png differ diff --git a/img/taskbar/light/taskbar_busy.png b/img/taskbar/light/taskbar_busy.png new file mode 100644 index 000000000..6408db92a Binary files /dev/null and b/img/taskbar/light/taskbar_busy.png differ diff --git a/img/taskbar/light/taskbar_busy_2x.png b/img/taskbar/light/taskbar_busy_2x.png new file mode 100644 index 000000000..248e05860 Binary files /dev/null and b/img/taskbar/light/taskbar_busy_2x.png differ diff --git a/img/taskbar/light/taskbar_idle.png b/img/taskbar/light/taskbar_idle.png new file mode 100644 index 000000000..fae60333e Binary files /dev/null and b/img/taskbar/light/taskbar_idle.png differ diff --git a/img/taskbar/light/taskbar_idle_2x.png b/img/taskbar/light/taskbar_idle_2x.png new file mode 100644 index 000000000..93b33eba4 Binary files /dev/null and b/img/taskbar/light/taskbar_idle_2x.png differ diff --git a/img/taskbar/light/taskbar_invisible.png b/img/taskbar/light/taskbar_invisible.png new file mode 100644 index 000000000..cc45ab1f4 Binary files /dev/null and b/img/taskbar/light/taskbar_invisible.png differ diff --git a/img/taskbar/light/taskbar_invisible_2x.png b/img/taskbar/light/taskbar_invisible_2x.png new file mode 100644 index 000000000..19a736b3b Binary files /dev/null and b/img/taskbar/light/taskbar_invisible_2x.png differ diff --git a/img/taskbar/light/taskbar_offline.png b/img/taskbar/light/taskbar_offline.png new file mode 100644 index 000000000..61c18265e Binary files /dev/null and b/img/taskbar/light/taskbar_offline.png differ diff --git a/img/taskbar/light/taskbar_offline_2x.png b/img/taskbar/light/taskbar_offline_2x.png new file mode 100644 index 000000000..db79070bb Binary files /dev/null and b/img/taskbar/light/taskbar_offline_2x.png differ diff --git a/img/taskbar/light/taskbar_online.png b/img/taskbar/light/taskbar_online.png new file mode 100644 index 000000000..007f0d1c9 Binary files /dev/null and b/img/taskbar/light/taskbar_online.png differ diff --git a/img/taskbar/light/taskbar_online_2x.png b/img/taskbar/light/taskbar_online_2x.png new file mode 100644 index 000000000..247e2b217 Binary files /dev/null and b/img/taskbar/light/taskbar_online_2x.png differ diff --git a/osx/updater.go b/osx/updater.go index 45232536f..b063a251d 100644 --- a/osx/updater.go +++ b/osx/updater.go @@ -32,6 +32,41 @@ func fs_type(path string) int { return -1 } +func install(path string, pathlen int) int { + files, _ := ioutil.ReadDir(path) + + for _, file := range files { + if fs_type(path+file.Name()) == 1 { + + addpath := "" + if len(path) != pathlen { + addpath = path[pathlen:len(path)] + } + + fmt.Print("Installing: ") + fmt.Println("/Applications/qtox.app/Contents/" + addpath + file.Name()) + if _, err := os.Stat("/Applications/qtox.app/Contents/" + file.Name()); os.IsNotExist(err) { + newfile := exec.Command("/usr/libexec/authopen", "-c", "-x", "-m", "drwxrwxr-x+", "/Applications/qtox.app/Contents/"+addpath+file.Name()) + newfile.Run() + } + + cat := exec.Command("/bin/cat", path+file.Name()) + + auth := exec.Command("/usr/libexec/authopen", "-w", "/Applications/qtox.app/Contents/"+addpath+file.Name()) + auth.Stdin, _ = cat.StdoutPipe() + auth.Stdout = os.Stdout + auth.Stderr = os.Stderr + _ = auth.Start() + _ = cat.Run() + _ = auth.Wait() + + } else { + install(path+file.Name()+"/", pathlen) + } + } + return 0 +} + func main() { usr, e := user.Current() if e != nil { @@ -45,51 +80,11 @@ func main() { } fmt.Println("qTox Updater") - files, _ := ioutil.ReadDir(update_dir) killqtox := exec.Command("/usr/bin/killall", "qtox") _ = killqtox.Run() - for _, file := range files { - if fs_type(update_dir+file.Name()) == 1 { - fmt.Print("Installing: ") - fmt.Println("/Applications/qtox.app/Contents/" + file.Name()) - if _, err := os.Stat("/Applications/qtox.app/Contents/" + file.Name()); os.IsNotExist(err) { - newfile := exec.Command("/usr/libexec/authopen", "-c", "-x", "-m", "drwxrwxr-x+", "/Applications/qtox.app/Contents/"+file.Name()) - newfile.Run() - } + install(update_dir, len(update_dir)) - cat := exec.Command("/bin/cat", update_dir+file.Name()) - auth := exec.Command("/usr/libexec/authopen", "-w", "/Applications/qtox.app/Contents/"+file.Name()) - auth.Stdin, _ = cat.StdoutPipe() - auth.Stdout = os.Stdout - auth.Stderr = os.Stderr - _ = auth.Start() - _ = cat.Run() - _ = auth.Wait() - - } else { - files, _ := ioutil.ReadDir(update_dir + file.Name()) - for _, file2 := range files { - fmt.Print("Installing: ") - fmt.Println("/Applications/qtox.app/Contents/" + file.Name() + "/" + file2.Name()) - - if _, err := os.Stat("/Applications/qtox.app/Contents/" + file.Name() + "/" + file2.Name()); os.IsNotExist(err) { - newfile := exec.Command("/usr/libexec/authopen", "-c", "-x", "-m", "drwxrwxr-x+", "/Applications/qtox.app/Contents/"+file.Name()+"/"+file2.Name()) - newfile.Run() - } - - cat := exec.Command("/bin/cat", update_dir+file.Name()+"/"+file2.Name()) - auth := exec.Command("/usr/libexec/authopen", "-w", "/Applications/qtox.app/Contents/"+file.Name()+"/"+file2.Name()) - auth.Stdin, _ = cat.StdoutPipe() - auth.Stdout = os.Stdout - auth.Stderr = os.Stderr - _ = auth.Start() - _ = cat.Run() - _ = auth.Wait() - } - } - - } os.RemoveAll(update_dir) fmt.Println("Update metadata wiped, launching qTox") launchqtox := exec.Command("/usr/bin/open", "-b", "im.tox.qtox") diff --git a/res.qrc b/res.qrc index d58cef6c7..5db98f01e 100644 --- a/res.qrc +++ b/res.qrc @@ -37,6 +37,14 @@ img/status/dot_online.png img/status/dot_online_2x.png img/status/dot_online_notification.png + img/taskbar/dark/taskbar_online_2x.png + img/taskbar/dark/taskbar_idle_2x.png + img/taskbar/dark/taskbar_busy_2x.png + img/taskbar/dark/taskbar_offline_2x.png + img/taskbar/light/taskbar_online_2x.png + img/taskbar/light/taskbar_idle_2x.png + img/taskbar/light/taskbar_busy_2x.png + img/taskbar/light/taskbar_offline_2x.png img/transfer.png smileys/cylgom/angel.png smileys/cylgom/angry.png diff --git a/src/audio.cpp b/src/audio.cpp index 6ade89edd..d90d5d48e 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -87,8 +87,6 @@ void Audio::openOutput(const QString& outDevDescr) { auto* tmp = alOutDev; alOutDev = nullptr; - if (tmp) - alcCloseDevice(tmp); if (outDevDescr.isEmpty()) alOutDev = alcOpenDevice(nullptr); else @@ -104,6 +102,8 @@ void Audio::openOutput(const QString& outDevDescr) alcMakeContextCurrent(nullptr); alcDestroyContext(alContext); } + if (tmp) + alcCloseDevice(tmp); alContext=alcCreateContext(alOutDev,nullptr); if (!alcMakeContextCurrent(alContext)) { @@ -184,14 +184,14 @@ void Audio::playAudioBuffer(ALuint alSource, const int16_t *data, int samples, u alGetSourcei(alSource, AL_BUFFERS_QUEUED, &queued); alSourcei(alSource, AL_LOOPING, AL_FALSE); - if(processed) + if (processed) { ALuint bufids[processed]; alSourceUnqueueBuffers(alSource, processed, bufids); alDeleteBuffers(processed - 1, bufids + 1); bufid = bufids[0]; } - else if(queued < 16) + else if (queued < 16) { alGenBuffers(1, &bufid); } @@ -207,6 +207,6 @@ void Audio::playAudioBuffer(ALuint alSource, const int16_t *data, int samples, u ALint state; alGetSourcei(alSource, AL_SOURCE_STATE, &state); - if(state != AL_PLAYING) + if (state != AL_PLAYING) alSourcePlay(alSource); } diff --git a/src/core.cpp b/src/core.cpp index 05ce62261..637436fb2 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -728,7 +728,7 @@ void Core::requestFriendship(const QString& friendAddress, const QString& messag { const QString userId = friendAddress.mid(0, TOX_CLIENT_ID_SIZE * 2); - if(hasFriendWithAddress(friendAddress)) + if (hasFriendWithAddress(friendAddress)) { emit failedToAddFriend(userId, QString(tr("Friend is already added"))); } @@ -1677,7 +1677,7 @@ void Core::createGroup(uint8_t type) bool Core::hasFriendWithAddress(const QString &addr) const { // Valid length check - if(addr.length() != (TOX_FRIEND_ADDRESS_SIZE * 2)) + if (addr.length() != (TOX_FRIEND_ADDRESS_SIZE * 2)) { return false; } @@ -1689,7 +1689,7 @@ bool Core::hasFriendWithAddress(const QString &addr) const bool Core::hasFriendWithPublicKey(const QString &pubkey) const { // Valid length check - if(pubkey.length() != (TOX_CLIENT_ID_SIZE * 2)) + if (pubkey.length() != (TOX_CLIENT_ID_SIZE * 2)) { return false; } @@ -1706,7 +1706,7 @@ bool Core::hasFriendWithPublicKey(const QString &pubkey) const QString addrOrId = getFriendAddress(ids[i]); // Set true if found - if(addrOrId.toUpper().startsWith(pubkey.toUpper())) + if (addrOrId.toUpper().startsWith(pubkey.toUpper())) { found = true; break; diff --git a/src/coreav.cpp b/src/coreav.cpp index a00d54ae6..13f6dd8c0 100644 --- a/src/coreav.cpp +++ b/src/coreav.cpp @@ -207,7 +207,7 @@ void Core::playCallAudio(void* toxav, int32_t callId, const int16_t *data, uint1 alGenSources(1, &calls[callId].alSource); ToxAvCSettings dest; - if(toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &dest) == 0) + if (toxav_get_peer_csettings((ToxAv*)toxav, callId, 0, &dest) == 0) playAudioBuffer(calls[callId].alSource, data, samples, dest.audio_channels, dest.audio_sample_rate); } @@ -229,24 +229,24 @@ void Core::sendCallAudio(int callId, ToxAv* toxav) bool frame = false; ALint samples; alcGetIntegerv(Audio::alInDev, ALC_CAPTURE_SAMPLES, sizeof(samples), &samples); - if(samples >= framesize) + if (samples >= framesize) { memset(buf, 0, bufsize); // Avoid uninitialized values (Valgrind) alcCaptureSamples(Audio::alInDev, buf, framesize); frame = 1; } - if(frame) + if (frame) { int r; - if((r = toxav_prepare_audio_frame(toxav, callId, dest, framesize*2, (int16_t*)buf, framesize)) < 0) + if ((r = toxav_prepare_audio_frame(toxav, callId, dest, framesize*2, (int16_t*)buf, framesize)) < 0) { qDebug() << "Core: toxav_prepare_audio_frame error"; calls[callId].sendAudioTimer->start(); return; } - if((r = toxav_send_audio(toxav, callId, dest, r)) < 0) + if ((r = toxav_send_audio(toxav, callId, dest, r)) < 0) qDebug() << "Core: toxav_send_audio error"; } calls[callId].sendAudioTimer->start(); @@ -271,7 +271,7 @@ void Core::sendCallVideo(int callId) if (frame.w && frame.h) { int result; - if((result = toxav_prepare_video_frame(toxav, callId, videobuf, videobufsize, &frame)) < 0) + if ((result = toxav_prepare_video_frame(toxav, callId, videobuf, videobufsize, &frame)) < 0) { qDebug() << QString("Core: toxav_prepare_video_frame: error %1").arg(result); vpx_img_free(&frame); @@ -279,7 +279,7 @@ void Core::sendCallVideo(int callId) return; } - if((result = toxav_send_video(toxav, callId, (uint8_t*)videobuf, result)) < 0) + if ((result = toxav_send_video(toxav, callId, (uint8_t*)videobuf, result)) < 0) qDebug() << QString("Core: toxav_send_video error: %1").arg(result); vpx_img_free(&frame); @@ -540,7 +540,7 @@ void Core::onAvStart(void* _toxav, int32_t call_index, void* core) // This function's logic was shamelessly stolen from uTox void Core::playAudioBuffer(ALuint alSource, const int16_t *data, int samples, unsigned channels, int sampleRate) { - if(!channels || channels > 2) + if (!channels || channels > 2) { qWarning() << "Core::playAudioBuffer: trying to play on "<= framesize) + if (samples >= framesize) { memset(buf, 0, bufsize); // Avoid uninitialized values (Valgrind) alcCaptureSamples(Audio::alInDev, buf, framesize); frame = 1; } - if(frame) + if (frame) { int r; - if((r = toxav_group_send_audio(toxav_get_tox(toxav), groupId, (int16_t*)buf, + if ((r = toxav_group_send_audio(toxav_get_tox(toxav), groupId, (int16_t*)buf, framesize, av_DefaultSettings.audio_channels, av_DefaultSettings.audio_sample_rate)) < 0) { qDebug() << "Core: toxav_group_send_audio error"; diff --git a/src/main.cpp b/src/main.cpp index 3ecb63d1c..ef378bfbc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -70,7 +70,7 @@ int main(int argc, char *argv[]) parser.process(a); Settings::getInstance(); // Build our Settings singleton as soon as QApplication is ready, not before - if(parser.isSet("P")) + if (parser.isSet("P")) Settings::getInstance().setCurrentProfile(parser.value("P")); sodium_init(); // For the auto-updater @@ -156,7 +156,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } } - else if(!ipc.isCurrentOwner() && !parser.isSet("P")) + else if (!ipc.isCurrentOwner() && !parser.isSet("P")) { time_t event = ipc.postEvent("$activate"); ipc.waitUntilProcessed(event); diff --git a/src/misc/settings.cpp b/src/misc/settings.cpp index c5e13b1e7..b14fe2e34 100644 --- a/src/misc/settings.cpp +++ b/src/misc/settings.cpp @@ -129,7 +129,6 @@ void Settings::load() makeToxPortable = s.value("makeToxPortable", false).toBool(); autostartInTray = s.value("autostartInTray", false).toBool(); closeToTray = s.value("closeToTray", false).toBool(); - trayShowsUserStatus = s.value("trayShowsUserStatus", false).toBool(); forceTCP = s.value("forceTCP", false).toBool(); useProxy = s.value("useProxy", false).toBool(); proxyAddr = s.value("proxyAddr", "").toString(); @@ -168,6 +167,7 @@ void Settings::load() timestampFormat = s.value("timestampFormat", "hh:mm").toString(); minimizeOnClose = s.value("minimizeOnClose", false).toBool(); minimizeToTray = s.value("minimizeToTray", false).toBool(); + lightTrayIcon = s.value("lightTrayIcon", false).toBool(); useNativeStyle = s.value("nativeStyle", false).toBool(); useEmoticons = s.value("useEmoticons", true).toBool(); statusChangeNotificationEnabled = s.value("statusChangeNotificationEnabled", false).toBool(); @@ -281,7 +281,6 @@ void Settings::save(QString path, bool writeFriends) s.setValue("showSystemTray", showSystemTray); s.setValue("autostartInTray",autostartInTray); s.setValue("closeToTray", closeToTray); - s.setValue("trayShowsUserStatus", trayShowsUserStatus); s.setValue("useProxy", useProxy); s.setValue("forceTCP", forceTCP); s.setValue("proxyAddr", proxyAddr); @@ -317,6 +316,7 @@ void Settings::save(QString path, bool writeFriends) s.setValue("timestampFormat", timestampFormat); s.setValue("minimizeOnClose", minimizeOnClose); s.setValue("minimizeToTray", minimizeToTray); + s.setValue("lightTrayIcon", lightTrayIcon); s.setValue("nativeStyle", useNativeStyle); s.setValue("useEmoticons", useEmoticons); s.setValue("themeColor", themeColor); @@ -521,16 +521,6 @@ void Settings::setCloseToTray(bool newValue) closeToTray = newValue; } -bool Settings::getTrayShowsUserStatus() const -{ - return trayShowsUserStatus; -} - -void Settings::setTrayShowsUserStatus(bool newValue) -{ - trayShowsUserStatus = newValue; -} - bool Settings::getMinimizeToTray() const { return minimizeToTray; @@ -542,6 +532,16 @@ void Settings::setMinimizeToTray(bool newValue) minimizeToTray = newValue; } +bool Settings::getLightTrayIcon() const +{ + return lightTrayIcon; +} + +void Settings::setLightTrayIcon(bool newValue) +{ + lightTrayIcon = newValue; +} + bool Settings::getStatusChangeNotificationEnabled() const { return statusChangeNotificationEnabled; diff --git a/src/misc/settings.h b/src/misc/settings.h index 5622be204..848ade407 100644 --- a/src/misc/settings.h +++ b/src/misc/settings.h @@ -58,12 +58,12 @@ public: bool getCloseToTray() const; void setCloseToTray(bool newValue); - - bool getTrayShowsUserStatus() const; - void setTrayShowsUserStatus(bool newValue); bool getMinimizeToTray() const; void setMinimizeToTray(bool newValue); + + bool getLightTrayIcon() const; + void setLightTrayIcon(bool newValue); QString getStyle() const; void setStyle(const QString& newValue); @@ -247,7 +247,7 @@ private: bool autostartInTray; bool closeToTray; bool minimizeToTray; - bool trayShowsUserStatus; + bool lightTrayIcon; bool useEmoticons; bool checkUpdates; bool showInFront; diff --git a/src/misc/smileypack.cpp b/src/misc/smileypack.cpp index 1ec70f954..c640fffb4 100644 --- a/src/misc/smileypack.cpp +++ b/src/misc/smileypack.cpp @@ -69,9 +69,9 @@ QList > SmileyPack::listSmileyPacks(const QStringList &p if (relPath.leftRef(2) == "..") { - if(!smileyPacks.contains(QPair(packageName, absPath))) + if (!smileyPacks.contains(QPair(packageName, absPath))) smileyPacks << QPair(packageName, absPath); - else if(!smileyPacks.contains(QPair(packageName, relPath))) + else if (!smileyPacks.contains(QPair(packageName, relPath))) smileyPacks << QPair(packageName, relPath); // use relative path for subdirectories } } @@ -97,7 +97,7 @@ bool SmileyPack::load(const QString& filename) // open emoticons.xml QFile xmlFile(filename); - if(!xmlFile.open(QIODevice::ReadOnly)) + if (!xmlFile.open(QIODevice::ReadOnly)) return false; // cannot open file /* parse the cfg file @@ -138,14 +138,14 @@ bool SmileyPack::load(const QString& filename) QPixmap pm; pm.loadFromData(getCachedSmiley(emoticon), "PNG"); - if(pm.size().width() > 0) + if (pm.size().width() > 0) emoticonSet.push_back(emoticon); stringElement = stringElement.nextSibling().toElement(); } - if(emoticonSet.size() > 0) + if (emoticonSet.size() > 0) emoticons.push_back(emoticonSet); } diff --git a/src/platform/timer_win.cpp b/src/platform/timer_win.cpp index 07650a0e1..31542f76f 100644 --- a/src/platform/timer_win.cpp +++ b/src/platform/timer_win.cpp @@ -17,14 +17,14 @@ #include #ifdef Q_OS_WIN32 #include "src/platform/timer.h" -#include +#include uint32_t Platform::getIdleTime() { LASTINPUTINFO info = { 0 }; info.cbSize = sizeof(info); - if(GetLastInputInfo(&info)) + if (GetLastInputInfo(&info)) return GetTickCount() - info.dwTime; return 0; } diff --git a/src/platform/timer_x11.cpp b/src/platform/timer_x11.cpp index 5c9ac1b20..263a3b9b6 100644 --- a/src/platform/timer_x11.cpp +++ b/src/platform/timer_x11.cpp @@ -25,7 +25,7 @@ uint32_t Platform::getIdleTime() uint32_t idleTime = 0; Display *display = XOpenDisplay(NULL); - if(!display) + if (!display) { qDebug() << "XOpenDisplay(NULL) failed"; return 0; @@ -33,10 +33,10 @@ uint32_t Platform::getIdleTime() int32_t x11event = 0, x11error = 0; static int32_t hasExtension = XScreenSaverQueryExtension(display, &x11event, &x11error); - if(hasExtension) + if (hasExtension) { XScreenSaverInfo *info = XScreenSaverAllocInfo(); - if(info) + if (info) { XScreenSaverQueryInfo(display, DefaultRootWindow(display), info); idleTime = info->idle; diff --git a/src/video/cameraworker.cpp b/src/video/cameraworker.cpp index 8671d6568..da98e58f4 100644 --- a/src/video/cameraworker.cpp +++ b/src/video/cameraworker.cpp @@ -129,7 +129,7 @@ void CameraWorker::applyProps() if (!cam.isOpened()) return; - for(int prop : props.keys()) + for (int prop : props.keys()) cam.set(prop, props.value(prop)); } @@ -148,7 +148,7 @@ void CameraWorker::subscribe() void CameraWorker::unsubscribe() { - if(--refCount <= 0) + if (--refCount <= 0) { cam.release(); refCount = 0; diff --git a/src/widget/chatareawidget.cpp b/src/widget/chatareawidget.cpp index 393a01c0e..22886ba8c 100644 --- a/src/widget/chatareawidget.cpp +++ b/src/widget/chatareawidget.cpp @@ -87,6 +87,7 @@ void ChatAreaWidget::mouseReleaseEvent(QMouseEvent * event) } } } + emit onClick(); } void ChatAreaWidget::onAnchorClicked(const QUrl &url) diff --git a/src/widget/chatareawidget.h b/src/widget/chatareawidget.h index 2eda1aad4..72a17823c 100644 --- a/src/widget/chatareawidget.h +++ b/src/widget/chatareawidget.h @@ -41,6 +41,7 @@ public slots: signals: void onFileTranfertInterract(QString widgetName, QString buttonName); + void onClick(); protected: void mouseReleaseEvent(QMouseEvent * event); diff --git a/src/widget/form/chatform.cpp b/src/widget/form/chatform.cpp index a97faf93c..4f2c73998 100644 --- a/src/widget/form/chatform.cpp +++ b/src/widget/form/chatform.cpp @@ -673,7 +673,7 @@ void ChatForm::onFileSendFailed(int FriendId, const QString &fname) if (FriendId != f->getFriendID()) return; - addSystemInfoMessage("File: \"" + fname + "\" failed to send.", "red", QDateTime::currentDateTime()); + addSystemInfoMessage(tr("Failed to send file \"%1\"").arg(fname), "red", QDateTime::currentDateTime()); } void ChatForm::onAvatarChange(int FriendId, const QPixmap &pic) @@ -793,7 +793,7 @@ void ChatForm::onLoadHistory() void ChatForm::startCounter() { - if(!timer) + if (!timer) { timer = new QTimer(); connect(timer, SIGNAL(timeout()), this, SLOT(updateTime())); @@ -805,7 +805,7 @@ void ChatForm::startCounter() void ChatForm::stopCounter() { - if(timer) + if (timer) { addSystemInfoMessage(tr("Call with %1 ended. %2").arg(f->getDisplayedName(), secondsToDHMS(timeElapsed.elapsed()/1000)), @@ -834,10 +834,10 @@ QString ChatForm::secondsToDHMS(quint32 duration) int hours = (int) (duration % 24); int days = (int) (duration / 24); - if(minutes == 0) + if (minutes == 0) return cD + res.sprintf("%02ds", seconds); - if(hours == 0 && days == 0) + if (hours == 0 && days == 0) return cD + res.sprintf("%02dm %02ds", minutes, seconds); if (days == 0) diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index d9912a091..176e3c876 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -152,6 +152,7 @@ GenericChatForm::GenericChatForm(QWidget *parent) : connect(emoteButton, SIGNAL(clicked()), this, SLOT(onEmoteButtonClicked())); connect(chatWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onChatContextMenuRequested(QPoint))); + connect(chatWidget, SIGNAL(onClick()), this, SLOT(onChatWidgetClicked())); chatWidget->document()->setDefaultStyleSheet(Style::getStylesheet(":ui/chatArea/innerStyle.css")); chatWidget->setStyleSheet(Style::getStylesheet(":/ui/chatArea/chatArea.css")); @@ -252,6 +253,11 @@ void GenericChatForm::onEmoteButtonClicked() } } +void GenericChatForm::onChatWidgetClicked() +{ + msgEdit->setFocus(); +} + void GenericChatForm::onEmoteInsertRequested(QString str) { // insert the emoticon diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index d838fd31e..fe6de80fb 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -69,6 +69,7 @@ protected slots: void onEmoteButtonClicked(); void onEmoteInsertRequested(QString str); void clearChatArea(bool); + void onChatWidgetClicked(); protected: QString getElidedName(const QString& name); diff --git a/src/widget/form/groupchatform.cpp b/src/widget/form/groupchatform.cpp index cbb41df6b..095948515 100644 --- a/src/widget/form/groupchatform.cpp +++ b/src/widget/form/groupchatform.cpp @@ -209,11 +209,8 @@ void GroupChatForm::onCallClicked() void GroupChatForm::keyPressEvent(QKeyEvent* ev) { - if (msgEdit->hasFocus()) - return; - - // Push to talk - if (ev->key() == Qt::Key_P && inCall) + // Push to talk (CTRL+P) + if (ev->key() == Qt::Key_P && (ev->modifiers() & Qt::ControlModifier) && inCall) { Core* core = Core::getInstance(); if (!core->isGroupCallMicEnabled(group->getGroupId())) @@ -224,15 +221,15 @@ void GroupChatForm::keyPressEvent(QKeyEvent* ev) Style::repolish(micButton); } } + + if (msgEdit->hasFocus()) + return; } void GroupChatForm::keyReleaseEvent(QKeyEvent* ev) { - if (msgEdit->hasFocus()) - return; - - // Push to talk - if (ev->key() == Qt::Key_P && inCall) + // Push to talk (CTRL+P) + if (ev->key() == Qt::Key_P && (ev->modifiers() & Qt::ControlModifier) && inCall) { Core* core = Core::getInstance(); if (core->isGroupCallMicEnabled(group->getGroupId())) @@ -243,4 +240,7 @@ void GroupChatForm::keyReleaseEvent(QKeyEvent* ev) Style::repolish(micButton); } } + + if (msgEdit->hasFocus()) + return; } diff --git a/src/widget/form/settings/generalform.cpp b/src/widget/form/settings/generalform.cpp index a28fafa9f..64efcbdf5 100644 --- a/src/widget/form/settings/generalform.cpp +++ b/src/widget/form/settings/generalform.cpp @@ -62,8 +62,8 @@ GeneralForm::GeneralForm(SettingsWidget *myParent) : bodyUI->closeToTray->setEnabled(showSystemTray); bodyUI->minimizeToTray->setChecked(Settings::getInstance().getMinimizeToTray()); bodyUI->minimizeToTray->setEnabled(showSystemTray); - bodyUI->trayShowsUserStatus->setChecked(Settings::getInstance().getTrayShowsUserStatus()); - bodyUI->trayShowsUserStatus->setEnabled(showSystemTray); + bodyUI->lightTrayIcon->setChecked(Settings::getInstance().getLightTrayIcon()); + bodyUI->lightTrayIcon->setEnabled(showSystemTray); bodyUI->statusChanges->setChecked(Settings::getInstance().getStatusChangeNotificationEnabled()); bodyUI->useEmoticons->setChecked(Settings::getInstance().getUseEmoticons()); bodyUI->autoacceptFiles->setChecked(Settings::getInstance().getAutoSaveEnabled()); @@ -81,7 +81,7 @@ GeneralForm::GeneralForm(SettingsWidget *myParent) : bodyUI->styleBrowser->addItem(tr("None")); bodyUI->styleBrowser->addItems(QStyleFactory::keys()); - if(QStyleFactory::keys().contains(Settings::getInstance().getStyle())) + if (QStyleFactory::keys().contains(Settings::getInstance().getStyle())) bodyUI->styleBrowser->setCurrentText(Settings::getInstance().getStyle()); else bodyUI->styleBrowser->setCurrentText(tr("None")); @@ -122,12 +122,12 @@ GeneralForm::GeneralForm(SettingsWidget *myParent) : connect(bodyUI->startInTray, &QCheckBox::stateChanged, this, &GeneralForm::onSetAutostartInTray); connect(bodyUI->closeToTray, &QCheckBox::stateChanged, this, &GeneralForm::onSetCloseToTray); connect(bodyUI->minimizeToTray, &QCheckBox::stateChanged, this, &GeneralForm::onSetMinimizeToTray); - connect(bodyUI->trayShowsUserStatus, &QCheckBox::stateChanged, this, &GeneralForm::onSettrayShowsUserStatus); + connect(bodyUI->lightTrayIcon, &QCheckBox::stateChanged, this, &GeneralForm::onSetLightTrayIcon); connect(bodyUI->statusChanges, &QCheckBox::stateChanged, this, &GeneralForm::onSetStatusChange); connect(bodyUI->autoAwaySpinBox, SIGNAL(editingFinished()), this, SLOT(onAutoAwayChanged())); connect(bodyUI->showInFront, &QCheckBox::stateChanged, this, &GeneralForm::onSetShowInFront); connect(bodyUI->autoacceptFiles, &QCheckBox::stateChanged, this, &GeneralForm::onAutoAcceptFileChange); - if(bodyUI->autoacceptFiles->isChecked()) + if (bodyUI->autoacceptFiles->isChecked()) connect(bodyUI->autoSaveFilesDir, SIGNAL(clicked()), this, SLOT(onAutoSaveDirChange())); //theme connect(bodyUI->useEmoticons, &QCheckBox::stateChanged, this, &GeneralForm::onUseEmoticonsChange); @@ -188,20 +188,20 @@ void GeneralForm::onSetCloseToTray() Settings::getInstance().setCloseToTray(bodyUI->closeToTray->isChecked()); } +void GeneralForm::onSetLightTrayIcon() +{ + Settings::getInstance().setLightTrayIcon(bodyUI->lightTrayIcon->isChecked()); + Widget::getInstance()->updateTrayIcon(); +} + void GeneralForm::onSetMinimizeToTray() { Settings::getInstance().setMinimizeToTray(bodyUI->minimizeToTray->isChecked()); } -void GeneralForm::onSettrayShowsUserStatus() -{ - Settings::getInstance().setTrayShowsUserStatus(bodyUI->trayShowsUserStatus->isChecked()); - Widget::getInstance()->updateTrayIcon(); -} - void GeneralForm::onStyleSelected(QString style) { - if(bodyUI->styleBrowser->currentIndex() == 0) + if (bodyUI->styleBrowser->currentIndex() == 0) Settings::getInstance().setStyle("None"); else Settings::getInstance().setStyle(style); @@ -230,7 +230,7 @@ void GeneralForm::onAutoAcceptFileChange() { Settings::getInstance().setAutoSaveEnabled(bodyUI->autoacceptFiles->isChecked()); - if(bodyUI->autoacceptFiles->isChecked() == true) + if (bodyUI->autoacceptFiles->isChecked() == true) connect(bodyUI->autoSaveFilesDir, SIGNAL(clicked()), this, SLOT(onAutoSaveDirChange())); else disconnect(bodyUI->autoSaveFilesDir, SIGNAL(clicked()),this, SLOT(onAutoSaveDirChange())); @@ -240,7 +240,7 @@ void GeneralForm::onAutoSaveDirChange() { QString previousDir = Settings::getInstance().getGlobalAutoAcceptDir(); QString directory = QFileDialog::getExistingDirectory(0, tr("Choose an auto accept directory","popup title")); - if(directory.isEmpty()) + if (directory.isEmpty()) directory = previousDir; Settings::getInstance().setGlobalAutoAcceptDir(directory); @@ -308,7 +308,7 @@ void GeneralForm::reloadSmiles() QStringList smiles; smiles << ":)" << ";)" << ":p" << ":O" << ":["; //just in case... - for(int i = 0; i < emoticons.size(); i++) + for (int i = 0; i < emoticons.size(); i++) smiles.push_front(emoticons.at(i).first()); int pixSize = 30; diff --git a/src/widget/form/settings/generalform.h b/src/widget/form/settings/generalform.h index dba72d404..a560cf7ae 100644 --- a/src/widget/form/settings/generalform.h +++ b/src/widget/form/settings/generalform.h @@ -37,6 +37,7 @@ private slots: void onSetShowSystemTray(); void onSetAutostartInTray(); void onSetCloseToTray(); + void onSetLightTrayIcon(); void onSmileyBrowserIndexChanged(int index); void onUDPUpdated(); void onProxyAddrEdited(); @@ -49,7 +50,6 @@ private slots: void onAutoAwayChanged(); void onUseEmoticonsChange(); void onSetMinimizeToTray(); - void onSettrayShowsUserStatus(); void onReconnectClicked(); void onAutoAcceptFileChange(); void onAutoSaveDirChange(); diff --git a/src/widget/form/settings/generalsettings.ui b/src/widget/form/settings/generalsettings.ui index c4d07dfd8..47258e049 100644 --- a/src/widget/form/settings/generalsettings.ui +++ b/src/widget/form/settings/generalsettings.ui @@ -39,8 +39,8 @@ 0 0 - 509 - 849 + 513 + 819 @@ -109,7 +109,7 @@ - + @@ -152,19 +152,10 @@ - - - - - 0 - 0 - - + + - Tray icon displays user status - - - This is a temporary work around until proper systray status icons are available. + Light icon @@ -607,21 +598,5 @@ - - showSystemTray - toggled(bool) - trayShowsUserStatus - setEnabled(bool) - - - 148 - 143 - - - 158 - 205 - - - diff --git a/src/widget/form/tabcompleter.cpp b/src/widget/form/tabcompleter.cpp index 73d3ffeef..2fbaa48c7 100644 --- a/src/widget/form/tabcompleter.cpp +++ b/src/widget/form/tabcompleter.cpp @@ -52,7 +52,7 @@ void TabCompleter::buildCompletionList() // that section is then used as the completion regex QRegExp regex(QString("^[-_\\[\\]{}|`^.\\\\]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive); - for(auto name : group->getPeerList()) + for (auto name : group->getPeerList()) if (regex.indexIn(name) > -1) completionMap[name.toLower()] = name; diff --git a/src/widget/maskablepixmapwidget.cpp b/src/widget/maskablepixmapwidget.cpp index f0015d6d0..5f8d2ea99 100644 --- a/src/widget/maskablepixmapwidget.cpp +++ b/src/widget/maskablepixmapwidget.cpp @@ -130,6 +130,6 @@ void MaskablePixmapWidget::paintEvent(QPaintEvent *) void MaskablePixmapWidget::mousePressEvent(QMouseEvent*) { - if(clickable) + if (clickable) emit clicked(); } diff --git a/src/widget/tool/chatactions/messageaction.cpp b/src/widget/tool/chatactions/messageaction.cpp index 06f27ef1d..93b8271ee 100644 --- a/src/widget/tool/chatactions/messageaction.cpp +++ b/src/widget/tool/chatactions/messageaction.cpp @@ -29,7 +29,7 @@ MessageAction::MessageAction(const QString &author, const QString &message, cons QString MessageAction::getMessage(QString div) { QString message_; - if(Settings::getInstance().getUseEmoticons()) + if (Settings::getInstance().getUseEmoticons()) message_ = SmileyPack::getInstance().smileyfied(toHtmlChars(message)); else message_ = toHtmlChars(message); diff --git a/src/widget/widget.cpp b/src/widget/widget.cpp index 4736f3642..77593bdf8 100644 --- a/src/widget/widget.cpp +++ b/src/widget/widget.cpp @@ -54,7 +54,7 @@ void toxActivateEventHandler(const QByteArray& data) { - if(data != "$activate") + if (data != "$activate") return; Widget::getInstance()->show(); Widget::getInstance()->activateWindow(); @@ -116,7 +116,7 @@ void Widget::init() if (Settings::getInstance().getShowSystemTray()){ icon->show(); - if(Settings::getInstance().getAutostartInTray() == false) + if (Settings::getInstance().getAutostartInTray() == false) this->show(); } else @@ -125,7 +125,8 @@ void Widget::init() } else { - qWarning() << "No system tray detected!"; + qWarning() << "Widget: No system tray detected!"; + icon = nullptr; this->show(); } @@ -148,7 +149,7 @@ void Widget::init() ui->tooliconsZone->setStyleSheet(Style::resolve("QPushButton{background-color:@themeDark;border:none;}QPushButton:hover{background-color:@themeMediumDark;border:none;}")); - if(QStyleFactory::keys().contains(Settings::getInstance().getStyle()) + if (QStyleFactory::keys().contains(Settings::getInstance().getStyle()) && Settings::getInstance().getStyle() != "None") { ui->mainHead->setStyle(QStyleFactory::create(Settings::getInstance().getStyle())); @@ -295,22 +296,20 @@ void Widget::setTranslation() void Widget::updateTrayIcon() { - if(Settings::getInstance().getTrayShowsUserStatus()) - { - QString status = ui->statusButton->property("status").toString(); - QString icon; - if(status == "online") - icon = ":img/status/dot_online_2x.png"; - else if(status == "away") - icon = ":img/status/dot_idle_2x.png"; - else if(status == "busy") - icon = ":img/status/dot_busy_2x.png"; - else - icon = ":img/status/dot_away_2x.png"; - this->icon->setIcon(QIcon(icon)); - } + if (!icon) + return; + QString status = ui->statusButton->property("status").toString(); + QString pic; + QString color = Settings::getInstance().getLightTrayIcon() ? "light" : "dark"; + if (status == "online") + pic = ":img/taskbar/" + color + "/taskbar_online_2x.png"; + else if (status == "away") + pic = ":img/taskbar/" + color + "/taskbar_idle_2x.png"; + else if (status == "busy") + pic = ":img/taskbar/" + color + "/taskbar_busy_2x.png"; else - icon->setIcon(windowIcon()); + pic = ":img/taskbar/" + color + "/taskbar_offline_2x.png"; + icon->setIcon(QIcon(pic)); } Widget::~Widget() @@ -350,7 +349,7 @@ QThread* Widget::getCoreThread() void Widget::closeEvent(QCloseEvent *event) { - if(Settings::getInstance().getShowSystemTray() && Settings::getInstance().getCloseToTray() == true) + if (Settings::getInstance().getShowSystemTray() && Settings::getInstance().getCloseToTray() == true) { event->ignore(); this->hide(); @@ -367,7 +366,7 @@ void Widget::changeEvent(QEvent *event) { if (event->type() == QEvent::WindowStateChange) { - if(isMinimized() && Settings::getInstance().getMinimizeToTray()) + if (isMinimized() && Settings::getInstance().getMinimizeToTray()) { this->hide(); } @@ -417,7 +416,7 @@ QList Widget::searchProfiles() QDir dir(Settings::getSettingsDirPath()); dir.setFilter(QDir::Files | QDir::NoDotAndDotDot); dir.setNameFilters(QStringList("*.tox")); - for(QFileInfo file : dir.entryInfoList()) + for (QFileInfo file : dir.entryInfoList()) out += file.completeBaseName(); return out; } @@ -593,7 +592,7 @@ void Widget::onIconClick(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: - if(this->isHidden() == true) + if (this->isHidden() == true) { this->show(); this->activateWindow(); @@ -714,7 +713,7 @@ void Widget::addFriend(int friendId, const QString &userId) void Widget::addFriendFailed(const QString&, const QString& errorInfo) { QString info = QString(tr("Couldn't request friendship")); - if(!errorInfo.isEmpty()) { + if (!errorInfo.isEmpty()) { info = info + (QString(": ") + errorInfo); } @@ -735,7 +734,7 @@ void Widget::onFriendStatusChanged(int friendId, Status status) f->getFriendWidget()->updateStatusLight(); //won't print the message if there were no messages before - if(!f->getChatForm()->isEmpty() + if (!f->getChatForm()->isEmpty() && Settings::getInstance().getStatusChangeNotificationEnabled()) { QString fStatus = ""; diff --git a/translations/de.ts b/translations/de.ts index 373221256..6636bf5de 100644 --- a/translations/de.ts +++ b/translations/de.ts @@ -36,6 +36,11 @@ Capture device Aufnahmegerät + + + Rescan audio devices + Erneut nach Audiogeräten suchen + Video Settings @@ -252,6 +257,11 @@ Soll der Proxy ignoriert und eine direkte Internetverbindung genutzt werden?Call rejected Anruf abgewiesen + + + Failed to send file + Fehler beim Senden der Datei + Call with %1 ended. %2 @@ -594,29 +604,34 @@ Wollen Sie ein anderes probieren? Mache Tox portabel - - Show system tray + + System tray integration + Systemtray Integration + + + + Show system tray icon Im Systemtray zeigen - + Start in tray Ins Tray starten - + Close to tray Ins Tray schließen - + Minimize to tray Ins Tray minimieren Show contacts' status changes - Zeige Statusänderungen der Kontakte + Zeigt Statusänderungen der Kontakte @@ -626,7 +641,7 @@ Wollen Sie ein anderes probieren? Focus qTox when a message is received - Bringe qTox in den Vordergrund, wenn eine Nachricht eintrifft + Bringt qTox in den Vordergrund, wenn eine Nachricht eintrifft @@ -1629,4 +1644,4 @@ Es wird beim Neustart von qTox installiert. Senden der Nachricht fehlgeschlagen - + \ No newline at end of file diff --git a/translations/fr.ts b/translations/fr.ts index 206cf9356..48cc108ea 100644 --- a/translations/fr.ts +++ b/translations/fr.ts @@ -76,13 +76,13 @@ Add Friends - Ajouter des amis + Ajouter des contacts Tox ID Tox ID of the person you're sending a friend request to - ID Tox + Tox ID @@ -93,25 +93,25 @@ Send friend request - Envoyer la demande d'ami + Envoyer la demande de contact Tox me maybe? Default message in friend requests if the field is left blank. Write something appropriate! - Je souhaiterais vous ajouter à mes contacts + Je souhaiterais vous ajouter à mes contacts. Please fill in a valid Tox ID Tox ID of the friend you're sending a friend request to - Merci de remplir un ID Tox valide + Merci d'entrer un Tox ID valide You can't add yourself as a friend! When trying to add your own Tox ID as friend - Vous ne pouvez pas vous ajouter vous même en temps qu'ami! + Vous ne pouvez pas vous ajouter vous-même ! @@ -123,19 +123,19 @@ Ignorer le proxy et se connecter directement à Internet ? qTox needs to use the Tox DNS, but can't do it through a proxy Ignore the proxy and connect to the Internet directly ? - qTox as besoin d'utiliser le DNS Tox, mais ne peut pas le faire avec un proxy + qTox a besoin d'utiliser le DNS Tox, mais ne peut pas le faire avec un proxy Ignorer le proxy et se connecter directement à Internet ? This Tox ID does not exist DNS error - Cet ID Tox n'existe pas + Ce Tox ID n'existe pas This address does not exist The DNS gives the Tox ID associated to toxme.se addresses - Cette addresse n'existe pas + Cette adresse n'existe pas Error while looking up DNS @@ -178,22 +178,22 @@ Ignorer le proxy et se connecter directement à Internet ? Bad Idea - Mauvaise Idée + Mauvaise idée You're trying to send a special (sequential) file, that's not going to work! - Vous êtes en train d'essayer d'envoyer un fichier spécial (sequentiel), ça ne marchera pas! + Vous êtes en train d'essayer d'envoyer un fichier spécial (sequentiel), ça ne fonctionnera pas ! %1 calling - %1 appelle + %1 appel %1 stopped calling - %1a arreté l'appel + %1 a arreté l'appel @@ -229,7 +229,7 @@ Ignorer le proxy et se connecter directement à Internet ? Toxing on qTox - Toxer avec qTox + Je Tox sur qTox @@ -239,7 +239,7 @@ Ignorer le proxy et se connecter directement à Internet ? Friend is already added - Cet ami est déjà dans cos contact + Ce contact est déjà dans vos contacts @@ -249,7 +249,7 @@ Ignorer le proxy et se connecter directement à Internet ? The .tox file is encrypted, but encryption was not checked, continuing regardless. - Le fichier .tox est chiffré, mais l'encryption n'as pas été activée. Le problème sera ignoré. + Le fichier .tox est chiffré, mais le chiffrement n'a pas été activé. Le problème sera ignoré. @@ -261,14 +261,14 @@ Ignorer le proxy et se connecter directement à Internet ? Password error - Mod de passe invalide + Mot de passe invalide Failed to setup password. Empty password. - Impossible de mettre ne place le mot de passe. + Impossible de mettre en place le mot de passe. Le mot de passe est vide. @@ -289,7 +289,7 @@ Le mot de passe est vide. Wrong password has been entered - Un mauvais mot de passe à été entré + Un mauvais mot de passe a été entré @@ -316,7 +316,7 @@ Voulez-vous essayer un mot de passe différent? Due to incorret password logging will be disabled - À cause d'un mauvais mot de passe, l'historique sera désactivé + Due à l'utilisation d'un mauvais mot de passe, l'historique sera désactivé @@ -326,7 +326,7 @@ Voulez-vous essayer un mot de passe différent? Will be saved without encryption! - L'historique sera sauvegardé sans être chiffré! + L'historique sera sauvegardé sans être chiffré ! @@ -380,12 +380,12 @@ Voulez-vous essayer un mot de passe différent? Friend request Title of the window to aceept/deny a friend request - Demande d'ami + Demande de contact Someone wants to make friends with you - Quelqu'un veut devenir votre ami + Quelqu'un vient de vous ajouter dans sa liste de contacts @@ -395,7 +395,7 @@ Voulez-vous essayer un mot de passe différent? Friend request message: - Message de demande d'ami: + Message au sujet de la demande: @@ -422,7 +422,7 @@ Voulez-vous essayer un mot de passe différent? Copy friend ID Menu to copy the Tox ID of that friend - Copier l'ID ami + Copier l'ID du contact @@ -458,7 +458,7 @@ Voulez-vous essayer un mot de passe différent? Disable global auto accept context menu entry - Désactiver l'acceptation automatique de fichier + Désactiver le téléchargement automatique de fichiers @@ -470,7 +470,7 @@ Voulez-vous essayer un mot de passe différent? Remove friend Menu to remove the friend from our friendlist - Supprimer ami + Supprimer ce contact @@ -502,7 +502,7 @@ Voulez-vous essayer un mot de passe différent? You can't disconnect while a call is active! popup text - Vous ne pouvez pas vous déconnecter avec un appel en cours! + Vous ne pouvez pas vous déconnecter avec un appel en cours ! @@ -520,7 +520,7 @@ Voulez-vous essayer un mot de passe différent? The translation may not load until qTox restarts. - La translation peut ne pas se charger jusqu'à ce que qTox redémarre. + La traduction peut ne pas prendre effet immédiatement. Redémarrez qTox si ce n'est pas le cas. Translation: @@ -550,7 +550,7 @@ Voulez-vous essayer un mot de passe différent? Minimize to tray - Minimizer dans la barre d'état + Minimiser dans la barre d'état @@ -564,7 +564,7 @@ Voulez-vous essayer un mot de passe différent? Auto away after (0 to disable): - Auto-absent après (0 pour désactiver): + Se rendre absent après (0 pour désactiver): @@ -620,7 +620,7 @@ Voulez-vous essayer un mot de passe différent? Reconnect reconnect button - Reconnection + Se reconnecter @@ -640,7 +640,7 @@ Voulez-vous essayer un mot de passe différent? Focus qTox when a message is received - Montrer qTox quand un message est reçu + Montrer la fênetre qTox quand un message est reçu @@ -713,7 +713,7 @@ Voulez-vous essayer un mot de passe différent? This allows, e.g., toxing over Tor. It adds load to the Tox network however, so use only when necessary. force tcp checkbox tooltip - Permet par exemple d'utiliser Tox à travers Tor, mais ce n'est à utiliser que si nécessaire, car cela ralenti le réseau Tox. + Permet par exemple d'utiliser Tox à travers Tor, mais ce n'est à utiliser que si nécessaire car cela ralenti le réseau Tox. Disable UDP (not recommended) @@ -748,7 +748,7 @@ Voulez-vous essayer un mot de passe différent? Smileys - Emoticones + Émoticônes @@ -768,7 +768,7 @@ Voulez-vous essayer un mot de passe différent? Toggle speakers volume - Couper les haut parleurs + Couper les haut-parleurs @@ -818,7 +818,7 @@ Voulez-vous essayer un mot de passe différent? 0 users in chat - 0 personnes + Le groupe est vide @@ -844,7 +844,7 @@ Voulez-vous essayer un mot de passe différent? You can't switch profiles while a call is active! popup text - Vous ne pouvez pas changer de profil quand un appel est en cours! + Vous ne pouvez pas changer de profil quand un appel est en cours ! @@ -894,7 +894,7 @@ Voulez-vous essayer un mot de passe différent? The file you chose could not be written to. - Le fichier que vous avez choisi n'as pas pu être écrit. + Le fichier que vous avez choisi n'es pas disponible en écriture. @@ -912,7 +912,7 @@ Voulez-vous essayer un mot de passe différent? Deletion imminent! deletion confirmation title - Suppression imminente! + Suppression imminente ! @@ -936,13 +936,13 @@ Voulez-vous essayer un mot de passe différent? Ignoring non-Tox file popup title - Fichier non-Tox ignoré + Fichier incompatible avec Tox ignoré Warning: you've chosen a file that is not a Tox save file; ignoring. popup text - Attention: Vous avez sélectionné un fichier qui n'est pas une sauvegarde Tox: il sera ignoré. + Attention: Vous avez sélectionné un fichier qui n'est pas une sauvegarde Tox, il sera ignoré. @@ -986,7 +986,7 @@ Voulez-vous essayer un mot de passe différent? Your Tox ID (click to copy) - Votre ID Tox (cliquez pour copier) + Votre Tox ID (cliquez pour copier) @@ -1033,7 +1033,7 @@ Voulez-vous essayer un mot de passe différent? This is useful to remain safe on public computers delete profile button tooltip - Util pour sécuriser sur un ordinateur public + Utile pour rester en sécurité sur un ordinateur public @@ -1045,7 +1045,7 @@ Voulez-vous essayer un mot de passe différent? New Tox ID new profile button - Nouvel ID Tox + Nouvel Tox ID @@ -1093,12 +1093,12 @@ Voulez-vous essayer un mot de passe différent? Add friends - Ajouter des amis + Ajouter des contacts Create a group chat - Creer un groupe + Créer un groupe @@ -1125,7 +1125,7 @@ Voulez-vous essayer un mot de passe différent? Tox video - Vidéo tox + Vidéo Tox @@ -1145,7 +1145,7 @@ Voulez-vous essayer un mot de passe différent? You already have history log file encrypted with different password Do you want to delete old history file? Vous avez déjà un historique chiffré avec un autre mot de passe -Voulez vous supprimer l'ancien historique? +Voulez vous supprimer l'ancien historique ? @@ -1192,7 +1192,7 @@ Voulez vous supprimer l'ancien historique? Warning: you've chosen a file that is not a Tox save file; ignoring. popup text - Attention: Vous avez sélectionné un fichier qui n'est pas une sauvegarde Tox: il sera ignoré. + Attention: Vous avez sélectionné un fichier qui n'est pas une sauvegarde Tox, il sera ignoré. @@ -1233,12 +1233,12 @@ Voulez vous supprimer l'ancien historique? An update is available, do you want to download it now ? It will be installed when qTox restarts. Une mise à jour est disponible, voulez vous la télécharger maintenant ? -Elle sera installée au prochain démarrage de qTox +Elle sera installée au prochain démarrage de qTox. Tox URI to parse - URI Tox à utiliser + URL Tox à utiliser @@ -1255,7 +1255,7 @@ Elle sera installée au prochain démarrage de qTox Repeat Password - Répetez le mot de passe + Retapez le mot de passe @@ -1270,13 +1270,13 @@ Elle sera installée au prochain démarrage de qTox This address does not exist The DNS gives the Tox ID associated to toxme.se addresses - Cette addresse n'existe pas + Cette adresse n'existe pas Error while looking up DNS The DNS gives the Tox ID associated to toxme.se addresses - Erreur en consultant le serveur DNS + Une erreur s'est produite en consultant le serveur DNS @@ -1316,22 +1316,22 @@ Elle sera installée au prochain démarrage de qTox Add a friend Title of the window to add a friend through Tox URI - Ajouter un ami + Ajouter un contact Do you want to add %1 as a friend ? - Voulez-vous ajouter %1 à vos amis ? + Voulez-vous ajouter %1 à vos contacts ? User ID: - ID utilisateur: + ID d'utilisateur: Friend request message: - Message de demande d'ami: + Associer un message à cette demande: @@ -1354,7 +1354,7 @@ Elle sera installée au prochain démarrage de qTox away - indisponnible + absent busy @@ -1368,7 +1368,7 @@ Elle sera installée au prochain démarrage de qTox Away - Indisponible + Absent @@ -1383,7 +1383,7 @@ Elle sera installée au prochain démarrage de qTox Change status to: - Changer le status en: + Changer le status par: @@ -1395,7 +1395,7 @@ Elle sera installée au prochain démarrage de qTox Away Button to set your status to 'Away' - Indisponible + Absent @@ -1443,18 +1443,18 @@ Elle sera installée au prochain démarrage de qTox Toxcore failed to start, the application will terminate after you close this message. - Toxcore n'as pas pu démarrer correctement, l'application va quitter quand vous fermerez ce message. + ToxCore n'as pas pu démarrer correctement, l'application va s'arrêter quand vous fermerez cette alerte. toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart. popup text - Toxcore n'as pas pu démarrer avec ces paramètres de proxy, qTox ne peut pas continuer; merci de modifier vos paramètres et redémarrer. + ToxCore n'as pas pu démarrer avec ces paramètres proxy. Merci de modifier ou désactiver vos paramètres et redémarrer l'application. Add friend - Ajouter un ami + Ajouter un contact @@ -1469,13 +1469,13 @@ Elle sera installée au prochain démarrage de qTox Couldn't request friendship - Impossible de demander en ami + Impossible d'envoyer la demande de contact away contact status - indisponnible + absent @@ -1487,7 +1487,7 @@ Elle sera installée au prochain démarrage de qTox offline contact status - déconnecté + hors ligne @@ -1510,7 +1510,7 @@ Elle sera installée au prochain démarrage de qTox Message failed to send - Le message n'as pas pu être envoyé + Le message n'as pu être envoyé diff --git a/translations/it.ts b/translations/it.ts index 6650ae750..9ebdbf4c4 100644 --- a/translations/it.ts +++ b/translations/it.ts @@ -226,6 +226,11 @@ Ignorare le impostazioni del proxy e connettersi direttamente alla rete Tox?Calling to %1 Stai chiamando %1 + + + Failed to send file "%1" + Invio del file "%1" fallito + Call with %1 ended. %2 @@ -538,17 +543,22 @@ Soprannome: Mostra icona nella traybar - + + Light icon + Icona brillante + + + Set to 0 to disable Imposta 0 per disabilitare - + Connection Settings Impostazioni Connessione - + Enable IPv6 (recommended) Text on a checkbox to enable IPv6 Abilita IPv6 (consigliato) @@ -590,143 +600,133 @@ Soprannome: Minimizza nella traybar - - Tray icon displays user status - Mostra lo stato nell'icona della traybar - - - - This is a temporary work around until proper systray status icons are available. - Questo è un workaround temporaneo fino a quando non saranno disponibili icone di stato adeguate. - - - + Show contacts' status changes Mostra quando i contatti cambiano stato - + Check for updates on startup (unstable) Controlla aggiornamenti all'avvio (unstable) - + Focus qTox when a message is received Dai il focus a qTox quando arriva un messaggio - + Faux offline messaging Falsi messaggi offline - + Provided in minutes Espresso in minuti - + Auto away after (0 to disable) Imposta assenza dopo - + minutes minuti - + You can set this on a per-friend basis by right clicking them. autoaccept cb tooltip Puoi impostare questa preferenza per ogni singolo contatto usando il click destro sul suo nome. - + Autoaccept files Accetta automaticamente i trasferimenti di files - + Save files in Salva i files in - + PushButton Sfoglia - + Theme Impostazioni Tema - + Use emoticons Usa emoticons - + Smiley Pack Text on smiley pack label Emoticons - + Style Stile - + Theme color Colore - + Emoticon size Dimensione emoticons - + px px - + Timestamp format Formato data/ora - + Disabling this allows, e.g., toxing over Tor. It adds load to the Tox network however, so uncheck only when necessary. force tcp checkbox tooltip Disabilitando questo sarà possibile usare qTox con Tor. Tuttavia verrà aggiunto carico alla rete Tox, quindi disabilitare solo se necessario. - + Enable UDP (recommended) Text on checkbox to disable UDP Abilita UDP (consigliato) - + Use proxy (SOCKS5) Usa proxy (SOCKS5) - + Address Text on proxy addr label IP - + Port Text on proxy port label Porta - + Reconnect reconnect button Riconnetti @@ -771,7 +771,7 @@ Soprannome: - + Save chat log Salva il log della chat @@ -781,7 +781,7 @@ Soprannome: Rimuovi messaggi visualizzati - + Cleared Pulito @@ -1417,134 +1417,134 @@ Verrà installata al riavvio del programma. Cambia stato in: - + Online Button to set your status to 'Online' Online - + Away Button to set your status to 'Away' Assente - + Busy Button to set your status to 'Busy' Occupato - + Choose a profile Scegli un profilo - + Please choose which identity to use Per favore scegli quale identità usare - + Choose a profile picture Scegli un'immagine per il profilo - - - + + + Error Errore - + Unable to open this file Impossibile aprire il file - + Unable to read this image Impossibile leggere l'immagine - + This image is too big L'immagine è troppo grande - + Toxcore failed to start, the application will terminate after you close this message. Impossibile avviare Toxcore.\nqTox terminerà dopo che avrai chiuso questo messaggio. - + toxcore failed to start with your proxy settings. qTox cannot run; please modify your settings and restart. popup text Impossibile avviare Toxcore con le tue impostazione proxy.\nqTox non può funzionare correttamente, per favore modifica le impostazioni e riavvia il programma. - + Add friend Aggiungi contatto - + File transfers Files trasferiti - + Settings Impostazioni - + Couldn't request friendship Impossibile inviare la richiesta d'amicizia - + away contact status assente - + busy contact status occupato - + offline contact status offline - + online contact status online - + %1 is now %2 e.g. "Dubslow is now online" %1 è ora %2 - + <Unknown> Placeholder when we don't know someone's name in a group chat <Sconosciuto> - + %1 has set the title to %2 %1 ha impostato il titolo in %2 - + Message failed to send Impossibile inviare il messaggio