module display
import ::glesv2
+import mnit::input
import display_linux is conditional(linux)
import display_android is conditional(android)
# 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.
#
# 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
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
import programs
import gamnit_android is conditional(android)
+import gamnit_linux is conditional(linux)
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
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
--- /dev/null
+# 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