При открытии комбобокса выбирается неверный элемент

Здесь можно сообщить о найденных багах в Far.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 14582
Joined: Wed 27 Apr, 2005 20:42
Location: github.com/FarManagerLegacy
Has thanked: 92 times
Been thanked: 514 times
Contact:

При открытии комбобокса выбирается неверный элемент

Post by John Doe »

Элементы комбобокса:

Code: Select all

test1
test2
test
Если значение самого комбобокса - test, то открыв его я ожидаю что активен будет соответствующий элемент.
В реальности активен оказывается первый.

Проблема коренится в функции int VMenu::FindItem (в апи - также DM_LISTFINDSTRING)

Code: Select all

			if (Flags&LIFIND_EXACTMATCH)
			{
				if (equal_icase(strTmpBuf, Pattern))
					return static_cast<int>(I);
			}
			else
			{
				if (CmpName(Pattern, strTmpBuf, true))
					return static_cast<int>(I);
			}
Предлагаемое исправление:

Code: Select all

diff --git a/far/vmenu.cpp b/far/vmenu.cpp
index d69a4a0ec..dd8ece748 100644
--- a/far/vmenu.cpp
+++ b/far/vmenu.cpp
@@ -3296,7 +3296,7 @@ int VMenu::FindItem(int StartIndex, string_view const Pattern, unsigned long lon
 
 			if (Flags&LIFIND_EXACTMATCH)
 			{
-				if (starts_with_icase(strTmpBuf, Pattern))
+				if (equal_icase(strTmpBuf, Pattern))
 					return static_cast<int>(I);
 			}
 			else
Это должно решить проблему с комбобоксом, и не затронуть больше ничего в фаре, поскольку LIFIND_EXACTMATCH используется в единственном месте.

Что касается апи плагинов, то само название флага намекает на полное совпадение.
Тем не менее в Энциклопедии о флаге LIFIND_EXACTMATCH дословно сказано следующее:
LIFIND_EXACTMATCH: Поле Pattern не является шаблоном - рассматривать как обычную подстроку поиска.
Это тоже не соответствует текущему поведению, сейчас совпадение подстроки ищется строго "с начала".

Учитывая разброд и шатание, предлагаю применить исправление на equal_icase, а в случае необходимости можно добавить флаги, задающие и иное поведение.
https://t.me/FarManager — Telegram чат
Post Reply

Return to “Глюки и баги”