View Issue Details

IDProjectCategoryView StatusLast Update
0000801Far Manager 1.7xPlugins APIpublic2009-11-03 22:16
ReporterRoyAssigned Tovskirdin 
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version 
Target VersionFixed in Version1.75 
Summary0000801: FarInputRecordToKey() игнорирует dwControlKeyState
DescriptionОна пытается состояние модификаторов определять по их предыдущим нажатиям, но не по переданному значению - а это неправильно.

Посмотрел исходники:
keyboard.cpp
int WINAPI InputRecordToKey(const INPUT_RECORD *r)
{
  if(r)
  {
    INPUT_RECORD Rec=*r;
    return (int)CalcKeyCode(&Rec,TRUE); //здесь должно быть FALSE - это не RealKey
  }
  return KEY_NONE;
}

Попробовал пропатчить в 1.7.2545 этот байт - все ок.
Additional InformationОчень прошу пофиксить, у меня на эту функу плагин завязан.
TagsNo tags attached.
Build2412

Activities

vskirdin

2009-03-26 23:05

administrator   bugnote:0002835

ты лечение рассказал, а в чем заключается прикол - нет

Roy

2009-03-27 00:14

reporter   bugnote:0002836

Last edited: 2009-03-27 00:16

1) Функция FSF.FarInputRecordToKey конвертирует код клавиши из INPUT_RECORD во внутренний формат представления клавиш FAR'а.
2) В INPUT_RECORD есть dwControlKeyState - в нем хранится состояние модификаторов на момент нажатия кнопки - RIGHT_ALT_PRESSED, LEFT_ALT_PRESSED и прочая.
3) Far умеет приводить INPUT_RECORD к KEY_* 2-мя способами:
а) брать значение модификаторов из dwControlKeyState
б) брать значение модификаторов из предыдущих INPUT_RECORD - пришедших с ReadConsoleInput
4) (Насколько я понял логику) Выбор варианта зависит от значение RealKey в
DWORD CalcKeyCode(INPUT_RECORD *rec,int RealKey,int *NotMacros)
а) если RealKey = TRUE, то это реальная кнопка, нажатия модификаторов нам уже приходили и сохранены, можно dwControlKeyState не парсить
б) если RealKey = FALSE, то в действительности могло ничего не нажиматься, нужно разобрать dwControlKeyState
5) Из int WINAPI InputRecordToKey(const INPUT_RECORD *r) передается неправильное значение.

В результате - посылаем INPUT_RECORD соответствующую CtrlA, а InputRecordToKey() уверена, что это просто A.
Вот в этом и прикол. Честно говоря, думал, что и из Summary понятно будет. :)

Roy

2009-03-27 00:18

reporter   bugnote:0002837

И, кстати, скорей всего, наблюдается и обратный прикол:
если на клаве зажать Ctrl, а из плагина дернуть FarInputRecordToKey с INPUT_RECORD = A, то вернет код для CtrlA :)

vskirdin

2009-03-27 12:06

administrator   bugnote:0002838

в 2.0 будет в билде 838
в 1.75 чуть погодя

Issue History

Date Modified Username Field Change
2009-03-26 19:36 Roy New Issue
2009-03-26 23:05 vskirdin Note Added: 0002835
2009-03-27 00:14 Roy Note Added: 0002836
2009-03-27 00:16 Roy Note Edited: 0002836
2009-03-27 00:18 Roy Note Added: 0002837
2009-03-27 11:49 vskirdin Status new => assigned
2009-03-27 11:49 vskirdin Assigned To => vskirdin
2009-03-27 12:06 vskirdin Note Added: 0002838
2009-03-27 12:06 vskirdin Status assigned => feedback
2009-11-03 22:16 alexy Build => 2412
2009-11-03 22:16 alexy Status feedback => closed
2009-11-03 22:16 alexy Fixed in Version => 1.75
2009-11-03 22:16 alexy Resolution open => fixed