Repository :
https://github.com/FarGroup/FarManager
On branch : master
Link :
https://github.com/FarGroup/FarManager/commit/453e390bdd78ac84a0b91c96f6adf4dd199e5d63
>---------------------------------------------------------------
commit 453e390bdd78ac84a0b91c96f6adf4dd199e5d63
Author: Alex Alabuzhev <
alab...@gmail.com>
Date: Sat Jan 17 23:14:43 2026 +0000
Remove redundant menu redraws on CtrlUp/Down
>---------------------------------------------------------------
453e390bdd78ac84a0b91c96f6adf4dd199e5d63
far/filetype.cpp | 3 +++
far/shortcuts.cpp | 8 ++++++--
far/usermenu.cpp | 6 +++++-
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/far/filetype.cpp b/far/filetype.cpp
index 580114f1a..5cc50ca74 100644
--- a/far/filetype.cpp
+++ b/far/filetype.cpp
@@ -342,6 +342,8 @@ bool ProcessExternal(string_view const Command, string_view const Name, string_v
static auto FillFileTypesMenu(VMenu2* TypesMenu, int MenuPos)
{
+ SCOPED_ACTION(Dialog::suppress_redraw)(TypesMenu);
+
struct data_item
{
unsigned long long Id;
@@ -637,6 +639,7 @@ void EditFileTypes()
if (Changed)
{
Changed = false;
+ // BUGBUG update dynamically instead of full refill
NumLine = FillFileTypesMenu(TypesMenu.get(), MenuPos);
}
return KeyProcessed;
diff --git a/far/shortcuts.cpp b/far/shortcuts.cpp
index 80b55fcb5..9bbf22720 100644
--- a/far/shortcuts.cpp
+++ b/far/shortcuts.cpp
@@ -223,6 +223,8 @@ static string MakeName(const Shortcuts::shortcut& Item)
static void FillMenu(VMenu2& Menu, std::list<Shortcuts::shortcut>& List, bool const raw_mode)
{
+ SCOPED_ACTION(Dialog::suppress_redraw)(&Menu);
+
// Don't listen to static analysers - List MUST NOT be const. We store non-const iterators in type-erased UserData for further usage.
static_assert(!std::is_const_v<std::remove_reference_t<decltype(List)>>);
@@ -425,7 +427,8 @@ std::variant<std::list<Shortcuts::shortcut>::const_iterator, size_t> Shortcuts::
if (Iterator && *Iterator != m_Items.begin())
{
m_Items.splice(std::prev(*Iterator), m_Items, *Iterator);
- FillMenu(*FolderList, m_Items, Raw);
+ using std::ranges::swap;
+ swap(FolderList->at(ItemPos), FolderList->at(ItemPos - 1));
FolderList->SetSelectPos(ItemPos - 1);
m_Changed = true;
}
@@ -436,7 +439,8 @@ std::variant<std::list<Shortcuts::shortcut>::const_iterator, size_t> Shortcuts::
if (Iterator && std::next(*Iterator) != m_Items.end())
{
m_Items.splice(*Iterator, m_Items, std::next(*Iterator));
- FillMenu(*FolderList, m_Items, Raw);
+ using std::ranges::swap;
+ swap(FolderList->at(ItemPos), FolderList->at(ItemPos + 1));
FolderList->SetSelectPos(ItemPos + 1);
m_Changed = true;
}
diff --git a/far/usermenu.cpp b/far/usermenu.cpp
index 08c31a3b9..3206ec2d3 100644
--- a/far/usermenu.cpp
+++ b/far/usermenu.cpp
@@ -541,6 +541,8 @@ using fkey_to_pos_map = std::array<int, 24>;
// заполнение меню
static void FillUserMenu(VMenu2& FarUserMenu, UserMenu::menu_container& Menu, int MenuPos, fkey_to_pos_map& FuncPos, const subst_context& SubstContext)
{
+ SCOPED_ACTION(Dialog::suppress_redraw)(&FarUserMenu);
+
FarUserMenu.clear();
FuncPos.fill(-1);
int NumLines = -1;
@@ -672,6 +674,7 @@ int UserMenu::ProcessSingleMenu(std::list<UserMenuItem>& Menu, int MenuPos, std:
if (CurrentMenuItem)
{
DeleteMenuRecord(Menu, *CurrentMenuItem);
+ // BUGBUG update dynamically instead of full refill
FillUserMenu(*UserMenu, Menu, MenuPos, FuncPos, Context);
}
break;
@@ -686,6 +689,7 @@ int UserMenu::ProcessSingleMenu(std::list<UserMenuItem>& Menu, int MenuPos, std:
break;
EditMenu(Menu, CurrentMenuItem, IsNew);
+ // BUGBUG update dynamically instead of full refill
FillUserMenu(*UserMenu, Menu, MenuPos, FuncPos, Context);
break;
}
@@ -718,7 +722,7 @@ int UserMenu::ProcessSingleMenu(std::list<UserMenuItem>& Menu, int MenuPos, std:
++MenuPos;
}
node_swap(Menu, *CurrentMenuItem, Other);
-
+ // BUGBUG update dynamically instead of full refill
FillUserMenu(*UserMenu, Menu, MenuPos, FuncPos, Context);
}
break;