diff --git a/grepWinNP3/grepWinNP3.vcxproj b/grepWinNP3/grepWinNP3.vcxproj index 4465ff7e9..3b866e07b 100644 --- a/grepWinNP3/grepWinNP3.vcxproj +++ b/grepWinNP3/grepWinNP3.vcxproj @@ -214,8 +214,10 @@ + + @@ -223,6 +225,7 @@ + @@ -259,10 +262,11 @@ + - + diff --git a/grepWinNP3/grepWinNP3.vcxproj.filters b/grepWinNP3/grepWinNP3.vcxproj.filters index 3e980a793..fce90f28b 100644 --- a/grepWinNP3/grepWinNP3.vcxproj.filters +++ b/grepWinNP3/grepWinNP3.vcxproj.filters @@ -114,9 +114,6 @@ sktoolslib_mod - - sktoolslib_mod - sktoolslib_mod @@ -150,6 +147,18 @@ sktoolslib_mod + + sktoolslib_mod + + + sktoolslib_mod + + + sktoolslib_mod + + + sktoolslib_mod + @@ -245,9 +254,6 @@ sktoolslib_mod - - sktoolslib_mod - sktoolslib_mod @@ -296,12 +302,18 @@ Header Files - - sktoolslib_mod - Header Files\last + + sktoolslib_mod + + + sktoolslib_mod + + + sktoolslib_mod + diff --git a/grepWinNP3/sktoolslib_mod/AnimationManager.cpp b/grepWinNP3/sktoolslib_mod/AnimationManager.cpp index 59c823de5..7bbdf043e 100644 --- a/grepWinNP3/sktoolslib_mod/AnimationManager.cpp +++ b/grepWinNP3/sktoolslib_mod/AnimationManager.cpp @@ -61,7 +61,7 @@ public: } /// Inherited via IUIAnimationTimerEventHandler - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject) override + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override { if (ppvObject == nullptr) return E_POINTER; @@ -94,7 +94,6 @@ public: return ref; } - virtual HRESULT STDMETHODCALLTYPE OnPreUpdate(void) override { return S_OK; @@ -113,7 +112,7 @@ public: } private: - std::map> callbacks; + std::map> callbacks; unsigned long ref; }; @@ -135,7 +134,7 @@ public: } /// Sets the timer object event handler - void SetTimerObj(CTimerEventHandler * handler) + void SetTimerObj(CTimerEventHandler* handler) { if (timerEventHandler) timerEventHandler->Release(); @@ -145,7 +144,7 @@ public: } /// Inherited via IUIAnimationStoryboardEventHandler - virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void ** ppvObject) override + virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override { if (ppvObject == nullptr) return E_POINTER; @@ -178,7 +177,6 @@ public: return ref; } - /// IUIAnimationStoryboardEventHandler Interface implementation HRESULT STDMETHODCALLTYPE OnStoryboardStatusChanged(IUIAnimationStoryboard* storyboard, UI_ANIMATION_STORYBOARD_STATUS newStatus, @@ -203,72 +201,104 @@ public: return S_OK; } - private: - CTimerEventHandler * timerEventHandler; + CTimerEventHandler* timerEventHandler; unsigned long ref; }; - -IUIAnimationVariablePtr Animator::CreateAnimationVariable(double start) +AnimationVariable Animator::CreateAnimationVariable(double start, double defValue) { + AnimationVariable var; + var.m_defaultValue = defValue; + if (pAnimMgr) + { IUIAnimationVariablePtr pAnimVar = nullptr; if (SUCCEEDED(pAnimMgr->CreateAnimationVariable(start, &pAnimVar))) - return pAnimVar; - return nullptr; + { + var.m_animVar = pAnimVar; + } + } + return var; } -INT32 Animator::GetIntegerValue(IUIAnimationVariablePtr var) +INT32 Animator::GetIntegerValue(AnimationVariable& var) { - INT32 val; - var->GetIntegerValue(&val); + if (var.m_animVar) + { + INT32 val = 0; + if (SUCCEEDED(var.m_animVar->GetIntegerValue(&val))) return val; + } + return (INT32)var.m_defaultValue; } -double Animator::GetValue(IUIAnimationVariablePtr var) +double Animator::GetValue(AnimationVariable& var) { - double val; - var->GetValue(&val); + if (var.m_animVar) + { + double val = 0.0; + if (SUCCEEDED(var.m_animVar->GetValue(&val))) return val; + } + return var.m_defaultValue; } -IUIAnimationTransitionPtr Animator::CreateAccelerateDecelerateTransition(UI_ANIMATION_SECONDS duration, double finalValue, double accelerationRatio, double decelerationRatio) +IUIAnimationTransitionPtr Animator::CreateAccelerateDecelerateTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue, double accelerationRatio, double decelerationRatio) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateAccelerateDecelerateTransition(duration, finalValue, accelerationRatio, decelerationRatio, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateSmoothStopTransition(UI_ANIMATION_SECONDS duration, double finalValue) +IUIAnimationTransitionPtr Animator::CreateSmoothStopTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateSmoothStopTransition(duration, finalValue, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateParabolicTransitionFromAcceleration(double finalValue, double finalVelocity, double acceleration) +IUIAnimationTransitionPtr Animator::CreateParabolicTransitionFromAcceleration(AnimationVariable& var, double finalValue, double finalVelocity, double acceleration) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateParabolicTransitionFromAcceleration(finalValue, finalVelocity, acceleration, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateCubicTransition(UI_ANIMATION_SECONDS maximumDuration, double finalValue, double finalVelocity) +IUIAnimationTransitionPtr Animator::CreateCubicTransition(AnimationVariable& var, UI_ANIMATION_SECONDS maximumDuration, double finalValue, double finalVelocity) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateCubicTransition(maximumDuration, finalValue, finalVelocity, &trans))) return trans; + } return nullptr; } IUIAnimationTransitionPtr Animator::CreateReversalTransition(UI_ANIMATION_SECONDS duration) { + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateReversalTransition(duration, &trans))) return trans; + } return nullptr; } @@ -278,65 +308,93 @@ IUIAnimationTransitionPtr Animator::CreateSinusoidalTransitionFromRange(UI_ANIMA UI_ANIMATION_SECONDS period, UI_ANIMATION_SLOPE slope) { + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateSinusoidalTransitionFromRange(duration, minimumValue, maximumValue, period, slope, &trans))) return trans; + } return nullptr; } IUIAnimationTransitionPtr Animator::CreateSinusoidalTransitionFromVelocity(UI_ANIMATION_SECONDS duration, UI_ANIMATION_SECONDS period) { + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateSinusoidalTransitionFromVelocity(duration, period, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateLinearTransitionFromSpeed(double speed, double finalValue) +IUIAnimationTransitionPtr Animator::CreateLinearTransitionFromSpeed(AnimationVariable& var, double speed, double finalValue) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateLinearTransitionFromSpeed(speed, finalValue, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateLinearTransition(UI_ANIMATION_SECONDS duration, double finalValue) +IUIAnimationTransitionPtr Animator::CreateLinearTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateLinearTransition(duration, finalValue, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateDiscreteTransition(UI_ANIMATION_SECONDS delay, double finalValue, UI_ANIMATION_SECONDS hold) +IUIAnimationTransitionPtr Animator::CreateDiscreteTransition(AnimationVariable& var, UI_ANIMATION_SECONDS delay, double finalValue, UI_ANIMATION_SECONDS hold) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateDiscreteTransition(delay, finalValue, hold, &trans))) return trans; + } return nullptr; } IUIAnimationTransitionPtr Animator::CreateConstantTransition(UI_ANIMATION_SECONDS duration) { + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateConstantTransition(duration, &trans))) return trans; + } return nullptr; } -IUIAnimationTransitionPtr Animator::CreateInstantaneousTransition(double finalValue) +IUIAnimationTransitionPtr Animator::CreateInstantaneousTransition(AnimationVariable& var, double finalValue) { + var.m_defaultValue = finalValue; + if (pTransLib) + { IUIAnimationTransitionPtr trans; if (SUCCEEDED(pTransLib->CreateInstantaneousTransition(finalValue, &trans))) return trans; + } return nullptr; } IUIAnimationStoryboardPtr Animator::CreateStoryBoard() { + if (pAnimMgr) + { IUIAnimationStoryboardPtr storyBoard; if (SUCCEEDED(pAnimMgr->CreateStoryboard(&storyBoard))) return storyBoard; + } return nullptr; } @@ -351,6 +409,8 @@ HRESULT Animator::RunStoryBoard(IUIAnimationStoryboardPtr storyBoard, std::funct storyBoard->SetStoryboardEventHandler(notificationAnimEvHandler); } + if (pAnimTmr) + { // start the animation UI_ANIMATION_SECONDS secs = 0; pAnimTmr->GetTime(&secs); @@ -360,11 +420,15 @@ HRESULT Animator::RunStoryBoard(IUIAnimationStoryboardPtr storyBoard, std::funct if (pAnimTmr->IsEnabled() != S_OK) pAnimTmr->Enable(); return hr; + } + return E_FAIL; } HRESULT Animator::AbandonAllStoryBoards() { + if (pAnimMgr) return pAnimMgr->AbandonAllStoryboards(); + return E_FAIL; } Animator::Animator() @@ -410,12 +474,14 @@ Animator::Animator() Animator::~Animator() { // release the timer event handler object (CTimerEventHandler) + if (pAnimTmr) pAnimTmr->SetTimerEventHandler(nullptr); // shut down the animation manager: No methods can be called on any animation object after Shutdown + if (pAnimMgr) pAnimMgr->Shutdown(); } -Animator & Animator::Instance() +Animator& Animator::Instance() { if (instance == nullptr) instance.reset(new Animator()); @@ -433,4 +499,3 @@ bool Animator::IsInstanceActive() } std::unique_ptr Animator::instance = nullptr; - diff --git a/grepWinNP3/sktoolslib_mod/AnimationManager.h b/grepWinNP3/sktoolslib_mod/AnimationManager.h index c9eafd6de..811195414 100644 --- a/grepWinNP3/sktoolslib_mod/AnimationManager.h +++ b/grepWinNP3/sktoolslib_mod/AnimationManager.h @@ -74,6 +74,14 @@ _COM_SMARTPTR_TYPEDEF(IUIAnimationTransition, __uuidof(IUIAnimationTransition)); class CTimerEventHandler; +class AnimationVariable +{ +public: + IUIAnimationVariablePtr m_animVar; + double m_defaultValue; + +}; + class Animator { public: @@ -88,22 +96,22 @@ public: Animator& operator=(const Animator&) = delete; - IUIAnimationVariablePtr CreateAnimationVariable(double start); - static INT32 GetIntegerValue(IUIAnimationVariablePtr var); - static double GetValue(IUIAnimationVariablePtr var); + AnimationVariable CreateAnimationVariable(double start, double defValue); + static INT32 GetIntegerValue(AnimationVariable& var); + static double GetValue(AnimationVariable& var); - IUIAnimationTransitionPtr CreateAccelerateDecelerateTransition(UI_ANIMATION_SECONDS duration, double finalValue, double accelerationRatio = 0.4, double decelerationRatio = 0.4); - IUIAnimationTransitionPtr CreateSmoothStopTransition(UI_ANIMATION_SECONDS duration, double finalValue); - IUIAnimationTransitionPtr CreateParabolicTransitionFromAcceleration(double finalValue, double finalVelocity, double acceleration); - IUIAnimationTransitionPtr CreateCubicTransition(UI_ANIMATION_SECONDS maximumDuration, double finalValue, double finalVelocity); + IUIAnimationTransitionPtr CreateAccelerateDecelerateTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue, double accelerationRatio = 0.4, double decelerationRatio = 0.4); + IUIAnimationTransitionPtr CreateSmoothStopTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue); + IUIAnimationTransitionPtr CreateParabolicTransitionFromAcceleration(AnimationVariable& var, double finalValue, double finalVelocity, double acceleration); + IUIAnimationTransitionPtr CreateCubicTransition(AnimationVariable& var, UI_ANIMATION_SECONDS maximumDuration, double finalValue, double finalVelocity); IUIAnimationTransitionPtr CreateReversalTransition(UI_ANIMATION_SECONDS duration); IUIAnimationTransitionPtr CreateSinusoidalTransitionFromRange(UI_ANIMATION_SECONDS duration, double minimumValue, double maximumValue, UI_ANIMATION_SECONDS period, UI_ANIMATION_SLOPE slope); IUIAnimationTransitionPtr CreateSinusoidalTransitionFromVelocity(UI_ANIMATION_SECONDS duration, UI_ANIMATION_SECONDS period); - IUIAnimationTransitionPtr CreateLinearTransitionFromSpeed(double speed, double finalValue); - IUIAnimationTransitionPtr CreateLinearTransition(UI_ANIMATION_SECONDS duration, double finalValue); - IUIAnimationTransitionPtr CreateDiscreteTransition(UI_ANIMATION_SECONDS delay, double finalValue, UI_ANIMATION_SECONDS hold); + IUIAnimationTransitionPtr CreateLinearTransitionFromSpeed(AnimationVariable& var, double speed, double finalValue); + IUIAnimationTransitionPtr CreateLinearTransition(AnimationVariable& var, UI_ANIMATION_SECONDS duration, double finalValue); + IUIAnimationTransitionPtr CreateDiscreteTransition(AnimationVariable& var, UI_ANIMATION_SECONDS delay, double finalValue, UI_ANIMATION_SECONDS hold); IUIAnimationTransitionPtr CreateConstantTransition(UI_ANIMATION_SECONDS duration); - IUIAnimationTransitionPtr CreateInstantaneousTransition(double finalValue); + IUIAnimationTransitionPtr CreateInstantaneousTransition(AnimationVariable& var, double finalValue); IUIAnimationStoryboardPtr CreateStoryBoard(); diff --git a/grepWinNP3/sktoolslib_mod/Hash.cpp b/grepWinNP3/sktoolslib_mod/Hash.cpp new file mode 100644 index 000000000..351f3ef72 --- /dev/null +++ b/grepWinNP3/sktoolslib_mod/Hash.cpp @@ -0,0 +1,88 @@ +// sktoolslib - common files for SK tools + +// Copyright (C) 2020 - Stefan Kueng + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// + +#include "stdafx.h" +#include "Hash.h" + +std::wstring GetHashText(const void* data, const size_t data_size, HashType hashType) +{ + HCRYPTPROV hProv = NULL; + + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) + { + return {}; + } + + BOOL hash_ok = FALSE; + HCRYPTPROV hHash = NULL; + switch (hashType) + { + case HashType::HashSha1: + hash_ok = CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash); + break; + case HashType::HashMd5: + hash_ok = CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash); + break; + case HashType::HashSha256: + hash_ok = CryptCreateHash(hProv, CALG_SHA_256, 0, 0, &hHash); + break; + } + + if (!hash_ok) + { + CryptReleaseContext(hProv, 0); + return {}; + } + + if (!CryptHashData(hHash, static_cast(data), static_cast(data_size), 0)) + { + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return {}; + } + + DWORD cbHashSize = 0, dwCount = sizeof(DWORD); + if (!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &dwCount, 0)) + { + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return {}; + } + + std::vector buffer(cbHashSize); + if (!CryptGetHashParam(hHash, HP_HASHVAL, reinterpret_cast(&buffer[0]), &cbHashSize, 0)) + { + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return {}; + } + + std::wostringstream oss; + oss.fill('0'); + oss.width(2); + + for (const auto& b : buffer) + { + oss << std::hex << static_cast(b); + } + + CryptDestroyHash(hHash); + CryptReleaseContext(hProv, 0); + return oss.str(); +} diff --git a/grepWinNP3/sktoolslib_mod/Hash.h b/grepWinNP3/sktoolslib_mod/Hash.h new file mode 100644 index 000000000..467b2916e --- /dev/null +++ b/grepWinNP3/sktoolslib_mod/Hash.h @@ -0,0 +1,33 @@ +// sktoolslib - common files for SK tools + +// Copyright (C) 2020 - Stefan Kueng + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// + +#pragma once +#include +#include +#include +#include + +enum class HashType +{ + HashSha1, + HashMd5, + HashSha256 +}; + +std::wstring GetHashText(const void* data, const size_t data_size, HashType hashType); diff --git a/grepWinNP3/sktoolslib_mod/Monitor.cpp b/grepWinNP3/sktoolslib_mod/Monitor.cpp new file mode 100644 index 000000000..554863313 --- /dev/null +++ b/grepWinNP3/sktoolslib_mod/Monitor.cpp @@ -0,0 +1,50 @@ +// sktoolslib - common files for SK tools + +// Copyright (C) 2020 - Stefan Kueng + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// + +#include "stdafx.h" +#include "Monitor.h" + +static BOOL CALLBACK MonitorEnum(HMONITOR hMon, HDC /*hdc*/, LPRECT lprcMonitor, LPARAM pData) +{ + MONITORINFOEX miex{}; + miex.cbSize = sizeof(MONITORINFOEX); + GetMonitorInfo(hMon, &miex); + + if (miex.dwFlags == DISPLAY_DEVICE_MIRRORING_DRIVER) + { + return TRUE; + } + + std::vector* pMonRects = reinterpret_cast*>(pData); + pMonRects->push_back(*lprcMonitor); + return TRUE; +} + +std::wstring GetMonitorSetupHash() +{ + std::vector monRects; + EnumDisplayMonitors(0, 0, MonitorEnum, (LPARAM)&monRects); + std::sort(monRects.begin(), monRects.end(), + [](const RECT& a, const RECT& b) -> bool { + if (a.left == b.left) + return a.top < b.top; + return a.left < b.left; + }); + return GetHashText(monRects.data(), monRects.size() * sizeof(RECT), HashType::HashMd5); +} diff --git a/grepWinNP3/sktoolslib_mod/Monitor.h b/grepWinNP3/sktoolslib_mod/Monitor.h new file mode 100644 index 000000000..e15e5ee2b --- /dev/null +++ b/grepWinNP3/sktoolslib_mod/Monitor.h @@ -0,0 +1,26 @@ +// sktoolslib - common files for SK tools + +// Copyright (C) 2020 - Stefan Kueng + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// + +#pragma once +#include "Hash.h" +#include +#include +#include + +std::wstring GetMonitorSetupHash(); diff --git a/grepWinNP3/sktoolslib_mod/Registry.h b/grepWinNP3/sktoolslib_mod/Registry.h index 6f6de5aa3..fc0456b8f 100644 --- a/grepWinNP3/sktoolslib_mod/Registry.h +++ b/grepWinNP3/sktoolslib_mod/Registry.h @@ -19,7 +19,6 @@ #pragma once #include #include -#include #include "shlwapi.h" #include "FormatMessageWrapper.h" @@ -432,8 +431,7 @@ void CRegTypedBase::write() HKEY hKey = nullptr; DWORD disp = 0; - WCHAR empty[1] = {L'\0'}; - if ((Base::LastError = RegCreateKeyEx(Base::m_base, Base::GetPlainString(Base::m_path), 0, empty, REG_OPTION_NON_VOLATILE, KEY_WRITE | Base::m_sam, nullptr, &hKey, &disp)) != ERROR_SUCCESS) + if ((Base::LastError = RegCreateKeyEx(Base::m_base, Base::GetPlainString(Base::m_path), 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_WRITE | Base::m_sam, nullptr, &hKey, &disp)) != ERROR_SUCCESS) { return; } @@ -982,7 +980,7 @@ public: ~CKeyList() { - for (typename TElements::iterator iter = elements.begin(), end = elements.end(); iter != end; ++iter) + for (auto iter = elements.begin(), end = elements.end(); iter != end; ++iter) { delete iter->second; } @@ -1021,19 +1019,17 @@ public: template const typename T::ValueT& CKeyList::GetDefault(int index) const { - typename TDefaults::const_iterator iter = defaults.find(index); + auto iter = defaults.find(index); return iter == defaults.end() ? defaultValue : iter->second; } template T& CKeyList::GetAt(int index) const { - typename TElements::iterator iter = elements.find(index); + auto iter = elements.find(index); if (iter == elements.end()) { - wchar_t buffer[10]; - _itot_s(index, buffer, 10); - typename T::StringT indexKey = key + _T('\\') + buffer; + typename T::StringT indexKey = key + '\\' + std::to_wstring(index); T* newElement = new T(indexKey, GetDefault(index), false, base); iter = elements.insert(std::make_pair(index, newElement)).first; diff --git a/grepWinNP3/sktoolslib_mod/RichStatusBar.cpp b/grepWinNP3/sktoolslib_mod/RichStatusBar.cpp index 77c6645a4..b3c53cc06 100644 --- a/grepWinNP3/sktoolslib_mod/RichStatusBar.cpp +++ b/grepWinNP3/sktoolslib_mod/RichStatusBar.cpp @@ -101,14 +101,14 @@ bool CRichStatusBar::SetPart(int index, const CRichStatusBarItem& item, bool red { m_parts.push_back(std::move(CRichStatusBarItem())); m_partwidths.push_back({}); - m_AnimVars.push_back(Animator::Instance().CreateAnimationVariable(0.0)); + m_AnimVars.push_back(Animator::Instance().CreateAnimationVariable(0.0, 0.0)); } } if (index < 0) { m_parts.push_back(item); m_partwidths.push_back({}); - m_AnimVars.push_back(Animator::Instance().CreateAnimationVariable(0.0)); + m_AnimVars.push_back(Animator::Instance().CreateAnimationVariable(0.0, 0.0)); index = (int)m_parts.size() - 1; } else if (replace) @@ -119,7 +119,7 @@ bool CRichStatusBar::SetPart(int index, const CRichStatusBarItem& item, bool red { m_parts.insert(m_parts.begin() + index - 1, item); m_partwidths.insert(m_partwidths.begin() + index - 1, {}); - m_AnimVars.insert(m_AnimVars.begin() + index - 1, Animator::Instance().CreateAnimationVariable(0.0)); + m_AnimVars.insert(m_AnimVars.begin() + index - 1, Animator::Instance().CreateAnimationVariable(0.0, 1.0)); } CalcRequestedWidths(index); if (redraw) @@ -365,22 +365,32 @@ LRESULT CRichStatusBar::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA { if ((m_hoverPart >= 0) && m_parts[m_hoverPart].hoverActive) { - auto transHot = Animator::Instance().CreateLinearTransition(0.3, 1.0); + auto transHot = Animator::Instance().CreateLinearTransition(m_AnimVars[m_hoverPart], 0.3, 1.0); auto storyBoard = Animator::Instance().CreateStoryBoard(); - storyBoard->AddTransition(m_AnimVars[m_hoverPart], transHot); + if (storyBoard && transHot) + { + storyBoard->AddTransition(m_AnimVars[m_hoverPart].m_animVar, transHot); Animator::Instance().RunStoryBoard(storyBoard, [this]() { InvalidateRect(*this, nullptr, false); }); + } + else + InvalidateRect(*this, nullptr, false); } if (oldHover >= 0) { - auto transHot = Animator::Instance().CreateLinearTransition(0.3, 0.0); + auto transHot = Animator::Instance().CreateLinearTransition(m_AnimVars[oldHover], 0.3, 0.0); auto storyBoard = Animator::Instance().CreateStoryBoard(); - storyBoard->AddTransition(m_AnimVars[oldHover], transHot); + if (storyBoard && transHot) + { + storyBoard->AddTransition(m_AnimVars[oldHover].m_animVar, transHot); Animator::Instance().RunStoryBoard(storyBoard, [this]() { InvalidateRect(*this, nullptr, false); }); } + else + InvalidateRect(*this, nullptr, false); + } } } break; @@ -393,12 +403,17 @@ LRESULT CRichStatusBar::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARA TrackMouseEvent(&tme); if (m_hoverPart >= 0) { - auto transHot = Animator::Instance().CreateLinearTransition(0.3, 0.0); + auto transHot = Animator::Instance().CreateLinearTransition(m_AnimVars[m_hoverPart], 0.3, 0.0); auto storyBoard = Animator::Instance().CreateStoryBoard(); - storyBoard->AddTransition(m_AnimVars[m_hoverPart], transHot); + if (storyBoard && transHot) + { + storyBoard->AddTransition(m_AnimVars[m_hoverPart].m_animVar, transHot); Animator::Instance().RunStoryBoard(storyBoard, [this]() { InvalidateRect(*this, nullptr, false); }); + } + else + InvalidateRect(*this, nullptr, false); } m_hoverPart = -1; } diff --git a/grepWinNP3/sktoolslib_mod/RichStatusBar.h b/grepWinNP3/sktoolslib_mod/RichStatusBar.h index e232d1aa2..f105f728c 100644 --- a/grepWinNP3/sktoolslib_mod/RichStatusBar.h +++ b/grepWinNP3/sktoolslib_mod/RichStatusBar.h @@ -138,5 +138,5 @@ private: int m_hoverPart; int m_height; bool m_drawGrip; - std::vector m_AnimVars; + std::vector m_AnimVars; }; diff --git a/grepWinNP3/sktoolslib_mod/TextFile.cpp b/grepWinNP3/sktoolslib_mod/TextFile.cpp index 334138d71..2ee12f439 100644 --- a/grepWinNP3/sktoolslib_mod/TextFile.cpp +++ b/grepWinNP3/sktoolslib_mod/TextFile.cpp @@ -550,7 +550,7 @@ bool CTextFile::CalculateLines(volatile LONG *bCancelled) long CTextFile::LineFromPosition(long pos) const { - auto lb = std::lower_bound(linepositions.begin(), linepositions.end(), static_cast(pos)); + auto lb = std::lower_bound(linepositions.begin(), linepositions.end(), (size_t)pos); auto lbLine = lb - linepositions.begin(); return long(lbLine + 1); } diff --git a/grepWinNP3/src/SearchDlg.cpp b/grepWinNP3/src/SearchDlg.cpp index c7ad68d42..8a94e9fd5 100644 --- a/grepWinNP3/src/SearchDlg.cpp +++ b/grepWinNP3/src/SearchDlg.cpp @@ -41,6 +41,7 @@ #include "Settings.h" #include "SysInfo.h" #include "Language.h" +#include "Monitor.h" #include "SmartHandle.h" #include "PathUtils.h" #include "DebugOutput.h" @@ -53,6 +54,7 @@ #ifdef NP3_ALLOW_UPDATE #include "TempFile.h" +#include "Monitor.h" #include "version.h" #endif @@ -535,9 +537,11 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara WINDOWPLACEMENT wpl = {0}; DWORD size = sizeof(wpl); + std::wstring winPosKey = L"windowpos_" + GetMonitorSetupHash(); if (bPortable) { - std::wstring sPos = g_iniFile.GetValue(L"global", L"windowpos", L""); + + std::wstring sPos = g_iniFile.GetValue(L"global", winPosKey.c_str(), L""); if (!sPos.empty()) { @@ -558,7 +562,7 @@ LRESULT CSearchDlg::DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara } else { - if (SHGetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowpos", REG_NONE, &wpl, &size) == ERROR_SUCCESS) + if (SHGetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", winPosKey.c_str(), REG_NONE, &wpl, &size) == ERROR_SUCCESS) SetWindowPlacement(*this, &wpl); else ShowWindow(*this, SW_SHOW); @@ -1714,6 +1718,7 @@ void CSearchDlg::SaveWndPosition() WINDOWPLACEMENT wpl = {0}; wpl.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(*this, &wpl); + std::wstring winPosKey = L"windowpos_" + GetMonitorSetupHash(); if (bPortable) { auto sPos = CStringUtils::Format(L"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", @@ -1721,11 +1726,11 @@ void CSearchDlg::SaveWndPosition() wpl.ptMinPosition.x, wpl.ptMinPosition.y, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, wpl.rcNormalPosition.left, wpl.rcNormalPosition.top, wpl.rcNormalPosition.right, wpl.rcNormalPosition.bottom); - g_iniFile.SetValue(L"global", L"windowpos", sPos.c_str()); + g_iniFile.SetValue(L"global", winPosKey.c_str(), sPos.c_str()); } else { - SHSetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", L"windowpos", REG_NONE, &wpl, sizeof(wpl)); + SHSetValue(HKEY_CURRENT_USER, L"Software\\grepWinNP3", winPosKey.c_str(), REG_NONE, &wpl, sizeof(wpl)); } } diff --git a/grepWinNP3/src/Theme.cpp b/grepWinNP3/src/Theme.cpp index 1c1de4e3a..671d5b51e 100644 --- a/grepWinNP3/src/Theme.cpp +++ b/grepWinNP3/src/Theme.cpp @@ -1271,7 +1271,7 @@ void DrawRect(LPRECT prc, HDC hdcPaint, Gdiplus::DashStyle dashStyle, Gdiplus::C std::unique_ptr myGraphics(new Gdiplus::Graphics(hdcPaint)); myGraphics->DrawRectangle(myPen.get(), (INT)prc->left, (INT)prc->top, - (INT)(prc->right - 1 - prc->left), (INT)(prc->bottom - 1 - prc->top)); + INT(prc->right - 1 - prc->left), INT(prc->bottom - 1 - prc->top)); } void DrawFocusRect(LPRECT prcFocus, HDC hdcPaint) diff --git a/grepWinNP3/src/last/version.h b/grepWinNP3/src/last/version.h index a1977f2ef..819d4f2b5 100644 --- a/grepWinNP3/src/last/version.h +++ b/grepWinNP3/src/last/version.h @@ -6,13 +6,13 @@ //#pragma message(__LOC__"Run the NAnt script to get proper version info") -#define FILEVER 2, 1, 4, 31 -#define PRODUCTVER 2, 1, 4, 31 -#define STRFILEVER "2.1.4.31\0" -#define STRPRODUCTVER "2.1.4.31\0" +#define FILEVER 2, 1, 4, 32 +#define PRODUCTVER 2, 1, 4, 32 +#define STRFILEVER "2.1.4.32\0" +#define STRPRODUCTVER "2.1.4.32\0" #define GREPWIN_VERMAJOR 2 #define GREPWIN_VERMINOR 1 #define GREPWIN_VERMICRO 4 -#define GREPWIN_VERBUILD 31 -#define GREPWIN_VERDATE "2020-11-16" +#define GREPWIN_VERBUILD 32 +#define GREPWIN_VERDATE "2020-12-14"