From c1abfe236200c3bba14d1b28c09ec95387a89dec Mon Sep 17 00:00:00 2001 From: waltje Date: Sat, 14 Oct 2017 20:04:21 -0400 Subject: [PATCH] Another cleanup. VNC now has fixed blitters, so 8bit cards (vga,mda,herc et al) work. More cleanups with the %ls stuff, cleanup of threads modules, and MOVED THE MAKEFILE to win/. --- src/Makefile.local | 4 +- src/disk/hdc_mfm_at.c | 4 +- src/floppy/floppy_json.c | 4 +- src/intel_flash.c | 4 +- src/network/net_slirp.c | 4 +- src/nvr.c | 6 +- src/pc.c | 6 +- src/plat.h | 17 ++--- src/rom.c | 8 +-- src/scsi/scsi.c | 5 +- src/ui.h | 4 +- src/video/vid_table.c | 4 +- src/win/86Box.rc | 6 +- src/{ => win}/Makefile.mingw | 39 ++++++----- src/{ => win}/Makefile.mingw64 | 0 src/win/win.c | 12 ++-- src/win/win_thread.c | 89 ++++++++++-------------- src/win/win_vnc.c | 120 ++++++++++++++++++--------------- 18 files changed, 169 insertions(+), 167 deletions(-) rename src/{ => win}/Makefile.mingw (95%) rename src/{ => win}/Makefile.mingw64 (100%) diff --git a/src/Makefile.local b/src/Makefile.local index ef8d44b12..6f0df2aa8 100644 --- a/src/Makefile.local +++ b/src/Makefile.local @@ -10,7 +10,7 @@ # settings, so we can avoid changing the main one for all of # our local setups. # -# Version: @(#)Makefile.local 1.0.3 2017/09/25 +# Version: @(#)Makefile.local 1.0.4 2017/10/14 # # Author: Fred N. van Kempen, # @@ -36,7 +36,7 @@ EXTRAS := #-DYOURNAME ######################################################################### # Include the master Makefile.MinGW for the rest. # ######################################################################### -include Makefile.mingw +include win/Makefile.mingw # End of Makefile.local. diff --git a/src/disk/hdc_mfm_at.c b/src/disk/hdc_mfm_at.c index 53bfcc4d1..11d77373e 100644 --- a/src/disk/hdc_mfm_at.c +++ b/src/disk/hdc_mfm_at.c @@ -12,7 +12,7 @@ * based design. Most cards were WD1003-WA2 or -WAH, where the * -WA2 cards had a floppy controller as well (to save space.) * - * Version: @(#)hdd_mfm_at.c 1.0.7 2017/10/11 + * Version: @(#)hdd_mfm_at.c 1.0.8 2017/10/14 * * Authors: Sarah Walker, * Fred N. van Kempen, @@ -719,7 +719,7 @@ mfm_init(device_t *info) if ((hdd[d].bus == HDD_BUS_MFM) && (hdd[d].mfm_channel < MFM_NUM)) { loadhd(mfm, hdd[d].mfm_channel, d, hdd[d].fn); - pclog("WD1003(%d): (%S) geometry %d/%d/%d\n", c, hdd[d].fn, + pclog("WD1003(%d): (%ls) geometry %d/%d/%d\n", c, hdd[d].fn, (int)hdd[d].tracks, (int)hdd[d].hpc, (int)hdd[d].spt); if (++c >= MFM_NUM) break; diff --git a/src/floppy/floppy_json.c b/src/floppy/floppy_json.c index 57c6dfde9..495269799 100644 --- a/src/floppy/floppy_json.c +++ b/src/floppy/floppy_json.c @@ -8,7 +8,7 @@ * * Implementation of the PCjs JSON floppy image format. * - * Version: @(#)floppy_json.c 1.0.6 2017/10/12 + * Version: @(#)floppy_json.c 1.0.7 2017/10/14 * * Author: Fred N. van Kempen, * @@ -496,7 +496,7 @@ json_load(int drive, wchar_t *fn) return; } - pclog("JSON(%d): %S (%i tracks, %i sides, %i sectors)\n", + pclog("JSON(%d): %ls (%i tracks, %i sides, %i sectors)\n", drive, fn, img->tracks, img->sides, img->spt[0][0]); /* diff --git a/src/intel_flash.c b/src/intel_flash.c index 933a62dda..7da82f2ac 100644 --- a/src/intel_flash.c +++ b/src/intel_flash.c @@ -8,7 +8,7 @@ * * Implementation of the Intel 2 Mbit 8-bit flash devices. * - * Version: @(#)intel_flash.c 1.0.7 2017/10/12 + * Version: @(#)intel_flash.c 1.0.8 2017/10/14 * * Authors: Sarah Walker, * Miran Grca, @@ -198,7 +198,7 @@ void *intel_flash_init(uint8_t type) wcscpy(flash_path, flash_name); - pclog("Flash path: %S\n", flash_name); + pclog("Flash path: %ls\n", flash_name); flash->flash_id = (type & FLASH_IS_BXB) ? 0x95 : 0x94; flash->invert_high_pin = (type & FLASH_INVERT); diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 2e4cf3e6c..cbcf53069 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -8,7 +8,7 @@ * * Handle SLiRP library processing. * - * Version: @(#)net_slirp.c 1.0.8 2017/10/11 + * Version: @(#)net_slirp.c 1.0.9 2017/10/14 * * Author: Fred N. van Kempen, * @@ -32,7 +32,7 @@ static queueADT slirpq; /* SLiRP library handle */ static thread_t *poll_tid; static NETRXCB poll_rx; /* network RX function to call */ static void *poll_arg; /* network RX function arg */ -static void *slirpMutex; +static mutex_t *slirpMutex; diff --git a/src/nvr.c b/src/nvr.c index 1ed9b8e6c..dea2717ef 100644 --- a/src/nvr.c +++ b/src/nvr.c @@ -186,7 +186,7 @@ * (DS12887A) which implemented a "century" register to be * compatible with Y2K. * - * Version: @(#)nvr.c 1.0.8 2017/10/12 + * Version: @(#)nvr.c 1.0.9 2017/10/14 * * Authors: Sarah Walker, * Miran Grca, @@ -680,7 +680,7 @@ nvr_load(void) /* We are responsible for loading. */ f = NULL; if (saved_nvr->mask != 0) { - pclog("Opening NVR file: %S...\n", saved_nvr->fname); + pclog("Opening NVR file: %ls...\n", saved_nvr->fname); f = plat_fopen(nvr_path(saved_nvr->fname), L"rb"); } @@ -723,7 +723,7 @@ nvr_save(void) /* We are responsible for saving. */ f = NULL; if (saved_nvr->mask != 0) { - pclog("Saving NVR file: %S...\n", saved_nvr->fname); + pclog("Saving NVR file: %ls...\n", saved_nvr->fname); f = plat_fopen(nvr_path(saved_nvr->fname), L"wb"); } diff --git a/src/pc.c b/src/pc.c index 1e6a69bf3..55513bf40 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Emulation core dispatcher. * - * Version: @(#)pc.c 1.0.25 2017/10/14 + * Version: @(#)pc.c 1.0.26 2017/10/14 * * Authors: Sarah Walker, * Miran Grca, @@ -250,7 +250,7 @@ usage: */ /* Make sure cfg_path has a trailing backslash. */ - pclog("exe_path=%S\n", exe_path); + pclog("exe_path=%ls\n", exe_path); if ((cfg_path[wcslen(cfg_path)-1] != L'\\') && (cfg_path[wcslen(cfg_path)-1] != L'/')) { #ifdef WIN32 @@ -259,7 +259,7 @@ usage: wcscat(cfg_path, L"/"); #endif } - pclog("cfg_path=%S\n", cfg_path); + pclog("cfg_path=%ls\n", cfg_path); if (cfg != NULL) { /* diff --git a/src/plat.h b/src/plat.h index 0ab9b6c4c..1e0d0a9e9 100644 --- a/src/plat.h +++ b/src/plat.h @@ -8,7 +8,7 @@ * * Define the various platform support functions. * - * Version: @(#)plat.h 1.0.6 2017/10/13 + * Version: @(#)plat.h 1.0.7 2017/10/14 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -33,7 +33,7 @@ extern void plat_remove(wchar_t *path); extern int plat_getcwd(wchar_t *bufp, int max); extern int plat_chdir(wchar_t *path); extern void get_executable_name(wchar_t *s, int size); -extern void set_window_title(wchar_t *s); +extern wchar_t *set_window_title(wchar_t *s); extern int dir_check_exist(wchar_t *path); extern int dir_create(wchar_t *path); @@ -74,22 +74,23 @@ extern void ioctl_close(uint8_t id); /* Thread support. */ typedef void thread_t; typedef void event_t; +typedef void mutex_t; extern thread_t *thread_create(void (*thread_rout)(void *param), void *param); extern void thread_kill(thread_t *handle); +extern void thread_sleep(int t); + extern event_t *thread_create_event(void); extern void thread_set_event(event_t *event); extern void thread_reset_event(event_t *_event); extern int thread_wait_event(event_t *event, int timeout); extern void thread_destroy_event(event_t *_event); -extern void thread_sleep(int t); - -extern void *thread_create_mutex(wchar_t *name); -extern void thread_close_mutex(void *mutex); -extern uint8_t thread_wait_mutex(void *mutex); -extern uint8_t thread_release_mutex(void *mutex); +extern mutex_t *thread_create_mutex(wchar_t *name); +extern void thread_close_mutex(mutex_t *mutex); +extern int thread_wait_mutex(mutex_t *mutex); +extern int thread_release_mutex(mutex_t *mutex); /* Other stuff. */ diff --git a/src/rom.c b/src/rom.c index 7d48e4820..cc7bf154a 100644 --- a/src/rom.c +++ b/src/rom.c @@ -13,7 +13,7 @@ * - c386sx16 BIOS fails checksum * - the loadfont() calls should be done elsewhere * - * Version: @(#)rom.c 1.0.10 2017/10/12 + * Version: @(#)rom.c 1.0.11 2017/10/14 * * Authors: Sarah Walker, * Miran Grca, @@ -135,7 +135,7 @@ rom_load_linear(wchar_t *fn, uint32_t addr, int sz, int off, uint8_t *ptr) FILE *f = rom_fopen(fn, L"rb"); if (f == NULL) { - pclog("ROM: image '%S' not found\n", fn); + pclog("ROM: image '%ls' not found\n", fn); return(0); } @@ -166,9 +166,9 @@ rom_load_interleaved(wchar_t *fnl, wchar_t *fnh, uint32_t addr, int sz, int off, int c; if (fl == NULL || fh == NULL) { - if (fl == NULL) pclog("ROM: image '%S' not found\n", fnl); + if (fl == NULL) pclog("ROM: image '%ls' not found\n", fnl); else (void)fclose(fl); - if (fh == NULL) pclog("ROM: image '%S' not found\n", fnh); + if (fh == NULL) pclog("ROM: image '%ls' not found\n", fnh); else (void)fclose(fh); return(0); diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index 2a3891ef2..1701f88a3 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -8,11 +8,12 @@ * * Handling of the SCSI controllers. * - * Version: @(#)scsi.c 1.0.9 2017/10/10 + * Version: @(#)scsi.c 1.0.10 2017/10/14 * * Authors: TheCollector1995, * Miran Grca, * Fred N. van Kempen, + * * Copyright 2016,2017 Miran Grca. * Copyright 2017 Fred N. van Kempen. */ @@ -48,7 +49,7 @@ int scsi_card_current = 0; int scsi_card_last = 0; uint32_t SCSI_BufferLength; -void *scsiMutex; +mutex_t *scsiMutex; typedef struct { diff --git a/src/ui.h b/src/ui.h index 9dc9c688e..6b32fd7d4 100644 --- a/src/ui.h +++ b/src/ui.h @@ -8,7 +8,7 @@ * * Define the various UI functions. * - * Version: @(#)ui.h 1.0.2 2017/10/12 + * Version: @(#)ui.h 1.0.3 2017/10/14 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -28,7 +28,7 @@ extern "C" { #ifdef WIN32 # include "win/resource.h" #else -# include "linux/strings.h" +# include "lnx/strings.h" #endif diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 470a82abd..02b06a201 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -8,7 +8,7 @@ * * Define all known video cards. * - * Version: @(#)vid_table.c 1.0.1 2017/10/10 + * Version: @(#)vid_table.c 1.0.2 2017/10/14 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -135,7 +135,7 @@ video_cards[] = { {"[PCI] S3 ViRGE/DX", "virge375_pci", &s3_virge_375_pci_device, GFX_VIRGEDX_PCI }, {"[PCI] S3 ViRGE/DX (VBE 2.0)", "virge375_vbe20_pci", &s3_virge_375_4_pci_device, GFX_VIRGEDX4_PCI }, {"[PCI] Trident TGUI9440", "tgui9440_pci", &tgui9440_pci_device, GFX_TGUI9440_PCI }, - {"", "", NULL, 0 } + {"", "", NULL, -1 } }; diff --git a/src/win/86Box.rc b/src/win/86Box.rc index ba60ae9ff..b784f3323 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -8,7 +8,7 @@ * * Windows resource script. * - * Version: @(#)86Box.rc 1.0.16 2017/10/12 + * Version: @(#)86Box.rc 1.0.17 2017/10/14 * * Authors: Miran Grca, * Fred N. van Kempen, @@ -823,7 +823,7 @@ BEGIN IDS_2155 "IRQ %i" IDS_2156 "%" PRIu64 IDS_2157 "%" PRIu64 " MB (CHS: %" PRIu64 ", %" PRIu64 ", %" PRIu64 ")" - IDS_2158 "Floppy %i (%s): %S" + IDS_2158 "Floppy %i (%s): %ls" IDS_2159"All floppy images (*.0??;*.12;*.144;*.360;*.720;*.86F;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.JSON;*.TD0;*.VFD;*.XDF)\0*.0??;*.12;*.144;*.360;*.720;*.86F;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.JSON;*.TD0;*.VFD;*.XDF\0Advanced sector-based images (*.IMD;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector-based images (*.0??;*.12;*.144;*.360;*.720;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMG;*.JSON;*.VFD;*.XDF)\0*.0??;*.12;*.144;*.360;*.720;*.BIN;*.CQ;*.CQM;*.DSK;*.FDI;*.FDF;*.FLP;*.HDM;*.IMA;*.IMG;*.JSON;*.VFD;*.XDF\0Flux images (*.FDI)\0*.FDI\0Surface-based images (*.86F)\0*.86F\0All files (*.*)\0*.*\0" IDS_2160 "Configuration files (*.CFG)\0*.CFG\0All files (*.*)\0*.*\0" IDS_2161 "&New image..." @@ -869,7 +869,7 @@ BEGIN IDS_4112 "Please enter a valid file name" IDS_4113 "Remember to partition and format the new drive" IDS_4114 "MFM/RLL or ESDI CD-ROM drives never existed" - IDS_4115 "Removable disk %i (SCSI): %S" + IDS_4115 "Removable disk %i (SCSI): %ls" IDS_4352 "MFM/RLL" IDS_4353 "XT IDE" diff --git a/src/Makefile.mingw b/src/win/Makefile.mingw similarity index 95% rename from src/Makefile.mingw rename to src/win/Makefile.mingw index 8c75e9428..65fa7c18b 100644 --- a/src/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -8,7 +8,7 @@ # # Makefile for Win32 (MinGW32) environment. # -# Version: @(#)Makefile.mingw 1.0.61 2017/10/14 +# Version: @(#)Makefile.mingw 1.0.62 2017/10/14 # # Authors: Miran Grca, # Fred N. van Kempen, @@ -122,6 +122,7 @@ CC := gcc -m32 endif WINDRES := windres DEPS = -MMD -MF $*.d -c $< +DEPFILE := win/.depends # Set up the correct toolchain flags. OPTS := -DWIN32 $(EXTRAS) $(STUFF) @@ -204,17 +205,22 @@ endif ifeq ($(VNC), y) CFLAGS += -DUSE_VNC RFLAGS += -DUSE_VNC -CFLAGS += -I$(VNC_PATH)\INCLUDE -# VNCLIB := $(VNC_PATH)\LIB\libvncserver.a -VNCLIB := -lvncserver + ifneq ($(VNC_PATH), ) + CFLAGS += -I$(VNC_PATH)\INCLUDE + VNCLIB := -L$(VNC_PATH)\LIB + endif +VNCLIB += -lvncserver VNCOBJ := win_vnc.o endif ifeq ($(RDP), y) CFLAGS += -DUSE_RDP RFLAGS += -DUSE_RDP -CFLAGS += -I$(RDP_PATH)\INCLUDE -RDPLIB := $(RDP_PATH)\LIB\librdp.a + ifneq ($(RDP_PATH), ) + CFLAGS += -I$(RDP_PATH)\INCLUDE + RDPLIB := -L$(RDP_PATH)\LIB + endif +RDPLIB += -lrdp RDPOBJ := win_rdp.o endif @@ -241,6 +247,7 @@ ifeq ($(PAS16), y) CFLAGS += -DUSE_PAS16 DEVBROBJ += snd_pas16.o endif + endif @@ -483,27 +490,27 @@ endif clean: @echo Cleaning objects.. - @-rm *.o 2>NUL - @-rm *.res 2>NUL + @-rm -f *.o 2>NUL + @-rm -f *.res 2>NUL clobber: clean @echo Cleaning executables.. - @-rm *.d 2>NUL - @-rm *.exe 2>NUL -# @-rm *.depends 2>NUL + @-rm -f *.d 2>NUL + @-rm -f *.exe 2>NUL +# @-rm -f $(DEPFILE) 2>NUL ifneq ($(AUTODEP), y) depclean: - @-rm -f .depends 2>NUL + @-rm -f $(DEPFILE) 2>NUL @echo Creating dependencies.. - @echo # Run "make depends" to re-create this file. >.depends + @echo # Run "make depends" to re-create this file. $(DEPFILE) depends: DEPOBJ=$(OBJ:%.o=%.d) depends: depclean $(OBJ:%.o=%.d) - @-cat $(DEPOBJ) >>.depends + @-cat $(DEPOBJ) >>$(DEPFILE) @-rm -f $(DEPOBJ) -.depends: +$(DEPFILE): endif @@ -512,7 +519,7 @@ ifeq ($(AUTODEP), y) #-include $(OBJ:%.o=%.d) (better, but sloooowwwww) -include *.d else -include $(wildcard .depends) +include $(wildcard $(DEPFILE)) endif diff --git a/src/Makefile.mingw64 b/src/win/Makefile.mingw64 similarity index 100% rename from src/Makefile.mingw64 rename to src/win/Makefile.mingw64 diff --git a/src/win/win.c b/src/win/win.c index 633dc408c..ab12e005d 100644 --- a/src/win/win.c +++ b/src/win/win.c @@ -8,7 +8,7 @@ * * The Emulator's Windows core. * - * Version: @(#)win.c 1.0.23 2017/10/13 + * Version: @(#)win.c 1.0.24 2017/10/14 * * Authors: Sarah Walker, * Miran Grca, @@ -1403,7 +1403,7 @@ get_executable_name(wchar_t *s, int size) } -void +wchar_t * set_window_title(wchar_t *s) { if (! video_fullscreen) { @@ -1414,6 +1414,8 @@ set_window_title(wchar_t *s) SetWindowText(hwndMain, s); } + + return(s); } @@ -1590,7 +1592,7 @@ take_screenshot(void) ddraw_fs_take_screenshot(path); else ddraw_take_screenshot(path); - pclog("Screenshot: fn='%S'\n", path); + pclog("Screenshot: fn='%ls'\n", path); break; case 1: /* d3d9 */ @@ -1600,7 +1602,7 @@ take_screenshot(void) d3d_fs_take_screenshot(path); else d3d_take_screenshot(path); - pclog("Screenshot: fn='%S'\n", path); + pclog("Screenshot: fn='%ls'\n", path); break; #ifdef USE_VNC @@ -1608,7 +1610,7 @@ take_screenshot(void) wcsftime(fn, 128, L"%Y%m%d_%H%M%S.png", info); append_filename_w(path, cfg_path, fn, 1024); vnc_take_screenshot(path); - pclog("Screenshot: fn='%S'\n", path); + pclog("Screenshot: fn='%ls'\n", path); break; #endif } diff --git a/src/win/win_thread.c b/src/win/win_thread.c index cefec74f7..db8afc75e 100644 --- a/src/win/win_thread.c +++ b/src/win/win_thread.c @@ -8,7 +8,7 @@ * * Implement threads and mutexes for the Win32 platform. * - * Version: @(#)win_thread.c 1.0.2 2017/10/10 + * Version: @(#)win_thread.c 1.0.3 2017/10/14 * * Authors: Sarah Walker, * Fred N. van Kempen, @@ -46,9 +46,7 @@ thread_create(void (*thread_rout)(void *param), void *param) void thread_kill(void *handle) { - if (handle == NULL) { - return; - } + if (handle == NULL) return; TerminateThread(handle, 0); } @@ -64,117 +62,98 @@ thread_sleep(int t) event_t * thread_create_event(void) { - win_event_t *event = malloc(sizeof(win_event_t)); + win_event_t *ev = malloc(sizeof(win_event_t)); - event->handle = CreateEvent(NULL, FALSE, FALSE, NULL); + ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL); - return((event_t *)event); + return((event_t *)ev); } void -thread_set_event(event_t *_event) +thread_set_event(event_t *arg) { - if (_event == NULL) { - return; - } + win_event_t *ev = (win_event_t *)arg; - win_event_t *event = (win_event_t *)_event; + if (arg == NULL) return; - SetEvent(event->handle); + SetEvent(ev->handle); } void -thread_reset_event(event_t *_event) +thread_reset_event(event_t *arg) { - if (_event == NULL) { - return; - } + win_event_t *ev = (win_event_t *)arg; - win_event_t *event = (win_event_t *)_event; + if (arg == NULL) return; - ResetEvent(event->handle); + ResetEvent(ev->handle); } int -thread_wait_event(event_t *_event, int timeout) +thread_wait_event(event_t *arg, int timeout) { - if (_event == NULL) { - return 0; - } + win_event_t *ev = (win_event_t *)arg; - win_event_t *event = (win_event_t *)_event; + if (arg == NULL) return(0); if (timeout == -1) timeout = INFINITE; - if (WaitForSingleObject(event->handle, timeout)) return(1); + if (WaitForSingleObject(ev->handle, timeout)) return(1); return(0); } void -thread_destroy_event(event_t *_event) +thread_destroy_event(event_t *arg) { - win_event_t *event = (win_event_t *)_event; + win_event_t *ev = (win_event_t *)arg; - if (_event == NULL) { - return; - } + if (arg == NULL) return; - CloseHandle(event->handle); + CloseHandle(ev->handle); - free(event); + free(ev); } -void * +mutex_t * thread_create_mutex(wchar_t *name) { - return((void*)CreateMutex(NULL, FALSE, name)); + return((mutex_t*)CreateMutex(NULL, FALSE, name)); } void -thread_close_mutex(void *mutex) +thread_close_mutex(mutex_t *mutex) { - if (mutex == NULL) { - return; - } + if (mutex == NULL) return; CloseHandle((HANDLE)mutex); } -uint8_t -thread_wait_mutex(void *mutex) +int +thread_wait_mutex(mutex_t *mutex) { - if (mutex == NULL) { - return 0; - } + if (mutex == NULL) return(0); DWORD dwres = WaitForSingleObject((HANDLE)mutex, INFINITE); - switch (dwres) { - case WAIT_OBJECT_0: - return(1); + if (dwres == WAIT_OBJECT_0) return(1); - case WAIT_ABANDONED: - default: - return(0); - } + return(0); } -uint8_t -thread_release_mutex(void *mutex) +int +thread_release_mutex(mutex_t *mutex) { - if (mutex == NULL) { - return 0; - } + if (mutex == NULL) return(0); return(!!ReleaseMutex((HANDLE)mutex)); } diff --git a/src/win/win_vnc.c b/src/win/win_vnc.c index 8f4048ee6..3ef79e3ce 100644 --- a/src/win/win_vnc.c +++ b/src/win/win_vnc.c @@ -6,12 +6,12 @@ * * This file is part of the 86Box distribution. * - * Implement the VNC renderer. + * Implement the VNC renderer with LibVNCServer. * - * Version: @(#)win_vnc.c 1.0.2 2017/10/13 + * Version: @(#)win_vnc.c 1.0.2 2017/10/14 * - * Authors: RichardG, - * Fred N. van Kempen, + * Authors: Fred N. van Kempen, + * Based on raw code by RichardG, * * Copyright 2017 Fred N. van Kempen. */ @@ -30,11 +30,8 @@ #include "win_vnc.h" -extern void video_blit_complete(void); - - -static rfbScreenInfoPtr rfbScreen; -static int vnc_clients; +static rfbScreenInfoPtr rfb = NULL; +static int clients; static int updatingSize; static int allowedX, allowedY; @@ -115,13 +112,12 @@ vnc_clientgone(rfbClientPtr cl) { pclog("VNC: client disconnected: %s\n", cl->host); - if (vnc_clients > 0) - vnc_clients--; - if (vnc_clients == 0) { + if (clients > 0) + clients--; + if (clients == 0) { /* No more clients, pause the emulator. */ - plat_pause(1); - pclog("VNC: no clients, pausing..\n"); + plat_pause(1); } } @@ -133,7 +129,7 @@ vnc_newclient(rfbClientPtr cl) cl->clientGoneHook = vnc_clientgone; pclog("VNC: new client: %s\n", cl->host); - if (++vnc_clients == 1) { + if (++clients == 1) { /* We now have clients, un-pause the emulator. */ pclog("VNC: unpausing..\n"); plat_pause(0); @@ -149,13 +145,11 @@ vnc_display(rfbClientPtr cl) /* Avoid race condition between resize and update. */ if (!updatingSize && cl->newFBSizePending) { updatingSize = 1; - pclog("VNC: updatingSize=1\n"); } else if (updatingSize && !cl->newFBSizePending) { updatingSize = 0; - pclog("VNC: updatingSize=0\n"); - allowedX = rfbScreen->width; - allowedY = rfbScreen->height; + allowedX = rfb->width; + allowedY = rfb->height; } } @@ -196,35 +190,51 @@ vnc_kbdevent(rfbBool down, rfbKeySym k, rfbClientPtr cl) static void -vnc_memtoscreen(int x, int y, int y1, int y2, int w, int h) +vnc_blit(int x, int y, int y1, int y2, int w, int h) { - int yy, i; + uint32_t *p; + int yy; + + for (yy=y1; yyframeBuffer)[yy*2048]); - /* y1 to = 0 && (y+yy) < 2048) - memcpy((uint32_t *) &(((uint8_t *) rfbScreen->frameBuffer)[yy*2048*4]), &(((uint32_t *)buffer32->line[y+yy])[x]), w*4); + memcpy(p, &(((uint32_t *)buffer32->line[y+yy])[x]), w*4); } video_blit_complete(); if (! updatingSize) - rfbMarkRectAsModified(rfbScreen, 0,0, allowedX,allowedY); + rfbMarkRectAsModified(rfb, 0,0, allowedX,allowedY); } static void -vnc_memtoscreen_8(int x, int y, int w, int h) +vnc_blit8(int x, int y, int w, int h) { -#if 1 - pclog("VNC: memtoscreen_8 %i,%i %i,%i\n", x, y, w, h); -#endif + uint32_t *p; + int xx, yy; + + for (yy = 0; yy < h; yy++) { + p = (uint32_t *)&(((uint32_t *)rfb->frameBuffer)[yy*2048]); + + if ((y+yy) >= 0 && (y+yy) < buffer->h) { + for (xx=0; xxline[y+yy][x+xx]]; + } + } + + video_blit_complete(); + + if (! updatingSize) + rfbMarkRectAsModified(rfb, 0,0, x+w,y+h); } int vnc_init(HWND h) { + static char title[128]; rfbPixelFormat rpf = { /* * Screen format: @@ -238,34 +248,32 @@ vnc_init(HWND h) 32, 32, 0, 1, 255,255,255, 16, 8, 0, 0, 0 }; - if (rfbScreen == NULL) { + if (rfb == NULL) { + wcstombs(title, set_window_title(NULL), sizeof(title)); updatingSize = 0; allowedX = allowedY = 2048; - rfbScreen = rfbGetScreen(0, NULL, 2048, 2048, 8, 3, 4); - rfbScreen->desktopName = "86Box"; - rfbScreen->frameBuffer = (char *)malloc(2048 * 2048 * 4); + rfb = rfbGetScreen(0, NULL, 2048, 2048, 8, 3, 4); + rfb->desktopName = title; + rfb->frameBuffer = (char *)malloc(2048 * 2048 * 4); -#if 1 - rfbScreen->serverFormat = rpf; -#else - rfbScreen->serverFormat = {32, 32, 0, 1, 255,255,255, 16, 8, 0, 0, 0}; -#endif - rfbScreen->alwaysShared = TRUE; - rfbScreen->displayHook = vnc_display; - rfbScreen->kbdAddEvent = vnc_kbdevent; - rfbScreen->newClientHook = vnc_newclient; + rfb->serverFormat = rpf; + rfb->alwaysShared = TRUE; + rfb->displayHook = vnc_display; + rfb->kbdAddEvent = vnc_kbdevent; + rfb->newClientHook = vnc_newclient; - rfbInitServer(rfbScreen); + rfbInitServer(rfb); - rfbRunEventLoop(rfbScreen, -1, TRUE); + rfbRunEventLoop(rfb, -1, TRUE); } - video_setblit(vnc_memtoscreen_8, vnc_memtoscreen); + /* Set up our BLIT handlers. */ + video_setblit(vnc_blit8, vnc_blit); pclog("VNC: init complete.\n"); - vnc_clients = 0; + clients = 0; return(1); } @@ -281,17 +289,21 @@ vnc_close(void) void vnc_resize(int x, int y) { - if ((x != rfbScreen->width || y != rfbScreen->height) && x > 160 && y > 0) { + rfbClientIteratorPtr iterator; + rfbClientPtr cl; + + if (rfb == NULL) return; + + if ((x != rfb->width || y != rfb->height) && x > 160 && y > 0) { pclog("VNC: updating resolution: %dx%d\n", x, y); - allowedX = (rfbScreen->width < x) ? rfbScreen->width : x; - allowedY = (rfbScreen->width < y) ? rfbScreen->width : y; + allowedX = (rfb->width < x) ? rfb->width : x; + allowedY = (rfb->width < y) ? rfb->width : y; - rfbScreen->width = x; - rfbScreen->height = y; + rfb->width = x; + rfb->height = y; - rfbClientPtr cl; - rfbClientIteratorPtr iterator = rfbGetClientIterator(rfbScreen); + iterator = rfbGetClientIterator(rfb); while ((cl = rfbClientIteratorNext(iterator)) != NULL) { LOCK(cl->updateMutex); cl->newFBSizePending = 1; @@ -304,7 +316,7 @@ vnc_resize(int x, int y) int vnc_pause(void) { - return((vnc_clients > 0) ? 0 : 1); + return((clients > 0) ? 0 : 1); }