changeset 19:bc1fdff76775

core: implement most useful events, closes #2445
author David Demelier <markand@malikania.fr>
date Wed, 08 Jan 2020 13:33:41 +0100
parents 3ddd3acfe0e9
children 2fb93d57c098
files Makefile src/event.c src/event.h src/key.h src/main.c src/mouse.h
diffstat 6 files changed, 583 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Wed Jan 08 13:25:17 2020 +0100
+++ b/Makefile	Wed Jan 08 13:33:41 2020 +0100
@@ -24,6 +24,7 @@
 LIB=            libmolko.a
 SRCS=           src/animation.c \
                 src/clock.c \
+                src/event.c \
                 src/font.c \
                 src/image.c \
                 src/sprite.c \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/event.c	Wed Jan 08 13:33:41 2020 +0100
@@ -0,0 +1,255 @@
+/*
+ * event.c -- event management
+ *
+ * Copyright (c) 2020 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <SDL.h>
+
+#include "event.h"
+
+/* Maintain with enum key constants in key.h */
+static const struct {
+	SDL_Keycode key;
+	enum key value;
+} keymap[] = {
+	{ SDLK_RETURN,          KEY_ENTER               },
+	{ SDLK_ESCAPE,          KEY_ESCAPE              },
+	{ SDLK_BACKSPACE,       KEY_BACKSPACE           },
+	{ SDLK_TAB,             KEY_TAB                 },
+	{ SDLK_SPACE,           KEY_SPACE               },
+	{ SDLK_EXCLAIM,         KEY_EXCLAIM             },
+	{ SDLK_QUOTEDBL,        KEY_DOUBLE_QUOTE        },
+	{ SDLK_HASH,            KEY_HASH                },
+	{ SDLK_PERCENT,         KEY_PERCENT             },
+	{ SDLK_DOLLAR,          KEY_DOLLAR              },
+	{ SDLK_AMPERSAND,       KEY_AMPERSAND           },
+	{ SDLK_QUOTE,           KEY_QUOTE               },
+	{ SDLK_LEFTPAREN,       KEY_LEFT_PAREN          },
+	{ SDLK_RIGHTPAREN,      KEY_RIGHT_PAREN         },
+	{ SDLK_ASTERISK,        KEY_ASTERISK            },
+	{ SDLK_PLUS,            KEY_PLUS                },
+	{ SDLK_COMMA,           KEY_COMMA               },
+	{ SDLK_MINUS,           KEY_MINUS               },
+	{ SDLK_PERIOD,          KEY_PERIOD              },
+	{ SDLK_SLASH,           KEY_SLASH               },
+	{ SDLK_0,               KEY_0                   },
+	{ SDLK_1,               KEY_1                   },
+	{ SDLK_2,               KEY_2                   },
+	{ SDLK_3,               KEY_3                   },
+	{ SDLK_4,               KEY_4                   },
+	{ SDLK_5,               KEY_5                   },
+	{ SDLK_6,               KEY_6                   },
+	{ SDLK_7,               KEY_7                   },
+	{ SDLK_8,               KEY_8                   },
+	{ SDLK_9,               KEY_9                   },
+	{ SDLK_COLON,           KEY_COLON               },
+	{ SDLK_SEMICOLON,       KEY_SEMICOLON           },
+	{ SDLK_LESS,            KEY_LESS                },
+	{ SDLK_EQUALS,          KEY_EQUALS              },
+	{ SDLK_GREATER,         KEY_GREATER             },
+	{ SDLK_QUESTION,        KEY_QUESTION            },
+	{ SDLK_AT,              KEY_AT                  },
+	{ SDLK_LEFTBRACKET,     KEY_LEFT_BRACKET        },
+	{ SDLK_BACKSLASH,       KEY_BACKSLASH           },
+	{ SDLK_RIGHTBRACKET,    KEY_RIGHT_BRACKET       },
+	{ SDLK_CARET,           KEY_CARET               },
+	{ SDLK_UNDERSCORE,      KEY_UNDERSCORE          },
+	{ SDLK_BACKQUOTE,       KEY_BACKQUOTE           },
+	{ SDLK_a,               KEY_a                   },
+	{ SDLK_b,               KEY_b                   },
+	{ SDLK_c,               KEY_c                   },
+	{ SDLK_d,               KEY_d                   },
+	{ SDLK_e,               KEY_e                   },
+	{ SDLK_f,               KEY_f                   },
+	{ SDLK_g,               KEY_g                   },
+	{ SDLK_h,               KEY_h                   },
+	{ SDLK_i,               KEY_i                   },
+	{ SDLK_j,               KEY_j                   },
+	{ SDLK_k,               KEY_k                   },
+	{ SDLK_l,               KEY_l                   },
+	{ SDLK_m,               KEY_m                   },
+	{ SDLK_n,               KEY_n                   },
+	{ SDLK_o,               KEY_o                   },
+	{ SDLK_p,               KEY_p                   },
+	{ SDLK_q,               KEY_q                   },
+	{ SDLK_r,               KEY_r                   },
+	{ SDLK_s,               KEY_s                   },
+	{ SDLK_t,               KEY_t                   },
+	{ SDLK_u,               KEY_u                   },
+	{ SDLK_v,               KEY_v                   },
+	{ SDLK_w,               KEY_w                   },
+	{ SDLK_x,               KEY_x                   },
+	{ SDLK_y,               KEY_y                   },
+	{ SDLK_z,               KEY_z                   },
+	{ SDLK_CAPSLOCK,        KEY_CAPSLOCK            },
+	{ SDLK_F1,              KEY_F1                  },
+	{ SDLK_F2,              KEY_F2                  },
+	{ SDLK_F3,              KEY_F3                  },
+	{ SDLK_F4,              KEY_F4                  },
+	{ SDLK_F5,              KEY_F5                  },
+	{ SDLK_F6,              KEY_F6                  },
+	{ SDLK_F7,              KEY_F7                  },
+	{ SDLK_F8,              KEY_F8                  },
+	{ SDLK_F9,              KEY_F9                  },
+	{ SDLK_F10,             KEY_F10                 },
+	{ SDLK_F11,             KEY_F11                 },
+	{ SDLK_F12,             KEY_F12                 },
+	{ SDLK_F13,             KEY_F13                 },
+	{ SDLK_F14,             KEY_F14                 },
+	{ SDLK_F15,             KEY_F15                 },
+	{ SDLK_F16,             KEY_F16                 },
+	{ SDLK_F17,             KEY_F17                 },
+	{ SDLK_F18,             KEY_F18                 },
+	{ SDLK_F19,             KEY_F19                 },
+	{ SDLK_F20,             KEY_F20                 },
+	{ SDLK_F21,             KEY_F21                 },
+	{ SDLK_F22,             KEY_F22                 },
+	{ SDLK_F23,             KEY_F23                 },
+	{ SDLK_F24,             KEY_F24                 },
+	{ SDLK_PRINTSCREEN,     KEY_PRINTSCREEN         },
+	{ SDLK_SCROLLLOCK,      KEY_SCROLLLOCK          },
+	{ SDLK_PAUSE,           KEY_PAUSE               },
+	{ SDLK_INSERT,          KEY_INSERT              },
+	{ SDLK_HOME,            KEY_HOME                },
+	{ SDLK_PAGEUP,          KEY_PAGEUP              },
+	{ SDLK_DELETE,          KEY_DELETE              },
+	{ SDLK_END,             KEY_END                 },
+	{ SDLK_PAGEDOWN,        KEY_PAGEDOWN            },
+	{ SDLK_RIGHT,           KEY_RIGHT               },
+	{ SDLK_LEFT,            KEY_LEFT                },
+	{ SDLK_DOWN,            KEY_DOWN                },
+	{ SDLK_UP,              KEY_UP                  },
+	{ SDLK_KP_DIVIDE,       KEY_KP_DIVIDE           },
+	{ SDLK_KP_MULTIPLY,     KEY_KP_MULTIPLY         },
+	{ SDLK_KP_MINUS,        KEY_KP_MINUS            },
+	{ SDLK_KP_PLUS,         KEY_KP_PLUS             },
+	{ SDLK_KP_ENTER,        KEY_KP_ENTER            },
+	{ SDLK_KP_1,            KEY_KP_1                },
+	{ SDLK_KP_2,            KEY_KP_2                },
+	{ SDLK_KP_3,            KEY_KP_3                },
+	{ SDLK_KP_4,            KEY_KP_4                },
+	{ SDLK_KP_5,            KEY_KP_5                },
+	{ SDLK_KP_6,            KEY_KP_6                },
+	{ SDLK_KP_7,            KEY_KP_7                },
+	{ SDLK_KP_8,            KEY_KP_8                },
+	{ SDLK_KP_9,            KEY_KP_9                },
+	{ SDLK_KP_0,            KEY_KP_0                },
+	{ SDLK_KP_PERIOD,       KEY_KP_PERIOD           },
+	{ SDLK_KP_COMMA,        KEY_KP_COMMA            },
+	{ SDLK_MENU,            KEY_MENU                },
+	{ SDLK_MUTE,            KEY_MUTE                },
+	{ SDLK_VOLUMEUP,        KEY_VOLUME_UP           },
+	{ SDLK_VOLUMEDOWN,      KEY_VOLUME_DOWN         },
+	{ SDLK_LCTRL,           KEY_LCTRL               },
+	{ SDLK_LSHIFT,          KEY_LSHIFT              },
+	{ SDLK_LALT,            KEY_LALT                },
+	{ SDLK_LGUI,            KEY_LSUPER              },
+	{ SDLK_RCTRL,           KEY_RCTRL               },
+	{ SDLK_RSHIFT,          KEY_RSHIFT              },
+	{ SDLK_RALT,            KEY_RALT                },
+	{ SDLK_RGUI,            KEY_RSUPER              },
+	{ 0,                    -1                      }
+};
+
+/* Maintain with enum mouse_button constants in mouse.h */
+static const struct {
+	int key;
+	enum mouse_button value;
+} buttons[] = {
+	{ SDL_BUTTON_LEFT,      MOUSE_BUTTON_LEFT       },
+	{ SDL_BUTTON_MIDDLE,    MOUSE_BUTTON_MIDDLE     },
+	{ SDL_BUTTON_RIGHT,     MOUSE_BUTTON_RIGHT      },
+	{ -1,                   MOUSE_BUTTON_UNKNOWN    }
+};
+
+static void
+convert_key(const SDL_Event *event, union event *ev)
+{
+	ev->type = event->type == SDL_KEYDOWN ? EVENT_KEYDOWN : EVENT_KEYUP;
+	ev->key.key = KEY_UNKNOWN;
+
+	for (size_t i = 0; keymap[i].key != 0; ++i) {
+		if (keymap[i].key == event->key.keysym.sym) {
+			ev->key.key = keymap[i].value;
+			break;
+		}
+	}
+}
+
+static void
+convert_mouse(const SDL_Event *event, union event *ev)
+{
+	ev->type = EVENT_MOUSE;
+	ev->mouse.buttons = 0;
+	ev->mouse.x = event->motion.x;
+	ev->mouse.y = event->motion.y;
+
+	if (event->motion.state & SDL_BUTTON_LMASK)
+		ev->mouse.buttons |= MOUSE_BUTTON_LEFT;
+	if (event->motion.state & SDL_BUTTON_MMASK)
+		ev->mouse.buttons |= MOUSE_BUTTON_MIDDLE;
+	if (event->motion.state & SDL_BUTTON_RMASK)
+		ev->mouse.buttons |= MOUSE_BUTTON_RIGHT;
+}
+
+static void
+convert_click(const SDL_Event *event, union event *ev)
+{
+	ev->type = event->type == SDL_MOUSEBUTTONDOWN ? EVENT_CLICKDOWN : EVENT_CLICKUP;
+	ev->click.button = MOUSE_BUTTON_UNKNOWN;
+	ev->click.x = event->button.x;
+	ev->click.y = event->button.y;
+
+	for (size_t i = 0; buttons[i].value != MOUSE_BUTTON_UNKNOWN; ++i) {
+		if (buttons[i].key == event->button.button) {
+			ev->click.button = buttons[i].value;
+			break;
+		}
+	}
+}
+
+bool
+event_poll(union event *ev)
+{
+	SDL_Event event;
+
+	/*
+	 * Loop until we find an event we want to report, we skip unneeded
+	 * ones.
+	 */
+	while (SDL_PollEvent(&event)) {
+		switch (event.type) {
+		case SDL_QUIT:
+			ev->type = EVENT_QUIT;
+			return true;
+		case SDL_KEYDOWN:
+		case SDL_KEYUP:
+			convert_key(&event, ev);
+			return true;
+		case SDL_MOUSEMOTION:
+			convert_mouse(&event, ev);
+			return true;
+		case SDL_MOUSEBUTTONDOWN:
+		case SDL_MOUSEBUTTONUP:
+			convert_click(&event, ev);
+			return true;
+		default:
+			continue;
+		}
+	}
+
+	return false;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/event.h	Wed Jan 08 13:33:41 2020 +0100
@@ -0,0 +1,80 @@
+/*
+ * event.h -- event management
+ *
+ * Copyright (c) 2020 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef MOLKO_EVENT_H
+#define MOLKO_EVENT_H
+
+/**
+ * \file event.h
+ * \brief Event management.
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include "key.h"
+#include "mouse.h"
+
+/**
+ * \brief Kind of event.
+ */
+enum event_type {
+	EVENT_CLICKDOWN,        /*!< Mouse click down */
+	EVENT_CLICKUP,          /*!< Mouse click released */
+	EVENT_KEYDOWN,          /*!< Single key down */
+	EVENT_KEYUP,            /*!< Single key released */
+	EVENT_MOUSE,            /*!< Mouse moved */
+	EVENT_QUIT,             /*!< Quit request */
+};
+
+/**
+ * \brief Store events.
+ */
+union event {
+	enum event_type type;                   /*!< Which kind of event */
+
+	struct {
+		enum event_type type;           /*!< EVENT_KEYDOWN or EVENT_KEYUP */
+		enum key key;                   /*!< Which key */
+	} key;
+
+	struct {
+		enum event_type type;           /*!< EVENT_MOUSE */
+		enum mouse_button buttons;      /*!< OR'ed buttons that are pressed */
+		int32_t x;                      /*!< Mouse position in x */
+		int32_t y;                      /*!< Mouse position in y */
+	} mouse;
+
+	struct {
+		enum event_type type;           /*!< EVENT_CLICKDOWN or EVENT_CLICKUP */
+		enum mouse_button button;       /*!< Unique button that was pressed */
+		int32_t x;                      /*!< Mouse position in x */
+		int32_t y;                      /*!< Mouse position in y */
+	} click;
+};
+
+/**
+ * Fetch the next event or return false if there are not.
+ *
+ * \param ev the event
+ * \return true if the event was filled or false otherwise
+ */
+bool
+event_poll(union event *ev);
+
+#endif /* !MOLKO_EVENT_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/key.h	Wed Jan 08 13:33:41 2020 +0100
@@ -0,0 +1,190 @@
+/*
+ * key.h -- keyboard definitions
+ *
+ * Copyright (c) 2020 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef MOLKO_KEY_H
+#define MOLKO_KEY_H
+
+/**
+ * \file key.h
+ * \brief Keyboard definitions.
+ */
+
+/**
+ * \brief Key codes.
+ */
+enum key {
+	KEY_UNKNOWN,
+	KEY_ENTER,
+	KEY_ESCAPE,
+	KEY_BACKSPACE,
+	KEY_TAB,
+	KEY_SPACE,
+	KEY_EXCLAIM,
+	KEY_DOUBLE_QUOTE,
+	KEY_HASH,
+	KEY_PERCENT,
+	KEY_DOLLAR,
+	KEY_AMPERSAND,
+	KEY_QUOTE,
+	KEY_LEFT_PAREN,
+	KEY_RIGHT_PAREN,
+	KEY_ASTERISK,
+	KEY_PLUS,
+	KEY_COMMA,
+	KEY_MINUS,
+	KEY_PERIOD,
+	KEY_SLASH,
+	KEY_0,
+	KEY_1,
+	KEY_2,
+	KEY_3,
+	KEY_4,
+	KEY_5,
+	KEY_6,
+	KEY_7,
+	KEY_8,
+	KEY_9,
+	KEY_COLON,
+	KEY_SEMICOLON,
+	KEY_LESS,
+	KEY_EQUALS,
+	KEY_GREATER,
+	KEY_QUESTION,
+	KEY_AT,
+	KEY_LEFT_BRACKET,
+	KEY_BACKSLASH,
+	KEY_RIGHT_BRACKET,
+	KEY_CARET,
+	KEY_UNDERSCORE,
+	KEY_BACKQUOTE,
+	KEY_a,
+	KEY_b,
+	KEY_c,
+	KEY_d,
+	KEY_e,
+	KEY_f,
+	KEY_g,
+	KEY_h,
+	KEY_i,
+	KEY_j,
+	KEY_k,
+	KEY_l,
+	KEY_m,
+	KEY_n,
+	KEY_o,
+	KEY_p,
+	KEY_q,
+	KEY_r,
+	KEY_s,
+	KEY_t,
+	KEY_u,
+	KEY_v,
+	KEY_w,
+	KEY_x,
+	KEY_y,
+	KEY_z,
+	KEY_CAPSLOCK,
+	KEY_F1,
+	KEY_F2,
+	KEY_F3,
+	KEY_F4,
+	KEY_F5,
+	KEY_F6,
+	KEY_F7,
+	KEY_F8,
+	KEY_F9,
+	KEY_F10,
+	KEY_F11,
+	KEY_F12,
+	KEY_F13,
+	KEY_F14,
+	KEY_F15,
+	KEY_F16,
+	KEY_F17,
+	KEY_F18,
+	KEY_F19,
+	KEY_F20,
+	KEY_F21,
+	KEY_F22,
+	KEY_F23,
+	KEY_F24,
+	KEY_PRINTSCREEN,
+	KEY_SCROLLLOCK,
+	KEY_PAUSE,
+	KEY_INSERT,
+	KEY_HOME,
+	KEY_PAGEUP,
+	KEY_DELETE,
+	KEY_END,
+	KEY_PAGEDOWN,
+	KEY_RIGHT,
+	KEY_LEFT,
+	KEY_DOWN,
+	KEY_UP,
+	KEY_NUMLOCKCLEAR,
+	KEY_KP_DIVIDE,
+	KEY_KP_MULTIPLY,
+	KEY_KP_MINUS,
+	KEY_KP_PLUS,
+	KEY_KP_ENTER,
+	KEY_KP_00,
+	KEY_KP_000,
+	KEY_KP_1,
+	KEY_KP_2,
+	KEY_KP_3,
+	KEY_KP_4,
+	KEY_KP_5,
+	KEY_KP_6,
+	KEY_KP_7,
+	KEY_KP_8,
+	KEY_KP_9,
+	KEY_KP_0,
+	KEY_KP_PERIOD,
+	KEY_KP_COMMA,
+	KEY_MENU,
+	KEY_MUTE,
+	KEY_VOLUME_UP,
+	KEY_VOLUME_DOWN,
+	KEY_LCTRL,
+	KEY_LSHIFT,
+	KEY_LALT,
+	KEY_LSUPER,
+	KEY_RCTRL,
+	KEY_RSHIFT,
+	KEY_RALT,
+	KEY_RSUPER,
+};
+
+/**
+ * \brief Keybord modifiers.
+ *
+ * This enumeration is usually stored as OR'ed flags as several modifiers can
+ * be pressed at a time.
+ */
+enum keymod {
+	KEYMOD_LSHIFT   = 1 << 0,       /*!< Left shift */
+	KEYMOD_LCTRL    = 1 << 1,       /*!< Left control */
+	KEYMOD_LALT     = 1 << 2,       /*!< Left alt */
+	KEYMOD_LSUPER   = 1 << 3,       /*!< Left super (logo) */
+	KEYMOD_RSHIFT   = 1 << 4,       /*!< Right shift */
+	KEYMOD_RCTRL    = 1 << 5,       /*!< Right control */
+	KEYMOD_RALT     = 1 << 6,       /*!< Right alt */
+	KEYMOD_RSUPER   = 1 << 7        /*!< Right super (logo) */
+};
+
+#endif /* !MOLKO_KEY_H */
--- a/src/main.c	Wed Jan 08 13:25:17 2020 +0100
+++ b/src/main.c	Wed Jan 08 13:33:41 2020 +0100
@@ -19,8 +19,9 @@
 #include <stdio.h>
 
 #include "animation.h"
+#include "clock.h"
+#include "event.h"
 #include "font.h"
-#include "clock.h"
 #include "image.h"
 #include "sprite.h"
 #include "texture.h"
@@ -35,65 +36,36 @@
 {
 	(void)argc;
 	(void)argv;
+
 	SDL_Init(SDL_INIT_VIDEO);
 	TTF_Init();
 	IMG_Init(IMG_INIT_PNG);
 
-	struct texture *logo, *label;
-	struct sprite sprite;
-	struct clock clock;
-	struct font *font;
-	struct animation animation;
-
 	window_init("Molko's Adventure", 640, 480);
 	window_set_color(0x667788ff);
 
-	clock_start(&clock);
-
-	logo = image_openf("E:\\dev\\molko\\explosion.png");
-	font = font_openf("E:\\dev\\molko\\DejaVuSans.ttf", 10);
-
-	if (!logo || !font) {
-		printf("%s\n", SDL_GetError());
-		exit(1);
-	}
+	for (;;) {
+		union event ev;
 
-	label = font_render(font, "Hello World", 0xffffffff);
-	sprite_init(&sprite, logo, 256, 256);
-	animation_init(&animation, &sprite, 20);
-
-	setvbuf(stdout, NULL, _IONBF, 0);
-
-	while (!animation_is_complete(&animation)) {
-		uint64_t ticks = clock_elapsed(&clock);
-
-		clock_start(&clock);
-
-		SDL_Event ev;
-		while (SDL_PollEvent(&ev)) {
+		while (event_poll(&ev)) {
 			switch (ev.type) {
-			case SDL_QUIT:
+			case EVENT_QUIT:
 				return 0;
+			case EVENT_MOUSE:
+				printf("mouse moved to %d, %d, state: %d\n", ev.mouse.x, ev.mouse.y, ev.mouse.buttons);
+				break;
+			case EVENT_CLICKDOWN:
+				printf("mouse click on %d, %d, which: %d\n", ev.click.x, ev.click.y, ev.click.button);
+				break;
+			default:
+				break;
 			}
 		}
 
-		animation_update(&animation, ticks);
 		window_clear();
-		texture_draw(label, 30, 30);
-		animation_draw(&animation, 10, 10);
 		window_present();
 		SDL_Delay(50);
 	}
 
-#if 0
-	window_set_color(0xffffffff);
-	window_draw_line(50, 50, 100, 100);
-	window_draw_point(60, 60);
-	window_draw_rectangle(true, 20, 20, 70, 10);
-	logo = image_openf("E:\\Charactervector.png");
-	sprite_init(&sprite, logo, 65, 100);
-	sprite_draw(&sprite, 1, 2, 400, 400);
-#endif
-
 	return 0;
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mouse.h	Wed Jan 08 13:33:41 2020 +0100
@@ -0,0 +1,42 @@
+/*
+ * mouse.h -- mouse definitions
+ *
+ * Copyright (c) 2020 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef MOLKO_MOUSE_H
+#define MOLKO_MOUSE_H
+
+/**
+ * \file mouse.h
+ * \brief Mouse definitions.
+ */
+
+/**
+ * \brief Buttons from mouse.
+ *
+ * This enumeration is used as both flags or constants. For example when the
+ * user press one button on the mouse it generates one constant event. On the
+ * other hand, while moving the mouse the user may have one or more buttons
+ * pressed, thus the OR'ed combination.
+ */
+enum mouse_button {
+	MOUSE_BUTTON_UNKNOWN    = 0,            /*!< No buttons pressed */
+	MOUSE_BUTTON_LEFT       = (1 << 0),     /*!< Left button pressed */
+	MOUSE_BUTTON_MIDDLE     = (1 << 1),     /*!< Middle button pressed */
+	MOUSE_BUTTON_RIGHT      = (1 << 2)      /*!< Right button pressed */
+};
+
+#endif /* !MOLKO_MOUSE_H */