Updated TDesktop sources to 2.8.11+b2c762e
This commit is contained in:
commit
2a88c662d8
63 changed files with 141 additions and 721 deletions
5
.github/workflows/linux.yml
vendored
5
.github/workflows/linux.yml
vendored
|
|
@ -101,7 +101,10 @@ jobs:
|
||||||
if [ -n "${{ matrix.defines }}" ]; then
|
if [ -n "${{ matrix.defines }}" ]; then
|
||||||
DEFINE="-D ${{ matrix.defines }}=ON"
|
DEFINE="-D ${{ matrix.defines }}=ON"
|
||||||
if [ "${{ matrix.defines }}" == "DESKTOP_APP_DISABLE_DBUS_INTEGRATION" ]; then
|
if [ "${{ matrix.defines }}" == "DESKTOP_APP_DISABLE_DBUS_INTEGRATION" ]; then
|
||||||
DEFINE="$DEFINE -D DESKTOP_APP_DISABLE_GTK_INTEGRATION=ON"
|
DEFINE="$DEFINE -D DESKTOP_APP_DISABLE_GTK_INTEGRATION=ON -D DESKTOP_APP_DISABLE_WEBKITGTK=ON"
|
||||||
|
fi
|
||||||
|
if [ "${{ matrix.defines }}" == "DESKTOP_APP_DISABLE_GTK_INTEGRATION" ]; then
|
||||||
|
DEFINE="$DEFINE -D DESKTOP_APP_DISABLE_WEBKITGTK=ON"
|
||||||
fi
|
fi
|
||||||
echo Define from matrix: $DEFINE
|
echo Define from matrix: $DEFINE
|
||||||
echo "ARTIFACT_NAME=Kotatogram_${{ matrix.defines }}" >> $GITHUB_ENV
|
echo "ARTIFACT_NAME=Kotatogram_${{ matrix.defines }}" >> $GITHUB_ENV
|
||||||
|
|
|
||||||
|
|
@ -113,25 +113,16 @@ if (LINUX)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT DESKTOP_APP_DISABLE_GTK_INTEGRATION)
|
if (NOT DESKTOP_APP_DISABLE_GTK_INTEGRATION)
|
||||||
target_link_libraries(Telegram PRIVATE rt)
|
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
|
|
||||||
if (DESKTOP_APP_USE_PACKAGED AND NOT DESKTOP_APP_USE_PACKAGED_LAZY)
|
pkg_check_modules(GTK REQUIRED gtk+-3.0)
|
||||||
pkg_check_modules(GTK3 REQUIRED IMPORTED_TARGET gtk+-3.0)
|
target_include_directories(Telegram SYSTEM PRIVATE ${GTK_INCLUDE_DIRS})
|
||||||
target_link_libraries(Telegram PRIVATE PkgConfig::GTK3)
|
|
||||||
|
|
||||||
if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION)
|
if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION)
|
||||||
pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11)
|
target_link_libraries(Telegram PRIVATE X11)
|
||||||
target_link_libraries(Telegram PRIVATE PkgConfig::X11)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
pkg_check_modules(GTK REQUIRED gtk+-3.0)
|
|
||||||
target_include_directories(Telegram PRIVATE ${GTK_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if (NOT DESKTOP_APP_DISABLE_X11_INTEGRATION)
|
|
||||||
target_link_libraries(Telegram PRIVATE X11)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(Telegram PRIVATE rt)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
@ -909,16 +900,12 @@ PRIVATE
|
||||||
platform/linux/linux_desktop_environment.h
|
platform/linux/linux_desktop_environment.h
|
||||||
platform/linux/linux_gdk_helper.cpp
|
platform/linux/linux_gdk_helper.cpp
|
||||||
platform/linux/linux_gdk_helper.h
|
platform/linux/linux_gdk_helper.h
|
||||||
platform/linux/linux_gsd_media_keys.cpp
|
|
||||||
platform/linux/linux_gsd_media_keys.h
|
|
||||||
platform/linux/linux_gtk_integration_dummy.cpp
|
platform/linux/linux_gtk_integration_dummy.cpp
|
||||||
platform/linux/linux_gtk_integration_p.h
|
platform/linux/linux_gtk_integration_p.h
|
||||||
platform/linux/linux_gtk_integration.cpp
|
platform/linux/linux_gtk_integration.cpp
|
||||||
platform/linux/linux_gtk_integration.h
|
platform/linux/linux_gtk_integration.h
|
||||||
platform/linux/linux_gtk_open_with_dialog.cpp
|
platform/linux/linux_gtk_open_with_dialog.cpp
|
||||||
platform/linux/linux_gtk_open_with_dialog.h
|
platform/linux/linux_gtk_open_with_dialog.h
|
||||||
platform/linux/linux_notification_service_watcher.cpp
|
|
||||||
platform/linux/linux_notification_service_watcher.h
|
|
||||||
platform/linux/linux_wayland_integration_dummy.cpp
|
platform/linux/linux_wayland_integration_dummy.cpp
|
||||||
platform/linux/linux_wayland_integration.cpp
|
platform/linux/linux_wayland_integration.cpp
|
||||||
platform/linux/linux_wayland_integration.h
|
platform/linux/linux_wayland_integration.h
|
||||||
|
|
@ -1214,12 +1201,6 @@ endif()
|
||||||
|
|
||||||
if (DESKTOP_APP_DISABLE_DBUS_INTEGRATION)
|
if (DESKTOP_APP_DISABLE_DBUS_INTEGRATION)
|
||||||
remove_target_sources(Telegram ${src_loc}
|
remove_target_sources(Telegram ${src_loc}
|
||||||
platform/linux/linux_gsd_media_keys.cpp
|
|
||||||
platform/linux/linux_gsd_media_keys.h
|
|
||||||
platform/linux/linux_mpris_support.cpp
|
|
||||||
platform/linux/linux_mpris_support.h
|
|
||||||
platform/linux/linux_notification_service_watcher.cpp
|
|
||||||
platform/linux/linux_notification_service_watcher.h
|
|
||||||
platform/linux/linux_xdp_file_dialog.cpp
|
platform/linux/linux_xdp_file_dialog.cpp
|
||||||
platform/linux/linux_xdp_file_dialog.h
|
platform/linux/linux_xdp_file_dialog.h
|
||||||
platform/linux/linux_xdp_open_with_dialog.cpp
|
platform/linux/linux_xdp_open_with_dialog.cpp
|
||||||
|
|
|
||||||
|
|
@ -115,12 +115,12 @@ private:
|
||||||
const Rows::Row &rowBySelection(Selection selected) const;
|
const Rows::Row &rowBySelection(Selection selected) const;
|
||||||
std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
||||||
Selection selected);
|
Selection selected);
|
||||||
const std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
[[maybe_unused]] const std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
||||||
Selection selected) const;
|
Selection selected) const;
|
||||||
std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
||||||
not_null<Row*> row,
|
not_null<Row*> row,
|
||||||
Selection selected);
|
Selection selected);
|
||||||
const std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
[[maybe_unused]] const std::unique_ptr<Ui::RippleAnimation> &rippleBySelection(
|
||||||
not_null<const Row*> row,
|
not_null<const Row*> row,
|
||||||
Selection selected) const;
|
Selection selected) const;
|
||||||
void addRipple(Selection selected, QPoint position);
|
void addRipple(Selection selected, QPoint position);
|
||||||
|
|
|
||||||
|
|
@ -129,9 +129,6 @@ private:
|
||||||
const QString &text,
|
const QString &text,
|
||||||
rpl::producer<QString> about);
|
rpl::producer<QString> about);
|
||||||
|
|
||||||
bool inviteLinkShown();
|
|
||||||
QString inviteLinkText();
|
|
||||||
|
|
||||||
not_null<PeerData*> _peer;
|
not_null<PeerData*> _peer;
|
||||||
bool _linkOnly = false;
|
bool _linkOnly = false;
|
||||||
|
|
||||||
|
|
@ -308,15 +305,6 @@ QString Controller::getUsernameInput() {
|
||||||
return _controls.usernameInput->getLastText().trimmed();
|
return _controls.usernameInput->getLastText().trimmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Controller::inviteLinkText() {
|
|
||||||
if (const auto channel = _peer->asChannel()) {
|
|
||||||
return channel->inviteLink();
|
|
||||||
} else if (const auto chat = _peer->asChat()) {
|
|
||||||
return chat->inviteLink();
|
|
||||||
}
|
|
||||||
return QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
object_ptr<Ui::RpWidget> Controller::createUsernameEdit() {
|
object_ptr<Ui::RpWidget> Controller::createUsernameEdit() {
|
||||||
Expects(_wrap != nullptr);
|
Expects(_wrap != nullptr);
|
||||||
|
|
||||||
|
|
@ -583,11 +571,6 @@ object_ptr<Ui::RpWidget> Controller::createInviteLinkBlock() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Controller::inviteLinkShown() {
|
|
||||||
return !_controls.privacy
|
|
||||||
|| (_controls.privacy->value() == Privacy::NoUsername);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
EditPeerTypeBox::EditPeerTypeBox(
|
EditPeerTypeBox::EditPeerTypeBox(
|
||||||
|
|
|
||||||
|
|
@ -830,7 +830,6 @@ void StickerSetBox::Inner::visibleTopBottomUpdated(
|
||||||
|
|
||||||
void StickerSetBox::Inner::setupLottie(int index) {
|
void StickerSetBox::Inner::setupLottie(int index) {
|
||||||
auto &element = _elements[index];
|
auto &element = _elements[index];
|
||||||
const auto document = element.document;
|
|
||||||
|
|
||||||
element.animated = ChatHelpers::LottieAnimationFromDocument(
|
element.animated = ChatHelpers::LottieAnimationFromDocument(
|
||||||
getLottiePlayer(),
|
getLottiePlayer(),
|
||||||
|
|
|
||||||
|
|
@ -116,9 +116,7 @@ void Panel::replaceCall(not_null<Call*> call) {
|
||||||
void Panel::initWindow() {
|
void Panel::initWindow() {
|
||||||
window()->setAttribute(Qt::WA_OpaquePaintEvent);
|
window()->setAttribute(Qt::WA_OpaquePaintEvent);
|
||||||
window()->setAttribute(Qt::WA_NoSystemBackground);
|
window()->setAttribute(Qt::WA_NoSystemBackground);
|
||||||
window()->setWindowIcon(
|
window()->setTitle(_user->name);
|
||||||
QIcon(QPixmap::fromImage(Image::Empty()->original(), Qt::ColorOnly)));
|
|
||||||
window()->setTitle(u" "_q);
|
|
||||||
window()->setTitleStyle(st::callTitle);
|
window()->setTitleStyle(st::callTitle);
|
||||||
|
|
||||||
window()->events(
|
window()->events(
|
||||||
|
|
|
||||||
|
|
@ -335,7 +335,6 @@ void ChooseJoinAsProcess::start(
|
||||||
}, _request->lifetime);
|
}, _request->lifetime);
|
||||||
|
|
||||||
const auto finish = [=](JoinInfo info) {
|
const auto finish = [=](JoinInfo info) {
|
||||||
const auto peer = _request->peer;
|
|
||||||
const auto done = std::move(_request->done);
|
const auto done = std::move(_request->done);
|
||||||
const auto box = _request->box;
|
const auto box = _request->box;
|
||||||
_request = nullptr;
|
_request = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -1171,21 +1171,6 @@ int Members::Controller::rowPaintStatusIcon(
|
||||||
: state.raisedHand
|
: state.raisedHand
|
||||||
? st::groupCallMemberInactiveStatus->c
|
? st::groupCallMemberInactiveStatus->c
|
||||||
: iconColor;
|
: iconColor;
|
||||||
const auto color = (state.speaking == 1. && !state.mutedByMe)
|
|
||||||
? st::groupCallMemberActiveStatus->c
|
|
||||||
: (state.speaking == 0.
|
|
||||||
? (state.active == 1.
|
|
||||||
? st::groupCallMemberNotJoinedStatus->c
|
|
||||||
: (state.active == 0.
|
|
||||||
? (state.muted == 1.
|
|
||||||
? (state.raisedHand
|
|
||||||
? st::groupCallMemberInactiveStatus->c
|
|
||||||
: st::groupCallMemberNotJoinedStatus->c)
|
|
||||||
: (state.muted == 0.
|
|
||||||
? st::groupCallMemberNotJoinedStatus->c
|
|
||||||
: other))
|
|
||||||
: other))
|
|
||||||
: other);
|
|
||||||
if (camera) {
|
if (camera) {
|
||||||
st::groupCallNarrowCameraIcon.paint(p, x, y, outerWidth, other);
|
st::groupCallNarrowCameraIcon.paint(p, x, y, outerWidth, other);
|
||||||
x += st::groupCallNarrowCameraIcon.width();
|
x += st::groupCallNarrowCameraIcon.width();
|
||||||
|
|
|
||||||
|
|
@ -289,8 +289,6 @@ void Panel::chooseSourceStop() {
|
||||||
void Panel::initWindow() {
|
void Panel::initWindow() {
|
||||||
window()->setAttribute(Qt::WA_OpaquePaintEvent);
|
window()->setAttribute(Qt::WA_OpaquePaintEvent);
|
||||||
window()->setAttribute(Qt::WA_NoSystemBackground);
|
window()->setAttribute(Qt::WA_NoSystemBackground);
|
||||||
window()->setWindowIcon(
|
|
||||||
QIcon(QPixmap::fromImage(Image::Empty()->original(), Qt::ColorOnly)));
|
|
||||||
window()->setTitleStyle(st::groupCallTitle);
|
window()->setTitleStyle(st::groupCallTitle);
|
||||||
|
|
||||||
subscribeToPeerChanges();
|
subscribeToPeerChanges();
|
||||||
|
|
|
||||||
|
|
@ -1033,7 +1033,6 @@ void GifsListWidget::updateSelected() {
|
||||||
int row = -1, col = -1, sel = -1;
|
int row = -1, col = -1, sel = -1;
|
||||||
ClickHandlerPtr lnk;
|
ClickHandlerPtr lnk;
|
||||||
ClickHandlerHost *lnkhost = nullptr;
|
ClickHandlerHost *lnkhost = nullptr;
|
||||||
HistoryView::CursorState cursor = HistoryView::CursorState::None;
|
|
||||||
if (sy >= 0) {
|
if (sy >= 0) {
|
||||||
row = 0;
|
row = 0;
|
||||||
for (int rows = _rows.size(); row < rows; ++row) {
|
for (int rows = _rows.size(); row < rows; ++row) {
|
||||||
|
|
@ -1062,7 +1061,6 @@ void GifsListWidget::updateSelected() {
|
||||||
QPoint(sx, sy),
|
QPoint(sx, sy),
|
||||||
HistoryView::StateRequest());
|
HistoryView::StateRequest());
|
||||||
lnk = result.link;
|
lnk = result.link;
|
||||||
cursor = result.cursor;
|
|
||||||
lnkhost = inlineItems[col];
|
lnkhost = inlineItems[col];
|
||||||
} else {
|
} else {
|
||||||
row = col = -1;
|
row = col = -1;
|
||||||
|
|
|
||||||
|
|
@ -1884,7 +1884,6 @@ void StickersListWidget::ensureLottiePlayer(Set &set) {
|
||||||
|
|
||||||
void StickersListWidget::setupLottie(Set &set, int section, int index) {
|
void StickersListWidget::setupLottie(Set &set, int section, int index) {
|
||||||
auto &sticker = set.stickers[index];
|
auto &sticker = set.stickers[index];
|
||||||
const auto document = sticker.document;
|
|
||||||
ensureLottiePlayer(set);
|
ensureLottiePlayer(set);
|
||||||
|
|
||||||
// Document should be loaded already for the animation to be set up.
|
// Document should be loaded already for the animation to be set up.
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "core/ui_integration.h"
|
#include "core/ui_integration.h"
|
||||||
#include "chat_helpers/emoji_keywords.h"
|
#include "chat_helpers/emoji_keywords.h"
|
||||||
#include "chat_helpers/stickers_emoji_image_loader.h"
|
#include "chat_helpers/stickers_emoji_image_loader.h"
|
||||||
|
#include "base/platform/base_platform_url_scheme.h"
|
||||||
#include "base/platform/base_platform_last_input.h"
|
#include "base/platform/base_platform_last_input.h"
|
||||||
#include "base/platform/base_platform_info.h"
|
#include "base/platform/base_platform_info.h"
|
||||||
#include "platform/platform_specific.h"
|
#include "platform/platform_specific.h"
|
||||||
|
|
@ -222,6 +223,7 @@ void Application::run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Local::oldSettingsVersion() < AppVersion) {
|
if (Local::oldSettingsVersion() < AppVersion) {
|
||||||
|
RegisterUrlScheme();
|
||||||
psNewVersion();
|
psNewVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1155,6 +1157,19 @@ void Application::startShortcuts() {
|
||||||
}, _lifetime);
|
}, _lifetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::RegisterUrlScheme() {
|
||||||
|
base::Platform::RegisterUrlScheme(base::Platform::UrlSchemeDescriptor{
|
||||||
|
.executable = cExeDir() + cExeName(),
|
||||||
|
.arguments = qsl("-workdir \"%1\"").arg(cWorkingDir()),
|
||||||
|
.protocol = qsl("tg"),
|
||||||
|
.protocolName = qsl("Telegram Link"),
|
||||||
|
.shortAppName = qsl("tdesktop"),
|
||||||
|
.longAppName = QCoreApplication::applicationName(),
|
||||||
|
.displayAppName = AppName.utf16(),
|
||||||
|
.displayAppDescription = AppName.utf16(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
bool IsAppLaunched() {
|
bool IsAppLaunched() {
|
||||||
return (Application::Instance != nullptr);
|
return (Application::Instance != nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -293,6 +293,8 @@ public:
|
||||||
void setScreenIsLocked(bool locked);
|
void setScreenIsLocked(bool locked);
|
||||||
bool screenIsLocked() const;
|
bool screenIsLocked() const;
|
||||||
|
|
||||||
|
static void RegisterUrlScheme();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool eventFilter(QObject *object, QEvent *event) override;
|
bool eventFilter(QObject *object, QEvent *event) override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -598,7 +598,6 @@ bool HandleEvent(not_null<QShortcutEvent*> event) {
|
||||||
|
|
||||||
void ToggleMediaShortcuts(bool toggled) {
|
void ToggleMediaShortcuts(bool toggled) {
|
||||||
Data.toggleMedia(toggled);
|
Data.toggleMedia(toggled);
|
||||||
Platform::SetWatchingMediaKeys(toggled);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToggleSupportShortcuts(bool toggled) {
|
void ToggleSupportShortcuts(bool toggled) {
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ enum class Command {
|
||||||
JumpToDate,
|
JumpToDate,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr auto kShowFolder = {
|
[[maybe_unused]] constexpr auto kShowFolder = {
|
||||||
Command::ShowAllChats,
|
Command::ShowAllChats,
|
||||||
Command::ShowFolder1,
|
Command::ShowFolder1,
|
||||||
Command::ShowFolder2,
|
Command::ShowFolder2,
|
||||||
|
|
|
||||||
|
|
@ -98,25 +98,27 @@ QString FileExtension(const QString &filepath) {
|
||||||
return QString(last.base(), last - reversed.begin());
|
return QString(last.base(), last - reversed.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
// bool IsValidMediaFile(const QString &filepath) {
|
#if 0
|
||||||
// static const auto kExtensions = [] {
|
bool IsValidMediaFile(const QString &filepath) {
|
||||||
// const auto list = qsl("\
|
static const auto kExtensions = [] {
|
||||||
// 16svx 2sf 3g2 3gp 8svx aac aaf aif aifc aiff amr amv ape asf ast au aup \
|
const auto list = qsl("\
|
||||||
// avchd avi brstm bwf cam cdda cust dat divx drc dsh dsf dts dtshd dtsma \
|
16svx 2sf 3g2 3gp 8svx aac aaf aif aifc aiff amr amv ape asf ast au aup \
|
||||||
// dvr-ms dwd evo f4a f4b f4p f4v fla flac flr flv gif gifv gsf gsm gym iff \
|
avchd avi brstm bwf cam cdda cust dat divx drc dsh dsf dts dtshd dtsma \
|
||||||
// ifo it jam la ly m1v m2p m2ts m2v m4a m4p m4v mcf mid mk3d mka mks mkv mng \
|
dvr-ms dwd evo f4a f4b f4p f4v fla flac flr flv gif gifv gsf gsm gym iff \
|
||||||
// mov mp1 mp2 mp3 mp4 minipsf mod mpc mpe mpeg mpg mpv mscz mt2 mus mxf mxl \
|
ifo it jam la ly m1v m2p m2ts m2v m4a m4p m4v mcf mid mk3d mka mks mkv mng \
|
||||||
// niff nsf nsv off ofr ofs ogg ogv opus ots pac ps psf psf2 psflib ptb qsf \
|
mov mp1 mp2 mp3 mp4 minipsf mod mpc mpe mpeg mpg mpv mscz mt2 mus mxf mxl \
|
||||||
// qt ra raw rka rm rmj rmvb roq s3m shn sib sid smi smp sol spc spx ssf svi \
|
niff nsf nsv off ofr ofs ogg ogv opus ots pac ps psf psf2 psflib ptb qsf \
|
||||||
// swa swf tak ts tta txm usf vgm vob voc vox vqf wav webm wma wmv wrap wtv \
|
qt ra raw rka rm rmj rmvb roq s3m shn sib sid smi smp sol spc spx ssf svi \
|
||||||
// wv xm xml ym yuv").split(' ');
|
swa swf tak ts tta txm usf vgm vob voc vox vqf wav webm wma wmv wrap wtv \
|
||||||
// return base::flat_set<QString>(list.begin(), list.end());
|
wv xm xml ym yuv").split(' ');
|
||||||
// }();
|
return base::flat_set<QString>(list.begin(), list.end());
|
||||||
|
}();
|
||||||
|
|
||||||
// return ranges::binary_search(
|
return ranges::binary_search(
|
||||||
// kExtensions,
|
kExtensions,
|
||||||
// FileExtension(filepath).toLower());
|
FileExtension(filepath).toLower());
|
||||||
// }
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool IsExecutableName(const QString &filepath) {
|
bool IsExecutableName(const QString &filepath) {
|
||||||
static const auto kExtensions = [] {
|
static const auto kExtensions = [] {
|
||||||
|
|
|
||||||
|
|
@ -1279,14 +1279,12 @@ bool InnerWidget::pinnedShiftAnimationCallback(crl::time now) {
|
||||||
now += st::stickersRowDuration;
|
now += st::stickersRowDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto wasAnimating = false;
|
|
||||||
auto animating = false;
|
auto animating = false;
|
||||||
auto updateMin = -1;
|
auto updateMin = -1;
|
||||||
auto updateMax = 0;
|
auto updateMax = 0;
|
||||||
for (auto i = 0, l = static_cast<int>(_pinnedRows.size()); i != l; ++i) {
|
for (auto i = 0, l = static_cast<int>(_pinnedRows.size()); i != l; ++i) {
|
||||||
auto start = _pinnedRows[i].animStartTime;
|
auto start = _pinnedRows[i].animStartTime;
|
||||||
if (start) {
|
if (start) {
|
||||||
wasAnimating = true;
|
|
||||||
if (updateMin < 0) updateMin = i;
|
if (updateMin < 0) updateMin = i;
|
||||||
updateMax = i;
|
updateMax = i;
|
||||||
if (start + st::stickersRowDuration > now && now >= start) {
|
if (start + st::stickersRowDuration > now && now >= start) {
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ public:
|
||||||
return _check->checked();
|
return _check->checked();
|
||||||
}
|
}
|
||||||
rpl::producer<bool> checkedChanges() const;
|
rpl::producer<bool> checkedChanges() const;
|
||||||
rpl::producer<bool> checkedValue() const;
|
|
||||||
|
|
||||||
enum class NotifyAboutChange {
|
enum class NotifyAboutChange {
|
||||||
Notify,
|
Notify,
|
||||||
|
|
@ -42,8 +41,6 @@ public:
|
||||||
bool checked,
|
bool checked,
|
||||||
NotifyAboutChange notify = NotifyAboutChange::Notify);
|
NotifyAboutChange notify = NotifyAboutChange::Notify);
|
||||||
|
|
||||||
void finishAnimating();
|
|
||||||
|
|
||||||
QMargins getMargins() const override {
|
QMargins getMargins() const override {
|
||||||
return _st.margin;
|
return _st.margin;
|
||||||
}
|
}
|
||||||
|
|
@ -90,10 +87,6 @@ rpl::producer<bool> UserCheckbox::checkedChanges() const {
|
||||||
return _checkedChanges.events();
|
return _checkedChanges.events();
|
||||||
}
|
}
|
||||||
|
|
||||||
rpl::producer<bool> UserCheckbox::checkedValue() const {
|
|
||||||
return _checkedChanges.events_starting_with(checked());
|
|
||||||
}
|
|
||||||
|
|
||||||
void UserCheckbox::setChecked(bool checked, NotifyAboutChange notify) {
|
void UserCheckbox::setChecked(bool checked, NotifyAboutChange notify) {
|
||||||
if (_check->checked() != checked) {
|
if (_check->checked() != checked) {
|
||||||
_check->setChecked(checked, anim::type::normal);
|
_check->setChecked(checked, anim::type::normal);
|
||||||
|
|
@ -133,10 +126,6 @@ void UserCheckbox::paintEvent(QPaintEvent *e) {
|
||||||
p.drawTextLeft(statusLeft, statusTop, width(), _statusText);
|
p.drawTextLeft(statusLeft, statusTop, width(), _statusText);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UserCheckbox::finishAnimating() {
|
|
||||||
_check->finishAnimating();
|
|
||||||
}
|
|
||||||
|
|
||||||
int UserCheckbox::resizeGetHeight(int newWidth) {
|
int UserCheckbox::resizeGetHeight(int newWidth) {
|
||||||
return st::contactsPhotoSize;
|
return st::contactsPhotoSize;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1688,7 +1688,7 @@ void InnerWidget::updateSelected() {
|
||||||
dragState = view->textState(itemPoint, request);
|
dragState = view->textState(itemPoint, request);
|
||||||
lnkhost = view;
|
lnkhost = view;
|
||||||
if (!dragState.link && itemPoint.x() >= st::historyPhotoLeft && itemPoint.x() < st::historyPhotoLeft + st::msgPhotoSize) {
|
if (!dragState.link && itemPoint.x() >= st::historyPhotoLeft && itemPoint.x() < st::historyPhotoLeft + st::msgPhotoSize) {
|
||||||
if (auto message = item->toHistoryMessage()) {
|
if (item->toHistoryMessage()) {
|
||||||
if (view->hasFromPhoto()) {
|
if (view->hasFromPhoto()) {
|
||||||
enumerateUserpics([&](not_null<Element*> view, int userpicTop) {
|
enumerateUserpics([&](not_null<Element*> view, int userpicTop) {
|
||||||
// stop enumeration if the userpic is below our point
|
// stop enumeration if the userpic is below our point
|
||||||
|
|
|
||||||
|
|
@ -2829,7 +2829,7 @@ void HistoryInner::mouseActionUpdate() {
|
||||||
_dragStateItem = session().data().message(dragState.itemId);
|
_dragStateItem = session().data().message(dragState.itemId);
|
||||||
lnkhost = view;
|
lnkhost = view;
|
||||||
if (!dragState.link && m.x() >= st::historyPhotoLeft && m.x() < st::historyPhotoLeft + st::msgPhotoSize) {
|
if (!dragState.link && m.x() >= st::historyPhotoLeft && m.x() < st::historyPhotoLeft + st::msgPhotoSize) {
|
||||||
if (auto msg = item->toHistoryMessage()) {
|
if (item->toHistoryMessage()) {
|
||||||
if (view->hasFromPhoto()) {
|
if (view->hasFromPhoto()) {
|
||||||
enumerateUserpics([&](not_null<Element*> view, int userpicTop) -> bool {
|
enumerateUserpics([&](not_null<Element*> view, int userpicTop) -> bool {
|
||||||
// stop enumeration if the userpic is below our point
|
// stop enumeration if the userpic is below our point
|
||||||
|
|
|
||||||
|
|
@ -89,12 +89,11 @@ void Call::draw(Painter &p, const QRect &r, TextSelection selection, crl::time m
|
||||||
|
|
||||||
accumulate_min(paintw, maxWidth());
|
accumulate_min(paintw, maxWidth());
|
||||||
|
|
||||||
auto nameleft = 0, nametop = 0, nameright = 0, statustop = 0;
|
auto nameleft = 0, nametop = 0, statustop = 0;
|
||||||
auto topMinus = isBubbleTop() ? 0 : st::msgFileTopMinus;
|
auto topMinus = isBubbleTop() ? 0 : st::msgFileTopMinus;
|
||||||
|
|
||||||
nameleft = st::historyCallLeft;
|
nameleft = st::historyCallLeft;
|
||||||
nametop = st::historyCallTop - topMinus;
|
nametop = st::historyCallTop - topMinus;
|
||||||
nameright = st::msgFileLayout.padding.left();
|
|
||||||
statustop = st::historyCallStatusTop - topMinus;
|
statustop = st::historyCallStatusTop - topMinus;
|
||||||
|
|
||||||
p.setFont(st::semiboldFont);
|
p.setFont(st::semiboldFont);
|
||||||
|
|
|
||||||
|
|
@ -126,9 +126,9 @@ void InnerWidget::createTypeButtons() {
|
||||||
addMediaButton(Type::MusicFile, st::infoIconMediaAudio);
|
addMediaButton(Type::MusicFile, st::infoIconMediaAudio);
|
||||||
addMediaButton(Type::Link, st::infoIconMediaLink);
|
addMediaButton(Type::Link, st::infoIconMediaLink);
|
||||||
addMediaButton(Type::RoundVoiceFile, st::infoIconMediaVoice);
|
addMediaButton(Type::RoundVoiceFile, st::infoIconMediaVoice);
|
||||||
if (auto user = _controller->key().peer()->asUser()) {
|
// if (auto user = _controller->key().peer()->asUser()) {
|
||||||
// addCommonGroupsButton(user, st::infoIconMediaGroup);
|
// addCommonGroupsButton(user, st::infoIconMediaGroup);
|
||||||
}
|
// }
|
||||||
|
|
||||||
content->add(object_ptr<Ui::FixedHeightWidget>(
|
content->add(object_ptr<Ui::FixedHeightWidget>(
|
||||||
content,
|
content,
|
||||||
|
|
|
||||||
|
|
@ -616,7 +616,6 @@ ActionsFiller::ActionsFiller(
|
||||||
|
|
||||||
void ActionsFiller::addInviteToGroupAction(
|
void ActionsFiller::addInviteToGroupAction(
|
||||||
not_null<UserData*> user) {
|
not_null<UserData*> user) {
|
||||||
const auto controller = _controller;
|
|
||||||
AddActionButton(
|
AddActionButton(
|
||||||
_wrap,
|
_wrap,
|
||||||
tr::lng_profile_invite_to_group(),
|
tr::lng_profile_invite_to_group(),
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,7 @@ ClickHandlerPtr ItemBase::getResultPreviewHandler() const {
|
||||||
_result->_content_url,
|
_result->_content_url,
|
||||||
false);
|
false);
|
||||||
} else if (const auto document = _result->_document
|
} else if (const auto document = _result->_document
|
||||||
&& _result->_document->createMediaView()->canBePlayed()) {
|
; document->createMediaView()->canBePlayed()) {
|
||||||
return std::make_shared<OpenFileClickHandler>();
|
return std::make_shared<OpenFileClickHandler>();
|
||||||
} else if (_result->_photo) {
|
} else if (_result->_photo) {
|
||||||
return std::make_shared<OpenFileClickHandler>();
|
return std::make_shared<OpenFileClickHandler>();
|
||||||
|
|
|
||||||
|
|
@ -677,7 +677,6 @@ void Inner::updateSelected() {
|
||||||
int row = -1, col = -1, sel = -1;
|
int row = -1, col = -1, sel = -1;
|
||||||
ClickHandlerPtr lnk;
|
ClickHandlerPtr lnk;
|
||||||
ClickHandlerHost *lnkhost = nullptr;
|
ClickHandlerHost *lnkhost = nullptr;
|
||||||
HistoryView::CursorState cursor = HistoryView::CursorState::None;
|
|
||||||
if (sy >= 0) {
|
if (sy >= 0) {
|
||||||
row = 0;
|
row = 0;
|
||||||
for (int rows = _rows.size(); row < rows; ++row) {
|
for (int rows = _rows.size(); row < rows; ++row) {
|
||||||
|
|
@ -706,7 +705,6 @@ void Inner::updateSelected() {
|
||||||
QPoint(sx, sy),
|
QPoint(sx, sy),
|
||||||
HistoryView::StateRequest());
|
HistoryView::StateRequest());
|
||||||
lnk = result.link;
|
lnk = result.link;
|
||||||
cursor = result.cursor;
|
|
||||||
lnkhost = inlineItems[col];
|
lnkhost = inlineItems[col];
|
||||||
} else {
|
} else {
|
||||||
row = col = -1;
|
row = col = -1;
|
||||||
|
|
|
||||||
|
|
@ -478,12 +478,11 @@ void Widget::handleSongUpdate(const TrackState &state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::updateTimeText(const TrackState &state) {
|
void Widget::updateTimeText(const TrackState &state) {
|
||||||
qint64 position = 0, length = 0, display = 0;
|
qint64 display = 0;
|
||||||
const auto frequency = state.frequency;
|
const auto frequency = state.frequency;
|
||||||
const auto document = state.id.audio();
|
const auto document = state.id.audio();
|
||||||
if (!IsStoppedOrStopping(state.state)) {
|
if (!IsStoppedOrStopping(state.state)) {
|
||||||
display = position = state.position;
|
display = state.position;
|
||||||
length = state.length;
|
|
||||||
} else if (state.length) {
|
} else if (state.length) {
|
||||||
display = state.length;
|
display = state.length;
|
||||||
} else if (const auto song = document->song()) {
|
} else if (const auto song = document->song()) {
|
||||||
|
|
|
||||||
|
|
@ -2439,7 +2439,7 @@ void OverlayWidget::displayDocument(
|
||||||
_docIconRect = QRect((width() - st::mediaviewFileIconSize) / 2, (height() - st::mediaviewFileIconSize) / 2, st::mediaviewFileIconSize, st::mediaviewFileIconSize);
|
_docIconRect = QRect((width() - st::mediaviewFileIconSize) / 2, (height() - st::mediaviewFileIconSize) / 2, st::mediaviewFileIconSize, st::mediaviewFileIconSize);
|
||||||
int32 colorIndex = documentColorIndex(_document, _docExt);
|
int32 colorIndex = documentColorIndex(_document, _docExt);
|
||||||
_docIconColor = documentColor(colorIndex);
|
_docIconColor = documentColor(colorIndex);
|
||||||
const style::icon *(thumbs[]) = { &st::mediaviewFileBlue, &st::mediaviewFileGreen, &st::mediaviewFileRed, &st::mediaviewFileYellow };
|
const style::icon *thumbs[] = { &st::mediaviewFileBlue, &st::mediaviewFileGreen, &st::mediaviewFileRed, &st::mediaviewFileYellow };
|
||||||
_docIcon = thumbs[colorIndex];
|
_docIcon = thumbs[colorIndex];
|
||||||
|
|
||||||
int32 extmaxw = (st::mediaviewFileIconSize - st::mediaviewFileExtPadding * 2);
|
int32 extmaxw = (st::mediaviewFileIconSize - st::mediaviewFileExtPadding * 2);
|
||||||
|
|
@ -3433,7 +3433,7 @@ void OverlayWidget::paintThemePreviewContent(
|
||||||
width(),
|
width(),
|
||||||
st::themePreviewMargin.top());
|
st::themePreviewMargin.top());
|
||||||
}
|
}
|
||||||
if (const auto fillTitleRect = (titleRect.y() < 0)) {
|
if (titleRect.y() < 0) {
|
||||||
titleRect.moveTop(0);
|
titleRect.moveTop(0);
|
||||||
fillOverlay(titleRect);
|
fillOverlay(titleRect);
|
||||||
}
|
}
|
||||||
|
|
@ -3461,8 +3461,7 @@ void OverlayWidget::paintThemePreviewContent(
|
||||||
outer.y() + outer.height() - st::themePreviewMargin.bottom(),
|
outer.y() + outer.height() - st::themePreviewMargin.bottom(),
|
||||||
outer.width(),
|
outer.width(),
|
||||||
st::themePreviewMargin.bottom());
|
st::themePreviewMargin.bottom());
|
||||||
if (const auto fillButtonsRect
|
if (buttonsRect.y() + buttonsRect.height() > height()) {
|
||||||
= (buttonsRect.y() + buttonsRect.height() > height())) {
|
|
||||||
buttonsRect.moveTop(height() - buttonsRect.height());
|
buttonsRect.moveTop(height() - buttonsRect.height());
|
||||||
fillOverlay(buttonsRect);
|
fillOverlay(buttonsRect);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,6 @@ DcKeyBindState DcKeyBinder::handleResponse(const mtpBuffer &response) {
|
||||||
auto from = response.begin();
|
auto from = response.begin();
|
||||||
const auto end = from + response.size();
|
const auto end = from + response.size();
|
||||||
auto error = MTPRpcError();
|
auto error = MTPRpcError();
|
||||||
auto result = MTPBool();
|
|
||||||
if (response[0] == mtpc_boolTrue) {
|
if (response[0] == mtpc_boolTrue) {
|
||||||
return DcKeyBindState::Success;
|
return DcKeyBindState::Success;
|
||||||
} else if (response[0] == mtpc_rpc_error && error.read(from, end)) {
|
} else if (response[0] == mtpc_rpc_error && error.read(from, end)) {
|
||||||
|
|
|
||||||
|
|
@ -314,10 +314,10 @@ auto ConcurrentSender::SpecificRequestBuilder<Request>::done(
|
||||||
Handler,
|
Handler,
|
||||||
mtpRequestId,
|
mtpRequestId,
|
||||||
Result>;
|
Result>;
|
||||||
constexpr auto takesResponse = rpl::details::is_callable_plain_v<
|
[[maybe_unused]] constexpr auto takesResponse = rpl::details::is_callable_plain_v<
|
||||||
Handler,
|
Handler,
|
||||||
Result>;
|
Result>;
|
||||||
constexpr auto takesNone = rpl::details::is_callable_plain_v<Handler>;
|
[[maybe_unused]] constexpr auto takesNone = rpl::details::is_callable_plain_v<Handler>;
|
||||||
|
|
||||||
if constexpr (takesFull) {
|
if constexpr (takesFull) {
|
||||||
setDoneHandler<Result>(std::forward<Handler>(handler));
|
setDoneHandler<Result>(std::forward<Handler>(handler));
|
||||||
|
|
@ -348,10 +348,10 @@ auto ConcurrentSender::SpecificRequestBuilder<Request>::fail(
|
||||||
Handler,
|
Handler,
|
||||||
mtpRequestId,
|
mtpRequestId,
|
||||||
Error>;
|
Error>;
|
||||||
constexpr auto takesError = rpl::details::is_callable_plain_v<
|
[[maybe_unused]] constexpr auto takesError = rpl::details::is_callable_plain_v<
|
||||||
Handler,
|
Handler,
|
||||||
Error>;
|
Error>;
|
||||||
constexpr auto takesNone = rpl::details::is_callable_plain_v<Handler>;
|
[[maybe_unused]] constexpr auto takesNone = rpl::details::is_callable_plain_v<Handler>;
|
||||||
|
|
||||||
if constexpr (takesFull) {
|
if constexpr (takesFull) {
|
||||||
setFailHandler(std::forward<Handler>(handler));
|
setFailHandler(std::forward<Handler>(handler));
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ const BuiltInDc kBuiltInDcsIPv6Test[] = {
|
||||||
{ 3, "2001:0b28:f23d:f003:0000:0000:0000:000e", 443 }
|
{ 3, "2001:0b28:f23d:f003:0000:0000:0000:000e", 443 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *(kTestPublicRSAKeys[]) = { "\
|
const char *kTestPublicRSAKeys[] = { "\
|
||||||
-----BEGIN RSA PUBLIC KEY-----\n\
|
-----BEGIN RSA PUBLIC KEY-----\n\
|
||||||
MIIBCgKCAQEAyMEdY1aR+sCR3ZSJrtztKTKqigvO/vBfqACJLZtS7QMgCGXJ6XIR\n\
|
MIIBCgKCAQEAyMEdY1aR+sCR3ZSJrtztKTKqigvO/vBfqACJLZtS7QMgCGXJ6XIR\n\
|
||||||
yy7mx66W0/sOFa7/1mAZtEoIokDP3ShoqF4fVNb6XeqgQfaUHd8wJpDWHcR2OFwv\n\
|
yy7mx66W0/sOFa7/1mAZtEoIokDP3ShoqF4fVNb6XeqgQfaUHd8wJpDWHcR2OFwv\n\
|
||||||
|
|
@ -68,7 +68,7 @@ aHWfYmlEGepfaYR8Q0YqvvhYtMte3ITnuSJs171+GDqpdKcSwHnd6FudwGO4pcCO\n\
|
||||||
j4WcDuXc2CTHgH8gFTNhp/Y8/SpDOhvn9QIDAQAB\n\
|
j4WcDuXc2CTHgH8gFTNhp/Y8/SpDOhvn9QIDAQAB\n\
|
||||||
-----END RSA PUBLIC KEY-----" };
|
-----END RSA PUBLIC KEY-----" };
|
||||||
|
|
||||||
const char *(kPublicRSAKeys[]) = { "\
|
const char *kPublicRSAKeys[] = { "\
|
||||||
-----BEGIN RSA PUBLIC KEY-----\n\
|
-----BEGIN RSA PUBLIC KEY-----\n\
|
||||||
MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n\
|
MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n\
|
||||||
5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n\
|
5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n\
|
||||||
|
|
|
||||||
|
|
@ -1,157 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of Telegram Desktop,
|
|
||||||
the official desktop application for the Telegram messaging service.
|
|
||||||
|
|
||||||
For license and copyright information please follow this link:
|
|
||||||
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
||||||
*/
|
|
||||||
#include "platform/linux/linux_gsd_media_keys.h"
|
|
||||||
|
|
||||||
#include "core/sandbox.h"
|
|
||||||
#include "media/player/media_player_instance.h"
|
|
||||||
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
|
||||||
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
|
||||||
|
|
||||||
#include <glibmm.h>
|
|
||||||
#include <giomm.h>
|
|
||||||
|
|
||||||
namespace Platform {
|
|
||||||
namespace internal {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
constexpr auto kService = "org.gnome.SettingsDaemon.MediaKeys"_cs;
|
|
||||||
constexpr auto kOldService = "org.gnome.SettingsDaemon"_cs;
|
|
||||||
constexpr auto kMATEService = "org.mate.SettingsDaemon"_cs;
|
|
||||||
constexpr auto kObjectPath = "/org/gnome/SettingsDaemon/MediaKeys"_cs;
|
|
||||||
constexpr auto kMATEObjectPath = "/org/mate/SettingsDaemon/MediaKeys"_cs;
|
|
||||||
constexpr auto kInterface = kService;
|
|
||||||
constexpr auto kMATEInterface = "org.mate.SettingsDaemon.MediaKeys"_cs;
|
|
||||||
|
|
||||||
void KeyPressed(
|
|
||||||
const Glib::RefPtr<Gio::DBus::Connection> &connection,
|
|
||||||
const Glib::ustring &sender_name,
|
|
||||||
const Glib::ustring &object_path,
|
|
||||||
const Glib::ustring &interface_name,
|
|
||||||
const Glib::ustring &signal_name,
|
|
||||||
const Glib::VariantContainerBase ¶meters) {
|
|
||||||
try {
|
|
||||||
auto parametersCopy = parameters;
|
|
||||||
|
|
||||||
const auto app = base::Platform::GlibVariantCast<Glib::ustring>(
|
|
||||||
parametersCopy.get_child(0));
|
|
||||||
|
|
||||||
const auto key = base::Platform::GlibVariantCast<Glib::ustring>(
|
|
||||||
parametersCopy.get_child(1));
|
|
||||||
|
|
||||||
if (app != QCoreApplication::applicationName().toStdString()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Core::Sandbox::Instance().customEnterFromEventLoop([&] {
|
|
||||||
if (key == "Play") {
|
|
||||||
Media::Player::instance()->playPause();
|
|
||||||
} else if (key == "Stop") {
|
|
||||||
Media::Player::instance()->stop();
|
|
||||||
} else if (key == "Next") {
|
|
||||||
Media::Player::instance()->next();
|
|
||||||
} else if (key == "Previous") {
|
|
||||||
Media::Player::instance()->previous();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
class GSDMediaKeys::Private {
|
|
||||||
public:
|
|
||||||
Glib::RefPtr<Gio::DBus::Connection> dbusConnection;
|
|
||||||
|
|
||||||
Glib::ustring service;
|
|
||||||
Glib::ustring objectPath;
|
|
||||||
Glib::ustring interface;
|
|
||||||
uint signalId = 0;
|
|
||||||
bool grabbed = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
GSDMediaKeys::GSDMediaKeys()
|
|
||||||
: _private(std::make_unique<Private>()) {
|
|
||||||
try {
|
|
||||||
_private->dbusConnection = Gio::DBus::Connection::get_sync(
|
|
||||||
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
||||||
|
|
||||||
if (base::Platform::DBus::NameHasOwner(
|
|
||||||
_private->dbusConnection,
|
|
||||||
std::string(kService))) {
|
|
||||||
_private->service = std::string(kService);
|
|
||||||
_private->objectPath = std::string(kObjectPath);
|
|
||||||
_private->interface = std::string(kInterface);
|
|
||||||
} else if (base::Platform::DBus::NameHasOwner(
|
|
||||||
_private->dbusConnection,
|
|
||||||
std::string(kOldService))) {
|
|
||||||
_private->service = std::string(kOldService);
|
|
||||||
_private->objectPath = std::string(kObjectPath);
|
|
||||||
_private->interface = std::string(kInterface);
|
|
||||||
} else if (base::Platform::DBus::NameHasOwner(
|
|
||||||
_private->dbusConnection,
|
|
||||||
std::string(kMATEService))) {
|
|
||||||
_private->service = std::string(kMATEService);
|
|
||||||
_private->objectPath = std::string(kMATEObjectPath);
|
|
||||||
_private->interface = std::string(kMATEInterface);
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_private->dbusConnection->call_sync(
|
|
||||||
_private->objectPath,
|
|
||||||
_private->interface,
|
|
||||||
"GrabMediaPlayerKeys",
|
|
||||||
base::Platform::MakeGlibVariant(std::tuple{
|
|
||||||
Glib::ustring(
|
|
||||||
QCoreApplication::applicationName()
|
|
||||||
.toStdString()),
|
|
||||||
uint(0),
|
|
||||||
}),
|
|
||||||
_private->service);
|
|
||||||
|
|
||||||
_private->grabbed = true;
|
|
||||||
|
|
||||||
_private->signalId = _private->dbusConnection->signal_subscribe(
|
|
||||||
sigc::ptr_fun(KeyPressed),
|
|
||||||
_private->service,
|
|
||||||
_private->interface,
|
|
||||||
"MediaPlayerKeyPressed",
|
|
||||||
_private->objectPath);
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GSDMediaKeys::~GSDMediaKeys() {
|
|
||||||
if (_private->dbusConnection) {
|
|
||||||
if (_private->signalId != 0) {
|
|
||||||
_private->dbusConnection->signal_unsubscribe(_private->signalId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_private->grabbed) {
|
|
||||||
try {
|
|
||||||
_private->dbusConnection->call_sync(
|
|
||||||
_private->objectPath,
|
|
||||||
_private->interface,
|
|
||||||
"ReleaseMediaPlayerKeys",
|
|
||||||
base::Platform::MakeGlibVariant(std::tuple{
|
|
||||||
Glib::ustring(
|
|
||||||
QCoreApplication::applicationName()
|
|
||||||
.toStdString())
|
|
||||||
}),
|
|
||||||
_private->service);
|
|
||||||
|
|
||||||
_private->grabbed = false;
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace Platform
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of Telegram Desktop,
|
|
||||||
the official desktop application for the Telegram messaging service.
|
|
||||||
|
|
||||||
For license and copyright information please follow this link:
|
|
||||||
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace Platform {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
class GSDMediaKeys {
|
|
||||||
public:
|
|
||||||
GSDMediaKeys();
|
|
||||||
|
|
||||||
GSDMediaKeys(const GSDMediaKeys &other) = delete;
|
|
||||||
GSDMediaKeys &operator=(const GSDMediaKeys &other) = delete;
|
|
||||||
GSDMediaKeys(GSDMediaKeys &&other) = delete;
|
|
||||||
GSDMediaKeys &operator=(GSDMediaKeys &&other) = delete;
|
|
||||||
|
|
||||||
~GSDMediaKeys();
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
const std::unique_ptr<Private> _private;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace Platform
|
|
||||||
|
|
@ -16,7 +16,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
||||||
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
||||||
#include "base/platform/base_platform_info.h"
|
#include "base/platform/base_platform_info.h"
|
||||||
#include "webview/platform/linux/webview_linux_webkit2gtk.h"
|
|
||||||
#include "platform/linux/linux_gtk_integration_p.h"
|
#include "platform/linux/linux_gtk_integration_p.h"
|
||||||
#include "platform/linux/linux_gdk_helper.h"
|
#include "platform/linux/linux_gdk_helper.h"
|
||||||
#include "platform/linux/linux_gtk_open_with_dialog.h"
|
#include "platform/linux/linux_gtk_open_with_dialog.h"
|
||||||
|
|
@ -24,6 +23,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "window/window_controller.h"
|
#include "window/window_controller.h"
|
||||||
#include "core/application.h"
|
#include "core/application.h"
|
||||||
|
|
||||||
|
#ifndef DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
|
#include "webview/platform/linux/webview_linux_webkit2gtk.h"
|
||||||
|
#endif // !DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
|
|
||||||
#include <QtCore/QProcess>
|
#include <QtCore/QProcess>
|
||||||
|
|
||||||
#include <private/qguiapplication_p.h>
|
#include <private/qguiapplication_p.h>
|
||||||
|
|
@ -173,6 +176,7 @@ void GtkIntegration::Private::handleMethodCall(
|
||||||
"Access denied.");
|
"Access denied.");
|
||||||
|
|
||||||
invocation->return_error(error);
|
invocation->return_error(error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
@ -587,9 +591,11 @@ int GtkIntegration::Exec(
|
||||||
if (const auto integration = BaseGtkIntegration::Instance()) {
|
if (const auto integration = BaseGtkIntegration::Instance()) {
|
||||||
return integration->exec(parentDBusName);
|
return integration->exec(parentDBusName);
|
||||||
}
|
}
|
||||||
|
#ifndef DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
} else if (type == Type::Webview) {
|
} else if (type == Type::Webview) {
|
||||||
Webview::WebKit2Gtk::SetServiceName(serviceName.toStdString());
|
Webview::WebKit2Gtk::SetServiceName(serviceName.toStdString());
|
||||||
return Webview::WebKit2Gtk::Exec(parentDBusName.toStdString());
|
return Webview::WebKit2Gtk::Exec(parentDBusName.toStdString());
|
||||||
|
#endif // !DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
} else if (type == Type::TDesktop) {
|
} else if (type == Type::TDesktop) {
|
||||||
ServiceName = serviceName.toStdString();
|
ServiceName = serviceName.toStdString();
|
||||||
if (const auto integration = Instance()) {
|
if (const auto integration = Instance()) {
|
||||||
|
|
@ -614,8 +620,10 @@ void GtkIntegration::Start(Type type) {
|
||||||
if (type == Type::Base) {
|
if (type == Type::Base) {
|
||||||
BaseGtkIntegration::SetServiceName(kBaseService.utf16().arg(h));
|
BaseGtkIntegration::SetServiceName(kBaseService.utf16().arg(h));
|
||||||
} else if (type == Type::Webview) {
|
} else if (type == Type::Webview) {
|
||||||
|
#ifndef DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
Webview::WebKit2Gtk::SetServiceName(
|
Webview::WebKit2Gtk::SetServiceName(
|
||||||
kWebviewService.utf16().arg(h).arg("%1").toStdString());
|
kWebviewService.utf16().arg(h).arg("%1").toStdString());
|
||||||
|
#endif // !DESKTOP_APP_DISABLE_WEBKITGTK
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of Telegram Desktop,
|
|
||||||
the official desktop application for the Telegram messaging service.
|
|
||||||
|
|
||||||
For license and copyright information please follow this link:
|
|
||||||
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
||||||
*/
|
|
||||||
#include "platform/linux/linux_notification_service_watcher.h"
|
|
||||||
|
|
||||||
#include "core/application.h"
|
|
||||||
#include "main/main_domain.h"
|
|
||||||
#include "window/notifications_manager.h"
|
|
||||||
#include "base/platform/linux/base_linux_glibmm_helper.h"
|
|
||||||
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
|
||||||
|
|
||||||
#include <glibmm.h>
|
|
||||||
#include <giomm.h>
|
|
||||||
|
|
||||||
namespace Platform {
|
|
||||||
namespace internal {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
constexpr auto kService = "org.freedesktop.Notifications"_cs;
|
|
||||||
|
|
||||||
auto Activatable() {
|
|
||||||
static const auto Result = []() -> std::optional<bool> {
|
|
||||||
try {
|
|
||||||
const auto connection = Gio::DBus::Connection::get_sync(
|
|
||||||
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
||||||
|
|
||||||
return ranges::contains(
|
|
||||||
base::Platform::DBus::ListActivatableNames(connection),
|
|
||||||
Glib::ustring(std::string(kService)));
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::nullopt;
|
|
||||||
}();
|
|
||||||
|
|
||||||
return Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
class NotificationServiceWatcher::Private {
|
|
||||||
public:
|
|
||||||
Glib::RefPtr<Gio::DBus::Connection> dbusConnection;
|
|
||||||
uint signalId = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
NotificationServiceWatcher::NotificationServiceWatcher()
|
|
||||||
: _private(std::make_unique<Private>()) {
|
|
||||||
try {
|
|
||||||
_private->dbusConnection = Gio::DBus::Connection::get_sync(
|
|
||||||
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
||||||
|
|
||||||
_private->signalId = base::Platform::DBus::RegisterServiceWatcher(
|
|
||||||
_private->dbusConnection,
|
|
||||||
std::string(kService),
|
|
||||||
[](
|
|
||||||
const Glib::ustring &service,
|
|
||||||
const Glib::ustring &oldOwner,
|
|
||||||
const Glib::ustring &newOwner) {
|
|
||||||
if (!Core::App().domain().started()
|
|
||||||
|| (Activatable().value_or(true) && newOwner.empty())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
crl::on_main([] {
|
|
||||||
Core::App().notifications().createManager();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} catch (...) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NotificationServiceWatcher::~NotificationServiceWatcher() {
|
|
||||||
if (_private->dbusConnection && _private->signalId != 0) {
|
|
||||||
_private->dbusConnection->signal_unsubscribe(_private->signalId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace Platform
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
This file is part of Telegram Desktop,
|
|
||||||
the official desktop application for the Telegram messaging service.
|
|
||||||
|
|
||||||
For license and copyright information please follow this link:
|
|
||||||
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
namespace Platform {
|
|
||||||
namespace internal {
|
|
||||||
|
|
||||||
class NotificationServiceWatcher {
|
|
||||||
public:
|
|
||||||
NotificationServiceWatcher();
|
|
||||||
~NotificationServiceWatcher();
|
|
||||||
|
|
||||||
private:
|
|
||||||
class Private;
|
|
||||||
const std::unique_ptr<Private> _private;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace internal
|
|
||||||
} // namespace Platform
|
|
||||||
|
|
@ -176,20 +176,14 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool defaultNameFilterDisables() const;
|
|
||||||
QUrl directory() const;
|
QUrl directory() const;
|
||||||
void setDirectory(const QUrl &directory);
|
void setDirectory(const QUrl &directory);
|
||||||
void selectFile(const QUrl &filename);
|
void selectFile(const QUrl &filename);
|
||||||
QList<QUrl> selectedFiles() const;
|
QList<QUrl> selectedFiles() const;
|
||||||
void setFilter();
|
|
||||||
void selectNameFilter(const QString &filter);
|
|
||||||
QString selectedNameFilter() const;
|
|
||||||
void selectMimeTypeFilter(const QString &filter);
|
|
||||||
QString selectedMimeTypeFilter() const;
|
|
||||||
|
|
||||||
int exec() override;
|
int exec() override;
|
||||||
|
|
||||||
bool failedToOpen() {
|
bool failedToOpen() const {
|
||||||
return _failedToOpen;
|
return _failedToOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -517,10 +511,6 @@ void XDPFileDialog::openPortal() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool XDPFileDialog::defaultNameFilterDisables() const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void XDPFileDialog::setDirectory(const QUrl &directory) {
|
void XDPFileDialog::setDirectory(const QUrl &directory) {
|
||||||
_directory = directory.path().toStdString();
|
_directory = directory.path().toStdString();
|
||||||
}
|
}
|
||||||
|
|
@ -544,23 +534,6 @@ QList<QUrl> XDPFileDialog::selectedFiles() const {
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
void XDPFileDialog::setFilter() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void XDPFileDialog::selectMimeTypeFilter(const QString &filter) {
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XDPFileDialog::selectedMimeTypeFilter() const {
|
|
||||||
return QString::fromStdString(_selectedMimeTypeFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XDPFileDialog::selectNameFilter(const QString &filter) {
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XDPFileDialog::selectedNameFilter() const {
|
|
||||||
return QString::fromStdString(_selectedNameFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
int XDPFileDialog::exec() {
|
int XDPFileDialog::exec() {
|
||||||
setAttribute(Qt::WA_DeleteOnClose, false);
|
setAttribute(Qt::WA_DeleteOnClose, false);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,43 @@ bool InhibitionSupported = false;
|
||||||
std::optional<ServerInformation> CurrentServerInformation;
|
std::optional<ServerInformation> CurrentServerInformation;
|
||||||
QStringList CurrentCapabilities;
|
QStringList CurrentCapabilities;
|
||||||
|
|
||||||
|
std::unique_ptr<base::Platform::DBus::ServiceWatcher> CreateServiceWatcher() {
|
||||||
|
try {
|
||||||
|
const auto connection = Gio::DBus::Connection::get_sync(
|
||||||
|
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
||||||
|
|
||||||
|
const auto activatable = [&] {
|
||||||
|
try {
|
||||||
|
return ranges::contains(
|
||||||
|
base::Platform::DBus::ListActivatableNames(connection),
|
||||||
|
Glib::ustring(std::string(kService)));
|
||||||
|
} catch (...) {
|
||||||
|
// avoid service restart loop in sandboxed environments
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}();
|
||||||
|
|
||||||
|
return std::make_unique<base::Platform::DBus::ServiceWatcher>(
|
||||||
|
connection,
|
||||||
|
std::string(kService),
|
||||||
|
[=](
|
||||||
|
const Glib::ustring &service,
|
||||||
|
const Glib::ustring &oldOwner,
|
||||||
|
const Glib::ustring &newOwner) {
|
||||||
|
if (activatable && newOwner.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
crl::on_main([] {
|
||||||
|
Core::App().notifications().createManager();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (...) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void StartServiceAsync(Fn<void()> callback) {
|
void StartServiceAsync(Fn<void()> callback) {
|
||||||
try {
|
try {
|
||||||
const auto connection = Gio::DBus::Connection::get_sync(
|
const auto connection = Gio::DBus::Connection::get_sync(
|
||||||
|
|
@ -632,13 +669,17 @@ void NotificationData::close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void NotificationData::setImage(const QString &imagePath) {
|
void NotificationData::setImage(const QString &imagePath) {
|
||||||
if (_imageKey.empty()) {
|
if (imagePath.isEmpty() || _imageKey.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto image = QImage(imagePath)
|
const auto image = QImage(imagePath)
|
||||||
.convertToFormat(QImage::Format_RGBA8888);
|
.convertToFormat(QImage::Format_RGBA8888);
|
||||||
|
|
||||||
|
if (image.isNull()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_hints[_imageKey] = MakeGlibVariant(std::tuple{
|
_hints[_imageKey] = MakeGlibVariant(std::tuple{
|
||||||
image.width(),
|
image.width(),
|
||||||
image.height(),
|
image.height(),
|
||||||
|
|
@ -712,6 +753,8 @@ bool ByDefault() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Create(Window::Notifications::System *system) {
|
void Create(Window::Notifications::System *system) {
|
||||||
|
static const auto ServiceWatcher = CreateServiceWatcher();
|
||||||
|
|
||||||
const auto managerSetter = [=] {
|
const auto managerSetter = [=] {
|
||||||
using ManagerType = Window::Notifications::ManagerType;
|
using ManagerType = Window::Notifications::ManagerType;
|
||||||
if ((Core::App().settings().nativeNotifications() && Supported())
|
if ((Core::App().settings().nativeNotifications() && Supported())
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
||||||
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
#include "base/platform/linux/base_linux_dbus_utilities.h"
|
||||||
#include "base/platform/linux/base_linux_xdp_utilities.h"
|
#include "base/platform/linux/base_linux_xdp_utilities.h"
|
||||||
#include "platform/linux/linux_notification_service_watcher.h"
|
|
||||||
#include "platform/linux/linux_xdp_file_dialog.h"
|
#include "platform/linux/linux_xdp_file_dialog.h"
|
||||||
#include "platform/linux/linux_gsd_media_keys.h"
|
|
||||||
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
||||||
|
|
||||||
#ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION
|
#ifndef DESKTOP_APP_DISABLE_X11_INTEGRATION
|
||||||
|
|
@ -44,8 +42,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include <QtGui/QWindow>
|
#include <QtGui/QWindow>
|
||||||
|
|
||||||
#include <private/qguiapplication_p.h>
|
#include <private/qguiapplication_p.h>
|
||||||
#include <glib.h>
|
|
||||||
#include <gio/gio.h>
|
|
||||||
#include <glibmm.h>
|
#include <glibmm.h>
|
||||||
#include <giomm.h>
|
#include <giomm.h>
|
||||||
#include <jemalloc/jemalloc.h>
|
#include <jemalloc/jemalloc.h>
|
||||||
|
|
@ -72,20 +68,13 @@ namespace {
|
||||||
|
|
||||||
constexpr auto kDesktopFile = ":/misc/kotatogramdesktop.desktop"_cs;
|
constexpr auto kDesktopFile = ":/misc/kotatogramdesktop.desktop"_cs;
|
||||||
constexpr auto kIconName = "kotatogram"_cs;
|
constexpr auto kIconName = "kotatogram"_cs;
|
||||||
constexpr auto kHandlerTypeName = "x-scheme-handler/tg"_cs;
|
|
||||||
constexpr auto kDarkColorLimit = 192;
|
constexpr auto kDarkColorLimit = 192;
|
||||||
|
|
||||||
constexpr auto kXDGDesktopPortalService = "org.freedesktop.portal.Desktop"_cs;
|
constexpr auto kXDGDesktopPortalService = "org.freedesktop.portal.Desktop"_cs;
|
||||||
constexpr auto kXDGDesktopPortalObjectPath = "/org/freedesktop/portal/desktop"_cs;
|
constexpr auto kXDGDesktopPortalObjectPath = "/org/freedesktop/portal/desktop"_cs;
|
||||||
constexpr auto kIBusPortalService = "org.freedesktop.portal.IBus"_cs;
|
constexpr auto kIBusPortalService = "org.freedesktop.portal.IBus"_cs;
|
||||||
|
|
||||||
constexpr auto kSnapcraftSettingsService = "io.snapcraft.Settings"_cs;
|
|
||||||
constexpr auto kSnapcraftSettingsObjectPath = "/io/snapcraft/Settings"_cs;
|
|
||||||
constexpr auto kSnapcraftSettingsInterface = kSnapcraftSettingsService;
|
|
||||||
|
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
||||||
std::unique_ptr<internal::NotificationServiceWatcher> NSWInstance;
|
|
||||||
|
|
||||||
void PortalAutostart(bool start, bool silent) {
|
void PortalAutostart(bool start, bool silent) {
|
||||||
if (cExeName().isEmpty()) {
|
if (cExeName().isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -213,67 +202,6 @@ void PortalAutostart(bool start, bool silent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SnapDefaultHandler(const QString &protocol) {
|
|
||||||
try {
|
|
||||||
const auto connection = Gio::DBus::Connection::get_sync(
|
|
||||||
Gio::DBus::BusType::BUS_TYPE_SESSION);
|
|
||||||
|
|
||||||
auto reply = connection->call_sync(
|
|
||||||
std::string(kSnapcraftSettingsObjectPath),
|
|
||||||
std::string(kSnapcraftSettingsInterface),
|
|
||||||
"GetSub",
|
|
||||||
base::Platform::MakeGlibVariant(std::tuple{
|
|
||||||
Glib::ustring("default-url-scheme-handler"),
|
|
||||||
Glib::ustring(protocol.toStdString()),
|
|
||||||
}),
|
|
||||||
std::string(kSnapcraftSettingsService));
|
|
||||||
|
|
||||||
const auto currentHandler = base::Platform::GlibVariantCast<
|
|
||||||
Glib::ustring>(reply.get_child(0));
|
|
||||||
|
|
||||||
const auto expectedHandler = qEnvironmentVariable("SNAP_NAME")
|
|
||||||
+ qsl(".desktop");
|
|
||||||
|
|
||||||
if (currentHandler == expectedHandler.toStdString()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto context = Glib::MainContext::create();
|
|
||||||
const auto loop = Glib::MainLoop::create(context);
|
|
||||||
g_main_context_push_thread_default(context->gobj());
|
|
||||||
|
|
||||||
connection->call(
|
|
||||||
std::string(kSnapcraftSettingsObjectPath),
|
|
||||||
std::string(kSnapcraftSettingsInterface),
|
|
||||||
"SetSub",
|
|
||||||
base::Platform::MakeGlibVariant(std::tuple{
|
|
||||||
Glib::ustring("default-url-scheme-handler"),
|
|
||||||
Glib::ustring(protocol.toStdString()),
|
|
||||||
Glib::ustring(expectedHandler.toStdString()),
|
|
||||||
}),
|
|
||||||
[&](const Glib::RefPtr<Gio::AsyncResult> &result) {
|
|
||||||
try {
|
|
||||||
connection->call_finish(result);
|
|
||||||
} catch (const Glib::Error &e) {
|
|
||||||
LOG(("Snap Default Handler Error: %1").arg(
|
|
||||||
QString::fromStdString(e.what())));
|
|
||||||
}
|
|
||||||
|
|
||||||
loop->quit();
|
|
||||||
},
|
|
||||||
std::string(kSnapcraftSettingsService));
|
|
||||||
|
|
||||||
QWindow window;
|
|
||||||
QGuiApplicationPrivate::showModalWindow(&window);
|
|
||||||
loop->run();
|
|
||||||
g_main_context_pop_thread_default(context->gobj());
|
|
||||||
QGuiApplicationPrivate::hideModalWindow(&window);
|
|
||||||
} catch (const Glib::Error &e) {
|
|
||||||
LOG(("Snap Default Handler Error: %1").arg(
|
|
||||||
QString::fromStdString(e.what())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsIBusPortalPresent() {
|
bool IsIBusPortalPresent() {
|
||||||
static const auto Result = [&] {
|
static const auto Result = [&] {
|
||||||
try {
|
try {
|
||||||
|
|
@ -526,22 +454,6 @@ void SetDarkMode() {
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void SetWatchingMediaKeys(bool watching) {
|
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
static std::unique_ptr<internal::GSDMediaKeys> GSDInstance;
|
|
||||||
|
|
||||||
if (watching) {
|
|
||||||
if (!GSDInstance) {
|
|
||||||
GSDInstance = std::make_unique<internal::GSDMediaKeys>();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (GSDInstance) {
|
|
||||||
GSDInstance = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetApplicationIcon(const QIcon &icon) {
|
void SetApplicationIcon(const QIcon &icon) {
|
||||||
QApplication::setWindowIcon(icon);
|
QApplication::setWindowIcon(icon);
|
||||||
}
|
}
|
||||||
|
|
@ -820,76 +732,6 @@ void InstallLauncher(bool force) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterCustomScheme(bool force) {
|
|
||||||
try {
|
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
if (InSnap()) {
|
|
||||||
SnapDefaultHandler(qsl("tg"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
|
|
||||||
if (cExeName().isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto neededCommandlineBuilder = qsl("%1 -workdir %2 --").arg(
|
|
||||||
QString(EscapeShell(QFile::encodeName(cExeDir() + cExeName()))),
|
|
||||||
QString(EscapeShell(QFile::encodeName(cWorkingDir()))));
|
|
||||||
|
|
||||||
const auto neededCommandline = qsl("%1 %u")
|
|
||||||
.arg(neededCommandlineBuilder);
|
|
||||||
|
|
||||||
const auto currentAppInfo = Gio::AppInfo::get_default_for_type(
|
|
||||||
std::string(kHandlerTypeName),
|
|
||||||
true);
|
|
||||||
|
|
||||||
if (currentAppInfo) {
|
|
||||||
const auto currentCommandline = QString::fromStdString(
|
|
||||||
currentAppInfo->get_commandline());
|
|
||||||
|
|
||||||
if (currentCommandline == neededCommandline) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto registeredAppInfoList = g_app_info_get_recommended_for_type(
|
|
||||||
kHandlerTypeName.utf8().constData());
|
|
||||||
|
|
||||||
for (auto l = registeredAppInfoList; l != nullptr; l = l->next) {
|
|
||||||
const auto currentRegisteredAppInfo = reinterpret_cast<GAppInfo*>(
|
|
||||||
l->data);
|
|
||||||
|
|
||||||
const auto currentAppInfoId = QString(
|
|
||||||
g_app_info_get_id(currentRegisteredAppInfo));
|
|
||||||
|
|
||||||
const auto currentCommandline = QString(
|
|
||||||
g_app_info_get_commandline(currentRegisteredAppInfo));
|
|
||||||
|
|
||||||
if (currentCommandline == neededCommandline
|
|
||||||
&& currentAppInfoId.startsWith(qsl("userapp-"))) {
|
|
||||||
g_app_info_delete(currentRegisteredAppInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (registeredAppInfoList) {
|
|
||||||
g_list_free_full(registeredAppInfoList, g_object_unref);
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto newAppInfo = Gio::AppInfo::create_from_commandline(
|
|
||||||
neededCommandlineBuilder.toStdString(),
|
|
||||||
std::string(AppName),
|
|
||||||
Gio::AppInfoCreateFlags::APP_INFO_CREATE_SUPPORTS_URIS);
|
|
||||||
|
|
||||||
if (newAppInfo) {
|
|
||||||
newAppInfo->set_as_default_for_type(
|
|
||||||
std::string(kHandlerTypeName));
|
|
||||||
}
|
|
||||||
} catch (const Glib::Error &e) {
|
|
||||||
LOG(("App Error: %1").arg(QString::fromStdString(e.what())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PermissionStatus GetPermissionStatus(PermissionType type) {
|
PermissionStatus GetPermissionStatus(PermissionType type) {
|
||||||
return PermissionStatus::Granted;
|
return PermissionStatus::Granted;
|
||||||
}
|
}
|
||||||
|
|
@ -965,15 +807,11 @@ void start() {
|
||||||
crl::async(SetDarkMode);
|
crl::async(SetDarkMode);
|
||||||
|
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
||||||
NSWInstance = std::make_unique<internal::NotificationServiceWatcher>();
|
|
||||||
FileDialog::XDP::Start();
|
FileDialog::XDP::Start();
|
||||||
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
||||||
}
|
}
|
||||||
|
|
||||||
void finish() {
|
void finish() {
|
||||||
#ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
NSWInstance = nullptr;
|
|
||||||
#endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ThirdParty
|
} // namespace ThirdParty
|
||||||
|
|
@ -984,7 +822,6 @@ void psNewVersion() {
|
||||||
#ifndef __HAIKU__
|
#ifndef __HAIKU__
|
||||||
Platform::InstallLauncher();
|
Platform::InstallLauncher();
|
||||||
#endif // __HAIKU__
|
#endif // __HAIKU__
|
||||||
Platform::RegisterCustomScheme();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void psAutoStart(bool start, bool silent) {
|
void psAutoStart(bool start, bool silent) {
|
||||||
|
|
|
||||||
|
|
@ -112,11 +112,6 @@ void WriteCrashDumpDetails() {
|
||||||
#endif // DESKTOP_APP_DISABLE_CRASH_REPORTS
|
#endif // DESKTOP_APP_DISABLE_CRASH_REPORTS
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterCustomScheme(bool force) {
|
|
||||||
OSStatus result = LSSetDefaultHandlerForURLScheme(CFSTR("tg"), (CFStringRef)[[NSBundle mainBundle] bundleIdentifier]);
|
|
||||||
DEBUG_LOG(("App Info: set default handler for 'tg' scheme result: %1").arg(result));
|
|
||||||
}
|
|
||||||
|
|
||||||
// I do check for availability, just not in the exact way clang is content with
|
// I do check for availability, just not in the exact way clang is content with
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wunguarded-availability"
|
#pragma clang diagnostic ignored "-Wunguarded-availability"
|
||||||
|
|
@ -196,7 +191,6 @@ void IgnoreApplicationActivationRightNow() {
|
||||||
} // namespace Platform
|
} // namespace Platform
|
||||||
|
|
||||||
void psNewVersion() {
|
void psNewVersion() {
|
||||||
Platform::RegisterCustomScheme();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void psAutoStart(bool start, bool silent) {
|
void psAutoStart(bool start, bool silent) {
|
||||||
|
|
|
||||||
|
|
@ -243,9 +243,6 @@ ApplicationDelegate *_sharedDelegate = nil;
|
||||||
|
|
||||||
namespace Platform {
|
namespace Platform {
|
||||||
|
|
||||||
void SetWatchingMediaKeys(bool watching) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetApplicationIcon(const QIcon &icon) {
|
void SetApplicationIcon(const QIcon &icon) {
|
||||||
NSImage *image = nil;
|
NSImage *image = nil;
|
||||||
if (!icon.isNull()) {
|
if (!icon.isNull()) {
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,8 @@ enum class SystemSettingsType {
|
||||||
Audio,
|
Audio,
|
||||||
};
|
};
|
||||||
|
|
||||||
void SetWatchingMediaKeys(bool watching);
|
|
||||||
void SetApplicationIcon(const QIcon &icon);
|
void SetApplicationIcon(const QIcon &icon);
|
||||||
QString SingleInstanceLocalServerName(const QString &hash);
|
QString SingleInstanceLocalServerName(const QString &hash);
|
||||||
void RegisterCustomScheme(bool force = false);
|
|
||||||
PermissionStatus GetPermissionStatus(PermissionType type);
|
PermissionStatus GetPermissionStatus(PermissionType type);
|
||||||
void RequestPermission(PermissionType type, Fn<void(PermissionStatus)> resultCallback);
|
void RequestPermission(PermissionType type, Fn<void(PermissionStatus)> resultCallback);
|
||||||
void OpenSystemSettingsForPermission(PermissionType type);
|
void OpenSystemSettingsForPermission(PermissionType type);
|
||||||
|
|
|
||||||
|
|
@ -372,58 +372,6 @@ namespace {
|
||||||
|
|
||||||
namespace Platform {
|
namespace Platform {
|
||||||
|
|
||||||
void RegisterCustomScheme(bool force) {
|
|
||||||
if (cExeName().isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
DEBUG_LOG(("App Info: Checking custom scheme 'tg'..."));
|
|
||||||
|
|
||||||
HKEY rkey;
|
|
||||||
QString exe = QDir::toNativeSeparators(cExeDir() + cExeName());
|
|
||||||
QString possibleParams;
|
|
||||||
|
|
||||||
if (!cUseEnvApi()) {
|
|
||||||
possibleParams += " -no-env-api";
|
|
||||||
}
|
|
||||||
if (cApiFromStartParams()) {
|
|
||||||
possibleParams += " -api-id \"" + QString::number(cApiId()) + "\"";
|
|
||||||
possibleParams += " -api-hash \"" + cApiHash() + "\"";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Legacy URI scheme registration
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\tg", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, L"URL Protocol", QString())) return;
|
|
||||||
if (!_psSetKeyValue(rkey, 0, qsl("URL:Telegram Link"))) return;
|
|
||||||
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\tg\\DefaultIcon", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, 0, '"' + exe + qsl(",1\""))) return;
|
|
||||||
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\tg\\shell", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\tg\\shell\\open", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\tg\\shell\\open\\command", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, 0, '"' + exe + qsl("\" -workdir \"") + cWorkingDir() + qsl("\"") + possibleParams + qsl(" -- \"%1\""))) return;
|
|
||||||
|
|
||||||
// URI scheme registration as Default Program - Windows Vista and above
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\ktgdesktop.tg", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\ktgdesktop.tg\\DefaultIcon", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, 0, '"' + exe + qsl(",1\""))) return;
|
|
||||||
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\ktgdesktop.tg\\shell", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\ktgdesktop.tg\\shell\\open", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\Classes\\ktgdesktop.tg\\shell\\open\\command", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, 0, '"' + exe + qsl("\" -workdir \"") + cWorkingDir() + qsl("\"") + possibleParams + qsl(" -- \"%1\""))) return;
|
|
||||||
|
|
||||||
if (!_psOpenRegKey(L"Software\\KotatogramDesktop", &rkey)) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\KotatogramDesktop\\Capabilities", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, L"ApplicationName", qsl("Kotatogram Desktop"))) return;
|
|
||||||
if (!_psSetKeyValue(rkey, L"ApplicationDescription", qsl("Kotatogram Desktop"))) return;
|
|
||||||
if (!_psOpenRegKey(L"Software\\KotatogramDesktop\\Capabilities\\UrlAssociations", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, L"tg", qsl("ktgdesktop.tg"))) return;
|
|
||||||
|
|
||||||
if (!_psOpenRegKey(L"Software\\RegisteredApplications", &rkey)) return;
|
|
||||||
if (!_psSetKeyValue(rkey, L"Kotatogram Desktop", qsl("SOFTWARE\\KotatogramDesktop\\Capabilities"))) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PermissionStatus GetPermissionStatus(PermissionType type) {
|
PermissionStatus GetPermissionStatus(PermissionType type) {
|
||||||
if (type==PermissionType::Microphone) {
|
if (type==PermissionType::Microphone) {
|
||||||
PermissionStatus result=PermissionStatus::Granted;
|
PermissionStatus result=PermissionStatus::Granted;
|
||||||
|
|
@ -476,7 +424,6 @@ bool OpenSystemSettings(SystemSettingsType type) {
|
||||||
} // namespace Platform
|
} // namespace Platform
|
||||||
|
|
||||||
void psNewVersion() {
|
void psNewVersion() {
|
||||||
Platform::RegisterCustomScheme();
|
|
||||||
if (Local::oldSettingsVersion() < 8051) {
|
if (Local::oldSettingsVersion() < 8051) {
|
||||||
AppUserModelId::checkPinned();
|
AppUserModelId::checkPinned();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,6 @@ class LocationPoint;
|
||||||
|
|
||||||
namespace Platform {
|
namespace Platform {
|
||||||
|
|
||||||
inline void SetWatchingMediaKeys(bool watching) {
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void IgnoreApplicationActivationRightNow() {
|
inline void IgnoreApplicationActivationRightNow() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ auto GenerateCodes() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
codes.emplace(qsl("registertg"), [](SessionController *window) {
|
codes.emplace(qsl("registertg"), [](SessionController *window) {
|
||||||
Platform::RegisterCustomScheme(true);
|
Core::Application::RegisterUrlScheme();
|
||||||
Ui::Toast::Show("Forced custom scheme register.");
|
Ui::Toast::Show("Forced custom scheme register.");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@ protected:
|
||||||
private:
|
private:
|
||||||
void updateControlsGeometry(int newWidth);
|
void updateControlsGeometry(int newWidth);
|
||||||
Ui::RpWidget *pushButton(base::unique_qptr<Ui::RpWidget> button);
|
Ui::RpWidget *pushButton(base::unique_qptr<Ui::RpWidget> button);
|
||||||
void removeButton(not_null<Ui::RpWidget*> button);
|
|
||||||
|
|
||||||
const style::InfoTopBar &_st;
|
const style::InfoTopBar &_st;
|
||||||
std::vector<base::unique_qptr<Ui::RpWidget>> _buttons;
|
std::vector<base::unique_qptr<Ui::RpWidget>> _buttons;
|
||||||
|
|
@ -136,12 +135,6 @@ Ui::RpWidget *TopBar::pushButton(base::unique_qptr<Ui::RpWidget> button) {
|
||||||
return weak;
|
return weak;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TopBar::removeButton(not_null<Ui::RpWidget*> button) {
|
|
||||||
_buttons.erase(
|
|
||||||
std::remove(_buttons.begin(), _buttons.end(), button),
|
|
||||||
_buttons.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
int TopBar::resizeGetHeight(int newWidth) {
|
int TopBar::resizeGetHeight(int newWidth) {
|
||||||
updateControlsGeometry(newWidth);
|
updateControlsGeometry(newWidth);
|
||||||
return _st.height;
|
return _st.height;
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,6 @@ private:
|
||||||
void setInnerFocus();
|
void setInnerFocus();
|
||||||
void putNext(const object_ptr<TimePart> &field, QChar ch);
|
void putNext(const object_ptr<TimePart> &field, QChar ch);
|
||||||
void erasePrevious(const object_ptr<TimePart> &field);
|
void erasePrevious(const object_ptr<TimePart> &field);
|
||||||
void finishInnerAnimating();
|
|
||||||
void setErrorShown(bool error);
|
void setErrorShown(bool error);
|
||||||
void setFocused(bool focused);
|
void setFocused(bool focused);
|
||||||
void startBorderAnimation();
|
void startBorderAnimation();
|
||||||
|
|
@ -538,14 +537,6 @@ void TimeInput::setFocused(bool focused) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimeInput::finishInnerAnimating() {
|
|
||||||
_hour->finishAnimating();
|
|
||||||
_minute->finishAnimating();
|
|
||||||
_a_borderOpacity.stop();
|
|
||||||
_a_borderShown.stop();
|
|
||||||
_a_error.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TimeInput::startBorderAnimation() {
|
void TimeInput::startBorderAnimation() {
|
||||||
auto borderVisible = (_error || _focused);
|
auto borderVisible = (_error || _focused);
|
||||||
if (_borderVisible != borderVisible) {
|
if (_borderVisible != borderVisible) {
|
||||||
|
|
|
||||||
|
|
@ -593,7 +593,7 @@ void EmptyUserpic::fillString(const QString &name) {
|
||||||
auto ch = name.constData(), end = ch + name.size();
|
auto ch = name.constData(), end = ch + name.size();
|
||||||
while (ch != end) {
|
while (ch != end) {
|
||||||
auto emojiLength = 0;
|
auto emojiLength = 0;
|
||||||
if (auto emoji = Ui::Emoji::Find(ch, end, &emojiLength)) {
|
if (Ui::Emoji::Find(ch, end, &emojiLength)) {
|
||||||
ch += emojiLength;
|
ch += emojiLength;
|
||||||
} else if (ch->isHighSurrogate()) {
|
} else if (ch->isHighSurrogate()) {
|
||||||
++ch;
|
++ch;
|
||||||
|
|
|
||||||
|
|
@ -520,11 +520,9 @@ void MainWindow::initSize() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto primaryScreen = QGuiApplication::primaryScreen();
|
const auto primaryScreen = QGuiApplication::primaryScreen();
|
||||||
auto geometryScreen = primaryScreen;
|
|
||||||
const auto available = primaryScreen
|
const auto available = primaryScreen
|
||||||
? primaryScreen->availableGeometry()
|
? primaryScreen->availableGeometry()
|
||||||
: QRect(0, 0, st::windowDefaultWidth, st::windowDefaultHeight);
|
: QRect(0, 0, st::windowDefaultWidth, st::windowDefaultHeight);
|
||||||
bool maximized = false;
|
|
||||||
const auto initialWidth = Core::Settings::ThirdColumnByDefault()
|
const auto initialWidth = Core::Settings::ThirdColumnByDefault()
|
||||||
? st::windowBigDefaultWidth
|
? st::windowBigDefaultWidth
|
||||||
: st::windowDefaultWidth;
|
: st::windowDefaultWidth;
|
||||||
|
|
@ -590,13 +588,11 @@ void MainWindow::initSize() {
|
||||||
position.y + st::windowMinHeight <= screenGeometry.y() + screenGeometry.height()) {
|
position.y + st::windowMinHeight <= screenGeometry.y() + screenGeometry.height()) {
|
||||||
DEBUG_LOG(("Window Pos: Resulting geometry is %1, %2, %3, %4").arg(position.x).arg(position.y).arg(position.w).arg(position.h));
|
DEBUG_LOG(("Window Pos: Resulting geometry is %1, %2, %3, %4").arg(position.x).arg(position.y).arg(position.w).arg(position.h));
|
||||||
geometry = QRect(position.x, position.y, position.w, position.h);
|
geometry = QRect(position.x, position.y, position.w, position.h);
|
||||||
geometryScreen = screen;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
maximized = position.maximized;
|
|
||||||
}
|
}
|
||||||
geometry += _padding;
|
geometry += _padding;
|
||||||
DEBUG_LOG(("Window Pos: Setting first %1, %2, %3, %4").arg(geometry.x()).arg(geometry.y()).arg(geometry.width()).arg(geometry.height()));
|
DEBUG_LOG(("Window Pos: Setting first %1, %2, %3, %4").arg(geometry.x()).arg(geometry.y()).arg(geometry.width()).arg(geometry.height()));
|
||||||
|
|
|
||||||
|
|
@ -320,7 +320,7 @@ bool EditorBlock::selectSkip(int direction) {
|
||||||
if (newSelected < -1 || newSelected > maxSelected) {
|
if (newSelected < -1 || newSelected > maxSelected) {
|
||||||
newSelected = maxSelected;
|
newSelected = maxSelected;
|
||||||
}
|
}
|
||||||
if (auto changed = (newSelected != _selected)) {
|
if (newSelected != _selected) {
|
||||||
setSelected(newSelected);
|
setSelected(newSelected);
|
||||||
scrollToSelected();
|
scrollToSelected();
|
||||||
return (newSelected >= 0);
|
return (newSelected >= 0);
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ QString fillLetters(const QString &name) {
|
||||||
auto ch = name.constData(), end = ch + name.size();
|
auto ch = name.constData(), end = ch + name.size();
|
||||||
while (ch != end) {
|
while (ch != end) {
|
||||||
auto emojiLength = 0;
|
auto emojiLength = 0;
|
||||||
if (auto emoji = Ui::Emoji::Find(ch, end, &emojiLength)) {
|
if (Ui::Emoji::Find(ch, end, &emojiLength)) {
|
||||||
ch += emojiLength;
|
ch += emojiLength;
|
||||||
} else if (ch->isHighSurrogate()) {
|
} else if (ch->isHighSurrogate()) {
|
||||||
++ch;
|
++ch;
|
||||||
|
|
@ -246,10 +246,8 @@ void Generator::addAudioBubble(QVector<int> waveform, int waveactive, QString wa
|
||||||
auto skipBlock = computeSkipBlock(status, date);
|
auto skipBlock = computeSkipBlock(status, date);
|
||||||
|
|
||||||
auto width = st::msgFileMinWidth;
|
auto width = st::msgFileMinWidth;
|
||||||
auto tleft = 0, tright = 0;
|
|
||||||
const auto &st = st::msgFileLayout;
|
const auto &st = st::msgFileLayout;
|
||||||
tleft = st.padding.left() + st.thumbSize + st.padding.right();
|
auto tleft = st.padding.left() + st.thumbSize + st.padding.right();
|
||||||
tright = st.padding.left();
|
|
||||||
accumulate_max(width, tleft + st::normalFont->width(wavestatus) + skipBlock.width() + st::msgPadding.right());
|
accumulate_max(width, tleft + st::normalFont->width(wavestatus) + skipBlock.width() + st::msgPadding.right());
|
||||||
if (!AdaptiveBubbles()) {
|
if (!AdaptiveBubbles()) {
|
||||||
accumulate_min(width, st::msgMaxWidth);
|
accumulate_min(width, st::msgMaxWidth);
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ constexpr auto kMinimalSkip = 7;
|
||||||
constexpr auto kSoonSkip = 30;
|
constexpr auto kSoonSkip = 30;
|
||||||
constexpr auto kNowSkip = 90;
|
constexpr auto kNowSkip = 90;
|
||||||
|
|
||||||
|
#ifdef DESKTOP_APP_SPECIAL_TARGET
|
||||||
class Bar : public Ui::RpWidget {
|
class Bar : public Ui::RpWidget {
|
||||||
public:
|
public:
|
||||||
Bar(not_null<QWidget*> parent, QDate date);
|
Bar(not_null<QWidget*> parent, QDate date);
|
||||||
|
|
@ -96,7 +97,6 @@ void Bar::paintEvent(QPaintEvent *e) {
|
||||||
_soon ? st::outdateSoonBg : st::outdatedBg);
|
_soon ? st::outdateSoonBg : st::outdatedBg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DESKTOP_APP_SPECIAL_TARGET
|
|
||||||
QString LastHiddenPath() {
|
QString LastHiddenPath() {
|
||||||
return cWorkingDir() + qsl("tdata/outdated_hidden");
|
return cWorkingDir() + qsl("tdata/outdated_hidden");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ RUN git clone $GIT/desktop-app/patches.git
|
||||||
|
|
||||||
WORKDIR patches
|
WORKDIR patches
|
||||||
RUN git checkout 87a2e9ee07
|
RUN git checkout 87a2e9ee07
|
||||||
|
WORKDIR ..
|
||||||
|
|
||||||
FROM builder AS extra-cmake-modules
|
FROM builder AS extra-cmake-modules
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@ DefaultGroupName={#MyAppName}
|
||||||
AllowNoIcons=yes
|
AllowNoIcons=yes
|
||||||
OutputDir={#ReleasePath}
|
OutputDir={#ReleasePath}
|
||||||
SetupIconFile={#SourcePath}..\Resources\art\icon256.ico
|
SetupIconFile={#SourcePath}..\Resources\art\icon256.ico
|
||||||
|
UninstallDisplayName={#MyAppName}
|
||||||
UninstallDisplayIcon={app}\Kotatogram.exe
|
UninstallDisplayIcon={app}\Kotatogram.exe
|
||||||
Compression=lzma
|
Compression=lzma
|
||||||
SolidCompression=yes
|
SolidCompression=yes
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,7 @@ if (NOT TGVOIP_FOUND)
|
||||||
if (LINUX)
|
if (LINUX)
|
||||||
if (NOT LIBTGVOIP_DISABLE_ALSA)
|
if (NOT LIBTGVOIP_DISABLE_ALSA)
|
||||||
find_package(ALSA REQUIRED)
|
find_package(ALSA REQUIRED)
|
||||||
target_include_directories(lib_tgvoip_bundled PRIVATE ${ALSA_INCLUDE_DIRS})
|
target_include_directories(lib_tgvoip_bundled SYSTEM PRIVATE ${ALSA_INCLUDE_DIRS})
|
||||||
else()
|
else()
|
||||||
remove_target_sources(lib_tgvoip_bundled ${tgvoip_loc}
|
remove_target_sources(lib_tgvoip_bundled ${tgvoip_loc}
|
||||||
os/linux/AudioInputALSA.cpp
|
os/linux/AudioInputALSA.cpp
|
||||||
|
|
@ -206,7 +206,7 @@ if (NOT TGVOIP_FOUND)
|
||||||
if (NOT LIBTGVOIP_DISABLE_PULSEAUDIO)
|
if (NOT LIBTGVOIP_DISABLE_PULSEAUDIO)
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(PULSE REQUIRED libpulse)
|
pkg_check_modules(PULSE REQUIRED libpulse)
|
||||||
target_include_directories(lib_tgvoip_bundled PRIVATE ${PULSE_INCLUDE_DIRS})
|
target_include_directories(lib_tgvoip_bundled SYSTEM PRIVATE ${PULSE_INCLUDE_DIRS})
|
||||||
else()
|
else()
|
||||||
remove_target_sources(lib_tgvoip_bundled ${tgvoip_loc}
|
remove_target_sources(lib_tgvoip_bundled ${tgvoip_loc}
|
||||||
os/linux/AudioOutputPulse.cpp
|
os/linux/AudioOutputPulse.cpp
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 18b6e547c970e8ba2e5f817df18f0d613a7b2d8f
|
Subproject commit 248614b49cd7d5aff69d75a737f2e35b79fbb119
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit df2331b99693756b52008aa2628554ce1fe2f0d2
|
Subproject commit 13f02ee5ef3c109f5bb447c14fdde3da9f8e70f7
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 16150bf71d79382738114b913f137ec1a1a7630c
|
Subproject commit 3ccf2ed5095442e5874bba8852cb7dc4efeae29f
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 71fecd909b0d5553153ecb6803f03a91158aeefb
|
Subproject commit 0770df009db7928df1d0cad0900dc5110106d229
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 0a0097b9c8b89257b9c78d962f780078f961c88b
|
Subproject commit 68c9b788958904aea7de79f986a0f82ec8c5b094
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 2f8789f265c93f2de4745102e9d0f14dbba688a5
|
Subproject commit f206cb7bbb060e5b19ca85fddb5b6e0223f266d6
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 1ea86a387b1bc4fb1374c53a098a749bf024f7e6
|
Subproject commit 4a722c1f267b2491f8e9ef6200ae4ec61b46f397
|
||||||
|
|
@ -1 +1 @@
|
||||||
Subproject commit 87a002f9c746e83c14994098eee8e84ba22de2f2
|
Subproject commit 9ded693d98ba55d18a36dcc3cc4db98b786ae258
|
||||||
2
cmake
2
cmake
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5b39ef4b82d6d0d08a71b669233d2c34d585a5ff
|
Subproject commit cbf0e420290319b6bd086d3403e5f30faabeee09
|
||||||
Loading…
Add table
Reference in a new issue