a_star: don't crash on deserialization errors and limit static types
[nit.git] / lib / sdl.nit
index 858e9b3..7eae171 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# SDL display support (used in Linux for windows and inputes only)
+# Simple DirectMedia Layer
 module sdl is
        cflags exec("sdl-config", "--cflags")
        ldflags(exec("sdl-config", "--libs"), "-lSDL_image -lSDL_ttf")
 end
 
-import mnit_display
+import mnit::display
 import c
 
 in "C header" `{
@@ -105,58 +105,53 @@ extern class SDLDisplay `{SDL_Surface *`}
                return events
        end
 
-       private fun poll_event: nullable SDLInputEvent import SDLKeyEvent, SDLMouseButtonEvent, SDLMouseMotionEvent, SDLQuitEvent, NativeString.to_s, SDLMouseButtonEvent.as(nullable SDLInputEvent), SDLMouseMotionEvent.as(nullable SDLInputEvent), SDLKeyEvent.as(nullable SDLInputEvent), SDLQuitEvent.as(nullable SDLInputEvent) `{
-               SDL_Event event;
-
+       private fun poll_event: nullable SDLInputEvent
+       import new_key_event, new_mouse_motion_event, new_mouse_button_event, new_quit_event `{
                SDL_PumpEvents();
 
+               SDL_Event event;
                if (SDL_PollEvent(&event))
                {
                        switch (event.type) {
                                case SDL_KEYDOWN:
                                case SDL_KEYUP:
-       #ifdef DEBUG
-                                       printf("The \"%s\" key was pressed!\n",
-                                                  SDL_GetKeyName(event.key.keysym.sym));
-       #endif
-
-                                       return SDLKeyEvent_as_nullable_SDLInputEvent(
-                                                       new_SDLKeyEvent(NativeString_to_s(
-                                                               SDL_GetKeyName(event.key.keysym.sym)),
-                                                               event.type==SDL_KEYDOWN));
+                                       return SDLDisplay_new_key_event(self,
+                                                               SDL_GetKeyName(event.key.keysym.sym),
+                                                               event.type==SDL_KEYDOWN);
 
                                case SDL_MOUSEMOTION:
-       #ifdef DEBUG
-                                       printf("Mouse moved by %d,%d to (%d,%d)\n",
-                                                  event.motion.xrel, event.motion.yrel,
-                                                  event.motion.x, event.motion.y);
-       #endif
-
-                                       return SDLMouseMotionEvent_as_nullable_SDLInputEvent(
-                                                       new_SDLMouseMotionEvent(event.motion.x, event.motion.y,
-                                                               event.motion.xrel, event.motion.yrel, SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1)));
+                                       return SDLDisplay_new_mouse_motion_event(self,
+                                               event.motion.x, event.motion.y,
+                                               event.motion.xrel, event.motion.yrel,
+                                               SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1));
 
                                case SDL_MOUSEBUTTONDOWN:
                                case SDL_MOUSEBUTTONUP:
-       #ifdef DEBUG
-                                       printf("Mouse button \"%d\" pressed at (%d,%d)\n",
-                                                  event.button.button, event.button.x, event.button.y);
-       #endif
-                                       return SDLMouseButtonEvent_as_nullable_SDLInputEvent(
-                                                       new_SDLMouseButtonEvent(event.button.x, event.button.y,
-                                                               event.button.button, event.type == SDL_MOUSEBUTTONDOWN));
+                                       return SDLDisplay_new_mouse_button_event(self,
+                                               event.button.x, event.button.y,
+                                               event.button.button,
+                                               event.type == SDL_MOUSEBUTTONDOWN);
 
                                case SDL_QUIT:
-       #ifdef DEBUG
-                                       printf("Quit event\n");
-       #endif
-                                       return SDLQuitEvent_as_nullable_SDLInputEvent(new_SDLQuitEvent());
+                                       return SDLDisplay_new_quit_event(self);
                        }
                }
 
                return null_SDLInputEvent();
        `}
 
+       private fun new_key_event(name: CString, down: Bool): nullable SDLInputEvent
+       do return new SDLKeyEvent(name.to_s, down)
+
+       private fun new_mouse_motion_event(x, y, xr, yr: Float, down: Bool): nullable SDLInputEvent
+       do return new SDLMouseMotionEvent(x, y, xr, yr, down)
+
+       private fun new_mouse_button_event(x, y: Float, id: Int, down: Bool): nullable SDLInputEvent
+       do return new SDLMouseButtonEvent(x, y, id, down)
+
+       private fun new_quit_event: nullable SDLInputEvent
+       do return new SDLQuitEvent
+
        # Set the position of the cursor to x,y
        fun warp_mouse(x,y: Int) `{ SDL_WarpMouse(x, y); `}
 
@@ -255,8 +250,8 @@ extern class SDLImage
        # Returns a reference to the pixels of the texture
        fun pixels: NativeCByteArray `{ return self->pixels; `}
 
-       # Does this texture has an alpha mask?
-       fun amask: Bool `{ return self->format->Amask; `}
+       # Mask for the alpha value of each pixel
+       fun amask: Int `{ return self->format->Amask; `}
 end
 
 # A simple rectangle
@@ -293,14 +288,10 @@ class SDLMouseEvent
        super PointerEvent
        super SDLInputEvent
 
-       redef var x: Float
-       redef var y: Float
+       redef var x
+       redef var y
 
-       private init (x, y: Float)
-       do
-               self.x = x
-               self.y = y
-       end
+       redef fun is_move do return false
 end
 
 # MouseButtonEvent used to get information when a button is pressed/depressed
@@ -310,7 +301,6 @@ class SDLMouseButtonEvent
        var button: Int
 
        redef var pressed
-       redef fun depressed do return not pressed
 
        # Is this event raised by the left button?
        fun is_left_button: Bool do return button == 1
@@ -356,7 +346,8 @@ class SDLMouseMotionEvent
        var rel_y: Float
 
        redef var pressed
-       redef fun depressed do return not pressed
+
+       redef fun is_move do return true
 
        init (x, y, rel_x, rel_y: Float, pressed: Bool)
        do
@@ -376,13 +367,8 @@ class SDLKeyEvent
        super SDLInputEvent
 
        redef var name
-       var down: Bool
 
-       init (key_name: String, down: Bool)
-       do
-               self.name = key_name
-               self.down = down
-       end
+       var down: Bool
 
        redef fun to_c
        do
@@ -404,10 +390,13 @@ class SDLKeyEvent
 
        # Return true if the key is the up arrow
        redef fun is_arrow_up do return name == "up"
+
        # Return true if the key is the left arrow
        redef fun is_arrow_left do return name == "left"
+
        # Return true if the key is the down arrow
        redef fun is_arrow_down do return name == "down"
+
        # Return true if the key is the right arrow
        redef fun is_arrow_right do return name == "right"
 end
@@ -495,7 +484,7 @@ extern class SDLFont `{TTF_Font *`}
                if (fn == NULL)
                        return null_String();
                else
-                       return String_as_nullable(NativeString_to_s(fn));
+                       return String_as_nullable(CString_to_s(fn));
        `}
 
        # Return the style name of the font
@@ -505,11 +494,11 @@ extern class SDLFont `{TTF_Font *`}
                if (sn == NULL)
                        return null_String();
                else
-                       return String_as_nullable(NativeString_to_s(sn));
+                       return String_as_nullable(CString_to_s(sn));
        `}
 
        # Return the estimated width of a String if used with the current font
-       fun width_of(text: String): Int import NativeString.to_s `{
+       fun width_of(text: String): Int import CString.to_s `{
                char *ctext = String_to_cstring(text);
                int w;
                if (TTF_SizeText(self, ctext, &w, NULL))