2012-06-26 20:23:05 +00:00
|
|
|
// * This file is part of the COLOBOT source code
|
|
|
|
// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
|
|
|
|
// *
|
|
|
|
// * This program is free software: you can redistribute it and/or modify
|
|
|
|
// * it under the terms of the GNU General Public License as published by
|
|
|
|
// * the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// * (at your option) any later version.
|
|
|
|
// *
|
|
|
|
// * This program is distributed in the hope that it will be useful,
|
|
|
|
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// * GNU General Public License for more details.
|
|
|
|
// *
|
|
|
|
// * You should have received a copy of the GNU General Public License
|
|
|
|
// * along with this program. If not, see http://www.gnu.org/licenses/.
|
|
|
|
|
2012-09-09 15:51:10 +00:00
|
|
|
/**
|
|
|
|
* \file common/event.h
|
|
|
|
* \brief Event types, structs and event queue
|
|
|
|
*/
|
2012-06-26 20:23:05 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
2012-09-09 15:51:10 +00:00
|
|
|
#include "common/key.h"
|
|
|
|
#include "common/event_ids.h"
|
|
|
|
#include "math/point.h"
|
2012-09-19 19:23:42 +00:00
|
|
|
#include "math/vector.h"
|
2012-06-26 20:23:05 +00:00
|
|
|
|
2012-06-29 22:12:04 +00:00
|
|
|
class CInstanceManager;
|
2012-06-26 20:23:05 +00:00
|
|
|
|
2012-06-29 22:12:04 +00:00
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \enum PressState
|
|
|
|
* \brief State of key/mouse button
|
|
|
|
*/
|
2012-06-29 22:12:04 +00:00
|
|
|
enum PressState
|
|
|
|
{
|
|
|
|
STATE_PRESSED,
|
|
|
|
STATE_RELEASED
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \struct KeyEventData
|
|
|
|
* \brief Additional data for keyboard event
|
|
|
|
*/
|
2012-06-29 22:12:04 +00:00
|
|
|
struct KeyEventData
|
|
|
|
{
|
|
|
|
//! STATE_PRESSED or STATE_RELEASED */
|
|
|
|
PressState state;
|
2012-09-19 16:32:18 +00:00
|
|
|
//! If true, the key is a virtual code generated by key modifier press or joystick button press
|
|
|
|
bool virt;
|
|
|
|
//! Key symbol: KEY(...) macro value or virtual key VIRTUAL_... (from common/key.h)
|
2012-06-29 22:12:04 +00:00
|
|
|
unsigned int key;
|
|
|
|
//! Keyboard modifiers: a bitmask made of KEY_MOD(...) macro values (from common/key.h)
|
|
|
|
unsigned int mod;
|
|
|
|
//! Unicode character
|
|
|
|
unsigned int unicode;
|
|
|
|
};
|
|
|
|
|
|
|
|
/** \struct MouseMotionEventData
|
|
|
|
\brief Additional data for mouse move event */
|
|
|
|
struct MouseMoveEventData
|
|
|
|
{
|
|
|
|
//! Current button state
|
2012-09-19 16:32:18 +00:00
|
|
|
PressState state;
|
2012-06-29 22:12:04 +00:00
|
|
|
//! Position of mouse in normalized coordinates (0..1)
|
|
|
|
Math::Point pos;
|
|
|
|
};
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \struct MouseButtonEventData
|
|
|
|
* \brief Additional data mouse button event
|
|
|
|
*/
|
2012-06-29 22:12:04 +00:00
|
|
|
struct MouseButtonEventData
|
|
|
|
{
|
|
|
|
//! The mouse button index
|
|
|
|
unsigned char button;
|
|
|
|
//! STATE_PRESSED or STATE_RELEASED
|
|
|
|
PressState state;
|
|
|
|
//! Position of mouse in normalized coordinates (0..1)
|
|
|
|
Math::Point pos;
|
2012-09-19 19:23:42 +00:00
|
|
|
};
|
2012-06-29 22:12:04 +00:00
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \enum WheelDirection
|
|
|
|
* \brief Direction of mouse wheel movement
|
|
|
|
*/
|
|
|
|
enum WheelDirection
|
|
|
|
{
|
|
|
|
WHEEL_UP,
|
|
|
|
WHEEL_DOWN
|
2012-06-29 22:12:04 +00:00
|
|
|
};
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \enum MouseWheelEventData
|
|
|
|
* \brief Additional data for mouse wheel event.
|
|
|
|
*/
|
|
|
|
struct MouseWheelEventData
|
|
|
|
{
|
|
|
|
//! Wheel direction
|
|
|
|
WheelDirection dir;
|
|
|
|
//! Position of mouse in normalized coordinates (0..1)
|
|
|
|
Math::Point pos;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \struct JoyAxisEventData
|
|
|
|
* \brief Additional data for joystick axis event
|
|
|
|
*/
|
2012-06-29 22:12:04 +00:00
|
|
|
struct JoyAxisEventData
|
|
|
|
{
|
|
|
|
//! The joystick axis index
|
|
|
|
unsigned char axis;
|
|
|
|
//! The axis value (range: -32768 to 32767)
|
|
|
|
int value;
|
|
|
|
};
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \struct JoyButtonEventData
|
|
|
|
* \brief Additional data for joystick button event
|
|
|
|
*/
|
2012-06-29 22:12:04 +00:00
|
|
|
struct JoyButtonEventData
|
|
|
|
{
|
|
|
|
//! The joystick button index
|
|
|
|
unsigned char button;
|
|
|
|
//! STATE_PRESSED or STATE_RELEASED
|
|
|
|
PressState state;
|
2012-06-26 20:23:05 +00:00
|
|
|
};
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \enum ActiveEventFlags
|
|
|
|
* \brief Type of focus gained/lost
|
|
|
|
*/
|
2012-07-29 13:09:53 +00:00
|
|
|
enum ActiveEventFlags
|
|
|
|
{
|
|
|
|
//! Application window focus
|
|
|
|
ACTIVE_APP = 0x01,
|
|
|
|
//! Input focus
|
|
|
|
ACTIVE_INPUT = 0x02,
|
|
|
|
//! Mouse focus
|
|
|
|
ACTIVE_MOUSE = 0x04
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
/**
|
|
|
|
* \struct ActiveEventData
|
|
|
|
* \brief Additional data for active event
|
|
|
|
*/
|
2012-07-29 13:09:53 +00:00
|
|
|
struct ActiveEventData
|
|
|
|
{
|
|
|
|
//! Flags (bitmask of enum values ActiveEventFlags)
|
2012-08-13 16:17:54 +00:00
|
|
|
unsigned char flags;
|
2012-07-29 13:09:53 +00:00
|
|
|
//! True if the focus was gained; false otherwise
|
|
|
|
bool gain;
|
|
|
|
};
|
2012-06-29 22:12:04 +00:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
2012-09-19 19:23:42 +00:00
|
|
|
* \struct Event
|
|
|
|
* \brief Event sent by system, interface or game
|
|
|
|
*
|
|
|
|
* Event is described by its type (EventType) and the union
|
|
|
|
* \a data contains additional data about the event.
|
|
|
|
* Different members of the union are filled with different event types.
|
|
|
|
* With some events, nothing is filled (it's zeroed out).
|
|
|
|
* The union contains roughly the same information as SDL_Event struct
|
|
|
|
* but packaged to independent structs and fields.
|
2012-06-29 22:12:04 +00:00
|
|
|
**/
|
2012-06-26 20:23:05 +00:00
|
|
|
struct Event
|
|
|
|
{
|
2012-06-29 22:12:04 +00:00
|
|
|
//! Type of event (EVENT_*)
|
|
|
|
EventType type;
|
2012-06-30 08:16:52 +00:00
|
|
|
|
2012-07-22 20:05:12 +00:00
|
|
|
//! If true, the event was produced by system (SDL); else, it has come from user interface
|
|
|
|
bool systemEvent;
|
|
|
|
|
2012-08-09 20:50:04 +00:00
|
|
|
union
|
|
|
|
{
|
|
|
|
//! Additional data for EVENT_KEY_DOWN and EVENT_KEY_UP
|
|
|
|
KeyEventData key;
|
|
|
|
//! Additional data for EVENT_MOUSE_BUTTON_DOWN and EVENT_MOUSE_BUTTON_UP
|
|
|
|
MouseButtonEventData mouseButton;
|
|
|
|
//! Additional data for EVENT_MOUSE_MOVE
|
|
|
|
MouseMoveEventData mouseMove;
|
2012-09-19 19:23:42 +00:00
|
|
|
//! Additional data for EVENT_MOUSE_WHEEL
|
|
|
|
MouseWheelEventData mouseWheel;
|
2012-08-09 20:50:04 +00:00
|
|
|
//! Additional data for EVENT_JOY
|
|
|
|
JoyAxisEventData joyAxis;
|
|
|
|
//! Additional data for EVENT_JOY_AXIS
|
|
|
|
JoyButtonEventData joyButton;
|
|
|
|
//! Additional data for EVENT_ACTIVE
|
|
|
|
ActiveEventData active;
|
|
|
|
};
|
|
|
|
|
2012-09-19 16:32:18 +00:00
|
|
|
//! State of tracked keys (mask of TrackedKey enum values)
|
|
|
|
unsigned int trackedKeys;
|
|
|
|
|
|
|
|
//! Mouse position is provided also for other types of events besides mouse events
|
|
|
|
Math::Point mousePos;
|
|
|
|
|
2012-09-19 19:23:42 +00:00
|
|
|
//! Motion vector set by keyboard or joystick
|
|
|
|
Math::Vector motionInput;
|
|
|
|
|
2012-09-19 16:32:18 +00:00
|
|
|
// TODO: remove and replace references with trackedKeys
|
|
|
|
short keyState;
|
|
|
|
|
|
|
|
// TODO: remove and replace references with mousePos
|
|
|
|
Math::Point pos;
|
|
|
|
|
2012-09-12 21:43:04 +00:00
|
|
|
// TODO: remove
|
2012-08-09 20:50:04 +00:00
|
|
|
long param; // parameter
|
2012-09-12 21:43:04 +00:00
|
|
|
|
|
|
|
// TODO: remove in longer term (use CApplication's new time functions instead)
|
2012-08-09 20:50:04 +00:00
|
|
|
float rTime; // relative time
|
2012-06-29 22:12:04 +00:00
|
|
|
|
2012-07-22 20:05:12 +00:00
|
|
|
Event(EventType aType = EVENT_NULL)
|
2012-08-09 20:50:04 +00:00
|
|
|
{
|
|
|
|
type = aType;
|
|
|
|
systemEvent = false;
|
2012-09-19 16:32:18 +00:00
|
|
|
trackedKeys = 0;
|
2012-08-09 20:50:04 +00:00
|
|
|
|
|
|
|
param = 0;
|
|
|
|
rTime = 0.0f;
|
|
|
|
}
|
2012-06-26 20:23:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-09-09 15:51:10 +00:00
|
|
|
//! Returns an unique event type (above the standard IDs)
|
|
|
|
EventType GetUniqueEventType();
|
2012-06-26 20:23:05 +00:00
|
|
|
|
|
|
|
|
2012-06-29 22:12:04 +00:00
|
|
|
/**
|
2012-09-19 19:23:42 +00:00
|
|
|
* \class CEventQueue
|
|
|
|
* \brief Global event queue
|
|
|
|
*
|
|
|
|
* Provides an interface to a global FIFO queue with events (both system- and user-generated).
|
|
|
|
* The queue has a fixed maximum size but it should not be a problem.
|
2012-06-29 22:12:04 +00:00
|
|
|
*/
|
|
|
|
class CEventQueue
|
2012-06-26 20:23:05 +00:00
|
|
|
{
|
|
|
|
public:
|
2012-06-29 22:12:04 +00:00
|
|
|
//! Constant maximum size of queue
|
|
|
|
static const int MAX_EVENT_QUEUE = 100;
|
|
|
|
|
|
|
|
public:
|
|
|
|
//! Object's constructor
|
|
|
|
CEventQueue(CInstanceManager* iMan);
|
|
|
|
//! Object's destructor
|
|
|
|
~CEventQueue();
|
2012-06-26 20:23:05 +00:00
|
|
|
|
2012-06-29 22:12:04 +00:00
|
|
|
//! Empties the FIFO of events
|
2012-06-26 20:23:05 +00:00
|
|
|
void Flush();
|
2012-06-29 22:12:04 +00:00
|
|
|
//! Adds an event to the queue
|
2012-06-26 20:23:05 +00:00
|
|
|
bool AddEvent(const Event &event);
|
|
|
|
bool GetEvent(Event &event);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
CInstanceManager* m_iMan;
|
2012-06-29 22:12:04 +00:00
|
|
|
Event m_fifo[MAX_EVENT_QUEUE];
|
|
|
|
int m_head;
|
|
|
|
int m_tail;
|
|
|
|
int m_total;
|
2012-06-26 20:23:05 +00:00
|
|
|
};
|