Compare commits
12 commits
dab107cf90
...
ef98d4ece7
Author | SHA1 | Date | |
---|---|---|---|
|
ef98d4ece7 | ||
|
2383bf2c71 | ||
|
2c8c92c2a4 | ||
|
bad2dc30c3 | ||
|
fe7f4233b9 | ||
|
68454a9841 | ||
|
d3bcf63cf7 | ||
|
a5f1209f28 | ||
|
9a44ca2769 | ||
|
155305f0f7 | ||
|
6abce8d976 | ||
|
f16d1f034f |
19 changed files with 127 additions and 62 deletions
17
.github/workflows/mac_packaged.yml
vendored
17
.github/workflows/mac_packaged.yml
vendored
|
@ -40,7 +40,7 @@ jobs:
|
|||
|
||||
macos:
|
||||
name: MacOS
|
||||
runs-on: macos-13
|
||||
runs-on: macos-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
|
@ -49,7 +49,7 @@ jobs:
|
|||
|
||||
env:
|
||||
GIT: "https://github.com"
|
||||
CMAKE_PREFIX_PATH: "/usr/local/opt/ffmpeg@6:/usr/local/opt/openal-soft"
|
||||
CMAKE_PREFIX_PATH: "/opt/homebrew/opt/ffmpeg@6:/opt/homebrew/opt/openal-soft"
|
||||
UPLOAD_ARTIFACT: "true"
|
||||
ONLY_CACHE: "false"
|
||||
MANUAL_CACHING: "1"
|
||||
|
@ -69,7 +69,7 @@ jobs:
|
|||
run: |
|
||||
brew update
|
||||
brew upgrade || true
|
||||
brew install ada-url autoconf automake boost cmake ffmpeg@6 openal-soft openh264 openssl opus ninja pkg-config python qt yasm xz
|
||||
brew install ada-url autoconf automake boost cmake ffmpeg@6 libtool openal-soft openh264 openssl opus ninja pkg-config python qt yasm xz
|
||||
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
|
||||
|
||||
xcodebuild -version > CACHE_KEY.txt
|
||||
|
@ -95,7 +95,7 @@ jobs:
|
|||
./autogen.sh
|
||||
./configure --disable-examples --disable-doc
|
||||
make -j$(sysctl -n hw.logicalcpu)
|
||||
make install
|
||||
sudo make install
|
||||
|
||||
- name: WebRTC cache.
|
||||
id: cache-webrtc
|
||||
|
@ -111,7 +111,11 @@ jobs:
|
|||
git clone --depth=1 --recursive --shallow-submodules $GIT/desktop-app/tg_owt.git
|
||||
cd tg_owt
|
||||
|
||||
cmake -B build . -GNinja -DCMAKE_BUILD_TYPE=Debug
|
||||
cmake -Bbuild -GNinja . \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_C_FLAGS_DEBUG="" \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG=""
|
||||
|
||||
cmake --build build --parallel
|
||||
|
||||
- name: Telegram Desktop build.
|
||||
|
@ -132,6 +136,9 @@ jobs:
|
|||
|
||||
cmake -Bbuild -GNinja . \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_C_FLAGS_DEBUG="" \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG="" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-s" \
|
||||
-DCMAKE_FIND_FRAMEWORK=LAST \
|
||||
-DTDESKTOP_API_TEST=ON \
|
||||
-DDESKTOP_APP_USE_PACKAGED_LAZY=ON \
|
||||
|
|
2
.github/workflows/snap.yml
vendored
2
.github/workflows/snap.yml
vendored
|
@ -40,7 +40,7 @@ jobs:
|
|||
|
||||
snap:
|
||||
name: Ubuntu
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
UPLOAD_ARTIFACT: "true"
|
||||
|
|
10
.github/workflows/win.yml
vendored
10
.github/workflows/win.yml
vendored
|
@ -42,7 +42,7 @@ jobs:
|
|||
|
||||
windows:
|
||||
name: Windows
|
||||
runs-on: windows-2022
|
||||
runs-on: windows-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
|
@ -94,6 +94,14 @@ jobs:
|
|||
nuget sources Disable -Name "Microsoft Visual Studio Offline Packages"
|
||||
nuget sources Add -Source https://api.nuget.org/v3/index.json & exit 0
|
||||
|
||||
- name: ThirdParty cache.
|
||||
id: cache-third-party
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.TBUILD }}\ThirdParty
|
||||
key: ${{ runner.OS }}-${{ matrix.arch }}-third-party-${{ env.CACHE_KEY }}
|
||||
restore-keys: ${{ runner.OS }}-${{ matrix.arch }}-third-party-
|
||||
|
||||
- name: Libraries cache.
|
||||
id: cache-libs
|
||||
uses: actions/cache@v4
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
|
||||
ProcessorArchitecture="ARCHITECTURE"
|
||||
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
|
||||
Version="5.5.3.0" />
|
||||
Version="5.5.4.0" />
|
||||
<Properties>
|
||||
<DisplayName>Telegram Desktop</DisplayName>
|
||||
<PublisherDisplayName>Telegram Messenger LLP</PublisherDisplayName>
|
||||
|
|
|
@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,5,3,0
|
||||
PRODUCTVERSION 5,5,3,0
|
||||
FILEVERSION 5,5,4,0
|
||||
PRODUCTVERSION 5,5,4,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -62,10 +62,10 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop"
|
||||
VALUE "FileVersion", "5.5.3.0"
|
||||
VALUE "FileVersion", "5.5.4.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2024"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "5.5.3.0"
|
||||
VALUE "ProductVersion", "5.5.4.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,5,3,0
|
||||
PRODUCTVERSION 5,5,3,0
|
||||
FILEVERSION 5,5,4,0
|
||||
PRODUCTVERSION 5,5,4,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -53,10 +53,10 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop Updater"
|
||||
VALUE "FileVersion", "5.5.3.0"
|
||||
VALUE "FileVersion", "5.5.4.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2024"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "5.5.3.0"
|
||||
VALUE "ProductVersion", "5.5.4.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -655,6 +655,7 @@ void Updates::getDifferenceAfterFail() {
|
|||
wait = wait ? std::min(wait, i->second - now) : (i->second - now);
|
||||
++i;
|
||||
} else {
|
||||
i->first->ptsSetRequesting(false);
|
||||
getChannelDifference(i->first, ChannelDifferenceRequest::AfterFail);
|
||||
i = _whenGetDiffAfterFail.erase(i);
|
||||
}
|
||||
|
@ -703,7 +704,9 @@ void Updates::getChannelDifference(
|
|||
_whenGetDiffByPts.remove(channel);
|
||||
}
|
||||
|
||||
if (!channel->ptsInited() || channel->ptsRequesting()) return;
|
||||
if (!channel->ptsInited() || channel->ptsRequesting()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (from != ChannelDifferenceRequest::AfterFail) {
|
||||
_whenGetDiffAfterFail.remove(channel);
|
||||
|
@ -1554,6 +1557,7 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
|||
}
|
||||
if (channel && !_handlingChannelDifference) {
|
||||
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
|
||||
MTP_LOG(0, ("Skipping new channel message because getting the difference."));
|
||||
return;
|
||||
}
|
||||
channel->ptsUpdateAndApply(d.vpts().v, d.vpts_count().v, update);
|
||||
|
@ -1646,6 +1650,7 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
|||
|
||||
if (channel && !_handlingChannelDifference) {
|
||||
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
|
||||
MTP_LOG(0, ("Skipping channel message edit because getting the difference."));
|
||||
return;
|
||||
} else {
|
||||
channel->ptsUpdateAndApply(d.vpts().v, d.vpts_count().v, update);
|
||||
|
@ -1661,6 +1666,7 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
|||
|
||||
if (channel && !_handlingChannelDifference) {
|
||||
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
|
||||
MTP_LOG(0, ("Skipping pinned channel messages because getting the difference."));
|
||||
return;
|
||||
} else {
|
||||
channel->ptsUpdateAndApply(d.vpts().v, d.vpts_count().v, update);
|
||||
|
@ -1775,6 +1781,7 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
|||
|
||||
if (channel && !_handlingChannelDifference) {
|
||||
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
|
||||
MTP_LOG(0, ("Skipping delete channel messages because getting the difference."));
|
||||
return;
|
||||
}
|
||||
channel->ptsUpdateAndApply(d.vpts().v, d.vpts_count().v, update);
|
||||
|
@ -1838,6 +1845,7 @@ void Updates::feedUpdate(const MTPUpdate &update) {
|
|||
auto channel = session().data().channelLoaded(d.vchannel_id());
|
||||
if (channel && !_handlingChannelDifference) {
|
||||
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
|
||||
MTP_LOG(0, ("Skipping channel web page update because getting the difference."));
|
||||
return;
|
||||
} else {
|
||||
channel->ptsUpdateAndApply(d.vpts().v, d.vpts_count().v, update);
|
||||
|
|
|
@ -22,7 +22,7 @@ constexpr auto AppId = "{53F49750-6209-4FBF-9CA8-7A333C87D1ED}"_cs;
|
|||
constexpr auto AppNameOld = "Telegram Win (Unofficial)"_cs;
|
||||
constexpr auto AppName = "Telegram Desktop"_cs;
|
||||
constexpr auto AppFile = "Telegram"_cs;
|
||||
constexpr auto AppVersion = 5005003;
|
||||
constexpr auto AppVersionStr = "5.5.3";
|
||||
constexpr auto AppVersion = 5005004;
|
||||
constexpr auto AppVersionStr = "5.5.4";
|
||||
constexpr auto AppBetaVersion = false;
|
||||
constexpr auto AppAlphaVersion = TDESKTOP_ALPHA_VERSION;
|
||||
|
|
|
@ -1726,6 +1726,10 @@ MediaWebPageFlags MediaWebPage::webpageFlags() const {
|
|||
return _flags;
|
||||
}
|
||||
|
||||
Storage::SharedMediaTypesMask MediaWebPage::sharedMediaTypes() const {
|
||||
return Storage::SharedMediaType::Link;
|
||||
}
|
||||
|
||||
bool MediaWebPage::hasReplyPreview() const {
|
||||
if (const auto document = MediaWebPage::document()) {
|
||||
return document->hasThumbnail()
|
||||
|
|
|
@ -446,6 +446,8 @@ public:
|
|||
WebPageData *webpage() const override;
|
||||
MediaWebPageFlags webpageFlags() const override;
|
||||
|
||||
Storage::SharedMediaTypesMask sharedMediaTypes() const override;
|
||||
|
||||
bool hasReplyPreview() const override;
|
||||
Image *replyPreview() const override;
|
||||
bool replyPreviewLoaded() const override;
|
||||
|
|
|
@ -191,7 +191,7 @@ void SetupSwipeHandler(
|
|||
const auto t = static_cast<QTouchEvent*>(e.get());
|
||||
const auto touchscreen = t->device()
|
||||
&& (t->device()->type() == base::TouchDevice::TouchScreen);
|
||||
if (!Platform::IsMac() && !touchscreen) {
|
||||
if (/*!Platform::IsMac() && */!touchscreen) {
|
||||
break;
|
||||
} else if (type == QEvent::TouchBegin) {
|
||||
// Reset state in case we lost some TouchEnd.
|
||||
|
@ -235,6 +235,7 @@ void SetupSwipeHandler(
|
|||
case QEvent::Wheel: {
|
||||
const auto w = static_cast<QWheelEvent*>(e.get());
|
||||
const auto phase = w->phase();
|
||||
#if 0
|
||||
#ifdef Q_OS_MAC
|
||||
if (phase == Qt::ScrollBegin) {
|
||||
state->twoFingerScrollStarted = true;
|
||||
|
@ -246,7 +247,8 @@ void SetupSwipeHandler(
|
|||
state->twoFingerScrollStarted = false;
|
||||
}
|
||||
#endif // Q_OS_MAC
|
||||
if (Platform::IsMac() || phase == Qt::NoScrollPhase) {
|
||||
#endif
|
||||
if (/*Platform::IsMac() || */phase == Qt::NoScrollPhase) {
|
||||
break;
|
||||
} else if (phase == Qt::ScrollBegin) {
|
||||
// Reset state in case we lost some TouchEnd.
|
||||
|
|
|
@ -169,6 +169,13 @@ infoTopBarCall: IconButton(infoTopBarMenu) {
|
|||
iconPosition: point(5px, -1px);
|
||||
rippleAreaPosition: point(0px, 6px);
|
||||
}
|
||||
infoTopBarQr: IconButton(infoTopBarMenu) {
|
||||
width: 52px;
|
||||
icon: icon {{ "menu/qr_code", boxTitleCloseFg }};
|
||||
iconOver: icon {{ "menu/qr_code", boxTitleCloseFgOver }};
|
||||
iconPosition: point(9px, -1px);
|
||||
rippleAreaPosition: point(0px, 6px);
|
||||
}
|
||||
infoTopBarForward: IconButton(infoTopBarBack) {
|
||||
width: 46px;
|
||||
icon: icon {{ "info/info_media_forward", boxTitleCloseFg }};
|
||||
|
@ -262,6 +269,12 @@ infoLayerTopBarCall: IconButton(infoLayerTopBarMenu) {
|
|||
iconOver: icon {{ "top_bar_call", boxTitleCloseFgOver }};
|
||||
iconPosition: point(3px, -1px);
|
||||
}
|
||||
infoLayerTopBarQr: IconButton(infoLayerTopBarClose) {
|
||||
width: 40px;
|
||||
icon: icon {{ "menu/qr_code", boxTitleCloseFg }};
|
||||
iconOver: icon {{ "menu/qr_code", boxTitleCloseFgOver }};
|
||||
iconPosition: point(8px, -1px);
|
||||
}
|
||||
infoLayerTopBarForward: IconButton(infoLayerTopBarBack) {
|
||||
width: 45px;
|
||||
icon: icon {{ "info/info_media_forward", boxTitleCloseFg }};
|
||||
|
|
|
@ -16,6 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include "info/info_top_bar.h"
|
||||
#include "settings/cloud_password/settings_cloud_password_email_confirm.h"
|
||||
#include "settings/settings_chat.h"
|
||||
#include "settings/settings_information.h"
|
||||
#include "settings/settings_main.h"
|
||||
#include "settings/settings_premium.h"
|
||||
#include "ui/effects/ripple_animation.h" // MaskByDrawer.
|
||||
|
@ -35,6 +36,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
#include "window/window_slide_animation.h"
|
||||
#include "boxes/peer_list_box.h"
|
||||
#include "ui/boxes/confirm_box.h"
|
||||
#include "ui/boxes/peer_qr_box.h"
|
||||
#include "main/main_session.h"
|
||||
#include "mtproto/mtproto_config.h"
|
||||
#include "data/data_download_manager.h"
|
||||
|
@ -384,6 +386,23 @@ void WrapWidget::setupTopBarMenuToggle() {
|
|||
addProfileCallsButton();
|
||||
} else if (section.type() == Section::Type::Settings) {
|
||||
addTopBarMenuButton();
|
||||
if (section.settingsType() == ::Settings::Information::Id()
|
||||
|| section.settingsType() == ::Settings::Main::Id()) {
|
||||
const auto controller = _controller->parentController();
|
||||
const auto self = controller->session().user();
|
||||
if (!self->username().isEmpty()) {
|
||||
const auto show = controller->uiShow();
|
||||
const auto &st = (wrap() == Wrap::Layer)
|
||||
? st::infoLayerTopBarQr
|
||||
: st::infoTopBarQr;
|
||||
const auto button = _topBar->addButton(
|
||||
base::make_unique_q<Ui::IconButton>(_topBar, st));
|
||||
button->addClickHandler([show, self] {
|
||||
show->show(
|
||||
Box(Ui::FillPeerQrBox, self, std::nullopt, nullptr));
|
||||
});
|
||||
}
|
||||
}
|
||||
} else if (section.type() == Section::Type::Downloads) {
|
||||
auto &manager = Core::App().downloadManager();
|
||||
rpl::merge(
|
||||
|
|
|
@ -80,24 +80,6 @@ struct AttachWebViewBot {
|
|||
bool requestWriteAccess : 1 = false;
|
||||
};
|
||||
|
||||
struct AddToMenuOpenAttach {
|
||||
QString startCommand;
|
||||
PeerTypes chooseTypes;
|
||||
};
|
||||
struct AddToMenuOpenMenu {
|
||||
QString startCommand;
|
||||
};
|
||||
struct AddToMenuOpenApp {
|
||||
not_null<BotAppData*> app;
|
||||
QString startCommand;
|
||||
};
|
||||
struct AddToMenuOpen : std::variant<
|
||||
AddToMenuOpenAttach,
|
||||
AddToMenuOpenMenu,
|
||||
AddToMenuOpenApp> {
|
||||
using variant::variant;
|
||||
};
|
||||
|
||||
struct WebViewSourceButton {
|
||||
bool simple = false;
|
||||
|
||||
|
|
|
@ -1638,6 +1638,17 @@ Link::Link(
|
|||
}
|
||||
_links.push_back(LinkEntry(url, entityText));
|
||||
}
|
||||
if (_links.empty()) {
|
||||
if (const auto media = parent->media()) {
|
||||
if (const auto webpage = media->webpage()) {
|
||||
if (!webpage->displayUrl.isEmpty()
|
||||
&& !webpage->url.isEmpty()) {
|
||||
_links.push_back(
|
||||
LinkEntry(webpage->displayUrl, webpage->url));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
while (lnk > 0 && till > from) {
|
||||
--lnk;
|
||||
auto &entity = entities.at(lnk);
|
||||
|
|
|
@ -124,8 +124,9 @@ void Paint(
|
|||
const auto gradientRotation = int(angle / 45.) * 45;
|
||||
const auto gradientRotationAdd = angle - gradientRotation;
|
||||
|
||||
const auto textAdditionalWidth = backgroundMargins.left();
|
||||
auto back = Images::GenerateGradient(
|
||||
qrRect.size(),
|
||||
qrRect.size() + QSize(textAdditionalWidth, 0),
|
||||
backgroundColors,
|
||||
gradientRotation,
|
||||
1. - (gradientRotationAdd / 45.));
|
||||
|
@ -151,7 +152,7 @@ void Paint(
|
|||
p.drawImage(qrRect, qrImage);
|
||||
if (textMaxHeight) {
|
||||
p.drawImage(
|
||||
qrRect.x(),
|
||||
qrRect.x() - textAdditionalWidth / 2,
|
||||
rect::bottom(qrRect)
|
||||
+ ((rect::bottom(roundedRect) - rect::bottom(qrRect))
|
||||
- textMaxHeight) / 2,
|
||||
|
@ -238,9 +239,9 @@ not_null<Ui::RpWidget*> PrepareQrWidget(
|
|||
aboutLabel->setText(about);
|
||||
aboutLabel->resizeToWidth(resultWidth);
|
||||
}
|
||||
const auto qrWidth = state->qrImage.width()
|
||||
/ style::DevicePixelRatio();
|
||||
const auto lines = int(state->textWidth / qrWidth) + 1;
|
||||
const auto textMaxWidth = state->backgroundMargins.left()
|
||||
+ (state->qrImage.width() / style::DevicePixelRatio());
|
||||
const auto lines = int(state->textWidth / textMaxWidth) + 1;
|
||||
state->textMaxHeight = state->textWidth ? (font->height * lines) : 0;
|
||||
const auto whiteMargins = RoundedMargins(
|
||||
state->backgroundMargins,
|
||||
|
@ -486,14 +487,13 @@ void FillPeerQrBox(
|
|||
}) | ranges::views::filter([](const Colors &colors) {
|
||||
return !colors.empty();
|
||||
}) | ranges::to_vector;
|
||||
colorsCollection.insert(
|
||||
colorsCollection.begin(),
|
||||
Colors{
|
||||
st::premiumButtonBg1->c,
|
||||
st::premiumButtonBg1->c,
|
||||
st::premiumButtonBg2->c,
|
||||
st::premiumButtonBg3->c,
|
||||
});
|
||||
Expects(!colorsCollection.empty());
|
||||
colorsCollection[0] = Colors{
|
||||
st::premiumButtonBg1->c,
|
||||
st::premiumButtonBg1->c,
|
||||
st::premiumButtonBg2->c,
|
||||
st::premiumButtonBg3->c,
|
||||
};
|
||||
// colorsCollection.push_back(Colors{
|
||||
// st::creditsBg1->c,
|
||||
// st::creditsBg2->c,
|
||||
|
@ -792,8 +792,9 @@ void FillPeerQrBox(
|
|||
Qr::Redundancy::Default),
|
||||
introQrPixel,
|
||||
qrMaxSize);
|
||||
const auto qrWidth = qrImage.width() / style::DevicePixelRatio();
|
||||
const auto lines = int(textWidth / qrWidth) + 1;
|
||||
const auto textMaxWidth = backgroundMargins.left()
|
||||
+ (qrImage.width() / style::DevicePixelRatio());
|
||||
const auto lines = int(textWidth / textMaxWidth) + 1;
|
||||
const auto textMaxHeight = textWidth ? font->height * lines : 0;
|
||||
|
||||
const auto whiteMargins = RoundedMargins(
|
||||
|
|
|
@ -159,10 +159,12 @@ void ShowCallsBox(not_null<Window::SessionController*> window) {
|
|||
showSettings,
|
||||
&st::menuIconSettings);
|
||||
if (state->callsDelegate.peerListFullRowsCount() > 0) {
|
||||
state->menu->addAction(
|
||||
tr::lng_call_box_clear_all(tr::now),
|
||||
clearAll,
|
||||
&st::menuIconDelete);
|
||||
Ui::Menu::CreateAddActionCallback(state->menu)({
|
||||
.text = tr::lng_call_box_clear_all(tr::now),
|
||||
.handler = clearAll,
|
||||
.icon = &st::menuIconDeleteAttention,
|
||||
.isAttention = true,
|
||||
});
|
||||
}
|
||||
state->menu->popup(QCursor::pos());
|
||||
return true;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
AppVersion 5005003
|
||||
AppVersion 5005004
|
||||
AppVersionStrMajor 5.5
|
||||
AppVersionStrSmall 5.5.3
|
||||
AppVersionStr 5.5.3
|
||||
AppVersionStrSmall 5.5.4
|
||||
AppVersionStr 5.5.4
|
||||
BetaChannel 0
|
||||
AlphaVersion 0
|
||||
AppVersionOriginal 5.5.3
|
||||
AppVersionOriginal 5.5.4
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
5.5.4 (12.09.24)
|
||||
|
||||
- Fix channel updates stopping after difference request failing.
|
||||
- Add QR code generation for your username in Settings.
|
||||
- Fix swipe-to-reply gestures stopping. (macOS)
|
||||
|
||||
5.5.3 (10.09.24)
|
||||
|
||||
- Fix custom emoji sending.
|
||||
|
|
Loading…
Reference in a new issue