From 2eb86d639beabf09b3a7e95d299631d91463c84b Mon Sep 17 00:00:00 2001 From: waltje Date: Mon, 30 Apr 2018 17:43:18 -0400 Subject: [PATCH] More UI cleanups and fixes. 95% of the UI code is now common. Added missing "invert_display" config item. Added some more local logging functions. --- src/config.c | 8 +- src/floppy/fdd.c | 6 +- src/input/mouse.c | 5 +- src/network/net_ne2000.c | 6 +- src/network/network.c | 38 +++++-- src/network/network.h | 5 +- src/network/slirp/slirp.h | 6 +- src/pc.c | 2 +- src/pci.c | 8 +- src/ports/game.c | 32 +++++- src/ports/parallel.c | 27 ++++- src/ports/serial.c | 23 +++- src/ui/ui.h | 2 +- src/ui/ui_main.c | 234 ++++++++++++++++++-------------------- src/ui/ui_resource.h | 66 ++++++----- src/ui/ui_stbar.c | 77 ++++++------- src/win/VARCem.rc | 76 ++++++------- src/win/win_ui.c | 98 ++++++++-------- 18 files changed, 414 insertions(+), 305 deletions(-) diff --git a/src/config.c b/src/config.c index 4eb34d7..deb76a7 100644 --- a/src/config.c +++ b/src/config.c @@ -12,7 +12,7 @@ * it on Windows XP, and possibly also Vista. Use the * -DANSI_CFG for use on these systems. * - * Version: @(#)config.c 1.0.20 2018/04/27 + * Version: @(#)config.c 1.0.21 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -267,6 +267,7 @@ load_general(const char *cat) if (scale > 3) scale = 3; + invert_display = !!config_get_int(cat, "invert_display", 0); enable_overscan = !!config_get_int(cat, "enable_overscan", 0); vid_cga_contrast = !!config_get_int(cat, "vid_cga_contrast", 0); vid_grayscale = config_get_int(cat, "video_grayscale", 0); @@ -337,6 +338,11 @@ save_general(const char *cat) else config_set_int(cat, "scale", scale); + if (invert_display == 0) + config_delete_var(cat, "invert_display"); + else + config_set_int(cat, "invert_display", invert_display); + if (enable_overscan == 0) config_delete_var(cat, "enable_overscan"); else diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 1dc0e7c..da8d711 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -10,7 +10,7 @@ * * TODO: Implement the ENABLE_FDD_LOG stuff. * - * Version: @(#)fdd.c 1.0.10 2018/04/28 + * Version: @(#)fdd.c 1.0.11 2018/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -76,6 +76,10 @@ int defaultwriteprot = 0; int curdrive = 0; int motorspin; int fdc_indexcount = 52; +#ifdef ENABLE_FDD_LOG +int fdd_do_log = ENABLE_FDD_LOG; +#endif + static fdc_t *fdd_fdc; diff --git a/src/input/mouse.c b/src/input/mouse.c index dab6c7e..dfd2811 100644 --- a/src/input/mouse.c +++ b/src/input/mouse.c @@ -10,7 +10,7 @@ * * TODO: Add the Genius bus- and serial mouse. * - * Version: @(#)mouse.c 1.0.9 2018/04/26 + * Version: @(#)mouse.c 1.0.10 2018/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -63,6 +63,9 @@ typedef struct { } mouse_t; +#ifdef ENABLE_MOUSE_LOG +int mouse_do_log = ENABLE_MOUSE_LOG; +#endif int mouse_x, mouse_y, mouse_z, diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 338cc3d..7278a2e 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -12,7 +12,7 @@ * - Realtek RTL8019AS (ISA 16-bit, PnP); * - Realtek RTL8029AS (PCI). * - * Version: @(#)net_ne2000.c 1.0.6 2018/04/28 + * Version: @(#)net_ne2000.c 1.0.7 2018/04/29 * * Based on @(#)ne2k.cc v1.56.2.1 2004/02/02 22:37:22 cbothamy * @@ -291,10 +291,10 @@ static void nic_tx(nic_t *, uint32_t); static void nelog(int lvl, const char *fmt, ...) { -#ifdef ENABLE_NIC_LOG +#ifdef ENABLE_NETWORK_DEV_LOG va_list ap; - if (nic_do_log >= lvl) { + if (network_dev_do_log >= lvl) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); diff --git a/src/network/network.c b/src/network/network.c index cf563c5..33f10ee 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -12,7 +12,7 @@ * it should be malloc'ed and then linked to the NETCARD def. * Will be done later. * - * Version: @(#)network.c 1.0.7 2018/04/28 + * Version: @(#)network.c 1.0.8 2018/04/29 * * Author: Fred N. van Kempen, * @@ -52,10 +52,12 @@ #include #include #include +#include #include #ifdef WALTJE # include #endif +#define HAVE_STDARG_H #include "../emu.h" #include "../device.h" #include "../ui/ui.h" @@ -80,8 +82,11 @@ int network_ndev; int network_card; char network_pcap[512]; netdev_t network_devs[32]; -#ifdef ENABLE_NIC_LOG -int nic_do_log = ENABLE_NIC_LOG; +#ifdef ENABLE_NETWORK_LOG +int network_do_log = ENABLE_NETWORK_LOG; +#endif +#ifdef ENABLE_NETWORK_DEV_LOG +int network_dev_do_log = ENABLE_NETWORK_DEV_LOG; #endif static mutex_t *network_mutex; static uint8_t *network_mac; @@ -178,6 +183,21 @@ hexdump_p(char *ptr, uint8_t *bufp, int len) #endif +static void +net_log(int lvl, const char *fmt, ...) +{ +#ifdef ENABLE_NETWORK_LOG + va_list ap; + + if (network_do_log >= lvl) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + void network_wait(uint8_t wait) { @@ -305,7 +325,7 @@ network_close(void) network_mutex = NULL; network_mac = NULL; - pclog("NETWORK: closed.\n"); + net_log(1, "NETWORK: closed.\n"); } @@ -322,9 +342,9 @@ network_reset(void) { int i = -1; -#ifdef ENABLE_NIC_LOG +#ifdef ENABLE_NETWORK_LOG pclog("NETWORK: reset (type=%d, card=%d) debug=%d\n", - network_type, network_card, nic_do_log); + network_type, network_card, network_do_log); #else pclog("NETWORK: reset (type=%d, card=%d)\n", network_type, network_card); @@ -364,13 +384,13 @@ network_reset(void) return; } - pclog("NETWORK: set up for %s, card='%s'\n", + net_log(0, "NETWORK: set up for %s, card='%s'\n", (network_type==NET_TYPE_SLIRP)?"SLiRP":"Pcap", net_cards[network_card].name); /* Add the (new?) card to the I/O system. */ if (net_cards[network_card].device) { - pclog("NETWORK: adding device '%s'\n", + net_log(1, "NETWORK: adding device '%s'\n", net_cards[network_card].name); device_add(net_cards[network_card].device); } @@ -410,7 +430,7 @@ network_dev_to_id(const char *devname) { int i = 0; - for (i=0; i * @@ -87,7 +87,8 @@ extern "C" { #endif /* Global variables. */ -extern int nic_do_log; /* config */ +extern int network_do_log, /* config */ + network_dev_log; extern int network_ndev; extern netdev_t network_devs[32]; diff --git a/src/network/slirp/slirp.h b/src/network/slirp/slirp.h index 36f8f66..02b7d16 100644 --- a/src/network/slirp/slirp.h +++ b/src/network/slirp/slirp.h @@ -66,8 +66,10 @@ /* XXX: Define according to how time.h should be included */ #undef TIME_WITH_SYS_TIME -#define TIME_WITH_SYS_TIME 0 -#undef HAVE_SYS_TIME_H +#ifndef _MSC_VER +# define TIME_WITH_SYS_TIME 0 +# undef HAVE_SYS_TIME_H +#endif /* Define if your sprintf returns char * instead of int */ #undef BAD_SPRINTF diff --git a/src/pc.c b/src/pc.c index 7f29fa5..af7af5c 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.30 2018/04/28 + * Version: @(#)pc.c 1.0.31 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, diff --git a/src/pci.c b/src/pci.c index b474e5b..3b5ca02 100644 --- a/src/pci.c +++ b/src/pci.c @@ -8,7 +8,7 @@ * * Implement the PCI bus. * - * Version: @(#)pci.c 1.0.3 2018/04/26 + * Version: @(#)pci.c 1.0.4 2018/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -92,15 +92,15 @@ static int trc_reg = 0; PCI_RESET pci_reset_handler; -#ifdef ENABLE_PCI_LOG -int pci_do_log = ENABLE_PCI_LOG; +#ifdef ENABLE_BUS_LOG +int pci_do_log = ENABLE_BUS_LOG; #endif static void pcilog(const char *fmt, ...) { -#ifdef ENABLE_PCI_LOG +#ifdef ENABLE_BUS_LOG va_list ap; if (pci_do_log) diff --git a/src/ports/game.c b/src/ports/game.c index 921d0e3..74f5681 100644 --- a/src/ports/game.c +++ b/src/ports/game.c @@ -8,7 +8,7 @@ * * Implementation of a generic Game Port. * - * Version: @(#)game.c 1.0.9 2018/04/26 + * Version: @(#)game.c 1.0.11 2018/04/30 * * Authors: Fred N. van Kempen, * Sarah Walker, @@ -38,7 +38,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../machine/machine.h" #include "../cpu/cpu.h" @@ -66,9 +68,29 @@ typedef struct _game_ { } game_t; +#ifdef ENABLE_GAME_LOG +int game_do_log = ENABLE_GAME_LOG; +#endif + + static game_t *game_global = NULL; +static void +gamelog(const char *fmt, ...) +{ +#ifdef ENABLE_GAME_LOG + va_list ap; + + if (game_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + static int game_time(int axis) { @@ -88,6 +110,10 @@ game_write(uint16_t addr, uint8_t val, void *priv) game_t *dev = (game_t *)priv; int i; +#ifdef ENABLE_GAME_LOG + gamelog("GAME: write(%04x, %02x)\n", addr, val); +#endif + timer_clock(); dev->state |= 0x0f; @@ -115,6 +141,10 @@ game_read(uint16_t addr, void *priv) cycles -= ISA_CYCLES(8); +#ifdef ENABLE_GAME_LOG + gamelog("GAME: read(%04x) = %02x\n", addr, ret); +#endif + return(ret); } diff --git a/src/ports/parallel.c b/src/ports/parallel.c index 963a43d..c05482e 100644 --- a/src/ports/parallel.c +++ b/src/ports/parallel.c @@ -8,7 +8,7 @@ * * Implementation of the "LPT" style parallel ports. * - * Version: @(#)parallel.c 1.0.8 2018/04/26 + * Version: @(#)parallel.c 1.0.9 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -39,7 +39,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../io.h" #include "../device.h" @@ -76,6 +78,21 @@ int parallel_do_log = ENABLE_PARALLEL_LOG; static parallel_t ports[PARALLEL_MAX]; /* the ports */ +static void +parlog(const char *fmt, ...) +{ +#ifdef ENABLE_PARALLEL_LOG + va_list ap; + + if (parallel_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + /* Write a value to a port (and/or its attached device.) */ static void parallel_write(uint16_t port, uint8_t val, void *priv) @@ -83,7 +100,7 @@ parallel_write(uint16_t port, uint8_t val, void *priv) parallel_t *dev = (parallel_t *)priv; #ifdef ENABLE_PARALLEL_LOG - pclog("PARALLEL: write(%04X, %02X)\n", port, val); + parlog("PARALLEL: write(%04X, %02X)\n", port, val); #endif switch (port & 3) { @@ -125,7 +142,7 @@ parallel_read(uint16_t port, void *priv) break; } #ifdef ENABLE_PARALLEL_LOG - pclog("PARALLEL: read(%04X) => %02X\n", port, ret); + parlog("PARALLEL: read(%04X) => %02X\n", port, ret); #endif return(ret); @@ -224,7 +241,7 @@ parallel_reset(void) int i; #ifdef ENABLE_PARALLEL_LOG - pclog("PARALLEL: reset ([%d] [%d] [%d])\n", + parlog("PARALLEL: reset ([%d] [%d] [%d])\n", parallel_enabled[0], parallel_enabled[1], parallel_enabled[2]); #endif @@ -245,7 +262,7 @@ parallel_setup(int id, uint16_t port) parallel_t *dev = &ports[id-1]; #if defined(ENABLE_PARALLEL_LOG) && defined(_DEBUG) - pclog("PARALLEL: setting up LPT%d as %04X [enabled=%d]\n", + parlog("PARALLEL: setting up LPT%d as %04X [enabled=%d]\n", id, port, parallel_enabled[id-1]); #endif if (! parallel_enabled[id-1]) return; diff --git a/src/ports/serial.c b/src/ports/serial.c index 15ba26c..bb4d119 100644 --- a/src/ports/serial.c +++ b/src/ports/serial.c @@ -8,7 +8,7 @@ * * Implementation of 8250-style serial port. * - * Version: @(#)serial.c 1.0.5 2018/04/26 + * Version: @(#)serial.c 1.0.6 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,7 +40,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../machine/machine.h" #include "../io.h" @@ -76,6 +78,21 @@ static const struct { static SERIAL ports[SERIAL_MAX]; /* the ports */ +static void +serlog(const char *fmt, ...) +{ +#ifdef ENABLE_SERIAL_LOG + va_list ap; + + if (serial_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + static void update_ints(SERIAL *dev) { @@ -401,7 +418,7 @@ serial_reset(void) int i; #ifdef ENABLE_SERIAL_LOG - pclog("SERIAL: reset ([%d] [%d])\n", serial_enabled[0], serial_enabled[1]); + serlog("SERIAL: reset ([%d] [%d])\n", serial_enabled[0], serial_enabled[1]); #endif for (i = 0; i < SERIAL_MAX; i++) { @@ -425,7 +442,7 @@ serial_setup(int id, uint16_t port, int8_t irq) SERIAL *dev = &ports[id-1]; #if defined(ENABLE_SERIAL_LOG) && defined(_DEBUG) - pclog("SERIAL: setting up COM%d as %04X [enabled=%d]\n", + serlog("SERIAL: setting up COM%d as %04X [enabled=%d]\n", id, port, serial_enabled[id-1]); #endif if (! serial_enabled[id-1]) return; diff --git a/src/ui/ui.h b/src/ui/ui.h index 83d780a..0b77d90 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -131,13 +131,13 @@ extern int voodoo_do_log; extern int ui_msgbox(int type, void *arg); extern void ui_menu_reset_all(void); extern int ui_menu_command(int idm); -extern void ui_menu_set_radio_item(int idm, int num, int val); extern void ui_menu_set_logging_item(int idm, int val); extern void ui_menu_toggle_video_item(int idm, int *val); /* Main GUI helper functions. */ extern void menu_enable_item(int idm, int val); extern void menu_set_item(int idm, int val); +extern void menu_set_radio_item(int idm, int num, int val); extern wchar_t *ui_window_title(wchar_t *s); /* Status Bar functions. */ diff --git a/src/ui/ui_main.c b/src/ui/ui_main.c index 7f7c189..ce86441 100644 --- a/src/ui/ui_main.c +++ b/src/ui/ui_main.c @@ -11,7 +11,7 @@ * This code is called by the UI frontend modules, and, also, * depends on those same modules for lower-level functions. * - * Version: @(#)ui_main.c 1.0.4 2018/04/28 + * Version: @(#)ui_main.c 1.0.5 2018/04/30 * * Author: Fred N. van Kempen, * @@ -61,18 +61,6 @@ #include "ui_resource.h" -/* Set a radio group menu item. */ -void -ui_menu_set_radio_item(int idm, int num, int val) -{ - int i; - - for (i = 0; i < num; i++) - menu_set_item(idm + i, 0); - menu_set_item(idm + val, 1); -} - - #if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) /* Simplest way to handle all these, for now.. */ void @@ -267,29 +255,29 @@ ui_menu_reset_all(void) menu_set_item(IDM_RESIZE, vid_resize); menu_set_item(IDM_REMEMBER, window_remember); - ui_menu_set_radio_item(IDM_VID_DDRAW, 4, -1); + menu_set_radio_item(IDM_RENDER_1, 4, -1); - ui_menu_set_radio_item(IDM_SCALE_1, 4, scale); + menu_set_radio_item(IDM_SCALE_1, 4, scale); menu_set_item(IDM_FULLSCREEN, vid_fullscreen); - ui_menu_set_radio_item(IDM_STRETCH, 5, vid_fullscreen_scale); - - menu_set_item(IDM_VGA_INVERT, invert_display); - menu_set_item(IDM_VGA_OVERSCAN, enable_overscan); - - ui_menu_set_radio_item(IDM_SCREEN_RGB, 5, vid_grayscale); - - ui_menu_set_radio_item(IDM_GRAY_601, 3, vid_graytype); - - menu_set_item(IDM_FORCE_43, force_43); - - menu_set_item(IDM_CGA_CONTR, vid_cga_contrast); + menu_set_radio_item(IDM_STRETCH, 5, vid_fullscreen_scale); menu_set_item(IDM_RCTRL_IS_LALT, rctrl_is_lalt); menu_set_item(IDM_UPDATE_ICONS, update_icons); + menu_set_item(IDM_INVERT, invert_display); + menu_set_item(IDM_OVERSCAN, enable_overscan); + + menu_set_radio_item(IDM_SCREEN_RGB, 5, vid_grayscale); + + menu_set_radio_item(IDM_GRAY_601, 3, vid_graytype); + + menu_set_item(IDM_FORCE_43, force_43); + + menu_set_item(IDM_CGA_CONTR, vid_cga_contrast); + #ifdef ENABLE_LOG_TOGGLES for (i = IDM_LOG_BEGIN; i < IDM_LOG_END; i++) ui_menu_set_logging_item(i, 0xff); @@ -301,66 +289,48 @@ ui_menu_reset_all(void) int ui_menu_command(int idm) { + wchar_t temp[512]; int i; switch (idm) { - case IDM_SCREENSHOT: - take_screenshot(); - break; - - case IDM_RESET_HARD: + case IDM_RESET_HARD: /* ACTION menu */ pc_reset(1); break; - case IDM_RESET: + case IDM_RESET: /* ACTION menu */ pc_reset(0); break; - case IDM_EXIT: - /*NOTHANDLED*/ - return(0); - - case IDM_CAE: + case IDM_CAE: /* ACTION menu */ keyboard_send_cae(); break; - case IDM_CAB: + case IDM_CAB: /* ACTION menu */ keyboard_send_cab(); break; - case IDM_PAUSE: + case IDM_PAUSE: /* ACTION menu */ plat_pause(dopause ^ 1); menu_set_item(idm, dopause); break; - case IDM_SETTINGS: - plat_pause(1); - if (dlg_settings(1) == 2) - pc_reset_hard_init(); - plat_pause(0); +#ifdef IDM_Test + case IDM_Test: /* ACTION menu */ + pclog("TEST\n"); break; +#endif - case IDM_ABOUT: - dlg_about(); - break; + case IDM_EXIT: /* ACTION menu */ + /*NOTHANDLED*/ + return(0); - case IDM_STATUS: - dlg_status(); - break; - - case IDM_UPDATE_ICONS: - update_icons ^= 1; - menu_set_item(idm, update_icons); - config_save(); - break; - - case IDM_RESIZE: + case IDM_RESIZE: /* VIEW menu */ vid_resize ^= 1; menu_set_item(idm, vid_resize); if (vid_resize) { /* Force scaling to 1.0. */ scale = 1; - ui_menu_set_radio_item(IDM_SCALE_1, 4, scale); + menu_set_radio_item(IDM_SCALE_1, 4, scale); } /* Disable scaling settings. */ @@ -370,106 +340,112 @@ ui_menu_command(int idm) config_save(); return(0); - case IDM_REMEMBER: + case IDM_REMEMBER: /* VIEW menu */ window_remember ^= 1; menu_set_item(idm, window_remember); return(0); - case IDM_VID_DDRAW: - case IDM_VID_D3D: -#ifdef USE_VNC - case IDM_VID_VNC: -#endif -#ifdef USE_RDP - case IDM_VID_RDP: -#endif - plat_setvid(idm - IDM_VID_DDRAW); - ui_menu_set_radio_item(IDM_VID_DDRAW, 4, vid_api); + case IDM_RENDER_1: /* VIEW menu */ + case IDM_RENDER_2: + case IDM_RENDER_3: + case IDM_RENDER_4: + plat_setvid(idm - IDM_RENDER_1); + menu_set_radio_item(IDM_RENDER_1, 4, vid_api); config_save(); break; - case IDM_FULLSCREEN: + case IDM_FULLSCREEN: /* VIEW menu */ plat_setfullscreen(1); config_save(); break; - case IDM_STRETCH: + case IDM_STRETCH: /* VIEW menu */ case IDM_STRETCH_43: case IDM_STRETCH_SQ: case IDM_STRETCH_INT: case IDM_STRETCH_KEEP: vid_fullscreen_scale = (idm - IDM_STRETCH); - ui_menu_set_radio_item(IDM_STRETCH, 5, vid_fullscreen_scale); + menu_set_radio_item(IDM_STRETCH, 5, vid_fullscreen_scale); device_force_redraw(); config_save(); break; - case IDM_SCALE_1: + case IDM_SCALE_1: /* VIEW menu */ case IDM_SCALE_2: case IDM_SCALE_3: case IDM_SCALE_4: scale = (idm - IDM_SCALE_1); - ui_menu_set_radio_item(IDM_SCALE_1, 4, scale); + menu_set_radio_item(IDM_SCALE_1, 4, scale); device_force_redraw(); video_force_resize_set(1); config_save(); break; - case IDM_FORCE_43: + case IDM_FORCE_43: /* VIEW menu */ ui_menu_toggle_video_item(idm, &force_43); video_force_resize_set(1); + config_save(); break; - case IDM_VGA_INVERT: + case IDM_RCTRL_IS_LALT: /* VIEW menu */ + rctrl_is_lalt ^= 1; + menu_set_item(idm, rctrl_is_lalt); + config_save(); + break; + + case IDM_UPDATE_ICONS: /* VIEW menu */ + update_icons ^= 1; + menu_set_item(idm, update_icons); + config_save(); + break; + + case IDM_INVERT: /* DISPLAY menu */ ui_menu_toggle_video_item(idm, &invert_display); + config_save(); break; - case IDM_VGA_OVERSCAN: + case IDM_OVERSCAN: /* DISPLAY menu */ ui_menu_toggle_video_item(idm, &enable_overscan); video_force_resize_set(1); + config_save(); break; - case IDM_CGA_CONTR: + case IDM_SCREEN_RGB: /* DISPLAY menu */ + case IDM_SCREEN_GRAYSCALE: + case IDM_SCREEN_AMBER: + case IDM_SCREEN_GREEN: + case IDM_SCREEN_WHITE: + vid_grayscale = (idm - IDM_SCREEN_RGB); + menu_set_radio_item(IDM_SCREEN_RGB, 5, vid_grayscale); + device_force_redraw(); + config_save(); + break; + + case IDM_GRAY_601: /* DISPLAY menu */ + case IDM_GRAY_709: + case IDM_GRAY_AVE: + vid_graytype = (idm - IDM_GRAY_601); + menu_set_radio_item(IDM_GRAY_601, 3, vid_graytype); + device_force_redraw(); + config_save(); + break; + + case IDM_CGA_CONTR: /* DISPLAY menu */ vid_cga_contrast ^= 1; menu_set_item(idm, vid_cga_contrast); cgapal_rebuild(); config_save(); break; - case IDM_GRAY_601: - case IDM_GRAY_709: - case IDM_GRAY_AVE: - vid_graytype = (idm - IDM_GRAY_601); - ui_menu_set_radio_item(IDM_GRAY_601, 3, vid_graytype); - device_force_redraw(); - config_save(); + case IDM_SETTINGS: /* TOOLS menu */ + plat_pause(1); + if (dlg_settings(1) == 2) + pc_reset_hard_init(); + plat_pause(0); break; - case IDM_SCREEN_RGB: - case IDM_SCREEN_GRAYSCALE: - case IDM_SCREEN_AMBER: - case IDM_SCREEN_GREEN: - case IDM_SCREEN_WHITE: - vid_grayscale = (idm - IDM_SCREEN_RGB); - ui_menu_set_radio_item(IDM_SCREEN_RGB, 5, vid_grayscale); - device_force_redraw(); - config_save(); - break; - - case IDM_RCTRL_IS_LALT: - rctrl_is_lalt ^= 1; - menu_set_item(idm, rctrl_is_lalt); - config_save(); - break; - -#ifdef ENABLE_LOG_BREAKPOINT - case IDM_LOG_BREAKPOINT: - pclog("---- LOG BREAKPOINT ----\n"); - break; -#endif - #ifdef ENABLE_LOG_TOGGLES - case IDM_LOG_BUS: + case IDM_LOG_BUS: /* TOOLS menu */ case IDM_LOG_KEYBOARD: case IDM_LOG_MOUSE: case IDM_LOG_GAME: @@ -497,26 +473,42 @@ ui_menu_command(int idm) break; #endif -#if 0 +#ifdef ENABLE_LOG_BREAKPOINT + case IDM_LOG_BREAKPOINT: /* TOOLS menu */ + pclog("---- LOG BREAKPOINT ----\n"); + break; +#endif + /* FIXME: need to fix these.. */ - case IDM_LOAD: + case IDM_LOAD: /* TOOLS menu */ plat_pause(1); - if (! file_dlg_st(hwnd, IDS_2160, L"", 0) && - (ui_msgbox(MBX_QUESTION, (wchar_t *)IDS_2051) == IDYES)) { - pc_reload(wopenfilestring); - ResetAllMenus(); + if (! dlg_file(plat_get_string(IDS_2160), NULL, temp, 0) && + (ui_msgbox(MBX_QUESTION, (wchar_t *)IDS_2051) == 0)) { + pc_reload(temp); + ui_menu_reset_all(); } plat_pause(0); break; - case IDM_SAVE: + case IDM_SAVE: /* TOOLS menu */ plat_pause(1); - if (! file_dlg_st(hwnd, IDS_2160, L"", 1)) { - config_write(wopenfilestring); + if (! dlg_file(plat_get_string(IDS_2160), NULL, temp, 1)) { + config_write(temp); } plat_pause(0); break; -#endif + + case IDM_STATUS: /* TOOLS menu */ + dlg_status(); + break; + + case IDM_SCREENSHOT: /* TOOLS menu */ + take_screenshot(); + break; + + case IDM_ABOUT: /* HELP menu */ + dlg_about(); + break; } return(1); diff --git a/src/ui/ui_resource.h b/src/ui/ui_resource.h index fedebf5..e469eb2 100644 --- a/src/ui/ui_resource.h +++ b/src/ui/ui_resource.h @@ -8,7 +8,7 @@ * * Platform-independent resource identifiers. * - * Version: @(#)ui_resource.h 1.0.2 2018/04/29 + * Version: @(#)ui_resource.h 1.0.4 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -50,24 +50,31 @@ # define EMU_UI_RESOURCE_H +#ifdef _WIN32 +# define IDM_BASE 40960 +#else +# define IDM_BASE 16384 +#endif + /* ACTION menu. */ -#define IDM_ACTION 40100 +#define IDM_ACTION IDM_BASE #define IDM_RESET_HARD (IDM_ACTION+1) #define IDM_RESET (IDM_ACTION+2) #define IDM_CAE (IDM_ACTION+3) #define IDM_CAB (IDM_ACTION+4) #define IDM_PAUSE (IDM_ACTION+5) +#define IDM_ACTION_END (IDM_PAUSE+1) #define IDM_EXIT (IDM_ACTION+99) /* fixed on WxWidgets */ /* VIEW menu. */ -#define IDM_VIEW 40200 +#define IDM_VIEW (IDM_BASE+100) #define IDM_RESIZE (IDM_VIEW+1) #define IDM_REMEMBER (IDM_VIEW+2) #define IDM_RENDER (IDM_VIEW+10) -# define IDM_VID_DDRAW (IDM_RENDER+1) -# define IDM_VID_D3D (IDM_RENDER+2) -# define IDM_VID_VNC (IDM_RENDER+3) -# define IDM_VID_RDP (IDM_RENDER+4) +# define IDM_RENDER_1 (IDM_RENDER+1) /* DDraw */ +# define IDM_RENDER_2 (IDM_RENDER+2) /* D3D */ +# define IDM_RENDER_3 (IDM_RENDER+3) /* VNC */ +# define IDM_RENDER_4 (IDM_RENDER+4) /* RDP */ #define IDM_SCALE (IDM_VIEW+20) # define IDM_SCALE_1 (IDM_SCALE+1) # define IDM_SCALE_2 (IDM_SCALE+2) @@ -80,26 +87,30 @@ # define IDM_STRETCH_SQ (IDM_FULLSCREEN+4) # define IDM_STRETCH_INT (IDM_FULLSCREEN+5) # define IDM_STRETCH_KEEP (IDM_FULLSCREEN+6) -#define IDM_VGA_SETTINGS (IDM_VIEW+40) -# define IDM_VGA_INVERT (IDM_VGA_SETTINGS+1) -# define IDM_VGA_OVERSCAN (IDM_VGA_SETTINGS+2) -# define IDM_VGA_SCREEN (IDM_VIEW+50) -# define IDM_SCREEN_RGB (IDM_VGA_SCREEN+1) -# define IDM_SCREEN_GRAYSCALE (IDM_VGA_SCREEN+2) -# define IDM_SCREEN_AMBER (IDM_VGA_SCREEN+3) -# define IDM_SCREEN_GREEN (IDM_VGA_SCREEN+4) -# define IDM_SCREEN_WHITE (IDM_VGA_SCREEN+5) -#define IDM_VGA_GRAYSCALE (IDM_VIEW+60) -# define IDM_GRAY_601 (IDM_VGA_GRAYSCALE+1) -# define IDM_GRAY_709 (IDM_VGA_GRAYSCALE+2) -# define IDM_GRAY_AVE (IDM_VGA_GRAYSCALE+3) -# define IDM_FORCE_43 (IDM_VIEW+3) -# define IDM_CGA_CONTR (IDM_VIEW+4) #define IDM_RCTRL_IS_LALT (IDM_VIEW+5) #define IDM_UPDATE_ICONS (IDM_VIEW+6) +#define IDM_VIEW_END (IDM_UPDATE_ICONS+1) + +/* DISPLAY menu. */ +#define IDM_DISPLAY (IDM_BASE+200) +# define IDM_INVERT (IDM_DISPLAY+1) +# define IDM_OVERSCAN (IDM_DISPLAY+2) +# define IDM_SCREEN (IDM_DISPLAY+10) +# define IDM_SCREEN_RGB (IDM_SCREEN+1) +# define IDM_SCREEN_GRAYSCALE (IDM_SCREEN+2) +# define IDM_SCREEN_AMBER (IDM_SCREEN+3) +# define IDM_SCREEN_GREEN (IDM_SCREEN+4) +# define IDM_SCREEN_WHITE (IDM_SCREEN+5) +#define IDM_GRAYSCALE (IDM_DISPLAY+20) +# define IDM_GRAY_601 (IDM_GRAYSCALE+1) +# define IDM_GRAY_709 (IDM_GRAYSCALE+2) +# define IDM_GRAY_AVE (IDM_GRAYSCALE+3) +#define IDM_FORCE_43 (IDM_DISPLAY+3) +#define IDM_CGA_CONTR (IDM_DISPLAY+4) +#define IDM_DISPLAY_END (IDM_CGA_CONTR+1) /* TOOLS menu. */ -#define IDM_TOOLS 40300 +#define IDM_TOOLS (IDM_BASE+300) #define IDM_SETTINGS (IDM_TOOLS+1) #define IDM_LOAD (IDM_TOOLS+2) #define IDM_SAVE (IDM_TOOLS+3) @@ -133,10 +144,13 @@ # define IDM_LOG_BREAKPOINT (IDM_LOGGING+99) #define IDM_STATUS (IDM_TOOLS+4) #define IDM_SCREENSHOT (IDM_TOOLS+5) +#define IDM_TOOLS_END (IDM_SCREENSHOT+1) /* HELP menu. */ -#define IDM_HELP 40400 -# define IDM_ABOUT (IDM_HELP+1) +#define IDM_HELP (IDM_BASE+400) +#define IDM_ABOUT (IDM_HELP+1) /* fixed on WxWidgets */ + +#define IDM_END (IDM_HELP+99) /* * Status Bar commands. @@ -145,7 +159,7 @@ * and 5 bits for Removable Disks (5 bits for ID), so we use an * 8bit (256 entries) space for these devices. */ -#define IDM_SBAR 40960 /* 0x0a000 */ +#define IDM_SBAR (IDM_BASE+1024) #define IDM_FLOPPY_IMAGE_NEW (IDM_SBAR + 0x0000) #define IDM_FLOPPY_IMAGE_EXISTING (IDM_SBAR + 0x0100) diff --git a/src/ui/ui_stbar.c b/src/ui/ui_stbar.c index 70036f8..46ea14b 100644 --- a/src/ui/ui_stbar.c +++ b/src/ui/ui_stbar.c @@ -8,7 +8,7 @@ * * Common UI support functions for the Status Bar module. * - * Version: @(#)ui_stbar.c 1.0.1 2018/04/29 + * Version: @(#)ui_stbar.c 1.0.2 2018/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -210,76 +210,73 @@ ui_sb_tip_update(int tag) drive = sb_tags[part] & 0x0f; stransi = fdd_getname(fdd_get_type(drive)); mbstowcs(temp, stransi, sizeof_w(temp)); - if (wcslen(floppyfns[drive]) == 0) { - _swprintf(tip, plat_get_string(IDS_2158), - drive+1, temp, plat_get_string(IDS_2057)); - } else { - _swprintf(tip, plat_get_string(IDS_2158), - drive+1, temp, floppyfns[drive]); - } + str = floppyfns[drive]; + if (*str == L'\0') + str = plat_get_string(IDS_2057); /*"empty"*/ + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_2158), drive+1, temp, str); break; case SB_CDROM: drive = sb_tags[part] & 0x0f; bus = cdrom_drives[drive].bus_type; id = IDS_4352 + (bus - 1); - str = plat_get_string(id); + wcscpy(temp, plat_get_string(id)); + str = cdrom_image[drive].image_path; + if (*str == L'\0') + str = plat_get_string(IDS_2057); /*"empty"*/ if (cdrom_drives[drive].host_drive == 200) { - if (wcslen(cdrom_image[drive].image_path) == 0) { - _swprintf(tip, plat_get_string(IDS_5120), - drive+1, str, plat_get_string(IDS_2057)); - } else { - _swprintf(tip, plat_get_string(IDS_5120), - drive+1, str, cdrom_image[drive].image_path); - } + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_5120), + drive+1, temp, str); } else if ((cdrom_drives[drive].host_drive >= 'A') && (cdrom_drives[drive].host_drive <= 'Z')) { - _swprintf(temp, plat_get_string(IDS_2058), - cdrom_drives[drive].host_drive & ~0x20); - _swprintf(tip, plat_get_string(IDS_5120), - drive+1, str, temp); + swprintf(temp, sizeof_w(temp), + plat_get_string(IDS_2058), + cdrom_drives[drive].host_drive & ~0x20); + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_5120), + drive+1, plat_get_string(id), temp); } else { - _swprintf(tip, plat_get_string(IDS_5120), - drive+1, str, plat_get_string(IDS_2057)); + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_5120), + drive+1, temp, str); } break; case SB_ZIP: drive = sb_tags[part] & 0x0f; type = zip_drives[drive].is_250 ? 250 : 100; - if (wcslen(zip_drives[drive].image_path) == 0) { - _swprintf(tip, plat_get_string(IDS_2177), - drive+1, type, plat_get_string(IDS_2057)); - } else { - _swprintf(tip, plat_get_string(IDS_2177), - drive+1, type, zip_drives[drive].image_path); - } + str = zip_drives[drive].image_path; + if (*str == L'\0') + str = plat_get_string(IDS_2057); /*"empty"*/ + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_2177), drive+1, type, str); break; case SB_RDISK: drive = sb_tags[part] & 0x1f; - if (wcslen(hdd[drive].fn) == 0) { - _swprintf(tip, plat_get_string(IDS_4115), - drive, plat_get_string(IDS_2057)); - } else { - _swprintf(tip, plat_get_string(IDS_4115), - drive, hdd[drive].fn); - } + str = hdd[drive].fn; + if (*str == L'\0') + str = plat_get_string(IDS_2057); /*"empty"*/ + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_4115), drive, str); break; case SB_HDD: bus = sb_tags[part] & 0x0f; id = IDS_4352 + (bus - 1); str = plat_get_string(id); - _swprintf(tip, plat_get_string(IDS_4096), str); + swprintf(tip, sizeof_w(tip), + plat_get_string(IDS_4096), str); break; case SB_NETWORK: - _swprintf(tip, plat_get_string(IDS_2069)); + swprintf(tip, sizeof_w(tip), plat_get_string(IDS_2069)); break; case SB_SOUND: - _swprintf(tip, plat_get_string(IDS_2068)); + swprintf(tip, sizeof_w(tip), plat_get_string(IDS_2068)); break; default: @@ -376,7 +373,7 @@ menu_cdrom(int part, int drive) sb_menu_add_item(part, -1, NULL); for (i = 3; i < 26; i++) { - _swprintf(temp, L"Host CD/DVD Drive (%c:)", i+'A'); + swprintf(temp, sizeof_w(temp), L"Host CD/DVD Drive (%c:)", i+'A'); if (host_cdrom_drive_available[i]) sb_menu_add_item(part, IDM_CDROM_HOST_DRIVE | (i << 3)|drive, temp); } diff --git a/src/win/VARCem.rc b/src/win/VARCem.rc index 7e46a82..9bb282a 100644 --- a/src/win/VARCem.rc +++ b/src/win/VARCem.rc @@ -8,7 +8,7 @@ * * Application resource script for Windows. * - * Version: @(#)VARCem.rc 1.0.22 2018/04/27 + * Version: @(#)VARCem.rc 1.0.23 2018/04/30 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -35,20 +35,14 @@ * USA. */ #include -#define IN_RESOURCE_H +#include #include "../emu.h" #include "../version.h" #include "../ui/ui.h" #include "../ui/ui_resource.h" #include "../plat.h" #include "resource.h" -#undef IN_RESOURCE_H -//#define APSTUDIO_READONLY_SYMBOLS -//#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -//#undef APSTUDIO_READONLY_SYMBOLS -//#undef APSTUDIO_HIDDEN_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources @@ -71,8 +65,8 @@ BEGIN MENUITEM "&Hard Reset", IDM_RESET_HARD MENUITEM "&Ctrl+Alt+Del", IDM_RESET MENUITEM SEPARATOR - MENUITEM "Ctrl+Alt+&Esc", IDM_CAE - MENUITEM "Ctrl+Alt+&Break", IDM_CAB + MENUITEM "Send Ctrl+Alt+&Esc", IDM_CAE + MENUITEM "Send Ctrl+Alt+&Break", IDM_CAB MENUITEM SEPARATOR MENUITEM "&Pause", IDM_PAUSE MENUITEM SEPARATOR @@ -85,13 +79,13 @@ BEGIN MENUITEM SEPARATOR POPUP "Re&nderer" BEGIN - MENUITEM "&DirectDraw", IDM_VID_DDRAW - MENUITEM "Direct&3D 9", IDM_VID_D3D + MENUITEM "&DirectDraw", IDM_RENDER_1 + MENUITEM "Direct&3D 9", IDM_RENDER_2 #ifdef USE_VNC - MENUITEM "&VNC", IDM_VID_VNC + MENUITEM "&VNC", IDM_RENDER_3 #endif #ifdef USE_RDP - MENUITEM "&RDP", IDM_VID_RDP + MENUITEM "&RDP", IDM_RENDER_4 #endif END MENUITEM SEPARATOR @@ -112,33 +106,33 @@ BEGIN MENUITEM "&Integer scale", IDM_STRETCH_INT MENUITEM "&Keep size", IDM_STRETCH_KEEP END - POPUP "E&GA/(S)VGA settings" - BEGIN - MENUITEM "&Inverted VGA monitor", IDM_VGA_INVERT - MENUITEM "E&GA/(S)VGA overscan", IDM_VGA_OVERSCAN - POPUP "VGA screen &type" - BEGIN - MENUITEM "RGB &Color", IDM_SCREEN_RGB - MENUITEM "&RGB Grayscale", IDM_SCREEN_GRAYSCALE - MENUITEM "&Amber monitor", IDM_SCREEN_AMBER - MENUITEM "&Green monitor", IDM_SCREEN_GREEN - MENUITEM "&White monitor", IDM_SCREEN_WHITE - END - POPUP "Grayscale &conversion type" - BEGIN - MENUITEM "BT&601 (NTSC/PAL)", IDM_GRAY_601 - MENUITEM "BT&709 (HDTV)", IDM_GRAY_709 - MENUITEM "&Average", IDM_GRAY_AVE - END - END - MENUITEM SEPARATOR - MENUITEM "F&orce 4:3 display ratio", IDM_FORCE_43 - MENUITEM "Change contrast for &monochrome display", IDM_CGA_CONTR MENUITEM SEPARATOR MENUITEM "R&ight CTRL is left ALT", IDM_RCTRL_IS_LALT MENUITEM SEPARATOR MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS END + POPUP "&Display" + BEGIN + MENUITEM "&Inverted display", IDM_INVERT + MENUITEM "Enable &overscan", IDM_OVERSCAN + POPUP "Display &type" + BEGIN + MENUITEM "RGB &Color monitor", IDM_SCREEN_RGB + MENUITEM "&Grayscale monitor", IDM_SCREEN_GRAYSCALE + MENUITEM "&Amber monitor", IDM_SCREEN_AMBER + MENUITEM "&Green monitor", IDM_SCREEN_GREEN + MENUITEM "&White monitor", IDM_SCREEN_WHITE + END + POPUP "&Grayscale conversion type" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_GRAY_601 + MENUITEM "BT&709 (HDTV)", IDM_GRAY_709 + MENUITEM "&Average", IDM_GRAY_AVE + END + MENUITEM SEPARATOR + MENUITEM "F&orce 4:3 display ratio", IDM_FORCE_43 + MENUITEM "Change &contrast for monochrome display", IDM_CGA_CONTR + END POPUP "&Tools" BEGIN MENUITEM "&Settings...", IDM_SETTINGS @@ -229,7 +223,11 @@ BEGIN MENUITEM SEPARATOR END #endif + MENUITEM "L&oad configuration", IDM_LOAD + MENUITEM "S&ave configuration", IDM_SAVE + MENUITEM SEPARATOR MENUITEM "S&tatus", IDM_STATUS + MENUITEM SEPARATOR MENUITEM "Take s&creenshot\tCtrl+Home", IDM_SCREENSHOT END POPUP "&Help" @@ -474,11 +472,11 @@ DLG_CFG_INPUT DIALOG DISCARDABLE 97, 0, 267, 65 STYLE DS_CONTROL | WS_CHILD FONT 9, "Segoe UI" BEGIN - LTEXT "Mouse :",IDT_1709,7,8,57,10 + LTEXT "Mouse:",IDT_1709,7,8,57,10 COMBOBOX IDC_COMBO_MOUSE,71,7,140,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Configure",IDC_CONFIGURE_MOUSE,214,7,46,12 - LTEXT "Joystick :",IDT_1710,7,26,58,10 + LTEXT "Joystick:",IDT_1710,7,26,58,10 COMBOBOX IDC_COMBO_JOYSTICK,71,25,189,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Joystick 1...",IDC_JOY1,7,44,50,14 @@ -748,7 +746,7 @@ END 261 ICON DISCARDABLE "icons/ports.ico" 262 ICON DISCARDABLE "icons/other_peripherals.ico" 263 ICON DISCARDABLE "icons/hard_disk.ico" -264 ICON DISCARDABLE "/icons/floppy_drives.ico" +264 ICON DISCARDABLE "icons/floppy_drives.ico" 265 ICON DISCARDABLE "icons/other_removable_devices.ico" 384 ICON DISCARDABLE "icons/floppy_525_empty.ico" 385 ICON DISCARDABLE "icons/floppy_525_empty_active.ico" diff --git a/src/win/win_ui.c b/src/win/win_ui.c index f4952b2..0da8307 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.15 2018/04/28 + * Version: @(#)win_ui.c 1.0.16 2018/04/29 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -68,10 +68,6 @@ HMENU menuMain; /* application main menu */ HICON hIcon[512]; /* icon data loaded from resources */ RECT oldclip; /* mouse rect */ int infocus = 1; -int rctrl_is_lalt = 0; - -char openfilestring[260]; -WCHAR wopenfilestring[260]; /* Local data. */ @@ -82,27 +78,6 @@ static int hook_enabled = 0; static int save_window_pos = 0; -static int vis = -1; - -/* Set host cursor visible or not. */ -void -show_cursor(int val) -{ - if (val == vis) - return; - - if (val == 0) { - while (1) { - if (ShowCursor(FALSE) < 0) break; - } - } else { - ShowCursor(TRUE); - } - - vis = val; -} - - HICON LoadIconEx(PCTSTR pszIconName) { @@ -128,22 +103,6 @@ menu_update(void) #endif -/* Enable or disable a menu item. */ -void -menu_enable_item(int idm, int val) -{ - EnableMenuItem(menuMain, idm, (val) ? MF_ENABLED : MF_DISABLED); -} - - -/* Set (check) or clear (uncheck) a menu item. */ -void -menu_set_item(int idm, int val) -{ - CheckMenuItem(menuMain, idm, val ? MF_CHECKED : MF_UNCHECKED); -} - - static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { @@ -180,7 +139,6 @@ LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) static LRESULT CALLBACK MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { -// HMENU hmenu; RECT rect; int sb_borders[3]; int temp_x, temp_y; @@ -197,8 +155,6 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: UpdateWindow(hwnd); -// We may need this later. -// hmenu = GetMenu(hwnd); idm = LOWORD(wParam); /* Let the general UI handle it first, and then we do. */ @@ -675,6 +631,58 @@ ui_window_title(wchar_t *s) } +/* Set host cursor visible or not. */ +void +show_cursor(int val) +{ + static int vis = -1; + + if (val == vis) + return; + + if (val == 0) { + while (1) { + if (ShowCursor(FALSE) < 0) break; + } + } else { + ShowCursor(TRUE); + } + + vis = val; +} + + +/* Enable or disable a menu item. */ +void +menu_enable_item(int idm, int val) +{ + EnableMenuItem(menuMain, idm, (val) ? MF_ENABLED : MF_DISABLED); +} + + +/* Set (check) or clear (uncheck) a menu item. */ +void +menu_set_item(int idm, int val) +{ + CheckMenuItem(menuMain, idm, val ? MF_CHECKED : MF_UNCHECKED); +} + + +/* Set a radio group menu item. */ +void +menu_set_radio_item(int idm, int num, int val) +{ + int i; + + if (val < 0) return; + + for (i = 0; i < num; i++) + menu_set_item(idm + i, 0); + + menu_set_item(idm + val, 1); +} + + /* We should have the language ID as a parameter. */ void plat_pause(int p)