colobot/src/common/event.h

266 lines
6.5 KiB
C
Raw Normal View History

// * 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/.
/**
* \file common/event.h
* \brief Event types, structs and event queue
*/
#pragma once
#include "common/key.h"
#include "common/event_ids.h"
#include "math/point.h"
#include "math/vector.h"
class CInstanceManager;
/**
* \enum PressState
* \brief State of key/mouse button
*/
enum PressState
{
STATE_PRESSED,
STATE_RELEASED
};
/**
* \struct KeyEventData
* \brief Additional data for keyboard event
*/
struct KeyEventData
{
//! STATE_PRESSED or STATE_RELEASED */
PressState state;
//! 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)
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
PressState state;
//! Position of mouse in normalized coordinates (0..1)
Math::Point pos;
};
/**
* \struct MouseButtonEventData
* \brief Additional data mouse button event
*/
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;
};
/**
* \enum WheelDirection
* \brief Direction of mouse wheel movement
*/
enum WheelDirection
{
WHEEL_UP,
WHEEL_DOWN
};
/**
* \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
*/
struct JoyAxisEventData
{
//! The joystick axis index
unsigned char axis;
//! The axis value (range: -32768 to 32767)
int value;
};
/**
* \struct JoyButtonEventData
* \brief Additional data for joystick button event
*/
struct JoyButtonEventData
{
//! The joystick button index
unsigned char button;
//! STATE_PRESSED or STATE_RELEASED
PressState state;
};
/**
* \enum ActiveEventFlags
* \brief Type of focus gained/lost
*/
enum ActiveEventFlags
{
//! Application window focus
ACTIVE_APP = 0x01,
//! Input focus
ACTIVE_INPUT = 0x02,
//! Mouse focus
ACTIVE_MOUSE = 0x04
};
/**
* \struct ActiveEventData
* \brief Additional data for active event
*/
struct ActiveEventData
{
//! Flags (bitmask of enum values ActiveEventFlags)
2012-08-13 16:17:54 +00:00
unsigned char flags;
//! True if the focus was gained; false otherwise
bool gain;
};
/**
* \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.
**/
struct Event
{
//! Type of event (EVENT_*)
EventType type;
//! If true, the event was produced by system (SDL); else, it has come from user interface
bool systemEvent;
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;
//! Additional data for EVENT_MOUSE_WHEEL
MouseWheelEventData mouseWheel;
//! Additional data for EVENT_JOY
JoyAxisEventData joyAxis;
//! Additional data for EVENT_JOY_AXIS
JoyButtonEventData joyButton;
//! Additional data for EVENT_ACTIVE
ActiveEventData active;
};
//! 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;
//! Motion vector set by keyboard or joystick
Math::Vector motionInput;
// TODO: remove and replace references with trackedKeys
short keyState;
// TODO: remove and replace references with mousePos
Math::Point pos;
// TODO: remove
long param; // parameter
// TODO: remove in longer term (use CApplication's new time functions instead)
float rTime; // relative time
Event(EventType aType = EVENT_NULL)
{
type = aType;
systemEvent = false;
trackedKeys = 0;
param = 0;
rTime = 0.0f;
}
};
//! Returns an unique event type (above the standard IDs)
EventType GetUniqueEventType();
/**
* \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.
*/
class CEventQueue
{
public:
//! Constant maximum size of queue
static const int MAX_EVENT_QUEUE = 100;
public:
//! Object's constructor
CEventQueue(CInstanceManager* iMan);
//! Object's destructor
~CEventQueue();
//! Empties the FIFO of events
void Flush();
//! Adds an event to the queue
bool AddEvent(const Event &event);
bool GetEvent(Event &event);
protected:
CInstanceManager* m_iMan;
Event m_fifo[MAX_EVENT_QUEUE];
int m_head;
int m_tail;
int m_total;
};