Updated TDesktop sources to 2.5.1+56728a0

This commit is contained in:
Eric Kotato 2020-12-25 20:04:55 +03:00
commit 30dfff483b
11 changed files with 157 additions and 90 deletions

View file

@ -72,7 +72,6 @@ PRIVATE
if (LINUX) if (LINUX)
target_link_libraries(Telegram target_link_libraries(Telegram
PRIVATE PRIVATE
desktop-app::external_xcb_screensaver
desktop-app::external_xcb desktop-app::external_xcb
desktop-app::external_glib desktop-app::external_glib
) )

View file

@ -1343,37 +1343,56 @@ void PeerListContent::mousePressReleased(Qt::MouseButton button) {
} }
} }
void PeerListContent::contextMenuEvent(QContextMenuEvent *e) { void PeerListContent::showRowMenu(
not_null<PeerListRow*> row,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed) {
showRowMenu(findRowIndex(row), QCursor::pos(), std::move(destroyed));
}
bool PeerListContent::showRowMenu(
RowIndex index,
QPoint globalPos,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed) {
if (_contextMenu) { if (_contextMenu) {
_contextMenu->deleteLater(); _contextMenu->setDestroyedCallback(nullptr);
_contextMenu = nullptr; _contextMenu = nullptr;
} }
setContexted(Selected()); setContexted(Selected());
if (e->reason() == QContextMenuEvent::Mouse) {
handleMouseMove(e->globalPos());
}
setContexted(_selected);
if (_pressButton != Qt::LeftButton) { if (_pressButton != Qt::LeftButton) {
mousePressReleased(_pressButton); mousePressReleased(_pressButton);
} }
if (const auto row = getRow(_contexted.index)) { const auto row = getRow(index);
if (!row) {
return false;
}
_contextMenu = _controller->rowContextMenu(this, row); _contextMenu = _controller->rowContextMenu(this, row);
if (_contextMenu) { const auto raw = _contextMenu.get();
_contextMenu->setDestroyedCallback(crl::guard( if (!raw) {
return false;
}
setContexted({ index, false });
raw->setDestroyedCallback(crl::guard(
this, this,
[this] { [=] {
setContexted(Selected()); setContexted(Selected());
handleMouseMove(QCursor::pos()); handleMouseMove(QCursor::pos());
})); if (destroyed) {
_contextMenu->popup(e->globalPos()); destroyed(raw);
e->accept();
} else {
setContexted(Selected());
} }
} else { }));
setContexted(Selected()); raw->popup(globalPos);
return true;
}
void PeerListContent::contextMenuEvent(QContextMenuEvent *e) {
if (e->reason() == QContextMenuEvent::Mouse) {
handleMouseMove(e->globalPos());
}
if (showRowMenu(_selected.index, e->globalPos())) {
e->accept();
} }
} }

View file

@ -313,6 +313,9 @@ public:
peerListFinishSelectedRowsBunch(); peerListFinishSelectedRowsBunch();
} }
virtual void peerListShowRowMenu(
not_null<PeerListRow*> row,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed) = 0;
virtual int peerListSelectedRowsCount() = 0; virtual int peerListSelectedRowsCount() = 0;
virtual std::unique_ptr<PeerListState> peerListSaveState() const = 0; virtual std::unique_ptr<PeerListState> peerListSaveState() const = 0;
virtual void peerListRestoreState( virtual void peerListRestoreState(
@ -570,6 +573,10 @@ public:
std::unique_ptr<PeerListState> saveState() const; std::unique_ptr<PeerListState> saveState() const;
void restoreState(std::unique_ptr<PeerListState> state); void restoreState(std::unique_ptr<PeerListState> state);
void showRowMenu(
not_null<PeerListRow*> row,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed);
auto scrollToRequests() const { auto scrollToRequests() const {
return _scrollToRequests.events(); return _scrollToRequests.events();
} }
@ -653,6 +660,11 @@ private:
RowIndex findRowIndex(not_null<PeerListRow*> row, RowIndex hint = RowIndex()); RowIndex findRowIndex(not_null<PeerListRow*> row, RowIndex hint = RowIndex());
QRect getActiveActionRect(not_null<PeerListRow*> row, RowIndex index) const; QRect getActiveActionRect(not_null<PeerListRow*> row, RowIndex index) const;
bool showRowMenu(
RowIndex index,
QPoint globalPos,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed = nullptr);
crl::time paintRow(Painter &p, crl::time ms, RowIndex index); crl::time paintRow(Painter &p, crl::time ms, RowIndex index);
void addRowEntry(not_null<PeerListRow*> row); void addRowEntry(not_null<PeerListRow*> row);
@ -836,6 +848,11 @@ public:
std::unique_ptr<PeerListState> state) override { std::unique_ptr<PeerListState> state) override {
_content->restoreState(std::move(state)); _content->restoreState(std::move(state));
} }
void peerListShowRowMenu(
not_null<PeerListRow*> row,
Fn<void(not_null<Ui::PopupMenu*>)> destroyed) override {
_content->showRowMenu(row, std::move(destroyed));
}
protected: protected:
not_null<PeerListContent*> content() const { not_null<PeerListContent*> content() const {

View file

@ -368,10 +368,10 @@ void Call::setupOutgoingVideo() {
_errors.fire({ ErrorType::NoCamera }); _errors.fire({ ErrorType::NoCamera });
_videoOutgoing->setState(Webrtc::VideoState::Inactive); _videoOutgoing->setState(Webrtc::VideoState::Inactive);
} else if (_state.current() != State::Established } else if (_state.current() != State::Established
&& state != started && (state != Webrtc::VideoState::Inactive)
&& !_videoCapture) { && (started == Webrtc::VideoState::Inactive)) {
_errors.fire({ ErrorType::NotStartedCall }); _errors.fire({ ErrorType::NotStartedCall });
_videoOutgoing->setState(started); _videoOutgoing->setState(Webrtc::VideoState::Inactive);
} else if (state != Webrtc::VideoState::Inactive } else if (state != Webrtc::VideoState::Inactive
&& _instance && _instance
&& !_instance->supportsVideo()) { && !_instance->supportsVideo()) {

View file

@ -243,6 +243,9 @@ private:
void prepareRows(not_null<Data::GroupCall*> real); void prepareRows(not_null<Data::GroupCall*> real);
//void repaintByTimer(); //void repaintByTimer();
[[nodiscard]] base::unique_qptr<Ui::PopupMenu> createRowContextMenu(
QWidget *parent,
not_null<PeerListRow*> row);
void setupListChangeViewers(not_null<GroupCall*> call); void setupListChangeViewers(not_null<GroupCall*> call);
void subscribeToChanges(not_null<Data::GroupCall*> real); void subscribeToChanges(not_null<Data::GroupCall*> real);
void updateRow( void updateRow(
@ -638,10 +641,7 @@ MembersController::MembersController(
} }
MembersController::~MembersController() { MembersController::~MembersController() {
if (_menu) { base::take(_menu);
_menu->setDestroyedCallback(nullptr);
_menu = nullptr;
}
} }
void MembersController::setupListChangeViewers(not_null<GroupCall*> call) { void MembersController::setupListChangeViewers(not_null<GroupCall*> call) {
@ -1002,15 +1002,8 @@ auto MembersController::kickMemberRequests() const
} }
void MembersController::rowClicked(not_null<PeerListRow*> row) { void MembersController::rowClicked(not_null<PeerListRow*> row) {
if (_menu) { delegate()->peerListShowRowMenu(row, [=](not_null<Ui::PopupMenu*> menu) {
_menu->setDestroyedCallback(nullptr); if (!_menu || _menu.get() != menu) {
_menu->deleteLater();
_menu = nullptr;
}
_menu = rowContextMenu(_menuParent, row);
if (const auto raw = _menu.get()) {
raw->setDestroyedCallback([=] {
if (_menu && _menu.get() != raw) {
return; return;
} }
auto saved = base::take(_menu); auto saved = base::take(_menu);
@ -1023,8 +1016,6 @@ void MembersController::rowClicked(not_null<PeerListRow*> row) {
} }
_menu = std::move(saved); _menu = std::move(saved);
}); });
raw->popup(QCursor::pos());
}
} }
void MembersController::rowActionClicked( void MembersController::rowActionClicked(
@ -1035,6 +1026,23 @@ void MembersController::rowActionClicked(
base::unique_qptr<Ui::PopupMenu> MembersController::rowContextMenu( base::unique_qptr<Ui::PopupMenu> MembersController::rowContextMenu(
QWidget *parent, QWidget *parent,
not_null<PeerListRow*> row) { not_null<PeerListRow*> row) {
auto result = createRowContextMenu(parent, row);
if (result) {
// First clear _menu value, so that we don't check row positions yet.
base::take(_menu);
// Here unique_qptr is used like a shared pointer, where
// not the last destroyed pointer destroys the object, but the first.
_menu = base::unique_qptr<Ui::PopupMenu>(result.get());
}
return result;
}
base::unique_qptr<Ui::PopupMenu> MembersController::createRowContextMenu(
QWidget *parent,
not_null<PeerListRow*> row) {
Expects(row->peer()->isUser()); Expects(row->peer()->isUser());
if (row->peer()->isSelf()) { if (row->peer()->isSelf()) {
@ -1125,7 +1133,9 @@ base::unique_qptr<Ui::PopupMenu> MembersController::rowContextMenu(
_kickMemberRequests.fire_copy(user); _kickMemberRequests.fire_copy(user);
}); });
if (_peer->canManageGroupCall() && (!admin || mute)) { if ((muteState != Row::State::Invited)
&& _peer->canManageGroupCall()
&& (!admin || mute)) {
result->addAction( result->addAction(
(mute (mute
? tr::lng_group_call_context_mute(tr::now) ? tr::lng_group_call_context_mute(tr::now)

View file

@ -710,7 +710,8 @@ void TopBar::updateControlsGeometry() {
left += _durationLabel->width() + st::callBarSkip; left += _durationLabel->width() + st::callBarSkip;
} }
if (!_userpics.isNull()) { if (!_userpics.isNull()) {
left += _userpics.width() / _userpics.devicePixelRatio(); left += (_userpics.width() / _userpics.devicePixelRatio())
+ st::callBarSkip;
} }
if (_signalBars) { if (_signalBars) {
_signalBars->moveToLeft(left, (height() - _signalBars->height()) / 2); _signalBars->moveToLeft(left, (height() - _signalBars->height()) / 2);

View file

@ -243,6 +243,10 @@ QIcon TrayIconGen(int counter, bool muted) {
48, 48,
}; };
static const auto dprSize = [](const QImage &image) {
return image.size() / image.devicePixelRatio();
};
for (const auto iconSize : iconSizes) { for (const auto iconSize : iconSizes) {
auto &currentImageBack = TrayIconImageBack[iconSize]; auto &currentImageBack = TrayIconImageBack[iconSize];
const auto desiredSize = QSize(iconSize, iconSize); const auto desiredSize = QSize(iconSize, iconSize);
@ -261,11 +265,17 @@ QIcon TrayIconGen(int counter, bool muted) {
systemIcon = QIcon::fromTheme(iconName); systemIcon = QIcon::fromTheme(iconName);
} }
if (systemIcon.actualSize(desiredSize) == desiredSize) { // We can't use QIcon::actualSize here
// since it works incorrectly with svg icon themes
currentImageBack = systemIcon currentImageBack = systemIcon
.pixmap(desiredSize) .pixmap(desiredSize)
.toImage(); .toImage();
} else {
const auto firstAttemptSize = dprSize(currentImageBack);
// if current icon theme is not a svg one, Qt can return
// a pixmap that less in size even if there are a bigger one
if (firstAttemptSize.width() < desiredSize.width()) {
const auto availableSizes = systemIcon.availableSizes(); const auto availableSizes = systemIcon.availableSizes();
const auto biggestSize = ranges::max_element( const auto biggestSize = ranges::max_element(
@ -273,18 +283,17 @@ QIcon TrayIconGen(int counter, bool muted) {
std::less<>(), std::less<>(),
&QSize::width); &QSize::width);
if ((*biggestSize).width() > firstAttemptSize.width()) {
currentImageBack = systemIcon currentImageBack = systemIcon
.pixmap(*biggestSize) .pixmap(*biggestSize)
.toImage(); .toImage();
} }
}
} else { } else {
currentImageBack = Core::App().logo(); currentImageBack = Core::App().logo();
} }
const auto currentImageBackSize = currentImageBack.size() if (dprSize(currentImageBack) != desiredSize) {
/ currentImageBack.devicePixelRatio();
if (currentImageBackSize != desiredSize) {
currentImageBack = currentImageBack.scaled( currentImageBack = currentImageBack.scaled(
desiredSize * currentImageBack.devicePixelRatio(), desiredSize * currentImageBack.devicePixelRatio(),
Qt::IgnoreAspectRatio, Qt::IgnoreAspectRatio,
@ -372,17 +381,33 @@ std::unique_ptr<QTemporaryFile> TrayIconFile(
static const auto templateName = AppRuntimeDirectory() static const auto templateName = AppRuntimeDirectory()
+ kTrayIconFilename.utf16(); + kTrayIconFilename.utf16();
static const auto dprSize = [](const QPixmap &pixmap) {
return pixmap.size() / pixmap.devicePixelRatio();
};
static const auto desiredSize = QSize(22, 22); static const auto desiredSize = QSize(22, 22);
static const auto scalePixmap = [=](const QPixmap &pixmap) {
if (dprSize(pixmap) != desiredSize) {
return pixmap.scaled(
desiredSize * pixmap.devicePixelRatio(),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation);
} else {
return pixmap;
}
};
auto ret = std::make_unique<QTemporaryFile>( auto ret = std::make_unique<QTemporaryFile>(
templateName, templateName,
parent); parent);
ret->open(); ret->open();
if (icon.actualSize(desiredSize) == desiredSize) { const auto firstAttempt = icon.pixmap(desiredSize);
icon.pixmap(desiredSize).save(ret.get()); const auto firstAttemptSize = dprSize(firstAttempt);
} else {
if (firstAttemptSize.width() < desiredSize.width()) {
const auto availableSizes = icon.availableSizes(); const auto availableSizes = icon.availableSizes();
const auto biggestSize = ranges::max_element( const auto biggestSize = ranges::max_element(
@ -390,14 +415,13 @@ std::unique_ptr<QTemporaryFile> TrayIconFile(
std::less<>(), std::less<>(),
&QSize::width); &QSize::width);
const auto iconPixmap = icon.pixmap(*biggestSize); if ((*biggestSize).width() > firstAttemptSize.width()) {
scalePixmap(icon.pixmap(*biggestSize)).save(ret.get());
iconPixmap } else {
.scaled( scalePixmap(firstAttempt).save(ret.get());
desiredSize * iconPixmap.devicePixelRatio(), }
Qt::IgnoreAspectRatio, } else {
Qt::SmoothTransformation) scalePixmap(firstAttempt).save(ret.get());
.save(ret.get());
} }
ret->close(); ret->close();

View file

@ -42,7 +42,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION #endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
#include <xcb/xcb.h> #include <xcb/xcb.h>
#include <xcb/screensaver.h>
#include <glib.h> #include <glib.h>

View file

@ -38,7 +38,9 @@ bool HasExtensionFrom(const QString &file, const QStringList &extensions) {
bool ValidPhotoForAlbum( bool ValidPhotoForAlbum(
const PreparedFileInformation::Image &image, const PreparedFileInformation::Image &image,
const QString &mime) { const QString &mime) {
if (image.animated || Core::IsMimeSticker(mime)) { if (image.animated
|| Core::IsMimeSticker(mime)
|| (mime == u"application/pdf"_q)) {
return false; return false;
} }
const auto width = image.data.width(); const auto width = image.data.width();

View file

@ -45,6 +45,11 @@ MessageBar::MessageBar(not_null<QWidget*> parent, const style::MessageBar &st)
: _st(st) : _st(st)
, _widget(parent) { , _widget(parent) {
setup(); setup();
style::PaletteChanged(
) | rpl::start_with_next([=] {
_topBarGradient = _bottomBarGradient = QPixmap();
}, _widget.lifetime());
} }
void MessageBar::setup() { void MessageBar::setup() {

View file

@ -20,6 +20,8 @@ apps:
environment: environment:
# Tell glib to use portals on file associations handling. # Tell glib to use portals on file associations handling.
GTK_USE_PORTAL: 1 GTK_USE_PORTAL: 1
# Use sandboxed ibus api
IBUS_USE_PORTAL: 1
plugs: plugs:
- alsa - alsa
- audio-playback - audio-playback
@ -75,7 +77,6 @@ parts:
- liblzma-dev - liblzma-dev
- libopus-dev - libopus-dev
- libpulse-dev - libpulse-dev
- libqt5svg5-dev
- libqt5waylandclient5-dev - libqt5waylandclient5-dev
- libssl-dev - libssl-dev
- libxcb1-dev - libxcb1-dev
@ -87,11 +88,11 @@ parts:
- qt5-image-formats-plugins - qt5-image-formats-plugins
- qtwayland5 - qtwayland5
- libasound2 - libasound2
- libglib2.0-0
- libgtk-3-0 - libgtk-3-0
- liblzma5 - liblzma5
- libopus0 - libopus0
- libpulse0 - libpulse0
- libqt5svg5
- libqt5waylandclient5 - libqt5waylandclient5
- libssl1.1 - libssl1.1
- libxcb1 - libxcb1
@ -165,16 +166,6 @@ parts:
after: after:
- mozjpeg - mozjpeg
# Qt checks that ibus-daemon binary is present, otherwise doesn't work
ibus:
plugin: nil
stage-packages:
- ibus
stage:
- -./usr/lib/$SNAPCRAFT_ARCH_TRIPLET/libjpeg.so.8.2.2
after:
- mozjpeg
ffmpeg: ffmpeg:
plugin: nil plugin: nil
build-packages: build-packages: