2017-05-30 03:38:38 +02:00
|
|
|
/*
|
|
|
|
|
* 86Box A hypervisor and IBM PC system emulator that specializes in
|
|
|
|
|
* running old operating systems and software designed for IBM
|
|
|
|
|
* PC systems and compatibles from 1981 through fairly recent
|
|
|
|
|
* system designs based on the PCI bus.
|
|
|
|
|
*
|
|
|
|
|
* This file is part of the 86Box distribution.
|
|
|
|
|
*
|
|
|
|
|
* The Emulator's Windows core.
|
|
|
|
|
*
|
2017-09-30 16:56:38 -04:00
|
|
|
* Version: @(#)win.c 1.0.13 2017/09/29
|
2017-05-30 03:38:38 +02:00
|
|
|
*
|
2017-05-29 22:21:55 -04:00
|
|
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
2017-05-30 03:38:38 +02:00
|
|
|
* Miran Grca, <mgrca8@gmail.com>
|
2017-06-05 01:20:51 -04:00
|
|
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
2017-05-30 03:38:38 +02:00
|
|
|
* Copyright 2008-2017 Sarah Walker.
|
2017-08-24 01:14:39 -04:00
|
|
|
* Copyright 2016,2017 Miran Grca.
|
2017-05-30 03:38:38 +02:00
|
|
|
*/
|
2017-09-25 04:31:20 -04:00
|
|
|
#define UNICODE
|
|
|
|
|
#define BITMAP WINDOWS_BITMAP
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
#include <windowsx.h>
|
|
|
|
|
#include <commctrl.h>
|
|
|
|
|
#include <commdlg.h>
|
|
|
|
|
#include <process.h>
|
|
|
|
|
#undef BITMAP
|
2017-05-18 14:03:43 -04:00
|
|
|
#include <stdio.h>
|
2017-09-25 04:31:20 -04:00
|
|
|
#include <stdint.h>
|
2017-05-24 00:27:42 -04:00
|
|
|
#include <string.h>
|
2017-09-25 04:31:20 -04:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <wchar.h>
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "../86box.h"
|
2017-09-04 01:52:29 -04:00
|
|
|
#include "../config.h"
|
2017-08-27 04:33:47 +01:00
|
|
|
#include "../cpu/cpu.h"
|
2017-09-11 05:33:06 +02:00
|
|
|
#include "../ibm.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "../mem.h"
|
|
|
|
|
#include "../rom.h"
|
2017-09-04 01:52:29 -04:00
|
|
|
#include "../device.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "../nvr.h"
|
2017-09-04 01:52:29 -04:00
|
|
|
#include "../mouse.h"
|
2017-09-02 20:39:57 +02:00
|
|
|
#include "../machine/machine.h"
|
2017-09-04 01:52:29 -04:00
|
|
|
#include "../cdrom/cdrom.h"
|
|
|
|
|
#include "../cdrom/cdrom_ioctl.h"
|
|
|
|
|
#include "../cdrom/cdrom_image.h"
|
|
|
|
|
#include "../cdrom/cdrom_null.h"
|
|
|
|
|
#include "../floppy/floppy.h"
|
|
|
|
|
#include "../floppy/fdd.h"
|
|
|
|
|
#include "../hdd/hdd.h"
|
2017-09-30 16:56:38 -04:00
|
|
|
#include "../hdd/hdc.h"
|
|
|
|
|
#include "../hdd/hdc_ide.h"
|
2017-08-27 04:33:47 +01:00
|
|
|
#include "../scsi/scsi.h"
|
|
|
|
|
#include "../scsi/scsi_disk.h"
|
2017-09-04 01:52:29 -04:00
|
|
|
#ifdef USE_NETWORK
|
|
|
|
|
# include "../network/network.h"
|
|
|
|
|
#endif
|
2017-08-27 04:33:47 +01:00
|
|
|
#include "../video/video.h"
|
|
|
|
|
#include "../video/vid_ega.h"
|
|
|
|
|
#include "../sound/sound.h"
|
|
|
|
|
#include "../sound/snd_dbopl.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "plat_keyboard.h"
|
2017-05-27 03:53:32 +02:00
|
|
|
#include "plat_iodev.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "plat_mouse.h"
|
|
|
|
|
#include "plat_midi.h"
|
2017-06-05 01:20:51 -04:00
|
|
|
#include "plat_thread.h"
|
2017-06-19 06:46:08 +02:00
|
|
|
#include "plat_ticks.h"
|
2017-06-15 06:34:08 +02:00
|
|
|
#include "plat_ui.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "win.h"
|
2017-06-01 17:52:39 +02:00
|
|
|
#include "win_cgapal.h"
|
2017-05-18 14:03:43 -04:00
|
|
|
#include "win_ddraw.h"
|
|
|
|
|
#include "win_d3d.h"
|
|
|
|
|
#include "win_language.h"
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
#ifndef MAPVK_VK_TO_VSC
|
|
|
|
|
#define MAPVK_VK_TO_VSC 0
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
/* Declare Windows procedure */
|
|
|
|
|
LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
|
|
|
LRESULT CALLBACK subWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
|
|
|
|
|
|
|
|
LRESULT CALLBACK StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
|
|
|
|
|
|
|
|
|
#define TIMER_1SEC 1
|
|
|
|
|
|
|
|
|
|
extern int updatestatus;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct win_event_t
|
|
|
|
|
{
|
|
|
|
|
HANDLE handle;
|
|
|
|
|
} win_event_t;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-09-25 04:31:20 -04:00
|
|
|
static wchar_t wTitle[512];
|
2017-05-27 03:53:32 +02:00
|
|
|
LONG_PTR OriginalStatusBarProcedure;
|
|
|
|
|
HWND ghwnd;
|
|
|
|
|
HINSTANCE hinstance;
|
|
|
|
|
HMENU menu;
|
|
|
|
|
int pause = 0;
|
|
|
|
|
int scale = 0;
|
|
|
|
|
HWND hwndRender, hwndStatus;
|
|
|
|
|
uint64_t timer_freq;
|
|
|
|
|
int winsizex=640, winsizey=480;
|
|
|
|
|
int efwinsizey=480;
|
|
|
|
|
int gfx_present[GFX_MAX];
|
|
|
|
|
HANDLE ghMutex;
|
2017-09-08 16:35:14 +02:00
|
|
|
HANDLE slirpMutex;
|
2017-05-27 03:53:32 +02:00
|
|
|
HANDLE mainthreadh;
|
|
|
|
|
int infocus=1;
|
|
|
|
|
int drawits=0;
|
|
|
|
|
int quited=0;
|
|
|
|
|
RECT oldclip;
|
|
|
|
|
int mousecapture=0;
|
|
|
|
|
int recv_key[272];
|
|
|
|
|
HMENU *sb_menu_handles;
|
|
|
|
|
uint64_t main_time;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
static struct
|
|
|
|
|
{
|
|
|
|
|
int (*init)(HWND h);
|
|
|
|
|
void (*close)();
|
|
|
|
|
void (*resize)(int x, int y);
|
|
|
|
|
} vid_apis[2][2] =
|
2017-05-27 03:53:32 +02:00
|
|
|
{ { { ddraw_init, ddraw_close, NULL },
|
|
|
|
|
{ d3d_init, d3d_close, d3d_resize } },
|
|
|
|
|
{ { ddraw_fs_init, ddraw_fs_close, NULL },
|
|
|
|
|
{ d3d_fs_init, d3d_fs_close, NULL } } };
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int save_window_pos = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static RAWINPUTDEVICE device;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int win_doresize = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int leave_fullscreen_flag = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int unscaled_size_x = 0;
|
|
|
|
|
static int unscaled_size_y = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static uint64_t start_time;
|
|
|
|
|
static uint64_t end_time;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
HMENU smenu;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static uint8_t host_cdrom_drive_available[26];
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static uint8_t host_cdrom_drive_available_num = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static wchar_t **argv;
|
|
|
|
|
static int argc;
|
|
|
|
|
static wchar_t *argbuf;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static HANDLE hinstAcc;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static HICON hIcon[512];
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int *iStatusWidths;
|
|
|
|
|
static int *sb_icon_flags;
|
|
|
|
|
static int *sb_part_meanings;
|
|
|
|
|
static int *sb_part_icons;
|
|
|
|
|
static WCHAR **sbTips;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static int sb_parts = 0;
|
2017-05-29 01:18:32 +02:00
|
|
|
static int sb_ready = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
void updatewindowsize(int x, int y)
|
|
|
|
|
{
|
|
|
|
|
int owsx = winsizex;
|
|
|
|
|
int owsy = winsizey;
|
|
|
|
|
|
|
|
|
|
int temp_overscan_x = overscan_x;
|
|
|
|
|
int temp_overscan_y = overscan_y;
|
|
|
|
|
|
2017-07-20 21:05:27 +02:00
|
|
|
double dx, dy, dtx, dty;
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
if (vid_resize) return;
|
|
|
|
|
|
|
|
|
|
if (x < 160) x = 160;
|
|
|
|
|
if (y < 100) y = 100;
|
|
|
|
|
|
|
|
|
|
if (x > 2048) x = 2048;
|
|
|
|
|
if (y > 2048) y = 2048;
|
|
|
|
|
|
|
|
|
|
if (suppress_overscan)
|
|
|
|
|
{
|
|
|
|
|
temp_overscan_x = temp_overscan_y = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unscaled_size_x=x; efwinsizey=y;
|
|
|
|
|
|
|
|
|
|
if (force_43)
|
|
|
|
|
{
|
2017-07-20 21:05:27 +02:00
|
|
|
dx = (double) x;
|
|
|
|
|
dtx = (double) temp_overscan_x;
|
|
|
|
|
|
|
|
|
|
dy = (double) y;
|
|
|
|
|
dty = (double) temp_overscan_y;
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
/* Account for possible overscan. */
|
|
|
|
|
if (temp_overscan_y == 16)
|
|
|
|
|
{
|
|
|
|
|
/* CGA */
|
2017-07-20 21:05:27 +02:00
|
|
|
dy = (((dx - dtx) / 4.0) * 3.0) + dty;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else if (temp_overscan_y < 16)
|
|
|
|
|
{
|
|
|
|
|
/* MDA/Hercules */
|
2017-07-20 21:05:27 +02:00
|
|
|
dy = (x / 4.0) * 3.0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (enable_overscan)
|
|
|
|
|
{
|
|
|
|
|
/* EGA/(S)VGA with overscan */
|
2017-07-20 21:05:27 +02:00
|
|
|
dy = (((dx - dtx) / 4.0) * 3.0) + dty;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* EGA/(S)VGA without overscan */
|
2017-07-20 21:05:27 +02:00
|
|
|
dy = (x / 4.0) * 3.0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
2017-07-20 21:05:27 +02:00
|
|
|
unscaled_size_y = (int) dy;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
unscaled_size_y = efwinsizey;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch(scale)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
winsizex = unscaled_size_x >> 1;
|
|
|
|
|
winsizey = unscaled_size_y >> 1;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
winsizex = unscaled_size_x;
|
|
|
|
|
winsizey = unscaled_size_y;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
winsizex = (unscaled_size_x * 3) >> 1;
|
|
|
|
|
winsizey = (unscaled_size_y * 3) >> 1;
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
winsizex = unscaled_size_x << 1;
|
|
|
|
|
winsizey = unscaled_size_y << 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((owsx != winsizex) || (owsy != winsizey))
|
|
|
|
|
{
|
|
|
|
|
win_doresize = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
win_doresize = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void uws_natural(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
updatewindowsize(unscaled_size_x, efwinsizey);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void releasemouse(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
if (mousecapture)
|
|
|
|
|
{
|
|
|
|
|
ClipCursor(&oldclip);
|
|
|
|
|
ShowCursor(TRUE);
|
|
|
|
|
mousecapture = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void startblit(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
WaitForSingleObject(ghMutex, INFINITE);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void endblit(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
ReleaseMutex(ghMutex);
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-08 16:35:14 +02:00
|
|
|
void startslirp(void)
|
|
|
|
|
{
|
|
|
|
|
WaitForSingleObject(slirpMutex, INFINITE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void endslirp(void)
|
|
|
|
|
{
|
|
|
|
|
ReleaseMutex(slirpMutex);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void leave_fullscreen(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
leave_fullscreen_flag = 1;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-19 06:46:08 +02:00
|
|
|
uint32_t get_ticks(void)
|
|
|
|
|
{
|
|
|
|
|
return GetTickCount();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void delay_ms(uint32_t count)
|
|
|
|
|
{
|
|
|
|
|
Sleep(count);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
void mainthread(LPVOID param)
|
|
|
|
|
{
|
|
|
|
|
int frames = 0;
|
|
|
|
|
DWORD old_time, new_time;
|
|
|
|
|
|
|
|
|
|
RECT r;
|
|
|
|
|
int sb_borders[3];
|
|
|
|
|
|
|
|
|
|
drawits=0;
|
|
|
|
|
old_time = GetTickCount();
|
|
|
|
|
while (!quited)
|
|
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
if (updatestatus)
|
|
|
|
|
{
|
|
|
|
|
updatestatus = 0;
|
|
|
|
|
if (status_is_open)
|
|
|
|
|
{
|
|
|
|
|
SendMessage(status_hwnd, WM_USER, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
new_time = GetTickCount();
|
|
|
|
|
drawits += new_time - old_time;
|
|
|
|
|
old_time = new_time;
|
|
|
|
|
if (drawits > 0 && !pause)
|
|
|
|
|
{
|
|
|
|
|
start_time = timer_read();
|
|
|
|
|
drawits-=10; if (drawits>50) drawits=0;
|
|
|
|
|
runpc();
|
|
|
|
|
frames++;
|
|
|
|
|
if (frames >= 200 && nvr_dosave)
|
|
|
|
|
{
|
|
|
|
|
frames = 0;
|
|
|
|
|
nvr_dosave = 0;
|
|
|
|
|
savenvr();
|
|
|
|
|
}
|
|
|
|
|
end_time = timer_read();
|
|
|
|
|
main_time += end_time - start_time;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
Sleep(1);
|
|
|
|
|
|
|
|
|
|
if (!video_fullscreen && win_doresize && (winsizex > 0) && (winsizey > 0))
|
|
|
|
|
{
|
|
|
|
|
SendMessage(hwndStatus, SB_GETBORDERS, 0, (LPARAM) sb_borders);
|
|
|
|
|
GetWindowRect(ghwnd, &r);
|
2017-05-27 03:53:32 +02:00
|
|
|
MoveWindow(hwndRender, 0, 0, winsizex, winsizey, TRUE);
|
2017-05-18 14:03:43 -04:00
|
|
|
GetWindowRect(hwndRender, &r);
|
2017-05-27 03:53:32 +02:00
|
|
|
MoveWindow(hwndStatus, 0, r.bottom + GetSystemMetrics(SM_CYEDGE), winsizex, 17, TRUE);
|
2017-05-18 14:03:43 -04:00
|
|
|
GetWindowRect(ghwnd, &r);
|
|
|
|
|
|
|
|
|
|
MoveWindow(ghwnd, r.left, r.top,
|
|
|
|
|
winsizex + (GetSystemMetrics(vid_resize ? SM_CXSIZEFRAME : SM_CXFIXEDFRAME) * 2),
|
|
|
|
|
winsizey + (GetSystemMetrics(SM_CYEDGE) * 2) + (GetSystemMetrics(vid_resize ? SM_CYSIZEFRAME : SM_CYFIXEDFRAME) * 2) + GetSystemMetrics(SM_CYMENUSIZE) + GetSystemMetrics(SM_CYCAPTION) + 17 + sb_borders[1] + 1,
|
|
|
|
|
TRUE);
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (mousecapture)
|
|
|
|
|
{
|
2017-05-31 09:05:53 +02:00
|
|
|
GetWindowRect(hwndRender, &r);
|
2017-05-29 01:18:32 +02:00
|
|
|
ClipCursor(&r);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
win_doresize = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (leave_fullscreen_flag)
|
|
|
|
|
{
|
|
|
|
|
leave_fullscreen_flag = 0;
|
|
|
|
|
SendMessage(ghwnd, WM_LEAVEFULLSCREEN, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
if (video_fullscreen && infocus)
|
|
|
|
|
{
|
|
|
|
|
SetCursorPos(9999, 9999);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *thread_create(void (*thread_rout)(void *param), void *param)
|
|
|
|
|
{
|
|
|
|
|
return (void *)_beginthread(thread_rout, 0, param);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_kill(void *handle)
|
|
|
|
|
{
|
|
|
|
|
TerminateThread(handle, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_sleep(int t)
|
|
|
|
|
{
|
|
|
|
|
Sleep(t);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
event_t *thread_create_event(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
win_event_t *event = malloc(sizeof(win_event_t));
|
|
|
|
|
|
|
|
|
|
event->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
|
|
|
|
|
|
|
|
return (event_t *)event;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_set_event(event_t *_event)
|
|
|
|
|
{
|
|
|
|
|
win_event_t *event = (win_event_t *)_event;
|
|
|
|
|
|
|
|
|
|
SetEvent(event->handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_reset_event(event_t *_event)
|
|
|
|
|
{
|
|
|
|
|
win_event_t *event = (win_event_t *)_event;
|
|
|
|
|
|
|
|
|
|
ResetEvent(event->handle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int thread_wait_event(event_t *_event, int timeout)
|
|
|
|
|
{
|
|
|
|
|
win_event_t *event = (win_event_t *)_event;
|
|
|
|
|
|
|
|
|
|
if (timeout == -1)
|
|
|
|
|
timeout = INFINITE;
|
|
|
|
|
|
|
|
|
|
if (WaitForSingleObject(event->handle, timeout))
|
|
|
|
|
return 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_destroy_event(event_t *_event)
|
|
|
|
|
{
|
|
|
|
|
win_event_t *event = (win_event_t *)_event;
|
|
|
|
|
|
|
|
|
|
CloseHandle(event->handle);
|
|
|
|
|
|
|
|
|
|
free(event);
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-08 16:35:14 +02:00
|
|
|
void *thread_create_mutex(wchar_t *name)
|
|
|
|
|
{
|
|
|
|
|
return (void*) CreateMutex(NULL, FALSE, name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void thread_close_mutex(void *mutex)
|
|
|
|
|
{
|
|
|
|
|
CloseHandle((HANDLE) mutex);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t thread_wait_mutex(void *mutex)
|
|
|
|
|
{
|
|
|
|
|
DWORD dwres = WaitForSingleObject((HANDLE) mutex, INFINITE);
|
|
|
|
|
|
|
|
|
|
switch (dwres)
|
|
|
|
|
{
|
|
|
|
|
case WAIT_OBJECT_0:
|
|
|
|
|
return 1;
|
|
|
|
|
case WAIT_ABANDONED:
|
|
|
|
|
default:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint8_t thread_release_mutex(void *mutex)
|
|
|
|
|
{
|
|
|
|
|
return !!ReleaseMutex((HANDLE) mutex);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
static void init_cdrom_host_drives(void)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
WCHAR s[64];
|
|
|
|
|
|
|
|
|
|
host_cdrom_drive_available_num = 0;
|
|
|
|
|
|
|
|
|
|
for (i='A'; i<='Z'; i++)
|
|
|
|
|
{
|
2017-05-29 01:18:32 +02:00
|
|
|
_swprintf(s, L"%c:\\", i);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
if (GetDriveType(s)==DRIVE_CDROM)
|
|
|
|
|
{
|
|
|
|
|
host_cdrom_drive_available[i - 'A'] = 1;
|
|
|
|
|
|
|
|
|
|
host_cdrom_drive_available_num++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
host_cdrom_drive_available[i - 'A'] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HMENU create_popup_menu(int part)
|
|
|
|
|
{
|
|
|
|
|
HMENU newHandle;
|
|
|
|
|
newHandle = CreatePopupMenu();
|
|
|
|
|
AppendMenu(smenu, MF_POPUP, (UINT_PTR) newHandle, 0);
|
|
|
|
|
return newHandle;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
void create_floppy_submenu(HMENU m, int id)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_NEW | id, win_language_get_string_from_id(IDS_2161));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_EXISTING | id, win_language_get_string_from_id(IDS_2162));
|
|
|
|
|
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_EXISTING_WP | id, win_language_get_string_from_id(IDS_2163));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_FLOPPY_EJECT | id, win_language_get_string_from_id(IDS_2164));
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void create_cdrom_submenu(HMENU m, int id)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
WCHAR s[64];
|
|
|
|
|
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_CDROM_MUTE | id, win_language_get_string_from_id(IDS_2165));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_CDROM_EMPTY | id, win_language_get_string_from_id(IDS_2166));
|
|
|
|
|
AppendMenu(m, MF_STRING, IDM_CDROM_RELOAD | id, win_language_get_string_from_id(IDS_2167));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_CDROM_IMAGE | id, win_language_get_string_from_id(IDS_2168));
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
if (host_cdrom_drive_available_num == 0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
|
|
|
|
cdrom_drives[id].host_drive = 0;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
goto check_menu_items;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
2017-06-01 01:47:54 +02:00
|
|
|
if (!host_cdrom_drive_available[cdrom_drives[id].host_drive - 'A'])
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
cdrom_drives[id].host_drive = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 26; i++)
|
|
|
|
|
{
|
2017-06-08 00:58:47 +02:00
|
|
|
_swprintf(s, L"Host CD/DVD Drive (%c:)", i + 0x41);
|
2017-05-27 03:53:32 +02:00
|
|
|
if (host_cdrom_drive_available[i])
|
|
|
|
|
{
|
|
|
|
|
AppendMenu(m, MF_STRING, IDM_CDROM_HOST_DRIVE | (i << 3) | id, s);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check_menu_items:
|
|
|
|
|
if (!cdrom_drives[id].sound_on)
|
|
|
|
|
{
|
2017-05-29 01:18:32 +02:00
|
|
|
CheckMenuItem(m, IDM_CDROM_MUTE | id, MF_CHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cdrom_drives[id].host_drive == 200)
|
|
|
|
|
{
|
2017-05-29 01:18:32 +02:00
|
|
|
CheckMenuItem(m, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
else if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
2017-05-29 01:18:32 +02:00
|
|
|
CheckMenuItem(m, IDM_CDROM_HOST_DRIVE | id | ((cdrom_drives[id].host_drive - 'A') << 3), MF_CHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
cdrom_drives[id].host_drive = 0;
|
2017-05-29 01:18:32 +02:00
|
|
|
CheckMenuItem(m, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
void create_removable_disk_submenu(HMENU m, int id)
|
|
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_RDISK_EJECT | id, win_language_get_string_from_id(IDS_2166));
|
|
|
|
|
AppendMenu(m, MF_STRING, IDM_RDISK_RELOAD | id, win_language_get_string_from_id(IDS_2167));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_RDISK_SEND_CHANGE | id, win_language_get_string_from_id(IDS_2142));
|
2017-05-27 03:53:32 +02:00
|
|
|
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
2017-07-24 12:04:39 +02:00
|
|
|
AppendMenu(m, MF_STRING, IDM_RDISK_IMAGE | id, win_language_get_string_from_id(IDS_2168));
|
|
|
|
|
AppendMenu(m, MF_STRING, IDM_RDISK_IMAGE_WP | id, win_language_get_string_from_id(IDS_2169));
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-06-15 06:34:08 +02:00
|
|
|
void get_executable_name(wchar_t *s, int size)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
GetModuleFileName(hinstance, s, size);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-15 06:34:08 +02:00
|
|
|
void set_window_title(wchar_t *s)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-09-25 04:31:20 -04:00
|
|
|
if (! video_fullscreen) {
|
|
|
|
|
if (s != NULL)
|
|
|
|
|
wcscpy(wTitle, s);
|
|
|
|
|
else
|
|
|
|
|
s = wTitle;
|
|
|
|
|
|
|
|
|
|
SetWindowText(ghwnd, s);
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
uint64_t timer_read(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
LARGE_INTEGER qpc_time;
|
|
|
|
|
QueryPerformanceCounter(&qpc_time);
|
|
|
|
|
return qpc_time.QuadPart;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
static void process_command_line(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
WCHAR *cmdline;
|
|
|
|
|
int argc_max;
|
|
|
|
|
int i, q;
|
|
|
|
|
|
|
|
|
|
cmdline = GetCommandLine();
|
|
|
|
|
i = wcslen(cmdline) + 1;
|
|
|
|
|
argbuf = malloc(i * 2);
|
|
|
|
|
memcpy(argbuf, cmdline, i * 2);
|
|
|
|
|
|
|
|
|
|
argc = 0;
|
|
|
|
|
argc_max = 64;
|
|
|
|
|
argv = malloc(sizeof(wchar_t *) * argc_max);
|
|
|
|
|
if (!argv)
|
|
|
|
|
{
|
|
|
|
|
free(argbuf);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
/* parse commandline into argc/argv format */
|
|
|
|
|
while (argbuf[i])
|
|
|
|
|
{
|
|
|
|
|
while (argbuf[i] == L' ')
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
if (argbuf[i])
|
|
|
|
|
{
|
|
|
|
|
if ((argbuf[i] == L'\'') || (argbuf[i] == L'"'))
|
|
|
|
|
{
|
|
|
|
|
q = argbuf[i++];
|
|
|
|
|
if (!argbuf[i])
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
q = 0;
|
|
|
|
|
|
|
|
|
|
argv[argc++] = &argbuf[i];
|
|
|
|
|
|
|
|
|
|
if (argc >= argc_max)
|
|
|
|
|
{
|
|
|
|
|
argc_max += 64;
|
|
|
|
|
argv = realloc(argv, sizeof(wchar_t *) * argc_max);
|
|
|
|
|
if (!argv)
|
|
|
|
|
{
|
|
|
|
|
free(argbuf);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while ((argbuf[i]) && ((q) ? (argbuf[i] != q) : (argbuf[i] != L' ')))
|
|
|
|
|
i++;
|
|
|
|
|
|
|
|
|
|
if (argbuf[i])
|
|
|
|
|
{
|
|
|
|
|
argbuf[i] = 0;
|
|
|
|
|
i++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
argv[argc] = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int find_in_array(int *array, int val, int len, int menu_base)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
int temp = 0;
|
|
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
|
{
|
|
|
|
|
CheckMenuItem(menu, menu_base + array[i], MF_UNCHECKED);
|
|
|
|
|
if (array[i] == val)
|
|
|
|
|
{
|
|
|
|
|
temp = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return temp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HICON LoadIconEx(PCTSTR pszIconName)
|
|
|
|
|
{
|
|
|
|
|
return (HICON) LoadImage(hinstance, pszIconName, IMAGE_ICON, 16, 16, LR_SHARED);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HICON LoadIconBig(PCTSTR pszIconName)
|
|
|
|
|
{
|
|
|
|
|
return (HICON) LoadImage(hinstance, pszIconName, IMAGE_ICON, 64, 64, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int fdd_type_to_icon(int type)
|
|
|
|
|
{
|
|
|
|
|
switch(type)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
case 0:
|
|
|
|
|
return 512;
|
|
|
|
|
case 1:
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
case 4:
|
|
|
|
|
case 5:
|
|
|
|
|
case 6:
|
2017-08-22 02:16:15 +02:00
|
|
|
return 128;
|
2017-05-18 14:03:43 -04:00
|
|
|
case 7:
|
|
|
|
|
case 8:
|
|
|
|
|
case 9:
|
|
|
|
|
case 10:
|
|
|
|
|
case 11:
|
|
|
|
|
case 12:
|
|
|
|
|
case 13:
|
2017-08-22 02:16:15 +02:00
|
|
|
return 144;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
|
|
|
|
|
/* FIXME: should be hdd_count() in hdd.c */
|
|
|
|
|
int hdd_count(int bus)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
int c = 0;
|
|
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
for (i = 0; i < HDD_NUM; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-09-30 16:56:38 -04:00
|
|
|
if (hdd[i].bus == bus)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
c++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return c;
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
int find_status_bar_part(int tag)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
int found = -1;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (!sb_ready || (sb_parts == 0) || (sb_part_meanings == NULL))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-06-13 13:44:51 -04:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
if (sb_part_meanings[i] == tag)
|
|
|
|
|
{
|
|
|
|
|
found = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
return found;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
/* This is for the disk activity indicator. */
|
|
|
|
|
void update_status_bar_icon(int tag, int active)
|
|
|
|
|
{
|
|
|
|
|
int found = -1;
|
|
|
|
|
int temp_flags = 0;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (((tag & 0xf0) >= SB_TEXT) || !sb_ready || (sb_parts == 0) || (sb_icon_flags == NULL) || (sb_part_icons == NULL))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
temp_flags |= active;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
found = find_status_bar_part(tag);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
if (found != -1)
|
|
|
|
|
{
|
|
|
|
|
if (temp_flags != (sb_icon_flags[found] & 1))
|
|
|
|
|
{
|
|
|
|
|
sb_icon_flags[found] &= ~1;
|
|
|
|
|
sb_icon_flags[found] |= active;
|
|
|
|
|
|
|
|
|
|
sb_part_icons[found] &= ~257;
|
|
|
|
|
sb_part_icons[found] |= sb_icon_flags[found];
|
|
|
|
|
|
|
|
|
|
SendMessage(hwndStatus, SB_SETICON, found, (LPARAM) hIcon[sb_part_icons[found]]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* This is for the drive state indicator. */
|
|
|
|
|
void update_status_bar_icon_state(int tag, int state)
|
|
|
|
|
{
|
|
|
|
|
int found = -1;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (((tag & 0xf0) >= SB_HDD) || !sb_ready || (sb_parts == 0) || (sb_icon_flags == NULL) || (sb_part_icons == NULL))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
found = find_status_bar_part(tag);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
if (found != -1)
|
|
|
|
|
{
|
|
|
|
|
sb_icon_flags[found] &= ~256;
|
|
|
|
|
sb_icon_flags[found] |= state ? 256 : 0;
|
|
|
|
|
|
|
|
|
|
sb_part_icons[found] &= ~257;
|
|
|
|
|
sb_part_icons[found] |= sb_icon_flags[found];
|
|
|
|
|
|
|
|
|
|
SendMessage(hwndStatus, SB_SETICON, found, (LPARAM) hIcon[sb_part_icons[found]]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void create_floppy_tip(int part)
|
|
|
|
|
{
|
|
|
|
|
WCHAR wtext[512];
|
2017-05-27 03:53:32 +02:00
|
|
|
WCHAR tempTip[512];
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
int drive = sb_part_meanings[part] & 0xf;
|
|
|
|
|
|
|
|
|
|
mbstowcs(wtext, fdd_getname(fdd_get_type(drive)), strlen(fdd_getname(fdd_get_type(drive))) + 1);
|
2017-09-04 01:52:29 -04:00
|
|
|
if (wcslen(floppyfns[drive]) == 0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_2158), drive + 1, wtext, win_language_get_string_from_id(IDS_2057));
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-09-04 01:52:29 -04:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_2158), drive + 1, wtext, floppyfns[drive]);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sbTips[part] != NULL)
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[part]);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
sbTips[part] = (WCHAR *) malloc((wcslen(tempTip) << 1) + 2);
|
|
|
|
|
wcscpy(sbTips[part], tempTip);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void create_cdrom_tip(int part)
|
|
|
|
|
{
|
|
|
|
|
WCHAR wtext[512];
|
2017-05-27 03:53:32 +02:00
|
|
|
WCHAR tempTip[512];
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-07-24 12:04:39 +02:00
|
|
|
WCHAR *szText;
|
|
|
|
|
int id;
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
int drive = sb_part_meanings[part] & 0xf;
|
|
|
|
|
|
2017-07-24 12:04:39 +02:00
|
|
|
int bus = cdrom_drives[drive].bus_type;
|
|
|
|
|
|
|
|
|
|
id = IDS_4352 + (bus - 1);
|
|
|
|
|
|
|
|
|
|
szText = (WCHAR *) win_language_get_string_from_id(id);
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
if (cdrom_drives[drive].host_drive == 200)
|
|
|
|
|
{
|
|
|
|
|
if (wcslen(cdrom_image[drive].image_path) == 0)
|
|
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_5120), drive + 1, szText, win_language_get_string_from_id(IDS_2057));
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_5120), drive + 1, szText, cdrom_image[drive].image_path);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
2017-07-24 12:04:39 +02:00
|
|
|
else if ((cdrom_drives[drive].host_drive >= 'A') && (cdrom_drives[drive].host_drive <= 'Z'))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(wtext, win_language_get_string_from_id(IDS_2058), cdrom_drives[drive].host_drive & ~0x20);
|
|
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_5120), drive + 1, szText, wtext);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_5120), drive + 1, szText, win_language_get_string_from_id(IDS_2057));
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sbTips[part] != NULL)
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[part]);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
sbTips[part] = (WCHAR *) malloc((wcslen(tempTip) << 1) + 2);
|
|
|
|
|
wcscpy(sbTips[part], tempTip);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
2017-05-21 03:52:18 +02:00
|
|
|
void create_removable_hd_tip(int part)
|
|
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
WCHAR tempTip[512];
|
2017-05-21 03:52:18 +02:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
int drive = sb_part_meanings[part] & 0x1f;
|
2017-05-21 03:52:18 +02:00
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
if (wcslen(hdd[drive].fn) == 0)
|
2017-05-21 03:52:18 +02:00
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_4115), drive, win_language_get_string_from_id(IDS_2057));
|
2017-05-21 03:52:18 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-09-30 16:56:38 -04:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_4115), drive, hdd[drive].fn);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sbTips[part] != NULL)
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[part]);
|
2017-05-21 03:52:18 +02:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
sbTips[part] = (WCHAR *) malloc((wcslen(tempTip) << 1) + 2);
|
|
|
|
|
wcscpy(sbTips[part], tempTip);
|
2017-05-21 03:52:18 +02:00
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
void create_hd_tip(int part)
|
|
|
|
|
{
|
2017-07-24 12:04:39 +02:00
|
|
|
WCHAR tempTip[512];
|
2017-05-18 14:03:43 -04:00
|
|
|
WCHAR *szText;
|
2017-07-24 12:04:39 +02:00
|
|
|
int id;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
int bus = sb_part_meanings[part] & 0xf;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-07-24 12:04:39 +02:00
|
|
|
id = IDS_4352 + (bus - 1);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
szText = (WCHAR *) win_language_get_string_from_id(id);
|
|
|
|
|
|
2017-07-24 12:04:39 +02:00
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_4096), szText);
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (sbTips[part] != NULL)
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[part]);
|
|
|
|
|
}
|
2017-07-24 12:04:39 +02:00
|
|
|
sbTips[part] = (WCHAR *) malloc((wcslen(tempTip) << 1) + 2);
|
|
|
|
|
wcscpy(sbTips[part], tempTip);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
void create_network_tip(int part)
|
|
|
|
|
{
|
|
|
|
|
WCHAR tempTip[512];
|
|
|
|
|
|
|
|
|
|
_swprintf(tempTip, win_language_get_string_from_id(IDS_2069));
|
|
|
|
|
|
|
|
|
|
if (sbTips[part] != NULL)
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[part]);
|
|
|
|
|
}
|
|
|
|
|
sbTips[part] = (WCHAR *) malloc((wcslen(tempTip) << 1) + 2);
|
|
|
|
|
wcscpy(sbTips[part], tempTip);
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:16:15 +02:00
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
void update_tip(int meaning)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
int part = -1;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (!sb_ready || (sb_parts == 0) || (sb_part_meanings == NULL))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
|
|
|
|
if (sb_part_meanings[i] == meaning)
|
|
|
|
|
{
|
|
|
|
|
part = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (part != -1)
|
|
|
|
|
{
|
2017-05-18 21:51:11 +02:00
|
|
|
switch(meaning & 0xf0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_FLOPPY:
|
2017-05-18 14:03:43 -04:00
|
|
|
create_floppy_tip(part);
|
|
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_CDROM:
|
2017-05-18 14:03:43 -04:00
|
|
|
create_cdrom_tip(part);
|
|
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_RDISK:
|
2017-05-18 21:51:11 +02:00
|
|
|
create_removable_hd_tip(part);
|
|
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_HDD:
|
2017-05-18 14:03:43 -04:00
|
|
|
create_hd_tip(part);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SendMessage(hwndStatus, SB_SETTIPTEXT, part, (LPARAM) sbTips[part]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void status_settextw(wchar_t *wstr)
|
|
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
int part = -1;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
if (!sb_ready || (sb_parts == 0) || (sb_part_meanings == NULL))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
if (sb_part_meanings[i] == SB_TEXT)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
part = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (part != -1)
|
|
|
|
|
{
|
|
|
|
|
SendMessage(hwndStatus, SB_SETTEXT, part | SBT_NOBORDERS, (LPARAM) wstr);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static wchar_t cwstr[512];
|
|
|
|
|
|
|
|
|
|
void status_settext(char *str)
|
|
|
|
|
{
|
|
|
|
|
memset(cwstr, 0, 1024);
|
|
|
|
|
mbstowcs(cwstr, str, strlen(str) + 1);
|
|
|
|
|
status_settextw(cwstr);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void destroy_menu_handles(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
if (sb_parts == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-12 01:52:52 +02:00
|
|
|
if (!sb_menu_handles)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
2017-08-12 01:52:52 +02:00
|
|
|
if (sb_menu_handles[i])
|
|
|
|
|
{
|
|
|
|
|
DestroyMenu(sb_menu_handles[i]);
|
|
|
|
|
sb_menu_handles[i] = NULL;
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(sb_menu_handles);
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void destroy_tips(void)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
if (sb_parts == 0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-12 01:52:52 +02:00
|
|
|
if (!sbTips)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
2017-08-12 01:52:52 +02:00
|
|
|
if (sbTips[i])
|
|
|
|
|
{
|
|
|
|
|
free(sbTips[i]);
|
|
|
|
|
sbTips[i] = NULL;
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
free(sbTips);
|
2017-08-12 01:52:52 +02:00
|
|
|
sbTips = NULL;
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
int display_network_icon(void)
|
|
|
|
|
{
|
|
|
|
|
if (network_card == 0)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (network_type == 0)
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return network_test();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:16:15 +02:00
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
void update_status_bar_panes(HWND hwnds)
|
|
|
|
|
{
|
2017-08-22 02:16:15 +02:00
|
|
|
int i, id;
|
2017-05-18 14:03:43 -04:00
|
|
|
int edge = 0;
|
|
|
|
|
|
|
|
|
|
int c_mfm = 0;
|
2017-08-25 02:21:26 -04:00
|
|
|
int c_esdi = 0;
|
2017-05-27 03:53:32 +02:00
|
|
|
int c_xtide = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
int c_ide_pio = 0;
|
|
|
|
|
int c_ide_dma = 0;
|
|
|
|
|
int c_scsi = 0;
|
|
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
int do_net = 0;
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:16:15 +02:00
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
sb_ready = 0;
|
|
|
|
|
|
2017-09-30 16:56:38 -04:00
|
|
|
c_mfm = hdd_count(HDD_BUS_MFM);
|
|
|
|
|
c_esdi = hdd_count(HDD_BUS_ESDI);
|
|
|
|
|
c_xtide = hdd_count(HDD_BUS_XTIDE);
|
|
|
|
|
c_ide_pio = hdd_count(HDD_BUS_IDE_PIO_ONLY);
|
|
|
|
|
c_ide_dma = hdd_count(HDD_BUS_IDE_PIO_AND_DMA);
|
|
|
|
|
c_scsi = hdd_count(HDD_BUS_SCSI);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
do_net = display_network_icon();
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:16:15 +02:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (sb_parts > 0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
|
|
|
|
SendMessage(hwnds, SB_SETICON, i, (LPARAM) NULL);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-12 01:52:52 +02:00
|
|
|
SendMessage(hwnds, SB_SETPARTS, (WPARAM) 0, (LPARAM) NULL);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-08-12 01:52:52 +02:00
|
|
|
if (iStatusWidths)
|
|
|
|
|
{
|
|
|
|
|
free(iStatusWidths);
|
|
|
|
|
iStatusWidths = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (sb_part_meanings)
|
|
|
|
|
{
|
|
|
|
|
free(sb_part_meanings);
|
|
|
|
|
sb_part_meanings = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (sb_part_icons)
|
|
|
|
|
{
|
|
|
|
|
free(sb_part_icons);
|
|
|
|
|
sb_part_icons = NULL;
|
|
|
|
|
}
|
|
|
|
|
if (sb_icon_flags)
|
|
|
|
|
{
|
|
|
|
|
free(sb_icon_flags);
|
|
|
|
|
sb_icon_flags = NULL;
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
destroy_menu_handles();
|
|
|
|
|
destroy_tips();
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
2017-08-12 01:52:52 +02:00
|
|
|
sb_parts = 0;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
for (i = 0; i < FDD_NUM; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
if (fdd_get_type(i) != 0)
|
|
|
|
|
{
|
|
|
|
|
/* pclog("update_status_bar_panes(): Found floppy drive %c:, type %i\n", 65 + i, fdd_get_type(i)); */
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
for (i = 0; i < CDROM_NUM; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-09-02 20:39:57 +02:00
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI_PIO_ONLY) && !(machines[machine].flags & MACHINE_HAS_IDE))
|
2017-08-12 01:52:52 +02:00
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI_PIO_AND_DMA) && !(machines[machine].flags & MACHINE_HAS_IDE))
|
2017-08-12 01:52:52 +02:00
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) && (scsi_card_current == 0))
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
if (cdrom_drives[i].bus_type != 0)
|
|
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
for (i = 0; i < HDD_NUM; i++)
|
2017-05-18 21:51:11 +02:00
|
|
|
{
|
2017-09-30 16:56:38 -04:00
|
|
|
if ((hdd[i].bus == HDD_BUS_SCSI_REMOVABLE) && (scsi_card_current != 0))
|
2017-05-18 21:51:11 +02:00
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_mfm && !(machines[machine].flags & MACHINE_HAS_IDE) && !!memcmp(hdc_name, "none", 4) && !!memcmp(hdc_name, "xtide", 5) && !!memcmp(hdc_name, "esdi", 4))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_esdi && !memcmp(hdc_name, "esdi", 4))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_xtide && !memcmp(hdc_name, "xtide", 5))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if (c_ide_pio && (machines[machine].flags & MACHINE_HAS_IDE))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if (c_ide_dma && (machines[machine].flags & MACHINE_HAS_IDE))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
if (c_scsi && (scsi_card_current != 0))
|
|
|
|
|
{
|
|
|
|
|
sb_parts++;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
if (do_net)
|
|
|
|
|
{
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-05-18 14:03:43 -04:00
|
|
|
sb_parts++;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
iStatusWidths = (int *) malloc(sb_parts * sizeof(int));
|
|
|
|
|
sb_part_meanings = (int *) malloc(sb_parts * sizeof(int));
|
|
|
|
|
sb_part_icons = (int *) malloc(sb_parts * sizeof(int));
|
|
|
|
|
sb_icon_flags = (int *) malloc(sb_parts * sizeof(int));
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_menu_handles = (HMENU *) malloc(sb_parts * sizeof(HMENU));
|
|
|
|
|
sbTips = (WCHAR **) malloc(sb_parts * sizeof(WCHAR *));
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
memset(iStatusWidths, 0, sb_parts * sizeof(int));
|
|
|
|
|
memset(sb_part_meanings, 0, sb_parts * sizeof(int));
|
|
|
|
|
memset(sb_part_icons, 0, sb_parts * sizeof(int));
|
|
|
|
|
memset(sb_icon_flags, 0, sb_parts * sizeof(int));
|
2017-05-27 03:53:32 +02:00
|
|
|
memset(sb_menu_handles, 0, sb_parts * sizeof(HMENU));
|
2017-06-03 02:11:36 +02:00
|
|
|
memset(sbTips, 0, sb_parts * sizeof(WCHAR *));
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
sb_parts = 0;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < FDD_NUM; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
if (fdd_get_type(i) != 0)
|
|
|
|
|
{
|
|
|
|
|
/* pclog("update_status_bar_panes(): Found floppy drive %c:, type %i\n", 65 + i, fdd_get_type(i)); */
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_FLOPPY | i;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (i = 0; i < CDROM_NUM; i++)
|
|
|
|
|
{
|
2017-09-02 20:39:57 +02:00
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI_PIO_ONLY) && !(machines[machine].flags & MACHINE_HAS_IDE))
|
2017-08-12 01:52:52 +02:00
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_ATAPI_PIO_AND_DMA) && !(machines[machine].flags & MACHINE_HAS_IDE))
|
2017-08-12 01:52:52 +02:00
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if ((cdrom_drives[i].bus_type == CDROM_BUS_SCSI) && (scsi_card_current == 0))
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
if (cdrom_drives[i].bus_type != 0)
|
|
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_CDROM | i;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
for (i = 0; i < HDD_NUM; i++)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-09-30 16:56:38 -04:00
|
|
|
if ((hdd[i].bus == HDD_BUS_SCSI_REMOVABLE) && (scsi_card_current != 0))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_RDISK | i;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_mfm && !(machines[machine].flags & MACHINE_HAS_IDE) && !!memcmp(hdc_name, "none", 4) && !!memcmp(hdc_name, "xtide", 5) && !!memcmp(hdc_name, "esdi", 4))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_MFM;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_esdi && !memcmp(hdc_name, "esdi", 4))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
2017-08-25 02:21:26 -04:00
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_ESDI;
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-30 16:56:38 -04:00
|
|
|
if (c_xtide && !memcmp(hdc_name, "xtide", 5))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_XTIDE;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if (c_ide_pio && (machines[machine].flags & MACHINE_HAS_IDE))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_IDE_PIO_ONLY;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-09-02 20:39:57 +02:00
|
|
|
if (c_ide_dma && (machines[machine].flags & MACHINE_HAS_IDE))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_IDE_PIO_AND_DMA;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-08-12 01:52:52 +02:00
|
|
|
if (c_scsi && (scsi_card_current != 0))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_HDD | HDD_BUS_SCSI;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
if (do_net)
|
|
|
|
|
{
|
|
|
|
|
edge += SB_ICON_WIDTH;
|
|
|
|
|
iStatusWidths[sb_parts] = edge;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_NETWORK;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-05-27 03:53:32 +02:00
|
|
|
if (sb_parts)
|
|
|
|
|
{
|
|
|
|
|
iStatusWidths[sb_parts - 1] += (24 - SB_ICON_WIDTH);
|
|
|
|
|
}
|
|
|
|
|
iStatusWidths[sb_parts] = -1;
|
|
|
|
|
sb_part_meanings[sb_parts] = SB_TEXT;
|
|
|
|
|
sb_parts++;
|
|
|
|
|
|
|
|
|
|
SendMessage(hwnds, SB_SETPARTS, (WPARAM) sb_parts, (LPARAM) iStatusWidths);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < sb_parts; i++)
|
|
|
|
|
{
|
|
|
|
|
switch (sb_part_meanings[i] & 0xf0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_FLOPPY:
|
2017-05-18 14:03:43 -04:00
|
|
|
/* Floppy */
|
2017-09-04 01:52:29 -04:00
|
|
|
sb_icon_flags[i] = (wcslen(floppyfns[sb_part_meanings[i] & 0xf]) == 0) ? 256 : 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
sb_part_icons[i] = fdd_type_to_icon(fdd_get_type(sb_part_meanings[i] & 0xf)) | sb_icon_flags[i];
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_menu_handles[i] = create_popup_menu(i);
|
|
|
|
|
create_floppy_submenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[i], IDM_FLOPPY_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_icon_flags[i] & 256) ? MF_GRAYED : MF_ENABLED));
|
2017-05-18 14:03:43 -04:00
|
|
|
create_floppy_tip(i);
|
|
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_CDROM:
|
2017-05-18 14:03:43 -04:00
|
|
|
/* CD-ROM */
|
|
|
|
|
id = sb_part_meanings[i] & 0xf;
|
2017-06-01 01:47:54 +02:00
|
|
|
if (cdrom_drives[id].host_drive == 200)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-06-01 01:47:54 +02:00
|
|
|
sb_icon_flags[i] = (wcslen(cdrom_image[id].image_path) == 0) ? 256 : 0;
|
|
|
|
|
}
|
|
|
|
|
else if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
|
|
|
|
sb_icon_flags[i] = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-06-01 01:47:54 +02:00
|
|
|
sb_icon_flags[i] = 256;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-08-22 02:16:15 +02:00
|
|
|
sb_part_icons[i] = 160 | sb_icon_flags[i];
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_menu_handles[i] = create_popup_menu(i);
|
|
|
|
|
create_cdrom_submenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[i], IDM_CDROM_RELOAD | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | MF_GRAYED);
|
2017-05-18 14:03:43 -04:00
|
|
|
create_cdrom_tip(i);
|
|
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_RDISK:
|
2017-05-18 21:51:11 +02:00
|
|
|
/* Removable hard disk */
|
2017-09-30 16:56:38 -04:00
|
|
|
sb_icon_flags[i] = (wcslen(hdd[sb_part_meanings[i] & 0x1f].fn) == 0) ? 256 : 0;
|
2017-05-18 21:51:11 +02:00
|
|
|
sb_part_icons[i] = 176 + sb_icon_flags[i];
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_menu_handles[i] = create_popup_menu(i);
|
|
|
|
|
create_removable_disk_submenu(sb_menu_handles[i], sb_part_meanings[i] & 0x1f);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[i], IDM_RDISK_EJECT | (sb_part_meanings[i] & 0x1f), MF_BYCOMMAND | ((sb_icon_flags[i] & 256) ? MF_GRAYED : MF_ENABLED));
|
|
|
|
|
EnableMenuItem(sb_menu_handles[i], IDM_RDISK_RELOAD | (sb_part_meanings[i] & 0x1f), MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[i], IDM_RDISK_SEND_CHANGE | (sb_part_meanings[i] & 0x1f), MF_BYCOMMAND | ((sb_icon_flags[i] & 256) ? MF_GRAYED : MF_ENABLED));
|
2017-05-21 03:52:18 +02:00
|
|
|
create_removable_hd_tip(i);
|
2017-05-18 21:51:11 +02:00
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_HDD:
|
2017-05-18 14:03:43 -04:00
|
|
|
/* Hard disk */
|
2017-08-22 02:16:15 +02:00
|
|
|
sb_part_icons[i] = 192;
|
2017-05-18 14:03:43 -04:00
|
|
|
create_hd_tip(i);
|
|
|
|
|
break;
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
case SB_NETWORK:
|
|
|
|
|
/* Hard disk */
|
|
|
|
|
sb_part_icons[i] = 208;
|
|
|
|
|
create_network_tip(i);
|
|
|
|
|
break;
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-05-27 03:53:32 +02:00
|
|
|
case SB_TEXT:
|
2017-05-18 14:03:43 -04:00
|
|
|
/* Status text */
|
2017-06-14 07:21:01 +02:00
|
|
|
SendMessage(hwnds, SB_SETTEXT, i | SBT_NOBORDERS, (LPARAM) L"");
|
2017-05-18 14:03:43 -04:00
|
|
|
sb_part_icons[i] = -1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (sb_part_icons[i] != -1)
|
|
|
|
|
{
|
|
|
|
|
SendMessage(hwnds, SB_SETTEXT, i | SBT_NOBORDERS, (LPARAM) "");
|
|
|
|
|
SendMessage(hwnds, SB_SETICON, i, (LPARAM) hIcon[sb_part_icons[i]]);
|
|
|
|
|
SendMessage(hwnds, SB_SETTIPTEXT, i, (LPARAM) sbTips[i]);
|
|
|
|
|
/* pclog("Status bar part found: %02X (%i)\n", sb_part_meanings[i], sb_part_icons[i]); */
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SendMessage(hwnds, SB_SETICON, i, (LPARAM) NULL);
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-05-29 01:18:32 +02:00
|
|
|
|
|
|
|
|
sb_ready = 1;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HWND EmulatorStatusBar(HWND hwndParent, int idStatus, HINSTANCE hinst)
|
|
|
|
|
{
|
|
|
|
|
HWND hwndStatus;
|
|
|
|
|
int i;
|
|
|
|
|
RECT rectDialog;
|
|
|
|
|
int dw, dh;
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 128; i < 130; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 144; i < 146; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 160; i < 162; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 21:51:11 +02:00
|
|
|
for (i = 176; i < 178; i++)
|
|
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 192; i < 194; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 208; i < 210; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 384; i < 386; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 400; i < 402; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:16:15 +02:00
|
|
|
for (i = 416; i < 418; i++)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 21:51:11 +02:00
|
|
|
for (i = 432; i < 434; i++)
|
|
|
|
|
{
|
|
|
|
|
hIcon[i] = LoadIconEx((PCTSTR) i);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
GetWindowRect(hwndParent, &rectDialog);
|
|
|
|
|
dw = rectDialog.right - rectDialog.left;
|
|
|
|
|
dh = rectDialog.bottom - rectDialog.top;
|
|
|
|
|
|
|
|
|
|
InitCommonControls();
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
hwndStatus = CreateWindowEx(0, STATUSCLASSNAME, (PCTSTR) NULL, SBARS_SIZEGRIP | WS_CHILD | WS_VISIBLE | SBT_TOOLTIPS, 0, dh - 17, dw, 17, hwndParent,
|
|
|
|
|
(HMENU) idStatus, hinst, NULL);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
GetWindowRect(hwndStatus, &rectDialog);
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
SetWindowPos(hwndStatus, HWND_TOPMOST, rectDialog.left, rectDialog.top, rectDialog.right - rectDialog.left, rectDialog.bottom - rectDialog.top, SWP_SHOWWINDOW);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
SendMessage(hwndStatus, SB_SETMINHEIGHT, (WPARAM) 17, (LPARAM) 0);
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
sb_parts = 0;
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
update_status_bar_panes(hwndStatus);
|
|
|
|
|
|
|
|
|
|
return hwndStatus;
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-08 23:49:08 -04:00
|
|
|
void win_menu_update(void)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
#if 0
|
|
|
|
|
menu = LoadMenu(hThisInstance, TEXT("MainMenu"));
|
|
|
|
|
|
|
|
|
|
smenu = LoadMenu(hThisInstance, TEXT("StatusBarMenu"));
|
|
|
|
|
initmenu();
|
|
|
|
|
|
|
|
|
|
SetMenu(ghwnd, menu);
|
|
|
|
|
|
|
|
|
|
win_title_update = 1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-22 02:47:22 +02:00
|
|
|
void reset_menus(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef ENABLE_LOG_TOGGLES
|
|
|
|
|
# ifdef ENABLE_BUSLOGIC_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_BUSLOGIC, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_CDROM_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_CDROM, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_D86F_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_D86F, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_FDC_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_FDC, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_IDE_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_IDE, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_SERIAL_LOG
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_SERIAL, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:47:22 +02:00
|
|
|
# ifdef ENABLE_NIC_LOG
|
|
|
|
|
/*FIXME: should be network_setlog(1:0) */
|
2017-08-22 14:43:59 +02:00
|
|
|
CheckMenuItem(menu, IDM_LOG_NIC, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
# endif
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:47:22 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FORCE43, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_OVERSCAN, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_INVERT, MF_UNCHECKED);
|
|
|
|
|
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_RESIZE, MF_UNCHECKED);
|
2017-08-23 01:56:20 +02:00
|
|
|
CheckMenuItem(menu, IDM_VID_DDRAW + 0, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_DDRAW + 1, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FS_FULL + 0, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FS_FULL + 1, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FS_FULL + 2, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FS_FULL + 3, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
CheckMenuItem(menu, IDM_VID_REMEMBER, MF_UNCHECKED);
|
2017-08-23 01:56:20 +02:00
|
|
|
CheckMenuItem(menu, IDM_VID_SCALE_1X + 0, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_SCALE_1X + 1, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_SCALE_1X + 2, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_SCALE_1X + 3, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_CGACON, MF_UNCHECKED);
|
2017-08-23 01:56:20 +02:00
|
|
|
CheckMenuItem(menu, IDM_VID_GRAYCT_601 + 0, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAYCT_601 + 1, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAYCT_601 + 2, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + 0, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + 1, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + 2, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + 3, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + 4, MF_UNCHECKED);
|
2017-08-22 02:47:22 +02:00
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOG_TOGGLES
|
|
|
|
|
# ifdef ENABLE_BUSLOGIC_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_BUSLOGIC, buslogic_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_CDROM_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_CDROM, cdrom_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_D86F_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_D86F, d86f_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_FDC_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_FDC, fdc_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_IDE_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_IDE, ide_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
|
|
|
|
# ifdef ENABLE_SERIAL_LOG
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_SERIAL, serial_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:47:22 +02:00
|
|
|
# ifdef ENABLE_NIC_LOG
|
|
|
|
|
/*FIXME: should be network_setlog(1:0) */
|
|
|
|
|
CheckMenuItem(menu, IDM_LOG_NIC, nic_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
# endif
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:47:22 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FORCE43, force_43 ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_OVERSCAN, enable_overscan ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_INVERT, invert_display ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
|
|
|
|
|
if (vid_resize) CheckMenuItem(menu, IDM_VID_RESIZE, MF_CHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_DDRAW + vid_api, MF_CHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_FS_FULL + video_fullscreen_scale, MF_CHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_REMEMBER, window_remember ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_SCALE_1X + scale, MF_CHECKED);
|
|
|
|
|
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_CGACON, vid_cga_contrast ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAYCT_601 + video_graytype, MF_CHECKED);
|
|
|
|
|
CheckMenuItem(menu, IDM_VID_GRAY_RGB + video_grayscale, MF_CHECKED);
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
HWND hwnd; /* This is the handle for our window */
|
|
|
|
|
MSG messages; /* Here messages to the application are saved */
|
|
|
|
|
WNDCLASSEX wincl; /* Data structure for the windowclass */
|
|
|
|
|
int c, d, bRet;
|
2017-05-18 14:03:43 -04:00
|
|
|
WCHAR emulator_title[200];
|
2017-05-27 03:53:32 +02:00
|
|
|
LARGE_INTEGER qpc_freq;
|
|
|
|
|
HACCEL haccel; /* Handle to accelerator table */
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
memset(recv_key, 0, sizeof(recv_key));
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
process_command_line();
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
win_language_load_common_strings();
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
hinstance=hThisInstance;
|
|
|
|
|
/* The Window structure */
|
|
|
|
|
wincl.hInstance = hThisInstance;
|
|
|
|
|
wincl.lpszClassName = szClassName;
|
|
|
|
|
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
|
|
|
|
|
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
|
|
|
|
|
wincl.cbSize = sizeof (WNDCLASSEX);
|
|
|
|
|
|
|
|
|
|
/* Use default icon and mouse-pointer */
|
|
|
|
|
wincl.hIcon = LoadIcon(hinstance, (LPCTSTR) 100);
|
|
|
|
|
wincl.hIconSm = LoadIcon(hinstance, (LPCTSTR) 100);
|
|
|
|
|
wincl.hCursor = NULL;
|
|
|
|
|
wincl.lpszMenuName = NULL; /* No menu */
|
|
|
|
|
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
|
|
|
|
|
wincl.cbWndExtra = 0; /* structure or the window instance */
|
|
|
|
|
/* Use Windows's default color as the background of the window */
|
|
|
|
|
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
|
|
|
|
|
|
|
|
|
|
/* Register the window class, and if it fails quit the program */
|
|
|
|
|
if (!RegisterClassEx(&wincl))
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
wincl.lpszClassName = szSubClassName;
|
|
|
|
|
wincl.lpfnWndProc = subWindowProcedure; /* This function is called by windows */
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (!RegisterClassEx(&wincl))
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
menu = LoadMenu(hThisInstance, TEXT("MainMenu"));
|
|
|
|
|
|
2017-06-04 02:11:19 -04:00
|
|
|
_swprintf(emulator_title, L"%s v%s", EMU_NAME_W, EMU_VERSION_W);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
/* The class is registered, let's create the program*/
|
|
|
|
|
hwnd = CreateWindowEx (
|
|
|
|
|
0, /* Extended possibilites for variation */
|
|
|
|
|
szClassName, /* Classname */
|
|
|
|
|
emulator_title, /* Title Text */
|
|
|
|
|
(WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX)/* | DS_3DLOOK*/, /* default window */
|
|
|
|
|
CW_USEDEFAULT, /* Windows decides the position */
|
|
|
|
|
CW_USEDEFAULT, /* where the window ends up on the screen */
|
|
|
|
|
640+(GetSystemMetrics(SM_CXFIXEDFRAME)*2), /* The programs width */
|
|
|
|
|
480+(GetSystemMetrics(SM_CYFIXEDFRAME)*2)+GetSystemMetrics(SM_CYMENUSIZE)+GetSystemMetrics(SM_CYCAPTION)+1, /* and height in pixels */
|
|
|
|
|
HWND_DESKTOP, /* The window is a child-window to desktop */
|
|
|
|
|
menu, /* Menu */
|
|
|
|
|
hThisInstance, /* Program Instance handler */
|
|
|
|
|
NULL /* No Window Creation data */
|
2017-05-18 14:03:43 -04:00
|
|
|
);
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
/* Make the window visible on the screen */
|
|
|
|
|
ShowWindow (hwnd, nFunsterStil);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
/* Load the accelerator table */
|
|
|
|
|
haccel = LoadAccelerators(hinstAcc, L"MainAccel");
|
|
|
|
|
if (haccel == NULL)
|
|
|
|
|
{
|
|
|
|
|
fatal("haccel is null\n");
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
device.usUsagePage = 0x01;
|
|
|
|
|
device.usUsage = 0x06;
|
|
|
|
|
device.dwFlags = RIDEV_NOHOTKEYS;
|
|
|
|
|
device.hwndTarget = hwnd;
|
|
|
|
|
|
|
|
|
|
if (RegisterRawInputDevices(&device, 1, sizeof(device)))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-05-18 14:03:43 -04:00
|
|
|
pclog("Raw input registered!\n");
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
else
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-05-18 14:03:43 -04:00
|
|
|
pclog("Raw input registration failed!\n");
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
get_registry_key_map();
|
|
|
|
|
|
|
|
|
|
ghwnd=hwnd;
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
hwndRender = CreateWindow(L"STATIC", NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 0, 0, 1, 1, ghwnd, NULL, hinstance, NULL);
|
|
|
|
|
|
2017-09-25 04:31:20 -04:00
|
|
|
|
|
|
|
|
/* FIXME: Kotori, code below should be moved to pc.c, as its not Win specific. */
|
2017-05-18 14:03:43 -04:00
|
|
|
initpc(argc, argv);
|
|
|
|
|
|
2017-05-29 01:18:32 +02:00
|
|
|
init_cdrom_host_drives();
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:16:15 +02:00
|
|
|
network_init();
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:16:15 +02:00
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
hwndStatus = EmulatorStatusBar(hwnd, IDC_STATUS, hThisInstance);
|
|
|
|
|
|
2017-05-18 21:15:37 +02:00
|
|
|
OriginalStatusBarProcedure = GetWindowLongPtr(hwndStatus, GWLP_WNDPROC);
|
2017-05-18 21:07:45 +02:00
|
|
|
SetWindowLongPtr(hwndStatus, GWL_WNDPROC, (LONG_PTR) &StatusBarProcedure);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
smenu = LoadMenu(hThisInstance, TEXT("StatusBarMenu"));
|
2017-05-29 01:18:32 +02:00
|
|
|
|
|
|
|
|
initmodules();
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
if (vid_apis[0][vid_api].init(hwndRender) == 0)
|
|
|
|
|
{
|
|
|
|
|
if (vid_apis[0][vid_api ^ 1].init(hwndRender) == 0)
|
|
|
|
|
{
|
|
|
|
|
fatal("Both DirectDraw and Direct3D renderers failed to initialize\n");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
vid_api ^= 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-18 21:15:37 +02:00
|
|
|
if (vid_resize) SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_MINIMIZEBOX)|WS_VISIBLE);
|
|
|
|
|
else SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW&~WS_SIZEBOX&~WS_THICKFRAME&~WS_MAXIMIZEBOX&~WS_MINIMIZEBOX)|WS_VISIBLE);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-08-22 02:47:22 +02:00
|
|
|
reset_menus();
|
2017-06-01 17:52:39 +02:00
|
|
|
|
2017-09-25 04:31:20 -04:00
|
|
|
/* FIXME: Kotori, code below should be moved to pc.c, its not Win specific. */
|
2017-09-28 20:13:57 -04:00
|
|
|
pclog("Scanning for ROM images:\n");
|
2017-09-25 04:31:20 -04:00
|
|
|
d = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
for (c=0;c<ROM_MAX;c++)
|
|
|
|
|
{
|
2017-09-25 04:31:20 -04:00
|
|
|
romspresent[c] = rom_load_bios(c);
|
2017-09-28 20:13:57 -04:00
|
|
|
#if 0
|
2017-09-25 04:31:20 -04:00
|
|
|
pclog("romset %i - %s\n", c, romspresent[c]?"YES":"NO");
|
2017-09-28 20:13:57 -04:00
|
|
|
#endif
|
|
|
|
|
d += romspresent[c];
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-09-25 04:31:20 -04:00
|
|
|
if (d == 0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-09-25 04:31:20 -04:00
|
|
|
/* Dang, no ROMs found at all! */
|
2017-09-28 20:13:57 -04:00
|
|
|
pclog("No usable ROM images found - aborting!\n");
|
2017-05-29 21:57:31 -04:00
|
|
|
msgbox_critical(ghwnd, IDS_2062);
|
2017-05-18 14:03:43 -04:00
|
|
|
return 0;
|
|
|
|
|
}
|
2017-09-28 20:13:57 -04:00
|
|
|
pclog("A total of %d ROM sets have been loaded.\n", d);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-09-25 04:31:20 -04:00
|
|
|
/* Load the ROMs for the selected machine. */
|
2017-09-28 20:13:57 -04:00
|
|
|
if (! rom_load_bios(romset)) {
|
2017-09-25 04:31:20 -04:00
|
|
|
/* Whoops, ROMs not found. */
|
2017-05-18 14:03:43 -04:00
|
|
|
if (romset!=-1)
|
|
|
|
|
{
|
2017-05-29 21:57:31 -04:00
|
|
|
msgbox_info(ghwnd, IDS_2063);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-09-25 04:31:20 -04:00
|
|
|
|
|
|
|
|
/* Select another machine to use. */
|
2017-05-18 14:03:43 -04:00
|
|
|
for (c=0;c<ROM_MAX;c++)
|
|
|
|
|
{
|
|
|
|
|
if (romspresent[c])
|
|
|
|
|
{
|
|
|
|
|
romset = c;
|
2017-09-02 20:39:57 +02:00
|
|
|
machine = machine_getmachine(romset);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-18 14:03:43 -04:00
|
|
|
resetpchard();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
for (c = 0; c < GFX_MAX; c++)
|
|
|
|
|
{
|
|
|
|
|
gfx_present[c] = video_card_available(video_old_to_new(c));
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
if (!video_card_available(video_old_to_new(gfxcard)))
|
|
|
|
|
{
|
|
|
|
|
if (romset!=-1)
|
|
|
|
|
{
|
2017-05-29 21:57:31 -04:00
|
|
|
msgbox_info(ghwnd, IDS_2064);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
for (c = GFX_MAX-1; c >= 0; c--)
|
|
|
|
|
{
|
|
|
|
|
if (gfx_present[c])
|
|
|
|
|
{
|
|
|
|
|
gfxcard = c;
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-18 14:03:43 -04:00
|
|
|
resetpchard();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-25 04:31:20 -04:00
|
|
|
rom_load_bios(romset);
|
2017-05-18 14:03:43 -04:00
|
|
|
resetpchard();
|
|
|
|
|
|
|
|
|
|
timeBeginPeriod(1);
|
|
|
|
|
|
|
|
|
|
atexit(releasemouse);
|
|
|
|
|
|
2017-09-08 16:35:14 +02:00
|
|
|
ghMutex = CreateMutex(NULL, FALSE, L"86Box.BlitMutex");
|
|
|
|
|
slirpMutex = CreateMutex(NULL, FALSE, L"86Box.SlirpMutex");
|
2017-05-18 14:03:43 -04:00
|
|
|
mainthreadh=(HANDLE)_beginthread(mainthread,0,NULL);
|
|
|
|
|
SetThreadPriority(mainthreadh, THREAD_PRIORITY_HIGHEST);
|
2017-05-27 03:53:32 +02:00
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
updatewindowsize(640, 480);
|
|
|
|
|
|
|
|
|
|
QueryPerformanceFrequency(&qpc_freq);
|
|
|
|
|
timer_freq = qpc_freq.QuadPart;
|
|
|
|
|
|
|
|
|
|
if (start_in_fullscreen)
|
|
|
|
|
{
|
|
|
|
|
startblit();
|
|
|
|
|
mouse_close();
|
|
|
|
|
vid_apis[0][vid_api].close();
|
|
|
|
|
video_fullscreen = 1;
|
|
|
|
|
vid_apis[1][vid_api].init(hwndRender);
|
|
|
|
|
mouse_init();
|
|
|
|
|
leave_fullscreen_flag = 0;
|
|
|
|
|
endblit();
|
|
|
|
|
device_force_redraw();
|
|
|
|
|
}
|
|
|
|
|
if (window_remember)
|
|
|
|
|
{
|
|
|
|
|
MoveWindow(hwnd, window_x, window_y,
|
|
|
|
|
window_w,
|
|
|
|
|
window_h,
|
|
|
|
|
TRUE);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
MoveWindow(hwndRender, 0, 0,
|
|
|
|
|
winsizex,
|
|
|
|
|
winsizey,
|
|
|
|
|
TRUE);
|
|
|
|
|
MoveWindow(hwndStatus, 0, winsizey + 6,
|
|
|
|
|
winsizex,
|
|
|
|
|
17,
|
|
|
|
|
TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Run the message loop. It will run until GetMessage() returns 0 */
|
|
|
|
|
while (!quited)
|
|
|
|
|
{
|
|
|
|
|
while (((bRet = GetMessage(&messages,NULL,0,0)) != 0) && !quited)
|
|
|
|
|
{
|
|
|
|
|
if (bRet == -1)
|
|
|
|
|
{
|
|
|
|
|
fatal("bRet is -1\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (messages.message==WM_QUIT) quited=1;
|
|
|
|
|
if (!TranslateAccelerator(hwnd, haccel, &messages))
|
|
|
|
|
{
|
|
|
|
|
TranslateMessage(&messages);
|
|
|
|
|
DispatchMessage(&messages);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (recv_key[0x58] && recv_key[0x42] && mousecapture)
|
|
|
|
|
{
|
|
|
|
|
ClipCursor(&oldclip);
|
|
|
|
|
ShowCursor(TRUE);
|
|
|
|
|
mousecapture=0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if ((recv_key[0x1D] || recv_key[0x9D]) && (recv_key[0x38] || recv_key[0xB8]) && (recv_key[0x51] || recv_key[0xD1]) &&
|
2017-05-18 14:03:43 -04:00
|
|
|
video_fullscreen)
|
|
|
|
|
{
|
|
|
|
|
leave_fullscreen();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
quited=1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
startblit();
|
|
|
|
|
Sleep(200);
|
|
|
|
|
TerminateThread(mainthreadh,0);
|
|
|
|
|
savenvr();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-18 14:03:43 -04:00
|
|
|
closepc();
|
|
|
|
|
|
|
|
|
|
vid_apis[video_fullscreen][vid_api].close();
|
|
|
|
|
|
|
|
|
|
timeEndPeriod(1);
|
|
|
|
|
if (mousecapture)
|
|
|
|
|
{
|
|
|
|
|
ClipCursor(&oldclip);
|
|
|
|
|
ShowCursor(TRUE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UnregisterClass(szSubClassName, hinstance);
|
|
|
|
|
UnregisterClass(szClassName, hinstance);
|
|
|
|
|
|
|
|
|
|
return messages.wParam;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HHOOK hKeyboardHook;
|
|
|
|
|
int hook_enabled = 0;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
|
|
|
|
BOOL bControlKeyDown;
|
|
|
|
|
KBDLLHOOKSTRUCT* p;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (nCode < 0 || nCode != HC_ACTION)
|
|
|
|
|
{
|
|
|
|
|
return CallNextHookEx( hKeyboardHook, nCode, wParam, lParam);
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
p = (KBDLLHOOKSTRUCT*)lParam;
|
|
|
|
|
|
|
|
|
|
if (p->vkCode == VK_TAB && p->flags & LLKHF_ALTDOWN) return 1; /* disable alt-tab */
|
|
|
|
|
if (p->vkCode == VK_SPACE && p->flags & LLKHF_ALTDOWN) return 1; /* disable alt-tab */
|
|
|
|
|
if((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) return 1; /* disable windows keys */
|
|
|
|
|
if (p->vkCode == VK_ESCAPE && p->flags & LLKHF_ALTDOWN) return 1; /* disable alt-escape */
|
|
|
|
|
bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); /* checks ctrl key pressed */
|
|
|
|
|
if (p->vkCode == VK_ESCAPE && bControlKeyDown) return 1; /* disable ctrl-escape */
|
|
|
|
|
|
|
|
|
|
return CallNextHookEx( hKeyboardHook, nCode, wParam, lParam );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void cdrom_close(uint8_t id)
|
|
|
|
|
{
|
|
|
|
|
switch (cdrom_drives[id].host_drive)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
null_close(id);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
ioctl_close(id);
|
|
|
|
|
break;
|
|
|
|
|
case 200:
|
|
|
|
|
image_close(id);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static BOOL CALLBACK about_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
{
|
|
|
|
|
HWND h;
|
|
|
|
|
|
|
|
|
|
switch (message)
|
|
|
|
|
{
|
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
|
pause = 1;
|
|
|
|
|
h = GetDlgItem(hdlg, IDC_ABOUT_ICON);
|
|
|
|
|
SendMessage(h, STM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) LoadIconBig((PCTSTR) 100));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case WM_COMMAND:
|
|
|
|
|
switch (LOWORD(wParam))
|
|
|
|
|
{
|
|
|
|
|
case IDOK:
|
|
|
|
|
EndDialog(hdlg, 0);
|
|
|
|
|
pause = 0;
|
|
|
|
|
return TRUE;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void about_open(HWND hwnd)
|
|
|
|
|
{
|
2017-06-04 02:11:19 -04:00
|
|
|
DialogBox(hinstance, (LPCTSTR)DLG_ABOUT, hwnd, about_dlgproc);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void win_pc_reset(int hard)
|
|
|
|
|
{
|
|
|
|
|
pause=1;
|
|
|
|
|
Sleep(100);
|
|
|
|
|
savenvr();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
if (hard)
|
|
|
|
|
{
|
|
|
|
|
resetpchard();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
resetpc_cad();
|
|
|
|
|
}
|
|
|
|
|
pause=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void video_toggle_option(HMENU hmenu, int *val, int id)
|
|
|
|
|
{
|
|
|
|
|
startblit();
|
|
|
|
|
video_wait_for_blit();
|
|
|
|
|
*val ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, id, *val ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
endblit();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
device_force_redraw();
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
{
|
2017-09-25 04:31:20 -04:00
|
|
|
static wchar_t wOldTitle[512];
|
2017-05-27 03:53:32 +02:00
|
|
|
HMENU hmenu;
|
|
|
|
|
RECT rect;
|
2017-06-08 20:58:32 +02:00
|
|
|
int i = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
switch (message)
|
|
|
|
|
{
|
|
|
|
|
case WM_CREATE:
|
|
|
|
|
SetTimer(hwnd, TIMER_1SEC, 1000, NULL);
|
|
|
|
|
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0 );
|
|
|
|
|
hook_enabled = 1;
|
2017-05-18 14:03:43 -04:00
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
case WM_COMMAND:
|
|
|
|
|
hmenu=GetMenu(hwnd);
|
|
|
|
|
switch (LOWORD(wParam))
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-06-04 22:18:41 -04:00
|
|
|
case IDM_ACTION_SCREENSHOT:
|
|
|
|
|
take_screenshot();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_ACTION_HRESET:
|
2017-05-27 03:53:32 +02:00
|
|
|
win_pc_reset(1);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-06-04 22:18:41 -04:00
|
|
|
case IDM_ACTION_RESET_CAD:
|
2017-05-27 03:53:32 +02:00
|
|
|
win_pc_reset(0);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-06-04 22:18:41 -04:00
|
|
|
case IDM_ACTION_EXIT:
|
2017-05-27 03:53:32 +02:00
|
|
|
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-07-16 22:07:06 +02:00
|
|
|
case IDM_ACTION_CTRL_ALT_ESC:
|
|
|
|
|
ctrl_alt_esc();
|
|
|
|
|
break;
|
2017-09-25 04:31:20 -04:00
|
|
|
|
|
|
|
|
case IDM_ACTION_PAUSE:
|
|
|
|
|
pause ^= 1;
|
|
|
|
|
if (pause) {
|
|
|
|
|
wcscpy(wOldTitle, wTitle);
|
|
|
|
|
wcscat(wTitle, L" - PAUSED -");
|
|
|
|
|
|
|
|
|
|
set_window_title(NULL);
|
|
|
|
|
} else
|
|
|
|
|
set_window_title(wOldTitle);
|
|
|
|
|
break;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_CONFIG:
|
|
|
|
|
win_settings_open(hwnd);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_ABOUT:
|
|
|
|
|
about_open(hwnd);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_STATUS:
|
|
|
|
|
status_open(hwnd);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_VID_RESIZE:
|
|
|
|
|
vid_resize = !vid_resize;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize)? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
if (vid_resize) SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_MINIMIZEBOX) | WS_VISIBLE);
|
|
|
|
|
else SetWindowLongPtr(hwnd, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX) | WS_VISIBLE);
|
|
|
|
|
GetWindowRect(hwnd, &rect);
|
|
|
|
|
SetWindowPos(hwnd, 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_FRAMECHANGED);
|
|
|
|
|
GetWindowRect(hwndStatus,&rect);
|
|
|
|
|
SetWindowPos(hwndStatus, 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_FRAMECHANGED);
|
|
|
|
|
if (vid_resize)
|
|
|
|
|
{
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED);
|
|
|
|
|
scale = 1;
|
|
|
|
|
}
|
|
|
|
|
EnableMenuItem(hmenu, IDM_VID_SCALE_1X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
|
|
|
|
EnableMenuItem(hmenu, IDM_VID_SCALE_2X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
|
|
|
|
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
|
|
|
|
EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED);
|
|
|
|
|
win_doresize = 1;
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_REMEMBER:
|
|
|
|
|
window_remember = !window_remember;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_REMEMBER, window_remember ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
GetWindowRect(hwnd, &rect);
|
|
|
|
|
if (window_remember)
|
|
|
|
|
{
|
|
|
|
|
window_x = rect.left;
|
|
|
|
|
window_y = rect.top;
|
|
|
|
|
window_w = rect.right - rect.left;
|
|
|
|
|
window_h = rect.bottom - rect.top;
|
|
|
|
|
}
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_DDRAW:
|
|
|
|
|
case IDM_VID_D3D:
|
|
|
|
|
startblit();
|
|
|
|
|
video_wait_for_blit();
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_DDRAW + vid_api, MF_UNCHECKED);
|
|
|
|
|
vid_apis[0][vid_api].close();
|
|
|
|
|
vid_api = LOWORD(wParam) - IDM_VID_DDRAW;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_DDRAW + vid_api, MF_CHECKED);
|
|
|
|
|
vid_apis[0][vid_api].init(hwndRender);
|
|
|
|
|
endblit();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
device_force_redraw();
|
2017-07-12 16:46:51 +09:00
|
|
|
cgapal_rebuild();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_FULLSCREEN:
|
|
|
|
|
if(video_fullscreen != 1)
|
|
|
|
|
{
|
|
|
|
|
if (video_fullscreen_first)
|
|
|
|
|
{
|
|
|
|
|
video_fullscreen_first = 0;
|
2017-07-24 12:04:39 +02:00
|
|
|
msgbox_info(ghwnd, IDS_2074);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
startblit();
|
|
|
|
|
video_wait_for_blit();
|
|
|
|
|
mouse_close();
|
|
|
|
|
vid_apis[0][vid_api].close();
|
|
|
|
|
video_fullscreen = 1;
|
|
|
|
|
vid_apis[1][vid_api].init(ghwnd);
|
|
|
|
|
mouse_init();
|
|
|
|
|
leave_fullscreen_flag = 0;
|
|
|
|
|
endblit();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
device_force_redraw();
|
2017-07-12 16:46:51 +09:00
|
|
|
cgapal_rebuild();
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_FS_FULL:
|
|
|
|
|
case IDM_VID_FS_43:
|
|
|
|
|
case IDM_VID_FS_SQ:
|
|
|
|
|
case IDM_VID_FS_INT:
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_FS_FULL + video_fullscreen_scale, MF_UNCHECKED);
|
|
|
|
|
video_fullscreen_scale = LOWORD(wParam) - IDM_VID_FS_FULL;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_FS_FULL + video_fullscreen_scale, MF_CHECKED);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
device_force_redraw();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_SCALE_1X:
|
|
|
|
|
case IDM_VID_SCALE_2X:
|
|
|
|
|
case IDM_VID_SCALE_3X:
|
|
|
|
|
case IDM_VID_SCALE_4X:
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
|
|
|
|
|
scale = LOWORD(wParam) - IDM_VID_SCALE_1X;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_CHECKED);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
device_force_redraw();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_FORCE43:
|
|
|
|
|
video_toggle_option(hmenu, &force_43, IDM_VID_FORCE43);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_INVERT:
|
|
|
|
|
video_toggle_option(hmenu, &invert_display, IDM_VID_INVERT);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_VID_OVERSCAN:
|
|
|
|
|
update_overscan = 1;
|
|
|
|
|
video_toggle_option(hmenu, &enable_overscan, IDM_VID_OVERSCAN);
|
|
|
|
|
break;
|
|
|
|
|
|
2017-06-01 17:52:39 +02:00
|
|
|
case IDM_VID_CGACON:
|
2017-08-18 14:47:54 +09:00
|
|
|
vid_cga_contrast ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_CGACON, vid_cga_contrast ? MF_CHECKED : MF_UNCHECKED);
|
2017-06-01 17:52:39 +02:00
|
|
|
cgapal_rebuild();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-06-01 17:52:39 +02:00
|
|
|
break;
|
|
|
|
|
|
2017-07-19 15:08:40 +09:00
|
|
|
case IDM_VID_GRAYCT_601:
|
|
|
|
|
case IDM_VID_GRAYCT_709:
|
|
|
|
|
case IDM_VID_GRAYCT_AVE:
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_GRAYCT_601 + video_graytype, MF_UNCHECKED);
|
|
|
|
|
video_graytype = LOWORD(wParam) - IDM_VID_GRAYCT_601;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_GRAYCT_601 + video_graytype, MF_CHECKED);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-07-19 15:08:40 +09:00
|
|
|
device_force_redraw();
|
|
|
|
|
break;
|
|
|
|
|
|
2017-07-17 23:04:50 +09:00
|
|
|
case IDM_VID_GRAY_RGB:
|
|
|
|
|
case IDM_VID_GRAY_MONO:
|
|
|
|
|
case IDM_VID_GRAY_AMBER:
|
|
|
|
|
case IDM_VID_GRAY_GREEN:
|
|
|
|
|
case IDM_VID_GRAY_WHITE:
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_GRAY_RGB + video_grayscale, MF_UNCHECKED);
|
|
|
|
|
video_grayscale = LOWORD(wParam) - IDM_VID_GRAY_RGB;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_VID_GRAY_RGB + video_grayscale, MF_CHECKED);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-07-17 23:04:50 +09:00
|
|
|
device_force_redraw();
|
|
|
|
|
break;
|
|
|
|
|
|
2017-05-18 14:03:43 -04:00
|
|
|
#ifdef ENABLE_LOG_TOGGLES
|
|
|
|
|
#ifdef ENABLE_BUSLOGIC_LOG
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_BUSLOGIC:
|
|
|
|
|
buslogic_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_BUSLOGIC, buslogic_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_CDROM_LOG
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_CDROM:
|
|
|
|
|
cdrom_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_CDROM, cdrom_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_D86F_LOG
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_D86F:
|
|
|
|
|
d86f_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_D86F, d86f_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_FDC_LOG
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_FDC:
|
|
|
|
|
fdc_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_FDC, fdc_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_IDE_LOG
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_IDE:
|
|
|
|
|
ide_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_IDE, ide_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
2017-06-04 02:11:19 -04:00
|
|
|
#ifdef ENABLE_SERIAL_LOG
|
|
|
|
|
case IDM_LOG_SERIAL:
|
|
|
|
|
serial_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_SERIAL, serial_do_log ? MF_CHECKED : MF_UNCHECKED);
|
|
|
|
|
break;
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-06-04 02:11:19 -04:00
|
|
|
#ifdef ENABLE_NIC_LOG
|
|
|
|
|
case IDM_LOG_NIC:
|
|
|
|
|
/*FIXME: should be network_setlog() */
|
|
|
|
|
nic_do_log ^= 1;
|
|
|
|
|
CheckMenuItem(hmenu, IDM_LOG_NIC, nic_do_log ? MF_CHECKED : MF_UNCHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
#endif
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
#ifdef ENABLE_LOG_BREAKPOINT
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_LOG_BREAKPOINT:
|
|
|
|
|
pclog("---- LOG BREAKPOINT ----\n");
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef ENABLE_VRAM_DUMP
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_DUMP_VRAM:
|
|
|
|
|
svga_dump_vram();
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
#endif
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_CONFIG_LOAD:
|
|
|
|
|
pause = 1;
|
2017-07-24 12:04:39 +02:00
|
|
|
if (!file_dlg_st(hwnd, IDS_2160, "", 0))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
if (msgbox_reset_yn(ghwnd) == IDYES)
|
|
|
|
|
{
|
2017-09-23 21:12:26 -04:00
|
|
|
config_write(config_file_default);
|
2017-06-08 20:58:32 +02:00
|
|
|
for (i = 0; i < FDD_NUM; i++)
|
|
|
|
|
{
|
2017-09-04 01:52:29 -04:00
|
|
|
floppy_close(i);
|
2017-06-08 20:58:32 +02:00
|
|
|
}
|
|
|
|
|
for (i = 0; i < CDROM_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
cdrom_drives[i].handler->exit(i);
|
|
|
|
|
if (cdrom_drives[i].host_drive == 200)
|
|
|
|
|
{
|
|
|
|
|
image_close(i);
|
|
|
|
|
}
|
|
|
|
|
else if ((cdrom_drives[i].host_drive >= 'A') && (cdrom_drives[i].host_drive <= 'Z'))
|
|
|
|
|
{
|
|
|
|
|
ioctl_close(i);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
null_close(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-06-19 06:46:08 +02:00
|
|
|
resetpchard_close();
|
2017-09-23 21:12:26 -04:00
|
|
|
config_load(wopenfilestring);
|
2017-06-08 20:58:32 +02:00
|
|
|
for (i = 0; i < CDROM_NUM; i++)
|
|
|
|
|
{
|
|
|
|
|
if (cdrom_drives[i].bus_type)
|
|
|
|
|
{
|
|
|
|
|
SCSIReset(cdrom_drives[i].scsi_device_id, cdrom_drives[i].scsi_device_lun);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (cdrom_drives[i].host_drive == 200)
|
|
|
|
|
{
|
|
|
|
|
image_open(i, cdrom_image[i].image_path);
|
|
|
|
|
}
|
|
|
|
|
else if ((cdrom_drives[i].host_drive >= 'A') && (cdrom_drives[i].host_drive <= 'Z'))
|
|
|
|
|
{
|
|
|
|
|
ioctl_open(i, cdrom_drives[i].host_drive);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
cdrom_null_open(i, cdrom_drives[i].host_drive);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 01:52:29 -04:00
|
|
|
floppy_load(0, floppyfns[0]);
|
|
|
|
|
floppy_load(1, floppyfns[1]);
|
|
|
|
|
floppy_load(2, floppyfns[2]);
|
|
|
|
|
floppy_load(3, floppyfns[3]);
|
2017-06-08 20:58:32 +02:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
/* pclog_w(L"NVR path: %s\n", nvr_path); */
|
|
|
|
|
mem_resize();
|
2017-09-25 04:31:20 -04:00
|
|
|
rom_load_bios(romset);
|
2017-08-27 00:58:44 +02:00
|
|
|
#ifdef USE_NETWORK
|
2017-08-22 02:47:22 +02:00
|
|
|
network_init();
|
2017-08-27 00:58:44 +02:00
|
|
|
#endif
|
2017-08-22 02:47:22 +02:00
|
|
|
reset_menus();
|
2017-06-08 00:58:47 +02:00
|
|
|
update_status_bar_panes(hwndStatus);
|
2017-06-19 06:46:08 +02:00
|
|
|
resetpchard_init();
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
pause = 0;
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_CONFIG_SAVE:
|
|
|
|
|
pause = 1;
|
2017-07-24 12:04:39 +02:00
|
|
|
if (!file_dlg_st(hwnd, IDS_2160, "", 1))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
2017-09-23 21:12:26 -04:00
|
|
|
config_write(wopenfilestring);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
pause = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_INPUT:
|
|
|
|
|
process_raw_input(lParam, infocus);
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_SETFOCUS:
|
|
|
|
|
infocus=1;
|
|
|
|
|
if (!hook_enabled)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0 );
|
|
|
|
|
hook_enabled = 1;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_KILLFOCUS:
|
|
|
|
|
infocus=0;
|
|
|
|
|
if (mousecapture)
|
|
|
|
|
{
|
|
|
|
|
ClipCursor(&oldclip);
|
|
|
|
|
ShowCursor(TRUE);
|
|
|
|
|
mousecapture=0;
|
|
|
|
|
}
|
|
|
|
|
memset(recv_key, 0, sizeof(recv_key));
|
|
|
|
|
if (video_fullscreen)
|
|
|
|
|
{
|
|
|
|
|
leave_fullscreen_flag = 1;
|
|
|
|
|
}
|
|
|
|
|
if (hook_enabled)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
UnhookWindowsHookEx(hKeyboardHook);
|
|
|
|
|
hook_enabled = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_LBUTTONUP:
|
|
|
|
|
if (!mousecapture && !video_fullscreen)
|
|
|
|
|
{
|
|
|
|
|
GetClipCursor(&oldclip);
|
2017-05-31 09:05:53 +02:00
|
|
|
GetWindowRect(hwndRender, &rect);
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
ClipCursor(&rect);
|
|
|
|
|
mousecapture = 1;
|
|
|
|
|
while (1)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
if (ShowCursor(FALSE) < 0)
|
2017-05-18 14:03:43 -04:00
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_MBUTTONUP:
|
|
|
|
|
if (!(mouse_get_type(mouse_type) & MOUSE_TYPE_3BUTTON))
|
|
|
|
|
{
|
|
|
|
|
releasemouse();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_ENTERMENULOOP:
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_SIZE:
|
|
|
|
|
winsizex = (lParam & 0xFFFF);
|
|
|
|
|
winsizey = (lParam >> 16) - (17 + 6);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-06-11 23:53:01 +02:00
|
|
|
if (winsizey < 0)
|
|
|
|
|
{
|
|
|
|
|
winsizey = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
MoveWindow(hwndRender, 0, 0, winsizex, winsizey, TRUE);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (vid_apis[video_fullscreen][vid_api].resize)
|
|
|
|
|
{
|
|
|
|
|
startblit();
|
|
|
|
|
video_wait_for_blit();
|
|
|
|
|
vid_apis[video_fullscreen][vid_api].resize(winsizex, winsizey);
|
|
|
|
|
endblit();
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
MoveWindow(hwndStatus, 0, winsizey + 6, winsizex, 17, TRUE);
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (mousecapture)
|
|
|
|
|
{
|
2017-05-31 09:05:53 +02:00
|
|
|
GetWindowRect(hwndRender, &rect);
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
ClipCursor(&rect);
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
if (window_remember)
|
|
|
|
|
{
|
|
|
|
|
GetWindowRect(hwnd, &rect);
|
|
|
|
|
window_x = rect.left;
|
|
|
|
|
window_y = rect.top;
|
|
|
|
|
window_w = rect.right - rect.left;
|
|
|
|
|
window_h = rect.bottom - rect.top;
|
|
|
|
|
save_window_pos = 1;
|
|
|
|
|
}
|
2017-05-29 01:18:32 +02:00
|
|
|
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_MOVE:
|
|
|
|
|
if (window_remember)
|
|
|
|
|
{
|
|
|
|
|
GetWindowRect(hwnd, &rect);
|
|
|
|
|
window_x = rect.left;
|
|
|
|
|
window_y = rect.top;
|
|
|
|
|
window_w = rect.right - rect.left;
|
|
|
|
|
window_h = rect.bottom - rect.top;
|
|
|
|
|
save_window_pos = 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case WM_TIMER:
|
|
|
|
|
if (wParam == TIMER_1SEC)
|
|
|
|
|
{
|
|
|
|
|
onesec();
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_RESETD3D:
|
|
|
|
|
startblit();
|
|
|
|
|
if (video_fullscreen)
|
|
|
|
|
{
|
|
|
|
|
d3d_fs_reset();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
d3d_reset();
|
|
|
|
|
}
|
|
|
|
|
endblit();
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_LEAVEFULLSCREEN:
|
|
|
|
|
startblit();
|
|
|
|
|
mouse_close();
|
|
|
|
|
vid_apis[1][vid_api].close();
|
|
|
|
|
video_fullscreen = 0;
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
vid_apis[0][vid_api].init(hwndRender);
|
|
|
|
|
mouse_init();
|
|
|
|
|
endblit();
|
|
|
|
|
device_force_redraw();
|
2017-07-12 16:46:51 +09:00
|
|
|
cgapal_rebuild();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case WM_KEYDOWN:
|
|
|
|
|
case WM_SYSKEYDOWN:
|
|
|
|
|
case WM_KEYUP:
|
|
|
|
|
case WM_SYSKEYUP:
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
case WM_DESTROY:
|
|
|
|
|
UnhookWindowsHookEx(hKeyboardHook);
|
|
|
|
|
KillTimer(hwnd, TIMER_1SEC);
|
|
|
|
|
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case WM_SYSCOMMAND:
|
|
|
|
|
/* Disable ALT key *ALWAYS*, I don't think there's any use for reaching the menu that way. */
|
|
|
|
|
if (wParam == SC_KEYMENU && HIWORD(lParam) <= 0)
|
|
|
|
|
{
|
|
|
|
|
return 0; /*disable ALT key for menu*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
return DefWindowProc (hwnd, message, wParam, lParam);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LRESULT CALLBACK subWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
{
|
2017-05-27 03:53:32 +02:00
|
|
|
switch (message)
|
|
|
|
|
{
|
|
|
|
|
default:
|
|
|
|
|
return DefWindowProc(hwnd, message, wParam, lParam);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt, int id)
|
|
|
|
|
{
|
|
|
|
|
if (id >= (sb_parts - 1))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
2017-05-27 03:53:32 +02:00
|
|
|
pt.x = id * SB_ICON_WIDTH; /* Justify to the left. */
|
2017-05-18 14:03:43 -04:00
|
|
|
pt.y = 0; /* Justify to the top. */
|
|
|
|
|
ClientToScreen(hwnd, (LPPOINT) &pt);
|
2017-05-27 03:53:32 +02:00
|
|
|
TrackPopupMenu(sb_menu_handles[id], TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, hwndStatus, NULL);
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LRESULT CALLBACK StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
|
|
|
{
|
|
|
|
|
RECT rc;
|
|
|
|
|
POINT pt;
|
|
|
|
|
|
|
|
|
|
WCHAR temp_image_path[1024];
|
|
|
|
|
int new_cdrom_drive;
|
|
|
|
|
int ret = 0;
|
2017-05-27 03:53:32 +02:00
|
|
|
int item_id = 0;
|
|
|
|
|
int item_params = 0;
|
|
|
|
|
int id = 0;
|
|
|
|
|
int part = 0;
|
|
|
|
|
int letter = 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
switch (message)
|
|
|
|
|
{
|
2017-05-18 14:03:43 -04:00
|
|
|
case WM_COMMAND:
|
2017-05-27 03:53:32 +02:00
|
|
|
item_id = LOWORD(wParam) & 0xff00; /* Mask out the low 8 bits for item ID. */
|
|
|
|
|
item_params = LOWORD(wParam) & 0x00ff; /* Mask out the high 8 bits for item parameter. */
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
switch (item_id)
|
|
|
|
|
{
|
|
|
|
|
case IDM_FLOPPY_IMAGE_EXISTING:
|
|
|
|
|
case IDM_FLOPPY_IMAGE_EXISTING_WP:
|
|
|
|
|
id = item_params & 0x0003;
|
|
|
|
|
part = find_status_bar_part(SB_FLOPPY | id);
|
|
|
|
|
if ((part == -1) || (sb_menu_handles == NULL))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
|
2017-09-04 01:52:29 -04:00
|
|
|
ret = file_dlg_w_st(hwnd, IDS_2159, floppyfns[id], 0);
|
2017-05-27 03:53:32 +02:00
|
|
|
if (!ret)
|
|
|
|
|
{
|
2017-09-04 01:52:29 -04:00
|
|
|
floppy_close(id);
|
2017-05-27 03:53:32 +02:00
|
|
|
ui_writeprot[id] = (item_id == IDM_FLOPPY_IMAGE_EXISTING_WP) ? 1 : 0;
|
2017-09-04 01:52:29 -04:00
|
|
|
floppy_load(id, wopenfilestring);
|
|
|
|
|
update_status_bar_icon_state(SB_FLOPPY | id, wcslen(floppyfns[id]) ? 0 : 1);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | (wcslen(floppyfns[id]) ? MF_ENABLED : MF_GRAYED));
|
2017-05-27 03:53:32 +02:00
|
|
|
update_tip(SB_FLOPPY | id);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
2017-05-18 14:03:43 -04:00
|
|
|
break;
|
|
|
|
|
|
2017-05-27 03:53:32 +02:00
|
|
|
case IDM_FLOPPY_EJECT:
|
|
|
|
|
id = item_params & 0x0003;
|
|
|
|
|
part = find_status_bar_part(SB_FLOPPY | id);
|
|
|
|
|
if ((part == -1) || (sb_menu_handles == NULL))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-04 01:52:29 -04:00
|
|
|
floppy_close(id);
|
2017-05-27 03:53:32 +02:00
|
|
|
update_status_bar_icon_state(SB_FLOPPY | id, 1);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
update_tip(SB_FLOPPY | id);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-18 14:03:43 -04:00
|
|
|
break;
|
2017-05-27 03:53:32 +02:00
|
|
|
|
|
|
|
|
case IDM_CDROM_MUTE:
|
|
|
|
|
id = item_params & 0x0007;
|
2017-08-18 14:47:54 +09:00
|
|
|
part = find_status_bar_part(SB_CDROM | id);
|
|
|
|
|
if ((part == -1) || (sb_menu_handles == NULL))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cdrom_drives[id].sound_on ^= 1;
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_MUTE | id, cdrom_drives[id].sound_on ? MF_UNCHECKED : MF_CHECKED);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
sound_cd_thread_reset();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_CDROM_EMPTY:
|
|
|
|
|
id = item_params & 0x0007;
|
|
|
|
|
cdrom_eject(id);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_CDROM_RELOAD:
|
|
|
|
|
id = item_params & 0x0007;
|
|
|
|
|
cdrom_reload(id);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_CDROM_IMAGE:
|
|
|
|
|
id = item_params & 0x0007;
|
|
|
|
|
part = find_status_bar_part(SB_CDROM | id);
|
|
|
|
|
if ((part == -1) || (sb_menu_handles == NULL))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2017-07-24 15:21:17 +02:00
|
|
|
if (!file_dlg_w_st(hwnd, IDS_2075, cdrom_image[id].image_path, 0))
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
cdrom_drives[id].prev_host_drive = cdrom_drives[id].host_drive;
|
|
|
|
|
wcscpy(temp_image_path, wopenfilestring);
|
|
|
|
|
if ((wcscmp(cdrom_image[id].image_path, temp_image_path) == 0) && (cdrom_drives[id].host_drive == 200))
|
|
|
|
|
{
|
|
|
|
|
/* Switching from image to the same image. Do nothing. */
|
|
|
|
|
break;
|
|
|
|
|
}
|
2017-08-20 03:35:42 +09:00
|
|
|
wcscpy(cdrom_image[id].prev_image_path, cdrom_image[id].image_path);
|
2017-05-27 03:53:32 +02:00
|
|
|
cdrom_drives[id].handler->exit(id);
|
|
|
|
|
cdrom_close(id);
|
|
|
|
|
image_open(id, temp_image_path);
|
2017-09-04 01:52:29 -04:00
|
|
|
/* Signal media change to the emulated machine. */
|
2017-05-27 03:53:32 +02:00
|
|
|
cdrom_insert(id);
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
|
|
|
|
if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
2017-05-29 01:18:32 +02:00
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_HOST_DRIVE | id | ((cdrom_drives[id].host_drive - 'A') << 3), MF_UNCHECKED);
|
|
|
|
|
}
|
|
|
|
|
cdrom_drives[id].host_drive = (wcslen(cdrom_image[id].image_path) == 0) ? 0 : 200;
|
|
|
|
|
if (cdrom_drives[id].host_drive == 200)
|
|
|
|
|
{
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED);
|
|
|
|
|
update_status_bar_icon_state(SB_CDROM | id, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
|
|
|
|
update_status_bar_icon_state(SB_CDROM | id, 1);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
2017-08-20 03:35:42 +09:00
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
2017-05-27 03:53:32 +02:00
|
|
|
update_tip(SB_CDROM | id);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
2017-08-20 03:35:42 +09:00
|
|
|
case IDM_CDROM_HOST_DRIVE:
|
2017-05-27 03:53:32 +02:00
|
|
|
id = item_params & 0x0007;
|
|
|
|
|
letter = ((item_params >> 3) & 0x001f) + 'A';
|
|
|
|
|
part = find_status_bar_part(SB_CDROM | id);
|
|
|
|
|
if ((part == -1) || (sb_menu_handles == NULL))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
new_cdrom_drive = letter;
|
|
|
|
|
if (cdrom_drives[id].host_drive == new_cdrom_drive)
|
|
|
|
|
{
|
|
|
|
|
/* Switching to the same drive. Do nothing. */
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
cdrom_drives[id].prev_host_drive = cdrom_drives[id].host_drive;
|
|
|
|
|
cdrom_drives[id].handler->exit(id);
|
|
|
|
|
cdrom_close(id);
|
2017-08-20 03:35:42 +09:00
|
|
|
ioctl_open(id, new_cdrom_drive);
|
2017-09-04 01:52:29 -04:00
|
|
|
/* Signal media change to the emulated machine. */
|
2017-05-27 03:53:32 +02:00
|
|
|
cdrom_insert(id);
|
2017-08-20 03:35:42 +09:00
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
if ((cdrom_drives[id].host_drive >= 'A') && (cdrom_drives[id].host_drive <= 'Z'))
|
|
|
|
|
{
|
2017-08-20 03:35:42 +09:00
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_HOST_DRIVE | id | ((cdrom_drives[id].host_drive - 'A') << 3), MF_UNCHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
2017-08-20 03:35:42 +09:00
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
|
|
|
|
cdrom_drives[id].host_drive = new_cdrom_drive;
|
|
|
|
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_HOST_DRIVE | id | ((cdrom_drives[id].host_drive - 'A') << 3), MF_CHECKED);
|
2017-05-27 03:53:32 +02:00
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
2017-05-29 01:18:32 +02:00
|
|
|
update_status_bar_icon_state(SB_CDROM | id, 0);
|
2017-05-27 03:53:32 +02:00
|
|
|
update_tip(SB_CDROM | id);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_RDISK_EJECT:
|
|
|
|
|
id = item_params & 0x001f;
|
|
|
|
|
removable_disk_eject(id);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_RDISK_RELOAD:
|
|
|
|
|
id = item_params & 0x001f;
|
|
|
|
|
removable_disk_reload(id);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_RDISK_SEND_CHANGE:
|
|
|
|
|
id = item_params & 0x001f;
|
|
|
|
|
scsi_disk_insert(id);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case IDM_RDISK_IMAGE:
|
|
|
|
|
case IDM_RDISK_IMAGE_WP:
|
|
|
|
|
id = item_params & 0x001f;
|
2017-09-30 16:56:38 -04:00
|
|
|
ret = file_dlg_w_st(hwnd, IDS_4106, hdd[id].fn, id);
|
2017-05-27 03:53:32 +02:00
|
|
|
if (!ret)
|
|
|
|
|
{
|
|
|
|
|
removable_disk_unload(id);
|
2017-09-30 16:56:38 -04:00
|
|
|
memset(hdd[id].fn, 0, sizeof(hdd[id].fn));
|
|
|
|
|
wcscpy(hdd[id].fn, wopenfilestring);
|
|
|
|
|
hdd[id].wp = (item_id == IDM_RDISK_IMAGE_WP) ? 1 : 0;
|
|
|
|
|
scsi_loadhd(hdd[id].scsi_id, hdd[id].scsi_lun, id);
|
2017-05-27 03:53:32 +02:00
|
|
|
scsi_disk_insert(id);
|
2017-09-30 16:56:38 -04:00
|
|
|
if (wcslen(hdd[id].fn) > 0)
|
2017-05-27 03:53:32 +02:00
|
|
|
{
|
|
|
|
|
update_status_bar_icon_state(SB_RDISK | id, 0);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_SEND_CHANGE | id, MF_BYCOMMAND | MF_ENABLED);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
update_status_bar_icon_state(SB_RDISK | id, 1);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
EnableMenuItem(sb_menu_handles[part], IDM_RDISK_SEND_CHANGE | id, MF_BYCOMMAND | MF_GRAYED);
|
|
|
|
|
}
|
|
|
|
|
update_tip(SB_RDISK | id);
|
2017-09-23 21:12:26 -04:00
|
|
|
config_save();
|
2017-05-27 03:53:32 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
|
case WM_RBUTTONDOWN:
|
2017-05-27 03:53:32 +02:00
|
|
|
GetClientRect(hwnd, (LPRECT)& rc);
|
|
|
|
|
pt.x = GET_X_LPARAM(lParam);
|
|
|
|
|
pt.y = GET_Y_LPARAM(lParam);
|
|
|
|
|
if (PtInRect((LPRECT) &rc, pt))
|
|
|
|
|
{
|
|
|
|
|
HandlePopupMenu(hwnd, pt, (pt.x / SB_ICON_WIDTH));
|
|
|
|
|
}
|
|
|
|
|
break;
|
2017-05-18 14:03:43 -04:00
|
|
|
|
|
|
|
|
default:
|
2017-05-27 03:53:32 +02:00
|
|
|
return CallWindowProc((WNDPROC) OriginalStatusBarProcedure, hwnd, message, wParam, lParam);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
2017-05-18 14:03:43 -04:00
|
|
|
}
|