lib/gamnit: intro `accept_events` and other input related services
authorAlexis Laferrière <alexis.laf@xymus.net>
Thu, 10 Dec 2015 22:10:34 +0000 (17:10 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Mon, 14 Dec 2015 16:00:11 +0000 (11:00 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/gamnit/display.nit
lib/gamnit/display_linux.nit
lib/gamnit/gamnit.nit
lib/gamnit/gamnit_android.nit
lib/gamnit/gamnit_linux.nit [new file with mode: 0644]

index 97d82b5..69ddb41 100644 (file)
@@ -16,6 +16,7 @@
 module display
 
 import ::glesv2
+import mnit::input
 
 import display_linux is conditional(linux)
 import display_android is conditional(android)
@@ -35,6 +36,14 @@ class GamnitDisplay
        # Aspect ratio of the screen, `width / height`
        var aspect_ratio: Float is lazy do return width.to_f / height.to_f
 
+       # Is the cursor locked et the center of the screen?
+       var lock_cursor = false is writable
+
+       # Is the cursor visible?
+       #
+       # Only affects the desktop implementations.
+       var show_cursor: Bool = true is writable
+
        # Prepare this display
        #
        # The implementation varies per platform.
@@ -49,4 +58,9 @@ class GamnitDisplay
        #
        # The implementation varies per platform.
        fun flip do end
+
+       # Loop on available events and feed them back to the app
+       #
+       # The implementation varies per platform.
+       fun feed_events do end
 end
index e79d22f..8f115e7 100644 (file)
@@ -32,6 +32,10 @@ redef class GamnitDisplay
        fun height=(value: Int) do requested_height = value
        private var requested_height = 1080
 
+       redef fun show_cursor do return sdl_display.show_cursor
+
+       redef fun show_cursor=(val) do sdl_display.show_cursor = val
+
        # Setup SDL, X11, EGL in order
        redef fun setup
        do
index f68e483..63a5923 100644 (file)
@@ -22,6 +22,7 @@ import textures
 import programs
 
 import gamnit_android is conditional(android)
+import gamnit_linux is conditional(linux)
 
 redef class App
 
@@ -68,4 +69,13 @@ redef class App
        #
        # The implementation varies per platform.
        private fun feed_events do end
+
+       # Main method to receive `InputEvent` produced by the system
+       #
+       # Returns whether or not the event is used or intercepted.
+       # If `true`, the event will not be processed further by the system.
+       # Returns `false` to intercepts events like the back key on mobile devices.
+       #
+       # This method should be refined by client modules to react to user inputs.
+       fun accept_event(event: InputEvent): Bool do return false
 end
index 647c741..ff66e0b 100644 (file)
@@ -18,7 +18,20 @@ module gamnit_android
 import android
 
 intrude import gamnit
+intrude import android::input_events
 
 redef class App
        redef fun feed_events do app.poll_looper 0
+
+       redef fun native_input_key(event) do return accept_event(event)
+
+       redef fun native_input_motion(event)
+       do
+               var ie = new AndroidMotionEvent(event)
+               var handled = accept_event(ie)
+
+               if not handled then accept_event ie.acting_pointer
+
+               return handled
+       end
 end
diff --git a/lib/gamnit/gamnit_linux.nit b/lib/gamnit/gamnit_linux.nit
new file mode 100644 (file)
index 0000000..2aa1cae
--- /dev/null
@@ -0,0 +1,45 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Support services for Gamnit on GNU/Linux
+module gamnit_linux
+
+intrude import gamnit
+import display_linux
+
+redef class App
+       redef fun feed_events
+       do
+               var display = display
+               if display == null then return
+
+               var events = display.sdl_display.events
+               display.check_lock_cursor
+               for event in events do accept_event(event)
+       end
+end
+
+redef class GamnitDisplay
+
+       # HACK to keep the cursor in the center of the screen without producing move events
+       private fun check_lock_cursor
+       do
+               var sdl_display = sdl_display
+               if lock_cursor and sdl_display.input_focus then
+                       sdl_display.ignore_mouse_motion_events = true
+                       sdl_display.warp_mouse(width/2, height/2)
+                       sdl_display.ignore_mouse_motion_events = false
+               end
+       end
+end