/* * This file is part of the Colobot: Gold Edition source code * Copyright (C) 2001-2023, Daniel Roux, EPSITEC SA & TerranovaTeam * http://epsitec.ch; http://colobot.info; http://github.com/colobot * * 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://gnu.org/licenses */ /** * \file common/event.h * \brief Event types, structs and event queue */ #pragma once #include "common/key.h" #include #include #include #include /** \enum EventType \brief Type of event message */ enum EventType { // TODO: document the meaning of each value //! Invalid event / no event EVENT_NULL = 0, // System events (originating in CApplication) //! Event sent on system quit request EVENT_SYS_QUIT = 1, //! Frame update event EVENT_FRAME = 2, //! Event sent after pressing a mouse button EVENT_MOUSE_BUTTON_DOWN = 3, //! Event sent after releasing a mouse button EVENT_MOUSE_BUTTON_UP = 4, //! Event sent after moving mouse wheel up or down EVENT_MOUSE_WHEEL = 5, //! Event sent after moving the mouse EVENT_MOUSE_MOVE = 7, //! Event sent when mouse enters the window EVENT_MOUSE_ENTER = 8, //! Event sent when mouse leaves the window EVENT_MOUSE_LEAVE = 9, //! Event sent after pressing a key EVENT_KEY_DOWN = 10, //! Event sent after releasing a key EVENT_KEY_UP = 11, //! Event sent when user inputs some character EVENT_TEXT_INPUT = 12, //! Event sent after moving joystick axes EVENT_JOY_AXIS = 13, //! Event sent after pressing a joystick button EVENT_JOY_BUTTON_DOWN = 14, //! Event sent after releasing a joystick button EVENT_JOY_BUTTON_UP = 15, //! Event sent when the app winddow gains focus EVENT_FOCUS_GAINED = 16, //! Event sent when the app winddow loses focus EVENT_FOCUS_LOST = 17, //!< Maximum value of system events EVENT_SYS_MAX, /* Events sent/received in game and user interface */ //! Event sent on user quit request EVENT_QUIT = 20, EVENT_UPDINTERFACE = 21, //! Event sent on resolution change EVENT_RESOLUTION_CHANGED = 22, //! Event sent when textures have to be reloaded EVENT_RELOAD_TEXTURES = 23, EVENT_WIN = 30, EVENT_LOST = 31, //! CEdit focus EVENT_FOCUS = 35, EVENT_BUTTON_OK = 40, EVENT_BUTTON_CANCEL = 41, EVENT_BUTTON_NEXT = 42, EVENT_BUTTON_PREV = 43, EVENT_BUTTON0 = 50, EVENT_BUTTON1 = 51, EVENT_BUTTON2 = 52, EVENT_BUTTON3 = 53, EVENT_BUTTON4 = 54, EVENT_BUTTON5 = 55, EVENT_BUTTON6 = 56, EVENT_BUTTON7 = 57, EVENT_BUTTON8 = 58, EVENT_BUTTON9 = 59, EVENT_BUTTON10 = 60, EVENT_BUTTON11 = 61, EVENT_BUTTON12 = 62, EVENT_BUTTON13 = 63, EVENT_BUTTON14 = 64, EVENT_BUTTON15 = 65, EVENT_BUTTON16 = 66, EVENT_BUTTON17 = 67, EVENT_BUTTON18 = 68, EVENT_BUTTON19 = 69, EVENT_EDIT0 = 70, EVENT_EDIT1 = 71, EVENT_EDIT2 = 72, EVENT_EDIT3 = 73, EVENT_EDIT4 = 74, EVENT_EDIT5 = 75, EVENT_EDIT6 = 76, EVENT_EDIT7 = 77, EVENT_EDIT8 = 78, EVENT_EDIT9 = 79, EVENT_WINDOW0 = 80, //!< object interface (CObjectInterface + CAuto classes) EVENT_WINDOW1 = 81, //!< CMainMap EVENT_WINDOW2 = 82, //!< CDisplayText EVENT_WINDOW3 = 83, //!< CStudio EVENT_WINDOW4 = 84, //!< CDisplayInfo EVENT_WINDOW5 = 85, //!< all menu windows EVENT_WINDOW6 = 86, //!< code battle interface EVENT_WINDOW7 = 87, //!< debug interface EVENT_WINDOW8 = 88, //!< (unused) EVENT_WINDOW9 = 89, //!< CMainDialog and CStudio file selector EVENT_LABEL0 = 90, EVENT_LABEL1 = 91, EVENT_LABEL2 = 92, EVENT_LABEL3 = 93, EVENT_LABEL4 = 94, EVENT_LABEL5 = 95, EVENT_LABEL6 = 96, EVENT_LABEL7 = 97, EVENT_LABEL8 = 98, EVENT_LABEL9 = 99, EVENT_LABEL10 = 100, EVENT_LABEL11 = 101, EVENT_LABEL12 = 102, EVENT_LABEL13 = 103, EVENT_LABEL14 = 104, EVENT_LABEL15 = 105, EVENT_LABEL16 = 106, EVENT_LABEL17 = 107, EVENT_LABEL18 = 108, EVENT_LABEL19 = 109, // cursor position overlay EVENT_LIST0 = 110, EVENT_LIST1 = 111, EVENT_LIST2 = 112, // list of resolutions EVENT_LIST3 = 113, EVENT_LIST4 = 114, EVENT_LIST5 = 115, EVENT_LIST6 = 116, EVENT_LIST7 = 117, EVENT_LIST8 = 118, EVENT_LIST9 = 119, EVENT_LOADING = 120, EVENT_LABEL_CODE_BATTLE = 121, EVENT_SCOREBOARD = 130, EVENT_SCOREBOARD_MAX = 169, EVENT_TOOLTIP = 200, EVENT_DIALOG_OK = 300, EVENT_DIALOG_CANCEL = 301, EVENT_DIALOG_LABEL = 302, EVENT_DIALOG_LABEL1 = 303, EVENT_DIALOG_LABEL2 = 304, EVENT_DIALOG_LABEL3 = 305, EVENT_DIALOG_LIST = 306, EVENT_DIALOG_EDIT = 307, EVENT_DIALOG_EDIT2 = 308, EVENT_DIALOG_CHECK1 = 309, EVENT_DIALOG_CHECK2 = 310, EVENT_DIALOG_GROUP1 = 320, EVENT_DIALOG_NEWDIR = 330, EVENT_DIALOG_ACTION = 348, EVENT_DIALOG_STOP = 349, EVENT_INTERFACE_TRAINER = 400, EVENT_INTERFACE_DEFI = 401, EVENT_INTERFACE_MISSION = 402, EVENT_INTERFACE_FREE = 403, EVENT_INTERFACE_CODE_BATTLES = 404, EVENT_INTERFACE_NAME = 405, EVENT_INTERFACE_SETUP = 406, EVENT_INTERFACE_QUIT = 407, EVENT_INTERFACE_BACK = 408, EVENT_INTERFACE_AGAIN = 409, EVENT_INTERFACE_WRITE = 410, EVENT_INTERFACE_READ = 411, EVENT_INTERFACE_ABORT = 412, EVENT_INTERFACE_USER = 413, EVENT_INTERFACE_SATCOM = 414, EVENT_INTERFACE_PLUS = 415, EVENT_INTERFACE_MODS = 416, EVENT_INTERFACE_CAREER = 417, EVENT_INTERFACE_CHAP = 420, EVENT_INTERFACE_LIST = 421, EVENT_INTERFACE_RESUME = 422, EVENT_INTERFACE_PLAY = 423, EVENT_INTERFACE_SETUPd = 430, EVENT_INTERFACE_SETUPg = 431, EVENT_INTERFACE_SETUPp = 432, EVENT_INTERFACE_SETUPc = 433, EVENT_INTERFACE_SETUPs = 434, EVENT_INTERFACE_DEVICE = 440, EVENT_INTERFACE_RESOL = 441, EVENT_INTERFACE_FULL = 442, EVENT_INTERFACE_APPLY = 443, EVENT_INTERFACE_SHADOW_SPOTS = 451, EVENT_INTERFACE_DIRTY = 452, EVENT_INTERFACE_LIGHT = 457, EVENT_INTERFACE_PARTI = 458, EVENT_INTERFACE_CLIP = 459, EVENT_INTERFACE_PAUSE_BLUR = 460, EVENT_INTERFACE_RAIN = 462, EVENT_INTERFACE_GLINT = 463, EVENT_INTERFACE_TOOLTIP = 464, EVENT_INTERFACE_MOVIES = 465, EVENT_INTERFACE_SCROLL = 467, EVENT_INTERFACE_INVERTX = 468, EVENT_INTERFACE_INVERTY = 469, EVENT_INTERFACE_EFFECT = 470, EVENT_INTERFACE_BGPAUSE = 471, EVENT_INTERFACE_BGMUTE = 472, EVENT_INTERFACE_FOG = 474, EVENT_INTERFACE_EDITMODE= 476, EVENT_INTERFACE_EDITVALUE= 477, EVENT_INTERFACE_SOLUCE4 = 478, EVENT_INTERFACE_BLOOD = 479, EVENT_INTERFACE_AUTOSAVE_ENABLE = 780, EVENT_INTERFACE_AUTOSAVE_INTERVAL = 781, EVENT_INTERFACE_AUTOSAVE_SLOTS = 782, EVENT_INTERFACE_TEXTURE_FILTER = 783, EVENT_INTERFACE_TEXTURE_MIPMAP = 784, EVENT_INTERFACE_TEXTURE_ANISOTROPY = 785, EVENT_INTERFACE_MSAA = 786, EVENT_INTERFACE_SHADOW_MAPPING = 787, EVENT_INTERFACE_SHADOW_MAPPING_QUALITY = 788, EVENT_INTERFACE_SHADOW_MAPPING_BUFFER = 789, EVENT_INTERFACE_LANGUAGE = 790, EVENT_INTERFACE_VSYNC = 791, EVENT_INTERFACE_KINFO1 = 500, EVENT_INTERFACE_KINFO2 = 501, EVENT_INTERFACE_KGROUP = 502, EVENT_INTERFACE_KSCROLL = 503, EVENT_INTERFACE_KDEF = 504, // Reserved space for keybindings // This is not the nicest solution, but it'll have to work like that until we move to CEGUI EVENT_INTERFACE_KEY = 505, EVENT_INTERFACE_KEY_END = 539, EVENT_INTERFACE_MIN = 540, EVENT_INTERFACE_NORM = 541, EVENT_INTERFACE_MAX = 542, EVENT_INTERFACE_VOLSOUND= 550, EVENT_INTERFACE_VOLMUSIC= 551, EVENT_INTERFACE_SILENT = 552, EVENT_INTERFACE_NOISY = 553, EVENT_INTERFACE_JOYSTICK= 560, EVENT_INTERFACE_SOLUCE = 561, EVENT_INTERFACE_JOYSTICK_DEADZONE = 562, EVENT_INTERFACE_JOYSTICK_X = 563, EVENT_INTERFACE_JOYSTICK_Y = 564, EVENT_INTERFACE_JOYSTICK_Z = 565, EVENT_INTERFACE_JOYSTICK_CAM_X = 566, EVENT_INTERFACE_JOYSTICK_CAM_Y = 567, EVENT_INTERFACE_JOYSTICK_CAM_Z = 568, EVENT_INTERFACE_JOYSTICK_X_INVERT = 569, EVENT_INTERFACE_JOYSTICK_Y_INVERT = 570, EVENT_INTERFACE_JOYSTICK_Z_INVERT = 571, EVENT_INTERFACE_JOYSTICK_CAM_X_INVERT = 572, EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT = 573, EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT = 574, EVENT_INTERFACE_PLUS_TRAINER = 575, EVENT_INTERFACE_PLUS_RESEARCH = 576, EVENT_INTERFACE_PLUS_EXPLORER = 577, EVENT_INTERFACE_MOD_LIST = 580, EVENT_INTERFACE_WORKSHOP = 581, EVENT_INTERFACE_MODS_DIR = 582, EVENT_INTERFACE_MOD_ENABLE_OR_DISABLE = 583, EVENT_INTERFACE_MODS_APPLY = 584, EVENT_INTERFACE_MOD_SUMMARY = 585, EVENT_INTERFACE_MOD_DETAILS = 586, EVENT_INTERFACE_MOD_MOVE_UP = 587, EVENT_INTERFACE_MOD_MOVE_DOWN = 888, EVENT_INTERFACE_MODS_REFRESH = 589, EVENT_INTERFACE_GLINTl = 590, EVENT_INTERFACE_GLINTr = 591, EVENT_INTERFACE_GLINTu = 592, EVENT_INTERFACE_GLINTb = 593, EVENT_INTERFACE_NEDIT = 595, EVENT_INTERFACE_NLIST = 596, EVENT_INTERFACE_NOK = 597, EVENT_INTERFACE_NDELETE = 598, EVENT_INTERFACE_NLABEL = 599, EVENT_INTERFACE_IOWRITE = 600, EVENT_INTERFACE_IOREAD = 601, EVENT_INTERFACE_IOLIST = 602, EVENT_INTERFACE_IONAME = 603, EVENT_INTERFACE_IOLABEL = 604, EVENT_INTERFACE_IOIMAGE = 605, EVENT_INTERFACE_IODELETE= 606, EVENT_INTERFACE_PERSO = 620, EVENT_INTERFACE_POK = 621, EVENT_INTERFACE_PCANCEL = 622, EVENT_INTERFACE_PDEF = 623, EVENT_INTERFACE_PHEAD = 624, EVENT_INTERFACE_PBODY = 625, EVENT_INTERFACE_PLROT = 626, EVENT_INTERFACE_PRROT = 627, EVENT_INTERFACE_PC0a = 640, EVENT_INTERFACE_PC1a = 641, EVENT_INTERFACE_PC2a = 642, EVENT_INTERFACE_PC3a = 643, EVENT_INTERFACE_PC4a = 644, EVENT_INTERFACE_PC5a = 645, EVENT_INTERFACE_PC6a = 646, EVENT_INTERFACE_PC7a = 647, EVENT_INTERFACE_PC8a = 648, EVENT_INTERFACE_PC9a = 649, EVENT_INTERFACE_PCRa = 650, EVENT_INTERFACE_PCGa = 651, EVENT_INTERFACE_PCBa = 652, EVENT_INTERFACE_PC0b = 660, EVENT_INTERFACE_PC1b = 661, EVENT_INTERFACE_PC2b = 662, EVENT_INTERFACE_PC3b = 663, EVENT_INTERFACE_PC4b = 664, EVENT_INTERFACE_PC5b = 665, EVENT_INTERFACE_PC6b = 666, EVENT_INTERFACE_PC7b = 667, EVENT_INTERFACE_PC8b = 668, EVENT_INTERFACE_PC9b = 669, EVENT_INTERFACE_PCRb = 670, EVENT_INTERFACE_PCGb = 671, EVENT_INTERFACE_PCBb = 672, EVENT_INTERFACE_PFACE1 = 680, EVENT_INTERFACE_PFACE2 = 681, EVENT_INTERFACE_PFACE3 = 682, EVENT_INTERFACE_PFACE4 = 683, EVENT_INTERFACE_PGLASS0 = 690, EVENT_INTERFACE_PGLASS1 = 691, EVENT_INTERFACE_PGLASS2 = 692, EVENT_INTERFACE_PGLASS3 = 693, EVENT_INTERFACE_PGLASS4 = 694, EVENT_INTERFACE_PGLASS5 = 695, EVENT_INTERFACE_PGLASS6 = 696, EVENT_INTERFACE_PGLASS7 = 697, EVENT_INTERFACE_PGLASS8 = 698, EVENT_INTERFACE_PGLASS9 = 699, EVENT_DT_GROUP0 = 700, EVENT_DT_GROUP1 = 701, EVENT_DT_GROUP2 = 702, EVENT_DT_GROUP3 = 703, EVENT_DT_GROUP4 = 704, EVENT_DT_LABEL0 = 710, EVENT_DT_LABEL1 = 711, EVENT_DT_LABEL2 = 712, EVENT_DT_LABEL3 = 713, EVENT_DT_LABEL4 = 714, EVENT_DT_VISIT0 = 720, EVENT_DT_VISIT1 = 721, EVENT_DT_VISIT2 = 722, EVENT_DT_VISIT3 = 723, EVENT_DT_VISIT4 = 724, EVENT_DT_END = 725, EVENT_CMD = 800, EVENT_SPEED = 801, EVENT_DBG_STATS = 850, EVENT_DBG_SPAWN_OBJ = 851, EVENT_DBG_TELEPORT = 852, EVENT_DBG_LIGHTNING = 853, EVENT_DBG_RESOURCES = 854, EVENT_DBG_GOTO = 855, EVENT_DBG_CRASHSPHERES = 856, EVENT_DBG_LIGHTS = 857, EVENT_DBG_LIGHTS_DUMP = 858, EVENT_SPAWN_CANCEL = 860, EVENT_SPAWN_ME = 861, EVENT_SPAWN_WHEELEDGRABBER = 862, EVENT_SPAWN_WHEELEDSHOOTER = 863, EVENT_SPAWN_PHAZERSHOOTER = 864, EVENT_SPAWN_BOTFACTORY = 865, EVENT_SPAWN_CONVERTER = 866, EVENT_SPAWN_DERRICK = 867, EVENT_SPAWN_POWERSTATION= 868, EVENT_SPAWN_TITANIUM = 869, EVENT_SPAWN_TITANIUMORE = 870, EVENT_SPAWN_URANIUMORE = 871, EVENT_SPAWN_POWERCELL = 872, EVENT_SPAWN_NUCLEARCELL = 873, EVENT_HYPER_PREV = 900, EVENT_HYPER_NEXT = 901, EVENT_HYPER_HOME = 902, EVENT_HYPER_COPY = 903, EVENT_HYPER_SIZE1 = 904, EVENT_HYPER_SIZE2 = 905, EVENT_HYPER_SIZE3 = 906, EVENT_HYPER_SIZE4 = 907, EVENT_HYPER_SIZE5 = 908, EVENT_SATCOM_HUSTON = 920, EVENT_SATCOM_SAT = 921, EVENT_SATCOM_LOADING = 922, EVENT_SATCOM_OBJECT = 923, EVENT_SATCOM_PROG = 924, EVENT_SATCOM_SOLUCE = 925, EVENT_OBJECT_DESELECT = 1000, EVENT_OBJECT_LEFT = 1001, EVENT_OBJECT_RIGHT = 1002, EVENT_OBJECT_UP = 1003, EVENT_OBJECT_DOWN = 1004, EVENT_OBJECT_GASUP = 1005, EVENT_OBJECT_GASDOWN = 1006, EVENT_OBJECT_HTAKE = 1020, EVENT_OBJECT_MTAKE = 1021, EVENT_OBJECT_MFRONT = 1022, EVENT_OBJECT_MBACK = 1023, EVENT_OBJECT_MPOWER = 1024, EVENT_OBJECT_BHELP = 1040, EVENT_OBJECT_BTAKEOFF = 1041, EVENT_OBJECT_BDESTROY = 1042, EVENT_OBJECT_BDERRICK = 1050, EVENT_OBJECT_BSTATION = 1051, EVENT_OBJECT_BFACTORY = 1052, EVENT_OBJECT_BCONVERT = 1053, EVENT_OBJECT_BTOWER = 1054, EVENT_OBJECT_BREPAIR = 1055, EVENT_OBJECT_BRESEARCH = 1056, EVENT_OBJECT_BRADAR = 1057, EVENT_OBJECT_BENERGY = 1058, EVENT_OBJECT_BLABO = 1059, EVENT_OBJECT_BNUCLEAR = 1060, EVENT_OBJECT_BPARA = 1061, EVENT_OBJECT_BINFO = 1062, EVENT_OBJECT_BSAFE = 1063, EVENT_OBJECT_GFLAT = 1070, EVENT_OBJECT_FCREATE = 1071, EVENT_OBJECT_FDELETE = 1072, EVENT_OBJECT_FCOLORb = 1073, EVENT_OBJECT_FCOLORr = 1074, EVENT_OBJECT_FCOLORg = 1075, EVENT_OBJECT_FCOLORy = 1076, EVENT_OBJECT_FCOLORv = 1077, EVENT_OBJECT_FACTORYwa = 1080, EVENT_OBJECT_FACTORYta = 1081, EVENT_OBJECT_FACTORYfa = 1082, EVENT_OBJECT_FACTORYia = 1083, EVENT_OBJECT_FACTORYwc = 1084, EVENT_OBJECT_FACTORYtc = 1085, EVENT_OBJECT_FACTORYfc = 1086, EVENT_OBJECT_FACTORYic = 1087, EVENT_OBJECT_FACTORYwi = 1088, EVENT_OBJECT_FACTORYti = 1089, EVENT_OBJECT_FACTORYfi = 1090, EVENT_OBJECT_FACTORYii = 1091, EVENT_OBJECT_FACTORYws = 1092, EVENT_OBJECT_FACTORYts = 1093, EVENT_OBJECT_FACTORYfs = 1094, EVENT_OBJECT_FACTORYis = 1095, EVENT_OBJECT_FACTORYrt = 1096, EVENT_OBJECT_FACTORYrc = 1097, EVENT_OBJECT_FACTORYrr = 1098, EVENT_OBJECT_FACTORYrs = 1099, EVENT_OBJECT_FACTORYsa = 1100, EVENT_OBJECT_FACTORYwb = 1101, EVENT_OBJECT_FACTORYtb = 1102, EVENT_OBJECT_FACTORYfb = 1103, EVENT_OBJECT_FACTORYib = 1104, EVENT_OBJECT_FACTORYtg = 1105, EVENT_OBJECT_SEARCH = 1200, EVENT_OBJECT_TERRAFORM = 1201, EVENT_OBJECT_FIRE = 1202, EVENT_OBJECT_FIREANT = 1203, EVENT_OBJECT_SPIDEREXPLO= 1204, EVENT_OBJECT_RECOVER = 1220, EVENT_OBJECT_BEGSHIELD = 1221, EVENT_OBJECT_ENDSHIELD = 1222, EVENT_OBJECT_RTANK = 1223, EVENT_OBJECT_RFLY = 1224, EVENT_OBJECT_RTHUMP = 1225, EVENT_OBJECT_RCANON = 1226, EVENT_OBJECT_RTOWER = 1227, EVENT_OBJECT_RPHAZER = 1228, EVENT_OBJECT_RSHIELD = 1229, EVENT_OBJECT_RATOMIC = 1230, EVENT_OBJECT_RiPAW = 1231, EVENT_OBJECT_RiGUN = 1232, EVENT_OBJECT_RESET = 1233, EVENT_OBJECT_DIMSHIELD = 1234, EVENT_OBJECT_TARGET = 1235, EVENT_OBJECT_DELSEARCH = 1236, // delete mark on ground EVENT_OBJECT_PROGLIST = 1310, EVENT_OBJECT_PROGRUN = 1311, EVENT_OBJECT_PROGEDIT = 1312, EVENT_OBJECT_PROGSTART = 1313, EVENT_OBJECT_PROGSTOP = 1314, EVENT_OBJECT_PROGADD = 1315, EVENT_OBJECT_PROGREMOVE = 1316, EVENT_OBJECT_PROGCLONE = 1317, EVENT_OBJECT_PROGMOVEUP = 1318, EVENT_OBJECT_PROGMOVEDOWN = 1319, EVENT_OBJECT_INFOOK = 1340, EVENT_OBJECT_DELETE = 1350, EVENT_OBJECT_GENERGY = 1360, EVENT_OBJECT_GSHIELD = 1361, EVENT_OBJECT_GRANGE = 1362, EVENT_OBJECT_MAP = 1364, EVENT_OBJECT_MAPZOOM = 1365, EVENT_OBJECT_GPROGRESS = 1366, EVENT_OBJECT_GRADAR = 1367, EVENT_OBJECT_GINFO = 1368, EVENT_OBJECT_TYPE = 1369, EVENT_OBJECT_CROSSHAIR = 1370, EVENT_OBJECT_CORNERul = 1371, EVENT_OBJECT_CORNERur = 1372, EVENT_OBJECT_CORNERdl = 1373, EVENT_OBJECT_CORNERdr = 1374, EVENT_OBJECT_MAPi = 1375, EVENT_OBJECT_MAPg = 1376, EVENT_OBJECT_CAMERA = 1400, EVENT_OBJECT_HELP = 1401, EVENT_OBJECT_SOLUCE = 1402, EVENT_OBJECT_CAMERAleft = 1403, EVENT_OBJECT_CAMERAright= 1404, EVENT_OBJECT_CAMERAnear = 1405, EVENT_OBJECT_CAMERAaway = 1406, EVENT_OBJECT_SHORTCUT_MODE = 1500, EVENT_OBJECT_SHORTCUT = 1501, EVENT_OBJECT_SHORTCUT_MAX = 1549, EVENT_OBJECT_MOVIELOCK = 1550, EVENT_OBJECT_EDITLOCK = 1551, EVENT_OBJECT_SAVING = 1552, EVENT_OBJECT_LIMIT = 1560, EVENT_OBJECT_PEN0 = 1570, EVENT_OBJECT_PEN1 = 1571, EVENT_OBJECT_PEN2 = 1572, EVENT_OBJECT_PEN3 = 1573, EVENT_OBJECT_PEN4 = 1574, EVENT_OBJECT_PEN5 = 1575, EVENT_OBJECT_PEN6 = 1576, EVENT_OBJECT_PEN7 = 1577, EVENT_OBJECT_PEN8 = 1578, EVENT_OBJECT_REC = 1580, EVENT_OBJECT_STOP = 1581, EVENT_STUDIO_OK = 2000, EVENT_STUDIO_CANCEL = 2001, EVENT_STUDIO_EDIT = 2002, EVENT_STUDIO_LIST = 2003, EVENT_STUDIO_CLONE = 2004, EVENT_STUDIO_NEW = 2010, EVENT_STUDIO_OPEN = 2011, EVENT_STUDIO_SAVE = 2012, EVENT_STUDIO_UNDO = 2013, EVENT_STUDIO_CUT = 2014, EVENT_STUDIO_COPY = 2015, EVENT_STUDIO_PASTE = 2016, EVENT_STUDIO_SIZE = 2017, EVENT_STUDIO_TOOL = 2018, EVENT_STUDIO_HELP = 2019, EVENT_STUDIO_COMPILE = 2050, EVENT_STUDIO_RUN = 2051, EVENT_STUDIO_REALTIME = 2052, EVENT_STUDIO_STEP = 2053, EVENT_WRITE_SCENE_FINISHED = 2100, //!< indicates end of writing scene (writing screenshot image) EVENT_CODE_BATTLE_START = 2200, //!< button that starts the code battle EVENT_CODE_BATTLE_SPECTATOR = 2201, //!< button that controls the code battle spectator camera EVENT_OBJECT_RBUILDER = 2300, EVENT_OBJECT_BUILD = 2301, EVENT_OBJECT_RTARGET = 2302, //! Buttons that switch viewpoints EVENT_VIEWPOINT0 = 3000, EVENT_VIEWPOINT1 = 3001, EVENT_VIEWPOINT2 = 3002, EVENT_VIEWPOINT3 = 3003, EVENT_VIEWPOINT4 = 3004, EVENT_VIEWPOINT5 = 3005, EVENT_VIEWPOINT6 = 3006, EVENT_VIEWPOINT7 = 3007, EVENT_VIEWPOINT8 = 3008, EVENT_VIEWPOINT9 = 3009, //! Maximum value of standard events EVENT_STD_MAX, EVENT_USER = 10000, EVENT_FORCE_LONG = 0x7fffffff }; /** * \struct EventData * \brief Base class for additional event data */ struct EventData { virtual ~EventData() {} virtual std::unique_ptr Clone() const = 0; }; /** * \struct KeyEventData * \brief Additional data for keyboard event */ struct KeyEventData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! If true, the key is a virtual code generated by certain key modifiers or joystick buttons bool virt = false; //! Key symbol: KEY(...) macro value or virtual key VIRTUAL_... (from common/key.h) unsigned int key = 0; //! Input binding slot for this key InputSlot slot = INPUT_SLOT_MAX; }; /** * \struct TextInputData * \brief Additional data for text input event */ struct TextInputData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! Text entered by the user (usually one character, UTF-8 encoded) std::string text = ""; }; /** * \enum MouseButton * \brief Mouse button * * Values are a bitmask to have a state bitmask */ enum MouseButton { MOUSE_BUTTON_LEFT = (1<<1), MOUSE_BUTTON_MIDDLE = (1<<2), MOUSE_BUTTON_RIGHT = (1<<3), //! There may be additional mouse buttons >= this value MOUSE_BUTTON_OTHER = (1<<4) }; /** * \struct MouseButtonEventData * \brief Additional data mouse button event */ struct MouseButtonEventData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! The mouse button MouseButton button = MOUSE_BUTTON_LEFT; }; /** * \struct MouseWheelEventData * \brief Additional data for mouse wheel event. */ struct MouseWheelEventData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! Amount scrolled vertically, positive value is away from the user signed int y = 0; //! Amount scrolled horizontally (if the mouse supports it), positive value is to the right signed int x = 0; }; /** * \struct JoyAxisEventData * \brief Additional data for joystick axis event */ struct JoyAxisEventData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! The joystick axis index unsigned char axis = 0; //! The axis value (range: -32768 to 32767) int value = 0; }; /** * \struct JoyButtonEventData * \brief Additional data for joystick button event */ struct JoyButtonEventData : public EventData { std::unique_ptr Clone() const override { return std::make_unique(*this); } //! The joystick button index unsigned char button = 0; }; /** * \struct Event * \brief Event sent by system, interface or game * * Event is described by its type (EventType) and anonymous union that * 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 { explicit Event(EventType type = EVENT_NULL) : type(type), rTime(0.0f), kmodState(0), mouseButtonsState(0), customParam(0) {} Event(const Event&) = delete; Event& operator=(const Event&) = delete; // Workaround for MSVC2013 Event(Event&& other) : type(std::move(other.type)), rTime(std::move(other.rTime)), motionInput(std::move(other.motionInput)), cameraInput(std::move(other.cameraInput)), kmodState(std::move(other.kmodState)), mousePos(std::move(other.mousePos)), mouseButtonsState(std::move(other.mouseButtonsState)), customParam(std::move(other.customParam)), data(std::move(other.data)) {} Event& operator=(Event&& other) { type = std::move(other.type); rTime = std::move(other.rTime); motionInput = std::move(other.motionInput); cameraInput = std::move(other.cameraInput); kmodState = std::move(other.kmodState); mousePos = std::move(other.mousePos); mouseButtonsState = std::move(other.mouseButtonsState); customParam = std::move(other.customParam); data = std::move(other.data); return *this; } //! Convenience function for getting appropriate EventData subclass template EventDataSubclass* GetData() { return static_cast(data.get()); } //! Convenience function for getting appropriate EventData subclass template const EventDataSubclass* GetData() const { return static_cast(data.get()); } //! Returns a clone of this event Event Clone() const { Event clone; clone.type = type; clone.rTime = rTime; clone.motionInput = motionInput; clone.cameraInput = cameraInput; clone.kmodState = kmodState; clone.mousePos = mousePos; clone.mouseButtonsState = mouseButtonsState; clone.customParam = customParam; if (data != nullptr) { clone.data = data->Clone(); } return clone; } //! Type of event EventType type; //! Relative time since last EVENT_FRAME //! Scope: only EVENT_FRAME events // TODO: gradually replace the usage of this with new CApplication's time functions float rTime; //! Motion vector set by keyboard or joystick (managed by CInput) //! Scope: all system events glm::vec3 motionInput{ 0, 0, 0 }; //! Motion vector set by numeric keyboard (managed by CInput) //! Scope: all system events glm::vec3 cameraInput{ 0, 0, 0 }; //! Current state of keyboard modifier keys: bitmask made of KEY_MOD(...) macro values (from common/key.h) //! Scope: all system events unsigned int kmodState; //! Current position of mouse cursor in interface coords //! Scope: all system events glm::vec2 mousePos; //! Current state of mouse buttons: bitmask of MouseButton enum values //! Scope: all system events unsigned int mouseButtonsState; //! Custom parameter that may be set for some events //! Scope: some interface events long customParam; //! Additional data for some events std::unique_ptr data; }; //! Returns an unique event type (above the standard IDs) EventType GetUniqueEventType(); //! Initializes static array with event type strings void InitializeEventTypeTexts(); //! Parses event type to string std::string ParseEventType(EventType eventType); /** * \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. * * This class is thread-safe */ class CEventQueue { public: //! Constant maximum size of queue static const int MAX_EVENT_QUEUE = 100; public: //! Object's constructor CEventQueue(); //! Object's destructor ~CEventQueue(); //! Checks if queue is empty bool IsEmpty(); //! Adds an event to the queue bool AddEvent(Event&& event); //! Removes and returns an event from queue front; if queue is empty, returns event of type EVENT_NULL Event GetEvent(); protected: std::mutex m_mutex; Event m_fifo[MAX_EVENT_QUEUE]; int m_head; int m_tail; int m_total; };