// Copyright (c) 2014 Alex Diener. All rights reserved.

#ifndef __SharedEvents_H__
#define __SharedEvents_H__
#ifdef __cplusplus
extern "C" {
#endif

#define EVENT_KEY_DOWN "key_down"
#define EVENT_KEY_UP "key_up"
#define EVENT_KEY_MODIFIERS_CHANGED "key_modifiers_changed"
#define EVENT_MOUSE_DOWN "mouse_down"
#define EVENT_MOUSE_UP "mouse_up"
#define EVENT_MOUSE_MOVED "mouse_moved"
#define EVENT_MOUSE_DRAGGED "mouse_dragged"
#define EVENT_RESIZED "resized"
#define EVENT_BACKGROUNDED "backgrounded"
#define EVENT_FOREGROUNDED "foregrounded"
#define EVENT_FULLSCREENED "fullscreened"
#define EVENT_WINDOWED "windowed"
#define EVENT_GAMEPAD_ATTACH "gamepad_attach"
#define EVENT_GAMEPAD_DETACH "gamepad_detach"
#define EVENT_GAMEPAD_BUTTON_DOWN "gamepad_button_down"
#define EVENT_GAMEPAD_BUTTON_UP "gamepad_button_up"
#define EVENT_GAMEPAD_AXIS_MOVE "gamepad_axis_move"
#define EVENT_DRAW "draw"
#define EVENT_CONFIRM_QUIT "confirm_quit"

#include "gamepad/Gamepad.h"

struct keyEvent {
	unsigned int charCode;
	unsigned int keyCode;
	unsigned int modifiers;
	bool isRepeat;
};

struct mouseEvent {
	unsigned int button; // Number for down/up, mask for dragged, undefined for moved
	Vector2f position;
	Vector2f rawPosition;
};

struct gamepadButtonEvent {
	struct Gamepad_device * device;
	unsigned int buttonID;
	double timestamp;
};

struct gamepadAxisEvent {
	struct Gamepad_device * device;
	unsigned int axisID;
	float value;
	float lastValue;
	double timestamp;
};

#ifdef __cplusplus
}
#endif
#endif
