From aedd7e67fa41b9f48ca2d883a3451744af0f5538 Mon Sep 17 00:00:00 2001 From: Pieter Hulshoff Date: Sun, 11 Feb 2018 15:00:07 +0100 Subject: [PATCH] - Added support for monitor aspect ratio selection in the layout.xml: e.g. layout 4x3.xml, layout 16x9.xml, etc. - Added controls configuration at startup when controls.conf is missing. --- Package/Environment/Common/controls.conf | 298 - Package/Environment/Common/core/OpenSans.ttf | Bin 0 -> 32364 bytes .../layout/layout 16x9.xml | 2768 +++++++++ .../layout/layout 4x3.xml | 2717 ++++++++ .../Common/layouts/Aeon Nox/layout 16x9.xml | 5536 ++++++++--------- .../Common/layouts/Aeon Nox/layout 4x3.xml | 4 +- RetroFE/Source/Control/UserInput.cpp | 35 +- RetroFE/Source/Graphics/PageBuilder.cpp | 38 +- RetroFE/Source/Main.cpp | 8 +- RetroFE/Source/RetroFE.cpp | 230 +- RetroFE/Source/RetroFE.h | 6 + RetroFE/Source/Version.cpp | 2 +- 12 files changed, 8539 insertions(+), 3103 deletions(-) delete mode 100644 Package/Environment/Common/controls.conf create mode 100755 Package/Environment/Common/core/OpenSans.ttf create mode 100755 Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 16x9.xml create mode 100755 Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 4x3.xml diff --git a/Package/Environment/Common/controls.conf b/Package/Environment/Common/controls.conf deleted file mode 100644 index 80c19a5..0000000 --- a/Package/Environment/Common/controls.conf +++ /dev/null @@ -1,298 +0,0 @@ -up = Keypad 8,Up -down = Keypad 2,Down -left = Keypad 4,Left,joyButton7 -right = Keypad 6,Right,joyButton5 -pageUp = A -pageDown = B -letterUp = N -letterDown = M -favPlaylist = F -nextPlaylist = F2 -prevPlaylist = F1 -addPlaylist = I -removePlaylist = O -random = R -select = 1,Return,joyButton3 -back = 2,Escape,joyButton0 -quit = Q - - -# See below for a list of key codes that can be used for configuring the controls: - -###################### ###################################################### -# Code # Description -###################### ###################################################### -# "0" -# "1" -# "2" -# "3" -# "4" -# "5" -# "6" -# "7" -# "8" -# "9" -# "A" -# "AC Back" the Back key (application control keypad) -# "AC Bookmarks" the Bookmarks key (application control keypad) -# "AC Forward" the Forward key (application control keypad) -# "AC Home" the Home key (application control keypad) -# "AC Refresh" the Refresh key (application control keypad) -# "AC Search" the Search key (application control keypad) -# "AC Stop" the Stop key (application control keypad) -# "Again" the Again key (Redo) -# "AltErase" Erase-Eaze -# "'" -# "Application" the Application / Compose / Context Menu (Windows) -# key -# "AudioMute" the Mute volume key -# "AudioNext" the Next Track media key -# "AudioPlay" the Play media key -# "AudioPrev" the Previous Track media key -# "AudioStop" the Stop media key) -# "B" -# "\" Located at the lower left of the return key on ISO -# keyboards and at the right end of the QWERTY row -# on ANSI keyboards. Produces REVERSE SOLIDUS -# (backslash) and VERTICAL LINE in a US layout, -# REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, -# NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR -# SIGN and POUND SIGN in a Swiss German layout, -# NUMBER SIGN and APOSTROPHE in a German layout, GRAVE -# ACCENT and POUND SIGN in a French Mac layout, and -# ASTERISK and MICRO SIGN in a French Windows layout. -# "Backspace" -# "BrightnessDown" the Brightness Down key -# "BrightnessUp" the Brightness Up key -# "C" -# "Calculator" the Calculator key -# "Cancel" -# "CapsLock" -# "Clear" -# "Clear / Again" -# "," -# "Computer" the My Computer key -# "Copy" -# "CrSel" -# "CurrencySubUnit" the Currency Subunit key -# "CurrencyUnit" the Currency Unit key -# "Cut" -# "D" -# "DecimalSeparator" the Decimal Separator key -# "Delete" -# "DisplaySwitch" display mirroring/dual display switch, video mode -# switch -# "Down" the Down arrow key (navigation keypad) -# "E" -# "Eject" the Eject key) -# "End" -# "=" -# "Escape" the Esc key) -# "Execute" -# "ExSel" -# "F" -# "F1" -# "F10" -# "F11" -# "F12" -# "F13" -# "F14" -# "F15" -# "F16" -# "F17" -# "F18" -# "F19" -# "F2" -# "F20" -# "F21" -# "F22" -# "F23" -# "F24" -# "F3" -# "F4" -# "F5" -# "F6" -# "F7" -# "F8" -# "F9" -# "Find" -# "G" -# "`" Located in the top left corner (on both ANSI and ISO -# keyboards). Produces GRAVE ACCENT and TILDE in a US -# Windows layout and in US and UK Mac layouts on ANSI -# keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows -# layout, SECTION SIGN and PLUS-MINUS SIGN in US and -# UK Mac layouts on ISO keyboards, SECTION SIGN and -# DEGREE SIGN in a Swiss German layout (Mac: only on -# ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN -# in a German layout (Mac: only on ISO keyboards), -# SUPERSCRIPT TWO and TILDE in a French Windows layout, -# COMMERCIAL AT and NUMBER SIGN in a French Mac layout -# on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN -# SIGN in a Swiss German, German, or French Mac layout -# on ANSI keyboards. -# "H" -# "Help" -# "Home" -# "I" -# "Insert" insert on PC, help on some Mac keyboards (but does -# send code 73, not 117) -# "J" -# "K" -# "KBDIllumDown" the Keyboard Illumination Down key -# "KBDIllumToggle" the Keyboard Illumination Toggle key -# "KBDIllumUp" the Keyboard Illumination Up key -# "Keypad 0" the 0 key (numeric keypad) -# "Keypad 00" the 00 key (numeric keypad) -# "Keypad 000" the 000 key (numeric keypad) -# "Keypad 1" the 1 key (numeric keypad) -# "Keypad 2" the 2 key (numeric keypad) -# "Keypad 3" the 3 key (numeric keypad) -# "Keypad 4" the 4 key (numeric keypad) -# "Keypad 5" the 5 key (numeric keypad) -# "Keypad 6" the 6 key (numeric keypad) -# "Keypad 7" the 7 key (numeric keypad) -# "Keypad 8" the 8 key (numeric keypad) -# "Keypad 9" the 9 key (numeric keypad) -# "Keypad A" the A key (numeric keypad) -# "Keypad &" the & key (numeric keypad) -# "Keypad @" the @ key (numeric keypad) -# "Keypad B" the B key (numeric keypad) -# "Keypad Backspace" the Backspace key (numeric keypad) -# "Keypad Binary" the Binary key (numeric keypad) -# "Keypad C" the C key (numeric keypad) -# "Keypad Clear" the Clear key (numeric keypad) -# "Keypad ClearEntry" the Clear Entry key (numeric keypad) -# "Keypad :" the : key (numeric keypad) -# "Keypad ," the Comma key (numeric keypad) -# "Keypad D" the D key (numeric keypad) -# "Keypad &&" the && key (numeric keypad) -# "Keypad ||" the || key (numeric keypad) -# "Keypad Decimal" the Decimal key (numeric keypad) -# "Keypad /" the / key (numeric keypad) -# "Keypad E" the E key (numeric keypad) -# "Keypad Enter" the Enter key (numeric keypad) -# "Keypad =" the = key (numeric keypad) -# "Keypad = (AS400)" the Equals AS400 key (numeric keypad) -# "Keypad !" the ! key (numeric keypad) -# "Keypad F" the F key (numeric keypad) -# "Keypad >" the Greater key (numeric keypad) -# "Keypad #" the # key (numeric keypad) -# "Keypad Hexadecimal" the Hexadecimal key (numeric keypad) -# "Keypad {" the Left Brace key (numeric keypad) -# "Keypad (" the Left Parenthesis key (numeric keypad) -# "Keypad <" the Less key (numeric keypad) -# "Keypad MemAdd" the Mem Add key (numeric keypad) -# "Keypad MemClear" the Mem Clear key (numeric keypad) -# "Keypad MemDivide" the Mem Divide key (numeric keypad) -# "Keypad MemMultiply" the Mem Multiply key (numeric keypad) -# "Keypad MemRecall" the Mem Recall key (numeric keypad) -# "Keypad MemStore" the Mem Store key (numeric keypad) -# "Keypad MemSubtract" the Mem Subtract key (numeric keypad) -# "Keypad -" the - key (numeric keypad) -# "Keypad \*" the \* key (numeric keypad) -# "Keypad Octal" the Octal key (numeric keypad) -# "Keypad %" the Percent key (numeric keypad) -# "Keypad ." the . key (numeric keypad) -# "Keypad +" the + key (numeric keypad) -# "Keypad +/-" the +/- key (numeric keypad) -# "Keypad ^" the Power key (numeric keypad) -# "Keypad }" the Right Brace key (numeric keypad) -# "Keypad )" the Right Parenthesis key (numeric keypad) -# "Keypad Space" the Space key (numeric keypad) -# "Keypad Tab" the Tab key (numeric keypad) -# "Keypad \|" the \| key (numeric keypad) -# "Keypad XOR" the XOR key (numeric keypad) -# "L" -# "Left Alt" alt, option -# "Left Ctrl" -# "Left" the Left arrow key (navigation keypad) -# "[" -# "Left GUI" windows, command (apple), meta -# "Left Shift" -# "M" -# "Mail" the Mail/eMail key -# "MediaSelect" the Media Select key -# "Menu" -# "-" -# "ModeSwitch" I'm not sure if this is really not covered by any of -# the above, but since there's a special KMOD_MODE for -# it I'm adding it here -# "Mute" -# "N" -# "Numlock" the Num Lock key (PC) / the Clear key (Mac) -# "O" -# "Oper" -# "Out" -# "P" -# "PageDown" -# "PageUp" -# "Paste" -# "Pause" the Pause / Break key -# "." -# "Power" The USB document says this is a status flag, not a -# physical key - but some Mac keyboards do have a -# power key. -# "PrintScreen" -# "Prior" -# "Q" -# "R" -# "Right Alt" alt gr, option -# "Right Ctrl" -# "Return" the Enter key (main keyboard) -# "Return" -# "Right GUI" windows, command (apple), meta -# "Right" the Right arrow key (navigation keypad) -# "]" -# "Right Shift" -# "S" -# "ScrollLock" -# "Select" -# ";" -# "Separator" -# "/" -# "Sleep" the Sleep key -# "Space" the Space Bar key(s) -# "Stop" -# "SysReq" the SysReq key -# "T" -# "Tab" the Tab key -# "ThousandsSeparator" the Thousands Separator key -# "U" -# "Undo" -# "Up" the Up arrow key (navigation keypad) -# "V" -# "VolumeDown" -# "VolumeUp" -# "W" -# "WWW" the WWW/World Wide Web key -# "X" -# "Y" -# "Z" -# "#" ISO USB keyboards actually use this code instead of -# 49 for the same key, but all OSes I've seen treat -# the two codes identically. So, as an implementor, -# unless your keyboard generates both of those codes -# and your OS treats them differently, you should -# generate SDL_SCANCODE_BACKSLASH instead of this -# code. As a user, you should not rely on this code -# becauseSDL will never generate it with most (all?) -# keyboards. -# "&" -# "*" -# "@" -# "^" -# ":" -# "$" -# "!" -# ">" -# "#" -# "(" -# "<" -# "%" -# "+" -# "?" -# ")" -# "_" - -# These codes were taken from https://wiki.libsdl.org/SDL_Keycode diff --git a/Package/Environment/Common/core/OpenSans.ttf b/Package/Environment/Common/core/OpenSans.ttf new file mode 100755 index 0000000000000000000000000000000000000000..987276916c0df53d09e74f5708950664c36a30f5 GIT binary patch literal 32364 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 literal 0 HcmV?d00001 diff --git a/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 16x9.xml b/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 16x9.xml new file mode 100755 index 0000000..5dc1b15 --- /dev/null +++ b/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 16x9.xml @@ -0,0 +1,2768 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 4x3.xml b/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 4x3.xml new file mode 100755 index 0000000..00c8df8 --- /dev/null +++ b/Package/Environment/Common/layouts/Aeon Nox/collections/Third layer menu example/layout/layout 4x3.xml @@ -0,0 +1,2717 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Environment/Common/layouts/Aeon Nox/layout 16x9.xml b/Package/Environment/Common/layouts/Aeon Nox/layout 16x9.xml index 49d5df7..5dc1b15 100755 --- a/Package/Environment/Common/layouts/Aeon Nox/layout 16x9.xml +++ b/Package/Environment/Common/layouts/Aeon Nox/layout 16x9.xml @@ -1,2768 +1,2768 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package/Environment/Common/layouts/Aeon Nox/layout 4x3.xml b/Package/Environment/Common/layouts/Aeon Nox/layout 4x3.xml index c44142a..00c8df8 100755 --- a/Package/Environment/Common/layouts/Aeon Nox/layout 4x3.xml +++ b/Package/Environment/Common/layouts/Aeon Nox/layout 4x3.xml @@ -1807,7 +1807,7 @@ - + @@ -2656,7 +2656,7 @@ - diff --git a/RetroFE/Source/Control/UserInput.cpp b/RetroFE/Source/Control/UserInput.cpp index 92261c9..2e06c83 100644 --- a/RetroFE/Source/Control/UserInput.cpp +++ b/RetroFE/Source/Control/UserInput.cpp @@ -51,8 +51,22 @@ UserInput::~UserInput() bool UserInput::initialize() { + + // Optional keys + MapKey("pageDown", KeyCodePageDown, false ); + MapKey("pageUp", KeyCodePageUp, false ); + MapKey("letterDown", KeyCodeLetterDown, false); + MapKey("letterUp", KeyCodeLetterUp, false); + MapKey("favPlaylist", KeyCodeFavPlaylist, false); + MapKey("nextPlaylist", KeyCodeNextPlaylist, false); + MapKey("prevPlaylist", KeyCodePrevPlaylist, false); + MapKey("addPlaylist", KeyCodeAddPlaylist, false); + MapKey("removePlaylist", KeyCodeRemovePlaylist, false); + MapKey("random", KeyCodeRandom, false); + bool retVal = true; + // At least have controls for either a vertical or horizontal menu if(!MapKey("up", KeyCodeUp)) { retVal = MapKey("left", KeyCodeUp) && retVal; @@ -63,30 +77,17 @@ bool UserInput::initialize() } if(!MapKey("down", KeyCodeDown)) { - retVal = MapKey("right", KeyCodeDown) && retVal; + retVal = MapKey("right", KeyCodeDown ) && retVal; } - if(!MapKey("right", KeyCodeRight)) + if(!MapKey("right", KeyCodeRight )) { - retVal = MapKey("down", KeyCodeRight) && retVal; + retVal = MapKey("down", KeyCodeRight ) && retVal; } + // These keys are mandatory retVal = MapKey("select", KeyCodeSelect) && retVal; retVal = MapKey("back", KeyCodeBack) && retVal; retVal = MapKey("quit", KeyCodeQuit) && retVal; - retVal = MapKey("pageDown", KeyCodePageDown); - retVal = MapKey("pageUp", KeyCodePageUp); - - MapKey("letterDown", KeyCodeLetterDown, false); - MapKey("letterUp", KeyCodeLetterUp, false); - MapKey("favPlaylist", KeyCodeFavPlaylist, false); - MapKey("nextPlaylist", KeyCodeNextPlaylist, false); - MapKey("prevPlaylist", KeyCodePrevPlaylist, false); - MapKey("addPlaylist", KeyCodeAddPlaylist, false); - MapKey("removePlaylist", KeyCodeRemovePlaylist, false); - MapKey("random", KeyCodeRandom, false); - // these features will need to be implemented at a later time -// retVal = MapKey("admin", KeyCodeAdminMode) && retVal; -// retVal = MapKey("remove", KeyCodeHideItem) && retVal; return retVal; } diff --git a/RetroFE/Source/Graphics/PageBuilder.cpp b/RetroFE/Source/Graphics/PageBuilder.cpp index 1761912..506ab04 100644 --- a/RetroFE/Source/Graphics/PageBuilder.cpp +++ b/RetroFE/Source/Graphics/PageBuilder.cpp @@ -77,6 +77,7 @@ Page *PageBuilder::buildPage( std::string collectionName ) Page *page = NULL; std::string layoutFile; + std::string layoutFileAspect; std::string layoutName = layoutKey; if ( collectionName == "" ) @@ -89,19 +90,44 @@ Page *PageBuilder::buildPage( std::string collectionName ) layoutPath = Utils::combinePath(layoutPath, "layout"); } layoutFile = Utils::combinePath(layoutPath, layoutPage + ".xml"); + if ( screenWidth_*3/4 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 4x3.xml"); + else if ( screenWidth_*4/3 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 3x4.xml"); + else if ( screenWidth_*4/5 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 5x4.xml"); + else if ( screenWidth_*5/4 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 4x5.xml"); + else if ( screenWidth_*9/16 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 16x9.xml"); + else if ( screenWidth_*16/9 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 9x16.xml"); + else if ( screenWidth_*10/16 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 16x10.xml"); + else if ( screenWidth_*16/10 == screenHeight_ ) + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + " 10x16.xml"); + else + layoutFileAspect = Utils::combinePath(layoutPath, layoutPage + ".xml"); - Logger::write(Logger::ZONE_INFO, "Layout", "Initializing " + layoutFile); + Logger::write(Logger::ZONE_INFO, "Layout", "Initializing " + layoutFileAspect); rapidxml::xml_document<> doc; - std::ifstream file(layoutFile.c_str()); - std::vector buffer((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + std::ifstream file(layoutFileAspect.c_str()); - if(!file.good()) + if ( !file.good( ) ) { - Logger::write(Logger::ZONE_INFO, "Layout", "could not find layout file: " + layoutFile); - return NULL; + Logger::write( Logger::ZONE_INFO, "Layout", "could not find layout file: " + layoutFileAspect ); + Logger::write( Logger::ZONE_INFO, "Layout", "Initializing " + layoutFile ); + file.open( layoutFile.c_str( ) ); + if ( !file.good( ) ) + { + Logger::write( Logger::ZONE_INFO, "Layout", "could not find layout file: " + layoutFile ); + return NULL; + } } + std::vector buffer((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + try { buffer.push_back('\0'); diff --git a/RetroFE/Source/Main.cpp b/RetroFE/Source/Main.cpp index e8891ca..f27af0d 100644 --- a/RetroFE/Source/Main.cpp +++ b/RetroFE/Source/Main.cpp @@ -21,6 +21,7 @@ #include "Utility/Utils.h" #include "RetroFE.h" #include "Version.h" +#include "SDL.h" #include #include #include @@ -128,13 +129,6 @@ bool ImportConfiguration(Configuration *c) return false; } - std::string controlsConfPath = Utils::combinePath(configPath, "controls.conf"); - if(!c->import("controls", controlsConfPath)) - { - Logger::write(Logger::ZONE_ERROR, "RetroFE", "Could not import \"" + controlsConfPath + "\""); - return false; - } - dp = opendir(launchersPath.c_str()); if(dp == NULL) diff --git a/RetroFE/Source/RetroFE.cpp b/RetroFE/Source/RetroFE.cpp index 760f772..c9587b3 100644 --- a/RetroFE/Source/RetroFE.cpp +++ b/RetroFE/Source/RetroFE.cpp @@ -31,10 +31,13 @@ #include "Graphics/Component/ScrollingList.h" #include "Graphics/Component/Video.h" #include "Video/VideoFactory.h" -#include -#include -#include +#include #include +#include +#include +#include +#include +#include #if defined(__linux) || defined(__APPLE__) #include @@ -137,7 +140,7 @@ void RetroFE::launchEnter( ) { // Disable window focus - SDL_SetWindowGrab(SDL::getWindow(), SDL_FALSE); + SDL_SetWindowGrab(SDL::getWindow( ), SDL_FALSE); // Free the textures, and optionally take down SDL freeGraphicsMemory( ); @@ -267,6 +270,27 @@ void RetroFE::run( ) if(! SDL::initialize( config_ ) ) return; fontcache_.initialize( ); + // Define control configuration + std::string controlsConfPath = Utils::combinePath( Configuration::absolutePath, "controls.conf" ); + if ( !config_.import( "controls", controlsConfPath ) ) + { + + // Let the user input new controls + get_controls_config( ); + + // Re-initialize SDL to reset the controller situation + SDL::deInitialize( ); + if(! SDL::initialize( config_ ) ) return; + + // Retry reading the control configuration + if ( !config_.import( "controls", controlsConfPath ) ) + { + Logger::write( Logger::ZONE_ERROR, "RetroFE", "Could not import \"" + controlsConfPath + "\"" ); + return; + } + + } + float preloadTime = 0; // Initialize video @@ -1152,3 +1176,201 @@ CollectionInfo *RetroFE::getCollection(std::string collectionName) return collection; } + + +std::string RetroFE::get_key( ) +{ + + SDL_Event event; + std::string return_value; + + while ( SDL_PollEvent( &event ) ) + { + switch (event.type) + { + case SDL_JOYDEVICEADDED: + if ( !SDL_JoystickOpen( event.jdevice.which ) ) + Logger::write( Logger::ZONE_INFO, "RetroFE", "Unable to open SDL joystick." ); + else + Logger::write( Logger::ZONE_INFO, "RetroFE", "SDL joystick opened." ); + break; + case SDL_KEYDOWN: + if ( return_value.empty( ) ) + return_value = SDL_GetKeyName( event.key.keysym.sym); + break; + case SDL_JOYBUTTONDOWN: + if ( return_value.empty( ) ) + return_value = "joyButton" + std::to_string( int( event.jbutton.button ) ); + break; + case SDL_JOYAXISMOTION: + if ((event.jaxis.value > 30000 || event.jaxis.value < -30000) && event.jaxis.axis <= 3) + { + if ( event.jaxis.value > 0 ) + { + if ( return_value.empty( ) ) + return_value = "joyAxis" + std::to_string( int( event.jaxis.axis ) ) + "+"; + } + else + { + if ( return_value.empty( ) ) + return_value = "joyAxis" + std::to_string( int( event.jaxis.axis ) ) + "-"; + } + } + break; + case SDL_JOYHATMOTION: + switch( event.jhat.value ) + { + case SDL_HAT_UP: + if ( return_value.empty( ) ) + return_value = "joyHat" + std::to_string( int( event.jhat.hat ) ) + "Up"; + break; + case SDL_HAT_DOWN: + if ( return_value.empty( ) ) + return_value = "joyHat" + std::to_string( int( event.jhat.hat ) ) + "Down"; + break; + case SDL_HAT_LEFT: + if ( return_value.empty( ) ) + return_value = "joyHat" + std::to_string( int( event.jhat.hat ) ) + "Left"; + break; + case SDL_HAT_RIGHT: + if ( return_value.empty( ) ) + return_value = "joyHat" + std::to_string( int( event.jhat.hat ) ) + "Right"; + break; + } + break; + default: + break; + } + } + + return return_value; + +} + + +void RetroFE::print_string( std::string message, TTF_Font *font ) +{ + + SDL_Surface *surfaceMessage; + SDL_Texture *messageTexture; + SDL_Rect messageRect; + SDL_Color color = {255, 255, 255, 0}; + + surfaceMessage = TTF_RenderText_Solid( font, message.c_str( ), color ); + + if ( !surfaceMessage ) + Logger::write( Logger::ZONE_INFO, "RetroFE", "Could not render print_string text." ); + + messageTexture = SDL_CreateTextureFromSurface( SDL::getRenderer( ), surfaceMessage ); + + if ( !messageTexture ) + Logger::write( Logger::ZONE_INFO, "RetroFE", "Could not create print_string texture." ); + + messageRect.w = SDL::getWindowWidth( ) * 8 / 10; + messageRect.h = SDL::getWindowWidth( ) * 8 * surfaceMessage->h / (10 * surfaceMessage->w); + messageRect.x = SDL::getWindowWidth( )/2 - messageRect.w/2; + messageRect.y = SDL::getWindowHeight( )/2 - messageRect.h/2; + + SDL_LockMutex( SDL::getMutex( ) ); + SDL_SetRenderDrawColor( SDL::getRenderer( ), 0, 0, 0, 0xFF ); + SDL_RenderClear( SDL::getRenderer( ) ); + SDL_RenderCopy( SDL::getRenderer( ), messageTexture, NULL, &messageRect); + SDL_RenderPresent( SDL::getRenderer( ) ); + SDL_UnlockMutex( SDL::getMutex( ) ); + + SDL_FreeSurface( surfaceMessage); + SDL_DestroyTexture( messageTexture ); + +} + + +void RetroFE::get_controls_config( ) +{ + + Logger::write( Logger::ZONE_INFO, "RetroFE", std::to_string( SDL_NumJoysticks( ) ) + " joysticks were found." ); + + TTF_Font *font = TTF_OpenFont( Utils::combinePath( "core", "OpenSans.ttf" ).c_str( ), 48 ); + if ( !font ) + { + Logger::write( Logger::ZONE_INFO, "RetroFE", "SDL could not open font OpenSans.ttf" ); + return; + } + + std::ofstream controls_file; + controls_file.open( "controls.conf" ); + + std::vector> controls; + controls.push_back( std::make_tuple( "up", "go up in the games/collection menu", true ) ); + controls.push_back( std::make_tuple( "down", "go down in the games/collection menu", true ) ); + controls.push_back( std::make_tuple( "left", "go left in the games/collection menu", true ) ); + controls.push_back( std::make_tuple( "right", "go right in the games/collection menu", true ) ); + controls.push_back( std::make_tuple( "pageUp", "go to the next page in your games/collection menu", false ) ); + controls.push_back( std::make_tuple( "pageDown", "go to the previous page in your games/collection menu", false ) ); + controls.push_back( std::make_tuple( "letterUp", "go to the next letter in your games/collection menu", false ) ); + controls.push_back( std::make_tuple( "letterDown", "go to the previous letter in your games/collection menu", false ) ); + controls.push_back( std::make_tuple( "favPlaylist", "switch to your Favorites playlist", false ) ); + controls.push_back( std::make_tuple( "nextPlaylist", "switch to the next playlist", false ) ); + controls.push_back( std::make_tuple( "prevPlaylist", "switch to the previous playlist", false ) ); + controls.push_back( std::make_tuple( "addPlaylist", "add the selected game/collection to your Favorites playlist", false ) ); + controls.push_back( std::make_tuple( "removePlaylist", "remove the selected game/collection from your Favorites playlist", false ) ); + controls.push_back( std::make_tuple( "random", "select a random game/collection from the menu", false ) ); + controls.push_back( std::make_tuple( "select", "enter the collection/start the game", true ) ); + controls.push_back( std::make_tuple( "back", "go back to the previous menu", true ) ); + controls.push_back( std::make_tuple( "quit", "quit RetroFE", true ) ); + + std::string key; + std::vector keys; + + // Clear input queue before we start, but do attach joysticks + get_key( ); + + for ( uint c = 0; c < controls.size( ); c++ ) + { + + keys.clear( ); + int time_out = 0; + while ( true ) + { + key = ""; + while ( key.empty( ) ) + { + if ( !keys.size( ) ) + { + if ( std::get<2>( controls[c] ) ) + print_string( "Please enter your control to " + std::get<1>( controls[c] ) + ". This key is mandatory for proper RetroFE usage.", font ); + else + print_string( "Please enter your control to " + std::get<1>( controls[c] ) + " or wait " + std::to_string( 10 - time_out / 10 ) + " second(s) to not make a selection for this control.", font ); + } + else + { + print_string( "Please enter another control to " + std::get<1>( controls[c] ) + " or wait " + std::to_string( 10 - time_out / 10 ) + " second(s) to continue with the next control.", font ); + } + SDL_Delay( 100 ); + key = get_key( ); + time_out++; + if ( (!std::get<2>( controls[c] ) || keys.size( )) && time_out > 100 ) + break; + } + if ( key.empty( ) || (keys.size( ) && std::find( keys.begin( ), keys.end( ), key ) != keys.end( )) ) + break; + keys.push_back( key ); + time_out = 0; + + } + if ( keys.size( ) ) + { + controls_file << std::get<0>( controls[c] ) + " = "; + for ( uint i = 0; i < keys.size( ); i++ ) + if ( i == 0 ) + controls_file << keys[i]; + else + controls_file << ", " << keys[i]; + controls_file << std::endl; + } + + } + + controls_file.close( ); + TTF_CloseFont( font ); + +} diff --git a/RetroFE/Source/RetroFE.h b/RetroFE/Source/RetroFE.h index 8bc0d89..9c5993c 100644 --- a/RetroFE/Source/RetroFE.h +++ b/RetroFE/Source/RetroFE.h @@ -25,9 +25,11 @@ #include "Video/IVideo.h" #include "Video/VideoFactory.h" #include +#include #include #include #include +#include class CollectionInfo; @@ -113,4 +115,8 @@ private: std::map lastMenuOffsets_; std::map lastMenuPlaylists_; + std::string get_key( ); + void print_string( std::string message, TTF_Font *font ); + void get_controls_config( ); + }; diff --git a/RetroFE/Source/Version.cpp b/RetroFE/Source/Version.cpp index e013370..9149898 100644 --- a/RetroFE/Source/Version.cpp +++ b/RetroFE/Source/Version.cpp @@ -21,7 +21,7 @@ std::string retrofe_version_major = "0"; std::string retrofe_version_minor = "8"; -std::string retrofe_version_build = "14"; +std::string retrofe_version_build = "15b1"; std::string Version::getString( )