diff --git a/Common/WinApi.cs b/Common/WinApi.cs new file mode 100644 index 0000000..c0d0011 --- /dev/null +++ b/Common/WinApi.cs @@ -0,0 +1,253 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using SharpDX.DirectInput; + +namespace SCJMapper_V2.Common +{ + static class WinApi + { + public const string LibraryName = "user32"; + + internal static class Properties + { +#if !ANSI + public const CharSet BuildCharSet = CharSet.Unicode; +#else + public const CharSet BuildCharSet = CharSet.Ansi; +#endif + } + + /// + /// The set of valid MapTypes used in MapVirtualKey + /// + public enum VirtualKeyMapType + { + + /// + /// The uCode parameter is a virtual-key code and is translated into a scan code. + /// If it is a virtual-key code that does not distinguish between left- and right-hand keys, + /// the left-hand scan code is returned. + /// If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_VSC = 0x0, + + /// + /// The uCode parameter is a scan code and is translated into a virtual-key code that does + /// not distinguish between left- and right-hand keys. + /// If there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK = 0x1, + + /// + /// The uCode parameter is a virtual-key code and is translated into an unshifted character + /// value in the low order word of the return value. Dead keys (diacritics) are indicated + /// by setting the top bit of the return value. + /// If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_CHAR = 0x2, + + /// + /// The uCode parameter is a scan code and is translated into a virtual-key code that + /// distinguishes between left- and right-hand keys. + /// If there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK_EX = 0x3, + + /// + /// The uCode parameter is a virtual-key code and is translated into a scan code. + /// If it is a virtual-key code that does not distinguish between left- and right-hand keys, + /// the left-hand scan code is returned. If the scan code is an extended scan code, + /// the high byte of the uCode value can contain either 0xe0 or 0xe1 to specify the extended scan code. + /// If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_VSC_EX = 0x4, + } + + /// + /// Translates (maps) a virtual-key code into a scan code or character value, + /// or translates a scan code into a virtual-key code. + /// The function translates the codes using the input language and an input locale identifier. + /// + /// NOTE: DX Keycodes are VSC codes (Scan Codes) + /// + /// Scan code for a key. + /// Starting with Windows Vista, the high byte of the uCode value can contain + /// either 0xe0 or 0xe1 to specify the extended scan code. + /// + /// MAPVK_VSC_TO_VK, MAPVK_VSC_TO_VK_EX + /// nput locale identifier to use for translating the specified code. + /// Either a scan code, a virtual-key code, or a character value, + /// depending on the value of uCode and uMapType. + /// If there is no translation, the return value is zero. + /// + [DllImport( LibraryName, CharSet = Properties.BuildCharSet )] + public static extern uint MapVirtualKeyEx( uint uCode, VirtualKeyMapType uMapType, IntPtr dwhkl ); + + /// + /// Translates (maps) a virtual-key code into a scan code or character value, + /// or translates a scan code into a virtual-key code. + /// The function translates the codes using the input language and an input locale identifier. + /// + /// NOTE: DX Keycodes are VSC codes + /// + /// The virtual-key code for a key. + /// Starting with Windows Vista, the high byte of the uCode value can contain + /// either 0xe0 or 0xe1 to specify the extended scan code. + /// + /// MAPVK_VK_TO_VSC, MAPVK_VK_TO_CHAR, MAPVK_VK_TO_VSC_EX + /// nput locale identifier to use for translating the specified code. + /// Either a scan code, a virtual-key code, or a character value, + /// depending on the value of uCode and uMapType. + /// If there is no translation, the return value is zero. + /// + [DllImport( LibraryName, CharSet = Properties.BuildCharSet )] + public static extern uint MapVirtualKeyEx( VirtualKey uCode, VirtualKeyMapType uMapType, IntPtr dwhkl ); + + /// + /// The above does not work great - cannot get Navigation buttons, returns Numpad as Navig. e.g. NumLock OFF (seems to be stuck with the OLD DOS PC Keyboard layout...) + /// We only need the Alpha Keyboard to be translated by the MS routine.. + /// + /// The ScanCode + /// + /// + /// + public static string KbdScanCodeToVK( uint uCode ) + { + switch ( uCode ) { + // handle modifiers first + case (uint)Key.LeftAlt: return "LAlt"; + case (uint)Key.RightAlt: return "RAlt"; + case (uint)Key.LeftShift: return "LShift"; + case (uint)Key.RightShift: return "RShift"; + case (uint)Key.LeftControl: return "LCtrl"; + case (uint)Key.RightControl: return "RCtrl"; + + // all keys where the DX name does not match the SC name + // Numpad + case (uint)Key.NumberLock: return "N.Lck"; + case (uint)Key.Divide: return "NP /"; + case (uint)Key.Multiply: return "NP *"; + case (uint)Key.Subtract: return "NP -"; + case (uint)Key.Add: return "NP +"; + case (uint)Key.Decimal: return "NP ."; + case (uint)Key.NumberPadEnter: return "NP ←┘"; + case (uint)Key.NumberPad0: return "NP 0"; + case (uint)Key.NumberPad1: return "NP 1"; + case (uint)Key.NumberPad2: return "NP 2"; + case (uint)Key.NumberPad3: return "NP 3"; + case (uint)Key.NumberPad4: return "NP 4"; + case (uint)Key.NumberPad5: return "NP 5"; + case (uint)Key.NumberPad6: return "NP 6"; + case (uint)Key.NumberPad7: return "NP 7"; + case (uint)Key.NumberPad8: return "NP 8"; + case (uint)Key.NumberPad9: return "NP 9"; + // Digits + case (uint)Key.D0: return "0"; + case (uint)Key.D1: return "1"; + case (uint)Key.D2: return "2"; + case (uint)Key.D3: return "3"; + case (uint)Key.D4: return "4"; + case (uint)Key.D5: return "5"; + case (uint)Key.D6: return "6"; + case (uint)Key.D7: return "7"; + case (uint)Key.D8: return "8"; + case (uint)Key.D9: return "9"; + // navigation + case (uint)Key.Insert: return "Ins"; + case (uint)Key.Home: return "⸠◄9"; + case (uint)Key.Delete: return "Del"; + case (uint)Key.End: return "►⸡"; + case (uint)Key.PageUp: return "Pg▲"; + case (uint)Key.PageDown: return "Pg▼"; + case (uint)Key.PrintScreen: return "PrtScr"; + case (uint)Key.ScrollLock: return "ScrlLck"; + case (uint)Key.Pause: return "Pause"; + // Arrows + case (uint)Key.Up: return "↑"; + case (uint)Key.Down: return "↓"; + case (uint)Key.Left: return "←"; + case (uint)Key.Right: return "→"; + // non letters + case (uint)Key.Period: return "."; + case (uint)Key.Minus: return "-"; + case (uint)Key.Equals: return "="; + case (uint)Key.Return: return "←┘"; + /* + case (uint)Key.Grave: return "^"; + case (uint)Key.Escape: return "→"; + case (uint)Key.Underline: key += "underline+"; break; + case (uint)Key.Back: key += "backspace+"; break; + case (uint)Key.Tab: key += "tab+"; break; + case (uint)Key.LeftBracket: key += "lbracket+"; break; + case (uint)Key.RightBracket: key += "rbracket+"; break; + case (uint)Key.Capital: key += "capslock+"; break; + case (uint)Key.Colon: key += "colon+"; break; + case (uint)Key.Backslash: key += "backslash+"; break; + case (uint)Key.Comma: key += "comma+"; break; + case (uint)Key.Slash: key += "slash+"; break; + case (uint)Key.Space: key += "space+"; break; + case (uint)Key.Semicolon: key += "semicolon+"; break; + case (uint)Key.Apostrophe: key += "apostrophe+"; break; + */ + // all where the lowercase DX name matches the SC name + default: + uint vKeyCode = MapVirtualKeyEx( uCode, VirtualKeyMapType.MAPVK_VSC_TO_VK_EX, IntPtr.Zero ); + string key = ( (System.Windows.Forms.Keys)vKeyCode ).ToString( ); + if ( key.StartsWith( "Oem" ) ) { + key = GetCharFromKey( vKeyCode ); // try this ... + } + return key; + } + } + + + [DllImport( LibraryName, ExactSpelling = true )] + public static extern uint ToAscii( uint uVirtKey, uint uScanCode, [MarshalAs( UnmanagedType.LPArray, SizeConst = 256 )] byte[] lpbKeyState, out uint lpwTransKey, uint uFlags ); + + [DllImport( LibraryName, ExactSpelling = true )] + public static extern uint ToUnicode( uint wVirtKey, uint wScanCode, [MarshalAs( UnmanagedType.LPArray, SizeConst = 256 )] byte[] lpbKeyState, out uint pwszBuff, int cchBuff, uint uFlags ); + + [DllImport( LibraryName, ExactSpelling = true )] + public static extern bool GetKeyboardState( [MarshalAs( UnmanagedType.LPArray, SizeConst = 256 )] out byte[] lpKeyState ); + + [DllImport( LibraryName, ExactSpelling = true )] + [return: MarshalAs( UnmanagedType.Bool )] + static extern bool GetKeyboardState( byte[] lpKeyState ); + + [DllImport( LibraryName, ExactSpelling = true )] + public static extern bool GetKeyboardState( IntPtr lpKeyState ); + + public static string GetCharFromKey( uint virtKeyCode ) + { + byte[] keyBoardState = new byte[256]; + if ( GetKeyboardState( keyBoardState ) ) { + if ( ToAscii( virtKeyCode, 0, keyBoardState, out uint outChar, 0 ) < 0 ) { + // dead key i.e. not a pressed one + if ( outChar <= 255 ) { + return ( (char)outChar ).ToString( ); + } + else { + //return Microsoft.VisualBasic.Left(StrConv(ChrW(Out), vbUnicode), 1) + //return Microsoft.VisualBasic.Left(StrConv(ChrW(Out), VbStrConv.None), 1) + return ( (char)outChar ).ToString( ); + } + + } + else { + return ( (char)outChar ).ToString( ); + } + + } + else { + return ""; + } + + } + + + } +} diff --git a/Common/WinApi_InputConst.cs b/Common/WinApi_InputConst.cs new file mode 100644 index 0000000..6bc3dbd --- /dev/null +++ b/Common/WinApi_InputConst.cs @@ -0,0 +1,671 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace SCJMapper_V2.Common +{ +// From winuser.h +// + + [Flags] + public enum KeyModifierFlags + { + /// + /// Either ALT key must be held down. + /// + MOD_ALT = 0x0001, + + /// + /// Either CTRL key must be held down. + /// + MOD_CONTROL = 0x0002, + + /// + /// Changes the hotkey behavior so that the keyboard auto-repeat does not yield multiple hotkey notifications. + /// Windows Vista: This flag is not supported. + /// + MOD_NOREPEAT = 0x4000, + + /// + /// Either SHIFT key must be held down. + /// + MOD_SHIFT = 0x0004, + + /// + /// Either WINDOWS key was held down. These keys are labeled with the Windows logo. Keyboard shortcuts that involve the + /// WINDOWS key are reserved for use by the operating system. + /// + MOD_WIN = 0x0008 + } + + [Flags] + public enum MouseInputKeyStateFlags + { + /// + /// The CTRL key is down. + /// + MK_CONTROL = 0x0008, + + /// + /// The left mouse button is down. + /// + MK_LBUTTON = 0x0001, + + /// + /// The middle mouse button is down. + /// + MK_MBUTTON = 0x0010, + + /// + /// The right mouse button is down. + /// + MK_RBUTTON = 0x0002, + + /// + /// The SHIFT key is down. + /// + MK_SHIFT = 0x0004, + + /// + /// The first X button is down. + /// + MK_XBUTTON1 = 0x0020, + + /// + /// The second X button is down. + /// + MK_XBUTTON2 = 0x0040 + } + + [Flags] + public enum HotKeyInputState + { + /// + /// Either ALT key was held down. + /// + MOD_ALT = 0x0001, + + /// + /// Either CTRL key was held down. + /// + MOD_CONTROL = 0x0002, + + /// + /// Either SHIFT key was held down. + /// + MOD_SHIFT = 0x0004, + + /// + /// Either WINDOWS key was held down. These keys are labeled with the Windows logo. Hotkeys that involve the Windows + /// key are reserved for use by the operating system. + /// + MOD_WIN = 0x0008 + } + + [Flags] + public enum MouseInputXButtonFlag + { + /// + /// The first X button was clicked. + /// + XBUTTON1 = 0x0001, + + /// + /// The second X button was clicked. + /// + XBUTTON2 = 0x0002 + } + + [Flags] + public enum MouseInputFlags + { + /// + /// The dx and dy members contain normalized absolute coordinates. If the flag is not set, dxand dy contain relative + /// data (the change in position since the last reported position). This flag can be set, or not set, regardless of + /// what kind of mouse or other pointing device, if any, is connected to the system. For further information about + /// relative mouse motion, see the following Remarks section. + /// + MOUSEEVENTF_ABSOLUTE = 0x8000, + + /// + /// The wheel was moved horizontally, if the mouse has a wheel. The amount of movement is specified in mouseData. + /// Windows XP/2000: This value is not supported. + /// + MOUSEEVENTF_HWHEEL = 0x01000, + + /// + /// Movement occurred. + /// + MOUSEEVENTF_MOVE = 0x0001, + + /// + /// The WM_MOUSEMOVE messages will not be coalesced. The default behavior is to coalesce WM_MOUSEMOVE messages. + /// Windows XP/2000: This value is not supported. + /// + MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000, + + /// + /// The left button was pressed. + /// + MOUSEEVENTF_LEFTDOWN = 0x0002, + + /// + /// The left button was released. + /// + MOUSEEVENTF_LEFTUP = 0x0004, + + /// + /// The right button was pressed. + /// + MOUSEEVENTF_RIGHTDOWN = 0x0008, + + /// + /// The right button was released. + /// + MOUSEEVENTF_RIGHTUP = 0x0010, + + /// + /// The middle button was pressed. + /// + MOUSEEVENTF_MIDDLEDOWN = 0x0020, + + /// + /// The middle button was released. + /// + MOUSEEVENTF_MIDDLEUP = 0x0040, + + /// + /// Maps coordinates to the entire desktop. Must be used with MOUSEEVENTF_ABSOLUTE. + /// + MOUSEEVENTF_VIRTUALDESK = 0x4000, + + /// + /// The wheel was moved, if the mouse has a wheel. The amount of movement is specified in mouseData. + /// + MOUSEEVENTF_WHEEL = 0x0800, + + /// + /// An X button was pressed. + /// + MOUSEEVENTF_XDOWN = 0x0080, + + /// + /// An X button was released. + /// + MOUSEEVENTF_XUP = 0x0100 + } + + [Flags] + public enum KeyboardInputFlags + { + /// + /// If specified, the scan code was preceded by a prefix byte that has the value 0xE0 (224). + /// + KEYEVENTF_EXTENDEDKEY = 0x0001, + + /// + /// If specified, the key is being released. If not specified, the key is being pressed. + /// + KEYEVENTF_KEYUP = 0x0002, + + /// + /// If specified, wScan identifies the key and wVk is ignored. + /// + KEYEVENTF_SCANCODE = 0x0008, + + /// + /// If specified, the system synthesizes a VK_PACKET keystroke. The wVk parameter must be zero. This flag can only be + /// combined with the KEYEVENTF_KEYUP flag. For more information, see the Remarks section. + /// + KEYEVENTF_UNICODE = 0x0004 + } + + [Flags] + public enum CursorInfoFlags + { + /// + /// The cursor is showing. + /// + CURSOR_SHOWING = 0x00000001, + + /// + /// Windows 8: The cursor is suppressed. This flag indicates that the system is not drawing the cursor because the user + /// is providing input through touch or pen instead of the mouse. + /// + CURSOR_SUPPRESSED = 0x00000002 + } + + public enum InputType + { + /// + /// The event is a mouse event. Use the mi structure of the union. + /// + INPUT_MOUSE = 0, + + /// + /// The event is a keyboard event. Use the ki structure of the union. + /// + INPUT_KEYBOARD = 1, + + /// + /// The event is a hardware event. Use the hi structure of the union. + /// + INPUT_HARDWARE = 2 + } + + public enum VirtualKeyMapType + { + /// + /// The uCode parameter is a virtual-key code and is translated into an unshifted character value in the low order word + /// of the return value. Dead keys (diacritics) are indicated by setting the top bit of the return value. If there is + /// no translation, the function returns 0. + /// + MAPVK_VK_TO_CHAR = 2, + + /// + /// The uCode parameter is a virtual-key code and is translated into a scan code. If it is a virtual-key code that does + /// not distinguish between left- and right-hand keys, the left-hand scan code is returned. If there is no translation, + /// the function returns 0. + /// + MAPVK_VK_TO_VSC = 0, + + /// + /// The uCode parameter is a virtual-key code and is translated into a scan code. If it is a virtual-key code that does + /// not distinguish between left- and right-hand keys, the left-hand scan code is returned. If the scan code is an + /// extended scan code, the high byte of the uCode value can contain either 0xe0 or 0xe1 to specify the extended scan + /// code. If there is no translation, the function returns 0. + /// + MAPVK_VK_TO_VSC_EX = 4, + + /// + /// The uCode parameter is a scan code and is translated into a virtual-key code that does not distinguish between + /// left- and right-hand keys. If there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK = 1, + + /// + /// The uCode parameter is a scan code and is translated into a virtual-key code that distinguishes between left- and + /// right-hand keys. If there is no translation, the function returns 0. + /// + MAPVK_VSC_TO_VK_EX = 3 + } + + public enum VirtualKey + { + LBUTTON = 0x01, + RBUTTON = 0x02, + CANCEL = 0x03, + MBUTTON = 0x04 /* NOT contiguous with L & RBUTTON */, + XBUTTON1 = 0x05 /* NOT contiguous with L & RBUTTON */, + XBUTTON2 = 0x06 /* NOT contiguous with L & RBUTTON */, + BACK = 0x08, + TAB = 0x09, + CLEAR = 0x0C, + RETURN = 0x0D, + SHIFT = 0x10, + CONTROL = 0x11, + MENU = 0x12, + PAUSE = 0x13, + CAPITAL = 0x14, + KANA = 0x15, + HANGEUL = 0x15 /* old name - should be here for compatibility */, + HANGUL = 0x15, + JUNJA = 0x17, + FINAL = 0x18, + HANJA = 0x19, + KANJI = 0x19, + ESCAPE = 0x1B, + CONVERT = 0x1C, + NONCONVERT = 0x1D, + ACCEPT = 0x1E, + MODECHANGE = 0x1F, + SPACE = 0x20, + PRIOR = 0x21, + NEXT = 0x22, + END = 0x23, + HOME = 0x24, + LEFT = 0x25, + UP = 0x26, + RIGHT = 0x27, + DOWN = 0x28, + SELECT = 0x29, + PRINT = 0x2A, + EXECUTE = 0x2B, + SNAPSHOT = 0x2C, + INSERT = 0x2D, + DELETE = 0x2E, + HELP = 0x2F, + LWIN = 0x5B, + RWIN = 0x5C, + APPS = 0x5D, + SLEEP = 0x5F, + NUMPAD0 = 0x60, + NUMPAD1 = 0x61, + NUMPAD2 = 0x62, + NUMPAD3 = 0x63, + NUMPAD4 = 0x64, + NUMPAD5 = 0x65, + NUMPAD6 = 0x66, + NUMPAD7 = 0x67, + NUMPAD8 = 0x68, + NUMPAD9 = 0x69, + MULTIPLY = 0x6A, + ADD = 0x6B, + SEPARATOR = 0x6C, + SUBTRACT = 0x6D, + DECIMAL = 0x6E, + DIVIDE = 0x6F, + F1 = 0x70, + F2 = 0x71, + F3 = 0x72, + F4 = 0x73, + F5 = 0x74, + F6 = 0x75, + F7 = 0x76, + F8 = 0x77, + F9 = 0x78, + F10 = 0x79, + F11 = 0x7A, + F12 = 0x7B, + F13 = 0x7C, + F14 = 0x7D, + F15 = 0x7E, + F16 = 0x7F, + F17 = 0x80, + F18 = 0x81, + F19 = 0x82, + F20 = 0x83, + F21 = 0x84, + F22 = 0x85, + F23 = 0x86, + F24 = 0x87, + NUMLOCK = 0x90, + SCROLL = 0x91, + OEM_NEC_EQUAL = 0x92, // '=' key on numpad, + OEM_FJ_JISHO = 0x92, // 'Dictionary' key, + OEM_FJ_MASSHOU = 0x93, // 'Unregister word' key, + OEM_FJ_TOUROKU = 0x94, // 'Register word' key, + OEM_FJ_LOYA = 0x95, // 'Left OYAYUBI' key, + OEM_FJ_ROYA = 0x96, // 'Right OYAYUBI' key, + LSHIFT = 0xA0, + RSHIFT = 0xA1, + LCONTROL = 0xA2, + RCONTROL = 0xA3, + LMENU = 0xA4, + RMENU = 0xA5, + BROWSER_BACK = 0xA6, + BROWSER_FORWARD = 0xA7, + BROWSER_REFRESH = 0xA8, + BROWSER_STOP = 0xA9, + BROWSER_SEARCH = 0xAA, + BROWSER_FAVORITES = 0xAB, + BROWSER_HOME = 0xAC, + VOLUME_MUTE = 0xAD, + VOLUME_DOWN = 0xAE, + VOLUME_UP = 0xAF, + MEDIA_NEXT_TRACK = 0xB0, + MEDIA_PREV_TRACK = 0xB1, + MEDIA_STOP = 0xB2, + MEDIA_PLAY_PAUSE = 0xB3, + LAUNCH_MAIL = 0xB4, + LAUNCH_MEDIA_SELECT = 0xB5, + LAUNCH_APP1 = 0xB6, + LAUNCH_APP2 = 0xB7, + OEM_1 = 0xBA, // ';:' for US, + OEM_PLUS = 0xBB, // '+' any country, + OEM_COMMA = 0xBC, // ',' any country, + OEM_MINUS = 0xBD, // '-' any country, + OEM_PERIOD = 0xBE, // '.' any country, + OEM_2 = 0xBF, // '/?' for US, + OEM_3 = 0xC0, // '`~' for US, + OEM_4 = 0xDB, // '[{' for US, + OEM_5 = 0xDC, // '\|' for US, + OEM_6 = 0xDD, // ']}' for US, + OEM_7 = 0xDE, // ''"' for US, + OEM_8 = 0xDF, + OEM_AX = 0xE1, // 'AX' key on Japanese AX kbd, + OEM_102 = 0xE2, // "<>" or "\|" on RT 102-key kbd., + ICO_HELP = 0xE3, // Help key on ICO, + ICO_00 = 0xE4, // 00 key on ICO, + PROCESSKEY = 0xE5, + ICO_CLEAR = 0xE6, + PACKET = 0xE7, + OEM_RESET = 0xE9, + OEM_JUMP = 0xEA, + OEM_PA1 = 0xEB, + OEM_PA2 = 0xEC, + OEM_PA3 = 0xED, + OEM_WSCTRL = 0xEE, + OEM_CUSEL = 0xEF, + OEM_ATTN = 0xF0, + OEM_FINISH = 0xF1, + OEM_COPY = 0xF2, + OEM_AUTO = 0xF3, + OEM_ENLW = 0xF4, + OEM_BACKTAB = 0xF5, + ATTN = 0xF6, + CRSEL = 0xF7, + EXSEL = 0xF8, + EREOF = 0xF9, + PLAY = 0xFA, + ZOOM = 0xFB, + NONAME = 0xFC, + PA1 = 0xFD, + OEM_CLEAR = 0xFE, + A = 0x41, + B = 0x42, + C = 0x43, + D = 0x44, + E = 0x45, + F = 0x46, + G = 0x47, + H = 0x48, + I = 0x49, + J = 0x4a, + K = 0x4b, + L = 0x4c, + M = 0x4d, + N = 0x4e, + O = 0x4f, + P = 0x50, + Q = 0x51, + R = 0x52, + S = 0x53, + T = 0x54, + U = 0x55, + V = 0x56, + W = 0x57, + X = 0x58, + Y = 0x59, + Z = 0x5a, + D0 = 0x30, + D1 = 0x31, + D2 = 0x32, + D3 = 0x33, + D4 = 0x34, + D5 = 0x35, + D6 = 0x36, + D7 = 0x37, + D8 = 0x38, + D9 = 0x39 + } + + public enum ScanCodes + { + LBUTTON = 0, + RBUTTON = 0, + CANCEL = 70, + MBUTTON = 0, + XBUTTON1 = 0, + XBUTTON2 = 0, + BACK = 14, + TAB = 15, + CLEAR = 76, + RETURN = 28, + SHIFT = 42, + CONTROL = 29, + MENU = 56, + PAUSE = 0, + CAPITAL = 58, + KANA = 0, + HANGUL = 0, + JUNJA = 0, + FINAL = 0, + HANJA = 0, + KANJI = 0, + ESCAPE = 1, + CONVERT = 0, + NONCONVERT = 0, + ACCEPT = 0, + MODECHANGE = 0, + SPACE = 57, + PRIOR = 73, + NEXT = 81, + END = 79, + HOME = 71, + LEFT = 75, + UP = 72, + RIGHT = 77, + DOWN = 80, + SELECT = 0, + PRINT = 0, + EXECUTE = 0, + SNAPSHOT = 84, + INSERT = 82, + DELETE = 83, + HELP = 99, + KEY_0 = 11, + KEY_1 = 2, + KEY_2 = 3, + KEY_3 = 4, + KEY_4 = 5, + KEY_5 = 6, + KEY_6 = 7, + KEY_7 = 8, + KEY_8 = 9, + KEY_9 = 10, + KEY_A = 30, + KEY_B = 48, + KEY_C = 46, + KEY_D = 32, + KEY_E = 18, + KEY_F = 33, + KEY_G = 34, + KEY_H = 35, + KEY_I = 23, + KEY_J = 36, + KEY_K = 37, + KEY_L = 38, + KEY_M = 50, + KEY_N = 49, + KEY_O = 24, + KEY_P = 25, + KEY_Q = 16, + KEY_R = 19, + KEY_S = 31, + KEY_T = 20, + KEY_U = 22, + KEY_V = 47, + KEY_W = 17, + KEY_X = 45, + KEY_Y = 21, + KEY_Z = 44, + LWIN = 91, + RWIN = 92, + APPS = 93, + SLEEP = 95, + NUMPAD0 = 82, + NUMPAD1 = 79, + NUMPAD2 = 80, + NUMPAD3 = 81, + NUMPAD4 = 75, + NUMPAD5 = 76, + NUMPAD6 = 77, + NUMPAD7 = 71, + NUMPAD8 = 72, + NUMPAD9 = 73, + MULTIPLY = 55, + ADD = 78, + SEPARATOR = 0, + SUBTRACT = 74, + DECIMAL = 83, + DIVIDE = 53, + F1 = 59, + F2 = 60, + F3 = 61, + F4 = 62, + F5 = 63, + F6 = 64, + F7 = 65, + F8 = 66, + F9 = 67, + F10 = 68, + F11 = 87, + F12 = 88, + F13 = 100, + F14 = 101, + F15 = 102, + F16 = 103, + F17 = 104, + F18 = 105, + F19 = 106, + F20 = 107, + F21 = 108, + F22 = 109, + F23 = 110, + F24 = 118, + NUMLOCK = 69, + SCROLL = 70, + LSHIFT = 42, + RSHIFT = 54, + LCONTROL = 29, + RCONTROL = 29, + LMENU = 56, + RMENU = 56, + BROWSER_BACK = 106, + BROWSER_FORWARD = 105, + BROWSER_REFRESH = 103, + BROWSER_STOP = 104, + BROWSER_SEARCH = 101, + BROWSER_FAVORITES = 102, + BROWSER_HOME = 50, + VOLUME_MUTE = 32, + VOLUME_DOWN = 46, + VOLUME_UP = 48, + MEDIA_NEXT_TRACK = 25, + MEDIA_PREV_TRACK = 16, + MEDIA_STOP = 36, + MEDIA_PLAY_PAUSE = 34, + LAUNCH_MAIL = 108, + LAUNCH_MEDIA_SELECT = 109, + LAUNCH_APP1 = 107, + LAUNCH_APP2 = 33, + OEM_1 = 39, + OEM_PLUS = 13, + OEM_COMMA = 51, + OEM_MINUS = 12, + OEM_PERIOD = 52, + OEM_2 = 53, + OEM_3 = 41, + OEM_4 = 26, + OEM_5 = 43, + OEM_6 = 27, + OEM_7 = 40, + OEM_8 = 0, + OEM_102 = 86, + PROCESSKEY = 0, + PACKET = 0, + ATTN = 0, + CRSEL = 0, + EXSEL = 0, + EREOF = 93, + PLAY = 0, + ZOOM = 98, + NONAME = 0, + PA1 = 0, + OEM_CLEAR = 0 + } +} \ No newline at end of file diff --git a/Devices/Keyboard/KeyboardCls.cs b/Devices/Keyboard/KeyboardCls.cs index f725c65..61975a1 100644 --- a/Devices/Keyboard/KeyboardCls.cs +++ b/Devices/Keyboard/KeyboardCls.cs @@ -24,6 +24,8 @@ namespace SCJMapper_V2.Devices.Keyboard public new const string DeviceClass = "keyboard"; // the device name used throughout this app public new const string DeviceID = "kb1_"; static public int RegisteredDevices = 0; // devices add here once they are created (though will not decrement as they are not deleted) + public const string DevNameCIG = "Keyboard"; // just a name... + public const string DevGUIDCIG = "{00000000-0000-0000-0000-000000000000}"; // - Fixed for Keyboards, we dont differentiate public const string ClearMods = "escape"; @@ -123,7 +125,7 @@ namespace SCJMapper_V2.Devices.Keyboard /// /// The list of pressed DX keys /// The SC keycode string - public static string DXKeyboardCmd( List pressedKeys, bool modAndKey, bool keyOnly ) + public static string FromDXKeyboardCmd( List pressedKeys, bool modAndKey, bool keyOnly ) { string altMod = ""; string shiftMod = ""; @@ -256,6 +258,120 @@ namespace SCJMapper_V2.Devices.Keyboard } + /// + /// Converts from SC command to DX command + /// + /// A single SC game keyname + /// The DX Code of this key + static public Key FromSCKeyboardCmd( string scKey ) + { + switch ( scKey ) { + // handle modifiers first + case "lalt": return Key.LeftAlt; + case "ralt": return Key.RightAlt; + case "lshift": return Key.LeftShift; + case "rshift": return Key.RightShift; + case "lctrl":return Key.LeftControl; + case "rctrl": return Key.RightControl; + + // function keys first + case "f1": return Key.F1; + case "f2": return Key.F2; + case "f3": return Key.F3; + case "f4": return Key.F4; + case "f5": return Key.F5; + case "f6": return Key.F6; + case "f7": return Key.F7; + case "f8": return Key.F8; + case "f9": return Key.F9; + case "f10": return Key.F10; + case "f11": return Key.F11; + case "f12": return Key.F12; + case "f13": return Key.F13; + case "f14": return Key.F14; + case "f15": return Key.F15; + + // all keys where the DX name does not match the SC name + // Numpad + case "numlock": return Key.NumberLock; + case "np_divide": return Key.Divide; + case "np_multiply": return Key.Multiply; + case "np_subtract": return Key.Subtract; + case "np_add": return Key.Add; + case "np_period": return Key.Decimal; + case "np_enter": return Key.NumberPadEnter; + case "np_0": return Key.NumberPad0; + case "np_1": return Key.NumberPad1; + case "np_2": return Key.NumberPad2; + case "np_3": return Key.NumberPad3; + case "np_4": return Key.NumberPad4; + case "np_5": return Key.NumberPad5; + case "np_6": return Key.NumberPad6; + case "np_7": return Key.NumberPad7; + case "np_8": return Key.NumberPad8; + case "np_9": return Key.NumberPad9; + // Digits + case "0": return Key.D0; + case "1": return Key.D1; + case "2": return Key.D2; + case "3": return Key.D3; + case "4": return Key.D4; + case "5": return Key.D5; + case "6": return Key.D6; + case "7": return Key.D7; + case "8": return Key.D8; + case "9": return Key.D9; + // navigation + case "insert": return Key.Insert; + case "home": return Key.Home; + case "delete": return Key.Delete; + case "end": return Key.End; + case "pgup": return Key.PageUp; + case "pgdown": return Key.PageDown; + case "print": return Key.PrintScreen; + case "scrolllock": return Key.ScrollLock; + case "pause": return Key.Pause; + // Arrows + case "up": return Key.Up; + case "down": return Key.Down; + case "left": return Key.Left; + case "right": return Key.Right; + // non letters + case "escape": return Key.Escape; + case "minus": return Key.Minus; + case "equals": return Key.Equals; + case "grave": return Key.Grave; + case "underline": return Key.Underline; + case "backspace": return Key.Back; + case "tab": return Key.Tab; + case "lbracket": return Key.LeftBracket; + case "rbracket": return Key.RightBracket; + case "enter": return Key.Return; + case "capslock": return Key.Capital; + case "colon": return Key.Colon; + case "backslash": return Key.Backslash; + case "comma": return Key.Comma; + case "period": return Key.Period; + case "slash": return Key.Slash; + case "space": return Key.Space; + case "semicolon": return Key.Semicolon; + case "apostrophe": return Key.Apostrophe; + + // all where the lowercase DX name matches the SC name + default: + if ( string.IsNullOrEmpty( scKey ) ) return Key.Unknown; + + string letter = scKey.ToUpperInvariant( ); + if (Enum.TryParse( letter, out Key dxKey ) ) { + return dxKey; + } + else { + return Key.Unknown; + } + } + + } + /// /// Format the various parts to a valid ctrl entry /// @@ -296,7 +412,8 @@ namespace SCJMapper_V2.Devices.Keyboard /// /// The ProductGUID property /// - public override string DevGUID { get { return "{" + m_device.Information.ProductGuid.ToString( ).ToUpperInvariant( ) + "}"; } } + //public override string DevGUID { get { return "{" + m_device.Information.ProductGuid.ToString( ).ToUpperInvariant( ) + "}"; } } + public override string DevGUID { get { return DevGUIDCIG; } } // generic as we don't differentiate Kbds /// /// The JS Instance GUID for multiple device support (VJoy gets 2 of the same name) @@ -369,7 +486,7 @@ namespace SCJMapper_V2.Devices.Keyboard /// An input string or an empty string if no input is available public override string GetCurrentInput() { - return DXKeyboardCmd( m_state.PressedKeys, true, true ); + return FromDXKeyboardCmd( m_state.PressedKeys, true, true ); } /// @@ -378,7 +495,7 @@ namespace SCJMapper_V2.Devices.Keyboard /// The last action as with modifiers public override string GetLastChange( ) { - return DXKeyboardCmd( m_state.PressedKeys, true, false ); + return FromDXKeyboardCmd( m_state.PressedKeys, true, false ); } @@ -389,7 +506,7 @@ namespace SCJMapper_V2.Devices.Keyboard /// Last action mod and key or only modifier public string GetLastChange( bool modAndKey ) { - return DXKeyboardCmd( m_state.PressedKeys, modAndKey, false); + return FromDXKeyboardCmd( m_state.PressedKeys, modAndKey, false); } diff --git a/Devices/Mouse/MouseCls.cs b/Devices/Mouse/MouseCls.cs index 5d65ec8..b5a38c2 100644 --- a/Devices/Mouse/MouseCls.cs +++ b/Devices/Mouse/MouseCls.cs @@ -26,6 +26,8 @@ namespace SCJMapper_V2.Devices.Mouse public new const string DeviceClass = "mouse"; // the device name used throughout this app public new const string DeviceID = "mo1_"; static public int RegisteredDevices = 0; // devices add here once they are created (though will not decrement as they are not deleted) + public const string DevNameCIG = "Mouse"; // just a name... + public const string DevGUIDCIG = "{10001000-0000-0000-0000-000000000000}"; // - Fixed for Mouse, we dont differentiate public new const string DisabledInput = DeviceID + DeviceCls.DisabledInput; static public new bool IsDisabledInput( string input ) diff --git a/Layout/ActionItem.cs b/Layout/ActionItem.cs index 76615d8..f9e6be2 100644 --- a/Layout/ActionItem.cs +++ b/Layout/ActionItem.cs @@ -46,7 +46,7 @@ namespace SCJMapper_V2.Layout /// /// Returns the Modifier for this item - /// i.e. + /// i.e. only modifiers /// public string Modifier { @@ -59,7 +59,22 @@ namespace SCJMapper_V2.Layout for ( int i = 0; i < e.Length - 1; i++ ) { mod += MapProps.ModS( e[i] ); } - return "("+mod+")"; + return "(" + mod + ")"; + } + } + + /// + /// Returns the Main Control for this item + /// i.e. no modifiers + /// + public string MainControl + { + get { + // input can be: {modifier+}Input + if ( !ControlInput.Contains( "+" ) ) return ControlInput; // no modifier + + string[] e = ControlInput.Split( new char[] { '+' } ); + return e[e.Length - 1]; // last item } } diff --git a/Layout/DbgActionItemList.cs b/Layout/DbgActionItemList.cs index bc8ef21..6bbc0d5 100644 --- a/Layout/DbgActionItemList.cs +++ b/Layout/DbgActionItemList.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using SCJMapper_V2.Devices.Gamepad; +using SCJMapper_V2.Devices.Keyboard; namespace SCJMapper_V2.Layout { @@ -92,131 +93,187 @@ namespace SCJMapper_V2.Layout return ail; } - private List AI_Gamepad( string aMap ) + private List AI_Gamepad( string aMap, string guid ) { var ail = new List( ); var ai = new ActionItem { ActionMap = aMap, ControlInput = "x", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button X", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button X", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "a", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button A", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button A", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "b", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button B", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button B", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "y", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Y", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Y", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Shoulder Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Shoulder Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderr", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Shoulder Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Shoulder Right", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "triggerl_btn", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Trigger Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Trigger Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "triggerr_btn", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Trigger Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Trigger Right", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "back", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Back", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Back", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "start", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Start", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Start", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumbl", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Thumb Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Thumb Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumbr", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Thumb Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Button Thumb Right", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "dpad_up", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Up", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - POV Up", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "dpad_right", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - POV Right", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "dpad_down", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Down", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - POV Down", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "dpad_left", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - POV Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumblx", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - X - Axis Thumb Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - X - Axis Thumb Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumbly", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Y - Axis Thumb Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Y - Axis Thumb Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumbrx", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - X - Axis Thumb Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - X - Axis Thumb Right", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "thumbry", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Y - Axis Thumb Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - Y - Axis Thumb Right", InputType = $"G1" }; ail.Add( ai ); return ail; } - private List AI_GamepadMods( string aMap ) + private List AI_GamepadMods( string aMap, string guid ) { var ail = new List( ); var ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+x", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Button X", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Button X", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+a", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Button A", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Button A", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+b", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Button B", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Button B", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+y", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Button Y", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Button Y", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+triggerl_btn", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Trigger Left", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Trigger Left", InputType = $"G1" }; ail.Add( ai ); ai = new ActionItem { ActionMap = aMap, ControlInput = "shoulderl+triggerr_btn", DeviceName = "Debug Controller", - DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - ShLeft + Trigger Right", InputType = $"G1" + DeviceProdGuid = guid, DispText = $"GP - ShLeft + Trigger Right", InputType = $"G1" }; ail.Add( ai ); return ail; } + private List AI_Keyboard( string aMap, string guid ) + { + var ail = new List( ); + var ai = new ActionItem { + ActionMap = aMap, ControlInput = "a", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key A", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "q", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Q", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "x", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key A", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "y", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Y", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "z", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Z", InputType = $"K1" + }; ail.Add( ai ); + + ai = new ActionItem { + ActionMap = aMap, ControlInput = "1", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key 1", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "0", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key 0", InputType = $"K1" + }; ail.Add( ai ); + + ai = new ActionItem { + ActionMap = aMap, ControlInput = "f1", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key F1", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "np_0", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Numpad 0", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "np_multiply", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Numpad *", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "backspace", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Backspace", InputType = $"K1" + }; ail.Add( ai ); + ai = new ActionItem { + ActionMap = aMap, ControlInput = "escape", DeviceName = "Debug Controller", + DeviceProdGuid = guid, DispText = $"KB - Key Escape", InputType = $"K1" + }; ail.Add( ai ); + return ail; + } + /// @@ -241,13 +298,17 @@ namespace SCJMapper_V2.Layout // Create Gamepad // Gamepads are in "spaceship_targeting" - m_actionItems.AddRange( AI_Gamepad( "spaceship_targeting" ) ); + // m_actionItems.AddRange( AI_Gamepad( "spaceship_targeting", GamepadCls.DevGUIDCIG ) ); // Create Gamepad modified // Gamepads Mods are in "spaceship_target_hailing" - m_actionItems.AddRange( AI_GamepadMods( "spaceship_target_hailing" ) ); + // m_actionItems.AddRange( AI_GamepadMods( "spaceship_target_hailing", GamepadCls.DevGUIDCIG ) ); // Create Keyboard + // Keyboard are in "vehicle_general" + m_actionItems.AddRange( AI_Keyboard( "vehicle_general", KeyboardCls.DevGUIDCIG ) ); + + // Create Keyboard modified } diff --git a/Layout/DeviceFile.cs b/Layout/DeviceFile.cs index 0e0260b..f7b987d 100644 --- a/Layout/DeviceFile.cs +++ b/Layout/DeviceFile.cs @@ -17,6 +17,7 @@ namespace SCJMapper_V2.Layout "InputDevices" :[ { "InputType": "J1", + "FontFamily": "Tahoma", "DeviceName": "T16000M", "DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"], "Controls": [ @@ -56,7 +57,7 @@ namespace SCJMapper_V2.Layout /// Find a Control entry with the given product guid and input command /// /// the Device Prduct PID VID string in lowecase - /// the Item (device property) + /// the Main input command without modifiers /// If true it looks for the InputTypeNumber 1 (InputType="x1") else for the next /// The found Control or Null public Control FindItem( string pidVid, string input, bool firstInstance ) @@ -66,15 +67,13 @@ namespace SCJMapper_V2.Layout for ( int i = 0; i < InputDevices.Count; i++ ) { if ( InputDevices[i].DevicePIDVID.Contains( pidVid ) ) { // can have multiple PID VIDs for a device (alternates) - // input can be: {modifier+}Input - string[] e = input.Split( new char[] { '+' } ); - string effInput = e[e.Length - 1]; // last item is the real input // returns if we are asked for the first instance and it is the first one (default) - if ( firstInstance && ( InputDevices[i].InputTypeNumber == 1 ) ) { - return InputDevices[i].FindItem( effInput ); + // Use numbers only when there are more than one device with the same GUID in a file !!! (or 0) + if ( firstInstance && ( InputDevices[i].InputTypeNumber <= 1 ) ) { + return InputDevices[i].FindItem( input ); } - else if ( !firstInstance && InputDevices[i].InputTypeNumber > 1 ) { - return InputDevices[i].FindItem( effInput ); // not first and J2.. - return any other (more than 2 not supported) + else if ( !firstInstance && ( InputDevices[i].InputTypeNumber > 1 || InputDevices[i].InputTypeNumber == 0 ) ) { + return InputDevices[i].FindItem( input ); // not first and dev2+ or dev0.. - return any other (more than 2 not supported) } } } @@ -103,7 +102,9 @@ namespace SCJMapper_V2.Layout class Device { [DataMember( IsRequired = true )] - public string InputType { get; set; } // Joystick, Throttle, Pedal, Gamepad, Keyboard, Other + public string InputType { get; set; } // J[n], G[n], K[n], M[n], X + [DataMember( IsRequired = false )] + public string FontFamily { get; set; } // any valid FontFamily [DataMember( IsRequired = true )] public string DeviceName { get; set; } // The device name [DataMember( IsRequired = true )] @@ -113,6 +114,21 @@ namespace SCJMapper_V2.Layout // non Json + + private Font m_deviceFont = null; + /// + /// Get the base font for this device + /// + public Font DeviceFont + { + get { + if ( !string.IsNullOrEmpty( FontFamily ) ) { + return m_deviceFont; + } + return MapProps.MapFont; // no specified - get the default one + } + } + /// /// Describes a known device /// Used for the Layout Debug Mode @@ -144,7 +160,7 @@ namespace SCJMapper_V2.Layout return num; } } - return 1; //default + return 0; //default } } @@ -163,18 +179,31 @@ namespace SCJMapper_V2.Layout } } + + // this one tracks the returned KbdItems - must be reset when Shapes are newly created + private int m_kbdItemTracker = 0; /// /// Find a Control entry with the given input command + /// For Keyboards there is not an entry for every possible key - so return just the next one /// /// the Item (device property) /// The found Control or Null public Control FindItem( string input ) { + // we may find it already here for ( int i = 0; i < Controls.Count; i++ ) { if ( input == Controls[i].Input ) { return Controls[i]; } } + // if not - and Keyboard - assign a new one and tag it + if ( this.InputTypeLetter == "X" ) { + if ( Controls.Count > m_kbdItemTracker ) { + int item = m_kbdItemTracker++; + Controls[item].Input = input; // mark to reuse + return Controls[item]; + } + } return null; } @@ -184,8 +213,13 @@ namespace SCJMapper_V2.Layout /// public void CreateShapes() { + m_kbdItemTracker = 0; // reset + if ( m_deviceFont != null ) m_deviceFont.Dispose( ); + if ( !string.IsNullOrEmpty( FontFamily ) ) { + m_deviceFont = new Font( FontFamily, MapProps.FontSize ); // create actual Font here + } for ( int i = 0; i < Controls.Count; i++ ) { - Controls[i].CreateShapes( ); + Controls[i].CreateShapes( DeviceFont, this.InputTypeLetter == "X" ); // symbols only for X type maps (keyboard with Symbols) } } @@ -228,28 +262,52 @@ namespace SCJMapper_V2.Layout /// /// Create all possible ShapeItems for this Control /// - public void CreateShapes() + public void CreateShapes( Font deviceFontRef, bool useSymbol ) { // this is a bit messy... // have to allocate a number of Rectangles to draw into but the layout rects are very different in size.. this.ShapeItems = new Queue( ); // get rid of previous ones // create a reference font int baseHeight = MapProps.MapFont.Height; - int baseWidth = MapProps.MapFont.Height * 12; // Lets see if this is good or needs adjustment + int baseWidth = MapProps.MapFont.Height * 12; // Lets see if this is a good Width or needs adjustment // live values from base int nCols = Width / baseWidth; + if ( nCols == 0 ) { + nCols = 1; // at least one column.. + } + baseWidth = (int)Math.Floor( (double)Width / nCols ); // fill rectangle int nLines = Height / baseHeight; + if ( nLines == 0 ) { + nLines = 1; // at least one line.. + } + baseHeight = (int)Math.Floor( (double)Height / nLines ); // fill rectangle + bool symbol = useSymbol; for ( int l = 0; l < nLines; l++ ) { for ( int c = 0; c < nCols; c++ ) { - var sh = new ShapeItem { - X = X + c * baseWidth, - Y = Y + l * baseHeight + 2, // offset Y by 2 pix to have it more centered - Width = baseWidth, - Height = baseHeight - }; - ShapeItems.Enqueue( sh ); + if ( this.Type == "Key" ) { + var sh = new ShapeKey { + X = X + c * baseWidth, + Y = Y + l * baseHeight, + Width = baseWidth, + Height = baseHeight, + IsSymbolShape = symbol, + TextFontRef = deviceFontRef + }; + symbol = false; // only once + ShapeItems.Enqueue( sh ); + } + else { + var sh = new ShapeItem { + X = X + c * baseWidth, + Y = Y + l * baseHeight, + Width = baseWidth, + Height = baseHeight, + TextFontRef = deviceFontRef + }; + ShapeItems.Enqueue( sh ); + } } } } diff --git a/Layout/FormLayout.cs b/Layout/FormLayout.cs index 0b94fb2..8d2d24f 100644 --- a/Layout/FormLayout.cs +++ b/Layout/FormLayout.cs @@ -214,23 +214,27 @@ namespace SCJMapper_V2.Layout // for all actions found from action tree m_displayList.Clear( ); ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.CreateShapes( ); - foreach ( var si in ActionList ) { + foreach ( var actItem in ActionList ) { // matches the selected device - if ( MatchCriteria( si ) ) { - bool firstInstance = ActionList.IsFirstInstance( si.DevicePidVid, si.InputTypeNumber ); - var ctrl = ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.FindItem( si.DevicePidVid, si.ControlInput, firstInstance ); + if ( MatchCriteria( actItem ) ) { + bool firstInstance = ActionList.IsFirstInstance( actItem.DevicePidVid, actItem.InputTypeNumber ); + var ctrl = ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.FindItem( actItem.DevicePidVid, actItem.MainControl, firstInstance ); if ( ctrl != null ) { if ( ctrl.ShapeItems.Count > 0 ) { var shape = ctrl.ShapeItems.Dequeue( ); - shape.DispText = si.ModdedDispText; - shape.TextColor = MapProps.MapForeColor( si.ActionMap ); - shape.BackColor = MapProps.MapBackColor( si.ActionMap ); + shape.DispText = actItem.ModdedDispText; + shape.TextColor = MapProps.MapForeColor( actItem.ActionMap ); + shape.BackColor = MapProps.MapBackColor( actItem.ActionMap ); + if ( shape is ShapeKey ) { + // kbd map + ( shape as ShapeKey ).SCGameKey = actItem.MainControl; + } m_displayList.Add( shape ); } else { // Display elements exhausted... if ( ! errorShown ) { - string msg = $"No more display elements left for device: {si.DeviceName}"; + string msg = $"No more display elements left for device: {actItem.DeviceName}"; msg += $"\n\nTry to use a smaller font to show all actions!"; MessageBox.Show( msg, "Layout - Cannot show all actions", MessageBoxButtons.OK, MessageBoxIcon.Warning ); errorShown = true; // only once diff --git a/Layout/MapProps.cs b/Layout/MapProps.cs index 5e8c5cc..f2dfb1a 100644 --- a/Layout/MapProps.cs +++ b/Layout/MapProps.cs @@ -16,13 +16,15 @@ namespace SCJMapper_V2.Layout { public static string ModShoulderLeft = "←";//═ public static string ModShoulderRight = "→"; + public static string ModDpadDown = "↓"; + public static string ModTrigLeft = "◄"; - public static string ModAltLeft = "←Å"; - public static string ModAltRight = "→Å"; - public static string ModCtrlLeft = "←Ꞓ"; - public static string ModCtrlRight = "→Ꞓ"; - public static string ModShiftLeft = "←Ȿ"; - public static string ModShiftRight = "→Ȿ"; + public static string ModAltLeft = " /// Returns a Layout Modifier string (char) for a given modifier @@ -55,6 +57,13 @@ namespace SCJMapper_V2.Layout else if ( modifier == "rctrl" ) { return ModCtrlRight; } + else if ( modifier == "dpad_down" ) { + return ModDpadDown; + } + else if ( modifier == "triggerl_btn" ) { + return ModTrigLeft; + } + else { return "⸮"; } @@ -75,8 +84,22 @@ namespace SCJMapper_V2.Layout } } + // Text + private const string c_fontFamily = "Tahoma"; private static int m_fontSize = 16; // maintained as int to support the TrackBar Value property) - private static Font m_font = new Font( "Tahoma", m_fontSize ); // real fontsize will be scaled to float but not used outside + private static Font m_font = new Font( c_fontFamily, m_fontSize ); // real fontsize will be scaled to float but not used outside + + // Keyboard Layout Text + private const string c_kbdFontFamily = "Gill Sans Nova Cond"; + private static Font m_kbdFont = new Font( c_kbdFontFamily, m_fontSize ); // real fontsize will be scaled to float but not used outside + + // Keyboard Symbols + private const string c_kbdSymbolFontFamily = "Tahoma"; + private const int c_kbdSymbolFontDecrement = 5; // kbd Symbol is so many points smaller than main font + private static Font m_kbdSymbolFont = new Font( c_kbdSymbolFontFamily, m_fontSize - c_kbdSymbolFontDecrement ); + private static Brush m_kbdSymbolBrush = Brushes.DimGray; + private static Pen m_kbdSymbolPen = Pens.Gray; + // all known actionmaps with it's classification private static Dictionary m_amColors; @@ -170,7 +193,7 @@ namespace SCJMapper_V2.Layout /// /// FontSize property - /// creates a new MapFont property to use + /// creates a new MapFont and KbdSymbolFont property to use /// public static int FontSize { @@ -178,8 +201,10 @@ namespace SCJMapper_V2.Layout set { m_fontSize = value; m_font = new Font( m_font.FontFamily, m_fontSize ); - } - } + m_kbdSymbolFont = new Font( m_kbdSymbolFont.FontFamily, m_fontSize - c_kbdSymbolFontDecrement ); + + } +} // Handle Layout Colors @@ -246,5 +271,14 @@ namespace SCJMapper_V2.Layout return m_amColors[eGroup].BackColor; } + // Keyboard Text + public static Font KbdFont { get => m_kbdFont; } + + // Keyboard Symbols + public static Font KbdSymbolFont { get => m_kbdSymbolFont; } + public static Brush KbdSymbolBrush { get => m_kbdSymbolBrush; } + public static Pen KbdSymbolPen { get => m_kbdSymbolPen; } + + } } diff --git a/Layout/ShapeItem.cs b/Layout/ShapeItem.cs index d95fdc8..a89bc71 100644 --- a/Layout/ShapeItem.cs +++ b/Layout/ShapeItem.cs @@ -55,11 +55,13 @@ namespace SCJMapper_V2.Layout public bool IsValid { get => !string.IsNullOrEmpty( DispText ); } - private Brush m_textBrush = Brushes.Black; - private Color m_textColor = Color.DarkBlue; + protected Brush m_textBrush = Brushes.Black; + protected Color m_textColor = Color.DarkBlue; - private Brush m_backBrush = Brushes.White; - private Color m_backColor = Color.White; + protected Brush m_backBrush = Brushes.White; + protected Color m_backColor = Color.White; + + protected Font m_textFontRef = null; /// /// Set the Textcolor @@ -87,6 +89,13 @@ namespace SCJMapper_V2.Layout } } + /// + /// TextFont Property of this shape + /// you get a ref not a new font here + /// + public Font TextFontRef { get => m_textFontRef; set => m_textFontRef = value; } + + /// /// Returns the drawn text size for this item /// @@ -102,13 +111,13 @@ namespace SCJMapper_V2.Layout /// /// Draws the shape /// - public void DrawShape( Graphics g ) + public virtual void DrawShape( Graphics g ) { if ( IsValid ) { if ( m_backColor!= Color.White ) { g.FillRectangle( m_backBrush, Rectangle ); } - g.DrawString( DispText, MapProps.MapFont, m_textBrush, Rectangle ); // write into the rectangle + g.DrawString( DispText, TextFontRef, m_textBrush, Rectangle ); // write into the rectangle } } diff --git a/Layout/ShapeKey.cs b/Layout/ShapeKey.cs new file mode 100644 index 0000000..d4e5744 --- /dev/null +++ b/Layout/ShapeKey.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SCJMapper_V2.Common; +using SCJMapper_V2.Devices.Keyboard; + +namespace SCJMapper_V2.Layout +{ + /// + /// Key Input + /// contains a text to display at a position within a rectangle + /// + class ShapeKey : ShapeItem + { + /// + /// The SCGameKey for this Command + /// Only a single one - NO modifiers here + /// + public string SCGameKey { get; set; } + + /// + /// The DX GameKey for this Command + /// + public SharpDX.DirectInput.Key DXGameKey + { + get { + return KeyboardCls.FromSCKeyboardCmd( SCGameKey ); + } + } + + /// + /// The Windows Virtual GameKey for this Command + /// + public VirtualKey WinVirtualKey + { + get { + return (VirtualKey)WinApi.MapVirtualKeyEx( (uint)DXGameKey, WinApi.VirtualKeyMapType.MAPVK_VSC_TO_VK_EX, IntPtr.Zero ); + } + } + + /// + /// Indicates that the Key symbol needs to be drawn + /// + public bool IsSymbolShape { get; set; } = false; // default + + /// + /// GetRoundRectPath + /// Credit: licensed under The Code Project Open License (CPOL) + /// https://www.codeproject.com/Articles/27228/A-class-for-creating-round-rectangles-in-GDI-with + /// This function uses the AddArc method for defining the rounded rectangle path. + /// The first workaround handles the special case where the radius is 10. + /// It offsets the arc's rectangle and increases its size at a strategic point. + /// I don’t have a good theory for why this works or why it is only needed for a radius of 10. + /// + private void GetRoundRectPath( ref GraphicsPath pPath, Rectangle r, int dia ) + { + // diameter can't exceed width or height + if ( dia > r.Width ) dia = r.Width; + if ( dia > r.Height ) dia = r.Height; + + // define a corner + var Corner = new Rectangle( r.X, r.Y, dia, dia ); + pPath.Reset( ); // begin path + // top left + pPath.AddArc( Corner, 180, 90 ); + // tweak needed for radius of 10 (dia of 20) + if ( dia == 20 ) { + Corner.Width += 1; + Corner.Height += 1; + r.Width -= 1; r.Height -= 1; + } + // top right + Corner.X += ( r.Width - dia - 1 ); + pPath.AddArc( Corner, 270, 90 ); + // bottom right + Corner.Y += ( r.Height - dia - 1 ); + pPath.AddArc( Corner, 0, 90 ); + // bottom left + Corner.X -= ( r.Width - dia - 1 ); + pPath.AddArc( Corner, 90, 90 ); + // end path + pPath.CloseFigure( ); + } + + /// + /// DrawRoundRect + /// Credit: licensed under The Code Project Open License (CPOL) + /// https://www.codeproject.com/Articles/27228/A-class-for-creating-round-rectangles-in-GDI-with + /// This function draws a rounded rectangle using the passed rectangle, radius, pen color, and pen width. + /// The second workaround involves using a pen width of 1 and drawing “width” number of rectangles, + /// decrementing the size of the rect each time.That alone is insufficient, because it will leave + /// holes at the corners. Instead, this deflates only the x, draws the rect, then deflates the y, and draws again. + /// + private void DrawRoundRect( Graphics pGraphics, Rectangle r, Color color, int radius, int width ) + { + int dia = 2 * radius; + + // set to pixel mode + var oldPageUnit = pGraphics.PageUnit; + pGraphics.PageUnit = GraphicsUnit.Pixel; + + // define the pen + var pen = new Pen( color, 1 ); + pen.Alignment = System.Drawing.Drawing2D.PenAlignment.Center; + + // get the corner path + var path = new GraphicsPath( ); + // get path + GetRoundRectPath( ref path, r, dia ); + // draw the round rect + pGraphics.DrawPath( pen, path ); + // if width > 1 + for ( int i = 1; i < width; i++ ) { + r.Inflate( -1, 0 ); // left stroke + GetRoundRectPath( ref path, r, dia ); // get the path + pGraphics.DrawPath( pen, path ); // draw the round rect + r.Inflate( 0, -1 ); // up stroke + GetRoundRectPath( ref path, r, dia ); // get the path + pGraphics.DrawPath( pen, path ); // draw the round rect + } + // restore page unit + pGraphics.PageUnit = oldPageUnit; + } + + /// + /// Draw a key + /// + /// + /// + /// + private void DrawKey( Graphics g, Rectangle drawRect, string key ) + { + var printSize =Size.Add( Size.Ceiling( g.MeasureString( key, MapProps.MapFont ) ), new Size(18,18)); // get the surounding box for the Text + var rect = new Rectangle( drawRect.Location, printSize ); + rect.Offset( 0, ( drawRect.Height - printSize.Height ) / 2 ); // try to find the middle by shifting the drawing + if ( rect.Width < rect.Height ) rect.Width = rect.Height; // minimum with + DrawRoundRect( g, rect, MapProps.KbdSymbolPen.Color, 7, 3 ); + rect.Inflate( -5, -5 ); + DrawRoundRect( g, rect, MapProps.KbdSymbolPen.Color, 7, 3 ); + rect.Inflate( -2, -2 ); + g.DrawString( key, MapProps.MapFont, MapProps.KbdSymbolBrush, rect ); // write into the rectangle + } + + #region IShape Implementation + + /// + /// Draws the shape + /// + public override void DrawShape( Graphics g ) + { + // Key Symbol left of the Text Location + if ( IsValid ) { + var symbolRect = Rectangle; + symbolRect.Offset( -120, 0 ); // TODO get a proper left offset rather than static (Should be left aligned though..) + symbolRect.Width = 120; + string key = WinApi.KbdScanCodeToVK((uint)DXGameKey); // might work.... + if (IsSymbolShape) DrawKey( g, symbolRect, key ); + } + // draw the text + base.DrawShape( g ); + } + + #endregion + + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 747a63b..6d90ee9 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion( "2.45.0.80" )] -[assembly: AssemblyFileVersion( "2.45.0.80" )] +[assembly: AssemblyVersion( "2.46.0.81" )] +[assembly: AssemblyFileVersion( "2.46.0.81" )] diff --git a/ReadMe.txt b/ReadMe.txt index 896240f..54ea350 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,10 +1,10 @@ -SC Joystick Mapper V 2.45 - Build 80 BETA -(c) Cassini, StandardToaster - 09-Mar-2020 +SC Joystick Mapper V 2.46 - Build 81 BETA +(c) Cassini, StandardToaster - 16-Mar-2020 Contains 14 files + graphics: -SCJMapper.exe The program (V2.45) -SCJMapper.exe.config Program config (V2.45) - MUST be in the same folder as the Exe file +SCJMapper.exe The program (V2.46) +SCJMapper.exe.config Program config (V2.46) - MUST be in the same folder as the Exe file de\SCJMapper.resources.dll German language (V2.45) - MUST be in the same folder as the Exe file fr\SCJMapper.resources.dll French language (V2.45) - MUST be in the same folder as the Exe file Storage\*.scj Folder for collected assets (V2.35) - MUST be in the same folder as the Exe file @@ -23,7 +23,7 @@ SCJMapper_QGuide V2.35beta.pdf Quick Guide (v2.35) ReadMe.txt This file graphics folder Skybox Images (V2.32) - graphics folder MUST be in the same folder as the Exe file -graphics\layouts folder Layout Images & defs (V2.45) - layouts folder MUST be in the graphics folder above +graphics\layouts folder Layout Images & defs (V2.46) - layouts folder MUST be in the graphics folder above NOTE V 2.41+: search order for defaultProfile.xml to build the action tree is: @@ -47,6 +47,10 @@ Scanned for viruses before packing... cassini@burri-web.org Changelog: +V 2.46 - BETA Build 81 +- add Some more Layout files for devices +- update Layout to work with keyboard and mouse +- fix for some Layout files and general fixes in the layout part V 2.45 - BETA Build 80 - add Some more Layout files for devices - update Layout to work with dual Joysticks of the same type and Gamepads diff --git a/SCJMapper-V2.csproj b/SCJMapper-V2.csproj index df2c9c0..62db336 100644 --- a/SCJMapper-V2.csproj +++ b/SCJMapper-V2.csproj @@ -27,8 +27,8 @@ false false true - 80 - 2.45.0.80 + 81 + 2.46.0.81 false true @@ -140,6 +140,8 @@ + + @@ -198,6 +200,7 @@ + @@ -351,6 +354,7 @@ FormLayout.cs + Designer PublicResXFileCodeGenerator diff --git a/actions/ActionTree.cs b/actions/ActionTree.cs index 61f4f17..7cb02e7 100644 --- a/actions/ActionTree.cs +++ b/actions/ActionTree.cs @@ -1332,12 +1332,12 @@ namespace SCJMapper_V2.Actions case Act.ActionDevice.AD_Keyboard: sItem.InputType = "K1"; sItem.DeviceName = KeyboardCls.DeviceClass; - sItem.DeviceProdGuid = ""; // not needed - generic + sItem.DeviceProdGuid = KeyboardCls.DevGUIDCIG; break; case Act.ActionDevice.AD_Mouse: sItem.InputType = "M1"; sItem.DeviceName = MouseCls.DeviceClass; - sItem.DeviceProdGuid = ""; // not needed - generic + sItem.DeviceProdGuid = MouseCls.DevGUIDCIG; break; case Act.ActionDevice.AD_Joystick: int jsNum = JoystickCls.JSNum( acc.DevInput ) - 1; diff --git a/graphics/layouts/MapToolbox.xlsx b/graphics/layouts/MapToolbox.xlsx index 298d4fd..8df11d6 100644 Binary files a/graphics/layouts/MapToolbox.xlsx and b/graphics/layouts/MapToolbox.xlsx differ diff --git a/graphics/layouts/chcombat.json b/graphics/layouts/chcombat.json index be2b391..ff8b733 100644 --- a/graphics/layouts/chcombat.json +++ b/graphics/layouts/chcombat.json @@ -1,5 +1,5 @@ { - "MapName" : "CH Combat Stick + Throttle", + "MapName" : "1: CH Combat Joystick & Throttle", "MapImage" : "chcombat.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/chfighter.json b/graphics/layouts/chfighter.json index 42a346f..aa20941 100644 --- a/graphics/layouts/chfighter.json +++ b/graphics/layouts/chfighter.json @@ -1,5 +1,5 @@ { - "MapName" : "CH Fighter Stick + Throttle", + "MapName" : "1: CH Fighter Joytick & Throttle", "MapImage" : "chfighter.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/chproflightquadrant.json b/graphics/layouts/chproflightquadrant.json index d0d78da..9a8b01d 100644 --- a/graphics/layouts/chproflightquadrant.json +++ b/graphics/layouts/chproflightquadrant.json @@ -1,5 +1,5 @@ { - "MapName" : "CH Pro Flight Throttle Quadrant", + "MapName" : "5: CH Pro Flight Throttle Quadrant", "MapImage" : "chproflightquadrant.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/cobram5.json b/graphics/layouts/cobram5.json index 768120e..cbff820 100644 --- a/graphics/layouts/cobram5.json +++ b/graphics/layouts/cobram5.json @@ -1,5 +1,5 @@ { - "MapName" : "Defender Cobra M5", + "MapName" : "1: Defender Cobra M5 Joystick", "MapImage" : "cobram5.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/extreme3dpro.json b/graphics/layouts/extreme3dpro.json index c06b204..1409431 100644 --- a/graphics/layouts/extreme3dpro.json +++ b/graphics/layouts/extreme3dpro.json @@ -1,5 +1,5 @@ { - "MapName" : "Logitech Extreme 3DPro", + "MapName" : "2: Logitech Extreme 3DPro Joystick", "MapImage" : "extreme3dpro.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/fly5.json b/graphics/layouts/fly5.json index 154c7a9..395ef5f 100644 --- a/graphics/layouts/fly5.json +++ b/graphics/layouts/fly5.json @@ -1,5 +1,5 @@ { - "MapName" : "Cyborg F.L.Y. 5", + "MapName" : "2: Cyborg F.L.Y. 5 Joystick", "MapImage" : "fly5.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/g940.json b/graphics/layouts/g940.json index 5051be9..d8b35d7 100644 --- a/graphics/layouts/g940.json +++ b/graphics/layouts/g940.json @@ -1,5 +1,5 @@ { - "MapName" : "Logitech G940 Stick + Throttle", + "MapName" : "1: Logitech G940 Joystick & Throttle", "MapImage" : "g940.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/g940pedals.json b/graphics/layouts/g940pedals.json index 466dac7..41a4903 100644 --- a/graphics/layouts/g940pedals.json +++ b/graphics/layouts/g940pedals.json @@ -1,5 +1,5 @@ { - "MapName" : "Logitech G940 Pedals", + "MapName" : "4: Logitech G940 Pedals", "MapImage" : "g940pedals.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/gladiator.json b/graphics/layouts/gladiator.json index ef4da26..5603edf 100644 --- a/graphics/layouts/gladiator.json +++ b/graphics/layouts/gladiator.json @@ -1,5 +1,5 @@ { - "MapName" : "VKB Gladiator", + "MapName" : "2: VKB Gladiator Joystick", "MapImage" : "gladiator.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/gpad-jc-u3613m.jpg b/graphics/layouts/gpad-jc-u3613m.jpg index ebbb1f9..13fb684 100644 Binary files a/graphics/layouts/gpad-jc-u3613m.jpg and b/graphics/layouts/gpad-jc-u3613m.jpg differ diff --git a/graphics/layouts/gpad-jc-u3613m.json b/graphics/layouts/gpad-jc-u3613m.json index 2286c37..f5a7d9a 100644 --- a/graphics/layouts/gpad-jc-u3613m.json +++ b/graphics/layouts/gpad-jc-u3613m.json @@ -1,32 +1,32 @@ { - "MapName" : "XPad Elecom JC-U3613M (X-Input)", + "MapName" : "7: GPad Elecom JC-U3613M (X-Input)", "MapImage" : "gpad-jc-u3613m.jpg", "InputDevices" :[ { - "InputType": "G1", + "InputType": "G", "DeviceName": "Elecom JC-U3613M", "DeviceProdGuid": ["{028E045E-0000-0000-0000-504944564944}"], "Controls": [ - { "Input":"x", "Type": "Digital", "X":2586, "Y":1254, "Width":770, "Height":108, "Cmt": "X"}, - { "Input":"a", "Type": "Digital", "X":2586, "Y":1132, "Width":770, "Height":108, "Cmt": "A"}, - { "Input":"b", "Type": "Digital", "X":2586, "Y":1010, "Width":770, "Height":108, "Cmt": "B"}, - { "Input":"y", "Type": "Digital", "X":2586, "Y":888, "Width":770, "Height":108, "Cmt": "Y"}, - { "Input":"shoulderl", "Type": "Digital", "X":784, "Y":632, "Width":770, "Height":108, "Cmt": "Left bumper - shoulderl"}, - { "Input":"shoulderr", "Type": "Digital", "X":2342, "Y":630, "Width":770, "Height":108, "Cmt": "Right bumper - shoulderr"}, - { "Input":"triggerl_btn", "Type": "Digital", "X":1049, "Y":492, "Width":770, "Height":108, "Cmt": "Left trigger - triggerl_btn"}, - { "Input":"triggerr_btn", "Type": "Digital", "X":2045, "Y":492, "Width":770, "Height":108, "Cmt": "Right trigger - triggerr_btn"}, - { "Input":"back", "Type": "Digital", "X":343, "Y":806, "Width":1000, "Height":54, "Cmt": "Back"}, - { "Input":"start", "Type": "Digital", "X":2431, "Y":806, "Width":1000, "Height":54, "Cmt": "Start"}, - { "Input":"thumbl", "Type": "Digital", "X":232, "Y":1035, "Width":1000, "Height":54, "Cmt": "Left stick button thumbl"}, - { "Input":"thumbr", "Type": "Digital", "X":2675, "Y":1567, "Width":1000, "Height":54, "Cmt": "Right stick button - thumbr"}, - { "Input":"dpad_up", "Type": "Digital", "X":274, "Y":1212, "Width":1000, "Height":54, "Cmt": "dpad_up"}, - { "Input":"dpad_right", "Type": "Digital", "X":274, "Y":1262, "Width":1000, "Height":54, "Cmt": "dpad_right"}, - { "Input":"dpad_down", "Type": "Digital", "X":274, "Y":1315, "Width":1000, "Height":54, "Cmt": "dpad_down"}, - { "Input":"dpad_left", "Type": "Digital", "X":274, "Y":1366, "Width":1000, "Height":54, "Cmt": "dpad_left"}, - { "Input":"thumbry", "Type": "Analogue", "X":2675, "Y":1465, "Width":1000, "Height":54, "Cmt": "thumbry"}, - { "Input":"thumbrx", "Type": "Analogue", "X":2675, "Y":1515, "Width":1000, "Height":54, "Cmt": "thumbrx"}, - { "Input":"thumbly", "Type": "Analogue", "X":232, "Y":932, "Width":1000, "Height":54, "Cmt": "thumbly"}, - { "Input":"thumblx", "Type": "Analogue", "X":232, "Y":984, "Width":1000, "Height":54, "Cmt": "thumblx"} + { "Input":"x", "Type": "Digital", "X":2726, "Y":1401, "Width":987, "Height":150, "Cmt": "X"}, + { "Input":"a", "Type": "Digital", "X":2726, "Y":1232, "Width":987, "Height":150, "Cmt": "A"}, + { "Input":"b", "Type": "Digital", "X":2726, "Y":1062, "Width":987, "Height":150, "Cmt": "B"}, + { "Input":"y", "Type": "Digital", "X":2726, "Y":892, "Width":987, "Height":150, "Cmt": "Y"}, + { "Input":"shoulderl", "Type": "Digital", "X":564, "Y":383, "Width":987, "Height":204, "Cmt": "Left bumper - shoulderl"}, + { "Input":"shoulderr", "Type": "Digital", "X":2343, "Y":383, "Width":987, "Height":203, "Cmt": "Right bumper - shoulderr"}, + { "Input":"triggerl_btn", "Type": "Digital", "X":829, "Y":145, "Width":987, "Height":202, "Cmt": "Left trigger - triggerl_btn"}, + { "Input":"triggerr_btn", "Type": "Digital", "X":2046, "Y":144, "Width":987, "Height":203, "Cmt": "Right trigger - triggerr_btn"}, + { "Input":"back", "Type": "Digital", "X":343, "Y":729, "Width":987, "Height":95, "Cmt": "Back"}, + { "Input":"start", "Type": "Digital", "X":2584, "Y":716, "Width":987, "Height":95, "Cmt": "Start"}, + { "Input":"thumbl", "Type": "Digital", "X":233, "Y":1224, "Width":986, "Height":159, "Cmt": "Left stick button thumbl"}, + { "Input":"thumbr", "Type": "Digital", "X":2227, "Y":1891, "Width":1486, "Height":99, "Cmt": "Right stick button - thumbr"}, + { "Input":"dpad_up", "Type": "Digital", "X":300, "Y":1635, "Width":1478, "Height":101, "Cmt": "dpad_up"}, + { "Input":"dpad_right", "Type": "Digital", "X":300, "Y":1741, "Width":1478, "Height":103, "Cmt": "dpad_right"}, + { "Input":"dpad_down", "Type": "Digital", "X":300, "Y":1847, "Width":1478, "Height":99, "Cmt": "dpad_down"}, + { "Input":"dpad_left", "Type": "Digital", "X":300, "Y":1951, "Width":1478, "Height":103, "Cmt": "dpad_left"}, + { "Input":"thumbry", "Type": "Analogue", "X":2227, "Y":1679, "Width":1486, "Height":103, "Cmt": "thumbry"}, + { "Input":"thumbrx", "Type": "Analogue", "X":2227, "Y":1786, "Width":1486, "Height":100, "Cmt": "thumbrx"}, + { "Input":"thumbly", "Type": "Analogue", "X":233, "Y":907, "Width":986, "Height":155, "Cmt": "thumbly"}, + { "Input":"thumblx", "Type": "Analogue", "X":233, "Y":1067, "Width":986, "Height":152, "Cmt": "thumblx"} ] } ] diff --git a/graphics/layouts/gpad-logi-f710.jpg b/graphics/layouts/gpad-logi-f710.jpg index cac6940..6c14aaa 100644 Binary files a/graphics/layouts/gpad-logi-f710.jpg and b/graphics/layouts/gpad-logi-f710.jpg differ diff --git a/graphics/layouts/gpad-logi-f710.json b/graphics/layouts/gpad-logi-f710.json index 3c7fbb4..386d4e4 100644 --- a/graphics/layouts/gpad-logi-f710.json +++ b/graphics/layouts/gpad-logi-f710.json @@ -1,32 +1,32 @@ { - "MapName" : "XPad Logitech F710", + "MapName" : "7: GPad Logitech F710", "MapImage" : "gpad-logi-f710.jpg", "InputDevices" :[ { - "InputType": "G1", + "InputType": "G", "DeviceName": "Logitech F710", "DeviceProdGuid": ["{028E045E-0000-0000-0000-504944564944}"], "Controls": [ - { "Input":"x", "Type": "Digital", "X":2624, "Y":1299, "Width":770, "Height":108, "Cmt": "X"}, - { "Input":"a", "Type": "Digital", "X":2624, "Y":1169, "Width":770, "Height":108, "Cmt": "A"}, - { "Input":"b", "Type": "Digital", "X":2624, "Y":1041, "Width":770, "Height":108, "Cmt": "B"}, - { "Input":"y", "Type": "Digital", "X":2624, "Y":913, "Width":770, "Height":108, "Cmt": "Y"}, - { "Input":"shoulderl", "Type": "Digital", "X":784, "Y":632, "Width":770, "Height":108, "Cmt": "Left bumper - shoulderl"}, - { "Input":"shoulderr", "Type": "Digital", "X":2342, "Y":630, "Width":770, "Height":108, "Cmt": "Right bumper - shoulderr"}, - { "Input":"triggerl_btn", "Type": "Digital", "X":1051, "Y":494, "Width":770, "Height":108, "Cmt": "Left trigger - triggerl_btn"}, - { "Input":"triggerr_btn", "Type": "Digital", "X":2051, "Y":492, "Width":770, "Height":108, "Cmt": "Right trigger - triggerr_btn"}, - { "Input":"back", "Type": "Digital", "X":343, "Y":806, "Width":1000, "Height":54, "Cmt": "Back"}, - { "Input":"start", "Type": "Digital", "X":2537, "Y":820, "Width":1000, "Height":54, "Cmt": "Start"}, - { "Input":"thumbl", "Type": "Digital", "X":208, "Y":1517, "Width":1000, "Height":54, "Cmt": "Left stick button thumbl"}, - { "Input":"thumbr", "Type": "Digital", "X":2655, "Y":1619, "Width":1000, "Height":54, "Cmt": "Right stick button - thumbr"}, - { "Input":"dpad_up", "Type": "Digital", "X":231, "Y":947, "Width":1000, "Height":54, "Cmt": "dpad_up"}, - { "Input":"dpad_right", "Type": "Digital", "X":231, "Y":997, "Width":1000, "Height":54, "Cmt": "dpad_right"}, - { "Input":"dpad_down", "Type": "Digital", "X":231, "Y":1051, "Width":1000, "Height":54, "Cmt": "dpad_down"}, - { "Input":"dpad_left", "Type": "Digital", "X":231, "Y":1103, "Width":1000, "Height":54, "Cmt": "dpad_left"}, - { "Input":"thumbry", "Type": "Analogue", "X":2655, "Y":1517, "Width":1000, "Height":54, "Cmt": "thumbry"}, - { "Input":"thumbrx", "Type": "Analogue", "X":2655, "Y":1569, "Width":1000, "Height":54, "Cmt": "thumbrx"}, - { "Input":"thumbly", "Type": "Analogue", "X":208, "Y":1415, "Width":1000, "Height":54, "Cmt": "thumbly"}, - { "Input":"thumblx", "Type": "Analogue", "X":208, "Y":1465, "Width":1000, "Height":54, "Cmt": "thumblx"} + { "Input":"x", "Type": "Digital", "X":2754, "Y":1493, "Width":987, "Height":150, "Cmt": "X"}, + { "Input":"a", "Type": "Digital", "X":2755, "Y":1323, "Width":987, "Height":150, "Cmt": "A"}, + { "Input":"b", "Type": "Digital", "X":2755, "Y":1153, "Width":987, "Height":150, "Cmt": "B"}, + { "Input":"y", "Type": "Digital", "X":2755, "Y":984, "Width":987, "Height":150, "Cmt": "Y"}, + { "Input":"shoulderl", "Type": "Digital", "X":594, "Y":475, "Width":987, "Height":204, "Cmt": "Left bumper - shoulderl"}, + { "Input":"shoulderr", "Type": "Digital", "X":2370, "Y":473, "Width":987, "Height":203, "Cmt": "Right bumper - shoulderr"}, + { "Input":"triggerl_btn", "Type": "Digital", "X":858, "Y":237, "Width":987, "Height":202, "Cmt": "Left trigger - triggerl_btn"}, + { "Input":"triggerr_btn", "Type": "Digital", "X":2074, "Y":235, "Width":987, "Height":203, "Cmt": "Right trigger - triggerr_btn"}, + { "Input":"back", "Type": "Digital", "X":370, "Y":821, "Width":987, "Height":95, "Cmt": "Back"}, + { "Input":"start", "Type": "Digital", "X":2612, "Y":806, "Width":987, "Height":95, "Cmt": "Start"}, + { "Input":"thumbl", "Type": "Digital", "X":264, "Y":1290, "Width":986, "Height":159, "Cmt": "Left stick button thumbl"}, + { "Input":"thumbr", "Type": "Digital", "X":2258, "Y":1956, "Width":1486, "Height":99, "Cmt": "Right stick button - thumbr"}, + { "Input":"dpad_up", "Type": "Digital", "X":331, "Y":1700, "Width":1478, "Height":101, "Cmt": "dpad_up"}, + { "Input":"dpad_right", "Type": "Digital", "X":331, "Y":1806, "Width":1478, "Height":103, "Cmt": "dpad_right"}, + { "Input":"dpad_down", "Type": "Digital", "X":331, "Y":1914, "Width":1478, "Height":99, "Cmt": "dpad_down"}, + { "Input":"dpad_left", "Type": "Digital", "X":331, "Y":2016, "Width":1478, "Height":103, "Cmt": "dpad_left"}, + { "Input":"thumbry", "Type": "Analogue", "X":2258, "Y":1744, "Width":1486, "Height":103, "Cmt": "thumbry"}, + { "Input":"thumbrx", "Type": "Analogue", "X":2258, "Y":1852, "Width":1486, "Height":100, "Cmt": "thumbrx"}, + { "Input":"thumbly", "Type": "Analogue", "X":264, "Y":974, "Width":986, "Height":155, "Cmt": "thumbly"}, + { "Input":"thumblx", "Type": "Analogue", "X":264, "Y":1132, "Width":986, "Height":152, "Cmt": "thumblx"} ] } ] diff --git a/graphics/layouts/hotas4.json b/graphics/layouts/hotas4.json index 0103f88..2cf345f 100644 --- a/graphics/layouts/hotas4.json +++ b/graphics/layouts/hotas4.json @@ -1,5 +1,5 @@ { - "MapName" : "ThrustMaster HOTAS 4", + "MapName" : "1: ThrustMaster HOTAS 4 Joystick & Throttle", "MapImage" : "hotas4.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/hotasx.json b/graphics/layouts/hotasx.json index 9652594..578b5b5 100644 --- a/graphics/layouts/hotasx.json +++ b/graphics/layouts/hotasx.json @@ -1,5 +1,5 @@ { - "MapName" : "ThrustMaster TFlight HOTASX", + "MapName" : "1: ThrustMaster TFlight HOTASX Joystick & Throttle", "MapImage" : "hotasx.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/keyboard.jpg b/graphics/layouts/keyboard.jpg new file mode 100644 index 0000000..9cbc41d Binary files /dev/null and b/graphics/layouts/keyboard.jpg differ diff --git a/graphics/layouts/keyboard.json b/graphics/layouts/keyboard.json new file mode 100644 index 0000000..36c9193 --- /dev/null +++ b/graphics/layouts/keyboard.json @@ -0,0 +1,76 @@ +{ + "MapName" : "8: Keyboard Bindings", + "MapImage" : "keyboard.jpg", + "InputDevices" :[ + { + "InputType": "X", + "DeviceName": "Keyboard", + "DeviceProdGuid": ["{00000000-0000-0000-0000-000000000000}"], + "Controls": [ + { "Input":"~", "Type": "Key", "X":150, "Y":100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1000, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":1900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":150, "Y":2000, "Width":770, "Height":108}, + + { "Input":"~", "Type": "Key", "X":1000, "Y":100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1000, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":1900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":1000, "Y":2000, "Width":770, "Height":108}, + + { "Input":"~", "Type": "Key", "X":2000, "Y":100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1000, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1100, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1200, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1300, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1400, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1500, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1600, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1700, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1800, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":1900, "Width":770, "Height":108}, + { "Input":"~", "Type": "Key", "X":2000, "Y":2000, "Width":770, "Height":108} + ] + } + ] +} + diff --git a/graphics/layouts/keyboard1.jpg b/graphics/layouts/keyboard1.jpg new file mode 100644 index 0000000..fefb4c2 Binary files /dev/null and b/graphics/layouts/keyboard1.jpg differ diff --git a/graphics/layouts/keyboard1.json b/graphics/layouts/keyboard1.json new file mode 100644 index 0000000..3d79efd --- /dev/null +++ b/graphics/layouts/keyboard1.json @@ -0,0 +1,90 @@ +{ + "MapName" : "8: Keyboard Layout", + "MapImage" : "keyboard1.jpg", + "InputDevices" :[ + { + "FontFamily": "Gill Sans Nova Cond", + "InputType": "K", + "DeviceName": "Keyboard", + "DeviceProdGuid": ["{00000000-0000-0000-0000-000000000000}"], + "Controls": [ + { "Input":"escape", "Type": "Digital", "X":124, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f1", "Type": "Digital", "X":475, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f2", "Type": "Digital", "X":719, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f3", "Type": "Digital", "X":963, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f4", "Type": "Digital", "X":1207, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f5", "Type": "Digital", "X":1570, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f6", "Type": "Digital", "X":1816, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f7", "Type": "Digital", "X":2060, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f8", "Type": "Digital", "X":2304, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f9", "Type": "Digital", "X":2667, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f10", "Type": "Digital", "X":2911, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f11", "Type": "Digital", "X":3155, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f12", "Type": "Digital", "X":3399, "Y":320, "Width":235, "Height":205, "Cmt":""}, + { "Input":"grave", "Type": "Digital", "X":124, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"1", "Type": "Digital", "X":370, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"2", "Type": "Digital", "X":614, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"3", "Type": "Digital", "X":858, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"4", "Type": "Digital", "X":1100, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"5", "Type": "Digital", "X":1344, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"6", "Type": "Digital", "X":1590, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"7", "Type": "Digital", "X":1834, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"8", "Type": "Digital", "X":2078, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"9", "Type": "Digital", "X":2322, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"0", "Type": "Digital", "X":2566, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"minus", "Type": "Digital", "X":2809, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"equals", "Type": "Digital", "X":3053, "Y":636, "Width":235, "Height":205, "Cmt":""}, + { "Input":"backspace", "Type": "Digital", "X":3297, "Y":636, "Width":404, "Height":205, "Cmt":""}, + { "Input":"tab", "Type": "Digital", "X":126, "Y":896, "Width":357, "Height":205, "Cmt":""}, + { "Input":"q", "Type": "Digital", "X":491, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"w", "Type": "Digital", "X":735, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"e", "Type": "Digital", "X":979, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"r", "Type": "Digital", "X":1223, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"t", "Type": "Digital", "X":1467, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"y", "Type": "Digital", "X":1711, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"u", "Type": "Digital", "X":1955, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"i", "Type": "Digital", "X":2199, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"o", "Type": "Digital", "X":2443, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"p", "Type": "Digital", "X":2687, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"lbracket", "Type": "Digital", "X":2931, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"rbracket", "Type": "Digital", "X":3175, "Y":896, "Width":235, "Height":205, "Cmt":""}, + { "Input":"enter", "Type": "Digital", "X":3465, "Y":938, "Width":235, "Height":205, "Cmt":""}, + { "Input":"capslock", "Type": "Digital", "X":126, "Y":1157, "Width":400, "Height":205, "Cmt":""}, + { "Input":"a", "Type": "Digital", "X":538, "Y":1157, "Width":235, "Height":205, "Cmt":""}, + { "Input":"s", "Type": "Digital", "X":782, "Y":1157, "Width":235, "Height":205, "Cmt":""}, + { "Input":"d", "Type": "Digital", "X":1026, "Y":1157, "Width":235, "Height":205, "Cmt":""}, + { "Input":"f", "Type": "Digital", "X":1270, "Y":1157, "Width":235, "Height":205, "Cmt":""}, + { "Input":"g", "Type": "Digital", "X":1514, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"h", "Type": "Digital", "X":1758, "Y":1157, "Width":235, "Height":205, "Cmt":""}, + { "Input":"j", "Type": "Digital", "X":2003, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"k", "Type": "Digital", "X":2247, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"l", "Type": "Digital", "X":2491, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"semicolon", "Type": "Digital", "X":2734, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"apostrophe", "Type": "Digital", "X":2979, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"backslash", "Type": "Digital", "X":3223, "Y":1158, "Width":235, "Height":205, "Cmt":""}, + { "Input":"lshift", "Type": "Digital", "X":129, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"z", "Type": "Digital", "X":719, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"x", "Type": "Digital", "X":963, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"c", "Type": "Digital", "X":1207, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"v", "Type": "Digital", "X":1451, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"b", "Type": "Digital", "X":1695, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"n", "Type": "Digital", "X":1939, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"m", "Type": "Digital", "X":2183, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"comma", "Type": "Digital", "X":2427, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"period", "Type": "Digital", "X":2671, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"slash", "Type": "Digital", "X":2914, "Y":1418, "Width":235, "Height":205, "Cmt":""}, + { "Input":"rshift", "Type": "Digital", "X":3402, "Y":1418, "Width":299, "Height":205, "Cmt":""}, + { "Input":"lctrl", "Type": "Digital", "X":129, "Y":1678, "Width":267, "Height":205, "Cmt":""}, + { "Input":"lalt", "Type": "Digital", "X":677, "Y":1678, "Width":267, "Height":205, "Cmt":""}, + { "Input":"space", "Type": "Digital", "X":956, "Y":1678, "Width":1654, "Height":205, "Cmt":""}, + { "Input":"ralt", "Type": "Digital", "X":2614, "Y":1678, "Width":267, "Height":205, "Cmt":""}, + { "Input":"rctrl", "Type": "Digital", "X":3436, "Y":1678, "Width":267, "Height":205, "Cmt":""} + + + + + ] + } + ] +} + diff --git a/graphics/layouts/mouse-numpad.jpg b/graphics/layouts/mouse-numpad.jpg new file mode 100644 index 0000000..7fa0614 Binary files /dev/null and b/graphics/layouts/mouse-numpad.jpg differ diff --git a/graphics/layouts/mouse-numpad.json b/graphics/layouts/mouse-numpad.json new file mode 100644 index 0000000..d3a0043 --- /dev/null +++ b/graphics/layouts/mouse-numpad.json @@ -0,0 +1,64 @@ +{ + "MapName" : "8: Numpad, Navigation Layout & Mouse", + "MapImage" : "mouse-numpad.jpg", + "InputDevices" :[ + { + "FontFamily": "Gill Sans Nova Cond", + "InputType": "K1", + "DeviceName": "Keyboard", + "DeviceProdGuid": ["{00000000-0000-0000-0000-000000000000}"], + "Controls": [ + { "Input":"print", "Type": "Digital", "X":107, "Y":340, "Width":235, "Height":205, "Cmt":""}, + { "Input":"scrolllock", "Type": "Digital", "X":351, "Y":339, "Width":235, "Height":205, "Cmt":""}, + { "Input":"pause", "Type": "Digital", "X":595, "Y":340, "Width":235, "Height":205, "Cmt":""}, + { "Input":"insert", "Type": "Digital", "X":107, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"home", "Type": "Digital", "X":351, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"pgup", "Type": "Digital", "X":595, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"delete", "Type": "Digital", "X":107, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"end", "Type": "Digital", "X":351, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"pgdown", "Type": "Digital", "X":595, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"up", "Type": "Digital", "X":351, "Y":1416, "Width":235, "Height":205, "Cmt":""}, + { "Input":"left", "Type": "Digital", "X":107, "Y":1660, "Width":235, "Height":205, "Cmt":""}, + { "Input":"down", "Type": "Digital", "X":351, "Y":1660, "Width":235, "Height":205, "Cmt":""}, + { "Input":"right", "Type": "Digital", "X":595, "Y":1660, "Width":235, "Height":205, "Cmt":""}, + { "Input":"numlock", "Type": "Digital", "X":939, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_divide", "Type": "Digital", "X":1183, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_multiply", "Type": "Digital", "X":1427, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_subtract", "Type": "Digital", "X":1670, "Y":685, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_7", "Type": "Digital", "X":939, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_8", "Type": "Digital", "X":1183, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_9", "Type": "Digital", "X":1427, "Y":928, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_add", "Type": "Digital", "X":1670, "Y":956, "Width":235, "Height":450, "Cmt":""}, + { "Input":"np_4", "Type": "Digital", "X":939, "Y":1172, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_5", "Type": "Digital", "X":1183, "Y":1172, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_6", "Type": "Digital", "X":1427, "Y":1172, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_1", "Type": "Digital", "X":939, "Y":1416, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_2", "Type": "Digital", "X":1183, "Y":1416, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_3", "Type": "Digital", "X":1427, "Y":1416, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_enter", "Type": "Digital", "X":1670, "Y":1444, "Width":235, "Height":450, "Cmt":""}, + { "Input":"np_0", "Type": "Digital", "X":939, "Y":1672, "Width":235, "Height":205, "Cmt":""}, + { "Input":"np_period", "Type": "Digital", "X":1427, "Y":1660, "Width":235, "Height":205, "Cmt":""} + ] + }, + { + "InputType": "M1", + "DeviceName": "Mouse", + "DeviceProdGuid": ["{10001000-0000-0000-0000-000000000000}"], + "Controls": [ + { "Input":"mouse1", "Type": "Digital", "X":2142, "Y":654, "Width":755, "Height":205, "Cmt":""}, + { "Input":"mouse2", "Type": "Digital", "X":3003, "Y":656, "Width":755, "Height":205, "Cmt":""}, + { "Input":"mouse3", "Type": "Digital", "X":2460, "Y":378, "Width":985, "Height":205, "Cmt":""}, + { "Input":"mouse4", "Type": "Digital", "X":2142, "Y":1115, "Width":535, "Height":205, "Cmt":""}, + { "Input":"mouse5", "Type": "Digital", "X":2142, "Y":884, "Width":535, "Height":205, "Cmt":""}, + { "Input":"mouse6", "Type": "Digital", "X":2459, "Y":1717, "Width":985, "Height":50, "Cmt":""}, + { "Input":"mouse7", "Type": "Digital", "X":2459, "Y":1769, "Width":985, "Height":50, "Cmt":""}, + { "Input":"mouse8", "Type": "Digital", "X":2459, "Y":1819, "Width":985, "Height":50, "Cmt":""}, + { "Input":"mwheel_up", "Type": "Digital", "X":2460, "Y":276, "Width":985, "Height":50, "Cmt":""}, + { "Input":"mwheel_down", "Type": "Digital", "X":2460, "Y":326, "Width":985, "Height":50, "Cmt":""}, + { "Input":"maxis_x", "Type": "Analogue", "X":2459, "Y":178, "Width":985, "Height":50, "Cmt":""}, + { "Input":"maxis_y", "Type": "Analogue", "X":2459, "Y":129, "Width":985, "Height":50, "Cmt":""} + ] + } + ] +} + diff --git a/graphics/layouts/proflightcombatpedals.json b/graphics/layouts/proflightcombatpedals.json index 56db75c..1d3a342 100644 --- a/graphics/layouts/proflightcombatpedals.json +++ b/graphics/layouts/proflightcombatpedals.json @@ -1,5 +1,5 @@ { - "MapName" : "Saitek ProFlight Combat Rudder Pedals", + "MapName" : "4: Saitek ProFlight Combat Rudder Pedals", "MapImage" : "proflightcombatpedals.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/proflightpedals.json b/graphics/layouts/proflightpedals.json index 65acdd7..39bf791 100644 --- a/graphics/layouts/proflightpedals.json +++ b/graphics/layouts/proflightpedals.json @@ -1,5 +1,5 @@ { - "MapName" : "Saitek ProFlight Rudder Pedals", + "MapName" : "4: Saitek ProFlight Rudder Pedals", "MapImage" : "proflightpedals.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/sidepanelcontroldeck.json b/graphics/layouts/sidepanelcontroldeck.json index 38a72d9..0f12777 100644 --- a/graphics/layouts/sidepanelcontroldeck.json +++ b/graphics/layouts/sidepanelcontroldeck.json @@ -1,5 +1,5 @@ { - "MapName" : "Saitek Side Panel Control Deck", + "MapName" : "5: Saitek Side Panel Control Deck", "MapImage" : "sidepanelcontroldeck.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/slawbf109pedals.json b/graphics/layouts/slawbf109pedals.json index c02f883..97eef65 100644 --- a/graphics/layouts/slawbf109pedals.json +++ b/graphics/layouts/slawbf109pedals.json @@ -1,5 +1,5 @@ { - "MapName" : "Slaw BF-109 Pedals", + "MapName" : "4: Slaw BF-109 Pedals", "MapImage" : "slawbf109pedals.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/stickx.json b/graphics/layouts/stickx.json index 7cb17d7..f88a281 100644 --- a/graphics/layouts/stickx.json +++ b/graphics/layouts/stickx.json @@ -1,5 +1,5 @@ { - "MapName" : "ThrustMaster T.Flight X", + "MapName" : "2: ThrustMaster T.Flight X Joystick", "MapImage" : "stickx.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/t16000m.json b/graphics/layouts/t16000m.json index 4f98c60..814c3a0 100644 --- a/graphics/layouts/t16000m.json +++ b/graphics/layouts/t16000m.json @@ -1,5 +1,5 @@ { - "MapName" : "T.16000M Joystick (right)", + "MapName" : "2: T.16000M (right hand Joystick)", "MapImage" : "t16000m.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/t16000mduo-left-right.json b/graphics/layouts/t16000mduo-left-right.json index bcff3c6..8e8b0db 100644 --- a/graphics/layouts/t16000mduo-left-right.json +++ b/graphics/layouts/t16000mduo-left-right.json @@ -1,5 +1,5 @@ { - "MapName" : "T.16000M DUO Joystick (left-right)", + "MapName" : "1: T.16000M DUO Joystick (left - right)", "MapImage" : "t16000mduo-left-right.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/t16000mduo-right-left.json b/graphics/layouts/t16000mduo-right-left.json index 6822b5e..2cc41b4 100644 --- a/graphics/layouts/t16000mduo-right-left.json +++ b/graphics/layouts/t16000mduo-right-left.json @@ -1,5 +1,5 @@ { - "MapName" : "T.16000M DUO Joystick (right-left)", + "MapName" : "1: T.16000M DUO Joystick (right - left)", "MapImage" : "t16000mduo-left-right.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/t16000mfcs.json b/graphics/layouts/t16000mfcs.json index 44e38ae..50b9c6e 100644 --- a/graphics/layouts/t16000mfcs.json +++ b/graphics/layouts/t16000mfcs.json @@ -1,5 +1,5 @@ { - "MapName" : "T.16000M FCS", + "MapName" : "1: T.16000M FCS Joystick & Throttle", "MapImage" : "t16000mfcs.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/tfrpedals.json b/graphics/layouts/tfrpedals.json index d8355ff..9832ae8 100644 --- a/graphics/layouts/tfrpedals.json +++ b/graphics/layouts/tfrpedals.json @@ -1,5 +1,5 @@ { - "MapName" : "ThrustMaster T-Flight Pedals", + "MapName" : "4: ThrustMaster T-Flight Pedals", "MapImage" : "tfrpedals.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/vpc-warbrd-delta-left.json b/graphics/layouts/vpc-warbrd-delta-left.json index db87895..62b557b 100644 --- a/graphics/layouts/vpc-warbrd-delta-left.json +++ b/graphics/layouts/vpc-warbrd-delta-left.json @@ -1,5 +1,5 @@ { - "MapName" : "VPC WarBRD Delta (left)", + "MapName" : "2: VPC WarBRD Delta (left hand Joystick)", "MapImage" : "vpc-warbrd-delta-left.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/vpc-warbrd-delta-right.json b/graphics/layouts/vpc-warbrd-delta-right.json index 39cf6d3..00f4760 100644 --- a/graphics/layouts/vpc-warbrd-delta-right.json +++ b/graphics/layouts/vpc-warbrd-delta-right.json @@ -1,5 +1,5 @@ { - "MapName" : "VPC WarBRD Delta (right)", + "MapName" : "2: VPC WarBRD Delta (right hand Joystick)", "MapImage" : "vpc-warbrd-delta-right.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/vpc-wb-delta-left-right.json b/graphics/layouts/vpc-wb-delta-left-right.json index 3a497b5..48ac828 100644 --- a/graphics/layouts/vpc-wb-delta-left-right.json +++ b/graphics/layouts/vpc-wb-delta-left-right.json @@ -1,5 +1,5 @@ { - "MapName" : "VPC WarBRD Delta DUO (left - right)", + "MapName" : "1: VPC WarBRD Delta DUO (left - right)", "MapImage" : "vpc-wb-delta-left-right.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/warthog.json b/graphics/layouts/warthog.json index c6a2529..2f9553b 100644 --- a/graphics/layouts/warthog.json +++ b/graphics/layouts/warthog.json @@ -1,5 +1,5 @@ { - "MapName" : "Warthog Throttle and Joystick", + "MapName" : "1: Warthog Joystick & Throttle", "MapImage" : "warthog.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x45.json b/graphics/layouts/x45.json index e427513..0feafa5 100644 --- a/graphics/layouts/x45.json +++ b/graphics/layouts/x45.json @@ -1,5 +1,5 @@ { - "MapName" : "x45-joystick+throttle", + "MapName" : "1: X45 Joystick & Throttle", "MapImage" : "x45.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x52.json b/graphics/layouts/x52.json index 96a2f44..4a09d04 100644 --- a/graphics/layouts/x52.json +++ b/graphics/layouts/x52.json @@ -1,5 +1,5 @@ { - "MapName" : "x52-joystick+throttle", + "MapName" : "1: X52 Joystick & Throttle", "MapImage" : "x52.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x52pro.json b/graphics/layouts/x52pro.json index 222f81e..2c6924b 100644 --- a/graphics/layouts/x52pro.json +++ b/graphics/layouts/x52pro.json @@ -1,5 +1,5 @@ { - "MapName" : "x52pro-joystick+throttle", + "MapName" : "1: X52pro Joystick & Throttle", "MapImage" : "x52pro.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x55-joystick.json b/graphics/layouts/x55-joystick.json index c059a6e..804d533 100644 --- a/graphics/layouts/x55-joystick.json +++ b/graphics/layouts/x55-joystick.json @@ -1,5 +1,5 @@ { - "MapName" : "x55-joystick", + "MapName" : "2: X55 Joystick", "MapImage" : "x55-joystick.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x55-throttle+stick.json b/graphics/layouts/x55-throttle+stick.json index fa96107..4e97d4f 100644 --- a/graphics/layouts/x55-throttle+stick.json +++ b/graphics/layouts/x55-throttle+stick.json @@ -1,5 +1,5 @@ { - "MapName" : "x55 Throttle and Joystick", + "MapName" : "1: X55 Joystick & Throttle", "MapImage" : "x55-throttle+stick.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x55-throttle.json b/graphics/layouts/x55-throttle.json index e579e68..895b246 100644 --- a/graphics/layouts/x55-throttle.json +++ b/graphics/layouts/x55-throttle.json @@ -1,5 +1,5 @@ { - "MapName" : "x55-throttle", + "MapName" : "3: X55 Throttle", "MapImage" : "x55-throttle.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x56-joystick.json b/graphics/layouts/x56-joystick.json index 28c3c54..a478dd7 100644 --- a/graphics/layouts/x56-joystick.json +++ b/graphics/layouts/x56-joystick.json @@ -1,5 +1,5 @@ { - "MapName" : "x56-joystick", + "MapName" : "2: X56 Joystick", "MapImage" : "x56-joystick.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x56-throttle+stick.json b/graphics/layouts/x56-throttle+stick.json index 32d405c..50a7d67 100644 --- a/graphics/layouts/x56-throttle+stick.json +++ b/graphics/layouts/x56-throttle+stick.json @@ -1,5 +1,5 @@ { - "MapName" : "x56 Throttle and Joystick", + "MapName" : "1: X56 Joystick & Throttle", "MapImage" : "x56-throttle+stick.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x65F-throttle+x55-stick.json b/graphics/layouts/x65F-throttle+x55-stick.json index 2561d35..92e96c3 100644 --- a/graphics/layouts/x65F-throttle+x55-stick.json +++ b/graphics/layouts/x65F-throttle+x55-stick.json @@ -1,5 +1,5 @@ { - "MapName" : "x65F-throttle + x55-stick", + "MapName" : "1: X55 Joystick & X65F Throttle", "MapImage" : "x65F-throttle+x55-stick.jpg", "InputDevices" :[ { diff --git a/graphics/layouts/x65F.json b/graphics/layouts/x65F.json index 6abc3e4..1764e7a 100644 --- a/graphics/layouts/x65F.json +++ b/graphics/layouts/x65F.json @@ -1,5 +1,5 @@ { - "MapName" : "x65F-joystick and throttle", + "MapName" : "1: X65F Joystick & Throttle", "MapImage" : "x65F.jpg", "InputDevices" :[ {