View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001832 | Far Manager | Plugins API | public | 2011-07-10 22:55 | 2015-08-09 13:26 |
| Reporter | Maximus | Assigned To | vskirdin | ||
| Priority | normal | Severity | minor | Reproducibility | have not tried |
| Status | assigned | Resolution | reopened | ||
| Product Version | 3.0 | ||||
| Fixed in Version | 3.0 | ||||
| Summary | 0001832: Проблема FarNameToInputRecord / FarInputRecordToName | ||||
| Description | Результат функций не соответствует друг-другу. "MsWheelUp" -> INPUT_RECORD -> "Break" | ||||
| Steps To Reproduce | { INPUT_RECORD r = {}; LPCWSTR pszKey = L"MsWheelUp"; BOOL b1 = FarNameToInputRecord(pszKey, &r); wchar_t szDbg[128] = {}; size_t nDbgSize = FarInputRecordToName(&r, szDbg, ARRAYSIZE(szDbg)); int nCmp = lstrcmpi(pszKey, szDbg); _ASSERTE(b1 && nDbgSize && (nCmp==0)); } | ||||
| Tags | No tags attached. | ||||
| Build | 2241 | ||||
|
|
"RAltF" -> INPUT_RECORD -> "AltF" "RCtrlR" -> INPUT_RECORD -> "CtrlR" |
|
|
Ндя... с MsWheelUp (и еже с ним) прикольно получается. особенно если учесть, что MsWheelUp это мышиное событие, а FarNameToInputRecord все гонит в KEY_EVENT :-) |
|
|
проверь: http://skirda-file.googlecode.com/files/mantis%230001832.7z |
|
|
Хм, стало немного лучше. Похоже, FarNameToInputRecord теперь отрабатывает правильно. Но! Опять проверяя пару FarNameToInputRecord ==> FarInputRecordToName Получаем следующее "MsWheelUp" ==> "" (\x01) "RAltF" ==> "AltF" "RAltBS" ==> "AltBS" "RCtrlR" ==> "CtrlR" "CtrlBreak" ==> "Break" Исходники фара пока не патчил, это на собранном бинарнике из mantis#0001832.7z |
|
|
> Опять проверяя пару FarNameToInputRecord ==> FarInputRecordToName приаттач сюда "готовую проверялку"... |
|
|
|
|
|
Keyboard.110731.diff (14,947 bytes)
Index: keyboard.cpp
===================================================================
--- keyboard.cpp (revision 6491)
+++ keyboard.cpp (working copy)
@@ -504,10 +504,15 @@
Rec->Event.KeyEvent.wVirtualScanCode = MapVirtualKey(Rec->Event.KeyEvent.wVirtualKeyCode,MAPVK_VK_TO_VSC);
//BUGBUG
- Rec->Event.KeyEvent.uChar.UnicodeChar=MapVirtualKey(Rec->Event.KeyEvent.wVirtualKeyCode,MAPVK_VK_TO_CHAR);;
+ Rec->Event.KeyEvent.uChar.UnicodeChar=MapVirtualKey(Rec->Event.KeyEvent.wVirtualKeyCode,MAPVK_VK_TO_CHAR);
//BUGBUG
- Rec->Event.KeyEvent.dwControlKeyState=(dwControlState&PKF_SHIFT?SHIFT_PRESSED:0)|(dwControlState&PKF_ALT?LEFT_ALT_PRESSED:0)|(dwControlState&PKF_CONTROL?LEFT_CTRL_PRESSED:0);
+ Rec->Event.KeyEvent.dwControlKeyState=
+ (dwControlState&PKF_SHIFT?SHIFT_PRESSED:0)|
+ (dwControlState&PKF_ALT?LEFT_ALT_PRESSED:0)|
+ (dwControlState&PKF_RALT?RIGHT_ALT_PRESSED:0)|
+ (dwControlState&PKF_RCONTROL?RIGHT_CTRL_PRESSED:0)|
+ (dwControlState&PKF_CONTROL?LEFT_CTRL_PRESSED:0);
}
}
@@ -1946,13 +1951,19 @@
int TranslateKeyToVK(int Key,int &VirtKey,int &ControlState,INPUT_RECORD *Rec)
{
- DWORD FKey =Key&0x0003FFFF;
- DWORD FShift=Key&0x7F000000; // ������ ��� ���������� � ����� ���!
+ WORD EventType=KEY_EVENT;
+
+ DWORD FKey =Key&KEY_END_SKEY;
+ DWORD FShift=Key&KEY_CTRLMASK;
+
VirtKey=0;
- ControlState=(FShift&KEY_SHIFT?PKF_SHIFT:0)|
- (FShift&KEY_ALT?PKF_ALT:0)|
- (FShift&KEY_CTRL?PKF_CONTROL:0);
+ ControlState=(FShift&KEY_SHIFT?PKF_SHIFT:0)|
+ (FShift&KEY_ALT?PKF_ALT:0)|
+ (FShift&KEY_RALT?PKF_RALT:0)|
+ (FShift&KEY_RCTRL?PKF_RCONTROL:0)|
+ (FShift&KEY_CTRL?PKF_CONTROL:0);
+
bool KeyInTable=false;
size_t i;
for (i=0; i < ARRAYSIZE(Table_KeyToVK); i++)
@@ -1967,8 +1978,11 @@
if (!KeyInTable)
{
- if ((FKey>='0' && FKey<='9') || (FKey>='A' && FKey<='Z'))
+ // TODO: KEY_ALTDIGIT
+ if ((FKey>=L'0' && FKey<=L'9') || (FKey>=L'A' && FKey<=L'Z'))
VirtKey=FKey;
+ //else if (FKey > KEY_VK_0xFF_BEGIN && FKey < KEY_VK_0xFF_END)
+ // VirtKey=FKey-KEY_FKEY_BEGIN;
else if (FKey > KEY_FKEY_BEGIN && FKey < KEY_END_FKEY)
VirtKey=FKey-KEY_FKEY_BEGIN;
else if (FKey && FKey < WCHAR_MAX)
@@ -1984,34 +1998,129 @@
}
}
else
- VirtKey=FKey;
+ {
+ VirtKey=FKey;
+ switch (FKey)
+ {
+ case KEY_MSWHEEL_UP:
+ case KEY_MSWHEEL_DOWN:
+ case KEY_MSWHEEL_LEFT:
+ case KEY_MSWHEEL_RIGHT:
+ case KEY_MSLCLICK:
+ case KEY_MSRCLICK:
+ case KEY_MSM1CLICK:
+ case KEY_MSM2CLICK:
+ case KEY_MSM3CLICK:
+ EventType=MOUSE_EVENT;
+ break;
+ }
+ }
}
- if (Rec && VirtKey)
+ /* TODO:
+ KEY_CTRLALTSHIFTPRESS
+ KEY_CTRLALTSHIFTRELEASE
+ KEY_RCTRLALTSHIFTPRESS
+ KEY_RCTRLALTSHIFTRELEASE
+ */
+
+
+ if (Rec)
{
- Rec->EventType=KEY_EVENT;
- Rec->Event.KeyEvent.bKeyDown=1;
- Rec->Event.KeyEvent.wRepeatCount=1;
- Rec->Event.KeyEvent.wVirtualKeyCode=VirtKey;
- Rec->Event.KeyEvent.wVirtualScanCode = MapVirtualKey(Rec->Event.KeyEvent.wVirtualKeyCode,MAPVK_VK_TO_VSC);
+ Rec->EventType=EventType;
- Rec->Event.KeyEvent.uChar.UnicodeChar=Key>WCHAR_MAX?0:Key;
+ switch (EventType)
+ {
+ case KEY_EVENT:
+ {
+ if (VirtKey)
+ {
+ Rec->Event.KeyEvent.bKeyDown=1;
+ Rec->Event.KeyEvent.wRepeatCount=1;
+ Rec->Event.KeyEvent.wVirtualKeyCode=VirtKey;
+ Rec->Event.KeyEvent.wVirtualScanCode = MapVirtualKey(Rec->Event.KeyEvent.wVirtualKeyCode,MAPVK_VK_TO_VSC);
- // ���� ����� � Shift-������� ������, ������ �� ControlState
- Rec->Event.KeyEvent.dwControlKeyState=
- (FShift&KEY_SHIFT?SHIFT_PRESSED:0)|
- (FShift&KEY_ALT?LEFT_ALT_PRESSED:0)|
- (FShift&KEY_CTRL?LEFT_CTRL_PRESSED:0)|
- (FShift&KEY_RALT?RIGHT_ALT_PRESSED:0)|
- (FShift&KEY_RCTRL?RIGHT_CTRL_PRESSED:0);
+ Rec->Event.KeyEvent.uChar.UnicodeChar=Key>WCHAR_MAX?0:Key;
- DWORD ExtKey[]={KEY_PGUP,KEY_PGDN,KEY_END,KEY_HOME,KEY_LEFT,KEY_UP,KEY_RIGHT,KEY_DOWN,KEY_INS,KEY_DEL,KEY_NUMENTER};
- for (i=0; i < ARRAYSIZE(ExtKey); i++)
- if(FKey == ExtKey[i])
+ // ���� ����� � Shift-������� ������, ������ �� ControlState
+ Rec->Event.KeyEvent.dwControlKeyState=
+ (FShift&KEY_SHIFT?SHIFT_PRESSED:0)|
+ (FShift&KEY_ALT?LEFT_ALT_PRESSED:0)|
+ (FShift&KEY_CTRL?LEFT_CTRL_PRESSED:0)|
+ (FShift&KEY_RALT?RIGHT_ALT_PRESSED:0)|
+ (FShift&KEY_RCTRL?RIGHT_CTRL_PRESSED:0);
+
+ DWORD ExtKey[]={KEY_PGUP,KEY_PGDN,KEY_END,KEY_HOME,KEY_LEFT,KEY_UP,KEY_RIGHT,KEY_DOWN,KEY_INS,KEY_DEL,KEY_NUMENTER};
+ for (i=0; i < ARRAYSIZE(ExtKey); i++)
+ if(FKey == ExtKey[i])
+ {
+ Rec->Event.KeyEvent.dwControlKeyState|=ENHANCED_KEY;
+ break;
+ }
+ }
+ break;
+ }
+
+ case MOUSE_EVENT:
{
- Rec->Event.KeyEvent.dwControlKeyState|=ENHANCED_KEY;
+ DWORD ButtonState=0;
+ DWORD EventFlags=0;
+
+ switch (FKey)
+ {
+ case KEY_MSWHEEL_UP:
+ ButtonState=MAKELONG(0,120);
+ EventFlags|=MOUSE_WHEELED;
+ break;
+ case KEY_MSWHEEL_DOWN:
+ ButtonState=MAKELONG(0,(WORD)(short)-120);
+ EventFlags|=MOUSE_WHEELED;
+ break;
+ case KEY_MSWHEEL_RIGHT:
+ ButtonState=MAKELONG(0,120);
+ EventFlags|=MOUSE_HWHEELED;
+ break;
+ case KEY_MSWHEEL_LEFT:
+ ButtonState=MAKELONG(0,(WORD)(short)-120);
+ EventFlags|=MOUSE_HWHEELED;
+ break;
+
+ case KEY_MSLCLICK:
+ ButtonState=FROM_LEFT_1ST_BUTTON_PRESSED;
+ break;
+ case KEY_MSRCLICK:
+ ButtonState=RIGHTMOST_BUTTON_PRESSED;
+ break;
+ case KEY_MSM1CLICK:
+ ButtonState=FROM_LEFT_2ND_BUTTON_PRESSED;
+ break;
+ case KEY_MSM2CLICK:
+ ButtonState=FROM_LEFT_3RD_BUTTON_PRESSED;
+ break;
+ case KEY_MSM3CLICK:
+ ButtonState=FROM_LEFT_4TH_BUTTON_PRESSED;
+ break;
+ }
+
+ Rec->Event.MouseEvent.dwButtonState=ButtonState;
+ Rec->Event.MouseEvent.dwEventFlags=EventFlags;
+ Rec->Event.MouseEvent.dwControlKeyState=
+ (FShift&KEY_SHIFT?SHIFT_PRESSED:0)|
+ (FShift&KEY_ALT?LEFT_ALT_PRESSED:0)|
+ (FShift&KEY_CTRL?LEFT_CTRL_PRESSED:0)|
+ (FShift&KEY_RALT?RIGHT_ALT_PRESSED:0)|
+ (FShift&KEY_RCTRL?RIGHT_CTRL_PRESSED:0);
+ Rec->Event.MouseEvent.dwMousePosition.X=IntKeyState.MouseX;
+ Rec->Event.MouseEvent.dwMousePosition.Y=IntKeyState.MouseY;
break;
}
+ case WINDOW_BUFFER_SIZE_EVENT:
+ break;
+ case MENU_EVENT:
+ break;
+ case FOCUS_EVENT:
+ break;
+ }
}
return VirtKey;
@@ -2110,7 +2219,7 @@
{
_SVS(CleverSysLog Clev(L"CalcKeyCode"));
_SVS(SysLog(L"CalcKeyCode -> %s| RealKey=%d *NotMacros=%d",_INPUT_RECORD_Dump(rec),RealKey,(NotMacros?*NotMacros:0)));
- UINT CtrlState=rec->Event.KeyEvent.dwControlKeyState;
+ UINT CtrlState=(rec->EventType==MOUSE_EVENT)?rec->Event.MouseEvent.dwControlKeyState:rec->Event.KeyEvent.dwControlKeyState;
UINT ScanCode=rec->Event.KeyEvent.wVirtualScanCode;
UINT KeyCode=rec->Event.KeyEvent.wVirtualKeyCode;
WCHAR Char=rec->Event.KeyEvent.uChar.UnicodeChar;
@@ -2121,7 +2230,7 @@
// CtrlState&=~0x80000000;
- if (!(rec->EventType==KEY_EVENT || rec->EventType == FARMACRO_KEY_EVENT))
+ if (!(rec->EventType==KEY_EVENT || rec->EventType == FARMACRO_KEY_EVENT || rec->EventType == MOUSE_EVENT))
return(KEY_NONE);
if (!RealKey)
@@ -2134,8 +2243,59 @@
IntKeyState.RightShiftPressed=(CtrlState & SHIFT_PRESSED);
}
- DWORD Modif=(IntKeyState.CtrlPressed?KEY_CTRL:0)|(IntKeyState.AltPressed?KEY_ALT:0)|(IntKeyState.ShiftPressed?KEY_SHIFT:0);
+ DWORD Modif;
+ if (IntKeyState.CtrlPressed && !IntKeyState.AltPressed && !IntKeyState.ShiftPressed)
+ Modif=(IntKeyState.RightCtrlPressed?KEY_RCTRL:KEY_CTRL);
+ else if (!IntKeyState.CtrlPressed && IntKeyState.AltPressed && !IntKeyState.ShiftPressed)
+ Modif=(IntKeyState.RightAltPressed?KEY_RALT:KEY_ALT);
+ else if (!IntKeyState.CtrlPressed && !IntKeyState.AltPressed && IntKeyState.ShiftPressed)
+ Modif=KEY_SHIFT;
+ else
+ Modif=(IntKeyState.CtrlPressed?KEY_CTRL:0)|(IntKeyState.AltPressed?KEY_ALT:0)|(IntKeyState.ShiftPressed?KEY_SHIFT:0);
+ DWORD ModifAlt=(IntKeyState.RightAltPressed?KEY_RALT:(IntKeyState.AltPressed?KEY_ALT:0));
+ DWORD ModifCtrl=(IntKeyState.RightCtrlPressed?KEY_RCTRL:(IntKeyState.CtrlPressed?KEY_CTRL:0));
+ if (rec->EventType==MOUSE_EVENT)
+ {
+ if (!(rec->Event.MouseEvent.dwEventFlags==MOUSE_WHEELED || rec->Event.MouseEvent.dwEventFlags==MOUSE_HWHEELED || rec->Event.MouseEvent.dwEventFlags==0))
+ {
+ return(KEY_NONE);
+ }
+
+ if (rec->Event.MouseEvent.dwEventFlags==MOUSE_WHEELED)
+ {
+ if (((short)(HIWORD(rec->Event.MouseEvent.dwButtonState))) > 0)
+ return(Modif|KEY_MSWHEEL_UP);
+ else if (((short)(HIWORD(rec->Event.MouseEvent.dwButtonState))) < 0)
+ return(Modif|KEY_MSWHEEL_DOWN);
+ }
+ else if (rec->Event.MouseEvent.dwEventFlags==MOUSE_HWHEELED)
+ {
+ if (((short)(HIWORD(rec->Event.MouseEvent.dwButtonState))) > 0)
+ return(Modif|KEY_MSWHEEL_RIGHT);
+ else if (((short)(HIWORD(rec->Event.MouseEvent.dwButtonState))) < 0)
+ return(Modif|KEY_MSWHEEL_LEFT);
+ }
+ else if (rec->Event.MouseEvent.dwEventFlags==0)
+ {
+ switch (rec->Event.MouseEvent.dwButtonState)
+ {
+ case FROM_LEFT_1ST_BUTTON_PRESSED:
+ return(Modif|KEY_MSLCLICK);
+ case RIGHTMOST_BUTTON_PRESSED:
+ return(Modif|KEY_MSRCLICK);
+ case FROM_LEFT_2ND_BUTTON_PRESSED:
+ return(Modif|KEY_MSM1CLICK);
+ case FROM_LEFT_3RD_BUTTON_PRESSED:
+ return(Modif|KEY_MSM2CLICK);
+ case FROM_LEFT_4TH_BUTTON_PRESSED:
+ return(Modif|KEY_MSM3CLICK);
+ }
+ }
+
+ return(KEY_NONE);
+ }
+
if (rec->Event.KeyEvent.wVirtualKeyCode >= 0xFF && RealKey)
{
//VK_?=0x00FF, Scan=0x0013 uChar=[U=' ' (0x0000): A=' ' (0x00)] Ctrl=0x00000120 (casac - EcNs)
@@ -2925,7 +3085,7 @@
else if (KeyCode == VK_CANCEL && IntKeyState.CtrlPressed && !IntKeyState.AltPressed && !IntKeyState.ShiftPressed)
{
CtrlObject->Macro.SendDropProcess();
- return KEY_BREAK;
+ return(ModifCtrl|KEY_BREAK);
}
/* ------------------------------------------------------------- */
@@ -2938,52 +3098,52 @@
return(KEY_CTRL0+KeyCode-'0');
if (KeyCode>='A' && KeyCode<='Z')
- return(KEY_CTRL+KeyCode);
+ return(ModifCtrl+KeyCode);
switch (KeyCode)
{
case VK_OEM_COMMA:
- return(KEY_CTRLCOMMA);
+ return(ModifCtrl|KEY_COMMA);
case VK_OEM_PERIOD:
return(KEY_CTRLDOT);
case VK_OEM_2:
- return(KEY_CTRLSLASH);
+ return(ModifCtrl|KEY_SLASH);
case VK_OEM_4:
- return(KEY_CTRLBRACKET);
+ return(ModifCtrl|KEY_BRACKET);
case VK_OEM_5:
- return(KEY_CTRLBACKSLASH);
+ return(KEY_CTRLBACKSLASH); //BUGBUG: �� ���� ModifCtrl ������, ���� �� ������� ����� ��������� Ctrl\ ...
case VK_OEM_6:
- return(KEY_CTRLBACKBRACKET);
+ return(ModifCtrl|KEY_BACKBRACKET);
case VK_OEM_7:
- return(KEY_CTRL+'\''); // KEY_QUOTE
+ return(ModifCtrl+'\''); // KEY_QUOTE
case VK_MULTIPLY:
- return(KEY_CTRL|KEY_MULTIPLY);
+ return(ModifCtrl|KEY_MULTIPLY);
case VK_DIVIDE:
- return(KEY_CTRL|KEY_DIVIDE);
+ return(ModifCtrl|KEY_DIVIDE);
case VK_PAUSE:
if (CtrlState&ENHANCED_KEY)
- return KEY_CTRL|KEY_NUMLOCK;
+ return ModifCtrl|KEY_NUMLOCK;
CtrlObject->Macro.SendDropProcess();
return KEY_BREAK;
case VK_SLEEP:
- return KEY_CTRL|KEY_STANDBY;
+ return ModifCtrl|KEY_STANDBY;
case VK_SNAPSHOT:
- return KEY_CTRL|KEY_PRNTSCRN;
+ return ModifCtrl|KEY_PRNTSCRN;
case VK_OEM_102: // <> \|
- return KEY_CTRL|KEY_BACKSLASH;
+ return ModifCtrl|KEY_BACKSLASH;
}
if (Opt.ShiftsKeyRules) //???
switch (KeyCode)
{
case VK_OEM_3:
- return(KEY_CTRL+'`');
+ return(ModifCtrl+'`');
case VK_OEM_MINUS:
- return(KEY_CTRL+'-');
+ return(ModifCtrl+'-');
case VK_OEM_PLUS:
- return(KEY_CTRL+'=');
+ return(ModifCtrl+'=');
case VK_OEM_1:
- return(KEY_CTRL+KEY_SEMICOLON);
+ return(ModifCtrl+KEY_SEMICOLON);
}
if (KeyCode)
@@ -2999,7 +3159,7 @@
if (!RealKey && KeyCode==VK_CONTROL)
return KEY_NONE;
- return(KEY_CTRL+KeyCode);
+ return(ModifCtrl+KeyCode);
}
}
@@ -3013,60 +3173,60 @@
switch (KeyCode)
{
case VK_OEM_3:
- return(KEY_ALT+'`');
+ return(ModifAlt+'`');
case VK_OEM_MINUS:
//if(WaitInFastFind)
// return(KEY_ALT+KEY_SHIFT+'_');
//else
- return(KEY_ALT+'-');
+ return(ModifAlt+'-');
case VK_OEM_PLUS:
- return(KEY_ALT+'=');
+ return(ModifAlt+'=');
case VK_OEM_5:
- return(KEY_ALT+KEY_BACKSLASH);
+ return(ModifAlt+KEY_BACKSLASH);
case VK_OEM_6:
- return(KEY_ALT+KEY_BACKBRACKET);
+ return(ModifAlt+KEY_BACKBRACKET);
case VK_OEM_4:
- return(KEY_ALT+KEY_BRACKET);
+ return(ModifAlt+KEY_BRACKET);
case VK_OEM_7:
- return(KEY_ALT+'\'');
+ return(ModifAlt+'\'');
case VK_OEM_1:
- return(KEY_ALT+KEY_SEMICOLON);
+ return(ModifAlt+KEY_SEMICOLON);
case VK_OEM_2:
- return(KEY_ALT+KEY_SLASH);
+ return(ModifAlt+KEY_SLASH);
case VK_OEM_102: // <> \|
- return KEY_ALT+KEY_BACKSLASH;
+ return ModifAlt+KEY_BACKSLASH;
}
switch (KeyCode)
{
case VK_OEM_COMMA:
- return(KEY_ALTCOMMA);
+ return(ModifAlt|KEY_COMMA);
case VK_OEM_PERIOD:
- return(KEY_ALTDOT);
+ return(ModifAlt|KEY_DOT);
case VK_DIVIDE:
//if(WaitInFastFind)
// return(KEY_ALT+KEY_SHIFT+'/');
//else
- return(KEY_ALT|KEY_DIVIDE);
+ return(ModifAlt|KEY_DIVIDE);
case VK_MULTIPLY:
// if(WaitInFastFind)
// return(KEY_ALT+KEY_SHIFT+'*');
// else
- return(KEY_ALT|KEY_MULTIPLY);
+ return(ModifAlt|KEY_MULTIPLY);
case VK_PAUSE:
- return(KEY_ALT+KEY_PAUSE);
+ return(ModifAlt+KEY_PAUSE);
case VK_SLEEP:
- return KEY_ALT|KEY_STANDBY;
+ return ModifAlt|KEY_STANDBY;
case VK_SNAPSHOT:
- return KEY_ALT|KEY_PRNTSCRN;
+ return ModifAlt|KEY_PRNTSCRN;
}
if (Char)
{
if (!Opt.ShiftsKeyRules || WaitInFastFind > 0)
- return KEY_ALT|Upper(Char);
+ return ModifAlt|Upper(Char);
else if (WaitInMainLoop)
- return KEY_ALT|Char;
+ return ModifAlt|Char;
}
if (ProcessCtrlCode)
@@ -3080,7 +3240,7 @@
if (!RealKey && KeyCode==VK_MENU)
return KEY_NONE;
- return(KEY_ALT+KeyCode);
+ return(ModifAlt+KeyCode);
}
if (IntKeyState.ShiftPressed)
|
|
|
|
|
|
Патч в первом приближении готов (в довесок к тому, что ты выложил). Проблемы пока остались, например с кнопками: "Shift-" (или "Shift_") - возвращают "None" "RAltShift-" - возвращает "AltShift_". |
|
|
Мыль тут... может пора ввести принудительное различие на Ctrl/RCtrl, Alt/RAlt? |
|
|
Кажется, так и нужно. Пока что "неразличимыми" остались только комбинации с более чем одним модификатором. То есть лучше получить, например, "RAltRCtrl1" вместо "AltCtrl1". И, может быть, для удобства в самом фаре не менять системные комбинации типа "AltIns", "Ctrl." и т.п. |
|
|
> "Shift-" - возвращают "None" это оттого, что '-' воспринимается как VK_OEM_MINUS: Shift -> |"VK_OEM_MINUS" [189/0x00BD]|KEY_EVENT_RECORD: Dn, 1, Vk="VK_OEM_MINUS" [189/0x00BD], Scan=0x000C uChar=[U=' ' (0x0000): A=' ' (0x00)] Ctrl=0x00000010 (caSac - ecns) (Widowed)| > (или "Shift_") Shift -> |"VK_????" [445/0x01BD]|KEY_EVENT_RECORD: Dn, 1, Vk="VK_????" [445/0x01BD], Scan=0x0000 uChar=[U=' ' (0x0000): A=' ' (0x00)] Ctrl=0x00000010 (caSac - ecns) (Widowed)| > "RAltShift-" - возвращает "AltShift_" Здесь опять же "VK_OEM_MINUS", но кроме всего прочего, если посмотришь на CalcKeyCode(), то там везде идет KEY_ALT, но нету KEY_RALT! AltShift -> |"VK_OEM_MINUS" [189/0x00BD]|KEY_EVENT_RECORD: Dn, 1, Vk="VK_OEM_MINUS" [189/0x00BD], Scan=0x000C uChar=[U=' ' (0x0000): A=' ' (0x00)] Ctrl=0x00000011 (caSAc - ecns) (Widowed)| |
|
|
Для "if (IntKeyState.ShiftPressed)" наверное имеет смысл: case VK_OEM_MINUS: return KEY_SHIFT|KEY_SUBTRACT; case VK_OEM_PLUS: return KEY_SHIFT|KEY_ADD; Хотя тут сложности: "Shift-" это что? "Shift" и "-" на цифровой клаве или "-" на основной? |
|
|
Хотя, лажа получается... а кто из "-" делает VK_OEM_MINUS? |
|
|
"-" на цифровой это VK_SUBTRACT. А в фаре это "Subtract". Так что кнопка "-_" это действительно OEM... |
|
|
Походу, еще вопросы возникли 1. Для чего вставлен вот этот кусок? Зачем он CtrlPressed сбрасывает? Вместо "CtrlAlt0" получается "Alt0" O_O if ((CtrlState & 9)==9) { if (Char) return Char; else IntKeyState.CtrlPressed=0; } 2. Поддержка различия RAlt/Alt и RCtrl/Ctrl это наверное хорошо. Но это и макросы заденет. MacroLib, например, позволяет задавать разные макросы на Alt[Буква] и RAlt[Буква]. Причем, если макрос на RAlt[Буква] явно не назначен - выполняется назначенный на Alt[Буква]. Думаю, что нужно идти по этому пути. 3. Нажать Ctrl. Ctrl. AltShift- В окне ввода комбинации получаем невнятное "AltShiftƽ". Очевидно, я этого не нажимал. Чего там лучше крутить - я пока не понял. |
|
|
С Shift-ом не понятно... "Shift=" это (KEY_SHIFT|'=') или '+'? Вообще, та же непонятка для всей цифробуквенной клавиатуры |
|
|
"Shift-" Я так думаю, что здесь нужно просто "_", без Shift. > if ((CtrlState & 9)==9) блин, валишь :-) Этот кусок кода (7 строк) со времен Рошала не трогался - наверное у него спрашивать надо (но наврядли он вспомнит). Этот кусок может относится к мастдаю, хотя... ХЗ. Попробуй его закомментить и посмотри на работу :-) > Но это и макросы заденет. Согласен (и не только макросы - много чего придется продублировать в самом коде ФАР), но, как мне кажется, оно того стоит. > Думаю, что нужно идти по этому пути. Разумно. > Нажать Ctrl. Ctrl. AltShift- Хмм.. TranslateKeyToVK() ... VirtKey=VkKeyScan(static_cast<WCHAR>(FKey)); ... Здесь получаем VirtKey = 0x1BD... Наверное нужно проверить на > 0xFF, но что тогда делать в этом случае? |
|
|
"VkKeyScan... ...If the function succeeds, the low-order byte of the return value contains the virtual-key code and the high-order byte contains the shift state,..." :-) |
|
|
> if ((CtrlState & 9)==9) 9 - это, типа, LEFT_CTRL_PRESSED|RIGHT_ALT_PRESSED. Какое-то очень сильное колдунство. |
|
|
а то! в обчем пока 2122, а там видно будет. Пока вот так: "Shift-" (или "Shift_") ==> "_" "RAltShift-" - возвращает "AltShift_". |
|
|
|
|
|
Патч по безобразиям с RCtrl/RAlt выложен. Резюме: если за "правыми" комбинациями ранее не было зарезервировано каких-либо действия - фар реагирует на них так же как на "левые". Изыски типа ПравыйCtrlЛевыйAlt+что-то - специально никак не обрабатываются (в смысле замен Правый->Левый не производится). В макросах, как и везде, если на "правую" комбинацию ничего специально не было повешено - реагируем так же как на "левую". |
|
|
В двух местах int TreeList::ProcessKey(int Key) int FolderTree::ProcessKey(int Key) нашел странность: поиск с Alt-ом. Везде вроде бы Key<=65535 а там Key<=255. Править пока не стал, но наверное надо на 65535 заменить? |
|
|
build 2127 |
|
|
> В макросах, как и везде, если на "правую" комбинацию ничего специально не было повешено - реагируем так же как на "левую". если на левой что-то висит - повесить на правую невозможно, только перезаписать. Причём в диалоге подтверждения перезаписи утверждается, что макрос висит на правой, что не так. |
|
|
|
|
|
1. теперь можно повесить и на правую 2. немного форматирования 3. неиспользуемая KeyMacro::GetRecordSize убрана под "#if 0" |
|
|
build 2132 |
|
|
Macro.110809.diff (362 bytes)
Index: macro.cpp
===================================================================
--- macro.cpp (revision 6539)
+++ macro.cpp (working copy)
@@ -7230,10 +7230,12 @@
{
if (MacroLIB)
{
+ int KeyParam=Key;
for (int I=0; I < 2; ++I)
{
int Pos,Len;
MacroRecord *MPtr=nullptr;
+ Key=KeyParam;
if (CheckMode == -1)
{
|
|
|
В области Common вместо "правого" выполнялся "левый" макрос |
|
|
build 2140 |
|
|
Отвалился правый CtrlShiftDot при записи макроса. |
|
|
RCtrlShiftDot.diff (2,292 bytes)
Index: macro.cpp
===================================================================
--- macro.cpp (revision 6615)
+++ macro.cpp (working copy)
@@ -757,7 +757,9 @@
if (Recording) // ���� �����?
{
- if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot) // ������� ���� ������?
+ // ������� ���� ������?
+ if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot
+ || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot)
{
_KEYMACRO(CleverSysLog Clev(L"MACRO End record..."));
DWORD MacroKey;
@@ -774,7 +776,8 @@
// ������� �������� �� ��������
// ���� ������, �� �� ����� ������ ������ ���������.
//if (MacroKey != (DWORD)-1 && (Key==KEY_CTRLSHIFTDOT || Recording==2) && RecBufferSize)
- if (MacroKey != (DWORD)-1 && (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot && RecBufferSize)
+ if (MacroKey != (DWORD)-1 && RecBufferSize
+ && ((unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot))
{
if (!GetMacroSettings(MacroKey,Flags))
MacroKey=(DWORD)-1;
@@ -894,7 +897,9 @@
return FALSE;
}
}
- else if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot) // ����� ������?
+ // ����� ������?
+ else if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot
+ || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot)
{
_KEYMACRO(CleverSysLog Clev(L"MACRO Begin record..."));
@@ -914,7 +919,7 @@
// ��� ������ - � ������ ������� �������� ���...
// � ����������� �� ����, �� ���� ����� ������, �������� ���� ����� (Ctrl-.
// � �������� ������� ����) ��� �������� (Ctrl-Shift-. - ��� ������� ����� �������)
- Recording=((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot) ? MACROMODE_RECORDING_COMMON:MACROMODE_RECORDING;
+ Recording=((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot) ? MACROMODE_RECORDING_COMMON:MACROMODE_RECORDING;
if (RecBuffer)
xf_free(RecBuffer);
|
|
|
вернул RCtrlShiftDot |
|
|
где config.hpp? и "?" пропустил в "Recording=((unsigned int)Key==Opt.Macro.Ke..." :-) |
|
|
Да, config.?pp что-то потерялся. А про "?" - не понял, все на месте вроде. |
|
|
RCtrlShiftDot2.diff (4,629 bytes)
Index: config.cpp
===================================================================
--- config.cpp (revision 6615)
+++ config.cpp (working copy)
@@ -74,7 +74,9 @@
string strKeyNameConsoleDetachKey;
static const wchar_t szCtrlDot[]=L"Ctrl.";
+static const wchar_t szRCtrlDot[]=L"RCtrl.";
static const wchar_t szCtrlShiftDot[]=L"CtrlShift.";
+static const wchar_t szRCtrlShiftDot[]=L"RCtrlShift.";
// KeyName
const wchar_t NKeyColors[]=L"Colors";
@@ -938,15 +940,21 @@
string strKeyNameFromCfg;
GeneralCfg->GetValue(NKeyKeyMacros,L"KeyRecordCtrlDot",strKeyNameFromCfg,szCtrlDot);
-
if ((Opt.Macro.KeyMacroCtrlDot=KeyNameToKey(strKeyNameFromCfg)) == (DWORD)-1)
Opt.Macro.KeyMacroCtrlDot=KEY_CTRLDOT;
+ GeneralCfg->GetValue(NKeyKeyMacros,L"KeyRecordRCtrlDot",strKeyNameFromCfg,szRCtrlDot);
+ if ((Opt.Macro.KeyMacroRCtrlDot=KeyNameToKey(strKeyNameFromCfg)) == (DWORD)-1)
+ Opt.Macro.KeyMacroRCtrlDot=KEY_RCTRLDOT;
+
GeneralCfg->GetValue(NKeyKeyMacros,L"KeyRecordCtrlShiftDot",strKeyNameFromCfg,szCtrlShiftDot);
-
if ((Opt.Macro.KeyMacroCtrlShiftDot=KeyNameToKey(strKeyNameFromCfg)) == (DWORD)-1)
Opt.Macro.KeyMacroCtrlShiftDot=KEY_CTRLSHIFTDOT;
+ GeneralCfg->GetValue(NKeyKeyMacros,L"KeyRecordRCtrlShiftDot",strKeyNameFromCfg,szRCtrlShiftDot);
+ if ((Opt.Macro.KeyMacroRCtrlShiftDot=KeyNameToKey(strKeyNameFromCfg)) == (DWORD)-1)
+ Opt.Macro.KeyMacroRCtrlShiftDot=KEY_RCTRL|KEY_SHIFT|KEY_DOT;
+
Opt.EdOpt.strWordDiv = Opt.strWordDiv;
FileList::ReadPanelModes();
Index: config.hpp
===================================================================
--- config.hpp (revision 6615)
+++ config.hpp (working copy)
@@ -446,8 +446,8 @@
{
int MacroReuseRules; // ������� �� ��� �������� ����������� ��������� �����
DWORD DisableMacro; // �������� /m ��� /ma ��� /m....
- DWORD KeyMacroCtrlDot; // �� KEY_CTRLDOT
- DWORD KeyMacroCtrlShiftDot; // �� KEY_CTRLSHIFTDOT
+ DWORD KeyMacroCtrlDot, KeyMacroRCtrlDot; // �� KEY_CTRLDOT/KEY_RCTRLDOT
+ DWORD KeyMacroCtrlShiftDot, KeyMacroRCtrlShiftDot; // �� KEY_CTRLSHIFTDOT/KEY_RCTRLSHIFTDOT
int CallPluginRules; // 0 - ���������� ������ ��� ����� �������, 1 - ������� ������ (�����!)
string strMacroCONVFMT; // ������ ������������� double � ������
string strDateFormat; // �� $Date
Index: macro.cpp
===================================================================
--- macro.cpp (revision 6615)
+++ macro.cpp (working copy)
@@ -757,7 +757,9 @@
if (Recording) // ���� �����?
{
- if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot) // ������� ���� ������?
+ // ������� ���� ������?
+ if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot
+ || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot)
{
_KEYMACRO(CleverSysLog Clev(L"MACRO End record..."));
DWORD MacroKey;
@@ -774,7 +776,8 @@
// ������� �������� �� ��������
// ���� ������, �� �� ����� ������ ������ ���������.
//if (MacroKey != (DWORD)-1 && (Key==KEY_CTRLSHIFTDOT || Recording==2) && RecBufferSize)
- if (MacroKey != (DWORD)-1 && (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot && RecBufferSize)
+ if (MacroKey != (DWORD)-1 && RecBufferSize
+ && ((unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot))
{
if (!GetMacroSettings(MacroKey,Flags))
MacroKey=(DWORD)-1;
@@ -894,7 +897,9 @@
return FALSE;
}
}
- else if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot) // ����� ������?
+ // ����� ������?
+ else if ((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot
+ || (unsigned int)Key==Opt.Macro.KeyMacroCtrlShiftDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlShiftDot)
{
_KEYMACRO(CleverSysLog Clev(L"MACRO Begin record..."));
@@ -914,7 +919,7 @@
// ��� ������ - � ������ ������� �������� ���...
// � ����������� �� ����, �� ���� ����� ������, �������� ���� ����� (Ctrl-.
// � �������� ������� ����) ��� �������� (Ctrl-Shift-. - ��� ������� ����� �������)
- Recording=((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot) ? MACROMODE_RECORDING_COMMON:MACROMODE_RECORDING;
+ Recording=((unsigned int)Key==Opt.Macro.KeyMacroCtrlDot || (unsigned int)Key==Opt.Macro.KeyMacroRCtrlDot) ? MACROMODE_RECORDING_COMMON:MACROMODE_RECORDING;
if (RecBuffer)
xf_free(RecBuffer);
|
|
|
build 2166 |
|
|
Keyboard.110927.diff (3,065 bytes)
Index: keyboard.cpp
===================================================================
--- keyboard.cpp (revision 6730)
+++ keyboard.cpp (working copy)
@@ -2113,7 +2113,7 @@
}
else
{
- Rec->Event.KeyEvent.wVirtualKeyCode = 0;
+ Rec->Event.KeyEvent.wVirtualKeyCode = VirtKey = 0;
Rec->Event.KeyEvent.wVirtualScanCode = 0;
}
Rec->Event.KeyEvent.uChar.UnicodeChar=FKey > WCHAR_MAX?0:FKey;
@@ -2952,7 +2952,7 @@
_SVS(if (KeyCode!=VK_CONTROL && KeyCode!=VK_MENU) SysLog(L"CtrlAlt -> |%s|%s|",_VK_KEY_ToName(KeyCode),_INPUT_RECORD_Dump(rec)));
if (KeyCode>='A' && KeyCode<='Z')
- return(Modif+KeyCode);
+ return Modif|KeyCode;
if (Opt.ShiftsKeyRules) //???
switch (KeyCode)
@@ -3010,7 +3010,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3034,7 +3034,7 @@
}
if (!WaitInMainLoop && KeyCode>='A' && KeyCode<='Z')
- return(Modif+KeyCode);
+ return Modif|KeyCode;
if (Opt.ShiftsKeyRules) //???
switch (KeyCode)
@@ -3097,7 +3097,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3160,7 +3160,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3203,23 +3203,23 @@
_SVS(if (KeyCode!=VK_CONTROL) SysLog(L"Ctrl -> |%s|%s|",_VK_KEY_ToName(KeyCode),_INPUT_RECORD_Dump(rec)));
if (KeyCode>='0' && KeyCode<='9')
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
if (KeyCode>='A' && KeyCode<='Z')
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
switch (KeyCode)
{
case VK_OEM_COMMA:
return(ModifCtrl|KEY_COMMA);
case VK_OEM_PERIOD:
- return(KEY_CTRLDOT);
+ return(ModifCtrl|KEY_DOT);
case VK_OEM_2:
return(ModifCtrl|KEY_SLASH);
case VK_OEM_4:
return(ModifCtrl|KEY_BRACKET);
case VK_OEM_5:
- return(KEY_CTRLBACKSLASH); //BUGBUG: �� ���� ModifCtrl ������, ���� �� ������� ����� ��������� Ctrl\ ...
+ return(ModifCtrl|KEY_BACKSLASH);
case VK_OEM_6:
return(ModifCtrl|KEY_BACKBRACKET);
case VK_OEM_7:
@@ -3267,8 +3267,11 @@
if (!RealKey && KeyCode==VK_CONTROL)
return KEY_NONE;
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
}
+
+ if (Char)
+ return ModifCtrl|Char;
}
/* ------------------------------------------------------------- */
@@ -3348,7 +3351,8 @@
if (!RealKey && KeyCode==VK_MENU)
return KEY_NONE;
- return(ModifAlt+KeyCode);
+ if (KeyCode)
+ return ModifAlt|KeyCode;
}
if (IntKeyState.ShiftPressed)
@@ -3385,5 +3389,7 @@
}
+ if (Char && (ModifAlt || ModifCtrl))
+ return Modif|Char;
return Char?Char:KEY_NONE;
}
|
|
|
И еще раз. |
|
|
Keyboard.110929.diff (4,553 bytes)
Index: keyboard.cpp
===================================================================
--- keyboard.cpp (revision 6736)
+++ keyboard.cpp (working copy)
@@ -1432,11 +1432,6 @@
(CtrlState&RIGHT_CTRL_PRESSED?KEY_RCTRL:0)|
(CtrlState&LEFT_ALT_PRESSED?KEY_ALT:0)|
(CtrlState&RIGHT_ALT_PRESSED?KEY_RALT:0);
- ClearStruct(*rec);
- rec->Event.KeyEvent.wVirtualKeyCode=VK_F24+(CalcKey==KEY_MSWHEEL_UP?2:1);
- rec->Event.KeyEvent.dwControlKeyState=CtrlState;
- rec->Event.KeyEvent.bKeyDown=TRUE;
- rec->EventType = KEY_EVENT;
}
// ��������� �������������� �������� (NT>=6)
@@ -1449,11 +1444,6 @@
(CtrlState&RIGHT_CTRL_PRESSED?KEY_RCTRL:0)|
(CtrlState&LEFT_ALT_PRESSED?KEY_ALT:0)|
(CtrlState&RIGHT_ALT_PRESSED?KEY_RALT:0);
- ClearStruct(*rec);
- rec->Event.KeyEvent.wVirtualKeyCode=VK_F24+(CalcKey==KEY_MSWHEEL_RIGHT?4:3);
- rec->Event.KeyEvent.dwControlKeyState=CtrlState;
- rec->Event.KeyEvent.bKeyDown=TRUE;
- rec->EventType = KEY_EVENT;
}
if (rec->EventType==MOUSE_EVENT && (!ExcludeMacro||ProcessMouse) && CtrlObject && (ProcessMouse || !(CtrlObject->Macro.IsRecording() || CtrlObject->Macro.IsExecuting())))
@@ -2113,7 +2103,7 @@
}
else
{
- Rec->Event.KeyEvent.wVirtualKeyCode = 0;
+ Rec->Event.KeyEvent.wVirtualKeyCode = VirtKey = 0;
Rec->Event.KeyEvent.wVirtualScanCode = 0;
}
Rec->Event.KeyEvent.uChar.UnicodeChar=FKey > WCHAR_MAX?0:FKey;
@@ -2662,15 +2652,6 @@
/* ------------------------------------------------------------- */
switch (KeyCode)
{
- case VK_F24+1:
- return Modif|KEY_MSWHEEL_DOWN;
- case VK_F24+2:
- return Modif|KEY_MSWHEEL_UP;
- case VK_F24+3:
- return Modif|KEY_MSWHEEL_LEFT;
- case VK_F24+4:
- return Modif|KEY_MSWHEEL_RIGHT;
-
case VK_INSERT:
case VK_NUMPAD0:
@@ -2952,7 +2933,7 @@
_SVS(if (KeyCode!=VK_CONTROL && KeyCode!=VK_MENU) SysLog(L"CtrlAlt -> |%s|%s|",_VK_KEY_ToName(KeyCode),_INPUT_RECORD_Dump(rec)));
if (KeyCode>='A' && KeyCode<='Z')
- return(Modif+KeyCode);
+ return Modif|KeyCode;
if (Opt.ShiftsKeyRules) //???
switch (KeyCode)
@@ -3010,7 +2991,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3034,7 +3015,7 @@
}
if (!WaitInMainLoop && KeyCode>='A' && KeyCode<='Z')
- return(Modif+KeyCode);
+ return Modif|KeyCode;
if (Opt.ShiftsKeyRules) //???
switch (KeyCode)
@@ -3097,7 +3078,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3160,7 +3141,7 @@
return(KEY_NONE);
if (KeyCode)
- return(Modif+KeyCode);
+ return Modif|KeyCode;
}
/* ------------------------------------------------------------- */
@@ -3203,23 +3184,23 @@
_SVS(if (KeyCode!=VK_CONTROL) SysLog(L"Ctrl -> |%s|%s|",_VK_KEY_ToName(KeyCode),_INPUT_RECORD_Dump(rec)));
if (KeyCode>='0' && KeyCode<='9')
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
if (KeyCode>='A' && KeyCode<='Z')
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
switch (KeyCode)
{
case VK_OEM_COMMA:
return(ModifCtrl|KEY_COMMA);
case VK_OEM_PERIOD:
- return(KEY_CTRLDOT);
+ return(ModifCtrl|KEY_DOT);
case VK_OEM_2:
return(ModifCtrl|KEY_SLASH);
case VK_OEM_4:
return(ModifCtrl|KEY_BRACKET);
case VK_OEM_5:
- return(KEY_CTRLBACKSLASH); //BUGBUG: �� ���� ModifCtrl ������, ���� �� ������� ����� ��������� Ctrl\ ...
+ return(ModifCtrl|KEY_BACKSLASH);
case VK_OEM_6:
return(ModifCtrl|KEY_BACKBRACKET);
case VK_OEM_7:
@@ -3267,8 +3248,11 @@
if (!RealKey && KeyCode==VK_CONTROL)
return KEY_NONE;
- return(ModifCtrl+KeyCode);
+ return ModifCtrl|KeyCode;
}
+
+ if (Char)
+ return ModifCtrl|Char;
}
/* ------------------------------------------------------------- */
@@ -3348,7 +3332,8 @@
if (!RealKey && KeyCode==VK_MENU)
return KEY_NONE;
- return(ModifAlt+KeyCode);
+ if (KeyCode)
+ return ModifAlt|KeyCode;
}
if (IntKeyState.ShiftPressed)
@@ -3385,5 +3370,7 @@
}
+ if (Char && (ModifAlt || ModifCtrl))
+ return Modif|Char;
return Char?Char:KEY_NONE;
}
|
|
|
и еще |
|
|
прокомментируй последний патч. что дает? зачем удалено "case VK_F24+1:" и еже с ним (в CalcKeyCode)? |
|
|
Событие - мышиное. Тогда какого фига его преобразовывать в клавиатурное?. Ладно бы внутри фара, но это кривое событие дальше в плагины лезет. Вобщем, удалять пережитки тяжелого прошлого... |
|
|
...а в замен? прочее проанализаировал? |
|
|
KeyCode (KEY_WHEEL_UP и т.п.) же возвращается. F24+N был только в KeyEvent.VirtualKey (чего быть для мыши не должно). Макрос назначенный на CtrlMsWheelUp сработал. Что еще проверить? |
|
|
а как быть с 0001736 ? (см. комментарий к build 2038) |
|
|
Я там не вижу ни билда 2038, ни комментариев к нему. Может ты про 1946? |
|
|
Если ты про akey, то все akey отрабатывают на MsWheelUp (как с Ctrl/Shift/Alt, так и без) отрабатывают нормально. Как в самом фаре, так и в макролибе. |
|
|
Вот, желающие могут потестить http://conemu-maximus5.googlecode.com/files/far3.2212bis.x86.x64.7z |
|
|
manager.111005.diff (592 bytes)
Index: manager.cpp
===================================================================
--- manager.cpp (revision 6753)
+++ manager.cpp (working copy)
@@ -706,7 +706,7 @@
if (EndLoop)
return;
- if (LastInputRecord.EventType==MOUSE_EVENT)
+ if (LastInputRecord.EventType==MOUSE_EVENT && !(Key==KEY_MSWHEEL_UP || Key==KEY_MSWHEEL_DOWN || Key==KEY_MSWHEEL_RIGHT || Key==KEY_MSWHEEL_LEFT))
{
// ��������� ���� ��������, �.�. LastInputRecord ����� �������� �������� �� ���� �������� ProcessMouse
MOUSE_EVENT_RECORD mer=LastInputRecord.Event.MouseEvent;
|
|
|
довесок к предыдущему патчу - не срабатывало колесо в панелях (и еще где может). других глюков пока не выявлено |
|
|
я имел в виду changelog#build 2038 - там описано для чего это делалось. т.е. хочешь сказать, что сейчас этот код лишний (с учетом твоих двух последних патчей?) |
|
|
да, лишний. макрос msgbox(akey(0),MsWheelDown) показывает 131076 131076 что и требуется |
|
|
build 2214 |
|
|
Keyboard.111008.diff (357 bytes)
--- keyboard.cpp (revision 6756)
+++ keyboard.cpp (working copy)
@@ -2103,7 +2103,7 @@
}
else
{
- Rec->Event.KeyEvent.wVirtualKeyCode = VirtKey = 0;
+ Rec->Event.KeyEvent.wVirtualKeyCode = 0;
Rec->Event.KeyEvent.wVirtualScanCode = 0;
}
Rec->Event.KeyEvent.uChar.UnicodeChar=FKey > WCHAR_MAX?0:FKey;
|
|
|
В 2214 у меня отвалился ввод букв в русской раскладке в одном из плагинов (там DI_USERCONTROL). Проверка показала, что при нажатии букв в русской раскладке в диалоговую процедуру вообще ничего не приходит. Методом перебора изменений в keyboard.cpp нашёл то, которое мешает. Патч приложен. |
|
|
хмм... ну вы пока определитесь, кто у кого что удаляет... ...после консенсуса выкатывайте патч. |
|
|
не помню, зачем VirtKey обнуляется, но похоже, что "Keyboard.111008.diff" надо принять. |
|
|
build 2215 |
|
|
2215 - в вышеупомянутом плагине стало ОК. |
|
|
Keyboard.111010.diff (538 bytes)
Index: plclass.cpp
===================================================================
--- plclass.cpp (revision 6753)
+++ plclass.cpp (working copy)
@@ -267,7 +267,7 @@
static BOOL WINAPI KeyNameToInputRecord(const wchar_t *Name,INPUT_RECORD* RecKey)
{
int Key=KeyNameToKeyW(Name);
- return Key > 0?(KeyToInputRecord(Key,RecKey)>=0?TRUE:FALSE):FALSE;
+ return Key > 0?(KeyToInputRecord(Key,RecKey)!=0?TRUE:FALSE):FALSE;
}
#define GetPluginNumber(Id) (CtrlObject?CtrlObject->Plugins.PluginGuidToPluginNumber(*Id):-1)
|
|
|
вспомнил, зачем VirtKey сбрасывался, хоть и некорректно. новый патчик |
|
|
build 2216 |
|
|
прежде чем убирать какое-то шаманство, нужно думать. |
|
|
1. ты о чем вообще? 2. почему у "шаманства" в коде нет комментарий "зачем"? |
|
|
шаманство не я писал. комментарий я добавил. но как бы очевидно, что если проверяется LCtrl+RAlt, а именно это генерится при вводе символов через RAlt, то это как минимум связано, не? |
|
|
После комментария становится понятно, но было не очевидно. Это ведь не во всех раскладках такие финты происходят. Может я действительно нажал LCtrl+RAlt+E? Ну, раз так, получается что про LCtrl+RAlt можно забыть, все комбинации с этими модификаторами вылетают. |
|
|
AltGr sometimes fails. |
|
|
AltGr1.diff (1,185 bytes)
Index: keyboard.cpp
===================================================================
--- keyboard.cpp (revision 8321)
+++ keyboard.cpp (working copy)
@@ -895,6 +895,8 @@
if (rec->EventType==KEY_EVENT)
{
+ static bool bForceAltGr = false;
+
if (!rec->Event.KeyEvent.bKeyDown)
{
was_repeat = false;
@@ -904,8 +906,21 @@
{
was_repeat = (last_pressed_keycode == rec->Event.KeyEvent.wVirtualKeyCode);
last_pressed_keycode = rec->Event.KeyEvent.wVirtualKeyCode;
+
+ if (rec->Event.KeyEvent.wVirtualKeyCode == VK_MENU)
+ {
+ // ��������� � AltGr (��������� ����������)
+ bForceAltGr = (rec->Event.KeyEvent.wVirtualScanCode == 0)
+ && ((rec->Event.KeyEvent.dwControlKeyState & 0x1F) == 0x0A);
+ }
}
+ if (bForceAltGr && (rec->Event.KeyEvent.dwControlKeyState & 0x1F) == 0x0A)
+ {
+ rec->Event.KeyEvent.dwControlKeyState &= ~LEFT_ALT_PRESSED;
+ rec->Event.KeyEvent.dwControlKeyState |= RIGHT_ALT_PRESSED;
+ }
+
DWORD CtrlState=rec->Event.KeyEvent.dwControlKeyState;
//_SVS(if(rec->EventType==KEY_EVENT)SysLog(L"[%d] if(rec->EventType==KEY_EVENT) >>> %s",__LINE__,_INPUT_RECORD_Dump(rec)));
|
|
|
Очередное колдунство. В некоторых случаях (Win8 & Onscreen keyboard) нажатие "AltGr+^" и "a" не приводит к ожидаемому результату - Far отрабатывает "AltGr+^" как Ctrl+Alt+]. |
|
|
TODO: Осталось починить, чтобы при вводе "AltGr+^" и "a" в панелях не всплывал QSearch. Он не должен появляться при нажатии "Dead key". |
|
|
>TODO: Вроде бы это уже выходит за рамки тикета? Не пора ли закрыть? |
|
|
С одиночными нажатиями модификаторов как-то странно сейчас: NameToInputRecord предполагает нажатие. InputRecordToName предполагает отпускание. В результате: far.InputRecordToName(far.NameToInputRecord"Shift")==nil И отдельная проблема: нет защиты от некорректных данных. Например: far.InputRecordToName(far.NameToInputRecord"LShift")=="t" |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2011-07-10 22:55 | Maximus | New Issue | |
| 2011-07-10 23:08 | Maximus | Note Added: 0007267 | |
| 2011-07-24 07:32 | vskirdin | Note Added: 0007304 | |
| 2011-07-26 14:19 | vskirdin | Note Added: 0007324 | |
| 2011-07-26 14:19 | vskirdin | Assigned To | => vskirdin |
| 2011-07-26 14:19 | vskirdin | Status | new => assigned |
| 2011-07-27 15:03 | Maximus | Note Added: 0007328 | |
| 2011-07-27 15:09 | Maximus | Note Edited: 0007328 | |
| 2011-07-27 16:06 | vskirdin | Note Added: 0007329 | |
| 2011-07-27 16:49 | Maximus | File Added: KeyTest.7z | |
| 2011-07-31 23:55 | Maximus | File Added: Keyboard.110731.diff | |
| 2011-07-31 23:58 | Maximus | File Added: KeyTest.2.7z | |
| 2011-08-01 00:01 | Maximus | Note Added: 0007341 | |
| 2011-08-01 06:19 | vskirdin | Note Added: 0007342 | |
| 2011-08-01 06:45 | Maximus | Note Added: 0007343 | |
| 2011-08-01 10:09 | vskirdin | Note Added: 0007344 | |
| 2011-08-01 10:23 | vskirdin | Note Added: 0007345 | |
| 2011-08-01 10:38 | vskirdin | Note Added: 0007346 | |
| 2011-08-01 10:46 | Maximus | Note Added: 0007347 | |
| 2011-08-01 10:47 | Maximus | Note Added: 0007348 | |
| 2011-08-01 10:49 | Maximus | Note Edited: 0007347 | |
| 2011-08-01 10:56 | Maximus | Note Added: 0007349 | |
| 2011-08-01 11:23 | vskirdin | Note Added: 0007350 | |
| 2011-08-01 11:25 | vskirdin | Note Added: 0007351 | |
| 2011-08-01 11:34 | DrKnS | Note Added: 0007352 | |
| 2011-08-01 11:43 | vskirdin | Note Added: 0007353 | |
| 2011-08-03 21:02 | Maximus | File Added: Keys110803.diff.7z | |
| 2011-08-03 21:05 | Maximus | Note Added: 0007396 | |
| 2011-08-03 21:07 | Maximus | Note Added: 0007397 | |
| 2011-08-03 23:14 | vskirdin | Note Added: 0007401 | |
| 2011-08-03 23:14 | vskirdin | Status | assigned => feedback |
| 2011-08-04 08:21 | DrKnS | Note Added: 0007402 | |
| 2011-08-04 18:51 | Maximus | File Added: Macro.110804.diff.7z | |
| 2011-08-04 18:53 | Maximus | Note Added: 0007403 | |
| 2011-08-04 18:53 | Maximus | Status | feedback => assigned |
| 2011-08-05 08:12 | vskirdin | Note Added: 0007404 | |
| 2011-08-05 08:12 | vskirdin | Status | assigned => feedback |
| 2011-08-09 14:25 | Maximus | File Added: Macro.110809.diff | |
| 2011-08-09 14:26 | Maximus | Note Added: 0007433 | |
| 2011-08-09 14:26 | Maximus | Status | feedback => assigned |
| 2011-08-09 19:22 | vskirdin | Note Added: 0007434 | |
| 2011-08-09 19:22 | vskirdin | Status | assigned => feedback |
| 2011-08-19 10:56 | DrKnS | Note Added: 0007498 | |
| 2011-08-24 23:32 | Maximus | File Added: RCtrlShiftDot.diff | |
| 2011-08-24 23:32 | Maximus | Note Added: 0007517 | |
| 2011-08-24 23:32 | Maximus | Status | feedback => assigned |
| 2011-08-25 05:58 | vskirdin | Note Added: 0007518 | |
| 2011-08-25 05:58 | vskirdin | Status | assigned => feedback |
| 2011-08-25 06:50 | Maximus | Note Added: 0007519 | |
| 2011-08-25 06:50 | Maximus | Status | feedback => assigned |
| 2011-08-25 06:50 | Maximus | File Added: RCtrlShiftDot2.diff | |
| 2011-08-25 07:31 | vskirdin | Note Added: 0007521 | |
| 2011-08-25 07:31 | vskirdin | Status | assigned => feedback |
| 2011-09-27 05:37 | Maximus | File Added: Keyboard.110927.diff | |
| 2011-09-27 05:37 | Maximus | Note Added: 0007753 | |
| 2011-09-27 05:37 | Maximus | Status | feedback => assigned |
| 2011-09-29 12:17 | Maximus | File Added: Keyboard.110929.diff | |
| 2011-09-29 12:18 | Maximus | Note Added: 0007759 | |
| 2011-09-30 11:55 | vskirdin | Note Added: 0007781 | |
| 2011-09-30 11:56 | vskirdin | Note Edited: 0007781 | |
| 2011-09-30 14:41 | Maximus | Note Added: 0007788 | |
| 2011-09-30 16:23 | vskirdin | Note Added: 0007789 | |
| 2011-09-30 19:00 | Maximus | Note Added: 0007790 | |
| 2011-09-30 19:09 | vskirdin | Note Added: 0007791 | |
| 2011-09-30 21:24 | Maximus | Note Added: 0007793 | |
| 2011-09-30 21:38 | Maximus | Note Added: 0007794 | |
| 2011-09-30 23:11 | Maximus | Note Added: 0007795 | |
| 2011-10-02 05:09 | Maximus | Note Edited: 0007795 | |
| 2011-10-05 18:52 | Maximus | Note Edited: 0007795 | |
| 2011-10-05 18:55 | Maximus | File Added: manager.111005.diff | |
| 2011-10-05 18:56 | Maximus | Note Added: 0007831 | |
| 2011-10-06 06:05 | vskirdin | Note Added: 0007836 | |
| 2011-10-06 12:00 | Maximus | Note Added: 0007840 | |
| 2011-10-06 12:08 | vskirdin | Note Added: 0007841 | |
| 2011-10-06 12:08 | vskirdin | Status | assigned => feedback |
| 2011-10-08 16:20 | shmuel | File Added: Keyboard.111008.diff | |
| 2011-10-08 16:40 | shmuel | Note Added: 0007847 | |
| 2011-10-08 18:22 | vskirdin | Note Added: 0007848 | |
| 2011-10-08 19:27 | Maximus | Status | feedback => assigned |
| 2011-10-08 21:56 | Maximus | Note Added: 0007851 | |
| 2011-10-09 11:33 | vskirdin | Note Added: 0007852 | |
| 2011-10-09 11:33 | vskirdin | Status | assigned => feedback |
| 2011-10-09 12:06 | shmuel | Note Added: 0007853 | |
| 2011-10-10 12:44 | Maximus | File Added: Keyboard.111010.diff | |
| 2011-10-10 12:45 | Maximus | Note Added: 0007855 | |
| 2011-10-10 12:45 | Maximus | Status | feedback => assigned |
| 2011-10-10 13:22 | vskirdin | Note Added: 0007856 | |
| 2011-10-10 13:22 | vskirdin | Status | assigned => feedback |
| 2011-10-21 22:32 | zg | Note Added: 0007948 | |
| 2011-10-22 07:49 | Maximus | Note Added: 0007949 | |
| 2011-10-22 07:49 | Maximus | Status | feedback => assigned |
| 2011-10-22 07:55 | zg | Note Added: 0007950 | |
| 2011-10-22 10:07 | Maximus | Note Added: 0007951 | |
| 2011-10-22 10:08 | Maximus | Note Edited: 0007951 | |
| 2011-12-23 11:13 | alexy | Build | => 2241 |
| 2011-12-23 11:13 | alexy | Status | assigned => closed |
| 2011-12-23 11:13 | alexy | Resolution | open => fixed |
| 2011-12-23 11:13 | alexy | Fixed in Version | => 3.0 |
| 2012-08-15 09:41 | 2useven10 | Relationship added | related to 0002135 |
| 2012-08-16 19:44 | Maximus | Note Added: 0009488 | |
| 2012-08-16 19:44 | Maximus | Status | closed => feedback |
| 2012-08-16 19:44 | Maximus | Resolution | fixed => reopened |
| 2012-08-16 19:45 | Maximus | File Added: AltGr1.diff | |
| 2012-08-16 19:49 | Maximus | Note Added: 0009489 | |
| 2012-08-16 19:49 | Maximus | Status | feedback => assigned |
| 2012-08-16 19:52 | Maximus | Note Added: 0009490 | |
| 2013-04-25 20:53 | 2useven10 | Relationship added | related to 0002397 |
| 2015-05-12 08:58 | JohnDoe | Note Added: 0013651 | |
| 2015-08-09 13:26 | JohnDoe | Note Added: 0013752 |