diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index 867e035fa9..a7a0eb0292 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -110,7 +110,6 @@ Application::Application(int &argc, char **argv) : PsApplication(argc, argv), } mainApp = this; - installEventFilter(new EventFilterForKeys(this)); QFontDatabase::addApplicationFont(qsl(":/gui/art/fonts/OpenSans-Regular.ttf")); @@ -655,7 +654,6 @@ void Application::socketError(QLocalSocket::LocalSocketError e) { void Application::checkMapVersion() { if (Local::oldMapVersion() < AppVersion) { - psRegisterCustomScheme(); if (Local::oldMapVersion()) { QString versionFeatures; if (cDevVersion() && Local::oldMapVersion() < 8049) { diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index 0ca20aca24..1250413248 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -541,7 +541,7 @@ namespace { int32 _storageImagesSize = 0, _storageStickersSize = 0, _storageAudiosSize = 0; bool _mapChanged = false; - int32 _oldMapVersion = 0; + int32 _oldMapVersion = 0, _oldSettingsVersion = 0; enum WriteMapWhen { WriteMapNow, @@ -1573,6 +1573,9 @@ namespace { _readMtpData(); LOG(("Map read time: %1").arg(getms() - ms)); + if (_oldSettingsVersion < AppVersion) { + Local::writeSettings(); + } return Local::ReadMapDone; } @@ -1820,6 +1823,7 @@ namespace Local { cSetDcOptions(dcOpts); } + _oldSettingsVersion = settingsData.version; _settingsSalt = salt; } @@ -1962,6 +1966,10 @@ namespace Local { return _oldMapVersion; } + int32 oldSettingsVersion() { + return _oldSettingsVersion; + } + void writeDraft(const PeerId &peer, const MessageDraft &draft) { if (!_working()) return; diff --git a/Telegram/SourceFiles/localstorage.h b/Telegram/SourceFiles/localstorage.h index 65fe3c7cf2..11b3f38719 100644 --- a/Telegram/SourceFiles/localstorage.h +++ b/Telegram/SourceFiles/localstorage.h @@ -100,6 +100,8 @@ namespace Local { ReadMapState readMap(const QByteArray &pass); int32 oldMapVersion(); + int32 oldSettingsVersion(); + struct MessageDraft { MessageDraft(MsgId replyTo = 0, QString text = QString(), bool previewCancelled = false) : replyTo(replyTo), text(text), previewCancelled(previewCancelled) { } diff --git a/Telegram/SourceFiles/main.cpp b/Telegram/SourceFiles/main.cpp index e282a889b8..26b897b089 100644 --- a/Telegram/SourceFiles/main.cpp +++ b/Telegram/SourceFiles/main.cpp @@ -39,6 +39,9 @@ int main(int argc, char *argv[]) { logsInit(); Local::readSettings(); + if (Local::oldSettingsVersion() < AppVersion) { + psNewVersion(); + } if (cFromAutoStart() && !cAutoStart()) { psAutoStart(false, true); Local::stop(); diff --git a/Telegram/SourceFiles/pspecific_linux.cpp b/Telegram/SourceFiles/pspecific_linux.cpp index d0af098810..3c96e062bb 100644 --- a/Telegram/SourceFiles/pspecific_linux.cpp +++ b/Telegram/SourceFiles/pspecific_linux.cpp @@ -1249,6 +1249,10 @@ void psRegisterCustomScheme() { } } +void psNewVersion() { + psRegisterCustomScheme(); +} + bool _execUpdater(bool update = true) { static const int MaxLen = 65536, MaxArgsCount = 128; diff --git a/Telegram/SourceFiles/pspecific_linux.h b/Telegram/SourceFiles/pspecific_linux.h index a4de7f9ba0..3c2c2bd8da 100644 --- a/Telegram/SourceFiles/pspecific_linux.h +++ b/Telegram/SourceFiles/pspecific_linux.h @@ -163,7 +163,7 @@ void psShowInFolder(const QString &name); void psStart(); void psFinish(); -void psRegisterCustomScheme(); +void psNewVersion(); void psUpdateOverlayed(QWidget *widget); inline QString psConvertFileUrl(const QString &url) { diff --git a/Telegram/SourceFiles/pspecific_mac.cpp b/Telegram/SourceFiles/pspecific_mac.cpp index 9ee3896407..0cac59f759 100644 --- a/Telegram/SourceFiles/pspecific_mac.cpp +++ b/Telegram/SourceFiles/pspecific_mac.cpp @@ -653,7 +653,7 @@ void psFinish() { objc_finish(); } -void psRegisterCustomScheme() { +void psNewVersion() { objc_registerCustomScheme(); } diff --git a/Telegram/SourceFiles/pspecific_mac.h b/Telegram/SourceFiles/pspecific_mac.h index a9807a175a..b7664d2dd5 100644 --- a/Telegram/SourceFiles/pspecific_mac.h +++ b/Telegram/SourceFiles/pspecific_mac.h @@ -193,7 +193,7 @@ void psShowInFolder(const QString &name); void psStart(); void psFinish(); -void psRegisterCustomScheme(); +void psNewVersion(); void psUpdateOverlayed(QWidget *widget); QString psConvertFileUrl(const QString &url); diff --git a/Telegram/SourceFiles/pspecific_wnd.cpp b/Telegram/SourceFiles/pspecific_wnd.cpp index d8dd244c71..2d950ac484 100644 --- a/Telegram/SourceFiles/pspecific_wnd.cpp +++ b/Telegram/SourceFiles/pspecific_wnd.cpp @@ -1197,6 +1197,7 @@ void PsMainWindow::psInitSize() { bool InitToastManager(); bool CreateToast(PeerData *peer, int32 msgId, bool showpix, const QString &title, const QString &subtitle, const QString &msg); +void CheckPinnedAppUserModelId(); void CleanupAppUserModelIdShortcut(); void PsMainWindow::psInitFrameless() { @@ -2197,9 +2198,7 @@ namespace { } } -void psRegisterCustomScheme() { - - +void RegisterCustomScheme() { DEBUG_LOG(("App Info: Checking custom scheme 'tg'..")); HKEY rkey; @@ -2218,6 +2217,11 @@ void psRegisterCustomScheme() { if (!_psSetKeyValue(rkey, 0, '"' + exe + qsl("\" -workdir \"") + cWorkingDir() + qsl("\" -- \"%1\""))) return; } +void psNewVersion() { + RegisterCustomScheme(); + CheckPinnedAppUserModelId(); +} + void psExecUpdater() { QString targs = qsl("-update"); if (cFromAutoStart()) targs += qsl(" -autostart"); @@ -2805,6 +2809,120 @@ bool CreateToast(PeerData *peer, int32 msgId, bool showpix, const QString &title return true; } +QString pinnedPath() { + static const int maxFileLen = MAX_PATH * 10; + WCHAR wstrPath[maxFileLen]; + if (GetEnvironmentVariable(L"APPDATA", wstrPath, maxFileLen)) { + QDir appData(QString::fromStdWString(std::wstring(wstrPath))); + return appData.absolutePath() + qsl("/Microsoft/Internet Explorer/Quick Launch/User Pinned/TaskBar/"); + } + return QString(); +} + +void CheckPinnedAppUserModelId() { + static const int maxFileLen = MAX_PATH * 10; + + HRESULT hr = CoInitialize(0); + if (!SUCCEEDED(hr)) return; + + QString path = pinnedPath(); + std::wstring p = QDir::toNativeSeparators(path).toStdWString(); + + WCHAR src[MAX_PATH]; + GetModuleFileNameEx(GetCurrentProcess(), nullptr, src, MAX_PATH); + BY_HANDLE_FILE_INFORMATION srcinfo = { 0 }; + HANDLE srcfile = CreateFile(src, 0x00, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (srcfile == INVALID_HANDLE_VALUE) return; + BOOL srcres = GetFileInformationByHandle(srcfile, &srcinfo); + CloseHandle(srcfile); + if (!srcres) return; + LOG(("Checking..")); + WIN32_FIND_DATA findData; + HANDLE findHandle = FindFirstFileEx((p + L"*").c_str(), FindExInfoStandard, &findData, FindExSearchNameMatch, 0, 0); + if (findHandle == INVALID_HANDLE_VALUE) { + LOG(("Init Error: could not find files in pinned folder")); + return; + } + do { + std::wstring fname = p + findData.cFileName; + LOG(("Checking %1").arg(QString::fromStdWString(fname))); + if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + continue; + } else { + DWORD attributes = GetFileAttributes(fname.c_str()); + if (attributes >= 0xFFFFFFF) continue; // file does not exist + + ComPtr shellLink; + HRESULT hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shellLink)); + if (!SUCCEEDED(hr)) continue; + + ComPtr persistFile; + hr = shellLink.As(&persistFile); + if (!SUCCEEDED(hr)) continue; + + hr = persistFile->Load(fname.c_str(), STGM_READWRITE); + if (!SUCCEEDED(hr)) continue; + + WCHAR dst[MAX_PATH]; + hr = shellLink->GetPath(dst, MAX_PATH, 0, 0); + if (!SUCCEEDED(hr)) continue; + + BY_HANDLE_FILE_INFORMATION dstinfo = { 0 }; + HANDLE dstfile = CreateFile(dst, 0x00, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (dstfile == INVALID_HANDLE_VALUE) continue; + BOOL dstres = GetFileInformationByHandle(dstfile, &dstinfo); + CloseHandle(dstfile); + if (!dstres) continue; + + if (srcinfo.dwVolumeSerialNumber == dstinfo.dwVolumeSerialNumber && srcinfo.nFileIndexLow == dstinfo.nFileIndexLow && srcinfo.nFileIndexHigh == dstinfo.nFileIndexHigh) { + ComPtr propertyStore; + hr = shellLink.As(&propertyStore); + if (!SUCCEEDED(hr)) return; + + PROPVARIANT appIdPropVar; + hr = propertyStore->GetValue(pkey_AppUserModel_ID, &appIdPropVar); + if (!SUCCEEDED(hr)) return; + LOG(("Reading..")); + WCHAR already[MAX_PATH]; + hr = propVariantToString(appIdPropVar, already, MAX_PATH); + if (SUCCEEDED(hr)) { + if (std::wstring(AppUserModelId) == already) { + LOG(("Already!")); + PropVariantClear(&appIdPropVar); + return; + } + } + if (appIdPropVar.vt != VT_EMPTY) { + PropVariantClear(&appIdPropVar); + return; + } + PropVariantClear(&appIdPropVar); + + hr = InitPropVariantFromString(AppUserModelId, &appIdPropVar); + if (!SUCCEEDED(hr)) return; + + hr = propertyStore->SetValue(pkey_AppUserModel_ID, appIdPropVar); + PropVariantClear(&appIdPropVar); + if (!SUCCEEDED(hr)) return; + + hr = propertyStore->Commit(); + if (!SUCCEEDED(hr)) return; + + if (persistFile->IsDirty() == S_OK) { + persistFile->Save(fname.c_str(), TRUE); + } + return; + } + } + } while (FindNextFile(findHandle, &findData)); + DWORD errorCode = GetLastError(); + if (errorCode && errorCode != ERROR_NO_MORE_FILES) { // everything is found + LOG(("Init Error: could not find some files in pinned folder")); + return; + } + FindClose(findHandle); +} + QString systemShortcutPath() { static const int maxFileLen = MAX_PATH * 10; WCHAR wstrPath[maxFileLen]; @@ -2963,7 +3081,6 @@ bool ValidateAppUserModelIdShortcut() { bool InitToastManager() { if (!useToast || !ValidateAppUserModelIdShortcut()) return false; - if (!SUCCEEDED(setCurrentProcessExplicitAppUserModelID(AppUserModelId))) { return false; } diff --git a/Telegram/SourceFiles/pspecific_wnd.h b/Telegram/SourceFiles/pspecific_wnd.h index bf07c1c1a6..3cb01cd2c9 100644 --- a/Telegram/SourceFiles/pspecific_wnd.h +++ b/Telegram/SourceFiles/pspecific_wnd.h @@ -168,7 +168,7 @@ void psShowInFolder(const QString &name); void psStart(); void psFinish(); -void psRegisterCustomScheme(); +void psNewVersion(); void psUpdateOverlayed(TWidget *widget); inline QString psConvertFileUrl(const QString &url) {