mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-01-31 12:30:32 +00:00
- moved some event related code to 'common'.
This commit is contained in:
parent
d739587f6b
commit
5dfe9918d0
24 changed files with 410 additions and 237 deletions
|
@ -1105,6 +1105,7 @@ set (PCH_SOURCES
|
|||
common/filesystem/file_directory.cpp
|
||||
common/filesystem/resourcefile.cpp
|
||||
common/engine/cycler.cpp
|
||||
common/engine/d_event.cpp
|
||||
common/engine/stats.cpp
|
||||
common/engine/sc_man.cpp
|
||||
common/engine/palettecontainer.cpp
|
||||
|
@ -1283,6 +1284,7 @@ include_directories( .
|
|||
rendering/2d
|
||||
r_data
|
||||
sound
|
||||
menu
|
||||
sound/backend
|
||||
xlat
|
||||
utility
|
||||
|
|
|
@ -651,7 +651,6 @@ void F2DDrawer::AddPoly(FGameTexture* img, FVector4* vt, size_t vtcount, unsigne
|
|||
|
||||
dg.mTexture = img;
|
||||
dg.mTranslationId = translation;
|
||||
dg.mColor1 = color;
|
||||
dg.mVertCount = (int)vtcount;
|
||||
dg.mVertIndex = (int)mVertices.Reserve(vtcount);
|
||||
dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent];
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
#include "sc_man.h"
|
||||
#include "c_cvars.h"
|
||||
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
|
||||
extern int chatmodeon;
|
||||
|
||||
|
|
198
src/common/engine/d_event.cpp
Normal file
198
src/common/engine/d_event.cpp
Normal file
|
@ -0,0 +1,198 @@
|
|||
/*
|
||||
** c_dispatch.cpp
|
||||
** Functions for executing console commands and aliases
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2016 Randy Heit
|
||||
** Copyright 2003-2019 Christoph Oelckers
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions
|
||||
** are met:
|
||||
**
|
||||
** 1. Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** 2. Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in the
|
||||
** documentation and/or other materials provided with the distribution.
|
||||
** 3. The name of the author may not be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
*/
|
||||
|
||||
#include "c_bind.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "c_console.h"
|
||||
#include "d_gui.h"
|
||||
#include "menu.h"
|
||||
#include "utf8.h"
|
||||
#include "m_joy.h"
|
||||
#include "vm.h"
|
||||
|
||||
bool G_Responder(event_t* ev);
|
||||
|
||||
int eventhead;
|
||||
int eventtail;
|
||||
event_t events[MAXEVENTS];
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_ProcessEvents
|
||||
//
|
||||
// Send all the events of the given timestamp down the responder chain.
|
||||
// Events are asynchronous inputs generally generated by the game user.
|
||||
// Events can be discarded if no responder claims them
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_ProcessEvents (void)
|
||||
{
|
||||
event_t *ev;
|
||||
while (eventtail != eventhead)
|
||||
{
|
||||
ev = &events[eventtail];
|
||||
eventtail = (eventtail + 1) & (MAXEVENTS - 1);
|
||||
if (ev->type == EV_None)
|
||||
continue;
|
||||
if (ev->type == EV_DeviceChange)
|
||||
UpdateJoystickMenu(I_UpdateDeviceList());
|
||||
if (C_Responder (ev))
|
||||
continue; // console ate the event
|
||||
if (M_Responder (ev))
|
||||
continue; // menu ate the event
|
||||
G_Responder (ev);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_RemoveNextCharEvent
|
||||
//
|
||||
// Removes the next EV_GUI_Char event in the input queue. Used by the menu,
|
||||
// since it (generally) consumes EV_GUI_KeyDown events and not EV_GUI_Char
|
||||
// events, and it needs to ensure that there is no left over input when it's
|
||||
// done. If there are multiple EV_GUI_KeyDowns before the EV_GUI_Char, then
|
||||
// there are dead chars involved, so those should be removed, too. We do
|
||||
// this by changing the message type to EV_None rather than by actually
|
||||
// removing the event from the queue.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_RemoveNextCharEvent()
|
||||
{
|
||||
assert(events[eventtail].type == EV_GUI_Event && events[eventtail].subtype == EV_GUI_KeyDown);
|
||||
for (int evnum = eventtail; evnum != eventhead; evnum = (evnum+1) & (MAXEVENTS-1))
|
||||
{
|
||||
event_t *ev = &events[evnum];
|
||||
if (ev->type != EV_GUI_Event)
|
||||
break;
|
||||
if (ev->subtype == EV_GUI_KeyDown || ev->subtype == EV_GUI_Char)
|
||||
{
|
||||
ev->type = EV_None;
|
||||
if (ev->subtype == EV_GUI_Char)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FInputEvent::FInputEvent(const event_t *ev)
|
||||
{
|
||||
Type = (EGenericEvent)ev->type;
|
||||
// we don't want the modders to remember what weird fields mean what for what events.
|
||||
KeyScan = 0;
|
||||
KeyChar = 0;
|
||||
MouseX = 0;
|
||||
MouseY = 0;
|
||||
switch (Type)
|
||||
{
|
||||
case EV_None:
|
||||
break;
|
||||
case EV_KeyDown:
|
||||
case EV_KeyUp:
|
||||
KeyScan = ev->data1;
|
||||
KeyChar = ev->data2;
|
||||
KeyString = FString(char(ev->data1));
|
||||
break;
|
||||
case EV_Mouse:
|
||||
MouseX = ev->x;
|
||||
MouseY = ev->y;
|
||||
break;
|
||||
default:
|
||||
break; // EV_DeviceChange = wat?
|
||||
}
|
||||
}
|
||||
|
||||
FUiEvent::FUiEvent(const event_t *ev)
|
||||
{
|
||||
Type = (EGUIEvent)ev->subtype;
|
||||
KeyChar = 0;
|
||||
IsShift = false;
|
||||
IsAlt = false;
|
||||
IsCtrl = false;
|
||||
MouseX = 0;
|
||||
MouseY = 0;
|
||||
// we don't want the modders to remember what weird fields mean what for what events.
|
||||
switch (ev->subtype)
|
||||
{
|
||||
case EV_GUI_None:
|
||||
break;
|
||||
case EV_GUI_KeyDown:
|
||||
case EV_GUI_KeyRepeat:
|
||||
case EV_GUI_KeyUp:
|
||||
KeyChar = ev->data1;
|
||||
KeyString = FString(char(ev->data1));
|
||||
IsShift = !!(ev->data3 & GKM_SHIFT);
|
||||
IsAlt = !!(ev->data3 & GKM_ALT);
|
||||
IsCtrl = !!(ev->data3 & GKM_CTRL);
|
||||
break;
|
||||
case EV_GUI_Char:
|
||||
KeyChar = ev->data1;
|
||||
KeyString = MakeUTF8(ev->data1);
|
||||
IsAlt = !!ev->data2; // only true for Win32, not sure about SDL
|
||||
break;
|
||||
default: // mouse event
|
||||
// note: SDL input doesn't seem to provide these at all
|
||||
//Printf("Mouse data: %d, %d, %d, %d\n", ev->x, ev->y, ev->data1, ev->data2);
|
||||
MouseX = ev->data1;
|
||||
MouseY = ev->data2;
|
||||
IsShift = !!(ev->data3 & GKM_SHIFT);
|
||||
IsAlt = !!(ev->data3 & GKM_ALT);
|
||||
IsCtrl = !!(ev->data3 & GKM_CTRL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, Type);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, KeyString);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, KeyChar);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, MouseX);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, MouseY);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsShift);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsAlt);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsCtrl);
|
||||
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, Type);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyScan);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyString);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyChar);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, MouseX);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, MouseY);
|
||||
|
76
src/common/engine/d_eventbase.h
Normal file
76
src/common/engine/d_eventbase.h
Normal file
|
@ -0,0 +1,76 @@
|
|||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include "d_gui.h"
|
||||
|
||||
// Input event types.
|
||||
enum EGenericEvent
|
||||
{
|
||||
EV_None,
|
||||
EV_KeyDown, // data1: scan code, data2: Qwerty ASCII code
|
||||
EV_KeyUp, // same
|
||||
EV_Mouse, // x, y: mouse movement deltas
|
||||
EV_GUI_Event, // subtype specifies actual event
|
||||
EV_DeviceChange,// a device has been connected or removed
|
||||
};
|
||||
|
||||
// Event structure.
|
||||
struct event_t
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t subtype;
|
||||
int16_t data1; // keys / mouse/joystick buttons
|
||||
int16_t data2;
|
||||
int16_t data3;
|
||||
int x; // mouse/joystick x move
|
||||
int y; // mouse/joystick y move
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Called by IO functions when input is detected.
|
||||
void D_PostEvent (const event_t* ev);
|
||||
void D_RemoveNextCharEvent();
|
||||
void D_ProcessEvents(void);
|
||||
|
||||
enum
|
||||
{
|
||||
MAXEVENTS = 128
|
||||
};
|
||||
|
||||
extern event_t events[MAXEVENTS];
|
||||
extern int eventhead;
|
||||
extern int eventtail;
|
||||
|
||||
struct FUiEvent
|
||||
{
|
||||
// this essentially translates event_t UI events to ZScript.
|
||||
EGUIEvent Type;
|
||||
// for keys/chars/whatever
|
||||
FString KeyString;
|
||||
int KeyChar;
|
||||
// for mouse
|
||||
int MouseX;
|
||||
int MouseY;
|
||||
// global (?)
|
||||
bool IsShift;
|
||||
bool IsCtrl;
|
||||
bool IsAlt;
|
||||
|
||||
FUiEvent(const event_t *ev);
|
||||
};
|
||||
|
||||
struct FInputEvent
|
||||
{
|
||||
// this translates regular event_t events to ZScript (not UI, UI events are sent via DUiEvent and only if requested!)
|
||||
EGenericEvent Type = EV_None;
|
||||
// for keys
|
||||
int KeyScan;
|
||||
FString KeyString;
|
||||
int KeyChar;
|
||||
// for mouse
|
||||
int MouseX;
|
||||
int MouseY;
|
||||
|
||||
FInputEvent(const event_t *ev);
|
||||
};
|
||||
|
115
src/common/engine/d_gui.h
Normal file
115
src/common/engine/d_gui.h
Normal file
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
** d_gui.h
|
||||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2006 Randy Heit
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions
|
||||
** are met:
|
||||
**
|
||||
** 1. Redistributions of source code must retain the above copyright
|
||||
** notice, this list of conditions and the following disclaimer.
|
||||
** 2. Redistributions in binary form must reproduce the above copyright
|
||||
** notice, this list of conditions and the following disclaimer in the
|
||||
** documentation and/or other materials provided with the distribution.
|
||||
** 3. The name of the author may not be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**---------------------------------------------------------------------------
|
||||
**
|
||||
** So when do I get a real UT-like windowing system?
|
||||
*/
|
||||
|
||||
#ifndef __D_GUI_H__
|
||||
#define __D_GUI_H__
|
||||
|
||||
// For a GUIEvent, x and y specify absolute location of mouse pointer
|
||||
enum EGUIEvent
|
||||
{
|
||||
EV_GUI_None,
|
||||
EV_GUI_KeyDown, // data1: unshifted ASCII, data2: shifted ASCII, data3: modifiers
|
||||
EV_GUI_KeyRepeat, // same
|
||||
EV_GUI_KeyUp, // same
|
||||
EV_GUI_Char, // data1: translated character (for user text input), data2: alt down?
|
||||
EV_GUI_FirstMouseEvent,
|
||||
EV_GUI_MouseMove,
|
||||
EV_GUI_LButtonDown,
|
||||
EV_GUI_LButtonUp,
|
||||
EV_GUI_LButtonDblClick,
|
||||
EV_GUI_MButtonDown,
|
||||
EV_GUI_MButtonUp,
|
||||
EV_GUI_MButtonDblClick,
|
||||
EV_GUI_RButtonDown,
|
||||
EV_GUI_RButtonUp,
|
||||
EV_GUI_RButtonDblClick,
|
||||
EV_GUI_WheelUp, // data3: shift/ctrl/alt
|
||||
EV_GUI_WheelDown, // "
|
||||
EV_GUI_WheelRight, // "
|
||||
EV_GUI_WheelLeft, // "
|
||||
EV_GUI_BackButtonDown,
|
||||
EV_GUI_BackButtonUp,
|
||||
EV_GUI_FwdButtonDown,
|
||||
EV_GUI_FwdButtonUp,
|
||||
EV_GUI_LastMouseEvent,
|
||||
};
|
||||
|
||||
enum GUIKeyModifiers
|
||||
{
|
||||
GKM_SHIFT = 1,
|
||||
GKM_CTRL = 2,
|
||||
GKM_ALT = 4,
|
||||
GKM_META = 8,
|
||||
GKM_LBUTTON = 16
|
||||
};
|
||||
|
||||
// Special codes for some GUI keys, including a few real ASCII codes.
|
||||
enum ESpecialGUIKeys
|
||||
{
|
||||
GK_PGDN = 1,
|
||||
GK_PGUP = 2,
|
||||
GK_HOME = 3,
|
||||
GK_END = 4,
|
||||
GK_LEFT = 5,
|
||||
GK_RIGHT = 6,
|
||||
GK_ALERT = 7, // ASCII bell
|
||||
GK_BACKSPACE= 8, // ASCII
|
||||
GK_TAB = 9, // ASCII
|
||||
GK_LINEFEED = 10, // ASCII
|
||||
GK_DOWN = 10,
|
||||
GK_VTAB = 11, // ASCII
|
||||
GK_UP = 11,
|
||||
GK_FORMFEED = 12, // ASCII
|
||||
GK_RETURN = 13, // ASCII
|
||||
GK_F1 = 14,
|
||||
GK_F2 = 15,
|
||||
GK_F3 = 16,
|
||||
GK_F4 = 17,
|
||||
GK_F5 = 18,
|
||||
GK_F6 = 19,
|
||||
GK_F7 = 20,
|
||||
GK_F8 = 21,
|
||||
GK_F9 = 22,
|
||||
GK_F10 = 23,
|
||||
GK_F11 = 24,
|
||||
GK_F12 = 25,
|
||||
GK_DEL = 26,
|
||||
GK_ESCAPE = 27, // ASCII
|
||||
GK_FREE1 = 28,
|
||||
GK_FREE2 = 29,
|
||||
GK_BACK = 30, // browser back key
|
||||
GK_CESCAPE = 31 // color escape
|
||||
};
|
||||
|
||||
#endif //__D_GUI_H__
|
|
@ -36,7 +36,7 @@
|
|||
#include "vectors.h"
|
||||
#include "m_joy.h"
|
||||
#include "gameconfigfile.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "cmdlib.h"
|
||||
#include "printf.h"
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include "c_console.h"
|
||||
#include "c_cvars.h"
|
||||
#include "c_dispatch.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "c_buttons.h"
|
||||
#include "d_gui.h"
|
||||
#include "dikeys.h"
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <IOKit/IOMessage.h>
|
||||
#include <IOKit/hid/IOHIDLib.h>
|
||||
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "i_system.h"
|
||||
#include "m_argv.h"
|
||||
#include "m_joy.h"
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "m_argv.h"
|
||||
#include "v_video.h"
|
||||
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "d_gui.h"
|
||||
#include "c_buttons.h"
|
||||
#include "c_console.h"
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include <malloc.h>
|
||||
|
||||
#include "i_input.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "templates.h"
|
||||
#include "gameconfigfile.h"
|
||||
#include "cmdlib.h"
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
#include "s_soundinternal.h"
|
||||
#include "gameconfigfile.h"
|
||||
#include "hardware.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "v_text.h"
|
||||
#include "version.h"
|
||||
#include "engineerrors.h"
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include <dinput.h>
|
||||
|
||||
#include "i_input.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
|
||||
|
||||
// MACROS ------------------------------------------------------------------
|
||||
|
|
|
@ -572,6 +572,7 @@ void I_SetWndProc()
|
|||
SetWindowLongPtr (Window, GWLP_USERDATA, 1);
|
||||
SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)WndProc);
|
||||
ShowWindow (ConWindow, SW_HIDE);
|
||||
ShowWindow(ProgressBar, SW_HIDE);
|
||||
ConWindowHidden = true;
|
||||
ShowWindow (GameTitleWindow, SW_HIDE);
|
||||
I_InitInput (Window);
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include <dinput.h>
|
||||
|
||||
#include "i_input.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "d_gui.h"
|
||||
#include "hardware.h"
|
||||
#include "menu/menu.h"
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#include <windows.h>
|
||||
|
||||
#include "i_input.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "templates.h"
|
||||
#include "gameconfigfile.h"
|
||||
#include "m_argv.h"
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include <limits.h>
|
||||
|
||||
#include "i_input.h"
|
||||
#include "d_event.h"
|
||||
#include "d_eventbase.h"
|
||||
#include "templates.h"
|
||||
#include "gameconfigfile.h"
|
||||
#include "m_argv.h"
|
||||
|
|
|
@ -78,7 +78,7 @@ CUSTOM_CVAR(Int, vid_maxfps, 200, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
|
|||
{
|
||||
self = GameTicRate;
|
||||
}
|
||||
else if (vid_maxfps > 1000)
|
||||
else if (self > 1000)
|
||||
{
|
||||
self = 1000;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ void Dictionary::Serialize(FSerializer &arc)
|
|||
{
|
||||
Super::Serialize(arc);
|
||||
|
||||
constexpr char key[] { "dictionary" };
|
||||
static const char key[] = "dictionary";
|
||||
|
||||
if (arc.isWriting())
|
||||
{
|
||||
|
|
|
@ -26,35 +26,9 @@
|
|||
|
||||
#include "basics.h"
|
||||
#include <functional>
|
||||
#include "d_eventbase.h"
|
||||
|
||||
|
||||
//
|
||||
// Event handling.
|
||||
//
|
||||
|
||||
// Input event types.
|
||||
enum EGenericEvent
|
||||
{
|
||||
EV_None,
|
||||
EV_KeyDown, // data1: scan code, data2: Qwerty ASCII code
|
||||
EV_KeyUp, // same
|
||||
EV_Mouse, // x, y: mouse movement deltas
|
||||
EV_GUI_Event, // subtype specifies actual event
|
||||
EV_DeviceChange,// a device has been connected or removed
|
||||
};
|
||||
|
||||
// Event structure.
|
||||
struct event_t
|
||||
{
|
||||
uint8_t type;
|
||||
uint8_t subtype;
|
||||
int16_t data1; // keys / mouse/joystick buttons
|
||||
int16_t data2;
|
||||
int16_t data3;
|
||||
int x; // mouse/joystick x move
|
||||
int y; // mouse/joystick y move
|
||||
};
|
||||
|
||||
|
||||
enum gameaction_t : int
|
||||
{
|
||||
|
@ -119,18 +93,9 @@ typedef enum
|
|||
} buttoncode_t;
|
||||
|
||||
// Called by IO functions when input is detected.
|
||||
void D_PostEvent (const event_t* ev);
|
||||
void D_RemoveNextCharEvent();
|
||||
void D_Render(std::function<void()> action, bool interpolate);
|
||||
|
||||
|
||||
//
|
||||
// GLOBAL VARIABLES
|
||||
//
|
||||
#define MAXEVENTS 128
|
||||
|
||||
extern event_t events[MAXEVENTS];
|
||||
|
||||
extern gameaction_t gameaction;
|
||||
|
||||
|
||||
|
|
|
@ -301,9 +301,6 @@ bool autostart;
|
|||
bool advancedemo;
|
||||
FILE *debugfile;
|
||||
FILE *hashfile;
|
||||
event_t events[MAXEVENTS];
|
||||
int eventhead;
|
||||
int eventtail;
|
||||
gamestate_t wipegamestate = GS_DEMOSCREEN; // can be -1 to force a wipe
|
||||
bool PageBlank;
|
||||
FGameTexture *Advisory;
|
||||
|
@ -444,38 +441,6 @@ CCMD(togglehud)
|
|||
D_ToggleHud();
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_ProcessEvents
|
||||
//
|
||||
// Send all the events of the given timestamp down the responder chain.
|
||||
// Events are asynchronous inputs generally generated by the game user.
|
||||
// Events can be discarded if no responder claims them
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_ProcessEvents (void)
|
||||
{
|
||||
event_t *ev;
|
||||
|
||||
for (; eventtail != eventhead ; eventtail = (eventtail+1)&(MAXEVENTS-1))
|
||||
{
|
||||
ev = &events[eventtail];
|
||||
if (ev->type == EV_None)
|
||||
continue;
|
||||
if (ev->type == EV_DeviceChange)
|
||||
UpdateJoystickMenu(I_UpdateDeviceList());
|
||||
if (C_Responder (ev))
|
||||
continue; // console ate the event
|
||||
if (M_Responder (ev))
|
||||
continue; // menu ate the event
|
||||
// check events
|
||||
if (ev->type != EV_Mouse && primaryLevel->localEventManager->Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly
|
||||
continue;
|
||||
G_Responder (ev);
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_PostEvent
|
||||
|
@ -518,41 +483,6 @@ void D_PostEvent (const event_t *ev)
|
|||
eventhead = (eventhead+1)&(MAXEVENTS-1);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_RemoveNextCharEvent
|
||||
//
|
||||
// Removes the next EV_GUI_Char event in the input queue. Used by the menu,
|
||||
// since it (generally) consumes EV_GUI_KeyDown events and not EV_GUI_Char
|
||||
// events, and it needs to ensure that there is no left over input when it's
|
||||
// done. If there are multiple EV_GUI_KeyDowns before the EV_GUI_Char, then
|
||||
// there are dead chars involved, so those should be removed, too. We do
|
||||
// this by changing the message type to EV_None rather than by actually
|
||||
// removing the event from the queue.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_RemoveNextCharEvent()
|
||||
{
|
||||
assert(events[eventtail].type == EV_GUI_Event && events[eventtail].subtype == EV_GUI_KeyDown);
|
||||
for (int evnum = eventtail; evnum != eventhead; evnum = (evnum+1) & (MAXEVENTS-1))
|
||||
{
|
||||
event_t *ev = &events[evnum];
|
||||
if (ev->type != EV_GUI_Event)
|
||||
break;
|
||||
if (ev->subtype == EV_GUI_KeyDown || ev->subtype == EV_GUI_Char)
|
||||
{
|
||||
ev->type = EV_None;
|
||||
if (ev->subtype == EV_GUI_Char)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// Render wrapper.
|
||||
|
|
|
@ -630,22 +630,6 @@ DEFINE_FIELD_X(WorldEvent, FWorldEvent, NewDamage);
|
|||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
|
||||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn);
|
||||
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, Type);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, KeyString);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, KeyChar);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, MouseX);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, MouseY);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsShift);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsAlt);
|
||||
DEFINE_FIELD_X(UiEvent, FUiEvent, IsCtrl);
|
||||
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, Type);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyScan);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyString);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, KeyChar);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, MouseX);
|
||||
DEFINE_FIELD_X(InputEvent, FInputEvent, MouseY);
|
||||
|
||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Player)
|
||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name)
|
||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Args)
|
||||
|
@ -1050,46 +1034,6 @@ void DStaticEventHandler::PlayerDisconnected(int num)
|
|||
}
|
||||
}
|
||||
|
||||
FUiEvent::FUiEvent(const event_t *ev)
|
||||
{
|
||||
Type = (EGUIEvent)ev->subtype;
|
||||
KeyChar = 0;
|
||||
IsShift = false;
|
||||
IsAlt = false;
|
||||
IsCtrl = false;
|
||||
MouseX = 0;
|
||||
MouseY = 0;
|
||||
// we don't want the modders to remember what weird fields mean what for what events.
|
||||
switch (ev->subtype)
|
||||
{
|
||||
case EV_GUI_None:
|
||||
break;
|
||||
case EV_GUI_KeyDown:
|
||||
case EV_GUI_KeyRepeat:
|
||||
case EV_GUI_KeyUp:
|
||||
KeyChar = ev->data1;
|
||||
KeyString = FString(char(ev->data1));
|
||||
IsShift = !!(ev->data3 & GKM_SHIFT);
|
||||
IsAlt = !!(ev->data3 & GKM_ALT);
|
||||
IsCtrl = !!(ev->data3 & GKM_CTRL);
|
||||
break;
|
||||
case EV_GUI_Char:
|
||||
KeyChar = ev->data1;
|
||||
KeyString = MakeUTF8(ev->data1);
|
||||
IsAlt = !!ev->data2; // only true for Win32, not sure about SDL
|
||||
break;
|
||||
default: // mouse event
|
||||
// note: SDL input doesn't seem to provide these at all
|
||||
//Printf("Mouse data: %d, %d, %d, %d\n", ev->x, ev->y, ev->data1, ev->data2);
|
||||
MouseX = ev->data1;
|
||||
MouseY = ev->data2;
|
||||
IsShift = !!(ev->data3 & GKM_SHIFT);
|
||||
IsAlt = !!(ev->data3 & GKM_ALT);
|
||||
IsCtrl = !!(ev->data3 & GKM_CTRL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool DStaticEventHandler::UiProcess(const event_t* ev)
|
||||
{
|
||||
IFVIRTUAL(DStaticEventHandler, UiProcess)
|
||||
|
@ -1108,33 +1052,6 @@ bool DStaticEventHandler::UiProcess(const event_t* ev)
|
|||
return false;
|
||||
}
|
||||
|
||||
FInputEvent::FInputEvent(const event_t *ev)
|
||||
{
|
||||
Type = (EGenericEvent)ev->type;
|
||||
// we don't want the modders to remember what weird fields mean what for what events.
|
||||
KeyScan = 0;
|
||||
KeyChar = 0;
|
||||
MouseX = 0;
|
||||
MouseY = 0;
|
||||
switch (Type)
|
||||
{
|
||||
case EV_None:
|
||||
break;
|
||||
case EV_KeyDown:
|
||||
case EV_KeyUp:
|
||||
KeyScan = ev->data1;
|
||||
KeyChar = ev->data2;
|
||||
KeyString = FString(char(ev->data1));
|
||||
break;
|
||||
case EV_Mouse:
|
||||
MouseX = ev->x;
|
||||
MouseY = ev->y;
|
||||
break;
|
||||
default:
|
||||
break; // EV_DeviceChange = wat?
|
||||
}
|
||||
}
|
||||
|
||||
bool DStaticEventHandler::InputProcess(const event_t* ev)
|
||||
{
|
||||
IFVIRTUAL(DStaticEventHandler, InputProcess)
|
||||
|
|
34
src/events.h
34
src/events.h
|
@ -3,7 +3,6 @@
|
|||
#include "dobject.h"
|
||||
#include "serializer.h"
|
||||
#include "d_event.h"
|
||||
#include "d_gui.h"
|
||||
#include "sbar.h"
|
||||
|
||||
class DStaticEventHandler;
|
||||
|
@ -175,39 +174,6 @@ struct FPlayerEvent
|
|||
bool IsReturn;
|
||||
};
|
||||
|
||||
struct FUiEvent
|
||||
{
|
||||
// this essentially translates event_t UI events to ZScript.
|
||||
EGUIEvent Type;
|
||||
// for keys/chars/whatever
|
||||
FString KeyString;
|
||||
int KeyChar;
|
||||
// for mouse
|
||||
int MouseX;
|
||||
int MouseY;
|
||||
// global (?)
|
||||
bool IsShift;
|
||||
bool IsCtrl;
|
||||
bool IsAlt;
|
||||
|
||||
FUiEvent(const event_t *ev);
|
||||
};
|
||||
|
||||
struct FInputEvent
|
||||
{
|
||||
// this translates regular event_t events to ZScript (not UI, UI events are sent via DUiEvent and only if requested!)
|
||||
EGenericEvent Type = EV_None;
|
||||
// for keys
|
||||
int KeyScan;
|
||||
FString KeyString;
|
||||
int KeyChar;
|
||||
// for mouse
|
||||
int MouseX;
|
||||
int MouseY;
|
||||
|
||||
FInputEvent(const event_t *ev);
|
||||
};
|
||||
|
||||
struct FConsoleEvent
|
||||
{
|
||||
// player that activated this event. note that it's always -1 for non-playsim events (i.e. these not called with netevent)
|
||||
|
|
|
@ -965,6 +965,10 @@ CCMD (spycancel)
|
|||
//
|
||||
bool G_Responder (event_t *ev)
|
||||
{
|
||||
// check events
|
||||
if (ev->type != EV_Mouse && primaryLevel->localEventManager->Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly
|
||||
return true;
|
||||
|
||||
// any other key pops up menu if in demos
|
||||
// [RH] But only if the key isn't bound to a "special" command
|
||||
if (gameaction == ga_nothing &&
|
||||
|
|
Loading…
Reference in a new issue