View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000801 | Far Manager 1.7x | Plugins API | public | 2009-03-26 16:36 | 2009-11-03 19:16 |
Reporter | Roy | Assigned To | vskirdin | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Fixed in Version | 1.75 | ||||
Summary | 0000801: 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 | Очень прошу пофиксить, у меня на эту функу плагин завязан. | ||||
Tags | No tags attached. | ||||
Build | 2412 | ||||
|
ты лечение рассказал, а в чем заключается прикол - нет |
|
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 понятно будет. :) |
|
И, кстати, скорей всего, наблюдается и обратный прикол: если на клаве зажать Ctrl, а из плагина дернуть FarInputRecordToKey с INPUT_RECORD = A, то вернет код для CtrlA :) |
|
в 2.0 будет в билде 838 в 1.75 чуть погодя |
Date Modified | Username | Field | Change |
---|---|---|---|
2009-03-26 16:36 | Roy | New Issue | |
2009-03-26 20:05 | vskirdin | Note Added: 0002835 | |
2009-03-26 21:14 | Roy | Note Added: 0002836 | |
2009-03-26 21:16 | Roy | Note Edited: 0002836 | |
2009-03-26 21:18 | Roy | Note Added: 0002837 | |
2009-03-27 08:49 | vskirdin | Status | new => assigned |
2009-03-27 08:49 | vskirdin | Assigned To | => vskirdin |
2009-03-27 09:06 | vskirdin | Note Added: 0002838 | |
2009-03-27 09:06 | vskirdin | Status | assigned => feedback |
2009-11-03 19:16 | alexy | Build | => 2412 |
2009-11-03 19:16 | alexy | Status | feedback => closed |
2009-11-03 19:16 | alexy | Fixed in Version | => 1.75 |
2009-11-03 19:16 | alexy | Resolution | open => fixed |