View Issue Details

IDProjectCategoryView StatusLast Update
0001832Far ManagerPlugins APIpublic2015-08-09 14:26
ReporterMaximus Assigned Tovskirdin  
PrioritynormalSeverityminorReproducibilityhave not tried
Status assignedResolutionreopened 
Product Version3.0 
Fixed in Version3.0 
Summary0001832: Проблема 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));
    }
TagsNo tags attached.
Build2241

Relationships

related to 0002135 closed2useven10 typing 'shift + letter' diacritic sequence also outputs the + character 
related to 0002397 new Wrong keycodes for CtrlAlt[ etc. 

Activities

Maximus

2011-07-11 00:08

reporter   bugnote:0007267

"RAltF" -> INPUT_RECORD -> "AltF"
"RCtrlR" -> INPUT_RECORD -> "CtrlR"

vskirdin

2011-07-24 08:32

administrator   bugnote:0007304

Ндя... с MsWheelUp (и еже с ним) прикольно получается.
особенно если учесть, что MsWheelUp это мышиное событие, а FarNameToInputRecord все гонит в KEY_EVENT :-)

vskirdin

2011-07-26 15:19

administrator   bugnote:0007324

проверь: http://skirda-file.googlecode.com/files/mantis%230001832.7z

Maximus

2011-07-27 16:03

reporter   bugnote:0007328

Last edited: 2011-07-27 16:09

View 2 revisions

Хм, стало немного лучше.
Похоже, FarNameToInputRecord теперь отрабатывает правильно.

Но! Опять проверяя пару FarNameToInputRecord ==> FarInputRecordToName
Получаем следующее
"MsWheelUp" ==> "" (\x01)
"RAltF" ==> "AltF"
"RAltBS" ==> "AltBS"
"RCtrlR" ==> "CtrlR"
"CtrlBreak" ==> "Break"

Исходники фара пока не патчил, это на собранном бинарнике из mantis#0001832.7z

vskirdin

2011-07-27 17:06

administrator   bugnote:0007329

> Опять проверяя пару FarNameToInputRecord ==> FarInputRecordToName
приаттач сюда "готовую проверялку"...

Maximus

2011-07-27 17:49

reporter  

KeyTest.7z (19,044 bytes)

Maximus

2011-08-01 00:55

reporter  

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)
Keyboard.110731.diff (14,947 bytes)   

Maximus

2011-08-01 00:58

reporter  

KeyTest.2.7z (19,127 bytes)

Maximus

2011-08-01 01:01

reporter   bugnote:0007341

Патч в первом приближении готов (в довесок к тому, что ты выложил).

Проблемы пока остались, например с кнопками:
"Shift-" (или "Shift_") - возвращают "None"
"RAltShift-" - возвращает "AltShift_".

vskirdin

2011-08-01 07:19

administrator   bugnote:0007342

Мыль тут... может пора ввести принудительное различие на Ctrl/RCtrl, Alt/RAlt?

Maximus

2011-08-01 07:45

reporter   bugnote:0007343

Кажется, так и нужно.
Пока что "неразличимыми" остались только комбинации с более чем одним модификатором. То есть лучше получить, например, "RAltRCtrl1" вместо "AltCtrl1".

И, может быть, для удобства в самом фаре не менять системные комбинации типа "AltIns", "Ctrl." и т.п.

vskirdin

2011-08-01 11:09

administrator   bugnote:0007344

> "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)|

vskirdin

2011-08-01 11:23

administrator   bugnote:0007345

Для "if (IntKeyState.ShiftPressed)" наверное имеет смысл:

case VK_OEM_MINUS:
    return KEY_SHIFT|KEY_SUBTRACT;
case VK_OEM_PLUS:
    return KEY_SHIFT|KEY_ADD;

Хотя тут сложности: "Shift-" это что? "Shift" и "-" на цифровой клаве или "-" на основной?

vskirdin

2011-08-01 11:38

administrator   bugnote:0007346

Хотя, лажа получается...
а кто из "-" делает VK_OEM_MINUS?

Maximus

2011-08-01 11:46

reporter   bugnote:0007347

Last edited: 2011-08-01 11:49

View 2 revisions

"-" на цифровой это VK_SUBTRACT. А в фаре это "Subtract". Так что кнопка "-_" это действительно OEM...

Maximus

2011-08-01 11:47

reporter   bugnote:0007348

Походу, еще вопросы возникли

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ƽ". Очевидно, я этого не нажимал.
Чего там лучше крутить - я пока не понял.

Maximus

2011-08-01 11:56

reporter   bugnote:0007349

С Shift-ом не понятно...
"Shift=" это (KEY_SHIFT|'=') или '+'?
Вообще, та же непонятка для всей цифробуквенной клавиатуры

vskirdin

2011-08-01 12:23

administrator   bugnote:0007350

"Shift-"
Я так думаю, что здесь нужно просто "_", без Shift.

> if ((CtrlState & 9)==9)
блин, валишь :-)
Этот кусок кода (7 строк) со времен Рошала не трогался - наверное у него спрашивать надо (но наврядли он вспомнит). Этот кусок может относится к мастдаю, хотя... ХЗ.
Попробуй его закомментить и посмотри на работу :-)

> Но это и макросы заденет.
Согласен (и не только макросы - много чего придется продублировать в самом коде ФАР), но, как мне кажется, оно того стоит.

> Думаю, что нужно идти по этому пути.
Разумно.

> Нажать Ctrl. Ctrl. AltShift-
Хмм..
TranslateKeyToVK()
...
VirtKey=VkKeyScan(static_cast<WCHAR>(FKey));
...
Здесь получаем VirtKey = 0x1BD...
Наверное нужно проверить на > 0xFF, но что тогда делать в этом случае?

vskirdin

2011-08-01 12:25

administrator   bugnote:0007351

"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,..."
:-)

DrKnS

2011-08-01 12:34

administrator   bugnote:0007352

> if ((CtrlState & 9)==9)

9 - это, типа, LEFT_CTRL_PRESSED|RIGHT_ALT_PRESSED.

Какое-то очень сильное колдунство.

vskirdin

2011-08-01 12:43

administrator   bugnote:0007353

а то!
в обчем пока 2122, а там видно будет.
Пока вот так:
"Shift-" (или "Shift_") ==> "_"
"RAltShift-" - возвращает "AltShift_".

Maximus

2011-08-03 22:02

reporter  

Keys110803.diff.7z (24,650 bytes)

Maximus

2011-08-03 22:05

reporter   bugnote:0007396

Патч по безобразиям с RCtrl/RAlt выложен.

Резюме: если за "правыми" комбинациями ранее не было зарезервировано каких-либо действия - фар реагирует на них так же как на "левые".

Изыски типа ПравыйCtrlЛевыйAlt+что-то - специально никак не обрабатываются (в смысле замен Правый->Левый не производится).

В макросах, как и везде, если на "правую" комбинацию ничего специально не было повешено - реагируем так же как на "левую".

Maximus

2011-08-03 22:07

reporter   bugnote:0007397

В двух местах
int TreeList::ProcessKey(int Key)
int FolderTree::ProcessKey(int Key)
нашел странность:
поиск с Alt-ом. Везде вроде бы Key<=65535 а там Key<=255.
Править пока не стал, но наверное надо на 65535 заменить?

vskirdin

2011-08-04 00:14

administrator   bugnote:0007401

build 2127

DrKnS

2011-08-04 09:21

administrator   bugnote:0007402

> В макросах, как и везде, если на "правую" комбинацию ничего специально не было повешено - реагируем так же как на "левую".

если на левой что-то висит - повесить на правую невозможно, только перезаписать.
Причём в диалоге подтверждения перезаписи утверждается, что макрос висит на правой, что не так.

Maximus

2011-08-04 19:51

reporter  

Macro.110804.diff.7z (1,462 bytes)

Maximus

2011-08-04 19:53

reporter   bugnote:0007403

1. теперь можно повесить и на правую
2. немного форматирования
3. неиспользуемая KeyMacro::GetRecordSize убрана под "#if 0"

vskirdin

2011-08-05 09:12

administrator   bugnote:0007404

build 2132

Maximus

2011-08-09 15:25

reporter  

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)
 			{
Macro.110809.diff (362 bytes)   

Maximus

2011-08-09 15:26

reporter   bugnote:0007433

В области Common вместо "правого" выполнялся "левый" макрос

vskirdin

2011-08-09 20:22

administrator   bugnote:0007434

build 2140

DrKnS

2011-08-19 11:56

administrator   bugnote:0007498

Отвалился правый CtrlShiftDot при записи макроса.

Maximus

2011-08-25 00:32

reporter  

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.diff (2,292 bytes)   

Maximus

2011-08-25 00:32

reporter   bugnote:0007517

вернул RCtrlShiftDot

vskirdin

2011-08-25 06:58

administrator   bugnote:0007518

где config.hpp?
и "?" пропустил в "Recording=((unsigned int)Key==Opt.Macro.Ke..." :-)

Maximus

2011-08-25 07:50

reporter   bugnote:0007519

Да, config.?pp что-то потерялся.
А про "?" - не понял, все на месте вроде.

Maximus

2011-08-25 07:50

reporter  

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);
RCtrlShiftDot2.diff (4,629 bytes)   

vskirdin

2011-08-25 08:31

administrator   bugnote:0007521

build 2166

Maximus

2011-09-27 06:37

reporter  

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.110927.diff (3,065 bytes)   

Maximus

2011-09-27 06:37

reporter   bugnote:0007753

И еще раз.

Maximus

2011-09-29 13:17

reporter  

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;
 }
Keyboard.110929.diff (4,553 bytes)   

Maximus

2011-09-29 13:18

reporter   bugnote:0007759

и еще

vskirdin

2011-09-30 12:55

administrator   bugnote:0007781

Last edited: 2011-09-30 12:56

View 2 revisions

прокомментируй последний патч.
что дает?
зачем удалено "case VK_F24+1:" и еже с ним (в CalcKeyCode)?

Maximus

2011-09-30 15:41

reporter   bugnote:0007788

Событие - мышиное. Тогда какого фига его преобразовывать в клавиатурное?. Ладно бы внутри фара, но это кривое событие дальше в плагины лезет.
Вобщем, удалять пережитки тяжелого прошлого...

vskirdin

2011-09-30 17:23

administrator   bugnote:0007789

...а в замен?
прочее проанализаировал?

Maximus

2011-09-30 20:00

reporter   bugnote:0007790

KeyCode (KEY_WHEEL_UP и т.п.) же возвращается. F24+N был только в KeyEvent.VirtualKey (чего быть для мыши не должно). Макрос назначенный на CtrlMsWheelUp сработал. Что еще проверить?

vskirdin

2011-09-30 20:09

administrator   bugnote:0007791

а как быть с 0001736 ? (см. комментарий к build 2038)

Maximus

2011-09-30 22:24

reporter   bugnote:0007793

Я там не вижу ни билда 2038, ни комментариев к нему. Может ты про 1946?

Maximus

2011-09-30 22:38

reporter   bugnote:0007794

Если ты про akey, то все akey отрабатывают на MsWheelUp (как с Ctrl/Shift/Alt, так и без) отрабатывают нормально. Как в самом фаре, так и в макролибе.

Maximus

2011-10-01 00:11

reporter   bugnote:0007795

Last edited: 2011-10-05 19:52

View 3 revisions

Вот, желающие могут потестить
http://conemu-maximus5.googlecode.com/files/far3.2212bis.x86.x64.7z

Maximus

2011-10-05 19:55

reporter  

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;
manager.111005.diff (592 bytes)   

Maximus

2011-10-05 19:56

reporter   bugnote:0007831

довесок к предыдущему патчу - не срабатывало колесо в панелях (и еще где может).
других глюков пока не выявлено

vskirdin

2011-10-06 07:05

administrator   bugnote:0007836

я имел в виду changelog#build 2038 - там описано для чего это делалось.
т.е. хочешь сказать, что сейчас этот код лишний (с учетом твоих двух последних патчей?)

Maximus

2011-10-06 13:00

reporter   bugnote:0007840

да, лишний.

макрос msgbox(akey(0),MsWheelDown) показывает
131076
131076

что и требуется

vskirdin

2011-10-06 13:08

administrator   bugnote:0007841

build 2214

shmuel

2011-10-08 17:20

developer  

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;
Keyboard.111008.diff (357 bytes)   

shmuel

2011-10-08 17:40

developer   bugnote:0007847

В 2214 у меня отвалился ввод букв в русской раскладке в одном из плагинов (там DI_USERCONTROL). Проверка показала, что при нажатии букв в русской раскладке в диалоговую процедуру вообще ничего не приходит. Методом перебора изменений в keyboard.cpp нашёл то, которое мешает. Патч приложен.

vskirdin

2011-10-08 19:22

administrator   bugnote:0007848

хмм... ну вы пока определитесь, кто у кого что удаляет...
...после консенсуса выкатывайте патч.

Maximus

2011-10-08 22:56

reporter   bugnote:0007851

не помню, зачем VirtKey обнуляется, но похоже, что "Keyboard.111008.diff" надо принять.

vskirdin

2011-10-09 12:33

administrator   bugnote:0007852

build 2215

shmuel

2011-10-09 13:06

developer   bugnote:0007853

2215 - в вышеупомянутом плагине стало ОК.

Maximus

2011-10-10 13:44

reporter  

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)
Keyboard.111010.diff (538 bytes)   

Maximus

2011-10-10 13:45

reporter   bugnote:0007855

вспомнил, зачем VirtKey сбрасывался, хоть и некорректно.
новый патчик

vskirdin

2011-10-10 14:22

administrator   bugnote:0007856

build 2216

zg

2011-10-21 23:32

developer   bugnote:0007948

прежде чем убирать какое-то шаманство, нужно думать.

Maximus

2011-10-22 08:49

reporter   bugnote:0007949

1. ты о чем вообще?
2. почему у "шаманства" в коде нет комментарий "зачем"?

zg

2011-10-22 08:55

developer   bugnote:0007950

шаманство не я писал.
комментарий я добавил.
но как бы очевидно, что если проверяется LCtrl+RAlt, а именно это генерится при вводе символов через RAlt, то это как минимум связано, не?

Maximus

2011-10-22 11:07

reporter   bugnote:0007951

Last edited: 2011-10-22 11:08

View 2 revisions

После комментария становится понятно, но было не очевидно. Это ведь не во всех раскладках такие финты происходят. Может я действительно нажал LCtrl+RAlt+E?
Ну, раз так, получается что про LCtrl+RAlt можно забыть, все комбинации с этими модификаторами вылетают.

Maximus

2012-08-16 20:44

reporter   bugnote:0009488

AltGr sometimes fails.

Maximus

2012-08-16 20:45

reporter  

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)));
AltGr1.diff (1,185 bytes)   

Maximus

2012-08-16 20:49

reporter   bugnote:0009489

Очередное колдунство. В некоторых случаях (Win8 & Onscreen keyboard) нажатие "AltGr+^" и "a" не приводит к ожидаемому результату - Far отрабатывает "AltGr+^" как Ctrl+Alt+].

Maximus

2012-08-16 20:52

reporter   bugnote:0009490

TODO: Осталось починить, чтобы при вводе "AltGr+^" и "a" в панелях не всплывал QSearch. Он не должен появляться при нажатии "Dead key".

JohnDoe

2015-05-12 09:58

updater   bugnote:0013651

>TODO:
Вроде бы это уже выходит за рамки тикета?

Не пора ли закрыть?

JohnDoe

2015-08-09 14:26

updater   bugnote:0013752

С одиночными нажатиями модификаторов как-то странно сейчас:
NameToInputRecord предполагает нажатие.
InputRecordToName предполагает отпускание.
В результате: far.InputRecordToName(far.NameToInputRecord"Shift")==nil

И отдельная проблема: нет защиты от некорректных данных.
Например: far.InputRecordToName(far.NameToInputRecord"LShift")=="t"

Issue History

Date Modified Username Field Change
2011-07-10 23:55 Maximus New Issue
2011-07-11 00:08 Maximus Note Added: 0007267
2011-07-24 08:32 vskirdin Note Added: 0007304
2011-07-26 15:19 vskirdin Note Added: 0007324
2011-07-26 15:19 vskirdin Assigned To => vskirdin
2011-07-26 15:19 vskirdin Status new => assigned
2011-07-27 16:03 Maximus Note Added: 0007328
2011-07-27 16:09 Maximus Note Edited: 0007328 View Revisions
2011-07-27 17:06 vskirdin Note Added: 0007329
2011-07-27 17:49 Maximus File Added: KeyTest.7z
2011-08-01 00:55 Maximus File Added: Keyboard.110731.diff
2011-08-01 00:58 Maximus File Added: KeyTest.2.7z
2011-08-01 01:01 Maximus Note Added: 0007341
2011-08-01 07:19 vskirdin Note Added: 0007342
2011-08-01 07:45 Maximus Note Added: 0007343
2011-08-01 11:09 vskirdin Note Added: 0007344
2011-08-01 11:23 vskirdin Note Added: 0007345
2011-08-01 11:38 vskirdin Note Added: 0007346
2011-08-01 11:46 Maximus Note Added: 0007347
2011-08-01 11:47 Maximus Note Added: 0007348
2011-08-01 11:49 Maximus Note Edited: 0007347 View Revisions
2011-08-01 11:56 Maximus Note Added: 0007349
2011-08-01 12:23 vskirdin Note Added: 0007350
2011-08-01 12:25 vskirdin Note Added: 0007351
2011-08-01 12:34 DrKnS Note Added: 0007352
2011-08-01 12:43 vskirdin Note Added: 0007353
2011-08-03 22:02 Maximus File Added: Keys110803.diff.7z
2011-08-03 22:05 Maximus Note Added: 0007396
2011-08-03 22:07 Maximus Note Added: 0007397
2011-08-04 00:14 vskirdin Note Added: 0007401
2011-08-04 00:14 vskirdin Status assigned => feedback
2011-08-04 09:21 DrKnS Note Added: 0007402
2011-08-04 19:51 Maximus File Added: Macro.110804.diff.7z
2011-08-04 19:53 Maximus Note Added: 0007403
2011-08-04 19:53 Maximus Status feedback => assigned
2011-08-05 09:12 vskirdin Note Added: 0007404
2011-08-05 09:12 vskirdin Status assigned => feedback
2011-08-09 15:25 Maximus File Added: Macro.110809.diff
2011-08-09 15:26 Maximus Note Added: 0007433
2011-08-09 15:26 Maximus Status feedback => assigned
2011-08-09 20:22 vskirdin Note Added: 0007434
2011-08-09 20:22 vskirdin Status assigned => feedback
2011-08-19 11:56 DrKnS Note Added: 0007498
2011-08-25 00:32 Maximus File Added: RCtrlShiftDot.diff
2011-08-25 00:32 Maximus Note Added: 0007517
2011-08-25 00:32 Maximus Status feedback => assigned
2011-08-25 06:58 vskirdin Note Added: 0007518
2011-08-25 06:58 vskirdin Status assigned => feedback
2011-08-25 07:50 Maximus Note Added: 0007519
2011-08-25 07:50 Maximus Status feedback => assigned
2011-08-25 07:50 Maximus File Added: RCtrlShiftDot2.diff
2011-08-25 08:31 vskirdin Note Added: 0007521
2011-08-25 08:31 vskirdin Status assigned => feedback
2011-09-27 06:37 Maximus File Added: Keyboard.110927.diff
2011-09-27 06:37 Maximus Note Added: 0007753
2011-09-27 06:37 Maximus Status feedback => assigned
2011-09-29 13:17 Maximus File Added: Keyboard.110929.diff
2011-09-29 13:18 Maximus Note Added: 0007759
2011-09-30 12:55 vskirdin Note Added: 0007781
2011-09-30 12:56 vskirdin Note Edited: 0007781 View Revisions
2011-09-30 15:41 Maximus Note Added: 0007788
2011-09-30 17:23 vskirdin Note Added: 0007789
2011-09-30 20:00 Maximus Note Added: 0007790
2011-09-30 20:09 vskirdin Note Added: 0007791
2011-09-30 22:24 Maximus Note Added: 0007793
2011-09-30 22:38 Maximus Note Added: 0007794
2011-10-01 00:11 Maximus Note Added: 0007795
2011-10-02 06:09 Maximus Note Edited: 0007795 View Revisions
2011-10-05 19:52 Maximus Note Edited: 0007795 View Revisions
2011-10-05 19:55 Maximus File Added: manager.111005.diff
2011-10-05 19:56 Maximus Note Added: 0007831
2011-10-06 07:05 vskirdin Note Added: 0007836
2011-10-06 13:00 Maximus Note Added: 0007840
2011-10-06 13:08 vskirdin Note Added: 0007841
2011-10-06 13:08 vskirdin Status assigned => feedback
2011-10-08 17:20 shmuel File Added: Keyboard.111008.diff
2011-10-08 17:40 shmuel Note Added: 0007847
2011-10-08 19:22 vskirdin Note Added: 0007848
2011-10-08 20:27 Maximus Status feedback => assigned
2011-10-08 22:56 Maximus Note Added: 0007851
2011-10-09 12:33 vskirdin Note Added: 0007852
2011-10-09 12:33 vskirdin Status assigned => feedback
2011-10-09 13:06 shmuel Note Added: 0007853
2011-10-10 13:44 Maximus File Added: Keyboard.111010.diff
2011-10-10 13:45 Maximus Note Added: 0007855
2011-10-10 13:45 Maximus Status feedback => assigned
2011-10-10 14:22 vskirdin Note Added: 0007856
2011-10-10 14:22 vskirdin Status assigned => feedback
2011-10-21 23:32 zg Note Added: 0007948
2011-10-22 08:49 Maximus Note Added: 0007949
2011-10-22 08:49 Maximus Status feedback => assigned
2011-10-22 08:55 zg Note Added: 0007950
2011-10-22 11:07 Maximus Note Added: 0007951
2011-10-22 11:08 Maximus Note Edited: 0007951 View Revisions
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 10:41 2useven10 Relationship added related to 0002135
2012-08-16 20:44 Maximus Note Added: 0009488
2012-08-16 20:44 Maximus Status closed => feedback
2012-08-16 20:44 Maximus Resolution fixed => reopened
2012-08-16 20:45 Maximus File Added: AltGr1.diff
2012-08-16 20:49 Maximus Note Added: 0009489
2012-08-16 20:49 Maximus Status feedback => assigned
2012-08-16 20:52 Maximus Note Added: 0009490
2013-04-25 21:53 2useven10 Relationship added related to 0002397
2015-05-12 09:58 JohnDoe Note Added: 0013651
2015-08-09 14:26 JohnDoe Note Added: 0013752