mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2025-02-07 15:31:02 +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/file_directory.cpp
|
||||||
common/filesystem/resourcefile.cpp
|
common/filesystem/resourcefile.cpp
|
||||||
common/engine/cycler.cpp
|
common/engine/cycler.cpp
|
||||||
|
common/engine/d_event.cpp
|
||||||
common/engine/stats.cpp
|
common/engine/stats.cpp
|
||||||
common/engine/sc_man.cpp
|
common/engine/sc_man.cpp
|
||||||
common/engine/palettecontainer.cpp
|
common/engine/palettecontainer.cpp
|
||||||
|
@ -1283,6 +1284,7 @@ include_directories( .
|
||||||
rendering/2d
|
rendering/2d
|
||||||
r_data
|
r_data
|
||||||
sound
|
sound
|
||||||
|
menu
|
||||||
sound/backend
|
sound/backend
|
||||||
xlat
|
xlat
|
||||||
utility
|
utility
|
||||||
|
|
|
@ -651,7 +651,6 @@ void F2DDrawer::AddPoly(FGameTexture* img, FVector4* vt, size_t vtcount, unsigne
|
||||||
|
|
||||||
dg.mTexture = img;
|
dg.mTexture = img;
|
||||||
dg.mTranslationId = translation;
|
dg.mTranslationId = translation;
|
||||||
dg.mColor1 = color;
|
|
||||||
dg.mVertCount = (int)vtcount;
|
dg.mVertCount = (int)vtcount;
|
||||||
dg.mVertIndex = (int)mVertices.Reserve(vtcount);
|
dg.mVertIndex = (int)mVertices.Reserve(vtcount);
|
||||||
dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent];
|
dg.mRenderStyle = LegacyRenderStyles[STYLE_Translucent];
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
#include "sc_man.h"
|
#include "sc_man.h"
|
||||||
#include "c_cvars.h"
|
#include "c_cvars.h"
|
||||||
|
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
|
|
||||||
extern int chatmodeon;
|
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 "vectors.h"
|
||||||
#include "m_joy.h"
|
#include "m_joy.h"
|
||||||
#include "gameconfigfile.h"
|
#include "gameconfigfile.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#include "c_console.h"
|
#include "c_console.h"
|
||||||
#include "c_cvars.h"
|
#include "c_cvars.h"
|
||||||
#include "c_dispatch.h"
|
#include "c_dispatch.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "c_buttons.h"
|
#include "c_buttons.h"
|
||||||
#include "d_gui.h"
|
#include "d_gui.h"
|
||||||
#include "dikeys.h"
|
#include "dikeys.h"
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include <IOKit/IOMessage.h>
|
#include <IOKit/IOMessage.h>
|
||||||
#include <IOKit/hid/IOHIDLib.h>
|
#include <IOKit/hid/IOHIDLib.h>
|
||||||
|
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "i_system.h"
|
#include "i_system.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "m_joy.h"
|
#include "m_joy.h"
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "v_video.h"
|
#include "v_video.h"
|
||||||
|
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "d_gui.h"
|
#include "d_gui.h"
|
||||||
#include "c_buttons.h"
|
#include "c_buttons.h"
|
||||||
#include "c_console.h"
|
#include "c_console.h"
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
#include "i_input.h"
|
#include "i_input.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
#include "gameconfigfile.h"
|
#include "gameconfigfile.h"
|
||||||
#include "cmdlib.h"
|
#include "cmdlib.h"
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
#include "s_soundinternal.h"
|
#include "s_soundinternal.h"
|
||||||
#include "gameconfigfile.h"
|
#include "gameconfigfile.h"
|
||||||
#include "hardware.h"
|
#include "hardware.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "v_text.h"
|
#include "v_text.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "engineerrors.h"
|
#include "engineerrors.h"
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
|
|
||||||
#include "i_input.h"
|
#include "i_input.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
|
|
||||||
|
|
||||||
// MACROS ------------------------------------------------------------------
|
// MACROS ------------------------------------------------------------------
|
||||||
|
|
|
@ -572,6 +572,7 @@ void I_SetWndProc()
|
||||||
SetWindowLongPtr (Window, GWLP_USERDATA, 1);
|
SetWindowLongPtr (Window, GWLP_USERDATA, 1);
|
||||||
SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)WndProc);
|
SetWindowLongPtr (Window, GWLP_WNDPROC, (WLONG_PTR)WndProc);
|
||||||
ShowWindow (ConWindow, SW_HIDE);
|
ShowWindow (ConWindow, SW_HIDE);
|
||||||
|
ShowWindow(ProgressBar, SW_HIDE);
|
||||||
ConWindowHidden = true;
|
ConWindowHidden = true;
|
||||||
ShowWindow (GameTitleWindow, SW_HIDE);
|
ShowWindow (GameTitleWindow, SW_HIDE);
|
||||||
I_InitInput (Window);
|
I_InitInput (Window);
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include <dinput.h>
|
#include <dinput.h>
|
||||||
|
|
||||||
#include "i_input.h"
|
#include "i_input.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "d_gui.h"
|
#include "d_gui.h"
|
||||||
#include "hardware.h"
|
#include "hardware.h"
|
||||||
#include "menu/menu.h"
|
#include "menu/menu.h"
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#include "i_input.h"
|
#include "i_input.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
#include "gameconfigfile.h"
|
#include "gameconfigfile.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include "i_input.h"
|
#include "i_input.h"
|
||||||
#include "d_event.h"
|
#include "d_eventbase.h"
|
||||||
#include "templates.h"
|
#include "templates.h"
|
||||||
#include "gameconfigfile.h"
|
#include "gameconfigfile.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
|
|
|
@ -78,7 +78,7 @@ CUSTOM_CVAR(Int, vid_maxfps, 200, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
|
||||||
{
|
{
|
||||||
self = GameTicRate;
|
self = GameTicRate;
|
||||||
}
|
}
|
||||||
else if (vid_maxfps > 1000)
|
else if (self > 1000)
|
||||||
{
|
{
|
||||||
self = 1000;
|
self = 1000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ void Dictionary::Serialize(FSerializer &arc)
|
||||||
{
|
{
|
||||||
Super::Serialize(arc);
|
Super::Serialize(arc);
|
||||||
|
|
||||||
constexpr char key[] { "dictionary" };
|
static const char key[] = "dictionary";
|
||||||
|
|
||||||
if (arc.isWriting())
|
if (arc.isWriting())
|
||||||
{
|
{
|
||||||
|
|
|
@ -26,35 +26,9 @@
|
||||||
|
|
||||||
#include "basics.h"
|
#include "basics.h"
|
||||||
#include <functional>
|
#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
|
enum gameaction_t : int
|
||||||
{
|
{
|
||||||
|
@ -119,18 +93,9 @@ typedef enum
|
||||||
} buttoncode_t;
|
} buttoncode_t;
|
||||||
|
|
||||||
// Called by IO functions when input is detected.
|
// 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);
|
void D_Render(std::function<void()> action, bool interpolate);
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// GLOBAL VARIABLES
|
|
||||||
//
|
|
||||||
#define MAXEVENTS 128
|
|
||||||
|
|
||||||
extern event_t events[MAXEVENTS];
|
|
||||||
|
|
||||||
extern gameaction_t gameaction;
|
extern gameaction_t gameaction;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -301,9 +301,6 @@ bool autostart;
|
||||||
bool advancedemo;
|
bool advancedemo;
|
||||||
FILE *debugfile;
|
FILE *debugfile;
|
||||||
FILE *hashfile;
|
FILE *hashfile;
|
||||||
event_t events[MAXEVENTS];
|
|
||||||
int eventhead;
|
|
||||||
int eventtail;
|
|
||||||
gamestate_t wipegamestate = GS_DEMOSCREEN; // can be -1 to force a wipe
|
gamestate_t wipegamestate = GS_DEMOSCREEN; // can be -1 to force a wipe
|
||||||
bool PageBlank;
|
bool PageBlank;
|
||||||
FGameTexture *Advisory;
|
FGameTexture *Advisory;
|
||||||
|
@ -444,38 +441,6 @@ CCMD(togglehud)
|
||||||
D_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
|
// D_PostEvent
|
||||||
|
@ -518,41 +483,6 @@ void D_PostEvent (const event_t *ev)
|
||||||
eventhead = (eventhead+1)&(MAXEVENTS-1);
|
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.
|
// Render wrapper.
|
||||||
|
|
|
@ -630,22 +630,6 @@ DEFINE_FIELD_X(WorldEvent, FWorldEvent, NewDamage);
|
||||||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
|
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, PlayerNumber);
|
||||||
DEFINE_FIELD_X(PlayerEvent, FPlayerEvent, IsReturn);
|
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, Player)
|
||||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name)
|
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Name)
|
||||||
DEFINE_FIELD_X(ConsoleEvent, FConsoleEvent, Args)
|
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)
|
bool DStaticEventHandler::UiProcess(const event_t* ev)
|
||||||
{
|
{
|
||||||
IFVIRTUAL(DStaticEventHandler, UiProcess)
|
IFVIRTUAL(DStaticEventHandler, UiProcess)
|
||||||
|
@ -1108,33 +1052,6 @@ bool DStaticEventHandler::UiProcess(const event_t* ev)
|
||||||
return false;
|
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)
|
bool DStaticEventHandler::InputProcess(const event_t* ev)
|
||||||
{
|
{
|
||||||
IFVIRTUAL(DStaticEventHandler, InputProcess)
|
IFVIRTUAL(DStaticEventHandler, InputProcess)
|
||||||
|
|
34
src/events.h
34
src/events.h
|
@ -3,7 +3,6 @@
|
||||||
#include "dobject.h"
|
#include "dobject.h"
|
||||||
#include "serializer.h"
|
#include "serializer.h"
|
||||||
#include "d_event.h"
|
#include "d_event.h"
|
||||||
#include "d_gui.h"
|
|
||||||
#include "sbar.h"
|
#include "sbar.h"
|
||||||
|
|
||||||
class DStaticEventHandler;
|
class DStaticEventHandler;
|
||||||
|
@ -175,39 +174,6 @@ struct FPlayerEvent
|
||||||
bool IsReturn;
|
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
|
struct FConsoleEvent
|
||||||
{
|
{
|
||||||
// player that activated this event. note that it's always -1 for non-playsim events (i.e. these not called with netevent)
|
// 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)
|
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
|
// any other key pops up menu if in demos
|
||||||
// [RH] But only if the key isn't bound to a "special" command
|
// [RH] But only if the key isn't bound to a "special" command
|
||||||
if (gameaction == ga_nothing &&
|
if (gameaction == ga_nothing &&
|
||||||
|
|
Loading…
Reference in a new issue