From: Alexis Laferrière Date: Thu, 10 Dec 2015 22:10:34 +0000 (-0500) Subject: lib/gamnit: intro `accept_events` and other input related services X-Git-Tag: v0.8~36^2~9 X-Git-Url: http://nitlanguage.org lib/gamnit: intro `accept_events` and other input related services Signed-off-by: Alexis Laferrière --- diff --git a/lib/gamnit/display.nit b/lib/gamnit/display.nit index 97d82b5..69ddb41 100644 --- a/lib/gamnit/display.nit +++ b/lib/gamnit/display.nit @@ -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 diff --git a/lib/gamnit/display_linux.nit b/lib/gamnit/display_linux.nit index e79d22f..8f115e7 100644 --- a/lib/gamnit/display_linux.nit +++ b/lib/gamnit/display_linux.nit @@ -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 diff --git a/lib/gamnit/gamnit.nit b/lib/gamnit/gamnit.nit index f68e483..63a5923 100644 --- a/lib/gamnit/gamnit.nit +++ b/lib/gamnit/gamnit.nit @@ -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 diff --git a/lib/gamnit/gamnit_android.nit b/lib/gamnit/gamnit_android.nit index 647c741..ff66e0b 100644 --- a/lib/gamnit/gamnit_android.nit +++ b/lib/gamnit/gamnit_android.nit @@ -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 index 0000000..2aa1cae --- /dev/null +++ b/lib/gamnit/gamnit_linux.nit @@ -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