From b7c7328cdd40797a6e3c955b0c022fe3762f74a5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 21 Nov 2021 10:19:52 +0100 Subject: [PATCH] - backend update fromGZDoom. most importantly this addresses issues with key down/key up events being sent in the same tic not having an effect on game actions that require a key being held down. --- source/common/console/c_bind.cpp | 24 ++++++++++++++++++- source/common/engine/d_event.cpp | 21 +++++++++++++--- source/common/filesystem/file_grp.cpp | 6 ++--- source/common/platform/posix/sdl/hardware.cpp | 1 + .../polyrenderer/backend/poly_framebuffer.cpp | 2 +- .../polyrenderer/backend/poly_hwtexture.cpp | 2 +- .../polyrenderer/backend/poly_renderstate.cpp | 2 +- .../polyrenderer/drawers/poly_thread.cpp | 2 +- .../polyrenderer/drawers/poly_triangle.cpp | 2 +- .../drawers/screen_scanline_setup.cpp | 2 +- .../polyrenderer/drawers/screen_shader.cpp | 1 - .../polyrenderer/drawers/screen_triangle.cpp | 1 - source/common/utility/cmdlib.cpp | 4 ++++ 13 files changed, 55 insertions(+), 15 deletions(-) diff --git a/source/common/console/c_bind.cpp b/source/common/console/c_bind.cpp index a83951cca..1bca5072c 100644 --- a/source/common/console/c_bind.cpp +++ b/source/common/console/c_bind.cpp @@ -686,6 +686,17 @@ void ReadBindings(int lump, bool override) FKeyBindings* dest = &Bindings; int key; + if (sc.Compare("unbind")) + { + sc.MustGetString(); + if (override) + { + // This is only for games to clear unsuitable base defaults, not for mods. + dest->UnbindKey(sc.String); + } + continue; + } + // bind destination is optional and is the same as the console command if (sc.Compare("bind")) { @@ -722,7 +733,18 @@ void ReadBindings(int lump, bool override) void C_SetDefaultKeys(const char* baseconfig) { auto lump = fileSystem.CheckNumForFullName("engine/commonbinds.txt"); - if (lump >= 0) ReadBindings(lump, true); + if (lump >= 0) + { + // Bail out if a mod tries to override this. Main game resources are allowed to do this, though. + auto fileno2 = fileSystem.GetFileContainer(lump); + if (fileno2 > fileSystem.GetMaxIwadNum()) + { + I_FatalError("File %s is overriding core lump %s.", + fileSystem.GetResourceFileFullName(fileno2), "engine/commonbinds.txt"); + } + + ReadBindings(lump, true); + } int lastlump = 0; while ((lump = fileSystem.FindLumpFullName(baseconfig, &lastlump)) != -1) diff --git a/source/common/engine/d_event.cpp b/source/common/engine/d_event.cpp index 3a779a5fc..7a51d054a 100644 --- a/source/common/engine/d_event.cpp +++ b/source/common/engine/d_event.cpp @@ -67,11 +67,21 @@ CVAR(Bool, m_filter, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) void D_ProcessEvents (void) { - event_t *ev; + FixedBitArray keywasdown; + TArray delayedevents; + + keywasdown.Zero(); while (eventtail != eventhead) { - ev = &events[eventtail]; + event_t *ev = &events[eventtail]; eventtail = (eventtail + 1) & (MAXEVENTS - 1); + + if (ev->type == EV_KeyUp && keywasdown[ev->data1]) + { + delayedevents.Push(*ev); + continue; + } + if (ev->type == EV_None) continue; if (ev->type == EV_DeviceChange) @@ -85,7 +95,12 @@ void D_ProcessEvents (void) continue; // menu ate the event } - G_Responder (ev); + if (G_Responder(ev) && ev->type == EV_KeyDown) keywasdown.Set(ev->data1); + } + + for (auto& ev: delayedevents) + { + D_PostEvent(&ev); } } diff --git a/source/common/filesystem/file_grp.cpp b/source/common/filesystem/file_grp.cpp index 1bf3bd7a4..97f17f17f 100644 --- a/source/common/filesystem/file_grp.cpp +++ b/source/common/filesystem/file_grp.cpp @@ -42,7 +42,7 @@ // //========================================================================== -struct GrpInfo +struct GrpHeader { uint32_t Magic[3]; uint32_t NumLumps; @@ -95,7 +95,7 @@ FGrpFile::FGrpFile(const char *filename, FileReader &file) bool FGrpFile::Open(bool quiet, LumpFilterInfo*) { - GrpInfo header; + GrpHeader header; Reader.Read(&header, sizeof(header)); NumLumps = LittleLong(header.NumLumps); @@ -105,7 +105,7 @@ bool FGrpFile::Open(bool quiet, LumpFilterInfo*) Lumps.Resize(NumLumps); - int Position = sizeof(GrpInfo) + NumLumps * sizeof(GrpLump); + int Position = sizeof(GrpHeader) + NumLumps * sizeof(GrpLump); for(uint32_t i = 0; i < NumLumps; i++) { diff --git a/source/common/platform/posix/sdl/hardware.cpp b/source/common/platform/posix/sdl/hardware.cpp index ea008169e..ce877e943 100644 --- a/source/common/platform/posix/sdl/hardware.cpp +++ b/source/common/platform/posix/sdl/hardware.cpp @@ -67,6 +67,7 @@ void I_InitGraphics () #ifdef __APPLE__ SDL_SetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES, "0"); #endif // __APPLE__ + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); if (SDL_InitSubSystem (SDL_INIT_VIDEO) < 0) { diff --git a/source/common/rendering/polyrenderer/backend/poly_framebuffer.cpp b/source/common/rendering/polyrenderer/backend/poly_framebuffer.cpp index 683786570..cbe49da6f 100644 --- a/source/common/rendering/polyrenderer/backend/poly_framebuffer.cpp +++ b/source/common/rendering/polyrenderer/backend/poly_framebuffer.cpp @@ -22,7 +22,7 @@ #include "v_video.h" #include "m_png.h" -#include "templates.h" + #include "r_videoscale.h" #include "i_time.h" #include "v_text.h" diff --git a/source/common/rendering/polyrenderer/backend/poly_hwtexture.cpp b/source/common/rendering/polyrenderer/backend/poly_hwtexture.cpp index 0e56303fe..3b931aa46 100644 --- a/source/common/rendering/polyrenderer/backend/poly_hwtexture.cpp +++ b/source/common/rendering/polyrenderer/backend/poly_hwtexture.cpp @@ -20,7 +20,7 @@ ** */ -#include "templates.h" + #include "c_cvars.h" #include "hw_material.h" #include "hw_cvars.h" diff --git a/source/common/rendering/polyrenderer/backend/poly_renderstate.cpp b/source/common/rendering/polyrenderer/backend/poly_renderstate.cpp index 14077e489..38411e559 100644 --- a/source/common/rendering/polyrenderer/backend/poly_renderstate.cpp +++ b/source/common/rendering/polyrenderer/backend/poly_renderstate.cpp @@ -23,7 +23,7 @@ #include "polyrenderer/backend/poly_renderstate.h" #include "polyrenderer/backend/poly_framebuffer.h" #include "polyrenderer/backend/poly_hwtexture.h" -#include "templates.h" + #include "hw_skydome.h" #include "hw_viewpointuniforms.h" #include "hw_lightbuffer.h" diff --git a/source/common/rendering/polyrenderer/drawers/poly_thread.cpp b/source/common/rendering/polyrenderer/drawers/poly_thread.cpp index 38faabafb..502705ca5 100644 --- a/source/common/rendering/polyrenderer/drawers/poly_thread.cpp +++ b/source/common/rendering/polyrenderer/drawers/poly_thread.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "filesystem.h" #include "v_video.h" diff --git a/source/common/rendering/polyrenderer/drawers/poly_triangle.cpp b/source/common/rendering/polyrenderer/drawers/poly_triangle.cpp index 986ac946a..8c142a06d 100644 --- a/source/common/rendering/polyrenderer/drawers/poly_triangle.cpp +++ b/source/common/rendering/polyrenderer/drawers/poly_triangle.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "filesystem.h" #include "v_video.h" diff --git a/source/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp b/source/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp index bd5307792..6cb9ee2cb 100644 --- a/source/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp +++ b/source/common/rendering/polyrenderer/drawers/screen_scanline_setup.cpp @@ -21,7 +21,7 @@ */ #include -#include "templates.h" + #include "poly_thread.h" #include "screen_scanline_setup.h" #include diff --git a/source/common/rendering/polyrenderer/drawers/screen_shader.cpp b/source/common/rendering/polyrenderer/drawers/screen_shader.cpp index 023142cb9..7403a9336 100644 --- a/source/common/rendering/polyrenderer/drawers/screen_shader.cpp +++ b/source/common/rendering/polyrenderer/drawers/screen_shader.cpp @@ -21,7 +21,6 @@ */ #include -#include "templates.h" #include "poly_thread.h" #include "screen_scanline_setup.h" #include diff --git a/source/common/rendering/polyrenderer/drawers/screen_triangle.cpp b/source/common/rendering/polyrenderer/drawers/screen_triangle.cpp index dfa82fd2c..f30bc8bd2 100644 --- a/source/common/rendering/polyrenderer/drawers/screen_triangle.cpp +++ b/source/common/rendering/polyrenderer/drawers/screen_triangle.cpp @@ -21,7 +21,6 @@ */ #include -#include "templates.h" #include "filesystem.h" #include "v_video.h" diff --git a/source/common/utility/cmdlib.cpp b/source/common/utility/cmdlib.cpp index 38b502822..b4fb3a479 100644 --- a/source/common/utility/cmdlib.cpp +++ b/source/common/utility/cmdlib.cpp @@ -866,6 +866,10 @@ FString ExpandEnvVars(const char *searchpathstring) FString NicePath(const char *path) { #ifdef _WIN32 + if (*path == '\0') + { + return FString("."); + } return ExpandEnvVars(path); #else if (path == NULL || *path == '\0')