Browse Source

Merge pull request #350 from mortoray/next

Keyboard fixes for Linux
Sean Paul Taylor 13 years ago
parent
commit
81e2077355
2 changed files with 104 additions and 58 deletions
  1. 88 57
      gameplay-newproject.sh
  2. 16 1
      gameplay/src/PlatformLinux.cpp

+ 88 - 57
gameplay-newproject.sh

@@ -9,10 +9,39 @@
 # as input parameters.
 #
 # IMPORTANT: This script must be run from the root of the gameplay
-# source tree.
+# source tree (on Linux can run from anywhere)
 #
 # ********************************************************************
 
+function die()
+{
+    echo "$1"
+    exit 1
+}
+
+if [[ "${OSTYPE}" == linux* ]]; then
+    GAME_PLAY_PATH=$(readlink -e $(dirname $0))
+    
+    # the common sed syntax
+    function replace()
+    {
+        sed -i "s*$1*$2*g" $3
+    }
+    
+else
+    GAME_PLAY_PATH=`pwd`
+    
+    # the orignal version (MacOSX probably)
+    function replace()
+    {
+        sed -i "" 's*$1*$2*g' $3
+    }
+fi
+
+# ensure run from correct directory
+TEMPLATE_PATH=${GAME_PLAY_PATH}/gameplay-template
+[ -d "$TEMPLATE_PATH" ] || die "Missing gameplay-template"
+
 echo
 echo "1. Enter a name for the new project."
 echo
@@ -140,7 +169,8 @@ if [[ ${projPath:0:1} != "/" ]]; then
 fi
 
 # Generate relative path from project folder to gameplay folder
-gpPathAbs=`pwd`
+gpPathAbs=$GAME_PLAY_PATH
+gpPath=$GAME_PLAY_PATH
 common_path=$projPath
 back=
 while [ "${gpPathAbs#$common_path}" = "${gpPathAbs}" ]; do
@@ -156,57 +186,56 @@ if [[ ${gpPathAbs} == ${common_path} ]]; then
 	gpPath=${back}
 fi
 
-
 #############################################
 # Copy Microsoft Visual Studio project files
 #############################################
-cp "gameplay-template/gameplay-template.vcxproj" "$projPath/$projName.vcxproj"
-sed -i "" "s*TEMPLATE_PROJECT*$projectName*g" "$projPath/$projName.vcxproj"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/$projName.vcxproj"
-sed -i "" "s*GAMEPLAY_PATH*$gpPath*g" "$projPath/$projName.vcxproj"
+cp "${TEMPLATE_PATH}/gameplay-template.vcxproj" "$projPath/$projName.vcxproj"
+replace TEMPLATE_PROJECT "$projectName" "$projPath/$projName.vcxproj"
+replace TemplateGame "$className" "$projPath/$projName.vcxproj"
+replace GAMEPLAY_PATH "$gpPath" "$projPath/$projName.vcxproj"
 
-cp "gameplay-template/gameplay-template.vcxproj.filters" "$projPath/$projName.vcxproj.filters"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/$projName.vcxproj.filters"
+cp "${TEMPLATE_PATH}/gameplay-template.vcxproj.filters" "$projPath/$projName.vcxproj.filters"
+replace TemplateGame "$className" "$projPath/$projName.vcxproj.filters"
 
-cp "gameplay-template/gameplay-template.vcxproj.user" "$projPath/$projName.vcxproj.user"
-sed -i "" "s*GAMEPLAY_PATH*$gpPath*g" "$projPath/$projName.vcxproj.user"
+cp "${TEMPLATE_PATH}/gameplay-template.vcxproj.user" "$projPath/$projName.vcxproj.user"
+replace GAMEPLAY_PATH "$gpPath" "$projPath/$projName.vcxproj.user"
 
 
 #############################################
 # Copy Apple Xcode project files
 #############################################
 mkdir -p "$projPath/$projName.xcodeproj"
-cp "gameplay-template/gameplay-template.xcodeproj/project.pbxproj" "$projPath/$projName.xcodeproj/project.pbxproj"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/$projName.xcodeproj/project.pbxproj"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/$projName.xcodeproj/project.pbxproj"
-sed -i "" "s*GAMEPLAY_PATH*$gpPath*g" "$projPath/$projName.xcodeproj/project.pbxproj"
+cp "${TEMPLATE_PATH}/gameplay-template.xcodeproj/project.pbxproj" "$projPath/$projName.xcodeproj/project.pbxproj"
+replace TEMPLATE_PROJECT "$projName" "$projPath/$projName.xcodeproj/project.pbxproj"
+replace TemplateGame "$className" "$projPath/$projName.xcodeproj/project.pbxproj"
+replace GAMEPLAY_PATH "$gpPath" "$projPath/$projName.xcodeproj/project.pbxproj"
 
-cp "gameplay-template/TEMPLATE_PROJECT-macosx.plist" "$projPath/$projName-macosx.plist"
-sed -i "" "s*TEMPLATE_UUID*$uuid*g" "$projPath/$projName-macosx.plist"
-sed -i "" "s*TEMPLATE_AUTHOR*$author*g" "$projPath/$projName-macosx.plist"
+cp "${TEMPLATE_PATH}/TEMPLATE_PROJECT-macosx.plist" "$projPath/$projName-macosx.plist"
+replace TEMPLATE_UUID "$uuid" "$projPath/$projName-macosx.plist"
+replace TEMPLATE_AUTHOR "$author" "$projPath/$projName-macosx.plist"
 
-cp "gameplay-template/TEMPLATE_PROJECT-ios.plist" "$projPath/$projName-ios.plist"
-sed -i "" "s*TEMPLATE_TITLE*$title*g" "$projPath/$projName-ios.plist"
-sed -i "" "s*TEMPLATE_UUID*$uuid*g" "$projPath/$projName-ios.plist"
-sed -i "" "s*TEMPLATE_AUTHOR*$author*g" "$projPath/$projName-ios.plist"
+cp "${TEMPLATE_PATH}/TEMPLATE_PROJECT-ios.plist" "$projPath/$projName-ios.plist"
+replace TEMPLATE_TITLE "$title" "$projPath/$projName-ios.plist"
+replace TEMPLATE_UUID "$uuid" "$projPath/$projName-ios.plist"
+replace TEMPLATE_AUTHOR "$author" "$projPath/$projName-ios.plist"
 
 #############################################
 # Copy BlackBerry NDK project files
 #############################################
-cp "gameplay-template/template.cproject" "$projPath/.cproject"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/.cproject"
-sed -i "" "s*TEMPLATE_UUID*$uuid*g" "$projPath/.cproject"
-sed -i "" "s*GAMEPLAY_PATH*$gpPath*g" "$projPath/.cproject"
+cp "${TEMPLATE_PATH}/template.cproject" "$projPath/.cproject"
+replace TEMPLATE_PROJECT "$projName" "$projPath/.cproject"
+replace TEMPLATE_UUID "$uuid" "$projPath/.cproject"
+replace GAMEPLAY_PATH "$gpPath" "$projPath/.cproject"
 
-cp "gameplay-template/template.project" "$projPath/.project"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/.project"
+cp "${TEMPLATE_PATH}/template.project" "$projPath/.project"
+replace TEMPLATE_PROJECT "$projName" "$projPath/.project"
 
-cp "gameplay-template/template.bar-descriptor.xml" "$projPath/bar-descriptor.xml"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/bar-descriptor.xml"
-sed -i "" "s*TEMPLATE_TITLE*$title*g" "$projPath/bar-descriptor.xml"
-sed -i "" "s*TEMPLATE_UUID*$uuid*g" "$projPath/bar-descriptor.xml"
-sed -i "" "s*TEMPLATE_AUTHOR*$author*g" "$projPath/bar-descriptor.xml"
-sed -i "" "s*TEMPLATE_DESCRIPTION*$desc*g" "$projPath/bar-descriptor.xml"
+cp "${TEMPLATE_PATH}/template.bar-descriptor.xml" "$projPath/bar-descriptor.xml"
+replace TEMPLATE_PROJECT "$projName" "$projPath/bar-descriptor.xml"
+replace TEMPLATE_TITLE "$title" "$projPath/bar-descriptor.xml"
+replace TEMPLATE_UUID "$uuid" "$projPath/bar-descriptor.xml"
+replace TEMPLATE_AUTHOR "$author" "$projPath/bar-descriptor.xml"
+replace TEMPLATE_DESCRIPTION "$desc" "$projPath/bar-descriptor.xml"
 
 #############################################
 # Copy Android NDK project files
@@ -216,46 +245,48 @@ mkdir -p "$projPath/android/jni"
 mkdir -p "$projPath/android/res/values"
 mkdir -p "$projPath/android/res/drawable"
 
-cp "gameplay-template/android/template.AndroidManifest.xml" "$projPath/android/AndroidManifest.xml"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/android/AndroidManifest.xml"
-sed -i "" "s*TEMPLATE_UUID*$uuid*g" "$projPath/android/AndroidManifest.xml"
+cp "${TEMPLATE_PATH}/android/template.AndroidManifest.xml" "$projPath/android/AndroidManifest.xml"
+replace TEMPLATE_PROJECT "$projName" "$projPath/android/AndroidManifest.xml"
+replace TEMPLATE_UUID "$uuid" "$projPath/android/AndroidManifest.xml"
 
-cp "gameplay-template/android/template.build.xml" "$projPath/android/build.xml"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/android/build.xml"
+cp "${TEMPLATE_PATH}/android/template.build.xml" "$projPath/android/build.xml"
+replace TEMPLATE_PROJECT "$projName" "$projPath/android/build.xml"
 
-cp "gameplay-template/android/jni/Application.mk" "$projPath/android/jni/Application.mk"
+cp "${TEMPLATE_PATH}/android/jni/Application.mk" "$projPath/android/jni/Application.mk"
 
-cp "gameplay-template/android/jni/template.Android.mk" "$projPath/android/jni/Android.mk"
-sed -i "" "s*TEMPLATE_PROJECT*$projName*g" "$projPath/android/jni/Android.mk"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/android/jni/Android.mk"
-sed -i "" "s*GAMEPLAY_PATH*$gpPath*g" "$projPath/android/jni/Android.mk"
+cp "${TEMPLATE_PATH}/android/jni/template.Android.mk" "$projPath/android/jni/Android.mk"
+replace TEMPLATE_PROJECT "$projName" "$projPath/android/jni/Android.mk"
+replace TemplateGame "$className" "$projPath/android/jni/Android.mk"
+replace GAMEPLAY_PATH "$gpPath" "$projPath/android/jni/Android.mk"
 
 
-cp "gameplay-template/icon.png" "$projPath/android/res/drawable/icon.png"
-cp "gameplay-template/android/res/values/template.strings.xml" "$projPath/android/res/values/strings.xml"
-sed -i "" "s*TEMPLATE_TITLE*$title*g" "$projPath/android/res/values/strings.xml"
+cp "${TEMPLATE_PATH}/icon.png" "$projPath/android/res/drawable/icon.png"
+cp "${TEMPLATE_PATH}/android/res/values/template.strings.xml" "$projPath/android/res/values/strings.xml"
+replace TEMPLATE_TITLE "$title" "$projPath/android/res/values/strings.xml"
 
 
 #############################################
 # Copy source files
 #############################################
-cp "gameplay-template/src/TemplateGame.h" "$projPath/src/$className.h"
-cp "gameplay-template/src/TemplateGame.cpp" "$projPath/src/$className.cpp"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/src/$className.h"
-sed -i "" "s*TemplateGame*$className*g" "$projPath/src/$className.cpp"
+cp "${TEMPLATE_PATH}/src/TemplateGame.h" "$projPath/src/$className.h"
+cp "${TEMPLATE_PATH}/src/TemplateGame.cpp" "$projPath/src/$className.cpp"
+replace TemplateGame "$className" "$projPath/src/$className.h"
+replace TemplateGame "$className" "$projPath/src/$className.cpp"
 
 # Copy resource files
-cp "gameplay-template/res/"* "$projPath/res/"
+cp "${TEMPLATE_PATH}/res/"* "$projPath/res/"
 
 # Copy icon
-cp "gameplay-template/icon.png" "$projPath/icon.png"
+cp "${TEMPLATE_PATH}/icon.png" "$projPath/icon.png"
 
 # Copy config
-cp "gameplay-template/game.config" "$projPath/game.config"
-sed -i "" "s*TEMPLATE_TITLE*$title*g" "$projPath/game.config"
+cp "${TEMPLATE_PATH}/game.config" "$projPath/game.config"
+replace TEMPLATE_TITLE "$title" "$projPath/game.config"
 
 
-# Open the new project folder
-open $projPath
+if [[ "${OSTYPE}" == darwin* ]]; then
+    # Open the new project folder
+    open $projPath
+fi
 
 exit 0

+ 16 - 1
gameplay/src/PlatformLinux.cpp

@@ -152,6 +152,7 @@ static Keyboard::Key getKey(KeySym sym)
     case XK_F12:
         return Keyboard::KEY_F12;
     case XK_KP_Space:
+    case XK_space:
         return Keyboard::KEY_SPACE;
     case XK_parenright:
         return Keyboard::KEY_RIGHT_PARENTHESIS;
@@ -581,9 +582,23 @@ int Platform::enterMessagePump()
 
             case KeyRelease:
                 {
+                    //detect and drop repeating keystrokes (no other way to do this using the event interface)
+                    XEvent next;
+                    if( XPending(__display) )
+                    {
+                        XPeekEvent(__display,&next);
+                        if( next.type == KeyPress 
+                            && next.xkey.time == evt.xkey.time
+                            && next.xkey.keycode == evt.xkey.keycode )
+                        {
+                            XNextEvent(__display,&next);
+                            continue;
+                        }
+                    }
+                    
                     KeySym sym = XLookupKeysym(&evt.xkey, 0);
                     Keyboard::Key key = getKey(sym);
-                    gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_PRESS, key);
+                    gameplay::Platform::keyEventInternal(gameplay::Keyboard::KEY_RELEASE, key);
                 }
                 break;