From 2e079b67a3f1462ef7639dccd55dbb6a838725c0 Mon Sep 17 00:00:00 2001 From: waltje Date: Tue, 30 Apr 2019 04:14:13 -0500 Subject: [PATCH] Applied PCem patch #d12b9ef. Applied PCem patch #ef2c34c. Updated vidapi to enable/disable the renderers on resize (patch from 86Box.) Re-worked the D2D renderer to actually work when dynloaded. Some more changes to the VNC renderer. Not done yet, the library is horrible. Updated the Travis work files to allow for downloadable dependencies. --- .travis-build.sh | 18 +- .travis-deploy.sh | 9 +- src/cpu/x86seg.c | 4 +- src/plat.h | 3 +- src/ui/ui.h | 3 +- src/ui/ui_vidapi.c | 21 +- src/vnc.c | 7 +- src/win/mingw/Makefile.MinGW | 55 +++-- src/win/msvc/Makefile.VC | 395 +++++++++++++++++------------------ src/win/win_d2d.cpp | 75 ++++--- src/win/win_d3d.cpp | 29 ++- src/win/win_ddraw.cpp | 29 ++- src/win/win_sdl.c | 24 ++- src/win/win_ui.c | 20 +- 14 files changed, 409 insertions(+), 283 deletions(-) diff --git a/.travis-build.sh b/.travis-build.sh index 0ad635c..4aed194 100644 --- a/.travis-build.sh +++ b/.travis-build.sh @@ -9,7 +9,7 @@ # # Build script for the Travis CI remote builder service. # -# Version: @(#).travis-build.sh 1.0.6 2019/04/27 +# Version: @(#).travis-build.sh 1.0.7 2019/04/30 # # Author: Fred N. van Kempen, # @@ -45,6 +45,9 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + # Define the build options here. + OPTS=D2D=d SDL=d VNC=d PNG=d + if [ "x${DEV_BUILD}" = "xy" ]; then TARGET="win-${TRAVIS_BUILD_NUMBER}_dev-x86" elif [ "x${DEBUG}" = "xy" ]; then @@ -54,21 +57,26 @@ else TARGET="win-${TRAVIS_BUILD_NUMBER}-x86" fi - echo "Building VARCem, build #${TRAVIS_BUILD_NUMBER} target ${TARGET}" - - cd src # We only need the first few characters of the commit ID. export COMMIT=${TRAVIS_COMMIT::7} + echo "Downloading VARCem build dependencies.." + curl -# ${EXTDEP_URL} | tar xzf - 2>/dev/null + # Build the project. - make -f win/mingw/Makefile.MinGW BUILD=${TRAVIS_BUILD_NUMBER} + echo "Building VARCem, build #${TRAVIS_BUILD_NUMBER} target ${TARGET}" + + cd src + + make -f win/mingw/Makefile.MinGW ${OPTS} BUILD=${TRAVIS_BUILD_NUMBER} if [ $? != 0 ]; then echo "Build failed, not uploading." exit 1 fi + # Package the results so we can upload them. echo "Build #${TRAVIS_BUILD_NUMBER} OK, packing up." zip -9 ../${TARGET}.zip *.exe diff --git a/.travis-deploy.sh b/.travis-deploy.sh index 6f3278d..83f3955 100644 --- a/.travis-deploy.sh +++ b/.travis-deploy.sh @@ -9,7 +9,7 @@ # # Deployment script for the Travis CI remote builder service. # -# Version: @(#).travis-deploy.sh 1.0.4 2019/04/27 +# Version: @(#).travis-deploy.sh 1.0.5 2019/04/30 # # Author: Fred N. van Kempen, # @@ -62,17 +62,16 @@ BTYPE=regular fi + # We only need the first few characters of the commit ID. + export COMMIT=${TRAVIS_COMMIT::7} + if [ ! -f ${TARGET}.zip ]; then echo "Target file ${TARGET}.zip not found, giving up." exit 1 fi - # We only need the first few characters of the commit ID. - export COMMIT=${TRAVIS_COMMIT::7} - echo "Uploading VARCem build #${TRAVIS_BUILD_NUMBER} target ${TARGET}" - curl -# -X POST \ -F "type=${BTYPE}" \ -F "build=${TRAVIS_BUILD_NUMBER}" \ diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index ff6b31a..b8b424c 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -8,7 +8,7 @@ * * x86 CPU segment emulation. * - * Version: @(#)x86seg.c 1.0.6 2019/04/20 + * Version: @(#)x86seg.c 1.0.7 2019/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -456,8 +456,10 @@ void loadseg(uint16_t seg, x86seg *s) s->access = (3 << 5) | 2 | 0x80; s->base = seg << 4; s->seg = seg; +#if 0 if (s == &_ss) set_stack32(0); +#endif s->checked = 1; #ifdef USE_DYNAREC if (s == &_ds) diff --git a/src/plat.h b/src/plat.h index 60218c7..a227c7f 100644 --- a/src/plat.h +++ b/src/plat.h @@ -8,7 +8,7 @@ * * Define the various platform support functions. * - * Version: @(#)plat.h 1.0.24 2019/04/26 + * Version: @(#)plat.h 1.0.25 2019/04/29 * * Author: Fred N. van Kempen, * @@ -125,6 +125,7 @@ typedef struct { void (*reset)(int fs); void (*resize)(int x, int y); int (*pause)(void); + void (*enable)(int yes); void (*screenshot)(const wchar_t *fn); int (*is_available)(void); } vidapi_t; diff --git a/src/ui/ui.h b/src/ui/ui.h index e30d596..f5761e7 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -8,7 +8,7 @@ * * Define the various UI functions. * - * Version: @(#)ui.h 1.0.17 2019/04/26 + * Version: @(#)ui.h 1.0.18 2019/04/29 * * Author: Fred N. van Kempen, * @@ -201,6 +201,7 @@ extern const char *vidapi_getname(int api); extern int vidapi_set(int api); extern void vidapi_resize(int x, int y); extern int vidapi_pause(void); +extern void vidapi_enable(int yes); extern void vidapi_reset(void); extern void vidapi_screenshot(void); extern void plat_startblit(void); diff --git a/src/ui/ui_vidapi.c b/src/ui/ui_vidapi.c index edacc06..e2b10b4 100644 --- a/src/ui/ui_vidapi.c +++ b/src/ui/ui_vidapi.c @@ -8,7 +8,7 @@ * * Handle the various video renderer modules. * - * Version: @(#)ui_vidapi.c 1.0.5 2019/03/07 + * Version: @(#)ui_vidapi.c 1.0.6 2019/04/29 * * Author: Fred N. van Kempen, * @@ -181,6 +181,25 @@ vidapi_pause(void) } +void +vidapi_enable(int yes) +{ + /* If not defined, assume not needed. */ + if (plat_vidapis[vid_api]->enable == NULL) return; + + /* Lock the blitter. */ + plat_startblit(); + + /* Wait for it to be ours. */ + video_blit_wait(); + + plat_vidapis[vid_api]->enable(yes); + + /* Release the blitter. */ + plat_endblit(); +} + + void vidapi_reset(void) { diff --git a/src/vnc.c b/src/vnc.c index 1df4d61..3efba85 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -10,7 +10,7 @@ * * TODO: Implement screenshots, and Audio Redirection. * - * Version: @(#)vnc.c 1.0.10 2019/04/28 + * Version: @(#)vnc.c 1.0.11 2019/04/29 * * Author: Fred N. van Kempen, * Based on raw code by RichardG, @@ -464,11 +464,10 @@ const vidapi_t vnc_vidapi = { "vnc", "VNC", 0, - vnc_init, - vnc_close, - NULL, + vnc_init, vnc_close, NULL, vnc_resize, vnc_pause, + NULL, vnc_screenshot, vnc_available }; diff --git a/src/win/mingw/Makefile.MinGW b/src/win/mingw/Makefile.MinGW index 254999c..bb4ffd5 100644 --- a/src/win/mingw/Makefile.MinGW +++ b/src/win/mingw/Makefile.MinGW @@ -8,7 +8,7 @@ # # Makefile for Windows systems using the MinGW32 environment. # -# Version: @(#)Makefile.mingw 1.0.83 2019/04/28 +# Version: @(#)Makefile.mingw 1.0.84 2019/04/29 # # Author: Fred N. van Kempen, # @@ -359,11 +359,11 @@ ifneq ($(VNS), n) ifeq ($(VNS_PATH), ) VNS_PATH := $(EXT_PATH)/vns endif - OPTS += -I$(VNS_PATH)/include/mingw -I$(VNS_PATH)/include + OPTS += -I$(VNS_PATH)/include ifeq ($(X64), y) - LIBS += -L$(VNS_PATH)/lib/mingw/x64 + LIBS += -L$(VNS_PATH)/lib/x64 else - LIBS += -L$(VNS_PATH)/lib/mingw/x86 + LIBS += -L$(VNS_PATH)/lib/x86 endif ifeq ($(VNS), y) LIBS += -lvns.dll @@ -414,11 +414,11 @@ ifneq ($(SDL), n) ifeq ($(SDL_PATH), ) SDL_PATH := $(EXT_PATH)/sdl endif - OPTS += -I$(SDL_PATH)/include/mingw -I$(SDL_PATH)/include + OPTS += -I$(SDL_PATH)/include ifeq ($(X64), y) - LIBS += -L$(SDL_PATH)/lib/mingw/x64 + LIBS += -L$(SDL_PATH)/lib/x64 else - LIBS += -L$(SDL_PATH)/lib/mingw/x86 + LIBS += -L$(SDL_PATH)/lib/x86 endif ifeq ($(SDL), y) LIBS += -lsdl2.dll @@ -440,11 +440,11 @@ ifneq ($(D2D), n) OPTS += -DUSE_D2D=1 endif ifneq ($(D2D_PATH), ) - OPTS += -I$(D2D_PATH)/include/mingw -I$(D2D_PATH)/include + OPTS += -I$(D2D_PATH)/include ifeq ($(X64), y) - LOPTS += -L$(D2D_PATH)/lib/mingw/x64 + LOPTS += -L$(D2D_PATH)/lib/x64 else - LOPTS += -L$(D2D_PATH)/lib/mingw/x86 + LOPTS += -L$(D2D_PATH)/lib/x86 endif endif ifeq ($(D2D), y) @@ -487,6 +487,7 @@ ifndef VNC VNC := n endif ifneq ($(VNC), n) + ZLIB := (VNC) ifeq ($(VNC), d) OPTS += -DUSE_VNC=2 else @@ -495,7 +496,7 @@ ifneq ($(VNC), n) ifeq ($(VNC_PATH), ) VNC_PATH := $(EXT_PATH)/vnc endif - OPTS += -I$(VNC_PATH)/include/mingw -I$(VNC_PATH)/include + OPTS += -I$(VNC_PATH)/include ifeq ($(X64), y) LIBS += -L$(VNC_PATH)/lib/x64 else @@ -523,7 +524,7 @@ ifneq ($(RDP), n) ifeq ($(RDP_PATH), ) RDP_PATH := $(EXT_PATH)/rdp endif - OPTS += -I$(RDP_PATH)/include/mingw -I$(RDP_PATH)/include + OPTS += -I$(RDP_PATH)/include ifeq ($(X64), y) LIBS += -L$(RDP_PATH)/lib/x64 else @@ -543,6 +544,7 @@ ifndef PNG PNG := n endif ifneq ($(PNG), n) + ZLIB := $(PNG) ifeq ($(PNG), d) OPTS += -DUSE_LIBPNG=2 else @@ -551,7 +553,7 @@ ifneq ($(PNG), n) ifeq ($(PNG_PATH), ) PNG_PATH := $(EXT_PATH)/png endif - OPTS += -I$(PNG_PATH)/include/mingw -I$(PNG_PATH)/include + OPTS += -I$(PNG_PATH)/include ifeq ($(X64), y) LIBS += -L$(PNG_PATH)/lib/x64 else @@ -567,6 +569,33 @@ ifneq ($(PNG), n) MISCOBJ += png.o endif +# ZLIB: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef ZLIB + ZLIB := n +endif +ifneq ($(ZLIB), n) + ifeq ($(ZLIB), d) + OPTS += -DUSE_ZLIB=2 + else + OPTS += -DUSE_ZLIB=1 + endif + ifeq ($(ZLIB_PATH), ) + ZLIB_PATH := $(EXT_PATH)/zlib + endif + OPTS += -I$(ZLIB_PATH)/include + ifeq ($(X64), y) + LIBS += -L$(ZLIB_PATH)/lib/x64 + else + LIBS += -L$(ZLIB_PATH)/lib/x86 + endif + ifeq ($(ZLIB), y) + LIBS += -lz + endif + ifeq ($(ZLIB), s) + LIBS += -lz_static + endif +endif + # WX: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static ifneq ($(WX), n) OPTS += -DUSE_WX=$(WX) $(WX_FLAGS) diff --git a/src/win/msvc/Makefile.VC b/src/win/msvc/Makefile.VC index 9cf312e..5070c7e 100644 --- a/src/win/msvc/Makefile.VC +++ b/src/win/msvc/Makefile.VC @@ -8,7 +8,7 @@ # # Makefile for Windows using Visual Studio 2015. # -# Version: @(#)Makefile.VC 1.0.67 2019/04/28 +# Version: @(#)Makefile.VC 1.0.68 2019/04/29 # # Author: Fred N. van Kempen, # @@ -55,159 +55,10 @@ ifndef EXTRAS EXTRAS := endif - # Defaults for several build options (possibly defined in a chained file.) -ifndef AUTODEP - AUTODEP := n -endif -ifndef CRASHDUMP - CRASHDUMP := n -endif -ifndef DEBUG - DEBUG := n -endif -ifndef LOGGING - LOGGING := n -endif -ifndef PROFILER - PROFILER := n -endif -ifndef OPTIM - OPTIM := n -endif -ifndef RELEASE - RELEASE := n -endif -ifndef X64 - X64 := n -endif -ifndef ARM -ARM := n -endif -ifndef ARM64 -ARM64 := n -endif -ifndef DYNAREC - DYNAREC := y - ifeq ($(ARM), y) - DYNAREC := n - endif - ifeq ($(ARM64), y) - DYNAREC := n - endif -endif ifndef WX WX := n endif -ifndef USB - USB := n -endif -ifndef VNS - VNS := n -endif -ifndef SDL - SDL := n -endif -ifndef D2D - D2D := n -endif -ifndef VNC - VNC := n -endif -ifndef RDP - RDP := n -endif -ifndef PNG - PNG := n -endif -ifndef DEV_BUILD - DEV_BUILD := n -endif -ifndef DEV_BRANCH - DEV_BRANCH := n -endif -ifndef AMD_K - AMD_K := n -endif -ifndef SIS471 - SIS471 := n -endif -ifndef SIS496 - SIS496 := n -endif -ifndef COMPAQ - COMPAQ := n -endif -ifndef MICRAL - MICRAL := n -endif -ifndef SUPERSPORT - SUPERSPORT := n -endif -ifndef DINPUT - DINPUT := y - ifeq ($(ARM), y) - DINPUT := n - endif -endif -ifndef D3DX - D3DX := y - ifeq ($(ARM), y) - D3DX := n - endif - ifeq ($(ARM64), y) - D3DX := n - endif -endif -ifndef OPENAL - OPENAL := y -endif -ifndef FLUIDSYNTH - FLUIDSYNTH := y -endif -ifndef MUNT - MUNT := y -endif -ifndef PAS16 - PAS16 := n -endif -ifndef GUSMAX - GUSMAX := n -endif -ifndef XL24 - XL24 := n -endif -ifndef WONDER - WONDER := n -endif -ifndef PRINTER - PRINTER := n -endif -ifndef HOSTCD - HOSTCD := n -endif -ifndef CASSETTE - CASSETTE := n -endif - -# Name of the executable. -NETIF := pcap_if -ifndef PROG - ifneq ($(WX), n) - PROG := WxVARCem - else - PROG := VARCem - endif -endif -ifeq ($(DEBUG), y) - PROG := $(PROG)-d - NETIF := $(NETIF)-d - LOGGING := y -else - ifeq ($(LOGGING), y) - PROG := $(PROG)-l - endif -endif # Which modules to include a development build. @@ -230,6 +81,12 @@ ifeq ($(DEV_BUILD), y) endif +# What is the location of our external dependencies? +ifeq ($(EXT_PATH), ) + EXT_PATH := ../external +endif + + # WxWidgets basic info. Extract using the config program. ifneq ($(WX), n) EXPATH += wx @@ -282,6 +139,28 @@ VPATH := $(EXPATH) . cpu \ machines ui win +# +# Name of the executable. +# +NETIF := pcap_if +ifndef PROG + ifneq ($(WX), n) + PROG := WxVARCem + else + PROG := VARCem + endif +endif +ifeq ($(DEBUG), y) + PROG := $(PROG)-d + NETIF := $(NETIF)-d + LOGGING := y +else + ifeq ($(LOGGING), y) + PROG := $(PROG)-l + endif +endif + + # # Select the required build environment. # @@ -328,6 +207,9 @@ else LOPTS_C := -SUBSYSTEM:CONSOLE,5.01 LOPTS_W := -SUBSYSTEM:WINDOWS,5.01 endif + + +# Add general build options from the environment. ifdef BUILD OPTS += -DBUILD=$(BUILD) endif @@ -385,25 +267,24 @@ else CGOPS := codegen_ops_x86.h VCG := vid_voodoo_codegen_x86.h endif -LIBS := ddraw.lib dxguid.lib d3d9.lib version.lib winmm.lib -ifeq ($(DINPUT), y) - LIBS += dinput8.lib -else - LIBS += xinput.lib -endif -ifeq ($(D3DX), y) - LIBS += d3dx9.lib -endif -LIBS += comctl32.lib comdlg32.lib advapi32.lib gdi32.lib \ +LIBS := ddraw.lib dxguid.lib d3d9.lib version.lib winmm.lib \ + comctl32.lib comdlg32.lib advapi32.lib gdi32.lib \ shell32.lib user32.lib -LIBS += ws2_32.lib wsock32.lib iphlpapi.lib psapi.lib -ifeq ($(DEBUG), y) -LIBS += libcmtd.lib libvcruntimed.lib libucrtd.lib -endif # Optional modules. MISCOBJ := + +# Dynamic Recompiler (compiled-in) +ifndef DYNAREC + DYNAREC := y + ifeq ($(ARM), y) + DYNAREC := n + endif + ifeq ($(ARM64), y) + DYNAREC := n + endif +endif ifeq ($(DYNAREC), y) OPTS += -DUSE_DYNAREC RFLAGS += -DUSE_DYNAREC @@ -415,20 +296,51 @@ ifeq ($(DYNAREC), y) codegen_timing_winchip.obj $(PLATCG) endif -ifeq ($(VNS), y) +# VNS: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef VNS + VNS := n +endif +ifneq ($(VNS), n) OPTS += -DUSE_VNS + ifeq ($(VNS_PATH), ) + VNS_PATH := $(EXT_PATH)/vns + endif + OPTS += -I$(VNS_PATH)/include + ifeq ($(X64), y) + LIBS += -LIBPATH:$(VNS_PATH)/lib/x64 + else + LIBS += -LIBPATH:$(VNS_PATH)/lib/x86 + endif + ifeq ($(VNS), y) + LIBS += libvns.lib + endif + ifeq ($(VNS), s) + LIBS += libvns_static.lib + endif MISCOBJ += net_vns.obj endif +# OpenAL (always dynamic) +ifndef OPENAL + OPENAL := y +endif ifeq ($(OPENAL), y) OPTS += -DUSE_OPENAL endif +# FluidSynth (always dynamic) +ifndef FLUIDSYNTH + FLUIDSYNTH := y +endif ifeq ($(FLUIDSYNTH), y) OPTS += -DUSE_FLUIDSYNTH MISCOBJ += midi_fluidsynth.obj endif +# MunT (compiled-in) +ifndef MUNT + MUNT := y +endif ifeq ($(MUNT), y) OPTS += -DUSE_MUNT MISCOBJ += midi_mt32.obj \ @@ -440,24 +352,34 @@ ifeq ($(MUNT), y) TVA.obj TVF.obj TVP.obj sha1.obj c_interface.obj endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# SDL: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef SDL + SDL := n +endif ifneq ($(SDL), n) OPTS += -DUSE_SDL - ifneq ($(SDL_PATH), ) - OPTS += -I$(SDL_PATH)/include/msvc -I$(SDL_PATH)/include - ifeq ($(X64), y) - LOPTS += -LIBPATH:$(SDL_PATH)\lib\msvc\x64 - else - LOPTS += -LIBPATH:$(SDL_PATH)\lib\msvc\x86 - endif + ifeq ($(SDL_PATH), ) + SDL_PATH := $(EXT_PATH)/sdl + endif + OPTS += -I$(SDL_PATH)/include + ifeq ($(X64), y) + LIBS += -LIBPATH:$(SDL_PATH)/lib/x64 + else + LIBS += -LIBPATH:$(SDL_PATH)/lib/x86 endif ifeq ($(SDL), y) LIBS += sdl2.lib endif + ifeq ($(SDL), s) + LIBS += sdl2_static.lib + endif SDLOBJ := win_sdl.obj endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# D2D: N=no, Y=yes,linked, D=yes,dynamic +ifndef D2D + D2D := n +endif ifneq ($(D2D), n) ifeq ($(D2D), d) OPTS += -DUSE_D2D=2 @@ -465,11 +387,11 @@ ifneq ($(D2D), n) OPTS += -DUSE_D2D=1 endif ifneq ($(D2D_PATH), ) - OPTS += -I$(D2D_PATH)/include/msvc -I$(D2D_PATH)/include + OPTS += -I$(D2D_PATH)/include ifeq ($(X64), y) - LOPTS += -LIBPATH:$(D2D_PATH)\lib\msvc\x64 + LOPTS += -LIBPATH:$(D2D_PATH)/lib/x64 else - LOPTS += -LIBPATH:$(D2D_PATH)\lib\msvc\x86 + LOPTS += -LIBPATH:$(D2D_PATH)/lib/x86 endif endif ifeq ($(D2D), y) @@ -478,73 +400,123 @@ ifneq ($(D2D), n) D2DOBJ := win_d2d.obj endif +# D3DX (always hard-linked) +ifndef D3DX + D3DX := y + ifeq ($(ARM), y) + D3DX := n + endif + ifeq ($(ARM64), y) + D3DX := n + endif +endif ifeq ($(D3DX), y) -OPTS += -DUSE_D3DX + OPTS += -DUSE_D3DX + LIBS += d3dx9.lib endif +# DINPUT and XInput (always hard-linked) +ifndef DINPUT + DINPUT := y + ifeq ($(ARM), y) + DINPUT := n + endif +endif ifeq ($(DINPUT), y) -OPTS += -DUSE_DINPUT + OPTS += -DUSE_DINPUT + LIBS += dinput8.lib +else + LIBS += xinput.lib endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# VNC: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef VNC + VNC := n +endif ifneq ($(VNC), n) - OPTS += -DUSE_VNC - ifneq ($(VNC_PATH), ) - OPTS += -I$(VNC_PATH)/include/msvc -I$(VNC_PATH)/include - ifeq ($(X64), y) - LOPTS += -LIBPATH:$(VNC_PATH)\lib\x64 - else - LOPTS += -LIBPATH:$(VNC_PATH)\lib\x86 - endif + ifeq ($(VNC), d) + OPTS += -DUSE_VNC=2 + else + OPTS += -DUSE_VNC=1 + endif + ifeq ($(VNC_PATH), ) + VNC_PATH := $(EXT_PATH)/vnc + endif + OPTS += -I$(VNC_PATH)/include + ifeq ($(X64), y) + LIBS += -LIBPATH:$(VNC_PATH)/lib/x64 + else + LIBS += -LIBPATH:$(VNC_PATH)/lib/x86 endif ifeq ($(VNC), y) LIBS += libvncserver.lib endif + ifeq ($(VNC), s) + LIBS += libvncserver_static.lib zlib.lib + endif MISCOBJ += vnc.obj vnc_keymap.obj endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# RDP: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef RDP + RDP := n +endif ifneq ($(RDP), n) - OPTS += -DUSE_RDP - ifneq ($(RDP_PATH), ) - OPTS += -I$(RDP_PATH)/include/msvc -I$(RDP_PATH)/include - ifeq ($(X64), y) - LOPTS += -LIBPATH:$(RDP_PATH)\lib\x64 - else - LOPTS += -LIBPATH:$(RDP_PATH)\lib\x86 - endif + ifeq ($(RDP), d) + OPTS += -DUSE_RDP=2 + else + OPTS += -DUSE_RDP=1 + endif + ifeq ($(RDP_PATH), ) + RDP_PATH := $(EXT_PATH)/rdp + endif + OPTS += -I$(RDP_PATH)/include + ifeq ($(X64), y) + LIBS += -LIBPATH:$(RDP_PATH)/lib/x64 + else + LIBS += -LIBPATH:$(RDP_PATH)/lib/x86 endif ifeq ($(RDP), y) LIBS += rdpsrvr.lib endif + ifeq ($(RDP), s) + LIBS += rdpsrvr_static.lib + endif MISCOBJ += rdp.obj endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# PNG: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +ifndef PNG + PNG := n +endif ifneq ($(PNG), n) ifeq ($(PNG), d) OPTS += -DUSE_LIBPNG=2 else OPTS += -DUSE_LIBPNG=1 endif - ifneq ($(PNG_PATH), ) - OPTS += -I$(PNG_PATH)/include/msvc -I$(PNG_PATH)/include - ifeq ($(X64), y) - LOPTS += -LIBPATH:$(PNG_PATH)\lib\x64 - else - LOPTS += -LIBPATH:$(PNG_PATH)\lib\x86 - endif + ifeq ($(PNG_PATH), ) + PNG_PATH := $(EXT_PATH)/png + endif + OPTS += -I$(PNG_PATH)/include + ifeq ($(X64), y) + LIBS += -LIBPATH:$(PNG_PATH)/lib/x64 + else + LIBS += -LIBPATH:$(PNG_PATH)/lib/x86 endif ifeq ($(PNG), y) LIBS += libpng16_dll.lib #zlib.lib endif + ifeq ($(PNG), s) + LIBS += libpng16.lib zlib.lib + endif MISCOBJ += png.obj endif -# N=no, Y=yes,linked, D=yes,dynamic, S=yes,static +# WX: N=no, Y=yes,linked, D=yes,dynamic, S=yes,static ifneq ($(WX), n) - OPTS += -DUSE_WX $(WX_FLAGS) - LIBS += $(WX_LIBS) -lm + OPTS += -DUSE_WX=$(WX) $(WX_FLAGS) + LIBS += $(WX_LIBS) UIOBJ := wx_main.obj wx_ui.obj wx_stbar.obj wx_render.obj else UIOBJ := win_ui.obj \ @@ -629,6 +601,13 @@ ifeq ($(DEV_BRANCH), y) endif +# Finalize the list of libraries to load. +LIBS += ws2_32.lib wsock32.lib iphlpapi.lib psapi.lib +ifeq ($(DEBUG), y) +LIBS += libcmtd.lib libvcruntimed.lib libucrtd.lib +endif + + # Final versions of the toolchain flags. LDFLAGS := $(LOPTS) CFLAGS := $(WX_FLAGS) $(OPTS) $(COPTS) $(COPTIM) $(DOPTS) $(AFLAGS) diff --git a/src/win/win_d2d.cpp b/src/win/win_d2d.cpp index e6e35c6..b817848 100644 --- a/src/win/win_d2d.cpp +++ b/src/win/win_d2d.cpp @@ -8,10 +8,7 @@ * * Rendering module for Microsoft Direct2D. * - * **NOTE** This module currently does not work when compiled using - * the GCC compiler (MinGW) and when used in dynamic mode. - * - * Version: @(#)win_d2d.cpp 1.0.5 2019/04/28 + * Version: @(#)win_d2d.cpp 1.0.6 2019/04/29 * * Authors: Fred N. van Kempen, * David Hrdlicka, @@ -68,10 +65,8 @@ /* Pointers to the real functions. */ -static HRESULT (*D2D1_CreateFactory)(D2D1_FACTORY_TYPE facType, - REFIID riid, - CONST D2D1_FACTORY_OPTIONS *pFacOptions, - void **ppIFactory); +typedef HRESULT (WINAPI *MyCreateFactory_t)(D2D1_FACTORY_TYPE, REFIID, CONST D2D1_FACTORY_OPTIONS*, void**); +static MyCreateFactory_t D2D1_CreateFactory; static const dllimp_t d2d_imports[] = { { "D2D1CreateFactory", &D2D1_CreateFactory }, @@ -92,6 +87,7 @@ static ID2D1Bitmap *d2d_bitmap; static int d2d_width, d2d_height, d2d_screen_width, d2d_screen_height, d2d_fs; +static int d2d_enabled; static void @@ -199,6 +195,11 @@ d2d_blit(bitmap_t *scr, int x, int y, int y1, int y2, int w, int h) DEBUG("D2D: blit(x=%d, y=%d, y1=%d, y2=%d, w=%d, h=%d)\n", x,y, y1,y2, w,h); + if (! d2d_enabled) { + video_blit_done(); + return; + } + // TODO: Detect double scanned mode and resize render target // appropriately for more clear picture if (w != d2d_width || h != d2d_height) { @@ -333,6 +334,8 @@ d2d_close(void) d2d_handle = NULL; } #endif + + d2d_enabled = 0; } @@ -341,7 +344,8 @@ d2d_init(int fs) { WCHAR title[200]; D2D1_HWND_RENDER_TARGET_PROPERTIES props; - HRESULT hr = S_OK; + D2D1_FACTORY_OPTIONS options; + HRESULT hr; INFO("D2D: init(fs=%d)\n", fs); @@ -356,6 +360,16 @@ d2d_init(int fs) INFO("D2D: module '%s' loaded.\n", PATH_D2D_DLL); #endif + ZeroMemory(&options, sizeof(D2D1_FACTORY_OPTIONS)); + if (FAILED(DLLFUNC(CreateFactory)(D2D1_FACTORY_TYPE_MULTI_THREADED, + __uuidof(ID2D1Factory), + &options, + reinterpret_cast (&d2d_factory)))) { + ERRLOG("D2D: unable to load factory, D2D not available.\n"); + d2d_close(); + return(0); + } + if (fs) { /* * Direct2D seems to lack any proper fullscreen mode, @@ -391,31 +405,24 @@ d2d_init(int fs) props = D2D1::HwndRenderTargetProperties(hwndRender); } - hr = DLLFUNC(CreateFactory)(D2D1_FACTORY_TYPE_MULTI_THREADED, - __uuidof(ID2D1Factory), - NULL, - reinterpret_cast (&d2d_factory)); - if (FAILED(hr)) { - ERRLOG("D2D: unable to load factory, D2D not available.\n"); - d2d_close(); - return(0); - } - hr = d2d_factory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), props, &d2d_hwndRT); - if (SUCCEEDED(hr)) { - // Create a bitmap for storing intermediate data - hr = d2d_hwndRT->CreateBitmap(D2D1::SizeU(2048, 2048), - D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)), - &d2d_bitmap); - } - if (FAILED(hr)) { - ERRLOG("D2D: init: error 0x%08lx\n", hr); + ERRLOG("D2D: unable to create target: error 0x%08lx\n", hr); d2d_close(); return(0); } + // Create a bitmap for storing intermediate data + hr = d2d_hwndRT->CreateBitmap(D2D1::SizeU(2048, 2048), + D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE)), + &d2d_bitmap); + if (FAILED(hr)) { + ERRLOG("D2D: unable to create bitmap: error 0x%08lx\n", hr); + d2d_close(); + return(0); + } + d2d_fs = fs; d2d_width = 0; d2d_height = 0; @@ -426,6 +433,8 @@ d2d_init(int fs) /* Register our renderer! */ video_blit_set(d2d_blit); + d2d_enabled = 1; + return(1); } @@ -456,15 +465,21 @@ d2d_available(void) } +static void +d2d_enable(int yes) +{ + d2d_enabled = yes; +} + + const vidapi_t d2d_vidapi = { "d2d", "Direct 2D", 1, - d2d_init, - d2d_close, - NULL, + d2d_init, d2d_close, NULL, NULL, NULL, + d2d_enable, d2d_screenshot, d2d_available }; diff --git a/src/win/win_d3d.cpp b/src/win/win_d3d.cpp index 5ee90ac..7d0da53 100644 --- a/src/win/win_d3d.cpp +++ b/src/win/win_d3d.cpp @@ -8,7 +8,7 @@ * * Rendering module for Microsoft Direct3D 9. * - * Version: @(#)win_d3d.cpp 1.0.16 2019/04/07 + * Version: @(#)win_d3d.cpp 1.0.17 2019/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -69,6 +69,7 @@ static HWND d3d_hwnd; static HWND d3d_device_window; static int d3d_w, d3d_h; +static int is_enabled; static CUSTOMVERTEX d3d_verts[] = { { 0.0f, 0.0f, 1.0f, 1.0f, 0xffffff, 0.0f, 0.0f}, @@ -193,6 +194,11 @@ d3d_blit_fs(bitmap_t *scr, int x, int y, int y1, int y2, int w, int h) int yy; double l = 0, t = 0, r = 0, b = 0; + if (! is_enabled) { + video_blit_done(); + return; + } + if ((y1 == y2) || (h <= 0)) { video_blit_done(); return; /*Nothing to do*/ @@ -306,6 +312,11 @@ d3d_blit(bitmap_t *b, int x, int y, int y1, int y2, int w, int h) RECT r; int yy; + if (! is_enabled) { + video_blit_done(); + return; + } + if ((y1 == y2) || (h <= 0)) { video_blit_done(); return; /*Nothing to do*/ @@ -470,6 +481,8 @@ d3d_close(void) DestroyWindow(d3d_device_window); d3d_device_window = NULL; } + + is_enabled = 0; } @@ -589,6 +602,8 @@ d3d_init(int fs) else video_blit_set(d3d_blit); + is_enabled = 1; + return(1); } @@ -605,6 +620,13 @@ d3d_resize(int x, int y) } +static void +d3d_enable(int yes) +{ + is_enabled = yes; +} + + static void d3d_screenshot(const wchar_t *fn) { @@ -629,11 +651,10 @@ const vidapi_t d3d_vidapi = { "d3d", "DirectDraw 3D", 1, - d3d_init, - d3d_close, - d3d_reset, + d3d_init, d3d_close, d3d_reset, d3d_resize, NULL, + d3d_enable, d3d_screenshot, NULL }; diff --git a/src/win/win_ddraw.cpp b/src/win/win_ddraw.cpp index 28fb346..43465c8 100644 --- a/src/win/win_ddraw.cpp +++ b/src/win/win_ddraw.cpp @@ -8,7 +8,7 @@ * * Rendering module for Microsoft DirectDraw 9. * - * Version: @(#)win_ddraw.cpp 1.0.20 2019/04/27 + * Version: @(#)win_ddraw.cpp 1.0.21 2019/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -63,6 +63,7 @@ static LPDIRECTDRAWCLIPPER lpdd_clipper = NULL; static HWND ddraw_hwnd; static int ddraw_w, ddraw_h, xs, ys, ys2; +static int is_enabled; static const char * @@ -253,6 +254,11 @@ ddraw_blit_fs(bitmap_t *scr, int x, int y, int y1, int y2, int w, int h) HRESULT hr; int yy; + if (! is_enabled) { + video_blit_done(); + return; + } + if ((lpdds_back == NULL) || (y1 == y2) || (h <= 0)) { video_blit_done(); return; @@ -327,6 +333,11 @@ ddraw_blit(bitmap_t *scr, int x, int y, int y1, int y2, int w, int h) POINT po; int yy; + if (! is_enabled) { + video_blit_done(); + return; + } + if ((lpdds_back == NULL) || (y1 == y2) || (h <= 0)) { video_blit_done(); return; @@ -418,6 +429,8 @@ ddraw_close(void) lpdd4->Release(); lpdd4 = NULL; } + + is_enabled = 0; } @@ -562,10 +575,19 @@ ddraw_init(int fs) else video_blit_set(ddraw_blit); + is_enabled = 1; + return(1); } +static void +ddraw_enable(int yes) +{ + is_enabled = yes; +} + + static int SaveBMP(const wchar_t *fn, BITMAPINFO *bmi, uint8_t *pixels) { @@ -753,11 +775,10 @@ const vidapi_t ddraw_vidapi = { "ddraw", "DirectDraw 9+", 1, - ddraw_init, - ddraw_close, - NULL, + ddraw_init, ddraw_close, NULL, NULL, NULL, + ddraw_enable, ddraw_screenshot, NULL }; diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 23bf9a8..46918c6 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -12,7 +12,7 @@ * we will not use that, but, instead, use a new window which * coverrs the entire desktop. * - * Version: @(#)win_sdl.c 1.0.9 2019/04/27 + * Version: @(#)win_sdl.c 1.0.10 2019/04/29 * * Authors: Fred N. van Kempen, * Michael Drüing, @@ -90,6 +90,7 @@ static HWND sdl_parent_hwnd = NULL; static int sdl_w, sdl_h; static int cur_w, cur_h; static int sdl_fs; +static int is_enabled; /* Pointers to the real functions. */ @@ -255,6 +256,11 @@ sdl_blit(bitmap_t *scr, int x, int y, int y1, int y2, int w, int h) int xx, yy, ret; int pitch; + if (! is_enabled) { + video_blit_done(); + return; + } + if ((y1 == y2) || (scr == NULL)) { video_blit_done(); return; @@ -344,6 +350,8 @@ sdl_close(void) dynld_close(sdl_handle); sdl_handle = NULL; } + + is_enabled = 0; } @@ -462,6 +470,8 @@ sdl_init(int fs) /* Register our renderer! */ video_blit_set(sdl_blit); + is_enabled = 1; + return(1); } @@ -520,15 +530,21 @@ sdl_available(void) } +static void +sdl_enable(int yes) +{ + is_enabled = yes; +} + + const vidapi_t sdl_vidapi = { "sdl", "SDL2", 1, - sdl_init, - sdl_close, - NULL, + sdl_init, sdl_close, NULL, sdl_resize, NULL, + sdl_enable, sdl_screenshot, sdl_available }; diff --git a/src/win/win_ui.c b/src/win/win_ui.c index e924ffe..ddc0375 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -8,7 +8,7 @@ * * Implement the user Interface module. * - * Version: @(#)win_ui.c 1.0.35 2019/04/26 + * Version: @(#)win_ui.c 1.0.36 2019/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -86,6 +86,7 @@ static HMENU menuMain = NULL, /* application menu bar */ *sb_menu = NULL; static int sb_nparts = 0; static const sbpart_t *sb_parts = NULL; +static int minimized = 0; static int infocus = 1; static int hook_enabled = 0; static int save_window_pos = 0; @@ -422,11 +423,23 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) x += cruft_x; y += (cruft_y + cruft_sb); } - y -= cruft_sb; + + if ((x <= 0) || (y <= 0)) { + minimized = 1; + break; + } else if (minimized == 1) { + minimized = 0; + video_force_resize_set(1); + } + + /* Disable the renderer for now. */ + vidapi_enable(0); /* Request a re-size if needed. */ if ((x != scrnsz_x) || (y != scrnsz_y)) doresize = 1; + y -= cruft_sb; + /* Set the new panel size. */ scrnsz_x = x; scrnsz_y = y; @@ -442,6 +455,9 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) /* Update the renderer if needed. */ vidapi_resize(scrnsz_x, scrnsz_y); + /* OK, safe to enable the renderer again. */ + vidapi_enable(1); + /* Re-clip the mouse area if needed. */ if (mouse_capture) { GetWindowRect(hwndRender, &rect);