chore: initial commit (extracted from Launchers monorepo)
Plugin: ns7zip v2.0.0 Architectures: x86-ansi, x86-unicode, amd64-unicode License: LGPL-2.1-or-later
This commit is contained in:
@@ -0,0 +1,453 @@
|
||||
// SettingsPage.cpp
|
||||
|
||||
#include "StdAfx.h"
|
||||
|
||||
#include <CommCtrl.h>
|
||||
|
||||
// #include "../../../Common/IntToString.h"
|
||||
// #include "../../../Common/StringConvert.h"
|
||||
#include "../../../Common/StringToInt.h"
|
||||
|
||||
#ifndef UNDER_CE
|
||||
#include "../../../Windows/ErrorMsg.h"
|
||||
#include "../../../Windows/MemoryLock.h"
|
||||
#include "../../../Windows/System.h"
|
||||
#endif
|
||||
|
||||
#include "../Explorer/MyMessages.h"
|
||||
|
||||
#include "../Common/ZipRegistry.h"
|
||||
|
||||
#include "HelpUtils.h"
|
||||
#include "LangUtils.h"
|
||||
#include "RegistryUtils.h"
|
||||
#include "SettingsPage.h"
|
||||
#include "SettingsPageRes.h"
|
||||
|
||||
using namespace NWindows;
|
||||
|
||||
#ifdef Z7_LANG
|
||||
static const UInt32 kLangIDs[] =
|
||||
{
|
||||
IDX_SETTINGS_SHOW_DOTS,
|
||||
IDX_SETTINGS_SHOW_REAL_FILE_ICONS,
|
||||
IDX_SETTINGS_SHOW_SYSTEM_MENU,
|
||||
IDX_SETTINGS_FULL_ROW,
|
||||
IDX_SETTINGS_SHOW_GRID,
|
||||
IDX_SETTINGS_SINGLE_CLICK,
|
||||
IDX_SETTINGS_ALTERNATIVE_SELECTION,
|
||||
IDX_SETTINGS_LARGE_PAGES,
|
||||
IDT_MEM_USAGE_EXTRACT
|
||||
// , IDT_COMPRESS_MEMORY
|
||||
};
|
||||
#endif
|
||||
|
||||
#define kSettingsTopic "FM/options.htm#settings"
|
||||
|
||||
extern bool IsLargePageSupported();
|
||||
|
||||
/*
|
||||
static void AddMemSize(UString &res, UInt64 size, bool needRound = false)
|
||||
{
|
||||
char c;
|
||||
unsigned moveBits = 0;
|
||||
if (needRound)
|
||||
{
|
||||
UInt64 rn = 0;
|
||||
if (size >= (1 << 31))
|
||||
rn = (1 << 28) - 1;
|
||||
UInt32 kRound = (1 << 20) - 1;
|
||||
if (rn < kRound)
|
||||
rn = kRound;
|
||||
size += rn;
|
||||
size &= ~rn;
|
||||
}
|
||||
if (size >= ((UInt64)1 << 31) && (size & 0x3FFFFFFF) == 0)
|
||||
{ moveBits = 30; c = 'G'; }
|
||||
else
|
||||
{ moveBits = 20; c = 'M'; }
|
||||
res.Add_UInt64(size >> moveBits);
|
||||
res.Add_Space();
|
||||
if (moveBits != 0)
|
||||
res += c;
|
||||
res += 'B';
|
||||
}
|
||||
|
||||
|
||||
int CSettingsPage::AddMemComboItem(UInt64 size, UInt64 percents, bool isDefault)
|
||||
{
|
||||
UString sUser;
|
||||
UString sRegistry;
|
||||
if (size == 0)
|
||||
{
|
||||
UString s;
|
||||
s.Add_UInt64(percents);
|
||||
s += '%';
|
||||
if (isDefault)
|
||||
sUser = "* ";
|
||||
else
|
||||
sRegistry = s;
|
||||
sUser += s;
|
||||
}
|
||||
else
|
||||
{
|
||||
AddMemSize(sUser, size);
|
||||
sRegistry = sUser;
|
||||
for (;;)
|
||||
{
|
||||
int pos = sRegistry.Find(L' ');
|
||||
if (pos < 0)
|
||||
break;
|
||||
sRegistry.Delete(pos);
|
||||
}
|
||||
if (!sRegistry.IsEmpty())
|
||||
if (sRegistry.Back() == 'B')
|
||||
sRegistry.DeleteBack();
|
||||
}
|
||||
const int index = (int)_memCombo.AddString(sUser);
|
||||
_memCombo.SetItemData(index, _memLimitStrings.Size());
|
||||
_memLimitStrings.Add(sRegistry);
|
||||
return index;
|
||||
}
|
||||
*/
|
||||
|
||||
bool CSettingsPage::OnInit()
|
||||
{
|
||||
_initMode = true;
|
||||
_wasChanged = false;
|
||||
_largePages_wasChanged = false;
|
||||
_memx_wasChanged = false;
|
||||
/*
|
||||
_wasChanged_MemLimit = false;
|
||||
_memLimitStrings.Clear();
|
||||
_memCombo.Attach(GetItem(IDC_SETTINGS_MEM));
|
||||
*/
|
||||
|
||||
#ifdef Z7_LANG
|
||||
LangSetDlgItems(*this, kLangIDs, Z7_ARRAY_SIZE(kLangIDs));
|
||||
#endif
|
||||
|
||||
CFmSettings st;
|
||||
st.Load();
|
||||
|
||||
CheckButton(IDX_SETTINGS_SHOW_DOTS, st.ShowDots);
|
||||
CheckButton(IDX_SETTINGS_SHOW_REAL_FILE_ICONS, st.ShowRealFileIcons);
|
||||
CheckButton(IDX_SETTINGS_FULL_ROW, st.FullRow);
|
||||
CheckButton(IDX_SETTINGS_SHOW_GRID, st.ShowGrid);
|
||||
CheckButton(IDX_SETTINGS_SINGLE_CLICK, st.SingleClick);
|
||||
CheckButton(IDX_SETTINGS_ALTERNATIVE_SELECTION, st.AlternativeSelection);
|
||||
// CheckButton(IDX_SETTINGS_UNDERLINE, st.Underline);
|
||||
|
||||
CheckButton(IDX_SETTINGS_SHOW_SYSTEM_MENU, st.ShowSystemMenu);
|
||||
|
||||
if (IsLargePageSupported())
|
||||
CheckButton(IDX_SETTINGS_LARGE_PAGES, ReadLockMemoryEnable());
|
||||
else
|
||||
EnableItem(IDX_SETTINGS_LARGE_PAGES, false);
|
||||
|
||||
|
||||
/*
|
||||
NCompression::CMemUse mu;
|
||||
bool needSetCur = NCompression::MemLimit_Load(mu);
|
||||
UInt64 curMemLimit;
|
||||
{
|
||||
AddMemComboItem(0, 90, true);
|
||||
_memCombo.SetCurSel(0);
|
||||
}
|
||||
if (mu.IsPercent)
|
||||
{
|
||||
const int index = AddMemComboItem(0, mu.Val);
|
||||
_memCombo.SetCurSel(index);
|
||||
needSetCur = false;
|
||||
}
|
||||
{
|
||||
_ramSize = (size_t)sizeof(size_t) << 29;
|
||||
_ramSize_Defined = NSystem::GetRamSize(_ramSize);
|
||||
UString s;
|
||||
if (_ramSize_Defined)
|
||||
{
|
||||
s += "/ ";
|
||||
AddMemSize(s, _ramSize, true);
|
||||
}
|
||||
SetItemText(IDT_SETTINGS_MEM_RAM, s);
|
||||
|
||||
curMemLimit = mu.GetBytes(_ramSize);
|
||||
|
||||
// size = 100 << 20; // for debug only;
|
||||
for (unsigned i = (27) * 2;; i++)
|
||||
{
|
||||
UInt64 size = (UInt64)(2 + (i & 1)) << (i / 2);
|
||||
if (i > (20 + sizeof(size_t) * 3 * 1 - 1) * 2)
|
||||
size = (UInt64)(Int64)-1;
|
||||
if (needSetCur && (size >= curMemLimit))
|
||||
{
|
||||
const int index = AddMemComboItem(curMemLimit);
|
||||
_memCombo.SetCurSel(index);
|
||||
needSetCur = false;
|
||||
if (size == curMemLimit)
|
||||
continue;
|
||||
}
|
||||
if (size == (UInt64)(Int64)-1)
|
||||
break;
|
||||
AddMemComboItem(size);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// EnableSubItems();
|
||||
|
||||
|
||||
{
|
||||
size_t ramSize = (size_t)sizeof(size_t) << 29;
|
||||
const bool ramSize_defined = NWindows::NSystem::GetRamSize(ramSize);
|
||||
// ramSize *= 10; // for debug
|
||||
UInt32 ramSize_GB = (UInt32)(((UInt64)ramSize + (1u << 29)) >> 30);
|
||||
if (ramSize_GB == 0)
|
||||
ramSize_GB = 1;
|
||||
UString s ("GB");
|
||||
if (ramSize_defined)
|
||||
{
|
||||
s += " / ";
|
||||
s.Add_UInt64(ramSize_GB);
|
||||
s += " GB (RAM)";
|
||||
}
|
||||
SetItemText(IDT_SETTINGS_MEM_GB, s);
|
||||
|
||||
const UINT valMin = 1;
|
||||
UINT valMax = 64; // 64GB for RAR7
|
||||
if (ramSize_defined /* && ramSize_GB > valMax */)
|
||||
{
|
||||
const UINT k_max_val = 1u << 14;
|
||||
if (ramSize_GB >= k_max_val)
|
||||
valMax = k_max_val;
|
||||
else if (ramSize_GB > 1)
|
||||
valMax = (UINT)ramSize_GB - 1;
|
||||
else
|
||||
valMax = 1;
|
||||
}
|
||||
|
||||
UInt32 limit = NExtract::Read_LimitGB();
|
||||
if (limit != 0 && limit != (UInt32)(Int32)-1)
|
||||
CheckButton(IDX_SETTINGS_MEM_SET, true);
|
||||
else
|
||||
{
|
||||
limit = 4;
|
||||
EnableSpin(false);
|
||||
}
|
||||
SendItemMessage(IDC_SETTINGS_MEM_SPIN, UDM_SETRANGE, 0, MAKELPARAM(valMax, valMin)); // Sets the controls direction
|
||||
// UDM_SETPOS doesn't set value larger than max value (valMax) of range:
|
||||
SendItemMessage(IDC_SETTINGS_MEM_SPIN, UDM_SETPOS, 0, limit);
|
||||
s.Empty();
|
||||
s.Add_UInt32(limit);
|
||||
SetItemText(IDE_SETTINGS_MEM_SPIN_EDIT, s);
|
||||
}
|
||||
|
||||
_initMode = false;
|
||||
return CPropertyPage::OnInit();
|
||||
}
|
||||
|
||||
|
||||
void CSettingsPage::EnableSpin(bool enable)
|
||||
{
|
||||
EnableItem(IDC_SETTINGS_MEM_SPIN, enable);
|
||||
EnableItem(IDE_SETTINGS_MEM_SPIN_EDIT, enable);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void CSettingsPage::EnableSubItems()
|
||||
{
|
||||
EnableItem(IDX_SETTINGS_UNDERLINE, IsButtonCheckedBool(IDX_SETTINGS_SINGLE_CLICK));
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
static void AddSize_MB(UString &s, UInt64 size)
|
||||
{
|
||||
s.Add_UInt64((size + (1 << 20) - 1) >> 20);
|
||||
s += " MB";
|
||||
}
|
||||
*/
|
||||
|
||||
LONG CSettingsPage::OnApply()
|
||||
{
|
||||
if (_wasChanged)
|
||||
{
|
||||
CFmSettings st;
|
||||
st.ShowDots = IsButtonCheckedBool(IDX_SETTINGS_SHOW_DOTS);
|
||||
st.ShowRealFileIcons = IsButtonCheckedBool(IDX_SETTINGS_SHOW_REAL_FILE_ICONS);
|
||||
st.FullRow = IsButtonCheckedBool(IDX_SETTINGS_FULL_ROW);
|
||||
st.ShowGrid = IsButtonCheckedBool(IDX_SETTINGS_SHOW_GRID);
|
||||
st.SingleClick = IsButtonCheckedBool(IDX_SETTINGS_SINGLE_CLICK);
|
||||
st.AlternativeSelection = IsButtonCheckedBool(IDX_SETTINGS_ALTERNATIVE_SELECTION);
|
||||
// st.Underline = IsButtonCheckedBool(IDX_SETTINGS_UNDERLINE);
|
||||
|
||||
st.ShowSystemMenu = IsButtonCheckedBool(IDX_SETTINGS_SHOW_SYSTEM_MENU);
|
||||
|
||||
st.Save();
|
||||
_wasChanged = false;
|
||||
}
|
||||
|
||||
#ifndef UNDER_CE
|
||||
if (_largePages_wasChanged)
|
||||
{
|
||||
if (IsLargePageSupported())
|
||||
{
|
||||
const bool enable = IsButtonCheckedBool(IDX_SETTINGS_LARGE_PAGES);
|
||||
NSecurity::EnablePrivilege_LockMemory(enable);
|
||||
SaveLockMemoryEnable(enable);
|
||||
}
|
||||
_largePages_wasChanged = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (_memx_wasChanged)
|
||||
{
|
||||
UInt32 val = (UInt32)(Int32)-1;
|
||||
if (IsButtonCheckedBool(IDX_SETTINGS_MEM_SET))
|
||||
{
|
||||
UString s;
|
||||
GetItemText(IDE_SETTINGS_MEM_SPIN_EDIT, s);
|
||||
const wchar_t *end;
|
||||
val = ConvertStringToUInt32(s.Ptr(), &end);
|
||||
if (s.IsEmpty() || *end != 0 || val > (1u << 30))
|
||||
{
|
||||
// L"Incorrect value"
|
||||
ShowErrorMessage(*this, NError::MyFormatMessage(E_INVALIDARG));
|
||||
return PSNRET_INVALID;
|
||||
}
|
||||
}
|
||||
NExtract::Save_LimitGB(val);
|
||||
_memx_wasChanged = false;
|
||||
}
|
||||
|
||||
/*
|
||||
if (_wasChanged_MemLimit)
|
||||
{
|
||||
const unsigned index = (int)_memCombo.GetItemData_of_CurSel();
|
||||
const UString str = _memLimitStrings[index];
|
||||
|
||||
bool needSave = true;
|
||||
|
||||
NCompression::CMemUse mu;
|
||||
|
||||
if (_ramSize_Defined)
|
||||
mu.Parse(str);
|
||||
if (mu.IsDefined)
|
||||
{
|
||||
const UInt64 usage64 = mu.GetBytes(_ramSize);
|
||||
if (_ramSize <= usage64)
|
||||
{
|
||||
UString s2 = LangString(IDT_COMPRESS_MEMORY);
|
||||
if (s2.IsEmpty())
|
||||
GetItemText(IDT_COMPRESS_MEMORY, s2);
|
||||
UString s;
|
||||
|
||||
s += "The selected value is not safe for system performance.";
|
||||
s.Add_LF();
|
||||
s += "The memory consumption for compression operation will exceed RAM size.";
|
||||
s.Add_LF();
|
||||
s.Add_LF();
|
||||
AddSize_MB(s, usage64);
|
||||
|
||||
if (!s2.IsEmpty())
|
||||
{
|
||||
s += " : ";
|
||||
s += s2;
|
||||
}
|
||||
|
||||
s.Add_LF();
|
||||
AddSize_MB(s, _ramSize);
|
||||
s += " : RAM";
|
||||
|
||||
s.Add_LF();
|
||||
s.Add_LF();
|
||||
s += "Are you sure you want set that unsafe value for memory usage?";
|
||||
|
||||
int res = MessageBoxW(*this, s, L"7-Zip", MB_YESNOCANCEL | MB_ICONQUESTION);
|
||||
if (res != IDYES)
|
||||
needSave = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (needSave)
|
||||
{
|
||||
NCompression::MemLimit_Save(str);
|
||||
_wasChanged_MemLimit = false;
|
||||
}
|
||||
else
|
||||
return PSNRET_INVALID_NOCHANGEPAGE;
|
||||
}
|
||||
*/
|
||||
|
||||
return PSNRET_NOERROR;
|
||||
}
|
||||
|
||||
void CSettingsPage::OnNotifyHelp()
|
||||
{
|
||||
ShowHelpWindow(kSettingsTopic);
|
||||
}
|
||||
|
||||
bool CSettingsPage::OnCommand(unsigned code, unsigned itemID, LPARAM param)
|
||||
{
|
||||
if (!_initMode)
|
||||
{
|
||||
if (code == EN_CHANGE && itemID == IDE_SETTINGS_MEM_SPIN_EDIT)
|
||||
{
|
||||
_memx_wasChanged = true;
|
||||
Changed();
|
||||
}
|
||||
/*
|
||||
if (code == CBN_SELCHANGE)
|
||||
{
|
||||
switch (itemID)
|
||||
{
|
||||
case IDC_SETTINGS_MEM:
|
||||
{
|
||||
_wasChanged_MemLimit = true;
|
||||
Changed();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
return CPropertyPage::OnCommand(code, itemID, param);
|
||||
}
|
||||
|
||||
bool CSettingsPage::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
|
||||
{
|
||||
switch (buttonID)
|
||||
{
|
||||
case IDX_SETTINGS_SINGLE_CLICK:
|
||||
/*
|
||||
EnableSubItems();
|
||||
break;
|
||||
*/
|
||||
case IDX_SETTINGS_SHOW_DOTS:
|
||||
case IDX_SETTINGS_SHOW_SYSTEM_MENU:
|
||||
case IDX_SETTINGS_SHOW_REAL_FILE_ICONS:
|
||||
case IDX_SETTINGS_FULL_ROW:
|
||||
case IDX_SETTINGS_SHOW_GRID:
|
||||
case IDX_SETTINGS_ALTERNATIVE_SELECTION:
|
||||
_wasChanged = true;
|
||||
break;
|
||||
|
||||
case IDX_SETTINGS_LARGE_PAGES:
|
||||
_largePages_wasChanged = true;
|
||||
break;
|
||||
|
||||
case IDX_SETTINGS_MEM_SET:
|
||||
{
|
||||
_memx_wasChanged = true;
|
||||
EnableSpin(IsButtonCheckedBool(IDX_SETTINGS_MEM_SET));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
return CPropertyPage::OnButtonClicked(buttonID, buttonHWND);
|
||||
}
|
||||
|
||||
Changed();
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user