Run clang-formats for merge

This commit is contained in:
RichardG867
2022-10-15 13:38:10 -03:00
parent ac68e1f562
commit e706fffb34
34 changed files with 10714 additions and 11082 deletions

View File

@@ -28,76 +28,71 @@
#include <86box/scsi_device.h> #include <86box/scsi_device.h>
#include <86box/sound.h> #include <86box/sound.h>
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong: /* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
of the audio while audio still plays. With an absolute conversion, the counter is fine. */ of the audio while audio still plays. With an absolute conversion, the counter is fine. */
#undef MSFtoLBA #undef MSFtoLBA
#define MSFtoLBA(m,s,f) ((((m*60)+s)*75)+f) #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
#define RAW_SECTOR_SIZE 2352 #define RAW_SECTOR_SIZE 2352
#define COOKED_SECTOR_SIZE 2048 #define COOKED_SECTOR_SIZE 2048
#define MIN_SEEK 2000 #define MIN_SEEK 2000
#define MAX_SEEK 333333 #define MAX_SEEK 333333
#define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4)) #define CD_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define CD_DCB(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f)) #define CD_DCB(x) ((((x) &0xf0) >> 4) * 10 + ((x) &0x0f))
#pragma pack(push,1) #pragma pack(push, 1)
typedef struct { typedef struct {
uint8_t user_data[2048], uint8_t user_data[2048],
ecc[288]; ecc[288];
} m1_data_t; } m1_data_t;
typedef struct { typedef struct {
uint8_t sub_header[8], uint8_t sub_header[8],
user_data[2328]; user_data[2328];
} m2_data_t; } m2_data_t;
typedef union { typedef union {
m1_data_t m1_data; m1_data_t m1_data;
m2_data_t m2_data; m2_data_t m2_data;
uint8_t raw_data[2336]; uint8_t raw_data[2336];
} sector_data_t; } sector_data_t;
typedef struct { typedef struct {
uint8_t sync[12]; uint8_t sync[12];
uint8_t header[4]; uint8_t header[4];
sector_data_t data; sector_data_t data;
} sector_raw_data_t; } sector_raw_data_t;
typedef union { typedef union {
sector_raw_data_t sector_data; sector_raw_data_t sector_data;
uint8_t raw_data[2352]; uint8_t raw_data[2352];
} sector_t; } sector_t;
typedef struct { typedef struct {
sector_t sector; sector_t sector;
uint8_t c2[296]; uint8_t c2[296];
uint8_t subchannel_raw[96]; uint8_t subchannel_raw[96];
uint8_t subchannel_q[16]; uint8_t subchannel_q[16];
uint8_t subchannel_rw[96]; uint8_t subchannel_rw[96];
} cdrom_sector_t; } cdrom_sector_t;
typedef union { typedef union {
cdrom_sector_t cdrom_sector; cdrom_sector_t cdrom_sector;
uint8_t buffer[2856]; uint8_t buffer[2856];
} sector_buffer_t; } sector_buffer_t;
#pragma pack(pop) #pragma pack(pop)
static int cdrom_sector_size;
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
static uint8_t extra_buffer[296];
static int cdrom_sector_size; cdrom_t cdrom[CDROM_NUM];
static uint8_t raw_buffer[2856]; /* Needs to be the same size as sector_buffer_t in the structs. */
static uint8_t extra_buffer[296];
cdrom_t cdrom[CDROM_NUM];
#ifdef ENABLE_CDROM_LOG #ifdef ENABLE_CDROM_LOG
int cdrom_do_log = ENABLE_CDROM_LOG; int cdrom_do_log = ENABLE_CDROM_LOG;
void void
cdrom_log(const char *fmt, ...) cdrom_log(const char *fmt, ...)
@@ -111,10 +106,9 @@ cdrom_log(const char *fmt, ...)
} }
} }
#else #else
#define cdrom_log(fmt, ...) # define cdrom_log(fmt, ...)
#endif #endif
int int
cdrom_lba_to_msf_accurate(int lba) cdrom_lba_to_msf_accurate(int lba)
{ {
@@ -122,7 +116,7 @@ cdrom_lba_to_msf_accurate(int lba)
int m, s, f; int m, s, f;
pos = lba + 150; pos = lba + 150;
f = pos % 75; f = pos % 75;
pos -= f; pos -= f;
pos /= 75; pos /= 75;
s = pos % 60; s = pos % 60;
@@ -133,11 +127,10 @@ cdrom_lba_to_msf_accurate(int lba)
return ((m << 16) | (s << 8) | f); return ((m << 16) | (s << 8) | f);
} }
static double static double
cdrom_get_short_seek(cdrom_t *dev) cdrom_get_short_seek(cdrom_t *dev)
{ {
switch(dev->cur_speed) { switch (dev->cur_speed) {
case 0: case 0:
fatal("CD-ROM %i: 0x speed\n", dev->id); fatal("CD-ROM %i: 0x speed\n", dev->id);
return 0.0; return 0.0;
@@ -147,16 +140,37 @@ cdrom_get_short_seek(cdrom_t *dev)
return 160.0; return 160.0;
case 3: case 3:
return 150.0; return 150.0;
case 4: case 5: case 6: case 7: case 8: case 4:
case 9: case 10: case 11: case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
return 112.0; return 112.0;
case 12: case 13: case 14: case 15: case 12:
case 13:
case 14:
case 15:
return 75.0; return 75.0;
case 16: case 17: case 18: case 19: case 16:
case 17:
case 18:
case 19:
return 58.0; return 58.0;
case 20: case 21: case 22: case 23: case 20:
case 40: case 41: case 42: case 43: case 21:
case 44: case 45: case 46: case 47: case 22:
case 23:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48: case 48:
return 50.0; return 50.0;
default: default:
@@ -165,11 +179,10 @@ cdrom_get_short_seek(cdrom_t *dev)
} }
} }
static double static double
cdrom_get_long_seek(cdrom_t *dev) cdrom_get_long_seek(cdrom_t *dev)
{ {
switch(dev->cur_speed) { switch (dev->cur_speed) {
case 0: case 0:
fatal("CD-ROM %i: 0x speed\n", dev->id); fatal("CD-ROM %i: 0x speed\n", dev->id);
return 0.0; return 0.0;
@@ -179,16 +192,37 @@ cdrom_get_long_seek(cdrom_t *dev)
return 1000.0; return 1000.0;
case 3: case 3:
return 900.0; return 900.0;
case 4: case 5: case 6: case 7: case 8: case 4:
case 9: case 10: case 11: case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
return 675.0; return 675.0;
case 12: case 13: case 14: case 15: case 12:
case 13:
case 14:
case 15:
return 400.0; return 400.0;
case 16: case 17: case 18: case 19: case 16:
case 17:
case 18:
case 19:
return 350.0; return 350.0;
case 20: case 21: case 22: case 23: case 20:
case 40: case 41: case 42: case 43: case 21:
case 44: case 45: case 46: case 47: case 22:
case 23:
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48: case 48:
return 300.0; return 300.0;
default: default:
@@ -197,12 +231,11 @@ cdrom_get_long_seek(cdrom_t *dev)
} }
} }
double double
cdrom_seek_time(cdrom_t *dev) cdrom_seek_time(cdrom_t *dev)
{ {
uint32_t diff = dev->seek_diff; uint32_t diff = dev->seek_diff;
double sd = (double) (MAX_SEEK - MIN_SEEK); double sd = (double) (MAX_SEEK - MIN_SEEK);
if (diff < MIN_SEEK) if (diff < MIN_SEEK)
return 0.0; return 0.0;
@@ -214,7 +247,6 @@ cdrom_seek_time(cdrom_t *dev)
return cdrom_get_short_seek(dev) + ((cdrom_get_long_seek(dev) * ((double) diff)) / sd); return cdrom_get_short_seek(dev) + ((cdrom_get_long_seek(dev) * ((double) diff)) / sd);
} }
void void
cdrom_stop(cdrom_t *dev) cdrom_stop(cdrom_t *dev)
{ {
@@ -222,7 +254,6 @@ cdrom_stop(cdrom_t *dev)
dev->cd_status = CD_STATUS_STOPPED; dev->cd_status = CD_STATUS_STOPPED;
} }
void void
cdrom_seek(cdrom_t *dev, uint32_t pos) cdrom_seek(cdrom_t *dev, uint32_t pos)
{ {
@@ -231,11 +262,10 @@ cdrom_seek(cdrom_t *dev, uint32_t pos)
cdrom_log("CD-ROM %i: Seek to LBA %08X\n", dev->id, pos); cdrom_log("CD-ROM %i: Seek to LBA %08X\n", dev->id, pos);
dev->seek_pos = pos; dev->seek_pos = pos;
cdrom_stop(dev); cdrom_stop(dev);
} }
int int
cdrom_is_pre(cdrom_t *dev, uint32_t lba) cdrom_is_pre(cdrom_t *dev, uint32_t lba)
{ {
@@ -245,7 +275,6 @@ cdrom_is_pre(cdrom_t *dev, uint32_t lba)
return 0; return 0;
} }
int int
cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len) cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
{ {
@@ -272,14 +301,14 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
memset(&(dev->cd_buffer[dev->cd_buflen]), 0x00, (BUF_SIZE - dev->cd_buflen) * 2); memset(&(dev->cd_buffer[dev->cd_buflen]), 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
dev->cd_status = CD_STATUS_STOPPED; dev->cd_status = CD_STATUS_STOPPED;
dev->cd_buflen = len; dev->cd_buflen = len;
ret = 0; ret = 0;
} }
} else { } else {
cdrom_log("CD-ROM %i: Playing completed\n", dev->id); cdrom_log("CD-ROM %i: Playing completed\n", dev->id);
memset(&dev->cd_buffer[dev->cd_buflen], 0x00, (BUF_SIZE - dev->cd_buflen) * 2); memset(&dev->cd_buffer[dev->cd_buflen], 0x00, (BUF_SIZE - dev->cd_buflen) * 2);
dev->cd_status = CD_STATUS_PLAYING_COMPLETED; dev->cd_status = CD_STATUS_PLAYING_COMPLETED;
dev->cd_buflen = len; dev->cd_buflen = len;
ret = 0; ret = 0;
} }
} }
@@ -291,12 +320,11 @@ cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len)
return ret; return ret;
} }
uint8_t uint8_t
cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
{ {
track_info_t ti; track_info_t ti;
int m = 0, s = 0, f = 0; int m = 0, s = 0, f = 0;
if (dev->cd_status == CD_STATUS_DATA_ONLY) if (dev->cd_status == CD_STATUS_DATA_ONLY)
return 0; return 0;
@@ -324,9 +352,9 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
} else } else
pos = MSFtoLBA(m, s, f) - 150; pos = MSFtoLBA(m, s, f) - 150;
m = (len >> 16) & 0xff; m = (len >> 16) & 0xff;
s = (len >> 8) & 0xff; s = (len >> 8) & 0xff;
f = len & 0xff; f = len & 0xff;
len = MSFtoLBA(m, s, f) - 150; len = MSFtoLBA(m, s, f) - 150;
cdrom_log("CD-ROM %i: MSF - pos = %08X len = %08X\n", dev->id, pos, len); cdrom_log("CD-ROM %i: MSF - pos = %08X len = %08X\n", dev->id, pos, len);
@@ -346,15 +374,14 @@ cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
return 0; return 0;
} }
dev->seek_pos = pos; dev->seek_pos = pos;
dev->cd_end = len; dev->cd_end = len;
dev->cd_status = CD_STATUS_PLAYING; dev->cd_status = CD_STATUS_PLAYING;
dev->cd_buflen = 0; dev->cd_buflen = 0;
return 1; return 1;
} }
uint8_t uint8_t
cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit) cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
{ {
@@ -366,9 +393,9 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
switch (type) { switch (type) {
case 0x40: case 0x40:
cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type); cdrom_log("Audio Track Search: MSF = %06x, type = %02x\n", pos, type);
m = CD_DCB((pos >> 24) & 0xff); m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff); s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff); f = CD_DCB((pos >> 8) & 0xff);
pos = MSFtoLBA(m, s, f) - 150; pos = MSFtoLBA(m, s, f) - 150;
break; break;
} }
@@ -381,13 +408,12 @@ cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit)
return 0; return 0;
} }
dev->seek_pos = pos; dev->seek_pos = pos;
dev->noplay = !playbit; dev->noplay = !playbit;
dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED; dev->cd_status = playbit ? CD_STATUS_PLAYING : CD_STATUS_PAUSED;
return 1; return 1;
} }
uint8_t uint8_t
cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type) cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
{ {
@@ -403,9 +429,9 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
switch (type) { switch (type) {
case 0x40: case 0x40:
cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type); cdrom_log("Toshiba Play Audio: MSF = %06x, type = %02x\n", pos, type);
m = CD_DCB((pos >> 24) & 0xff); m = CD_DCB((pos >> 24) & 0xff);
s = CD_DCB((pos >> 16) & 0xff); s = CD_DCB((pos >> 16) & 0xff);
f = CD_DCB((pos >> 8) & 0xff); f = CD_DCB((pos >> 8) & 0xff);
pos = MSFtoLBA(m, s, f) - 150; pos = MSFtoLBA(m, s, f) - 150;
break; break;
} }
@@ -418,12 +444,11 @@ cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type)
return 0; return 0;
} }
dev->cd_end = pos; dev->cd_end = pos;
dev->cd_buflen = 0; dev->cd_buflen = 0;
return 1; return 1;
} }
void void
cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume) cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
{ {
@@ -431,14 +456,13 @@ cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume)
dev->cd_status = (dev->cd_status & 0xfe) | (resume & 0x01); dev->cd_status = (dev->cd_status & 0xfe) | (resume & 0x01);
} }
uint8_t uint8_t
cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf) cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
{ {
uint8_t ret; uint8_t ret;
subchannel_t subc; subchannel_t subc;
int pos = 1; int pos = 1;
uint32_t dat; uint32_t dat;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc); dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i\n", subc.abs_m, subc.abs_s, subc.abs_f); cdrom_log("CD-ROM %i: Returned subchannel at %02i:%02i.%02i\n", subc.abs_m, subc.abs_s, subc.abs_f);
@@ -473,12 +497,12 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
b[pos + 3] = subc.rel_f; b[pos + 3] = subc.rel_f;
pos += 4; pos += 4;
} else { } else {
dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150; dat = MSFtoLBA(subc.abs_m, subc.abs_s, subc.abs_f) - 150;
b[pos++] = (dat >> 24) & 0xff; b[pos++] = (dat >> 24) & 0xff;
b[pos++] = (dat >> 16) & 0xff; b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff; b[pos++] = (dat >> 8) & 0xff;
b[pos++] = dat & 0xff; b[pos++] = dat & 0xff;
dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f); dat = MSFtoLBA(subc.rel_m, subc.rel_s, subc.rel_f);
b[pos++] = (dat >> 24) & 0xff; b[pos++] = (dat >> 24) & 0xff;
b[pos++] = (dat >> 16) & 0xff; b[pos++] = (dat >> 16) & 0xff;
b[pos++] = (dat >> 8) & 0xff; b[pos++] = (dat >> 8) & 0xff;
@@ -488,11 +512,10 @@ cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf)
return ret; return ret;
} }
uint8_t uint8_t
cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b) cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
{ {
uint8_t ret; uint8_t ret;
subchannel_t subc; subchannel_t subc;
dev->ops->get_subchannel(dev, dev->seek_pos, &subc); dev->ops->get_subchannel(dev, dev->seek_pos, &subc);
@@ -521,14 +544,13 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b)
return ret; return ret;
} }
static int static int
read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf) read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int msf)
{ {
track_info_t ti; track_info_t ti;
int i, len = 4; int i, len = 4;
int first_track, last_track; int first_track, last_track;
uint32_t temp; uint32_t temp;
cdrom_log("read_toc_normal(%08X, %08X, %02X, %i)\n", dev, b, start_track, msf); cdrom_log("read_toc_normal(%08X, %08X, %02X, %i)\n", dev, b, start_track, msf);
@@ -570,18 +592,18 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
dev->ops->get_track_info(dev, i + 1, 0, &ti); dev->ops->get_track_info(dev, i + 1, 0, &ti);
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
b[len++] = ti.attr; b[len++] = ti.attr;
b[len++] = ti.number; /* track number */ b[len++] = ti.number; /* track number */
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
if (msf) { if (msf) {
b[len++] = 0; b[len++] = 0;
b[len++] = ti.m; b[len++] = ti.m;
b[len++] = ti.s; b[len++] = ti.s;
b[len++] = ti.f; b[len++] = ti.f;
} else { } else {
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150; temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
b[len++] = temp >> 24; b[len++] = temp >> 24;
b[len++] = temp >> 16; b[len++] = temp >> 16;
b[len++] = temp >> 8; b[len++] = temp >> 8;
@@ -592,13 +614,12 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m
return len; return len;
} }
static int static int
read_toc_session(cdrom_t *dev, unsigned char *b, int msf) read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
{ {
track_info_t ti; track_info_t ti;
int len = 4; int len = 4;
uint32_t temp; uint32_t temp;
cdrom_log("read_toc_session(%08X, %08X, %i)\n", dev, b, msf); cdrom_log("read_toc_session(%08X, %08X, %i)\n", dev, b, msf);
@@ -612,7 +633,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
b[len++] = ti.attr; b[len++] = ti.attr;
b[len++] = ti.number; /* track number */ b[len++] = ti.number; /* track number */
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
if (msf) { if (msf) {
b[len++] = 0; b[len++] = 0;
@@ -620,7 +641,7 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
b[len++] = ti.s; b[len++] = ti.s;
b[len++] = ti.f; b[len++] = ti.f;
} else { } else {
temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150; temp = MSFtoLBA(ti.m, ti.s, ti.f) - 150;
b[len++] = temp >> 24; b[len++] = temp >> 24;
b[len++] = temp >> 16; b[len++] = temp >> 16;
b[len++] = temp >> 8; b[len++] = temp >> 8;
@@ -630,13 +651,12 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf)
return len; return len;
} }
static int static int
read_toc_raw(cdrom_t *dev, unsigned char *b) read_toc_raw(cdrom_t *dev, unsigned char *b)
{ {
track_info_t ti; track_info_t ti;
int i, len = 4; int i, len = 4;
int first_track, last_track; int first_track, last_track;
cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b); cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b);
@@ -650,13 +670,13 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f);
b[len++] = 1; /* Session number */ b[len++] = 1; /* Session number */
b[len++] = ti.attr; /* Track ADR and Control */ b[len++] = ti.attr; /* Track ADR and Control */
b[len++] = 0; /* TNO (always 0) */ b[len++] = 0; /* TNO (always 0) */
b[len++] = ti.number; /* Point (for track points - track number) */ b[len++] = ti.number; /* Point (for track points - track number) */
b[len++] = ti.m; /* M */ b[len++] = ti.m; /* M */
b[len++] = ti.s; /* S */ b[len++] = ti.s; /* S */
b[len++] = ti.f; /* F */ b[len++] = ti.f; /* F */
b[len++] = 0; b[len++] = 0;
b[len++] = 0; b[len++] = 0;
b[len++] = 0; b[len++] = 0;
@@ -665,13 +685,12 @@ read_toc_raw(cdrom_t *dev, unsigned char *b)
return len; return len;
} }
int int
cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len) cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_track, int msf, int max_len)
{ {
int len; int len;
switch(type) { switch (type) {
case CD_TOC_NORMAL: case CD_TOC_NORMAL:
len = read_toc_normal(dev, b, start_track, msf); len = read_toc_normal(dev, b, start_track, msf);
break; break;
@@ -694,13 +713,12 @@ cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type, unsigned char start_tra
return len; return len;
} }
/* A new API call for Mitsumi CD-ROM. */ /* A new API call for Mitsumi CD-ROM. */
void void
cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf) cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
{ {
track_info_t ti; track_info_t ti;
int first_track, last_track; int first_track, last_track;
if (dev != NULL) { if (dev != NULL) {
dev->ops->get_tracks(dev, &first_track, &last_track); dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -719,12 +737,11 @@ cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf)
memset(buf, 0x00, 9); memset(buf, 0x00, 9);
} }
void void
cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type) cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type)
{ {
track_info_t ti; track_info_t ti;
int first_track, last_track; int first_track, last_track;
dev->ops->get_tracks(dev, &first_track, &last_track); dev->ops->get_tracks(dev, &first_track, &last_track);
@@ -759,11 +776,10 @@ cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, in
} }
} }
static int static int
track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2) track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
{ {
if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */ if (!(flags & 0x70) && (flags & 0xf8)) { /* 0x08/0x80/0x88 are illegal modes */
cdrom_log("CD-ROM %i: [Any Mode] 0x08/0x80/0x88 are illegal modes\n", id); cdrom_log("CD-ROM %i: [Any Mode] 0x08/0x80/0x88 are illegal modes\n", id);
return 0; return 0;
} }
@@ -779,22 +795,22 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
return 0; return 0;
} }
if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */ if ((flags & 0x18) == 0x08) { /* EDC/ECC without user data is an illegal mode */
cdrom_log("CD-ROM %i: [Any Data Mode] EDC/ECC without user data is an illegal mode\n", id); cdrom_log("CD-ROM %i: [Any Data Mode] EDC/ECC without user data is an illegal mode\n", id);
return 0; return 0;
} }
if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */ if (((flags & 0xf0) == 0x90) || ((flags & 0xf0) == 0xc0)) { /* 0x90/0x98/0xC0/0xC8 are illegal modes */
cdrom_log("CD-ROM %i: [Any Data Mode] 0x90/0x98/0xC0/0xC8 are illegal modes\n", id); cdrom_log("CD-ROM %i: [Any Data Mode] 0x90/0x98/0xC0/0xC8 are illegal modes\n", id);
return 0; return 0;
} }
if (((type > 3) && (type != 8)) || (mode2 && (mode2 & 0x03))) { if (((type > 3) && (type != 8)) || (mode2 && (mode2 & 0x03))) {
if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */ if ((flags & 0xf0) == 0x30) { /* 0x30/0x38 are illegal modes */
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0x30/0x38 are illegal modes\n", id); cdrom_log("CD-ROM %i: [Any XA Mode 2] 0x30/0x38 are illegal modes\n", id);
return 0; return 0;
} }
if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */ if (((flags & 0xf0) == 0xb0) || ((flags & 0xf0) == 0xd0)) { /* 0xBx and 0xDx are illegal modes */
cdrom_log("CD-ROM %i: [Any XA Mode 2] 0xBx and 0xDx are illegal modes\n", id); cdrom_log("CD-ROM %i: [Any XA Mode 2] 0xBx and 0xDx are illegal modes\n", id);
return 0; return 0;
} }
@@ -804,7 +820,6 @@ track_type_is_valid(uint8_t id, int type, int flags, int audio, int mode2)
return 1; return 1;
} }
static void static void
read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, int mode2, int len) read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, int mode2, int len)
{ {
@@ -832,7 +847,6 @@ read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, i
memset(bb, 0, 288); memset(bb, 0, 288);
} }
static void static void
read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b) read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
{ {
@@ -843,7 +857,6 @@ read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
cdrom_sector_size = 2352; cdrom_sector_size = 2352;
} }
static void static void
read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{ {
@@ -898,7 +911,6 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int
} }
} }
static void static void
read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{ {
@@ -943,7 +955,6 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m
} }
} }
static void static void
read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{ {
@@ -995,7 +1006,6 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
} }
} }
static void static void
read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b)
{ {
@@ -1039,15 +1049,14 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t
} }
} }
int int
cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type,
int cdrom_sector_flags, int *len) int cdrom_sector_flags, int *len)
{ {
uint8_t *b, *temp_b; uint8_t *b, *temp_b;
uint32_t msf, lba; uint32_t msf, lba;
int audio = 0, mode2 = 0; int audio = 0, mode2 = 0;
int m, s, f; int m, s, f;
if (dev->cd_status == CD_STATUS_EMPTY) if (dev->cd_status == CD_STATUS_EMPTY)
return 0; return 0;
@@ -1057,9 +1066,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
*len = 0; *len = 0;
if (ismsf) { if (ismsf) {
m = (sector >> 16) & 0xff; m = (sector >> 16) & 0xff;
s = (sector >> 8) & 0xff; s = (sector >> 8) & 0xff;
f = sector & 0xff; f = sector & 0xff;
lba = MSFtoLBA(m, s, f) - 150; lba = MSFtoLBA(m, s, f) - 150;
msf = sector; msf = sector;
} else { } else {
@@ -1184,7 +1193,6 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c
return 1; return 1;
} }
/* Peform a master init on the entire module. */ /* Peform a master init on the entire module. */
void void
cdrom_global_init(void) cdrom_global_init(void)
@@ -1193,23 +1201,21 @@ cdrom_global_init(void)
memset(cdrom, 0x00, sizeof(cdrom)); memset(cdrom, 0x00, sizeof(cdrom));
} }
static void static void
cdrom_drive_reset(cdrom_t *dev) cdrom_drive_reset(cdrom_t *dev)
{ {
dev->priv = NULL; dev->priv = NULL;
dev->insert = NULL; dev->insert = NULL;
dev->close = NULL; dev->close = NULL;
dev->get_volume = NULL; dev->get_volume = NULL;
dev->get_channel = NULL; dev->get_channel = NULL;
} }
void void
cdrom_hard_reset(void) cdrom_hard_reset(void)
{ {
cdrom_t *dev; cdrom_t *dev;
int i; int i;
for (i = 0; i < CDROM_NUM; i++) { for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i]; dev = &cdrom[i];
@@ -1220,7 +1226,7 @@ cdrom_hard_reset(void)
cdrom_drive_reset(dev); cdrom_drive_reset(dev);
switch(dev->bus_type) { switch (dev->bus_type) {
case CDROM_BUS_ATAPI: case CDROM_BUS_ATAPI:
case CDROM_BUS_SCSI: case CDROM_BUS_SCSI:
scsi_cdrom_drive_reset(i); scsi_cdrom_drive_reset(i);
@@ -1240,12 +1246,11 @@ cdrom_hard_reset(void)
sound_cd_thread_reset(); sound_cd_thread_reset();
} }
void void
cdrom_close(void) cdrom_close(void)
{ {
cdrom_t *dev; cdrom_t *dev;
int i; int i;
for (i = 0; i < CDROM_NUM; i++) { for (i = 0; i < CDROM_NUM; i++) {
dev = &cdrom[i]; dev = &cdrom[i];
@@ -1259,14 +1264,13 @@ cdrom_close(void)
if (dev->ops && dev->ops->exit) if (dev->ops && dev->ops->exit)
dev->ops->exit(dev); dev->ops->exit(dev);
dev->ops = NULL; dev->ops = NULL;
dev->priv = NULL; dev->priv = NULL;
cdrom_drive_reset(dev); cdrom_drive_reset(dev);
} }
} }
/* Signal disc change to the emulated machine. */ /* Signal disc change to the emulated machine. */
void void
cdrom_insert(uint8_t id) cdrom_insert(uint8_t id)
@@ -1279,7 +1283,6 @@ cdrom_insert(uint8_t id)
} }
} }
/* The mechanics of ejecting a CD-ROM from a drive. */ /* The mechanics of ejecting a CD-ROM from a drive. */
void void
cdrom_eject(uint8_t id) cdrom_eject(uint8_t id)
@@ -1296,7 +1299,7 @@ cdrom_eject(uint8_t id)
strcpy(dev->prev_image_path, dev->image_path); strcpy(dev->prev_image_path, dev->image_path);
dev->prev_host_drive = dev->host_drive; dev->prev_host_drive = dev->host_drive;
dev->host_drive = 0; dev->host_drive = 0;
dev->ops->exit(dev); dev->ops->exit(dev);
dev->ops = NULL; dev->ops = NULL;
@@ -1309,15 +1312,13 @@ cdrom_eject(uint8_t id)
config_save(); config_save();
} }
/* The mechanics of re-loading a CD-ROM drive. */ /* The mechanics of re-loading a CD-ROM drive. */
void void
cdrom_reload(uint8_t id) cdrom_reload(uint8_t id)
{ {
cdrom_t *dev = &cdrom[id]; cdrom_t *dev = &cdrom[id];
if ((dev->host_drive == dev->prev_host_drive) || if ((dev->host_drive == dev->prev_host_drive) || (dev->prev_host_drive == 0) || (dev->host_drive != 0)) {
(dev->prev_host_drive == 0) || (dev->host_drive != 0)) {
/* Switch from empty to empty. Do nothing. */ /* Switch from empty to empty. Do nothing. */
return; return;
} }

View File

@@ -33,11 +33,9 @@
#include <86box/cdrom.h> #include <86box/cdrom.h>
#include <86box/cdrom_image.h> #include <86box/cdrom_image.h>
#ifdef ENABLE_CDROM_IMAGE_LOG #ifdef ENABLE_CDROM_IMAGE_LOG
int cdrom_image_do_log = ENABLE_CDROM_IMAGE_LOG; int cdrom_image_do_log = ENABLE_CDROM_IMAGE_LOG;
void void
cdrom_image_log(const char *fmt, ...) cdrom_image_log(const char *fmt, ...)
{ {
@@ -50,31 +48,28 @@ cdrom_image_log(const char *fmt, ...)
} }
} }
#else #else
#define cdrom_image_log(fmt, ...) # define cdrom_image_log(fmt, ...)
#endif #endif
/* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong: /* The addresses sent from the guest are absolute, ie. a LBA of 0 corresponds to a MSF of 00:00:00. Otherwise, the counter displayed by the guest is wrong:
there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start there is a seeming 2 seconds in which audio plays but counter does not move, while a data track before audio jumps to 2 seconds before the actual start
of the audio while audio still plays. With an absolute conversion, the counter is fine. */ of the audio while audio still plays. With an absolute conversion, the counter is fine. */
#define MSFtoLBA(m,s,f) ((((m * 60) + s) * 75) + f) #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f)
static void static void
image_get_tracks(cdrom_t *dev, int *first, int *last) image_get_tracks(cdrom_t *dev, int *first, int *last)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
TMSF tmsf; TMSF tmsf;
cdi_get_audio_tracks(img, first, last, &tmsf); cdi_get_audio_tracks(img, first, last, &tmsf);
} }
static void static void
image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti) image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
TMSF tmsf; TMSF tmsf;
cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr); cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr);
@@ -83,12 +78,11 @@ image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti)
ti->f = tmsf.fr; ti->f = tmsf.fr;
} }
static void static void
image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc) image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
TMSF rel_pos, abs_pos; TMSF rel_pos, abs_pos;
cdi_get_audio_sub(img, lba, &subc->attr, &subc->track, &subc->index, cdi_get_audio_sub(img, lba, &subc->attr, &subc->track, &subc->index,
&rel_pos, &abs_pos); &rel_pos, &abs_pos);
@@ -102,15 +96,14 @@ image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc)
subc->rel_f = rel_pos.fr; subc->rel_f = rel_pos.fr;
} }
static int static int
image_get_capacity(cdrom_t *dev) image_get_capacity(cdrom_t *dev)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
int first_track, last_track; int first_track, last_track;
int number, c; int number, c;
unsigned char attr; unsigned char attr;
uint32_t address = 0, lb = 0; uint32_t address = 0, lb = 0;
if (!img) if (!img)
return 0; return 0;
@@ -126,23 +119,22 @@ image_get_capacity(cdrom_t *dev)
return lb; return lb;
} }
static int static int
image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
uint8_t attr; uint8_t attr;
TMSF tmsf; TMSF tmsf;
int m, s, f; int m, s, f;
int number, track; int number, track;
if (!img || (dev->cd_status == CD_STATUS_DATA_ONLY)) if (!img || (dev->cd_status == CD_STATUS_DATA_ONLY))
return 0; return 0;
if (ismsf) { if (ismsf) {
m = (pos >> 16) & 0xff; m = (pos >> 16) & 0xff;
s = (pos >> 8) & 0xff; s = (pos >> 8) & 0xff;
f = pos & 0xff; f = pos & 0xff;
pos = MSFtoLBA(m, s, f) - 150; pos = MSFtoLBA(m, s, f) - 150;
} }
@@ -156,12 +148,11 @@ image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf)
} }
} }
static int static int
image_is_track_pre(cdrom_t *dev, uint32_t lba) image_is_track_pre(cdrom_t *dev, uint32_t lba)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
int track; int track;
/* GetTrack requires LBA. */ /* GetTrack requires LBA. */
track = cdi_get_track(img, lba); track = cdi_get_track(img, lba);
@@ -172,20 +163,18 @@ image_is_track_pre(cdrom_t *dev, uint32_t lba)
return 0; return 0;
} }
static int static int
image_sector_size(struct cdrom *dev, uint32_t lba) image_sector_size(struct cdrom *dev, uint32_t lba)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
return cdi_get_sector_size(img, lba); return cdi_get_sector_size(img, lba);
} }
static int static int
image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba) image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
switch (type) { switch (type) {
case CD_READ_DATA: case CD_READ_DATA:
@@ -203,11 +192,10 @@ image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba)
} }
} }
static int static int
image_track_type(cdrom_t *dev, uint32_t lba) image_track_type(cdrom_t *dev, uint32_t lba)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
if (img) { if (img) {
if (image_is_track_audio(dev, lba, 0)) if (image_is_track_audio(dev, lba, 0))
@@ -215,17 +203,16 @@ image_track_type(cdrom_t *dev, uint32_t lba)
else { else {
if (cdi_is_mode2(img, lba)) if (cdi_is_mode2(img, lba))
return CD_TRACK_MODE2 | cdi_get_mode2_form(img, lba); return CD_TRACK_MODE2 | cdi_get_mode2_form(img, lba);
} }
} }
return 0; return 0;
} }
static void static void
image_exit(cdrom_t *dev) image_exit(cdrom_t *dev)
{ {
cd_img_t *img = (cd_img_t *)dev->image; cd_img_t *img = (cd_img_t *) dev->image;
cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path); cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path);
dev->cd_status = CD_STATUS_EMPTY; dev->cd_status = CD_STATUS_EMPTY;
@@ -238,7 +225,6 @@ image_exit(cdrom_t *dev)
dev->ops = NULL; dev->ops = NULL;
} }
static const cdrom_ops_t cdrom_image_ops = { static const cdrom_ops_t cdrom_image_ops = {
image_get_tracks, image_get_tracks,
image_get_track_info, image_get_track_info,
@@ -250,17 +236,15 @@ static const cdrom_ops_t cdrom_image_ops = {
image_exit image_exit
}; };
static int static int
image_open_abort(cdrom_t *dev) image_open_abort(cdrom_t *dev)
{ {
cdrom_image_close(dev); cdrom_image_close(dev);
dev->ops = NULL; dev->ops = NULL;
dev->host_drive = 0; dev->host_drive = 0;
return 1; return 1;
} }
int int
cdrom_image_open(cdrom_t *dev, const char *fn) cdrom_image_open(cdrom_t *dev, const char *fn)
{ {
@@ -289,12 +273,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
/* All good, reset state. */ /* All good, reset state. */
if (i >= 2) if (i >= 2)
dev->cd_status = CD_STATUS_DATA_ONLY; dev->cd_status = CD_STATUS_DATA_ONLY;
else else
dev->cd_status = CD_STATUS_STOPPED; dev->cd_status = CD_STATUS_STOPPED;
dev->is_dir = (i == 3); dev->is_dir = (i == 3);
dev->seek_pos = 0; dev->seek_pos = 0;
dev->cd_buflen = 0; dev->cd_buflen = 0;
dev->cdrom_capacity = image_get_capacity(dev); dev->cdrom_capacity = image_get_capacity(dev);
cdrom_image_log("CD-ROM capacity: %i sectors (%" PRIi64 " bytes)\n", dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity) << 11ULL); cdrom_image_log("CD-ROM capacity: %i sectors (%" PRIi64 " bytes)\n", dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity) << 11ULL);
@@ -304,7 +288,6 @@ cdrom_image_open(cdrom_t *dev, const char *fn)
return 0; return 0;
} }
void void
cdrom_image_close(cdrom_t *dev) cdrom_image_close(cdrom_t *dev)
{ {

View File

@@ -36,8 +36,7 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/cdrom_image_backend.h> #include <86box/cdrom_image_backend.h>
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4))
#define MAX_LINE_LENGTH 512 #define MAX_LINE_LENGTH 512
#define MAX_FILENAME_LENGTH 256 #define MAX_FILENAME_LENGTH 256
@@ -425,12 +424,11 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i); success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i);
if (!success) if (!success)
break; break;
/* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an /* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an
audio track. */ audio track. */
if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 && if (raw && sector < cdi->tracks[0].length && !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068]))
(cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[i * sector_size + 2068])) return 0;
return 0;
} }
memcpy((void *) buffer, buf, buf_len); memcpy((void *) buffer, buf, buf_len);
@@ -548,7 +546,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename)
if (error) { if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL)) if ((trk.file != NULL) && (trk.file->close != NULL))
trk.file->close(trk.file); trk.file->close(trk.file);
ret = 3; ret = 3;
trk.file = viso_init(filename, &error); trk.file = viso_init(filename, &error);
if (error) { if (error) {
if ((trk.file != NULL) && (trk.file->close != NULL)) if ((trk.file != NULL) && (trk.file->close != NULL))

View File

@@ -13,168 +13,162 @@
* Copyright 2016-2019 Miran Grca. * Copyright 2016-2019 Miran Grca.
*/ */
#ifndef EMU_CDROM_H #ifndef EMU_CDROM_H
# define EMU_CDROM_H #define EMU_CDROM_H
#define CDROM_NUM 4
#define CDROM_NUM 4 #define CD_STATUS_EMPTY 0
#define CD_STATUS_DATA_ONLY 1
#define CD_STATUS_EMPTY 0 #define CD_STATUS_PAUSED 2
#define CD_STATUS_DATA_ONLY 1 #define CD_STATUS_PLAYING 3
#define CD_STATUS_PAUSED 2 #define CD_STATUS_STOPPED 4
#define CD_STATUS_PLAYING 3 #define CD_STATUS_PLAYING_COMPLETED 5
#define CD_STATUS_STOPPED 4
#define CD_STATUS_PLAYING_COMPLETED 5
/* Medium changed flag. */ /* Medium changed flag. */
#define CD_STATUS_MEDIUM_CHANGED 0x80 #define CD_STATUS_MEDIUM_CHANGED 0x80
#define CD_TRACK_AUDIO 0x08 #define CD_TRACK_AUDIO 0x08
#define CD_TRACK_MODE2 0x04 #define CD_TRACK_MODE2 0x04
#define CD_READ_DATA 0 #define CD_READ_DATA 0
#define CD_READ_AUDIO 1 #define CD_READ_AUDIO 1
#define CD_READ_RAW 2 #define CD_READ_RAW 2
#define CD_TOC_NORMAL 0 #define CD_TOC_NORMAL 0
#define CD_TOC_SESSION 1 #define CD_TOC_SESSION 1
#define CD_TOC_RAW 2 #define CD_TOC_RAW 2
#define BUF_SIZE 32768 #define BUF_SIZE 32768
#define CDROM_IMAGE 200 #define CDROM_IMAGE 200
/* This is so that if/when this is changed to something else, /* This is so that if/when this is changed to something else,
changing this one define will be enough. */ changing this one define will be enough. */
#define CDROM_EMPTY !dev->host_drive #define CDROM_EMPTY !dev->host_drive
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
enum { enum {
CDROM_BUS_DISABLED = 0, CDROM_BUS_DISABLED = 0,
CDROM_BUS_ATAPI = 5, CDROM_BUS_ATAPI = 5,
CDROM_BUS_SCSI, CDROM_BUS_SCSI,
CDROM_BUS_USB CDROM_BUS_USB
}; };
/* To shut up the GCC compilers. */ /* To shut up the GCC compilers. */
struct cdrom; struct cdrom;
typedef struct { typedef struct {
uint8_t attr, track, uint8_t attr, track,
index, index,
abs_m, abs_s, abs_f, abs_m, abs_s, abs_f,
rel_m, rel_s, rel_f; rel_m, rel_s, rel_f;
} subchannel_t; } subchannel_t;
typedef struct { typedef struct {
int number; int number;
uint8_t attr, m, s, f; uint8_t attr, m, s, f;
} track_info_t; } track_info_t;
/* Define the various CD-ROM drive operations (ops). */ /* Define the various CD-ROM drive operations (ops). */
typedef struct { typedef struct {
void (*get_tracks)(struct cdrom *dev, int *first, int *last); void (*get_tracks)(struct cdrom *dev, int *first, int *last);
void (*get_track_info)(struct cdrom *dev, uint32_t track, int end, track_info_t *ti); void (*get_track_info)(struct cdrom *dev, uint32_t track, int end, track_info_t *ti);
void (*get_subchannel)(struct cdrom *dev, uint32_t lba, subchannel_t *subc); void (*get_subchannel)(struct cdrom *dev, uint32_t lba, subchannel_t *subc);
int (*is_track_pre)(struct cdrom *dev, uint32_t lba); int (*is_track_pre)(struct cdrom *dev, uint32_t lba);
int (*sector_size)(struct cdrom *dev, uint32_t lba); int (*sector_size)(struct cdrom *dev, uint32_t lba);
int (*read_sector)(struct cdrom *dev, int type, uint8_t *b, uint32_t lba); int (*read_sector)(struct cdrom *dev, int type, uint8_t *b, uint32_t lba);
int (*track_type)(struct cdrom *dev, uint32_t lba); int (*track_type)(struct cdrom *dev, uint32_t lba);
void (*exit)(struct cdrom *dev); void (*exit)(struct cdrom *dev);
} cdrom_ops_t; } cdrom_ops_t;
typedef struct cdrom { typedef struct cdrom {
uint8_t id; uint8_t id;
union { union {
uint8_t res, res0, /* Reserved for other ID's. */ uint8_t res, res0, /* Reserved for other ID's. */
res1, res1,
ide_channel, scsi_device_id; ide_channel, scsi_device_id;
}; };
uint8_t bus_type, /* 0 = ATAPI, 1 = SCSI */ uint8_t bus_type, /* 0 = ATAPI, 1 = SCSI */
bus_mode, /* Bit 0 = PIO suported; bus_mode, /* Bit 0 = PIO suported;
Bit 1 = DMA supportd. */ Bit 1 = DMA supportd. */
cd_status, /* Struct variable reserved for cd_status, /* Struct variable reserved for
media status. */ media status. */
speed, cur_speed; speed, cur_speed;
int is_dir; int is_dir;
void *priv; void *priv;
char image_path[1024], char image_path[1024],
prev_image_path[1024]; prev_image_path[1024];
uint32_t sound_on, cdrom_capacity, uint32_t sound_on, cdrom_capacity,
pad, seek_pos, pad, seek_pos,
seek_diff, cd_end; seek_diff, cd_end;
int host_drive, prev_host_drive, int host_drive, prev_host_drive,
cd_buflen, noplay; cd_buflen, noplay;
const cdrom_ops_t *ops; const cdrom_ops_t *ops;
void *image; void *image;
void (*insert)(void *p); void (*insert)(void *p);
void (*close)(void *p); void (*close)(void *p);
uint32_t (*get_volume)(void *p, int channel); uint32_t (*get_volume)(void *p, int channel);
uint32_t (*get_channel)(void *p, int channel); uint32_t (*get_channel)(void *p, int channel);
int16_t cd_buffer[BUF_SIZE]; int16_t cd_buffer[BUF_SIZE];
} cdrom_t; } cdrom_t;
extern cdrom_t cdrom[CDROM_NUM];
extern cdrom_t cdrom[CDROM_NUM]; extern int cdrom_lba_to_msf_accurate(int lba);
extern double cdrom_seek_time(cdrom_t *dev);
extern void cdrom_stop(cdrom_t *dev);
extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba);
extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len);
extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf);
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
extern uint8_t cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type);
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf);
extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b);
extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type,
unsigned char start_track, int msf, int max_len);
extern void cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf);
extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
int cdrom_sector_type, int cdrom_sector_flags, int *len);
extern void cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type);
extern int cdrom_lba_to_msf_accurate(int lba); extern void cdrom_seek(cdrom_t *dev, uint32_t pos);
extern double cdrom_seek_time(cdrom_t *dev);
extern void cdrom_stop(cdrom_t *dev);
extern int cdrom_is_pre(cdrom_t *dev, uint32_t lba);
extern int cdrom_audio_callback(cdrom_t *dev, int16_t *output, int len);
extern uint8_t cdrom_audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf);
extern uint8_t cdrom_audio_track_search(cdrom_t *dev, uint32_t pos, int type, uint8_t playbit);
extern uint8_t cdrom_toshiba_audio_play(cdrom_t *dev, uint32_t pos, int type);
extern void cdrom_audio_pause_resume(cdrom_t *dev, uint8_t resume);
extern uint8_t cdrom_get_current_subchannel(cdrom_t *dev, uint8_t *b, int msf);
extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b);
extern int cdrom_read_toc(cdrom_t *dev, unsigned char *b, int type,
unsigned char start_track, int msf, int max_len);
extern void cdrom_get_track_buffer(cdrom_t *dev, uint8_t *buf);
extern int cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
int cdrom_sector_type, int cdrom_sector_flags, int *len);
extern void cdrom_read_disc_info_toc(cdrom_t *dev, unsigned char *b, unsigned char track, int type);
extern void cdrom_seek(cdrom_t *dev, uint32_t pos); extern void cdrom_close_handler(uint8_t id);
extern void cdrom_insert(uint8_t id);
extern void cdrom_eject(uint8_t id);
extern void cdrom_reload(uint8_t id);
extern void cdrom_close_handler(uint8_t id); extern int cdrom_image_open(cdrom_t *dev, const char *fn);
extern void cdrom_insert(uint8_t id); extern void cdrom_image_close(cdrom_t *dev);
extern void cdrom_eject(uint8_t id); extern void cdrom_image_reset(cdrom_t *dev);
extern void cdrom_reload(uint8_t id);
extern int cdrom_image_open(cdrom_t *dev, const char *fn); extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos,
extern void cdrom_image_close(cdrom_t *dev); int number_of_blocks);
extern void cdrom_image_reset(cdrom_t *dev);
extern void cdrom_update_cdb(uint8_t *cdb, int lba_pos, extern int find_cdrom_for_scsi_id(uint8_t scsi_id);
int number_of_blocks);
extern int find_cdrom_for_scsi_id(uint8_t scsi_id); extern void cdrom_close(void);
extern void cdrom_global_init(void);
extern void cdrom_close(void); extern void cdrom_global_reset(void);
extern void cdrom_global_init(void); extern void cdrom_hard_reset(void);
extern void cdrom_global_reset(void); extern void scsi_cdrom_drive_reset(int c);
extern void cdrom_hard_reset(void);
extern void scsi_cdrom_drive_reset(int c);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /*EMU_CDROM_H*/
#endif /*EMU_CDROM_H*/

View File

@@ -16,7 +16,7 @@
* Copyright 2016-2022 Miran Grca. * Copyright 2016-2022 Miran Grca.
*/ */
#ifndef CDROM_IMAGE_H #ifndef CDROM_IMAGE_H
# define CDROM_IMAGE_H #define CDROM_IMAGE_H
/* this header file lists the functions provided by /* this header file lists the functions provided by
various platform specific cdrom-ioctl files */ various platform specific cdrom-ioctl files */
@@ -25,12 +25,12 @@
extern "C" { extern "C" {
#endif #endif
extern int image_open(uint8_t id, wchar_t *fn); extern int image_open(uint8_t id, wchar_t *fn);
extern void image_reset(uint8_t id); extern void image_reset(uint8_t id);
extern void image_close(uint8_t id); extern void image_close(uint8_t id);
void update_status_bar_icon_state(int tag, int state); void update_status_bar_icon_state(int tag, int state);
extern void cdrom_set_null_handler(uint8_t id); extern void cdrom_set_null_handler(uint8_t id);
#ifdef __cplusplus #ifdef __cplusplus

View File

@@ -18,77 +18,76 @@
* Copyright 2002-2020 The DOSBox Team. * Copyright 2002-2020 The DOSBox Team.
*/ */
#ifndef CDROM_IMAGE_BACKEND_H #ifndef CDROM_IMAGE_BACKEND_H
# define CDROM_IMAGE_BACKEND_H #define CDROM_IMAGE_BACKEND_H
#define RAW_SECTOR_SIZE 2352 #define RAW_SECTOR_SIZE 2352
#define COOKED_SECTOR_SIZE 2048 #define COOKED_SECTOR_SIZE 2048
#define DATA_TRACK 0x14 #define DATA_TRACK 0x14
#define AUDIO_TRACK 0x10 #define AUDIO_TRACK 0x10
#define CD_FPS 75
#define FRAMES_TO_MSF(f, M,S,F) { \
uint64_t value = f; \
*(F) = (value%CD_FPS) & 0xff; \
value /= CD_FPS; \
*(S) = (value%60) & 0xff; \
value /= 60; \
*(M) = value & 0xff; \
}
#define MSF_TO_FRAMES(M, S, F) ((M)*60*CD_FPS+(S)*CD_FPS+(F))
#define CD_FPS 75
#define FRAMES_TO_MSF(f, M, S, F) \
{ \
uint64_t value = f; \
*(F) = (value % CD_FPS) & 0xff; \
value /= CD_FPS; \
*(S) = (value % 60) & 0xff; \
value /= 60; \
*(M) = value & 0xff; \
}
#define MSF_TO_FRAMES(M, S, F) ((M) *60 * CD_FPS + (S) *CD_FPS + (F))
typedef struct SMSF { typedef struct SMSF {
uint16_t min; uint16_t min;
uint8_t sec; uint8_t sec;
uint8_t fr; uint8_t fr;
} TMSF; } TMSF;
/* Track file struct. */ /* Track file struct. */
typedef struct { typedef struct {
int (*read)(void *p, uint8_t *buffer, uint64_t seek, size_t count); int (*read)(void *p, uint8_t *buffer, uint64_t seek, size_t count);
uint64_t (*get_length)(void *p); uint64_t (*get_length)(void *p);
void (*close)(void *p); void (*close)(void *p);
char fn[260]; char fn[260];
FILE *file; FILE *file;
void *priv; void *priv;
} track_file_t; } track_file_t;
typedef struct { typedef struct {
int number, track_number, attr, sector_size, int number, track_number, attr, sector_size,
mode2, form, pre, pad; mode2, form, pre, pad;
uint64_t start, length, uint64_t start, length,
skip; skip;
track_file_t *file; track_file_t *file;
} track_t; } track_t;
typedef struct { typedef struct {
int tracks_num; int tracks_num;
track_t *tracks; track_t *tracks;
} cd_img_t; } cd_img_t;
/* Binary file functions. */ /* Binary file functions. */
extern void cdi_close(cd_img_t *cdi); extern void cdi_close(cd_img_t *cdi);
extern int cdi_set_device(cd_img_t *cdi, const char *path); extern int cdi_set_device(cd_img_t *cdi, const char *path);
extern int cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out); extern int cdi_get_audio_tracks(cd_img_t *cdi, int *st_track, int *end, TMSF *lead_out);
extern int cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_out); extern int cdi_get_audio_tracks_lba(cd_img_t *cdi, int *st_track, int *end, uint32_t *lead_out);
extern int cdi_get_audio_track_pre(cd_img_t *cdi, int track); extern int cdi_get_audio_track_pre(cd_img_t *cdi, int track);
extern int cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF *start, uint8_t *attr); extern int cdi_get_audio_track_info(cd_img_t *cdi, int end, int track, int *track_num, TMSF *start, uint8_t *attr);
extern int cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num, uint32_t *start, uint8_t *attr); extern int cdi_get_audio_track_info_lba(cd_img_t *cdi, int end, int track, int *track_num, uint32_t *start, uint8_t *attr);
extern int cdi_get_track(cd_img_t *cdi, uint32_t sector); extern int cdi_get_track(cd_img_t *cdi, uint32_t sector);
extern int cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos); extern int cdi_get_audio_sub(cd_img_t *cdi, uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos);
extern int cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector); extern int cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector);
extern int cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num); extern int cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num);
extern int cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector); extern int cdi_read_sector_sub(cd_img_t *cdi, uint8_t *buffer, uint32_t sector);
extern int cdi_get_sector_size(cd_img_t *cdi, uint32_t sector); extern int cdi_get_sector_size(cd_img_t *cdi, uint32_t sector);
extern int cdi_is_mode2(cd_img_t *cdi, uint32_t sector); extern int cdi_is_mode2(cd_img_t *cdi, uint32_t sector);
extern int cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector); extern int cdi_get_mode2_form(cd_img_t *cdi, uint32_t sector);
extern int cdi_load_iso(cd_img_t *cdi, const char *filename); extern int cdi_load_iso(cd_img_t *cdi, const char *filename);
extern int cdi_load_cue(cd_img_t *cdi, const char *cuefile); extern int cdi_load_cue(cd_img_t *cdi, const char *cuefile);
extern int cdi_has_data_track(cd_img_t *cdi); extern int cdi_has_data_track(cd_img_t *cdi);
extern int cdi_has_audio_track(cd_img_t *cdi); extern int cdi_has_audio_track(cd_img_t *cdi);
/* Virtual ISO functions. */ /* Virtual ISO functions. */
extern int viso_read(void *p, uint8_t *buffer, uint64_t seek, size_t count); extern int viso_read(void *p, uint8_t *buffer, uint64_t seek, size_t count);
@@ -96,5 +95,4 @@ extern uint64_t viso_get_length(void *p);
extern void viso_close(void *p); extern void viso_close(void *p);
extern track_file_t *viso_init(const char *dirname, int *error); extern track_file_t *viso_init(const char *dirname, int *error);
#endif /*CDROM_IMAGE_BACKEND_H*/ #endif /*CDROM_IMAGE_BACKEND_H*/

View File

@@ -22,452 +22,450 @@
*/ */
#ifndef WIN_RESOURCE_H #ifndef WIN_RESOURCE_H
# define WIN_RESOURCE_H #define WIN_RESOURCE_H
/* Dialog IDs. */ /* Dialog IDs. */
#define DLG_ABOUT 101 /* top-level dialog */ #define DLG_ABOUT 101 /* top-level dialog */
#define DLG_STATUS 102 /* top-level dialog */ #define DLG_STATUS 102 /* top-level dialog */
#define DLG_SND_GAIN 103 /* top-level dialog */ #define DLG_SND_GAIN 103 /* top-level dialog */
#define DLG_NEW_FLOPPY 104 /* top-level dialog */ #define DLG_NEW_FLOPPY 104 /* top-level dialog */
#define DLG_SPECIFY_DIM 105 /* top-level dialog */ #define DLG_SPECIFY_DIM 105 /* top-level dialog */
#define DLG_PREFERENCES 106 /* top-level dialog */ #define DLG_PREFERENCES 106 /* top-level dialog */
#define DLG_CONFIG 110 /* top-level dialog */ #define DLG_CONFIG 110 /* top-level dialog */
#define DLG_CFG_MACHINE 111 /* sub-dialog of config */ #define DLG_CFG_MACHINE 111 /* sub-dialog of config */
#define DLG_CFG_VIDEO 112 /* sub-dialog of config */ #define DLG_CFG_VIDEO 112 /* sub-dialog of config */
#define DLG_CFG_INPUT 113 /* sub-dialog of config */ #define DLG_CFG_INPUT 113 /* sub-dialog of config */
#define DLG_CFG_SOUND 114 /* sub-dialog of config */ #define DLG_CFG_SOUND 114 /* sub-dialog of config */
#define DLG_CFG_NETWORK 115 /* sub-dialog of config */ #define DLG_CFG_NETWORK 115 /* sub-dialog of config */
#define DLG_CFG_PORTS 116 /* sub-dialog of config */ #define DLG_CFG_PORTS 116 /* sub-dialog of config */
#define DLG_CFG_STORAGE 117 /* sub-dialog of config */ #define DLG_CFG_STORAGE 117 /* sub-dialog of config */
#define DLG_CFG_HARD_DISKS 118 /* sub-dialog of config */ #define DLG_CFG_HARD_DISKS 118 /* sub-dialog of config */
#define DLG_CFG_HARD_DISKS_ADD 119 /* sub-dialog of config */ #define DLG_CFG_HARD_DISKS_ADD 119 /* sub-dialog of config */
#define DLG_CFG_FLOPPY_AND_CDROM_DRIVES 120 /* sub-dialog of config */ #define DLG_CFG_FLOPPY_AND_CDROM_DRIVES 120 /* sub-dialog of config */
#define DLG_CFG_OTHER_REMOVABLE_DEVICES 121 /* sub-dialog of config */ #define DLG_CFG_OTHER_REMOVABLE_DEVICES 121 /* sub-dialog of config */
#define DLG_CFG_PERIPHERALS 122 /* sub-dialog of config */ #define DLG_CFG_PERIPHERALS 122 /* sub-dialog of config */
/* Static text label IDs. */ /* Static text label IDs. */
/* DLG_SND_GAIN */ /* DLG_SND_GAIN */
#define IDT_GAIN 1700 /* Gain */ #define IDT_GAIN 1700 /* Gain */
/* DLG_NEW_FLOPPY */ /* DLG_NEW_FLOPPY */
#define IDT_FLP_FILE_NAME 1701 /* File name: */ #define IDT_FLP_FILE_NAME 1701 /* File name: */
#define IDT_FLP_DISK_SIZE 1702 /* Disk size: */ #define IDT_FLP_DISK_SIZE 1702 /* Disk size: */
#define IDT_FLP_RPM_MODE 1703 /* RPM mode: */ #define IDT_FLP_RPM_MODE 1703 /* RPM mode: */
#define IDT_FLP_PROGRESS 1704 /* Progress: */ #define IDT_FLP_PROGRESS 1704 /* Progress: */
/* DLG_SPECIFY_DIM */ /* DLG_SPECIFY_DIM */
#define IDT_WIDTH 1705 /* ??? */ #define IDT_WIDTH 1705 /* ??? */
#define IDT_HEIGHT 1706 /* ??? */ #define IDT_HEIGHT 1706 /* ??? */
/* DLG_CFG_MACHINE */ /* DLG_CFG_MACHINE */
#define IDT_MACHINE_TYPE 1707 /* Machine type: */ #define IDT_MACHINE_TYPE 1707 /* Machine type: */
#define IDT_MACHINE 1708 /* Machine: */ #define IDT_MACHINE 1708 /* Machine: */
#define IDT_CPU_TYPE 1709 /* CPU type: */ #define IDT_CPU_TYPE 1709 /* CPU type: */
#define IDT_CPU_SPEED 1710 /* CPU speed: */ #define IDT_CPU_SPEED 1710 /* CPU speed: */
#define IDT_FPU 1711 /* FPU: */ #define IDT_FPU 1711 /* FPU: */
#define IDT_WAIT_STATES 1712 /* Wait states: */ #define IDT_WAIT_STATES 1712 /* Wait states: */
#define IDT_MB 1713 /* MB == IDC_TEXT_MB */ #define IDT_MB 1713 /* MB == IDC_TEXT_MB */
#define IDT_MEMORY 1714 /* Memory: */ #define IDT_MEMORY 1714 /* Memory: */
/* DLG_CFG_VIDEO */ /* DLG_CFG_VIDEO */
#define IDT_VIDEO 1715 /* Video: */ #define IDT_VIDEO 1715 /* Video: */
/* DLG_CFG_INPUT */ /* DLG_CFG_INPUT */
#define IDT_MOUSE 1716 /* Mouse: */ #define IDT_MOUSE 1716 /* Mouse: */
#define IDT_JOYSTICK 1717 /* Joystick: */ #define IDT_JOYSTICK 1717 /* Joystick: */
/* DLG_CFG_SOUND */ /* DLG_CFG_SOUND */
#define IDT_SOUND 1718 /* Sound card: */ #define IDT_SOUND 1718 /* Sound card: */
#define IDT_MIDI_OUT 1719 /* MIDI Out Device: */ #define IDT_MIDI_OUT 1719 /* MIDI Out Device: */
#define IDT_MIDI_IN 1720 /* MIDI In Device: */ #define IDT_MIDI_IN 1720 /* MIDI In Device: */
/* DLG_CFG_NETWORK */ /* DLG_CFG_NETWORK */
#define IDT_NET_TYPE 1721 /* Network type: */ #define IDT_NET_TYPE 1721 /* Network type: */
#define IDT_PCAP 1722 /* PCap device: */ #define IDT_PCAP 1722 /* PCap device: */
#define IDT_NET 1723 /* Network adapter: */ #define IDT_NET 1723 /* Network adapter: */
/* DLG_CFG_PORTS */ /* DLG_CFG_PORTS */
#define IDT_COM1 1724 /* COM1 Device: */ #define IDT_COM1 1724 /* COM1 Device: */
#define IDT_COM2 1725 /* COM1 Device: */ #define IDT_COM2 1725 /* COM1 Device: */
#define IDT_COM3 1726 /* COM1 Device: */ #define IDT_COM3 1726 /* COM1 Device: */
#define IDT_COM4 1727 /* COM1 Device: */ #define IDT_COM4 1727 /* COM1 Device: */
#define IDT_LPT1 1728 /* LPT1 Device: */ #define IDT_LPT1 1728 /* LPT1 Device: */
#define IDT_LPT2 1729 /* LPT2 Device: */ #define IDT_LPT2 1729 /* LPT2 Device: */
#define IDT_LPT3 1730 /* LPT3 Device: */ #define IDT_LPT3 1730 /* LPT3 Device: */
#define IDT_LPT4 1731 /* LPT4 Device: */ #define IDT_LPT4 1731 /* LPT4 Device: */
/* DLG_CFG_STORAGE */ /* DLG_CFG_STORAGE */
#define IDT_HDC 1732 /* HD Controller: */ #define IDT_HDC 1732 /* HD Controller: */
#define IDT_FDC 1733 /* Ext FD Controller: */ #define IDT_FDC 1733 /* Ext FD Controller: */
#define IDT_SCSI_1 1734 /* SCSI Board #1: */ #define IDT_SCSI_1 1734 /* SCSI Board #1: */
#define IDT_SCSI_2 1735 /* SCSI Board #2: */ #define IDT_SCSI_2 1735 /* SCSI Board #2: */
#define IDT_SCSI_3 1736 /* SCSI Board #3: */ #define IDT_SCSI_3 1736 /* SCSI Board #3: */
#define IDT_SCSI_4 1737 /* SCSI Board #4: */ #define IDT_SCSI_4 1737 /* SCSI Board #4: */
/* DLG_CFG_HARD_DISKS */ /* DLG_CFG_HARD_DISKS */
#define IDT_HDD 1738 /* Hard disks: */ #define IDT_HDD 1738 /* Hard disks: */
#define IDT_BUS 1739 /* Bus: */ #define IDT_BUS 1739 /* Bus: */
#define IDT_CHANNEL 1740 /* Channel: */ #define IDT_CHANNEL 1740 /* Channel: */
#define IDT_ID 1741 /* ID: */ #define IDT_ID 1741 /* ID: */
#define IDT_LUN 1742 /* LUN: */ #define IDT_LUN 1742 /* LUN: */
/* DLG_CFG_HARD_DISKS_ADD */ /* DLG_CFG_HARD_DISKS_ADD */
#define IDT_SECTORS 1743 /* Sectors: */ #define IDT_SECTORS 1743 /* Sectors: */
#define IDT_HEADS 1744 /* Heads: */ #define IDT_HEADS 1744 /* Heads: */
#define IDT_CYLS 1745 /* Cylinders: */ #define IDT_CYLS 1745 /* Cylinders: */
#define IDT_SIZE_MB 1746 /* Size (MB): */ #define IDT_SIZE_MB 1746 /* Size (MB): */
#define IDT_TYPE 1747 /* Type: */ #define IDT_TYPE 1747 /* Type: */
#define IDT_FILE_NAME 1748 /* File name: */ #define IDT_FILE_NAME 1748 /* File name: */
#define IDT_IMG_FORMAT 1749 /* Image Format: */ #define IDT_IMG_FORMAT 1749 /* Image Format: */
#define IDT_BLOCK_SIZE 1750 /* Block Size: */ #define IDT_BLOCK_SIZE 1750 /* Block Size: */
#define IDT_PROGRESS 1751 /* Progress: */ #define IDT_PROGRESS 1751 /* Progress: */
/* DLG_CFG_FLOPPY_AND_CDROM_DRIVES */ /* DLG_CFG_FLOPPY_AND_CDROM_DRIVES */
#define IDT_FLOPPY_DRIVES 1752 /* Floppy drives: */ #define IDT_FLOPPY_DRIVES 1752 /* Floppy drives: */
#define IDT_FDD_TYPE 1753 /* Type: */ #define IDT_FDD_TYPE 1753 /* Type: */
#define IDT_CD_DRIVES 1754 /* CD-ROM drives: */ #define IDT_CD_DRIVES 1754 /* CD-ROM drives: */
#define IDT_CD_BUS 1755 /* Bus: */ #define IDT_CD_BUS 1755 /* Bus: */
#define IDT_CD_ID 1756 /* ID: */ #define IDT_CD_ID 1756 /* ID: */
#define IDT_CD_LUN 1757 /* LUN: */ #define IDT_CD_LUN 1757 /* LUN: */
#define IDT_CD_CHANNEL 1758 /* Channel: */ #define IDT_CD_CHANNEL 1758 /* Channel: */
#define IDT_CD_SPEED 1759 /* Speed: */ #define IDT_CD_SPEED 1759 /* Speed: */
/* DLG_CFG_OTHER_REMOVABLE_DEVICES */ /* DLG_CFG_OTHER_REMOVABLE_DEVICES */
#define IDT_MO_DRIVES 1760 /* MO drives: */ #define IDT_MO_DRIVES 1760 /* MO drives: */
#define IDT_MO_BUS 1761 /* Bus: */ #define IDT_MO_BUS 1761 /* Bus: */
#define IDT_MO_ID 1762 /* ID: */ #define IDT_MO_ID 1762 /* ID: */
#define IDT_MO_CHANNEL 1763 /* Channel */ #define IDT_MO_CHANNEL 1763 /* Channel */
#define IDT_MO_TYPE 1764 /* Type: */ #define IDT_MO_TYPE 1764 /* Type: */
#define IDT_ZIP_DRIVES 1765 /* ZIP drives: */ #define IDT_ZIP_DRIVES 1765 /* ZIP drives: */
#define IDT_ZIP_BUS 1766 /* Bus: */ #define IDT_ZIP_BUS 1766 /* Bus: */
#define IDT_ZIP_ID 1767 /* ID: */ #define IDT_ZIP_ID 1767 /* ID: */
#define IDT_ZIP_LUN 1768 /* LUN: */ #define IDT_ZIP_LUN 1768 /* LUN: */
#define IDT_ZIP_CHANNEL 1769 /* Channel: */ #define IDT_ZIP_CHANNEL 1769 /* Channel: */
/* DLG_CFG_PERIPHERALS */ /* DLG_CFG_PERIPHERALS */
#define IDT_ISARTC 1770 /* ISA RTC: */ #define IDT_ISARTC 1770 /* ISA RTC: */
#define IDT_ISAMEM_1 1771 /* ISAMEM Board #1: */ #define IDT_ISAMEM_1 1771 /* ISAMEM Board #1: */
#define IDT_ISAMEM_2 1772 /* ISAMEM Board #2: */ #define IDT_ISAMEM_2 1772 /* ISAMEM Board #2: */
#define IDT_ISAMEM_3 1773 /* ISAMEM Board #3: */ #define IDT_ISAMEM_3 1773 /* ISAMEM Board #3: */
#define IDT_ISAMEM_4 1774 /* ISAMEM Board #4: */ #define IDT_ISAMEM_4 1774 /* ISAMEM Board #4: */
/* /*
* To try to keep these organized, we now group the * To try to keep these organized, we now group the
* constants per dialog, as this allows easy adding * constants per dialog, as this allows easy adding
* and deleting items. * and deleting items.
*/ */
#define IDC_SETTINGSCATLIST 1001 /* generic config */ #define IDC_SETTINGSCATLIST 1001 /* generic config */
#define IDC_CFILE 1002 /* Select File dialog */ #define IDC_CFILE 1002 /* Select File dialog */
#define IDC_TIME_SYNC 1005 #define IDC_TIME_SYNC 1005
#define IDC_RADIO_TS_DISABLED 1006 #define IDC_RADIO_TS_DISABLED 1006
#define IDC_RADIO_TS_LOCAL 1007 #define IDC_RADIO_TS_LOCAL 1007
#define IDC_RADIO_TS_UTC 1008 #define IDC_RADIO_TS_UTC 1008
#define IDC_COMBO_MACHINE_TYPE 1010 #define IDC_COMBO_MACHINE_TYPE 1010
#define IDC_COMBO_MACHINE 1011 /* machine/cpu config */ #define IDC_COMBO_MACHINE 1011 /* machine/cpu config */
#define IDC_CONFIGURE_MACHINE 1012 #define IDC_CONFIGURE_MACHINE 1012
#define IDC_COMBO_CPU_TYPE 1013 #define IDC_COMBO_CPU_TYPE 1013
#define IDC_COMBO_CPU_SPEED 1014 #define IDC_COMBO_CPU_SPEED 1014
#define IDC_COMBO_FPU 1015 #define IDC_COMBO_FPU 1015
#define IDC_COMBO_WS 1016 #define IDC_COMBO_WS 1016
#ifdef USE_DYNAREC #ifdef USE_DYNAREC
#define IDC_CHECK_DYNAREC 1017 # define IDC_CHECK_DYNAREC 1017
#endif #endif
#define IDC_MEMTEXT 1018 #define IDC_MEMTEXT 1018
#define IDC_MEMSPIN 1019 #define IDC_MEMSPIN 1019
#define IDC_TEXT_MB IDT_MB #define IDC_TEXT_MB IDT_MB
#define IDC_VIDEO 1020 /* video config */ #define IDC_VIDEO 1020 /* video config */
#define IDC_COMBO_VIDEO 1021 #define IDC_COMBO_VIDEO 1021
#define IDC_CHECK_VOODOO 1022 #define IDC_CHECK_VOODOO 1022
#define IDC_BUTTON_VOODOO 1023 #define IDC_BUTTON_VOODOO 1023
#define IDC_CHECK_IBM8514 1024 #define IDC_CHECK_IBM8514 1024
#define IDC_CHECK_XGA 1025 #define IDC_CHECK_XGA 1025
#define IDC_BUTTON_XGA 1026 #define IDC_BUTTON_XGA 1026
#define IDC_INPUT 1030 /* input config */ #define IDC_INPUT 1030 /* input config */
#define IDC_COMBO_MOUSE 1031 #define IDC_COMBO_MOUSE 1031
#define IDC_COMBO_JOYSTICK 1032 #define IDC_COMBO_JOYSTICK 1032
#define IDC_COMBO_JOY 1033 #define IDC_COMBO_JOY 1033
#define IDC_CONFIGURE_MOUSE 1034 #define IDC_CONFIGURE_MOUSE 1034
#define IDC_SOUND 1040 /* sound config */ #define IDC_SOUND 1040 /* sound config */
#define IDC_COMBO_SOUND 1041 #define IDC_COMBO_SOUND 1041
#define IDC_CHECK_SSI 1042 #define IDC_CHECK_SSI 1042
#define IDC_CHECK_CMS 1043 #define IDC_CHECK_CMS 1043
#define IDC_CHECK_GUS 1044 #define IDC_CHECK_GUS 1044
#define IDC_COMBO_MIDI_OUT 1045 #define IDC_COMBO_MIDI_OUT 1045
#define IDC_CHECK_MPU401 1046 #define IDC_CHECK_MPU401 1046
#define IDC_CONFIGURE_MPU401 1047 #define IDC_CONFIGURE_MPU401 1047
#define IDC_CHECK_FLOAT 1048 #define IDC_CHECK_FLOAT 1048
#define IDC_CONFIGURE_GUS 1049 #define IDC_CONFIGURE_GUS 1049
#define IDC_COMBO_MIDI_IN 1050 #define IDC_COMBO_MIDI_IN 1050
#define IDC_CONFIGURE_CMS 1051 #define IDC_CONFIGURE_CMS 1051
#define IDC_CONFIGURE_SSI 1052 #define IDC_CONFIGURE_SSI 1052
#define IDC_COMBO_NET_TYPE 1060 /* network config */ #define IDC_COMBO_NET_TYPE 1060 /* network config */
#define IDC_COMBO_PCAP 1061 #define IDC_COMBO_PCAP 1061
#define IDC_COMBO_NET 1062 #define IDC_COMBO_NET 1062
#define IDC_COMBO_LPT1 1070 /* ports config */ #define IDC_COMBO_LPT1 1070 /* ports config */
#define IDC_COMBO_LPT2 1071 #define IDC_COMBO_LPT2 1071
#define IDC_COMBO_LPT3 1072 #define IDC_COMBO_LPT3 1072
#define IDC_COMBO_LPT4 1073 #define IDC_COMBO_LPT4 1073
#define IDC_CHECK_SERIAL1 1074 #define IDC_CHECK_SERIAL1 1074
#define IDC_CHECK_SERIAL2 1075 #define IDC_CHECK_SERIAL2 1075
#define IDC_CHECK_SERIAL3 1076 #define IDC_CHECK_SERIAL3 1076
#define IDC_CHECK_SERIAL4 1077 #define IDC_CHECK_SERIAL4 1077
#define IDC_CHECK_PARALLEL1 1078 #define IDC_CHECK_PARALLEL1 1078
#define IDC_CHECK_PARALLEL2 1079 #define IDC_CHECK_PARALLEL2 1079
#define IDC_CHECK_PARALLEL3 1080 #define IDC_CHECK_PARALLEL3 1080
#define IDC_CHECK_PARALLEL4 1081 #define IDC_CHECK_PARALLEL4 1081
#define IDC_OTHER_PERIPH 1082 /* storage controllers config */ #define IDC_OTHER_PERIPH 1082 /* storage controllers config */
#define IDC_COMBO_HDC 1083 #define IDC_COMBO_HDC 1083
#define IDC_CONFIGURE_HDC 1084 #define IDC_CONFIGURE_HDC 1084
#define IDC_CHECK_IDE_TER 1085 #define IDC_CHECK_IDE_TER 1085
#define IDC_BUTTON_IDE_TER 1086 #define IDC_BUTTON_IDE_TER 1086
#define IDC_CHECK_IDE_QUA 1087 #define IDC_CHECK_IDE_QUA 1087
#define IDC_BUTTON_IDE_QUA 1088 #define IDC_BUTTON_IDE_QUA 1088
#define IDC_GROUP_SCSI 1089 #define IDC_GROUP_SCSI 1089
#define IDC_COMBO_SCSI_1 1090 #define IDC_COMBO_SCSI_1 1090
#define IDC_COMBO_SCSI_2 1091 #define IDC_COMBO_SCSI_2 1091
#define IDC_COMBO_SCSI_3 1092 #define IDC_COMBO_SCSI_3 1092
#define IDC_COMBO_SCSI_4 1093 #define IDC_COMBO_SCSI_4 1093
#define IDC_CONFIGURE_SCSI_1 1094 #define IDC_CONFIGURE_SCSI_1 1094
#define IDC_CONFIGURE_SCSI_2 1095 #define IDC_CONFIGURE_SCSI_2 1095
#define IDC_CONFIGURE_SCSI_3 1096 #define IDC_CONFIGURE_SCSI_3 1096
#define IDC_CONFIGURE_SCSI_4 1097 #define IDC_CONFIGURE_SCSI_4 1097
#define IDC_CHECK_CASSETTE 1098 #define IDC_CHECK_CASSETTE 1098
#define IDC_HARD_DISKS 1100 /* hard disks config */ #define IDC_HARD_DISKS 1100 /* hard disks config */
#define IDC_LIST_HARD_DISKS 1101 #define IDC_LIST_HARD_DISKS 1101
#define IDC_BUTTON_HDD_ADD_NEW 1102 #define IDC_BUTTON_HDD_ADD_NEW 1102
#define IDC_BUTTON_HDD_ADD 1103 #define IDC_BUTTON_HDD_ADD 1103
#define IDC_BUTTON_HDD_REMOVE 1104 #define IDC_BUTTON_HDD_REMOVE 1104
#define IDC_COMBO_HD_BUS 1105 #define IDC_COMBO_HD_BUS 1105
#define IDC_COMBO_HD_CHANNEL 1106 #define IDC_COMBO_HD_CHANNEL 1106
#define IDC_COMBO_HD_ID 1107 #define IDC_COMBO_HD_ID 1107
#define IDC_COMBO_HD_LUN 1108 #define IDC_COMBO_HD_LUN 1108
#define IDC_COMBO_HD_CHANNEL_IDE 1109 #define IDC_COMBO_HD_CHANNEL_IDE 1109
#define IDC_EDIT_HD_FILE_NAME 1110 /* add hard disk dialog */ #define IDC_EDIT_HD_FILE_NAME 1110 /* add hard disk dialog */
#define IDC_EDIT_HD_SPT 1111 #define IDC_EDIT_HD_SPT 1111
#define IDC_EDIT_HD_HPC 1112 #define IDC_EDIT_HD_HPC 1112
#define IDC_EDIT_HD_CYL 1113 #define IDC_EDIT_HD_CYL 1113
#define IDC_EDIT_HD_SIZE 1114 #define IDC_EDIT_HD_SIZE 1114
#define IDC_COMBO_HD_TYPE 1115 #define IDC_COMBO_HD_TYPE 1115
#define IDC_PBAR_IMG_CREATE 1116 #define IDC_PBAR_IMG_CREATE 1116
#define IDC_COMBO_HD_IMG_FORMAT 1117 #define IDC_COMBO_HD_IMG_FORMAT 1117
#define IDC_COMBO_HD_BLOCK_SIZE 1118 #define IDC_COMBO_HD_BLOCK_SIZE 1118
#define IDC_REMOV_DEVICES 1120 /* floppy and cd-rom drives config */ #define IDC_REMOV_DEVICES 1120 /* floppy and cd-rom drives config */
#define IDC_LIST_FLOPPY_DRIVES 1121 #define IDC_LIST_FLOPPY_DRIVES 1121
#define IDC_COMBO_FD_TYPE 1122 #define IDC_COMBO_FD_TYPE 1122
#define IDC_CHECKTURBO 1123 #define IDC_CHECKTURBO 1123
#define IDC_CHECKBPB 1124 #define IDC_CHECKBPB 1124
#define IDC_LIST_CDROM_DRIVES 1125 #define IDC_LIST_CDROM_DRIVES 1125
#define IDC_COMBO_CD_BUS 1126 #define IDC_COMBO_CD_BUS 1126
#define IDC_COMBO_CD_ID 1127 #define IDC_COMBO_CD_ID 1127
#define IDC_COMBO_CD_LUN 1128 #define IDC_COMBO_CD_LUN 1128
#define IDC_COMBO_CD_CHANNEL_IDE 1129 #define IDC_COMBO_CD_CHANNEL_IDE 1129
#define IDC_LIST_ZIP_DRIVES 1130 /* other removable devices config */ #define IDC_LIST_ZIP_DRIVES 1130 /* other removable devices config */
#define IDC_COMBO_ZIP_BUS 1131 #define IDC_COMBO_ZIP_BUS 1131
#define IDC_COMBO_ZIP_ID 1132 #define IDC_COMBO_ZIP_ID 1132
#define IDC_COMBO_ZIP_LUN 1133 #define IDC_COMBO_ZIP_LUN 1133
#define IDC_COMBO_ZIP_CHANNEL_IDE 1134 #define IDC_COMBO_ZIP_CHANNEL_IDE 1134
#define IDC_CHECK250 1135 #define IDC_CHECK250 1135
#define IDC_COMBO_CD_SPEED 1136 #define IDC_COMBO_CD_SPEED 1136
#define IDC_LIST_MO_DRIVES 1137 #define IDC_LIST_MO_DRIVES 1137
#define IDC_COMBO_MO_BUS 1138 #define IDC_COMBO_MO_BUS 1138
#define IDC_COMBO_MO_ID 1139 #define IDC_COMBO_MO_ID 1139
#define IDC_COMBO_MO_LUN 1140 #define IDC_COMBO_MO_LUN 1140
#define IDC_COMBO_MO_CHANNEL_IDE 1141 #define IDC_COMBO_MO_CHANNEL_IDE 1141
#define IDC_COMBO_MO_TYPE 1142 #define IDC_COMBO_MO_TYPE 1142
#define IDC_CHECK_BUGGER 1150 /* other periph config */ #define IDC_CHECK_BUGGER 1150 /* other periph config */
#define IDC_CHECK_POSTCARD 1151 #define IDC_CHECK_POSTCARD 1151
#define IDC_COMBO_ISARTC 1152 #define IDC_COMBO_ISARTC 1152
#define IDC_CONFIGURE_ISARTC 1153 #define IDC_CONFIGURE_ISARTC 1153
#define IDC_COMBO_FDC 1154 #define IDC_COMBO_FDC 1154
#define IDC_CONFIGURE_FDC 1155 #define IDC_CONFIGURE_FDC 1155
#define IDC_GROUP_ISAMEM 1156 #define IDC_GROUP_ISAMEM 1156
#define IDC_COMBO_ISAMEM_1 1157 #define IDC_COMBO_ISAMEM_1 1157
#define IDC_COMBO_ISAMEM_2 1158 #define IDC_COMBO_ISAMEM_2 1158
#define IDC_COMBO_ISAMEM_3 1159 #define IDC_COMBO_ISAMEM_3 1159
#define IDC_COMBO_ISAMEM_4 1160 #define IDC_COMBO_ISAMEM_4 1160
#define IDC_CONFIGURE_ISAMEM_1 1161 #define IDC_CONFIGURE_ISAMEM_1 1161
#define IDC_CONFIGURE_ISAMEM_2 1162 #define IDC_CONFIGURE_ISAMEM_2 1162
#define IDC_CONFIGURE_ISAMEM_3 1163 #define IDC_CONFIGURE_ISAMEM_3 1163
#define IDC_CONFIGURE_ISAMEM_4 1164 #define IDC_CONFIGURE_ISAMEM_4 1164
#define IDC_SLIDER_GAIN 1170 /* sound gain dialog */ #define IDC_SLIDER_GAIN 1170 /* sound gain dialog */
#define IDC_EDIT_FILE_NAME 1200 /* new floppy image dialog */ #define IDC_EDIT_FILE_NAME 1200 /* new floppy image dialog */
#define IDC_COMBO_DISK_SIZE 1201 #define IDC_COMBO_DISK_SIZE 1201
#define IDC_COMBO_RPM_MODE 1202 #define IDC_COMBO_RPM_MODE 1202
#define IDC_COMBO_LANG 1009 /* change language dialog */ #define IDC_COMBO_LANG 1009 /* change language dialog */
#define IDC_COMBO_ICON 1010 #define IDC_COMBO_ICON 1010
#define IDC_CHECKBOX_GLOBAL 1300 #define IDC_CHECKBOX_GLOBAL 1300
#define IDC_BUTTON_DEFAULT 1302 #define IDC_BUTTON_DEFAULT 1302
#define IDC_BUTTON_DEFICON 1304 #define IDC_BUTTON_DEFICON 1304
/* For the DeviceConfig code, re-do later. */ /* For the DeviceConfig code, re-do later. */
#define IDC_CONFIG_BASE 1300 #define IDC_CONFIG_BASE 1300
#define IDC_CONFIGURE_VID 1300 #define IDC_CONFIGURE_VID 1300
#define IDC_CONFIGURE_SND 1301 #define IDC_CONFIGURE_SND 1301
#define IDC_CONFIGURE_VOODOO 1302 #define IDC_CONFIGURE_VOODOO 1302
#define IDC_CONFIGURE_MOD 1303 #define IDC_CONFIGURE_MOD 1303
#define IDC_CONFIGURE_NET_TYPE 1304 #define IDC_CONFIGURE_NET_TYPE 1304
#define IDC_CONFIGURE_BUSLOGIC 1305 #define IDC_CONFIGURE_BUSLOGIC 1305
#define IDC_CONFIGURE_PCAP 1306 #define IDC_CONFIGURE_PCAP 1306
#define IDC_CONFIGURE_NET 1307 #define IDC_CONFIGURE_NET 1307
#define IDC_CONFIGURE_MIDI_OUT 1308 #define IDC_CONFIGURE_MIDI_OUT 1308
#define IDC_CONFIGURE_MIDI_IN 1309 #define IDC_CONFIGURE_MIDI_IN 1309
#define IDC_JOY1 1310 #define IDC_JOY1 1310
#define IDC_JOY2 1311 #define IDC_JOY2 1311
#define IDC_JOY3 1312 #define IDC_JOY3 1312
#define IDC_JOY4 1313 #define IDC_JOY4 1313
#define IDC_HDTYPE 1380 #define IDC_HDTYPE 1380
#define IDC_RENDER 1381 #define IDC_RENDER 1381
#define IDC_STATUS 1382 #define IDC_STATUS 1382
#define IDC_EDIT_WIDTH 1400 /* specify main window dimensions dialog */ #define IDC_EDIT_WIDTH 1400 /* specify main window dimensions dialog */
#define IDC_WIDTHSPIN 1401 #define IDC_WIDTHSPIN 1401
#define IDC_EDIT_HEIGHT 1402 #define IDC_EDIT_HEIGHT 1402
#define IDC_HEIGHTSPIN 1403 #define IDC_HEIGHTSPIN 1403
#define IDC_CHECK_LOCK_SIZE 1404 #define IDC_CHECK_LOCK_SIZE 1404
#define IDM_ABOUT 40001 #define IDM_ABOUT 40001
#define IDC_ABOUT_ICON 65535 #define IDC_ABOUT_ICON 65535
#define IDM_ACTION_KBD_REQ_CAPTURE 40010 #define IDM_ACTION_KBD_REQ_CAPTURE 40010
#define IDM_ACTION_RCTRL_IS_LALT 40011 #define IDM_ACTION_RCTRL_IS_LALT 40011
#define IDM_ACTION_SCREENSHOT 40012 #define IDM_ACTION_SCREENSHOT 40012
#define IDM_ACTION_HRESET 40013 #define IDM_ACTION_HRESET 40013
#define IDM_ACTION_RESET_CAD 40014 #define IDM_ACTION_RESET_CAD 40014
#define IDM_ACTION_EXIT 40015 #define IDM_ACTION_EXIT 40015
#define IDM_ACTION_CTRL_ALT_ESC 40016 #define IDM_ACTION_CTRL_ALT_ESC 40016
#define IDM_ACTION_PAUSE 40017 #define IDM_ACTION_PAUSE 40017
#ifdef MTR_ENABLED #ifdef MTR_ENABLED
#define IDM_ACTION_BEGIN_TRACE 40018 # define IDM_ACTION_BEGIN_TRACE 40018
#define IDM_ACTION_END_TRACE 40019 # define IDM_ACTION_END_TRACE 40019
#define IDM_ACTION_TRACE 40020 # define IDM_ACTION_TRACE 40020
#endif #endif
#define IDM_CONFIG 40020 #define IDM_CONFIG 40020
#define IDM_VID_HIDE_STATUS_BAR 40021 #define IDM_VID_HIDE_STATUS_BAR 40021
#define IDM_VID_HIDE_TOOLBAR 40022 #define IDM_VID_HIDE_TOOLBAR 40022
#define IDM_UPDATE_ICONS 40030 #define IDM_UPDATE_ICONS 40030
#define IDM_SND_GAIN 40031 #define IDM_SND_GAIN 40031
#define IDM_VID_RESIZE 40040 #define IDM_VID_RESIZE 40040
#define IDM_VID_REMEMBER 40041 #define IDM_VID_REMEMBER 40041
#define IDM_VID_SDL_SW 40050 #define IDM_VID_SDL_SW 40050
#define IDM_VID_SDL_HW 40051 #define IDM_VID_SDL_HW 40051
#define IDM_VID_SDL_OPENGL 40052 #define IDM_VID_SDL_OPENGL 40052
#define IDM_VID_OPENGL_CORE 40053 #define IDM_VID_OPENGL_CORE 40053
#ifdef USE_VNC #ifdef USE_VNC
#define IDM_VID_VNC 40054 # define IDM_VID_VNC 40054
#endif #endif
#define IDM_VID_SCALE_1X 40055 #define IDM_VID_SCALE_1X 40055
#define IDM_VID_SCALE_2X 40056 #define IDM_VID_SCALE_2X 40056
#define IDM_VID_SCALE_3X 40057 #define IDM_VID_SCALE_3X 40057
#define IDM_VID_SCALE_4X 40058 #define IDM_VID_SCALE_4X 40058
#define IDM_VID_HIDPI 40059 #define IDM_VID_HIDPI 40059
#define IDM_VID_FULLSCREEN 40060 #define IDM_VID_FULLSCREEN 40060
#define IDM_VID_FS_FULL 40061 #define IDM_VID_FS_FULL 40061
#define IDM_VID_FS_43 40062 #define IDM_VID_FS_43 40062
#define IDM_VID_FS_KEEPRATIO 40063 #define IDM_VID_FS_KEEPRATIO 40063
#define IDM_VID_FS_INT 40064 #define IDM_VID_FS_INT 40064
#define IDM_VID_SPECIFY_DIM 40065 #define IDM_VID_SPECIFY_DIM 40065
#define IDM_VID_FORCE43 40066 #define IDM_VID_FORCE43 40066
#define IDM_VID_OVERSCAN 40067 #define IDM_VID_OVERSCAN 40067
#define IDM_VID_INVERT 40069 #define IDM_VID_INVERT 40069
#define IDM_VID_CGACON 40070 #define IDM_VID_CGACON 40070
#define IDM_VID_GRAYCT_601 40075 #define IDM_VID_GRAYCT_601 40075
#define IDM_VID_GRAYCT_709 40076 #define IDM_VID_GRAYCT_709 40076
#define IDM_VID_GRAYCT_AVE 40077 #define IDM_VID_GRAYCT_AVE 40077
#define IDM_VID_GRAY_RGB 40080 #define IDM_VID_GRAY_RGB 40080
#define IDM_VID_GRAY_MONO 40081 #define IDM_VID_GRAY_MONO 40081
#define IDM_VID_GRAY_AMBER 40082 #define IDM_VID_GRAY_AMBER 40082
#define IDM_VID_GRAY_GREEN 40083 #define IDM_VID_GRAY_GREEN 40083
#define IDM_VID_GRAY_WHITE 40084 #define IDM_VID_GRAY_WHITE 40084
#define IDM_VID_FILTER_NEAREST 40085 #define IDM_VID_FILTER_NEAREST 40085
#define IDM_VID_FILTER_LINEAR 40086 #define IDM_VID_FILTER_LINEAR 40086
#define IDM_MEDIA 40087 #define IDM_MEDIA 40087
#define IDM_DOCS 40088 #define IDM_DOCS 40088
#define IDM_DISCORD 40090 #define IDM_DISCORD 40090
#define IDM_PREFERENCES 40091 #define IDM_PREFERENCES 40091
#define IDM_VID_GL_FPS_BLITTER 40100 #define IDM_VID_GL_FPS_BLITTER 40100
#define IDM_VID_GL_FPS_25 40101 #define IDM_VID_GL_FPS_25 40101
#define IDM_VID_GL_FPS_30 40102 #define IDM_VID_GL_FPS_30 40102
#define IDM_VID_GL_FPS_50 40103 #define IDM_VID_GL_FPS_50 40103
#define IDM_VID_GL_FPS_60 40104 #define IDM_VID_GL_FPS_60 40104
#define IDM_VID_GL_FPS_75 40105 #define IDM_VID_GL_FPS_75 40105
#define IDM_VID_GL_VSYNC 40106 #define IDM_VID_GL_VSYNC 40106
#define IDM_VID_GL_SHADER 40107 #define IDM_VID_GL_SHADER 40107
#define IDM_VID_GL_NOSHADER 40108 #define IDM_VID_GL_NOSHADER 40108
/* /*
* We need 7 bits for CDROM (2 bits ID and 5 bits for host drive), * We need 7 bits for CDROM (2 bits ID and 5 bits for host drive),
* and 5 bits for Removable Disks (5 bits for ID), so we use an * and 5 bits for Removable Disks (5 bits for ID), so we use an
* 8bit (256 entries) space for these devices. * 8bit (256 entries) space for these devices.
*/ */
#define IDM_CASSETTE_IMAGE_NEW 0x1200 #define IDM_CASSETTE_IMAGE_NEW 0x1200
#define IDM_CASSETTE_IMAGE_EXISTING 0x1300 #define IDM_CASSETTE_IMAGE_EXISTING 0x1300
#define IDM_CASSETTE_IMAGE_EXISTING_WP 0x1400 #define IDM_CASSETTE_IMAGE_EXISTING_WP 0x1400
#define IDM_CASSETTE_RECORD 0x1500 #define IDM_CASSETTE_RECORD 0x1500
#define IDM_CASSETTE_PLAY 0x1600 #define IDM_CASSETTE_PLAY 0x1600
#define IDM_CASSETTE_REWIND 0x1700 #define IDM_CASSETTE_REWIND 0x1700
#define IDM_CASSETTE_FAST_FORWARD 0x1800 #define IDM_CASSETTE_FAST_FORWARD 0x1800
#define IDM_CASSETTE_EJECT 0x1900 #define IDM_CASSETTE_EJECT 0x1900
#define IDM_CARTRIDGE_IMAGE 0x2200 #define IDM_CARTRIDGE_IMAGE 0x2200
#define IDM_CARTRIDGE_EJECT 0x2300 #define IDM_CARTRIDGE_EJECT 0x2300
#define IDM_FLOPPY_IMAGE_NEW 0x3200 #define IDM_FLOPPY_IMAGE_NEW 0x3200
#define IDM_FLOPPY_IMAGE_EXISTING 0x3300 #define IDM_FLOPPY_IMAGE_EXISTING 0x3300
#define IDM_FLOPPY_IMAGE_EXISTING_WP 0x3400 #define IDM_FLOPPY_IMAGE_EXISTING_WP 0x3400
#define IDM_FLOPPY_EXPORT_TO_86F 0x3500 #define IDM_FLOPPY_EXPORT_TO_86F 0x3500
#define IDM_FLOPPY_EJECT 0x3600 #define IDM_FLOPPY_EJECT 0x3600
#define IDM_CDROM_MUTE 0x4200 #define IDM_CDROM_MUTE 0x4200
#define IDM_CDROM_EMPTY 0x4300 #define IDM_CDROM_EMPTY 0x4300
#define IDM_CDROM_RELOAD 0x4400 #define IDM_CDROM_RELOAD 0x4400
#define IDM_CDROM_IMAGE 0x4500 #define IDM_CDROM_IMAGE 0x4500
#define IDM_CDROM_DIR 0x4600 #define IDM_CDROM_DIR 0x4600
#define IDM_CDROM_HOST_DRIVE 0x4700 #define IDM_CDROM_HOST_DRIVE 0x4700
#define IDM_ZIP_IMAGE_NEW 0x5200 #define IDM_ZIP_IMAGE_NEW 0x5200
#define IDM_ZIP_IMAGE_EXISTING 0x5300 #define IDM_ZIP_IMAGE_EXISTING 0x5300
#define IDM_ZIP_IMAGE_EXISTING_WP 0x5400 #define IDM_ZIP_IMAGE_EXISTING_WP 0x5400
#define IDM_ZIP_EJECT 0x5500 #define IDM_ZIP_EJECT 0x5500
#define IDM_ZIP_RELOAD 0x5600 #define IDM_ZIP_RELOAD 0x5600
#define IDM_MO_IMAGE_NEW 0x6200
#define IDM_MO_IMAGE_EXISTING 0x6300
#define IDM_MO_IMAGE_EXISTING_WP 0x6400
#define IDM_MO_EJECT 0x6500
#define IDM_MO_RELOAD 0x6600
#define IDM_MO_IMAGE_NEW 0x6200
#define IDM_MO_IMAGE_EXISTING 0x6300
#define IDM_MO_IMAGE_EXISTING_WP 0x6400
#define IDM_MO_EJECT 0x6500
#define IDM_MO_RELOAD 0x6600
/* Next default values for new objects */ /* Next default values for new objects */
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
# ifndef APSTUDIO_READONLY_SYMBOLS # ifndef APSTUDIO_READONLY_SYMBOLS
# define _APS_NO_MFC 1 # define _APS_NO_MFC 1
# define _APS_NEXT_RESOURCE_VALUE 1400 # define _APS_NEXT_RESOURCE_VALUE 1400
# define _APS_NEXT_COMMAND_VALUE 55000 # define _APS_NEXT_COMMAND_VALUE 55000
# define _APS_NEXT_CONTROL_VALUE 1800 # define _APS_NEXT_CONTROL_VALUE 1800
# define _APS_NEXT_SYMED_VALUE 200 # define _APS_NEXT_SYMED_VALUE 200
# endif # endif
#endif #endif
#endif /*WIN_RESOURCE_H*/
#endif /*WIN_RESOURCE_H*/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -32,15 +32,14 @@
#include <86box/win.h> #include <86box/win.h>
#include <86box/version.h> #include <86box/version.h>
void void
AboutDialogCreate(HWND hwnd) AboutDialogCreate(HWND hwnd)
{ {
int i; int i;
TASKDIALOGCONFIG tdconfig = {0}; TASKDIALOGCONFIG tdconfig = { 0 };
TASKDIALOG_BUTTON tdbuttons[] = { TASKDIALOG_BUTTON tdbuttons[] = {
{IDOK, EMU_SITE_W}, {IDOK, EMU_SITE_W },
{IDCANCEL, MAKEINTRESOURCE(IDS_2127)} { IDCANCEL, MAKEINTRESOURCE(IDS_2127)}
}; };
wchar_t emu_version[256]; wchar_t emu_version[256];
@@ -49,19 +48,19 @@ AboutDialogCreate(HWND hwnd)
swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W); swprintf(&emu_version[i], sizeof(emu_version) - i, L" [%ls]", EMU_GIT_HASH_W);
#endif #endif
tdconfig.cbSize = sizeof(tdconfig); tdconfig.cbSize = sizeof(tdconfig);
tdconfig.hwndParent = hwnd; tdconfig.hwndParent = hwnd;
tdconfig.hInstance = hinstance; tdconfig.hInstance = hinstance;
tdconfig.dwCommonButtons = 0; tdconfig.dwCommonButtons = 0;
tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124); tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_2124);
tdconfig.pszMainIcon = (PCWSTR) 10; tdconfig.pszMainIcon = (PCWSTR) 10;
tdconfig.pszMainInstruction = emu_version; tdconfig.pszMainInstruction = emu_version;
tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126); tdconfig.pszContent = MAKEINTRESOURCE(IDS_2126);
tdconfig.cButtons = ARRAYSIZE(tdbuttons); tdconfig.cButtons = ARRAYSIZE(tdbuttons);
tdconfig.pButtons = tdbuttons; tdconfig.pButtons = tdbuttons;
tdconfig.nDefaultButton = IDCANCEL; tdconfig.nDefaultButton = IDCANCEL;
TaskDialogIndirect(&tdconfig, &i, NULL, NULL); TaskDialogIndirect(&tdconfig, &i, NULL, NULL);
if (i == IDOK) if (i == IDOK)
ShellExecute(hwnd, L"open", L"https://" EMU_SITE_W, NULL, NULL, SW_SHOW); ShellExecute(hwnd, L"open", L"https://" EMU_SITE_W, NULL, NULL, SW_SHOW);
} }

View File

@@ -44,7 +44,6 @@
#include <86box/ui.h> #include <86box/ui.h>
#include <86box/win.h> #include <86box/win.h>
void void
cassette_mount(char *fn, uint8_t wp) cassette_mount(char *fn, uint8_t wp)
{ {
@@ -53,14 +52,13 @@ cassette_mount(char *fn, uint8_t wp)
cassette_ui_writeprot = wp; cassette_ui_writeprot = wp;
pc_cas_set_fname(cassette, fn); pc_cas_set_fname(cassette, fn);
if (fn != NULL) if (fn != NULL)
memcpy(cassette_fname, fn, MIN(511, strlen(fn))); memcpy(cassette_fname, fn, MIN(511, strlen(fn)));
ui_sb_update_icon_state(SB_CASSETTE, (fn == NULL) ? 1 : 0); ui_sb_update_icon_state(SB_CASSETTE, (fn == NULL) ? 1 : 0);
media_menu_update_cassette(); media_menu_update_cassette();
ui_sb_update_tip(SB_CASSETTE); ui_sb_update_tip(SB_CASSETTE);
config_save(); config_save();
} }
void void
cassette_eject(void) cassette_eject(void)
{ {
@@ -72,7 +70,6 @@ cassette_eject(void)
config_save(); config_save();
} }
void void
cartridge_mount(uint8_t id, char *fn, uint8_t wp) cartridge_mount(uint8_t id, char *fn, uint8_t wp)
{ {
@@ -84,7 +81,6 @@ cartridge_mount(uint8_t id, char *fn, uint8_t wp)
config_save(); config_save();
} }
void void
cartridge_eject(uint8_t id) cartridge_eject(uint8_t id)
{ {
@@ -95,7 +91,6 @@ cartridge_eject(uint8_t id)
config_save(); config_save();
} }
void void
floppy_mount(uint8_t id, char *fn, uint8_t wp) floppy_mount(uint8_t id, char *fn, uint8_t wp)
{ {
@@ -108,7 +103,6 @@ floppy_mount(uint8_t id, char *fn, uint8_t wp)
config_save(); config_save();
} }
void void
floppy_eject(uint8_t id) floppy_eject(uint8_t id)
{ {
@@ -119,20 +113,19 @@ floppy_eject(uint8_t id)
config_save(); config_save();
} }
void void
plat_cdrom_ui_update(uint8_t id, uint8_t reload) plat_cdrom_ui_update(uint8_t id, uint8_t reload)
{ {
cdrom_t *drv = &cdrom[id]; cdrom_t *drv = &cdrom[id];
if (drv->host_drive == 0) { if (drv->host_drive == 0) {
ui_sb_update_icon_state(SB_CDROM|id, 1); ui_sb_update_icon_state(SB_CDROM | id, 1);
} else { } else {
ui_sb_update_icon_state(SB_CDROM|id, 0); ui_sb_update_icon_state(SB_CDROM | id, 0);
} }
media_menu_update_cdrom(id); media_menu_update_cdrom(id);
ui_sb_update_tip(SB_CDROM|id); ui_sb_update_tip(SB_CDROM | id);
} }
void void
@@ -141,18 +134,18 @@ cdrom_mount(uint8_t id, char *fn)
cdrom[id].prev_host_drive = cdrom[id].host_drive; cdrom[id].prev_host_drive = cdrom[id].host_drive;
strcpy(cdrom[id].prev_image_path, cdrom[id].image_path); strcpy(cdrom[id].prev_image_path, cdrom[id].image_path);
if (cdrom[id].ops && cdrom[id].ops->exit) if (cdrom[id].ops && cdrom[id].ops->exit)
cdrom[id].ops->exit(&(cdrom[id])); cdrom[id].ops->exit(&(cdrom[id]));
cdrom[id].ops = NULL; cdrom[id].ops = NULL;
memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path)); memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path));
cdrom_image_open(&(cdrom[id]), fn); cdrom_image_open(&(cdrom[id]), fn);
/* Signal media change to the emulated machine. */ /* Signal media change to the emulated machine. */
if (cdrom[id].insert) if (cdrom[id].insert)
cdrom[id].insert(cdrom[id].priv); cdrom[id].insert(cdrom[id].priv);
cdrom[id].host_drive = (strlen(cdrom[id].image_path) == 0) ? 0 : 200; cdrom[id].host_drive = (strlen(cdrom[id].image_path) == 0) ? 0 : 200;
if (cdrom[id].host_drive == 200) { if (cdrom[id].host_drive == 200) {
ui_sb_update_icon_state(SB_CDROM | id, 0); ui_sb_update_icon_state(SB_CDROM | id, 0);
} else { } else {
ui_sb_update_icon_state(SB_CDROM | id, 1); ui_sb_update_icon_state(SB_CDROM | id, 1);
} }
media_menu_update_cdrom(id); media_menu_update_cdrom(id);
ui_sb_update_tip(SB_CDROM | id); ui_sb_update_tip(SB_CDROM | id);
@@ -166,8 +159,8 @@ mo_eject(uint8_t id)
mo_disk_close(dev); mo_disk_close(dev);
if (mo_drives[id].bus_type) { if (mo_drives[id].bus_type) {
/* Signal disk change to the emulated machine. */ /* Signal disk change to the emulated machine. */
mo_insert(dev); mo_insert(dev);
} }
ui_sb_update_icon_state(SB_MO | id, 1); ui_sb_update_icon_state(SB_MO | id, 1);
@@ -176,7 +169,6 @@ mo_eject(uint8_t id)
config_save(); config_save();
} }
void void
mo_mount(uint8_t id, char *fn, uint8_t wp) mo_mount(uint8_t id, char *fn, uint8_t wp)
{ {
@@ -194,7 +186,6 @@ mo_mount(uint8_t id, char *fn, uint8_t wp)
config_save(); config_save();
} }
void void
mo_reload(uint8_t id) mo_reload(uint8_t id)
{ {
@@ -202,13 +193,13 @@ mo_reload(uint8_t id)
mo_disk_reload(dev); mo_disk_reload(dev);
if (strlen(mo_drives[id].image_path) == 0) { if (strlen(mo_drives[id].image_path) == 0) {
ui_sb_update_icon_state(SB_MO|id, 1); ui_sb_update_icon_state(SB_MO | id, 1);
} else { } else {
ui_sb_update_icon_state(SB_MO|id, 0); ui_sb_update_icon_state(SB_MO | id, 0);
} }
media_menu_update_mo(id); media_menu_update_mo(id);
ui_sb_update_tip(SB_MO|id); ui_sb_update_tip(SB_MO | id);
config_save(); config_save();
} }
@@ -220,8 +211,8 @@ zip_eject(uint8_t id)
zip_disk_close(dev); zip_disk_close(dev);
if (zip_drives[id].bus_type) { if (zip_drives[id].bus_type) {
/* Signal disk change to the emulated machine. */ /* Signal disk change to the emulated machine. */
zip_insert(dev); zip_insert(dev);
} }
ui_sb_update_icon_state(SB_ZIP | id, 1); ui_sb_update_icon_state(SB_ZIP | id, 1);
@@ -230,7 +221,6 @@ zip_eject(uint8_t id)
config_save(); config_save();
} }
void void
zip_mount(uint8_t id, char *fn, uint8_t wp) zip_mount(uint8_t id, char *fn, uint8_t wp)
{ {
@@ -248,7 +238,6 @@ zip_mount(uint8_t id, char *fn, uint8_t wp)
config_save(); config_save();
} }
void void
zip_reload(uint8_t id) zip_reload(uint8_t id)
{ {
@@ -256,13 +245,13 @@ zip_reload(uint8_t id)
zip_disk_reload(dev); zip_disk_reload(dev);
if (strlen(zip_drives[id].image_path) == 0) { if (strlen(zip_drives[id].image_path) == 0) {
ui_sb_update_icon_state(SB_ZIP|id, 1); ui_sb_update_icon_state(SB_ZIP | id, 1);
} else { } else {
ui_sb_update_icon_state(SB_ZIP|id, 0); ui_sb_update_icon_state(SB_ZIP | id, 0);
} }
media_menu_update_zip(id); media_menu_update_zip(id);
ui_sb_update_tip(SB_ZIP|id); ui_sb_update_tip(SB_ZIP | id);
config_save(); config_save();
} }

File diff suppressed because it is too large Load Diff

View File

@@ -33,15 +33,11 @@
#include <86box/ui.h> #include <86box/ui.h>
#include <86box/win.h> #include <86box/win.h>
#define STRING_OR_RESOURCE(s) ((!(s)) ? (NULL) : ((((uintptr_t) s) < ((uintptr_t) 65636)) ? (MAKEINTRESOURCE((uintptr_t) s)) : (s)))
WCHAR wopenfilestring[512];
#define STRING_OR_RESOURCE(s) ((!(s)) ? (NULL) : ((((uintptr_t)s) < ((uintptr_t)65636)) ? (MAKEINTRESOURCE((uintptr_t)s)) : (s))) char openfilestring[512];
uint8_t filterindex = 0;
WCHAR wopenfilestring[512];
char openfilestring[512];
uint8_t filterindex = 0;
int int
ui_msgbox(int flags, void *message) ui_msgbox(int flags, void *message)
@@ -49,125 +45,127 @@ ui_msgbox(int flags, void *message)
return ui_msgbox_ex(flags, NULL, message, NULL, NULL, NULL); return ui_msgbox_ex(flags, NULL, message, NULL, NULL, NULL);
} }
int int
ui_msgbox_header(int flags, void *header, void *message) ui_msgbox_header(int flags, void *header, void *message)
{ {
return ui_msgbox_ex(flags, header, message, NULL, NULL, NULL); return ui_msgbox_ex(flags, header, message, NULL, NULL, NULL);
} }
int int
ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3) { ui_msgbox_ex(int flags, void *header, void *message, void *btn1, void *btn2, void *btn3)
WCHAR temp[512]; {
TASKDIALOGCONFIG tdconfig = {0}; WCHAR temp[512];
TASKDIALOGCONFIG tdconfig = { 0 };
TASKDIALOG_BUTTON tdbuttons[3], TASKDIALOG_BUTTON tdbuttons[3],
tdb_yes = {IDYES, STRING_OR_RESOURCE(btn1)}, tdb_yes = { IDYES, STRING_OR_RESOURCE(btn1) },
tdb_no = {IDNO, STRING_OR_RESOURCE(btn2)}, tdb_no = { IDNO, STRING_OR_RESOURCE(btn2) },
tdb_cancel = {IDCANCEL, STRING_OR_RESOURCE(btn3)}, tdb_cancel = { IDCANCEL, STRING_OR_RESOURCE(btn3) },
tdb_exit = {IDCLOSE, MAKEINTRESOURCE(IDS_2119)}; tdb_exit = { IDCLOSE, MAKEINTRESOURCE(IDS_2119) };
int ret = 0, checked = 0; int ret = 0, checked = 0;
/* Configure the default OK button. */ /* Configure the default OK button. */
tdconfig.cButtons = 0; tdconfig.cButtons = 0;
if (btn1) if (btn1)
tdbuttons[tdconfig.cButtons++] = tdb_yes; tdbuttons[tdconfig.cButtons++] = tdb_yes;
else else
tdconfig.dwCommonButtons = TDCBF_OK_BUTTON; tdconfig.dwCommonButtons = TDCBF_OK_BUTTON;
/* Configure the message type. */ /* Configure the message type. */
switch(flags & 0x1f) { switch (flags & 0x1f) {
case MBX_INFO: /* just an informational message */ case MBX_INFO: /* just an informational message */
tdconfig.pszMainIcon = TD_INFORMATION_ICON; tdconfig.pszMainIcon = TD_INFORMATION_ICON;
break; break;
case MBX_ERROR: /* error message */ case MBX_ERROR: /* error message */
if (flags & MBX_FATAL) { if (flags & MBX_FATAL) {
tdconfig.pszMainIcon = TD_ERROR_ICON; tdconfig.pszMainIcon = TD_ERROR_ICON;
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050); /* "Fatal error" */ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2050); /* "Fatal error" */
/* replace default "OK" button with "Exit" button */ /* replace default "OK" button with "Exit" button */
if (btn1) if (btn1)
tdconfig.cButtons = 0; tdconfig.cButtons = 0;
else else
tdconfig.dwCommonButtons = 0; tdconfig.dwCommonButtons = 0;
tdbuttons[tdconfig.cButtons++] = tdb_exit; tdbuttons[tdconfig.cButtons++] = tdb_exit;
} else { } else {
tdconfig.pszMainIcon = TD_WARNING_ICON; tdconfig.pszMainIcon = TD_WARNING_ICON;
tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2049); /* "Error" */ tdconfig.pszMainInstruction = MAKEINTRESOURCE(IDS_2049); /* "Error" */
} }
break; break;
case MBX_QUESTION: /* question */ case MBX_QUESTION: /* question */
case MBX_QUESTION_YN: case MBX_QUESTION_YN:
case MBX_QUESTION_OK: case MBX_QUESTION_OK:
if (!btn1) /* replace default "OK" button with "Yes" button */ if (!btn1) /* replace default "OK" button with "Yes" button */
tdconfig.dwCommonButtons = (flags & MBX_QUESTION_OK) ? TDCBF_OK_BUTTON : TDCBF_YES_BUTTON; tdconfig.dwCommonButtons = (flags & MBX_QUESTION_OK) ? TDCBF_OK_BUTTON : TDCBF_YES_BUTTON;
if (btn2) /* "No" button */ if (btn2) /* "No" button */
tdbuttons[tdconfig.cButtons++] = tdb_no; tdbuttons[tdconfig.cButtons++] = tdb_no;
else else
tdconfig.dwCommonButtons |= (flags & MBX_QUESTION_OK) ? TDCBF_CANCEL_BUTTON : TDCBF_NO_BUTTON; tdconfig.dwCommonButtons |= (flags & MBX_QUESTION_OK) ? TDCBF_CANCEL_BUTTON : TDCBF_NO_BUTTON;
if (flags & MBX_QUESTION) { if (flags & MBX_QUESTION) {
if (btn3) /* "Cancel" button */ if (btn3) /* "Cancel" button */
tdbuttons[tdconfig.cButtons++] = tdb_cancel; tdbuttons[tdconfig.cButtons++] = tdb_cancel;
else else
tdconfig.dwCommonButtons |= TDCBF_CANCEL_BUTTON; tdconfig.dwCommonButtons |= TDCBF_CANCEL_BUTTON;
} }
if (flags & MBX_WARNING) if (flags & MBX_WARNING)
tdconfig.pszMainIcon = TD_WARNING_ICON; tdconfig.pszMainIcon = TD_WARNING_ICON;
break; break;
} }
/* If the message is an ANSI string, convert it. */ /* If the message is an ANSI string, convert it. */
tdconfig.pszContent = (WCHAR *) STRING_OR_RESOURCE(message); tdconfig.pszContent = (WCHAR *) STRING_OR_RESOURCE(message);
if (flags & MBX_ANSI) { if (flags & MBX_ANSI) {
mbstoc16s(temp, (char *)message, strlen((char *)message)+1); mbstoc16s(temp, (char *) message, strlen((char *) message) + 1);
tdconfig.pszContent = temp; tdconfig.pszContent = temp;
} }
/* Configure the rest of the TaskDialog. */ /* Configure the rest of the TaskDialog. */
tdconfig.cbSize = sizeof(tdconfig); tdconfig.cbSize = sizeof(tdconfig);
tdconfig.hwndParent = hwndMain; tdconfig.hwndParent = hwndMain;
if (flags & MBX_LINKS) if (flags & MBX_LINKS)
tdconfig.dwFlags = TDF_USE_COMMAND_LINKS; tdconfig.dwFlags = TDF_USE_COMMAND_LINKS;
tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_STRINGS); tdconfig.pszWindowTitle = MAKEINTRESOURCE(IDS_STRINGS);
if (header) if (header)
tdconfig.pszMainInstruction = STRING_OR_RESOURCE(header); tdconfig.pszMainInstruction = STRING_OR_RESOURCE(header);
tdconfig.pButtons = tdbuttons; tdconfig.pButtons = tdbuttons;
if (flags & MBX_DONTASK) if (flags & MBX_DONTASK)
tdconfig.pszVerificationText = MAKEINTRESOURCE(IDS_2135); tdconfig.pszVerificationText = MAKEINTRESOURCE(IDS_2135);
/* Run the TaskDialog. */ /* Run the TaskDialog. */
TaskDialogIndirect(&tdconfig, &ret, NULL, &checked); TaskDialogIndirect(&tdconfig, &ret, NULL, &checked);
/* Convert return values to generic ones. */ /* Convert return values to generic ones. */
if (ret == IDNO) ret = 1; if (ret == IDNO)
else if (ret == IDCANCEL) ret = -1; ret = 1;
else ret = 0; else if (ret == IDCANCEL)
ret = -1;
else
ret = 0;
/* 10 is added to the return value if "don't show again" is checked. */ /* 10 is added to the return value if "don't show again" is checked. */
if (checked) ret += 10; if (checked)
ret += 10;
return(ret); return (ret);
} }
int int
file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save) file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save)
{ {
OPENFILENAME ofn; OPENFILENAME ofn;
BOOL r; BOOL r;
/* DWORD err; */ /* DWORD err; */
int old_dopause; int old_dopause;
/* Initialize OPENFILENAME */ /* Initialize OPENFILENAME */
ZeroMemory(&ofn, sizeof(ofn)); ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn); ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd; ofn.hwndOwner = hwnd;
ofn.lpstrFile = wopenfilestring; ofn.lpstrFile = wopenfilestring;
/* /*
* Set lpstrFile[0] to '\0' so that GetOpenFileName does * Set lpstrFile[0] to '\0' so that GetOpenFileName does
@@ -176,40 +174,39 @@ file_dlg_w(HWND hwnd, WCHAR *f, WCHAR *fn, WCHAR *title, int save)
memset(ofn.lpstrFile, 0x00, 512 * sizeof(WCHAR)); memset(ofn.lpstrFile, 0x00, 512 * sizeof(WCHAR));
if (fn) if (fn)
memcpy(ofn.lpstrFile, fn, (wcslen(fn) << 1) + 2); memcpy(ofn.lpstrFile, fn, (wcslen(fn) << 1) + 2);
ofn.nMaxFile = sizeof_w(wopenfilestring); ofn.nMaxFile = sizeof_w(wopenfilestring);
ofn.lpstrFilter = f; ofn.lpstrFilter = f;
ofn.nFilterIndex = 1; ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL; ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0; ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL; ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST; ofn.Flags = OFN_PATHMUSTEXIST;
if (! save) if (!save)
ofn.Flags |= OFN_FILEMUSTEXIST; ofn.Flags |= OFN_FILEMUSTEXIST;
if (title) if (title)
ofn.lpstrTitle = title; ofn.lpstrTitle = title;
/* Display the Open dialog box. */ /* Display the Open dialog box. */
old_dopause = dopause; old_dopause = dopause;
plat_pause(1); plat_pause(1);
if (save) if (save)
r = GetSaveFileName(&ofn); r = GetSaveFileName(&ofn);
else else
r = GetOpenFileName(&ofn); r = GetOpenFileName(&ofn);
plat_pause(old_dopause); plat_pause(old_dopause);
plat_chdir(usr_path); plat_chdir(usr_path);
if (r) { if (r) {
c16stombs(openfilestring, wopenfilestring, sizeof(openfilestring)); c16stombs(openfilestring, wopenfilestring, sizeof(openfilestring));
filterindex = ofn.nFilterIndex; filterindex = ofn.nFilterIndex;
return(0); return (0);
} }
return(1); return (1);
} }
int int
file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save) file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save)
{ {
@@ -220,10 +217,9 @@ file_dlg(HWND hwnd, WCHAR *f, char *fn, char *title, int save)
if (title) if (title)
mbstoc16s(title_buf, title, sizeof title_buf); mbstoc16s(title_buf, title, sizeof title_buf);
return(file_dlg_w(hwnd, f, fn ? ufn : NULL, title ? title_buf : NULL, save)); return (file_dlg_w(hwnd, f, fn ? ufn : NULL, title ? title_buf : NULL, save));
} }
int int
file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save) file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save)
{ {
@@ -234,22 +230,20 @@ file_dlg_mb(HWND hwnd, char *f, char *fn, char *title, int save)
if (title) if (title)
mbstoc16s(title_buf, title, sizeof title_buf); mbstoc16s(title_buf, title, sizeof title_buf);
return(file_dlg_w(hwnd, uf, ufn, title ? title_buf : NULL, save)); return (file_dlg_w(hwnd, uf, ufn, title ? title_buf : NULL, save));
} }
int int
file_dlg_w_st(HWND hwnd, int id, WCHAR *fn, char *title, int save) file_dlg_w_st(HWND hwnd, int id, WCHAR *fn, char *title, int save)
{ {
WCHAR title_buf[512]; WCHAR title_buf[512];
if (title) if (title)
mbstoc16s(title_buf, title, sizeof title_buf); mbstoc16s(title_buf, title, sizeof title_buf);
return(file_dlg_w(hwnd, plat_get_string(id), fn, title ? title_buf : NULL, save)); return (file_dlg_w(hwnd, plat_get_string(id), fn, title ? title_buf : NULL, save));
} }
int int
file_dlg_st(HWND hwnd, int id, char *fn, char *title, int save) file_dlg_st(HWND hwnd, int id, char *fn, char *title, int save)
{ {
return(file_dlg(hwnd, plat_get_string(id), fn, title, save)); return (file_dlg(hwnd, plat_get_string(id), fn, title, save));
} }

View File

@@ -25,63 +25,59 @@
#include <86box/86box.h> #include <86box/86box.h>
#include <86box/plat_dynld.h> #include <86box/plat_dynld.h>
#ifdef ENABLE_DYNLD_LOG #ifdef ENABLE_DYNLD_LOG
int dynld_do_log = ENABLE_DYNLD_LOG; int dynld_do_log = ENABLE_DYNLD_LOG;
static void static void
dynld_log(const char *fmt, ...) dynld_log(const char *fmt, ...)
{ {
va_list ap; va_list ap;
if (dynld_do_log) { if (dynld_do_log) {
va_start(ap, fmt); va_start(ap, fmt);
pclog_ex(fmt, ap); pclog_ex(fmt, ap);
va_end(ap); va_end(ap);
} }
} }
#else #else
#define dynld_log(fmt, ...) # define dynld_log(fmt, ...)
#endif #endif
void * void *
dynld_module(const char *name, dllimp_t *table) dynld_module(const char *name, dllimp_t *table)
{ {
HMODULE h; HMODULE h;
dllimp_t *imp; dllimp_t *imp;
void *func; void *func;
/* See if we can load the desired module. */ /* See if we can load the desired module. */
if ((h = LoadLibrary(name)) == NULL) { if ((h = LoadLibrary(name)) == NULL) {
dynld_log("DynLd(\"%s\"): library not found! (%08X)\n", name, GetLastError()); dynld_log("DynLd(\"%s\"): library not found! (%08X)\n", name, GetLastError());
return(NULL); return (NULL);
} }
/* Now load the desired function pointers. */ /* Now load the desired function pointers. */
for (imp=table; imp->name!=NULL; imp++) { for (imp = table; imp->name != NULL; imp++) {
func = GetProcAddress(h, imp->name); func = GetProcAddress(h, imp->name);
if (func == NULL) { if (func == NULL) {
dynld_log("DynLd(\"%s\"): function '%s' not found! (%08X)\n", dynld_log("DynLd(\"%s\"): function '%s' not found! (%08X)\n",
name, imp->name, GetLastError()); name, imp->name, GetLastError());
FreeLibrary(h); FreeLibrary(h);
return(NULL); return (NULL);
} }
/* To overcome typing issues.. */ /* To overcome typing issues.. */
*(char **)imp->func = (char *)func; *(char **) imp->func = (char *) func;
} }
/* All good. */ /* All good. */
dynld_log("loaded %s\n", name); dynld_log("loaded %s\n", name);
return((void *)h); return ((void *) h);
} }
void void
dynld_close(void *handle) dynld_close(void *handle)
{ {
if (handle != NULL) if (handle != NULL)
FreeLibrary((HMODULE)handle); FreeLibrary((HMODULE) handle);
} }

View File

@@ -28,138 +28,138 @@
#include <86box/ui.h> #include <86box/ui.h>
#include <86box/win.h> #include <86box/win.h>
HICON hIcon[256]; /* icon data loaded from resources */ HICON hIcon[256]; /* icon data loaded from resources */
char icon_set[256] = ""; /* name of the iconset to be used */ char icon_set[256] = ""; /* name of the iconset to be used */
void win_clear_icon_set() void
win_clear_icon_set()
{ {
int i; int i;
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
if (hIcon[i] != 0) if (hIcon[i] != 0) {
{ DestroyIcon(hIcon[i]);
DestroyIcon(hIcon[i]); hIcon[i] = 0;
hIcon[i] = 0; }
}
} }
void win_system_icon_set() void
win_system_icon_set()
{ {
int i, x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi); int i, x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
hIcon[i] = LoadImage(hinstance, MAKEINTRESOURCE(i), IMAGE_ICON, x, y, LR_DEFAULTCOLOR); hIcon[i] = LoadImage(hinstance, MAKEINTRESOURCE(i), IMAGE_ICON, x, y, LR_DEFAULTCOLOR);
} }
typedef struct typedef struct
{ {
int id; int id;
char* filename; char *filename;
} _ICON_DATA; } _ICON_DATA;
const _ICON_DATA icon_files[] = const _ICON_DATA icon_files[] = {
{ {16, "floppy_525.ico" },
{16, "floppy_525.ico"}, { 17, "floppy_525_active.ico" },
{17, "floppy_525_active.ico"}, { 24, "floppy_35.ico" },
{24, "floppy_35.ico"}, { 25, "floppy_35_active.ico" },
{25, "floppy_35_active.ico"}, { 32, "cdrom.ico" },
{32, "cdrom.ico"}, { 33, "cdrom_active.ico" },
{33, "cdrom_active.ico"}, { 48, "zip.ico" },
{48, "zip.ico"}, { 49, "zip_active.ico" },
{49, "zip_active.ico"}, { 56, "mo.ico" },
{56, "mo.ico"}, { 57, "mo_active.ico" },
{57, "mo_active.ico"}, { 64, "cassette.ico" },
{64, "cassette.ico"}, { 65, "cassette_active.ico" },
{65, "cassette_active.ico"}, { 80, "hard_disk.ico" },
{80, "hard_disk.ico"}, { 81, "hard_disk_active.ico" },
{81, "hard_disk_active.ico"}, { 96, "network.ico" },
{96, "network.ico"}, { 97, "network_active.ico" },
{97, "network_active.ico"}, { 104, "cartridge.ico" },
{104, "cartridge.ico"}, { 144, "floppy_525_empty.ico" },
{144, "floppy_525_empty.ico"}, { 145, "floppy_525_empty_active.ico"},
{145, "floppy_525_empty_active.ico"}, { 152, "floppy_35_empty.ico" },
{152, "floppy_35_empty.ico"}, { 153, "floppy_35_empty_active.ico" },
{153, "floppy_35_empty_active.ico"}, { 160, "cdrom_empty.ico" },
{160, "cdrom_empty.ico"}, { 161, "cdrom_empty_active.ico" },
{161, "cdrom_empty_active.ico"}, { 176, "zip_empty.ico" },
{176, "zip_empty.ico"}, { 177, "zip_empty_active.ico" },
{177, "zip_empty_active.ico"}, { 184, "mo_empty.ico" },
{184, "mo_empty.ico"}, { 185, "mo_empty_active.ico" },
{185, "mo_empty_active.ico"}, { 192, "cassette_empty.ico" },
{192, "cassette_empty.ico"}, { 193, "cassette_empty_active.ico" },
{193, "cassette_empty_active.ico"}, { 200, "run.ico" },
{200, "run.ico"}, { 201, "pause.ico" },
{201, "pause.ico"}, { 202, "send_cad.ico" },
{202, "send_cad.ico"}, { 203, "send_cae.ico" },
{203, "send_cae.ico"}, { 204, "hard_reset.ico" },
{204, "hard_reset.ico"}, { 205, "acpi_shutdown.ico" },
{205, "acpi_shutdown.ico"}, { 206, "settings.ico" },
{206, "settings.ico"}, { 232, "cartridge_empty.ico" },
{232, "cartridge_empty.ico"}, { 240, "machine.ico" },
{240, "machine.ico"}, { 241, "display.ico" },
{241, "display.ico"}, { 242, "input_devices.ico" },
{242, "input_devices.ico"}, { 243, "sound.ico" },
{243, "sound.ico"}, { 244, "ports.ico" },
{244, "ports.ico"}, { 245, "other_peripherals.ico" },
{245, "other_peripherals.ico"}, { 246, "floppy_and_cdrom_drives.ico"},
{246, "floppy_and_cdrom_drives.ico"}, { 247, "other_removable_devices.ico"},
{247, "other_removable_devices.ico"}, { 248, "floppy_disabled.ico" },
{248, "floppy_disabled.ico"}, { 249, "cdrom_disabled.ico" },
{249, "cdrom_disabled.ico"}, { 250, "zip_disabled.ico" },
{250, "zip_disabled.ico"}, { 251, "mo_disabled.ico" },
{251, "mo_disabled.ico"}, { 252, "storage_controllers.ico" }
{252, "storage_controllers.ico"} };
};
void win_get_icons_path(char* path_root) void
win_get_icons_path(char *path_root)
{ {
char roms_root[1024] = {0}; char roms_root[1024] = { 0 };
if (rom_path[0]) if (rom_path[0])
strcpy(roms_root, rom_path); strcpy(roms_root, rom_path);
else else
path_append_filename(roms_root, exe_path, "roms"); path_append_filename(roms_root, exe_path, "roms");
path_append_filename(path_root, roms_root, "icons"); path_append_filename(path_root, roms_root, "icons");
path_slash(path_root); path_slash(path_root);
} }
void win_load_icon_set() void
win_load_icon_set()
{ {
win_clear_icon_set(); win_clear_icon_set();
win_system_icon_set(); win_system_icon_set();
if (strlen(icon_set) == 0) { if (strlen(icon_set) == 0) {
ToolBarLoadIcons(); ToolBarLoadIcons();
return; return;
} }
char path_root[2048] = {0}, temp[2048] = {0}; char path_root[2048] = { 0 }, temp[2048] = { 0 };
wchar_t wtemp[2048] = {0}; wchar_t wtemp[2048] = { 0 };
win_get_icons_path(path_root); win_get_icons_path(path_root);
strcat(path_root, icon_set); strcat(path_root, icon_set);
path_slash(path_root); path_slash(path_root);
int i, count = sizeof(icon_files) / sizeof(_ICON_DATA), int i, count = sizeof(icon_files) / sizeof(_ICON_DATA),
x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi); x = win_get_system_metrics(SM_CXSMICON, dpi), y = win_get_system_metrics(SM_CYSMICON, dpi);
for (i = 0; i < count; i++) for (i = 0; i < count; i++) {
{ path_append_filename(temp, path_root, icon_files[i].filename);
path_append_filename(temp, path_root, icon_files[i].filename); mbstoc16s(wtemp, temp, strlen(temp) + 1);
mbstoc16s(wtemp, temp, strlen(temp) + 1);
HICON ictemp; HICON ictemp;
ictemp = LoadImageW(NULL, (LPWSTR)wtemp, IMAGE_ICON, x, y, LR_LOADFROMFILE | LR_DEFAULTCOLOR); ictemp = LoadImageW(NULL, (LPWSTR) wtemp, IMAGE_ICON, x, y, LR_LOADFROMFILE | LR_DEFAULTCOLOR);
if (ictemp) if (ictemp) {
{ if (hIcon[icon_files[i].id])
if (hIcon[icon_files[i].id]) DestroyIcon(hIcon[icon_files[i].id]);
DestroyIcon(hIcon[icon_files[i].id]); hIcon[icon_files[i].id] = ictemp;
hIcon[icon_files[i].id] = ictemp; }
} }
}
uint32_t curr_lang = lang_id; uint32_t curr_lang = lang_id;
lang_id = 0; lang_id = 0;
set_language(curr_lang); set_language(curr_lang);
ToolBarLoadIcons(); ToolBarLoadIcons();
} }

View File

@@ -36,435 +36,447 @@
#ifdef ENABLE_JOYSTICK_LOG #ifdef ENABLE_JOYSTICK_LOG
int joystick_do_log = ENABLE_JOYSTICK_LOG; int joystick_do_log = ENABLE_JOYSTICK_LOG;
static void static void
joystick_log(const char *fmt, ...) joystick_log(const char *fmt, ...)
{ {
va_list ap; va_list ap;
if (joystick_do_log) { if (joystick_do_log) {
va_start(ap, fmt); va_start(ap, fmt);
pclog_ex(fmt, ap); pclog_ex(fmt, ap);
va_end(ap); va_end(ap);
} }
} }
#else #else
#define joystick_log(fmt, ...) # define joystick_log(fmt, ...)
#endif #endif
typedef struct { typedef struct {
HANDLE hdevice; HANDLE hdevice;
PHIDP_PREPARSED_DATA data; PHIDP_PREPARSED_DATA data;
USAGE usage_button[256]; USAGE usage_button[256];
struct raw_axis_t { struct raw_axis_t {
USAGE usage; USAGE usage;
USHORT link; USHORT link;
USHORT bitsize; USHORT bitsize;
LONG max; LONG max;
LONG min; LONG min;
} axis[8]; } axis[8];
struct raw_pov_t { struct raw_pov_t {
USAGE usage; USAGE usage;
USHORT link; USHORT link;
LONG max; LONG max;
LONG min; LONG min;
} pov[4]; } pov[4];
} raw_joystick_t; } raw_joystick_t;
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
joystick_t joystick_state[MAX_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS];
int joysticks_present = 0; int joysticks_present = 0;
raw_joystick_t raw_joystick_state[MAX_PLAT_JOYSTICKS]; raw_joystick_t raw_joystick_state[MAX_PLAT_JOYSTICKS];
/* We only use the first 32 buttons reported, from Usage ID 1-128 */ /* We only use the first 32 buttons reported, from Usage ID 1-128 */
void joystick_add_button(raw_joystick_t* rawjoy, plat_joystick_t* joy, USAGE usage) { void
if (joy->nr_buttons >= 32) return; joystick_add_button(raw_joystick_t *rawjoy, plat_joystick_t *joy, USAGE usage)
if (usage < 1 || usage > 128) return;
rawjoy->usage_button[usage] = joy->nr_buttons;
sprintf(joy->button[joy->nr_buttons].name, "Button %d", usage);
joy->nr_buttons++;
}
void joystick_add_axis(raw_joystick_t* rawjoy, plat_joystick_t* joy, PHIDP_VALUE_CAPS prop) {
if (joy->nr_axes >= 8) return;
switch (prop->Range.UsageMin) {
case HID_USAGE_GENERIC_X:
sprintf(joy->axis[joy->nr_axes].name, "X");
break;
case HID_USAGE_GENERIC_Y:
sprintf(joy->axis[joy->nr_axes].name, "Y");
break;
case HID_USAGE_GENERIC_Z:
sprintf(joy->axis[joy->nr_axes].name, "Z");
break;
case HID_USAGE_GENERIC_RX:
sprintf(joy->axis[joy->nr_axes].name, "RX");
break;
case HID_USAGE_GENERIC_RY:
sprintf(joy->axis[joy->nr_axes].name, "RY");
break;
case HID_USAGE_GENERIC_RZ:
sprintf(joy->axis[joy->nr_axes].name, "RZ");
break;
default:
return;
}
joy->axis[joy->nr_axes].id = joy->nr_axes;
rawjoy->axis[joy->nr_axes].usage = prop->Range.UsageMin;
rawjoy->axis[joy->nr_axes].link = prop->LinkCollection;
rawjoy->axis[joy->nr_axes].bitsize = prop->BitSize;
/* Assume unsigned when min >= 0 */
if (prop->LogicalMin < 0) {
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax;
} else {
/*
* Some joysticks will send -1 in LogicalMax, like Xbox Controllers
* so we need to mask that to appropriate value (instead of 0xFFFFFFFF)
*/
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax & ((1 << prop->BitSize) - 1);
}
rawjoy->axis[joy->nr_axes].min = prop->LogicalMin;
joy->nr_axes++;
}
void joystick_add_pov(raw_joystick_t* rawjoy, plat_joystick_t* joy, PHIDP_VALUE_CAPS prop) {
if (joy->nr_povs >= 4) return;
sprintf(joy->pov[joy->nr_povs].name, "POV %d", joy->nr_povs+1);
rawjoy->pov[joy->nr_povs].usage = prop->Range.UsageMin;
rawjoy->pov[joy->nr_povs].link = prop->LinkCollection;
rawjoy->pov[joy->nr_povs].min = prop->LogicalMin;
rawjoy->pov[joy->nr_povs].max = prop->LogicalMax;
joy->nr_povs++;
}
void joystick_get_capabilities(raw_joystick_t* rawjoy, plat_joystick_t* joy) {
UINT size = 0;
PHIDP_BUTTON_CAPS btn_caps = NULL;
PHIDP_VALUE_CAPS val_caps = NULL;
/* Get preparsed data (HID data format) */
GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, NULL, &size);
rawjoy->data = malloc(size);
if (GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, rawjoy->data, &size) <= 0)
fatal("joystick_get_capabilities: Failed to get preparsed data.\n");
HIDP_CAPS caps;
HidP_GetCaps(rawjoy->data, &caps);
/* Buttons */
if (caps.NumberInputButtonCaps > 0) {
btn_caps = calloc(caps.NumberInputButtonCaps, sizeof(HIDP_BUTTON_CAPS));
if (HidP_GetButtonCaps(HidP_Input, btn_caps, &caps.NumberInputButtonCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
joystick_log("joystick_get_capabilities: Failed to query input buttons.\n");
goto end;
}
/* We only detect generic stuff */
for (int c=0; c<caps.NumberInputButtonCaps; c++) {
if (btn_caps[c].UsagePage != HID_USAGE_PAGE_BUTTON) continue;
int button_count = btn_caps[c].Range.UsageMax - btn_caps[c].Range.UsageMin + 1;
for (int b=0; b<button_count; b++) {
joystick_add_button(rawjoy, joy, b + btn_caps[c].Range.UsageMin);
}
}
}
/* Values (axes and povs) */
if (caps.NumberInputValueCaps > 0) {
val_caps = calloc(caps.NumberInputValueCaps, sizeof(HIDP_VALUE_CAPS));
if (HidP_GetValueCaps(HidP_Input, val_caps, &caps.NumberInputValueCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
joystick_log("joystick_get_capabilities: Failed to query axes and povs.\n");
goto end;
}
/* We only detect generic stuff */
for (int c=0; c<caps.NumberInputValueCaps; c++) {
if (val_caps[c].UsagePage != HID_USAGE_PAGE_GENERIC) continue;
if (val_caps[c].Range.UsageMin == HID_USAGE_GENERIC_HATSWITCH)
joystick_add_pov(rawjoy, joy, &val_caps[c]);
else
joystick_add_axis(rawjoy, joy, &val_caps[c]);
}
}
end:
free(btn_caps);
free(val_caps);
}
void joystick_get_device_name(raw_joystick_t* rawjoy, plat_joystick_t* joy, PRID_DEVICE_INFO info) {
UINT size = 0;
char *device_name = NULL;
WCHAR device_desc_wide[200] = {0};
GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size);
device_name = calloc(size, sizeof(char));
if (GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size) <= 0)
fatal("joystick_get_capabilities: Failed to get device name.\n");
HANDLE hDevObj = CreateFile(device_name, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevObj) {
HidD_GetProductString(hDevObj, device_desc_wide, sizeof(WCHAR) * 200);
CloseHandle(hDevObj);
}
free(device_name);
int result = WideCharToMultiByte(CP_ACP, 0, device_desc_wide, 200, joy->name, 260, NULL, NULL);
if (result == 0 || strlen(joy->name) == 0)
sprintf(joy->name,
"RawInput %s, VID:%04lX PID:%04lX",
info->hid.usUsage == HID_USAGE_GENERIC_JOYSTICK ? "Joystick" : "Gamepad",
info->hid.dwVendorId,
info->hid.dwProductId);
}
void joystick_init()
{ {
UINT size = 0; if (joy->nr_buttons >= 32)
atexit(joystick_close); return;
if (usage < 1 || usage > 128)
return;
joysticks_present = 0; rawjoy->usage_button[usage] = joy->nr_buttons;
memset(raw_joystick_state, 0, sizeof(raw_joystick_t) * MAX_PLAT_JOYSTICKS); sprintf(joy->button[joy->nr_buttons].name, "Button %d", usage);
joy->nr_buttons++;
/* Get a list of raw input devices from Windows */
UINT raw_devices = 0;
GetRawInputDeviceList(NULL, &raw_devices, sizeof(RAWINPUTDEVICELIST));
PRAWINPUTDEVICELIST deviceList = calloc(raw_devices, sizeof(RAWINPUTDEVICELIST));
GetRawInputDeviceList(deviceList, &raw_devices, sizeof(RAWINPUTDEVICELIST));
for (int i=0; i<raw_devices; i++) {
PRID_DEVICE_INFO info = NULL;
if (joysticks_present >= MAX_PLAT_JOYSTICKS) break;
if (deviceList[i].dwType != RIM_TYPEHID) continue;
/* Get device info: hardware IDs and usage IDs */
GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, NULL, &size);
info = malloc(size);
info->cbSize = sizeof(RID_DEVICE_INFO);
if (GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, info, &size) <= 0)
goto end_loop;
/* If this is not a joystick/gamepad, skip */
if (info->hid.usUsagePage != HID_USAGE_PAGE_GENERIC) goto end_loop;
if (info->hid.usUsage != HID_USAGE_GENERIC_JOYSTICK &&
info->hid.usUsage != HID_USAGE_GENERIC_GAMEPAD) goto end_loop;
plat_joystick_t *joy = &plat_joystick_state[joysticks_present];
raw_joystick_t *rawjoy = &raw_joystick_state[joysticks_present];
rawjoy->hdevice = deviceList[i].hDevice;
joystick_get_capabilities(rawjoy, joy);
joystick_get_device_name(rawjoy, joy, info);
joystick_log("joystick_init: %s - %d buttons, %d axes, %d POVs\n",
joy->name, joy->nr_buttons, joy->nr_axes, joy->nr_povs);
joysticks_present++;
end_loop:
free(info);
}
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
/* Initialize the RawInput (joystick and gamepad) module. */
RAWINPUTDEVICE ridev[2];
ridev[0].dwFlags = 0;
ridev[0].hwndTarget = NULL;
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
ridev[1].dwFlags = 0;
ridev[1].hwndTarget = NULL;
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
if (!RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE)))
fatal("plat_joystick_init: RegisterRawInputDevices failed\n");
} }
void joystick_close() void
joystick_add_axis(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS prop)
{ {
RAWINPUTDEVICE ridev[2]; if (joy->nr_axes >= 8)
ridev[0].dwFlags = RIDEV_REMOVE; return;
ridev[0].hwndTarget = NULL;
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
ridev[1].dwFlags = RIDEV_REMOVE; switch (prop->Range.UsageMin) {
ridev[1].hwndTarget = NULL; case HID_USAGE_GENERIC_X:
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC; sprintf(joy->axis[joy->nr_axes].name, "X");
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD; break;
case HID_USAGE_GENERIC_Y:
sprintf(joy->axis[joy->nr_axes].name, "Y");
break;
case HID_USAGE_GENERIC_Z:
sprintf(joy->axis[joy->nr_axes].name, "Z");
break;
case HID_USAGE_GENERIC_RX:
sprintf(joy->axis[joy->nr_axes].name, "RX");
break;
case HID_USAGE_GENERIC_RY:
sprintf(joy->axis[joy->nr_axes].name, "RY");
break;
case HID_USAGE_GENERIC_RZ:
sprintf(joy->axis[joy->nr_axes].name, "RZ");
break;
default:
return;
}
RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE)); joy->axis[joy->nr_axes].id = joy->nr_axes;
rawjoy->axis[joy->nr_axes].usage = prop->Range.UsageMin;
rawjoy->axis[joy->nr_axes].link = prop->LinkCollection;
rawjoy->axis[joy->nr_axes].bitsize = prop->BitSize;
/* Assume unsigned when min >= 0 */
if (prop->LogicalMin < 0) {
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax;
} else {
/*
* Some joysticks will send -1 in LogicalMax, like Xbox Controllers
* so we need to mask that to appropriate value (instead of 0xFFFFFFFF)
*/
rawjoy->axis[joy->nr_axes].max = prop->LogicalMax & ((1 << prop->BitSize) - 1);
}
rawjoy->axis[joy->nr_axes].min = prop->LogicalMin;
joy->nr_axes++;
} }
void
void win_joystick_handle(PRAWINPUT raw) joystick_add_pov(raw_joystick_t *rawjoy, plat_joystick_t *joy, PHIDP_VALUE_CAPS prop)
{ {
HRESULT r; if (joy->nr_povs >= 4)
int j = -1; /* current joystick index, -1 when not found */ return;
/* If the input is not from a known device, we ignore it */ sprintf(joy->pov[joy->nr_povs].name, "POV %d", joy->nr_povs + 1);
for (int i=0; i<joysticks_present; i++) { rawjoy->pov[joy->nr_povs].usage = prop->Range.UsageMin;
if (raw_joystick_state[i].hdevice == raw->header.hDevice) { rawjoy->pov[joy->nr_povs].link = prop->LinkCollection;
j = i; rawjoy->pov[joy->nr_povs].min = prop->LogicalMin;
break; rawjoy->pov[joy->nr_povs].max = prop->LogicalMax;
}
}
if (j == -1) return;
/* Read buttons */ joy->nr_povs++;
USAGE usage_list[128] = {0};
ULONG usage_length = plat_joystick_state[j].nr_buttons;
memset(plat_joystick_state[j].b, 0, 32 * sizeof(int));
r = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usage_list, &usage_length,
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS) {
for (int i=0; i<usage_length; i++) {
int button = raw_joystick_state[j].usage_button[usage_list[i]];
plat_joystick_state[j].b[button] = 128;
}
}
/* Read axes */
for (int a=0; a<plat_joystick_state[j].nr_axes; a++) {
struct raw_axis_t* axis = &raw_joystick_state[j].axis[a];
ULONG uvalue = 0;
LONG value = 0;
LONG center = (axis->max - axis->min + 1) / 2;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, axis->link, axis->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS) {
if (axis->min < 0) {
/* extend signed uvalue to LONG */
if (uvalue & (1 << (axis->bitsize-1))) {
ULONG mask = (1 << axis->bitsize) - 1;
value = -1U ^ mask;
value |= uvalue;
} else {
value = uvalue;
}
} else {
/* Assume unsigned when min >= 0, convert to a signed value */
value = (LONG)uvalue - center;
}
if (abs(value) == 1) value = 0;
value = value * 32768 / center;
}
plat_joystick_state[j].a[a] = value;
//joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
}
/* read povs */
for (int p=0; p<plat_joystick_state[j].nr_povs; p++) {
struct raw_pov_t* pov = &raw_joystick_state[j].pov[p];
ULONG uvalue = 0;
LONG value = -1;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, pov->link, pov->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS && (uvalue >= pov->min && uvalue <= pov->max)) {
value = (uvalue - pov->min) * 36000;
value /= (pov->max - pov->min + 1);
value %= 36000;
}
plat_joystick_state[j].p[p] = value;
//joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
}
//joystick_log("\n");
} }
void
static int joystick_get_axis(int joystick_nr, int mapping) joystick_get_capabilities(raw_joystick_t *rawjoy, plat_joystick_t *joy)
{ {
if (mapping & POV_X) UINT size = 0;
{ PHIDP_BUTTON_CAPS btn_caps = NULL;
int pov = plat_joystick_state[joystick_nr].p[mapping & 3]; PHIDP_VALUE_CAPS val_caps = NULL;
if (LOWORD(pov) == 0xFFFF)
return 0;
else
return sin((2*M_PI * (double)pov) / 36000.0) * 32767;
}
else if (mapping & POV_Y)
{
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF) /* Get preparsed data (HID data format) */
return 0; GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, NULL, &size);
else rawjoy->data = malloc(size);
return -cos((2*M_PI * (double)pov) / 36000.0) * 32767; if (GetRawInputDeviceInfoW(rawjoy->hdevice, RIDI_PREPARSEDDATA, rawjoy->data, &size) <= 0)
} fatal("joystick_get_capabilities: Failed to get preparsed data.\n");
else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
HIDP_CAPS caps;
HidP_GetCaps(rawjoy->data, &caps);
/* Buttons */
if (caps.NumberInputButtonCaps > 0) {
btn_caps = calloc(caps.NumberInputButtonCaps, sizeof(HIDP_BUTTON_CAPS));
if (HidP_GetButtonCaps(HidP_Input, btn_caps, &caps.NumberInputButtonCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
joystick_log("joystick_get_capabilities: Failed to query input buttons.\n");
goto end;
}
/* We only detect generic stuff */
for (int c = 0; c < caps.NumberInputButtonCaps; c++) {
if (btn_caps[c].UsagePage != HID_USAGE_PAGE_BUTTON)
continue;
int button_count = btn_caps[c].Range.UsageMax - btn_caps[c].Range.UsageMin + 1;
for (int b = 0; b < button_count; b++) {
joystick_add_button(rawjoy, joy, b + btn_caps[c].Range.UsageMin);
}
}
}
/* Values (axes and povs) */
if (caps.NumberInputValueCaps > 0) {
val_caps = calloc(caps.NumberInputValueCaps, sizeof(HIDP_VALUE_CAPS));
if (HidP_GetValueCaps(HidP_Input, val_caps, &caps.NumberInputValueCaps, rawjoy->data) != HIDP_STATUS_SUCCESS) {
joystick_log("joystick_get_capabilities: Failed to query axes and povs.\n");
goto end;
}
/* We only detect generic stuff */
for (int c = 0; c < caps.NumberInputValueCaps; c++) {
if (val_caps[c].UsagePage != HID_USAGE_PAGE_GENERIC)
continue;
if (val_caps[c].Range.UsageMin == HID_USAGE_GENERIC_HATSWITCH)
joystick_add_pov(rawjoy, joy, &val_caps[c]);
else
joystick_add_axis(rawjoy, joy, &val_caps[c]);
}
}
end:
free(btn_caps);
free(val_caps);
} }
void
void joystick_process(void) joystick_get_device_name(raw_joystick_t *rawjoy, plat_joystick_t *joy, PRID_DEVICE_INFO info)
{ {
int c, d; UINT size = 0;
char *device_name = NULL;
WCHAR device_desc_wide[200] = { 0 };
if (joystick_type == 7) return; GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size);
device_name = calloc(size, sizeof(char));
if (GetRawInputDeviceInfoA(rawjoy->hdevice, RIDI_DEVICENAME, device_name, &size) <= 0)
fatal("joystick_get_capabilities: Failed to get device name.\n");
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) HANDLE hDevObj = CreateFile(device_name, GENERIC_READ | GENERIC_WRITE,
{ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (joystick_state[c].plat_joystick_nr) if (hDevObj) {
{ HidD_GetProductString(hDevObj, device_desc_wide, sizeof(WCHAR) * 200);
int joystick_nr = joystick_state[c].plat_joystick_nr - 1; CloseHandle(hDevObj);
}
free(device_name);
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) int result = WideCharToMultiByte(CP_ACP, 0, device_desc_wide, 200, joy->name, 260, NULL, NULL);
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]); if (result == 0 || strlen(joy->name) == 0)
for (d = 0; d < joystick_get_button_count(joystick_type); d++) sprintf(joy->name,
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]]; "RawInput %s, VID:%04lX PID:%04lX",
info->hid.usUsage == HID_USAGE_GENERIC_JOYSTICK ? "Joystick" : "Gamepad",
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) info->hid.dwVendorId,
{ info->hid.dwProductId);
int x, y; }
double angle, magnitude;
void
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]); joystick_init()
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]); {
UINT size = 0;
angle = (atan2((double)y, (double)x) * 360.0) / (2*M_PI); atexit(joystick_close);
magnitude = sqrt((double)x*(double)x + (double)y*(double)y);
joysticks_present = 0;
if (magnitude < 16384) memset(raw_joystick_state, 0, sizeof(raw_joystick_t) * MAX_PLAT_JOYSTICKS);
joystick_state[c].pov[d] = -1;
else /* Get a list of raw input devices from Windows */
joystick_state[c].pov[d] = ((int)angle + 90 + 360) % 360; UINT raw_devices = 0;
} GetRawInputDeviceList(NULL, &raw_devices, sizeof(RAWINPUTDEVICELIST));
} PRAWINPUTDEVICELIST deviceList = calloc(raw_devices, sizeof(RAWINPUTDEVICELIST));
else GetRawInputDeviceList(deviceList, &raw_devices, sizeof(RAWINPUTDEVICELIST));
{
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) for (int i = 0; i < raw_devices; i++) {
joystick_state[c].axis[d] = 0; PRID_DEVICE_INFO info = NULL;
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = 0; if (joysticks_present >= MAX_PLAT_JOYSTICKS)
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) break;
joystick_state[c].pov[d] = -1; if (deviceList[i].dwType != RIM_TYPEHID)
} continue;
}
/* Get device info: hardware IDs and usage IDs */
GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, NULL, &size);
info = malloc(size);
info->cbSize = sizeof(RID_DEVICE_INFO);
if (GetRawInputDeviceInfoA(deviceList[i].hDevice, RIDI_DEVICEINFO, info, &size) <= 0)
goto end_loop;
/* If this is not a joystick/gamepad, skip */
if (info->hid.usUsagePage != HID_USAGE_PAGE_GENERIC)
goto end_loop;
if (info->hid.usUsage != HID_USAGE_GENERIC_JOYSTICK && info->hid.usUsage != HID_USAGE_GENERIC_GAMEPAD)
goto end_loop;
plat_joystick_t *joy = &plat_joystick_state[joysticks_present];
raw_joystick_t *rawjoy = &raw_joystick_state[joysticks_present];
rawjoy->hdevice = deviceList[i].hDevice;
joystick_get_capabilities(rawjoy, joy);
joystick_get_device_name(rawjoy, joy, info);
joystick_log("joystick_init: %s - %d buttons, %d axes, %d POVs\n",
joy->name, joy->nr_buttons, joy->nr_axes, joy->nr_povs);
joysticks_present++;
end_loop:
free(info);
}
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
/* Initialize the RawInput (joystick and gamepad) module. */
RAWINPUTDEVICE ridev[2];
ridev[0].dwFlags = 0;
ridev[0].hwndTarget = NULL;
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
ridev[1].dwFlags = 0;
ridev[1].hwndTarget = NULL;
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
if (!RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE)))
fatal("plat_joystick_init: RegisterRawInputDevices failed\n");
}
void
joystick_close()
{
RAWINPUTDEVICE ridev[2];
ridev[0].dwFlags = RIDEV_REMOVE;
ridev[0].hwndTarget = NULL;
ridev[0].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[0].usUsage = HID_USAGE_GENERIC_JOYSTICK;
ridev[1].dwFlags = RIDEV_REMOVE;
ridev[1].hwndTarget = NULL;
ridev[1].usUsagePage = HID_USAGE_PAGE_GENERIC;
ridev[1].usUsage = HID_USAGE_GENERIC_GAMEPAD;
RegisterRawInputDevices(ridev, 2, sizeof(RAWINPUTDEVICE));
}
void
win_joystick_handle(PRAWINPUT raw)
{
HRESULT r;
int j = -1; /* current joystick index, -1 when not found */
/* If the input is not from a known device, we ignore it */
for (int i = 0; i < joysticks_present; i++) {
if (raw_joystick_state[i].hdevice == raw->header.hDevice) {
j = i;
break;
}
}
if (j == -1)
return;
/* Read buttons */
USAGE usage_list[128] = { 0 };
ULONG usage_length = plat_joystick_state[j].nr_buttons;
memset(plat_joystick_state[j].b, 0, 32 * sizeof(int));
r = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usage_list, &usage_length,
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS) {
for (int i = 0; i < usage_length; i++) {
int button = raw_joystick_state[j].usage_button[usage_list[i]];
plat_joystick_state[j].b[button] = 128;
}
}
/* Read axes */
for (int a = 0; a < plat_joystick_state[j].nr_axes; a++) {
struct raw_axis_t *axis = &raw_joystick_state[j].axis[a];
ULONG uvalue = 0;
LONG value = 0;
LONG center = (axis->max - axis->min + 1) / 2;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, axis->link, axis->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS) {
if (axis->min < 0) {
/* extend signed uvalue to LONG */
if (uvalue & (1 << (axis->bitsize - 1))) {
ULONG mask = (1 << axis->bitsize) - 1;
value = -1U ^ mask;
value |= uvalue;
} else {
value = uvalue;
}
} else {
/* Assume unsigned when min >= 0, convert to a signed value */
value = (LONG) uvalue - center;
}
if (abs(value) == 1)
value = 0;
value = value * 32768 / center;
}
plat_joystick_state[j].a[a] = value;
// joystick_log("%s %-06d ", plat_joystick_state[j].axis[a].name, plat_joystick_state[j].a[a]);
}
/* read povs */
for (int p = 0; p < plat_joystick_state[j].nr_povs; p++) {
struct raw_pov_t *pov = &raw_joystick_state[j].pov[p];
ULONG uvalue = 0;
LONG value = -1;
r = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, pov->link, pov->usage, &uvalue,
raw_joystick_state[j].data, (PCHAR) raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
if (r == HIDP_STATUS_SUCCESS && (uvalue >= pov->min && uvalue <= pov->max)) {
value = (uvalue - pov->min) * 36000;
value /= (pov->max - pov->min + 1);
value %= 36000;
}
plat_joystick_state[j].p[p] = value;
// joystick_log("%s %-3d ", plat_joystick_state[j].pov[p].name, plat_joystick_state[j].p[p]);
}
// joystick_log("\n");
}
static int
joystick_get_axis(int joystick_nr, int mapping)
{
if (mapping & POV_X) {
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF)
return 0;
else
return sin((2 * M_PI * (double) pov) / 36000.0) * 32767;
} else if (mapping & POV_Y) {
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF)
return 0;
else
return -cos((2 * M_PI * (double) pov) / 36000.0) * 32767;
} else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
}
void
joystick_process(void)
{
int c, d;
if (joystick_type == 7)
return;
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
if (joystick_state[c].plat_joystick_nr) {
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
int x, y;
double angle, magnitude;
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
angle = (atan2((double) y, (double) x) * 360.0) / (2 * M_PI);
magnitude = sqrt((double) x * (double) x + (double) y * (double) y);
if (magnitude < 16384)
joystick_state[c].pov[d] = -1;
else
joystick_state[c].pov[d] = ((int) angle + 90 + 360) % 360;
}
} else {
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].axis[d] = 0;
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = 0;
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
joystick_state[c].pov[d] = -1;
}
}
} }

View File

@@ -32,233 +32,234 @@
#include <86box/win.h> #include <86box/win.h>
#define XINPUT_MAX_JOYSTICKS 4 #define XINPUT_MAX_JOYSTICKS 4
#define XINPUT_NAME "Xinput compatiable controller" #define XINPUT_NAME "Xinput compatiable controller"
#define XINPUT_NAME_LX "Left Stick X" #define XINPUT_NAME_LX "Left Stick X"
#define XINPUT_NAME_LY "Left Stick Y" #define XINPUT_NAME_LY "Left Stick Y"
#define XINPUT_NAME_RX "Right Stick X" #define XINPUT_NAME_RX "Right Stick X"
#define XINPUT_NAME_RY "Right Stick Y" #define XINPUT_NAME_RY "Right Stick Y"
#define XINPUT_NAME_DPAD_X "D-pad X" #define XINPUT_NAME_DPAD_X "D-pad X"
#define XINPUT_NAME_DPAD_Y "D-pad Y" #define XINPUT_NAME_DPAD_Y "D-pad Y"
#define XINPUT_NAME_LB "LB" #define XINPUT_NAME_LB "LB"
#define XINPUT_NAME_RB "RB" #define XINPUT_NAME_RB "RB"
#define XINPUT_NAME_LT "LT" #define XINPUT_NAME_LT "LT"
#define XINPUT_NAME_RT "RT" #define XINPUT_NAME_RT "RT"
#define XINPUT_NAME_A "A" #define XINPUT_NAME_A "A"
#define XINPUT_NAME_B "B" #define XINPUT_NAME_B "B"
#define XINPUT_NAME_X "X" #define XINPUT_NAME_X "X"
#define XINPUT_NAME_Y "Y" #define XINPUT_NAME_Y "Y"
#define XINPUT_NAME_BACK "Back/View" #define XINPUT_NAME_BACK "Back/View"
#define XINPUT_NAME_START "Start/Menu" #define XINPUT_NAME_START "Start/Menu"
#define XINPUT_NAME_LS "Left Stick" #define XINPUT_NAME_LS "Left Stick"
#define XINPUT_NAME_RS "Right Stick" #define XINPUT_NAME_RS "Right Stick"
#ifdef ENABLE_JOYSTICK_LOG #ifdef ENABLE_JOYSTICK_LOG
int joystick_do_log = ENABLE_JOYSTICK_LOG; int joystick_do_log = ENABLE_JOYSTICK_LOG;
static void static void
joystick_log(const char *fmt, ...) joystick_log(const char *fmt, ...)
{ {
va_list ap; va_list ap;
if (joystick_do_log) { if (joystick_do_log) {
va_start(ap, fmt); va_start(ap, fmt);
pclog_ex(fmt, ap); pclog_ex(fmt, ap);
va_end(ap); va_end(ap);
} }
} }
#else #else
#define joystick_log(fmt, ...) # define joystick_log(fmt, ...)
#endif #endif
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
joystick_t joystick_state[MAX_JOYSTICKS]; joystick_t joystick_state[MAX_JOYSTICKS];
int joysticks_present = 0; int joysticks_present = 0;
XINPUT_STATE controllers[XINPUT_MAX_JOYSTICKS]; XINPUT_STATE controllers[XINPUT_MAX_JOYSTICKS];
void joystick_init() void
joystick_init()
{ {
int c; int c;
atexit(joystick_close); atexit(joystick_close);
joysticks_present = 0; joysticks_present = 0;
memset(controllers, 0, sizeof(XINPUT_STATE) * XINPUT_MAX_JOYSTICKS); memset(controllers, 0, sizeof(XINPUT_STATE) * XINPUT_MAX_JOYSTICKS);
for (c=0; c<XINPUT_MAX_JOYSTICKS; c++) { for (c = 0; c < XINPUT_MAX_JOYSTICKS; c++) {
int value = XInputGetState(c, &controllers[c]); int value = XInputGetState(c, &controllers[c]);
if (value != ERROR_SUCCESS) continue; if (value != ERROR_SUCCESS)
memcpy(plat_joystick_state[c].name, XINPUT_NAME, sizeof(XINPUT_NAME)); continue;
memcpy(plat_joystick_state[c].name, XINPUT_NAME, sizeof(XINPUT_NAME));
plat_joystick_state[c].nr_axes = 8; plat_joystick_state[c].nr_axes = 8;
/* analog stick */ /* analog stick */
memcpy(plat_joystick_state[c].axis[0].name, XINPUT_NAME_LX, sizeof(XINPUT_NAME_LX)); memcpy(plat_joystick_state[c].axis[0].name, XINPUT_NAME_LX, sizeof(XINPUT_NAME_LX));
plat_joystick_state[c].axis[0].id = 0; /* X axis */ plat_joystick_state[c].axis[0].id = 0; /* X axis */
memcpy(plat_joystick_state[c].axis[1].name, XINPUT_NAME_LY, sizeof(XINPUT_NAME_LY)); memcpy(plat_joystick_state[c].axis[1].name, XINPUT_NAME_LY, sizeof(XINPUT_NAME_LY));
plat_joystick_state[c].axis[1].id = 1; /* Y axis */ plat_joystick_state[c].axis[1].id = 1; /* Y axis */
memcpy(plat_joystick_state[c].axis[2].name, XINPUT_NAME_RX, sizeof(XINPUT_NAME_RX)); memcpy(plat_joystick_state[c].axis[2].name, XINPUT_NAME_RX, sizeof(XINPUT_NAME_RX));
plat_joystick_state[c].axis[2].id = 3; /* RX axis */ plat_joystick_state[c].axis[2].id = 3; /* RX axis */
memcpy(plat_joystick_state[c].axis[3].name, XINPUT_NAME_RY, sizeof(XINPUT_NAME_RY)); memcpy(plat_joystick_state[c].axis[3].name, XINPUT_NAME_RY, sizeof(XINPUT_NAME_RY));
plat_joystick_state[c].axis[3].id = 4; /* RY axis */ plat_joystick_state[c].axis[3].id = 4; /* RY axis */
/* d-pad, assigned to Z and RZ */ /* d-pad, assigned to Z and RZ */
memcpy(plat_joystick_state[c].axis[4].name, XINPUT_NAME_DPAD_X, sizeof(XINPUT_NAME_DPAD_X)); memcpy(plat_joystick_state[c].axis[4].name, XINPUT_NAME_DPAD_X, sizeof(XINPUT_NAME_DPAD_X));
plat_joystick_state[c].axis[4].id = 2; plat_joystick_state[c].axis[4].id = 2;
memcpy(plat_joystick_state[c].axis[5].name, XINPUT_NAME_DPAD_Y, sizeof(XINPUT_NAME_DPAD_Y)); memcpy(plat_joystick_state[c].axis[5].name, XINPUT_NAME_DPAD_Y, sizeof(XINPUT_NAME_DPAD_Y));
plat_joystick_state[c].axis[5].id = 5; plat_joystick_state[c].axis[5].id = 5;
/* Analog trigger */ /* Analog trigger */
memcpy(plat_joystick_state[c].axis[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT)); memcpy(plat_joystick_state[c].axis[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
plat_joystick_state[c].axis[6].id = 6; plat_joystick_state[c].axis[6].id = 6;
memcpy(plat_joystick_state[c].axis[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT)); memcpy(plat_joystick_state[c].axis[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
plat_joystick_state[c].axis[7].id = 7; plat_joystick_state[c].axis[7].id = 7;
plat_joystick_state[c].nr_buttons = 12; plat_joystick_state[c].nr_buttons = 12;
memcpy(plat_joystick_state[c].button[0].name, XINPUT_NAME_A, sizeof(XINPUT_NAME_A)); memcpy(plat_joystick_state[c].button[0].name, XINPUT_NAME_A, sizeof(XINPUT_NAME_A));
memcpy(plat_joystick_state[c].button[1].name, XINPUT_NAME_B, sizeof(XINPUT_NAME_B)); memcpy(plat_joystick_state[c].button[1].name, XINPUT_NAME_B, sizeof(XINPUT_NAME_B));
memcpy(plat_joystick_state[c].button[2].name, XINPUT_NAME_X, sizeof(XINPUT_NAME_X)); memcpy(plat_joystick_state[c].button[2].name, XINPUT_NAME_X, sizeof(XINPUT_NAME_X));
memcpy(plat_joystick_state[c].button[3].name, XINPUT_NAME_Y, sizeof(XINPUT_NAME_Y)); memcpy(plat_joystick_state[c].button[3].name, XINPUT_NAME_Y, sizeof(XINPUT_NAME_Y));
memcpy(plat_joystick_state[c].button[4].name, XINPUT_NAME_LB, sizeof(XINPUT_NAME_LB)); memcpy(plat_joystick_state[c].button[4].name, XINPUT_NAME_LB, sizeof(XINPUT_NAME_LB));
memcpy(plat_joystick_state[c].button[5].name, XINPUT_NAME_RB, sizeof(XINPUT_NAME_RB)); memcpy(plat_joystick_state[c].button[5].name, XINPUT_NAME_RB, sizeof(XINPUT_NAME_RB));
memcpy(plat_joystick_state[c].button[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT)); memcpy(plat_joystick_state[c].button[6].name, XINPUT_NAME_LT, sizeof(XINPUT_NAME_LT));
memcpy(plat_joystick_state[c].button[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT)); memcpy(plat_joystick_state[c].button[7].name, XINPUT_NAME_RT, sizeof(XINPUT_NAME_RT));
memcpy(plat_joystick_state[c].button[8].name, XINPUT_NAME_BACK, sizeof(XINPUT_NAME_BACK)); memcpy(plat_joystick_state[c].button[8].name, XINPUT_NAME_BACK, sizeof(XINPUT_NAME_BACK));
memcpy(plat_joystick_state[c].button[9].name, XINPUT_NAME_START, sizeof(XINPUT_NAME_START)); memcpy(plat_joystick_state[c].button[9].name, XINPUT_NAME_START, sizeof(XINPUT_NAME_START));
memcpy(plat_joystick_state[c].button[10].name, XINPUT_NAME_LS, sizeof(XINPUT_NAME_LS)); memcpy(plat_joystick_state[c].button[10].name, XINPUT_NAME_LS, sizeof(XINPUT_NAME_LS));
memcpy(plat_joystick_state[c].button[11].name, XINPUT_NAME_RS, sizeof(XINPUT_NAME_RS)); memcpy(plat_joystick_state[c].button[11].name, XINPUT_NAME_RS, sizeof(XINPUT_NAME_RS));
plat_joystick_state[c].nr_povs = 0; plat_joystick_state[c].nr_povs = 0;
joysticks_present++; joysticks_present++;
} }
joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present); joystick_log("joystick_init: joysticks_present=%i\n", joysticks_present);
} }
void joystick_close() void
joystick_close()
{ {
} }
void joystick_poll(void) void
joystick_poll(void)
{ {
for (int c=0; c<joysticks_present; c++) { for (int c = 0; c < joysticks_present; c++) {
int value = XInputGetState(c, &controllers[c]); int value = XInputGetState(c, &controllers[c]);
if (value != ERROR_SUCCESS) continue; if (value != ERROR_SUCCESS)
continue;
plat_joystick_state[c].a[0] = controllers[c].Gamepad.sThumbLX; plat_joystick_state[c].a[0] = controllers[c].Gamepad.sThumbLX;
plat_joystick_state[c].a[1] = - controllers[c].Gamepad.sThumbLY; plat_joystick_state[c].a[1] = -controllers[c].Gamepad.sThumbLY;
plat_joystick_state[c].a[3] = controllers[c].Gamepad.sThumbRX; plat_joystick_state[c].a[3] = controllers[c].Gamepad.sThumbRX;
plat_joystick_state[c].a[4] = - controllers[c].Gamepad.sThumbRY; plat_joystick_state[c].a[4] = -controllers[c].Gamepad.sThumbRY;
plat_joystick_state[c].a[6] = (double)controllers[c].Gamepad.bLeftTrigger / 255 * 32767; plat_joystick_state[c].a[6] = (double) controllers[c].Gamepad.bLeftTrigger / 255 * 32767;
plat_joystick_state[c].a[7] = (double)controllers[c].Gamepad.bRightTrigger / 255 * 32767; plat_joystick_state[c].a[7] = (double) controllers[c].Gamepad.bRightTrigger / 255 * 32767;
plat_joystick_state[c].b[0] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 128 : 0; plat_joystick_state[c].b[0] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 128 : 0;
plat_joystick_state[c].b[1] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 128 : 0; plat_joystick_state[c].b[1] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 128 : 0;
plat_joystick_state[c].b[2] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 128 : 0; plat_joystick_state[c].b[2] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 128 : 0;
plat_joystick_state[c].b[3] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 128 : 0; plat_joystick_state[c].b[3] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 128 : 0;
plat_joystick_state[c].b[4] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 128 : 0; plat_joystick_state[c].b[4] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 128 : 0;
plat_joystick_state[c].b[5] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 128 : 0; plat_joystick_state[c].b[5] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 128 : 0;
plat_joystick_state[c].b[6] = (controllers[c].Gamepad.bLeftTrigger > 127) ? 128 : 0; plat_joystick_state[c].b[6] = (controllers[c].Gamepad.bLeftTrigger > 127) ? 128 : 0;
plat_joystick_state[c].b[7] = (controllers[c].Gamepad.bRightTrigger > 127) ? 128 : 0; plat_joystick_state[c].b[7] = (controllers[c].Gamepad.bRightTrigger > 127) ? 128 : 0;
plat_joystick_state[c].b[8] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 128 : 0; plat_joystick_state[c].b[8] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 128 : 0;
plat_joystick_state[c].b[9] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 128 : 0; plat_joystick_state[c].b[9] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 128 : 0;
plat_joystick_state[c].b[10] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 128 : 0; plat_joystick_state[c].b[10] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 128 : 0;
plat_joystick_state[c].b[11] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 128 : 0; plat_joystick_state[c].b[11] = (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 128 : 0;
int dpad_x = 0, dpad_y = 0; int dpad_x = 0, dpad_y = 0;
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
dpad_y-=32767; dpad_y -= 32767;
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
dpad_y+=32767; dpad_y += 32767;
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)
dpad_x-=32767; dpad_x -= 32767;
if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) if (controllers[c].Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)
dpad_x+=32767; dpad_x += 32767;
plat_joystick_state[c].a[2] = dpad_x; plat_joystick_state[c].a[2] = dpad_x;
plat_joystick_state[c].a[5] = dpad_y; plat_joystick_state[c].a[5] = dpad_y;
for (int a=0; a<8; a++) { for (int a = 0; a < 8; a++) {
if (plat_joystick_state[c].a[a] == -32768) if (plat_joystick_state[c].a[a] == -32768)
plat_joystick_state[c].a[a] = -32767; plat_joystick_state[c].a[a] = -32767;
if (plat_joystick_state[c].a[a] == 32768) if (plat_joystick_state[c].a[a] == 32768)
plat_joystick_state[c].a[a] = 32767; plat_joystick_state[c].a[a] = 32767;
}
} }
}
} }
static int joystick_get_axis(int joystick_nr, int mapping) static int
joystick_get_axis(int joystick_nr, int mapping)
{ {
if (mapping & POV_X) if (mapping & POV_X) {
{ int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF) if (LOWORD(pov) == 0xFFFF)
return 0; return 0;
else
return sin((2*M_PI * (double)pov) / 36000.0) * 32767;
}
else if (mapping & POV_Y)
{
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF)
return 0;
else
return -cos((2*M_PI * (double)pov) / 36000.0) * 32767;
}
else else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id]; return sin((2 * M_PI * (double) pov) / 36000.0) * 32767;
} else if (mapping & POV_Y) {
int pov = plat_joystick_state[joystick_nr].p[mapping & 3];
if (LOWORD(pov) == 0xFFFF)
return 0;
else
return -cos((2 * M_PI * (double) pov) / 36000.0) * 32767;
} else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
} }
void joystick_process(void) void
joystick_process(void)
{ {
int c, d; int c, d;
if (!joystick_type) return; if (!joystick_type)
return;
joystick_poll(); joystick_poll();
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++) {
{ if (joystick_state[c].plat_joystick_nr) {
if (joystick_state[c].plat_joystick_nr) int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
{
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]); joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
for (d = 0; d < joystick_get_button_count(joystick_type); d++) for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]]; joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) for (d = 0; d < joystick_get_pov_count(joystick_type); d++) {
{ int x, y;
int x, y; double angle, magnitude;
double angle, magnitude;
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]); x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]); y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
angle = (atan2((double)y, (double)x) * 360.0) / (2*M_PI); angle = (atan2((double) y, (double) x) * 360.0) / (2 * M_PI);
magnitude = sqrt((double)x*(double)x + (double)y*(double)y); magnitude = sqrt((double) x * (double) x + (double) y * (double) y);
if (magnitude < 16384) if (magnitude < 16384)
joystick_state[c].pov[d] = -1; joystick_state[c].pov[d] = -1;
else
joystick_state[c].pov[d] = ((int)angle + 90 + 360) % 360;
}
}
else else
{ joystick_state[c].pov[d] = ((int) angle + 90 + 360) % 360;
for (d = 0; d < joystick_get_axis_count(joystick_type); d++) }
joystick_state[c].axis[d] = 0; } else {
for (d = 0; d < joystick_get_button_count(joystick_type); d++) for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].button[d] = 0; joystick_state[c].axis[d] = 0;
for (d = 0; d < joystick_get_pov_count(joystick_type); d++) for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].pov[d] = -1; joystick_state[c].button[d] = 0;
} for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
joystick_state[c].pov[d] = -1;
} }
}
} }
void win_joystick_handle(PRAWINPUT raw) {} void
win_joystick_handle(PRAWINPUT raw)
{
}

View File

@@ -14,151 +14,134 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/win.h> #include <86box/win.h>
static int joystick_nr; static int joystick_nr;
static int joystick_config_type; static int joystick_config_type;
#define AXIS_STRINGS_MAX 3 #define AXIS_STRINGS_MAX 3
static char *axis_strings[AXIS_STRINGS_MAX] = {"X Axis", "Y Axis", "Z Axis"}; static char *axis_strings[AXIS_STRINGS_MAX] = { "X Axis", "Y Axis", "Z Axis" };
static uint8_t joystickconfig_changed = 0; static uint8_t joystickconfig_changed = 0;
static void
static void rebuild_axis_button_selections(HWND hdlg) rebuild_axis_button_selections(HWND hdlg)
{ {
int id = IDC_CONFIG_BASE + 2; int id = IDC_CONFIG_BASE + 2;
HWND h; HWND h;
int joystick; int joystick;
int c, d; int c, d;
char s[269]; char s[269];
h = GetDlgItem(hdlg, IDC_CONFIG_BASE); h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
joystick = SendMessage(h, CB_GETCURSEL, 0, 0); joystick = SendMessage(h, CB_GETCURSEL, 0, 0);
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
{ int sel = c;
int sel = c;
h = GetDlgItem(hdlg, id); h = GetDlgItem(hdlg, id);
SendMessage(h, CB_RESETCONTENT, 0, 0); SendMessage(h, CB_RESETCONTENT, 0, 0);
if (joystick) if (joystick) {
{ for (d = 0; d < plat_joystick_state[joystick - 1].nr_axes; d++) {
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++) SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].axis[d].name);
{ if (c < AXIS_STRINGS_MAX) {
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name); if (!stricmp(axis_strings[c], plat_joystick_state[joystick - 1].axis[d].name))
if (c < AXIS_STRINGS_MAX) sel = d;
{
if (!stricmp(axis_strings[c], plat_joystick_state[joystick-1].axis[d].name))
sel = d;
}
}
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++)
{
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
}
for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++)
{
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick - 1].slider[d].name);
}
SendMessage(h, CB_SETCURSEL, sel, 0);
EnableWindow(h, TRUE);
} }
else }
EnableWindow(h, FALSE); for (d = 0; d < plat_joystick_state[joystick - 1].nr_povs; d++) {
sprintf(s, "%s (X axis)", plat_joystick_state[joystick - 1].pov[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick - 1].pov[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
}
for (d = 0; d < plat_joystick_state[joystick - 1].nr_sliders; d++) {
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].slider[d].name);
}
SendMessage(h, CB_SETCURSEL, sel, 0);
EnableWindow(h, TRUE);
} else
EnableWindow(h, FALSE);
id += 2; id += 2;
} }
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
{ h = GetDlgItem(hdlg, id);
h = GetDlgItem(hdlg, id); SendMessage(h, CB_RESETCONTENT, 0, 0);
SendMessage(h, CB_RESETCONTENT, 0, 0);
if (joystick) if (joystick) {
{ for (d = 0; d < plat_joystick_state[joystick - 1].nr_buttons; d++)
for (d = 0; d < plat_joystick_state[joystick-1].nr_buttons; d++) SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].button[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].button[d].name); SendMessage(h, CB_SETCURSEL, c, 0);
SendMessage(h, CB_SETCURSEL, c, 0); EnableWindow(h, TRUE);
EnableWindow(h, TRUE); } else
} EnableWindow(h, FALSE);
else
EnableWindow(h, FALSE);
id += 2; id += 2;
} }
for (c = 0; c < joystick_get_pov_count(joystick_config_type)*2; c++) for (c = 0; c < joystick_get_pov_count(joystick_config_type) * 2; c++) {
{ int sel = c;
int sel = c;
h = GetDlgItem(hdlg, id); h = GetDlgItem(hdlg, id);
SendMessage(h, CB_RESETCONTENT, 0, 0); SendMessage(h, CB_RESETCONTENT, 0, 0);
if (joystick) if (joystick) {
{ for (d = 0; d < plat_joystick_state[joystick - 1].nr_povs; d++) {
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++) sprintf(s, "%s (X axis)", plat_joystick_state[joystick - 1].pov[d].name);
{ SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name); sprintf(s, "%s (Y axis)", plat_joystick_state[joystick - 1].pov[d].name);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s); SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) s);
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name); }
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s); for (d = 0; d < plat_joystick_state[joystick - 1].nr_axes; d++) {
} SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[joystick - 1].axis[d].name);
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++) }
{ SendMessage(h, CB_SETCURSEL, sel, 0);
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name); EnableWindow(h, TRUE);
} } else
SendMessage(h, CB_SETCURSEL, sel, 0); EnableWindow(h, FALSE);
EnableWindow(h, TRUE);
}
else
EnableWindow(h, FALSE);
id += 2;
}
id += 2;
}
} }
static int get_axis(HWND hdlg, int id) static int
get_axis(HWND hdlg, int id)
{ {
HWND h = GetDlgItem(hdlg, id); HWND h = GetDlgItem(hdlg, id);
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0); int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_axes; int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_axes;
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs; int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs;
if (axis_sel < nr_axes) if (axis_sel < nr_axes)
return axis_sel; return axis_sel;
axis_sel -= nr_axes; axis_sel -= nr_axes;
if (axis_sel < nr_povs * 2) if (axis_sel < nr_povs * 2) {
{ if (axis_sel & 1)
if (axis_sel & 1) return POV_Y | (axis_sel >> 1);
return POV_Y | (axis_sel >> 1); else
else return POV_X | (axis_sel >> 1);
return POV_X | (axis_sel >> 1); }
} axis_sel -= nr_povs;
axis_sel -= nr_povs;
return SLIDER | (axis_sel >> 1); return SLIDER | (axis_sel >> 1);
} }
static int get_pov(HWND hdlg, int id) static int
get_pov(HWND hdlg, int id)
{ {
HWND h = GetDlgItem(hdlg, id); HWND h = GetDlgItem(hdlg, id);
int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0); int axis_sel = SendMessage(h, CB_GETCURSEL, 0, 0);
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_povs*2; int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr - 1].nr_povs * 2;
if (axis_sel < nr_povs) if (axis_sel < nr_povs) {
{ if (axis_sel & 1)
if (axis_sel & 1) return POV_Y | (axis_sel >> 1);
return POV_Y | (axis_sel >> 1); else
else return POV_X | (axis_sel >> 1);
return POV_X | (axis_sel >> 1); }
}
return axis_sel - nr_povs; return axis_sel - nr_povs;
} }
#if defined(__amd64__) || defined(__aarch64__) #if defined(__amd64__) || defined(__aarch64__)
@@ -168,175 +151,210 @@ static BOOL CALLBACK
#endif #endif
joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) joystickconfig_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
HWND h; HWND h;
int c; int c;
int id; int id;
int joystick; int joystick;
int nr_axes; int nr_axes;
int nr_povs; int nr_povs;
int mapping; int mapping;
switch (message) switch (message) {
{ case WM_INITDIALOG:
case WM_INITDIALOG: {
{ h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
h = GetDlgItem(hdlg, IDC_CONFIG_BASE); id = IDC_CONFIG_BASE + 2;
id = IDC_CONFIG_BASE + 2; joystick = joystick_state[joystick_nr].plat_joystick_nr;
joystick = joystick_state[joystick_nr].plat_joystick_nr;
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"None"); SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) "None");
for (c = 0; c < joysticks_present; c++) for (c = 0; c < joysticks_present; c++)
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[c].name); SendMessage(h, CB_ADDSTRING, 0, (LPARAM) (LPCSTR) plat_joystick_state[c].name);
SendMessage(h, CB_SETCURSEL, joystick, 0); SendMessage(h, CB_SETCURSEL, joystick, 0);
rebuild_axis_button_selections(hdlg);
if (joystick_state[joystick_nr].plat_joystick_nr) {
nr_axes = plat_joystick_state[joystick - 1].nr_axes;
nr_povs = plat_joystick_state[joystick - 1].nr_povs;
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
int mapping = joystick_state[joystick_nr].axis_mapping[c];
h = GetDlgItem(hdlg, id);
if (mapping & POV_X)
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3) * 2, 0);
else if (mapping & POV_Y)
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3) * 2 + 1, 0);
else if (mapping & SLIDER)
SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0);
else
SendMessage(h, CB_SETCURSEL, mapping, 0);
id += 2;
}
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
h = GetDlgItem(hdlg, id);
SendMessage(h, CB_SETCURSEL, joystick_state[joystick_nr].button_mapping[c], 0);
id += 2;
}
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++) {
h = GetDlgItem(hdlg, id);
mapping = joystick_state[joystick_nr].pov_mapping[c][0];
if (mapping & POV_X)
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2, 0);
else if (mapping & POV_Y)
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2 + 1, 0);
else
SendMessage(h, CB_SETCURSEL, mapping + nr_povs * 2, 0);
id += 2;
h = GetDlgItem(hdlg, id);
mapping = joystick_state[joystick_nr].pov_mapping[c][1];
if (mapping & POV_X)
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2, 0);
else if (mapping & POV_Y)
SendMessage(h, CB_SETCURSEL, (mapping & 3) * 2 + 1, 0);
else
SendMessage(h, CB_SETCURSEL, mapping + nr_povs * 2, 0);
id += 2;
}
}
}
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_CONFIG_BASE:
if (HIWORD(wParam) == CBN_SELCHANGE)
rebuild_axis_button_selections(hdlg); rebuild_axis_button_selections(hdlg);
break;
if (joystick_state[joystick_nr].plat_joystick_nr) case IDOK:
{ {
nr_axes = plat_joystick_state[joystick-1].nr_axes; id = IDC_CONFIG_BASE + 2;
nr_povs = plat_joystick_state[joystick-1].nr_povs;
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
{ joystick_state[joystick_nr].plat_joystick_nr = SendMessage(h, CB_GETCURSEL, 0, 0);
int mapping = joystick_state[joystick_nr].axis_mapping[c];
h = GetDlgItem(hdlg, id); if (joystick_state[joystick_nr].plat_joystick_nr) {
if (mapping & POV_X) for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++) {
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2, 0); joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id);
else if (mapping & POV_Y) id += 2;
SendMessage(h, CB_SETCURSEL, nr_axes + (mapping & 3)*2 + 1, 0); }
else if (mapping & SLIDER) for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
SendMessage(h, CB_SETCURSEL, nr_axes + nr_povs * 2 + (mapping & 3), 0); h = GetDlgItem(hdlg, id);
else joystick_state[joystick_nr].button_mapping[c] = SendMessage(h, CB_GETCURSEL, 0, 0);
SendMessage(h, CB_SETCURSEL, mapping, 0); id += 2;
id += 2; }
} for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) {
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++) h = GetDlgItem(hdlg, id);
{ joystick_state[joystick_nr].pov_mapping[c][0] = get_pov(hdlg, id);
h = GetDlgItem(hdlg, id); id += 2;
SendMessage(h, CB_SETCURSEL, joystick_state[joystick_nr].button_mapping[c], 0); h = GetDlgItem(hdlg, id);
id += 2; joystick_state[joystick_nr].pov_mapping[c][1] = get_pov(hdlg, id);
} id += 2;
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++) }
{
h = GetDlgItem(hdlg, id);
mapping = joystick_state[joystick_nr].pov_mapping[c][0];
if (mapping & POV_X)
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2, 0);
else if (mapping & POV_Y)
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
else
SendMessage(h, CB_SETCURSEL, mapping + nr_povs*2, 0);
id += 2;
h = GetDlgItem(hdlg, id);
mapping = joystick_state[joystick_nr].pov_mapping[c][1];
if (mapping & POV_X)
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2, 0);
else if (mapping & POV_Y)
SendMessage(h, CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
else
SendMessage(h, CB_SETCURSEL, mapping + nr_povs*2, 0);
id += 2;
}
} }
} }
return TRUE; joystickconfig_changed = 1;
EndDialog(hdlg, 0);
case WM_COMMAND: return TRUE;
switch (LOWORD(wParam)) case IDCANCEL:
{ joystickconfig_changed = 0;
case IDC_CONFIG_BASE: EndDialog(hdlg, 0);
if (HIWORD(wParam) == CBN_SELCHANGE) return TRUE;
rebuild_axis_button_selections(hdlg); }
break; break;
}
case IDOK: return FALSE;
{
id = IDC_CONFIG_BASE + 2;
h = GetDlgItem(hdlg, IDC_CONFIG_BASE);
joystick_state[joystick_nr].plat_joystick_nr = SendMessage(h, CB_GETCURSEL, 0, 0);
if (joystick_state[joystick_nr].plat_joystick_nr)
{
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
{
joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id);
id += 2;
}
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
{
h = GetDlgItem(hdlg, id);
joystick_state[joystick_nr].button_mapping[c] = SendMessage(h, CB_GETCURSEL, 0, 0);
id += 2;
}
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
{
h = GetDlgItem(hdlg, id);
joystick_state[joystick_nr].pov_mapping[c][0] = get_pov(hdlg, id);
id += 2;
h = GetDlgItem(hdlg, id);
joystick_state[joystick_nr].pov_mapping[c][1] = get_pov(hdlg, id);
id += 2;
}
}
}
joystickconfig_changed = 1;
EndDialog(hdlg, 0);
return TRUE;
case IDCANCEL:
joystickconfig_changed = 0;
EndDialog(hdlg, 0);
return TRUE;
}
break;
}
return FALSE;
} }
uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type) uint8_t
joystickconfig_open(HWND hwnd, int joy_nr, int type)
{ {
uint16_t *data_block = malloc(16384); uint16_t *data_block = malloc(16384);
uint16_t *data; uint16_t *data;
DLGTEMPLATE *dlg = (DLGTEMPLATE *)data_block; DLGTEMPLATE *dlg = (DLGTEMPLATE *) data_block;
DLGITEMTEMPLATE *item; DLGITEMTEMPLATE *item;
int y = 10; int y = 10;
int id = IDC_CONFIG_BASE; int id = IDC_CONFIG_BASE;
int c; int c;
char s[269]; char s[269];
joystickconfig_changed = 0; joystickconfig_changed = 0;
joystick_nr = joy_nr; joystick_nr = joy_nr;
joystick_config_type = type; joystick_config_type = type;
memset(data_block, 0, 4096); memset(data_block, 0, 4096);
dlg->style = DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU; dlg->style = DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU;
dlg->x = 10; dlg->x = 10;
dlg->y = 10; dlg->y = 10;
dlg->cx = 220; dlg->cx = 220;
dlg->cy = 70; dlg->cy = 70;
data = (uint16_t *)(dlg + 1); data = (uint16_t *) (dlg + 1);
*data++ = 0; /*no menu*/ *data++ = 0; /*no menu*/
*data++ = 0; /*predefined dialog box class*/ *data++ = 0; /*predefined dialog box class*/
data += MultiByteToWideChar(CP_ACP, 0, "Joystick Configuration", -1, data, 50); data += MultiByteToWideChar(CP_ACP, 0, "Joystick Configuration", -1, data, 50);
*data++ = 9; /*Point*/ *data++ = 9; /*Point*/
data += MultiByteToWideChar(CP_ACP, 0, "Segoe UI", -1, data, 50); data += MultiByteToWideChar(CP_ACP, 0, "Segoe UI", -1, data, 50);
if (((uintptr_t)data) & 2) if (((uintptr_t) data) & 2)
data++; data++;
/*Combo box*/
item = (DLGITEMTEMPLATE *) data;
item->x = 70;
item->y = y;
item->id = id++;
item->cx = 140;
item->cy = 150;
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t) data) & 2)
data++;
/*Static text*/
item = (DLGITEMTEMPLATE *) data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t) data) & 2)
data++;
y += 20;
for (c = 0; c < joystick_get_axis_count(type); c++) {
/*Combo box*/ /*Combo box*/
item = (DLGITEMTEMPLATE *)data; item = (DLGITEMTEMPLATE *) data;
item->x = 70; item->x = 70;
item->y = y; item->y = y;
item->id = id++; item->id = id++;
item->cx = 140; item->cx = 140;
@@ -344,20 +362,20 @@ uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type)
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
data = (uint16_t *)(item + 1); data = (uint16_t *) (item + 1);
*data++ = 0xFFFF; *data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */ *data++ = 0x0085; /* combo box class */
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256); data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */ *data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2) if (((uintptr_t) data) & 2)
data++; data++;
/*Static text*/ /*Static text*/
item = (DLGITEMTEMPLATE *)data; item = (DLGITEMTEMPLATE *) data;
item->x = 10; item->x = 10;
item->y = y + 2; item->y = y + 2;
item->id = id++; item->id = id++;
item->cx = 60; item->cx = 60;
@@ -365,204 +383,155 @@ uint8_t joystickconfig_open(HWND hwnd, int joy_nr, int type)
item->style = WS_CHILD | WS_VISIBLE; item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *)(item + 1); data = (uint16_t *) (item + 1);
*data++ = 0xFFFF; *data++ = 0xFFFF;
*data++ = 0x0082; /* static class */ *data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, "Device", -1, data, 256); data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */ *data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2) if (((uintptr_t) data) & 2)
data++; data++;
y += 20; y += 20;
}
for (c = 0; c < joystick_get_button_count(type); c++) {
/*Combo box*/
item = (DLGITEMTEMPLATE *) data;
item->x = 70;
item->y = y;
item->id = id++;
for (c = 0; c < joystick_get_axis_count(type); c++) item->cx = 140;
{ item->cy = 150;
/*Combo box*/
item = (DLGITEMTEMPLATE *)data;
item->x = 70;
item->y = y;
item->id = id++;
item->cx = 140; item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
item->cy = 150;
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL; data = (uint16_t *) (item + 1);
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
/*Static text*/
item = (DLGITEMTEMPLATE *)data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_axis_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
y += 20;
}
for (c = 0; c < joystick_get_button_count(type); c++)
{
/*Combo box*/
item = (DLGITEMTEMPLATE *)data;
item->x = 70;
item->y = y;
item->id = id++;
item->cx = 140;
item->cy = 150;
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
/*Static text*/
item = (DLGITEMTEMPLATE *)data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
y += 20;
}
for (c = 0; c < joystick_get_pov_count(type)*2; c++)
{
/*Combo box*/
item = (DLGITEMTEMPLATE *)data;
item->x = 70;
item->y = y;
item->id = id++;
item->cx = 140;
item->cy = 150;
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */
if (c & 1)
sprintf(s, "%s (Y axis)", joystick_get_pov_name(type, c/2));
else
sprintf(s, "%s (X axis)", joystick_get_pov_name(type, c/2));
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
/*Static text*/
item = (DLGITEMTEMPLATE *)data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF;
*data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2)
data++;
y += 20;
}
dlg->cdit = (id - IDC_CONFIG_BASE) + 2;
item = (DLGITEMTEMPLATE *)data;
item->x = 100;
item->y = y + 5;
item->cx = 50;
item->cy = 14;
item->id = IDOK; /* OK button identifier */
item->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
data = (uint16_t *)(item + 1);
*data++ = 0xFFFF; *data++ = 0xFFFF;
*data++ = 0x0080; /* button class */ *data++ = 0x0085; /* combo box class */
data += MultiByteToWideChar(CP_ACP, 0, "OK", -1, data, 50); data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */ *data++ = 0; /* no creation data */
if (((uintptr_t)data) & 2) if (((uintptr_t) data) & 2)
data++; data++;
/*Static text*/
item = (DLGITEMTEMPLATE *) data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item = (DLGITEMTEMPLATE *)data;
item->x = 160;
item->y = y + 5;
item->cx = 50;
item->cy = 14;
item->id = IDCANCEL; /* Cancel button identifier */
item->style = WS_CHILD | WS_VISIBLE; item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *)(item + 1); data = (uint16_t *) (item + 1);
*data++ = 0xFFFF; *data++ = 0xFFFF;
*data++ = 0x0080; /* button class */ *data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, "Cancel", -1, data, 50); data += MultiByteToWideChar(CP_ACP, 0, joystick_get_button_name(type, c), -1, data, 256);
*data++ = 0; /* no creation data */ *data++ = 0; /* no creation data */
dlg->cy = y + 25; if (((uintptr_t) data) & 2)
data++;
DialogBoxIndirect(hinstance, dlg, hwnd, joystickconfig_dlgproc); y += 20;
}
free(data_block); for (c = 0; c < joystick_get_pov_count(type) * 2; c++) {
/*Combo box*/
item = (DLGITEMTEMPLATE *) data;
item->x = 70;
item->y = y;
item->id = id++;
return joystickconfig_changed; item->cx = 140;
item->cy = 150;
item->style = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_VSCROLL;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0085; /* combo box class */
if (c & 1)
sprintf(s, "%s (Y axis)", joystick_get_pov_name(type, c / 2));
else
sprintf(s, "%s (X axis)", joystick_get_pov_name(type, c / 2));
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t) data) & 2)
data++;
/*Static text*/
item = (DLGITEMTEMPLATE *) data;
item->x = 10;
item->y = y + 2;
item->id = id++;
item->cx = 60;
item->cy = 15;
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0082; /* static class */
data += MultiByteToWideChar(CP_ACP, 0, s, -1, data, 256);
*data++ = 0; /* no creation data */
if (((uintptr_t) data) & 2)
data++;
y += 20;
}
dlg->cdit = (id - IDC_CONFIG_BASE) + 2;
item = (DLGITEMTEMPLATE *) data;
item->x = 100;
item->y = y + 5;
item->cx = 50;
item->cy = 14;
item->id = IDOK; /* OK button identifier */
item->style = WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0080; /* button class */
data += MultiByteToWideChar(CP_ACP, 0, "OK", -1, data, 50);
*data++ = 0; /* no creation data */
if (((uintptr_t) data) & 2)
data++;
item = (DLGITEMTEMPLATE *) data;
item->x = 160;
item->y = y + 5;
item->cx = 50;
item->cy = 14;
item->id = IDCANCEL; /* Cancel button identifier */
item->style = WS_CHILD | WS_VISIBLE;
data = (uint16_t *) (item + 1);
*data++ = 0xFFFF;
*data++ = 0x0080; /* button class */
data += MultiByteToWideChar(CP_ACP, 0, "Cancel", -1, data, 50);
*data++ = 0; /* no creation data */
dlg->cy = y + 25;
DialogBoxIndirect(hinstance, dlg, hwnd, joystickconfig_dlgproc);
free(data_block);
return joystickconfig_changed;
} }

View File

@@ -15,8 +15,8 @@
* Copyright 2016-2018 Miran Grca. * Copyright 2016-2018 Miran Grca.
*/ */
#define UNICODE #define UNICODE
#define _WIN32_WINNT 0x0501 #define _WIN32_WINNT 0x0501
#define BITMAP WINDOWS_BITMAP #define BITMAP WINDOWS_BITMAP
#include <windows.h> #include <windows.h>
#include <windowsx.h> #include <windowsx.h>
#undef BITMAP #undef BITMAP
@@ -30,9 +30,7 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/win.h> #include <86box/win.h>
static uint16_t scancode_map[768];
static uint16_t scancode_map[768];
/* This is so we can disambiguate scan codes that would otherwise conflict and get /* This is so we can disambiguate scan codes that would otherwise conflict and get
passed on incorrectly. */ passed on incorrectly. */
@@ -40,34 +38,33 @@ static UINT16
convert_scan_code(UINT16 scan_code) convert_scan_code(UINT16 scan_code)
{ {
if ((scan_code & 0xff00) == 0xe000) if ((scan_code & 0xff00) == 0xe000)
scan_code = (scan_code & 0xff) | 0x0100; scan_code = (scan_code & 0xff) | 0x0100;
if (scan_code == 0xE11D) if (scan_code == 0xE11D)
scan_code = 0x0100; scan_code = 0x0100;
/* E0 00 is sent by some USB keyboards for their special keys, as it is an /* E0 00 is sent by some USB keyboards for their special keys, as it is an
invalid scan code (it has no untranslated set 2 equivalent), we mark it invalid scan code (it has no untranslated set 2 equivalent), we mark it
appropriately so it does not get passed through. */ appropriately so it does not get passed through. */
else if ((scan_code > 0x01FF) || (scan_code == 0x0100)) else if ((scan_code > 0x01FF) || (scan_code == 0x0100))
scan_code = 0xFFFF; scan_code = 0xFFFF;
return scan_code; return scan_code;
} }
void void
keyboard_getkeymap(void) keyboard_getkeymap(void)
{ {
WCHAR *keyName = L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout"; WCHAR *keyName = L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout";
WCHAR *valueName = L"Scancode Map"; WCHAR *valueName = L"Scancode Map";
unsigned char buf[32768]; unsigned char buf[32768];
DWORD bufSize; DWORD bufSize;
HKEY hKey; HKEY hKey;
int j; int j;
UINT32 *bufEx2; UINT32 *bufEx2;
int scMapCount; int scMapCount;
UINT16 *bufEx; UINT16 *bufEx;
int scancode_unmapped; int scancode_unmapped;
int scancode_mapped; int scancode_mapped;
/* First, prepare the default scan code map list which is 1:1. /* First, prepare the default scan code map list which is 1:1.
* Remappings will be inserted directly into it. * Remappings will be inserted directly into it.
@@ -75,131 +72,124 @@ keyboard_getkeymap(void)
* prefix. * prefix.
*/ */
for (j = 0; j < 512; j++) for (j = 0; j < 512; j++)
scancode_map[j] = j; scancode_map[j] = j;
/* Get the scan code remappings from: /* Get the scan code remappings from:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout */ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout */
bufSize = 32768; bufSize = 32768;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, 1, &hKey) == ERROR_SUCCESS) { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyName, 0, 1, &hKey) == ERROR_SUCCESS) {
if (RegQueryValueEx(hKey, valueName, NULL, NULL, buf, &bufSize) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, valueName, NULL, NULL, buf, &bufSize) == ERROR_SUCCESS) {
bufEx2 = (UINT32 *) buf; bufEx2 = (UINT32 *) buf;
scMapCount = bufEx2[2]; scMapCount = bufEx2[2];
if ((bufSize != 0) && (scMapCount != 0)) { if ((bufSize != 0) && (scMapCount != 0)) {
bufEx = (UINT16 *) (buf + 12); bufEx = (UINT16 *) (buf + 12);
for (j = 0; j < scMapCount*2; j += 2) { for (j = 0; j < scMapCount * 2; j += 2) {
/* Each scan code is 32-bit: 16 bits of remapped scan code, /* Each scan code is 32-bit: 16 bits of remapped scan code,
and 16 bits of original scan code. */ and 16 bits of original scan code. */
scancode_unmapped = bufEx[j + 1]; scancode_unmapped = bufEx[j + 1];
scancode_mapped = bufEx[j]; scancode_mapped = bufEx[j];
scancode_unmapped = convert_scan_code(scancode_unmapped); scancode_unmapped = convert_scan_code(scancode_unmapped);
scancode_mapped = convert_scan_code(scancode_mapped); scancode_mapped = convert_scan_code(scancode_mapped);
/* Ignore source scan codes with prefixes other than E1 /* Ignore source scan codes with prefixes other than E1
that are not E1 1D. */ that are not E1 1D. */
if (scancode_unmapped != 0xFFFF) if (scancode_unmapped != 0xFFFF)
scancode_map[scancode_unmapped] = scancode_mapped; scancode_map[scancode_unmapped] = scancode_mapped;
} }
} }
} }
RegCloseKey(hKey); RegCloseKey(hKey);
} }
} }
void void
keyboard_handle(PRAWINPUT raw) keyboard_handle(PRAWINPUT raw)
{ {
USHORT scancode; USHORT scancode;
static int recv_lalt = 0, recv_ralt = 0, recv_tab = 0; static int recv_lalt = 0, recv_ralt = 0, recv_tab = 0;
RAWKEYBOARD rawKB = raw->data.keyboard; RAWKEYBOARD rawKB = raw->data.keyboard;
scancode = rawKB.MakeCode; scancode = rawKB.MakeCode;
if (kbd_req_capture && !mouse_capture && !video_fullscreen) if (kbd_req_capture && !mouse_capture && !video_fullscreen)
return; return;
/* If it's not a scan code that starts with 0xE1 */ /* If it's not a scan code that starts with 0xE1 */
if (!(rawKB.Flags & RI_KEY_E1)) { if (!(rawKB.Flags & RI_KEY_E1)) {
if (rawKB.Flags & RI_KEY_E0) if (rawKB.Flags & RI_KEY_E0)
scancode |= 0x100; scancode |= 0x100;
/* Translate the scan code to 9-bit */ /* Translate the scan code to 9-bit */
scancode = convert_scan_code(scancode); scancode = convert_scan_code(scancode);
/* Remap it according to the list from the Registry */ /* Remap it according to the list from the Registry */
if (scancode != scancode_map[scancode]) if (scancode != scancode_map[scancode])
pclog("Scan code remap: %03X -> %03X\n", scancode, scancode); pclog("Scan code remap: %03X -> %03X\n", scancode, scancode);
scancode = scancode_map[scancode]; scancode = scancode_map[scancode];
/* If it's not 0xFFFF, send it to the emulated /* If it's not 0xFFFF, send it to the emulated
keyboard. keyboard.
We use scan code 0xFFFF to mean a mapping that We use scan code 0xFFFF to mean a mapping that
has a prefix other than E0 and that is not E1 1D, has a prefix other than E0 and that is not E1 1D,
which is, for our purposes, invalid. */ which is, for our purposes, invalid. */
if ((scancode == 0x00F) && if ((scancode == 0x00F) && !(rawKB.Flags & RI_KEY_BREAK) && (recv_lalt || recv_ralt) && !mouse_capture) {
!(rawKB.Flags & RI_KEY_BREAK) && /* We received a TAB while ALT was pressed, while the mouse
(recv_lalt || recv_ralt) && is not captured, suppress the TAB and send an ALT key up. */
!mouse_capture) { if (recv_lalt) {
/* We received a TAB while ALT was pressed, while the mouse keyboard_input(0, 0x038);
is not captured, suppress the TAB and send an ALT key up. */ /* Extra key press and release so the guest is not stuck in the
if (recv_lalt) { menu bar. */
keyboard_input(0, 0x038); keyboard_input(1, 0x038);
/* Extra key press and release so the guest is not stuck in the keyboard_input(0, 0x038);
menu bar. */ recv_lalt = 0;
keyboard_input(1, 0x038); }
keyboard_input(0, 0x038); if (recv_ralt) {
recv_lalt = 0; keyboard_input(0, 0x138);
} /* Extra key press and release so the guest is not stuck in the
if (recv_ralt) { menu bar. */
keyboard_input(0, 0x138); keyboard_input(1, 0x138);
/* Extra key press and release so the guest is not stuck in the keyboard_input(0, 0x138);
menu bar. */ recv_ralt = 0;
keyboard_input(1, 0x138); }
keyboard_input(0, 0x138); } else if (((scancode == 0x038) || (scancode == 0x138)) && !(rawKB.Flags & RI_KEY_BREAK) && recv_tab && !mouse_capture) {
recv_ralt = 0; /* We received an ALT while TAB was pressed, while the mouse
} is not captured, suppress the ALT and send a TAB key up. */
} else if (((scancode == 0x038) || (scancode == 0x138)) && keyboard_input(0, 0x00F);
!(rawKB.Flags & RI_KEY_BREAK) && recv_tab = 0;
recv_tab && } else {
!mouse_capture) { switch (scancode) {
/* We received an ALT while TAB was pressed, while the mouse case 0x00F:
is not captured, suppress the ALT and send a TAB key up. */ recv_tab = !(rawKB.Flags & RI_KEY_BREAK);
keyboard_input(0, 0x00F); break;
recv_tab = 0; case 0x038:
} else { recv_lalt = !(rawKB.Flags & RI_KEY_BREAK);
switch(scancode) { break;
case 0x00F: case 0x138:
recv_tab = !(rawKB.Flags & RI_KEY_BREAK); recv_ralt = !(rawKB.Flags & RI_KEY_BREAK);
break; break;
case 0x038: }
recv_lalt = !(rawKB.Flags & RI_KEY_BREAK);
break;
case 0x138:
recv_ralt = !(rawKB.Flags & RI_KEY_BREAK);
break;
}
/* Translate right CTRL to left ALT if the user has so /* Translate right CTRL to left ALT if the user has so
chosen. */ chosen. */
if ((scancode == 0x11D) && rctrl_is_lalt) if ((scancode == 0x11D) && rctrl_is_lalt)
scancode = 0x038; scancode = 0x038;
/* Normal scan code pass through, pass it through as is if /* Normal scan code pass through, pass it through as is if
it's not an invalid scan code. */ it's not an invalid scan code. */
if (scancode != 0xFFFF) if (scancode != 0xFFFF)
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode); keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
} }
} else { } else {
if (rawKB.MakeCode == 0x1D) { if (rawKB.MakeCode == 0x1D) {
scancode = scancode_map[0x100]; /* Translate E1 1D to 0x100 (which would scancode = scancode_map[0x100]; /* Translate E1 1D to 0x100 (which would
otherwise be E0 00 but that is invalid otherwise be E0 00 but that is invalid
anyway). anyway).
Also, take a potential mapping into Also, take a potential mapping into
account. */ account. */
} else } else
scancode = 0xFFFF; scancode = 0xFFFF;
if (scancode != 0xFFFF) if (scancode != 0xFFFF)
keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode); keyboard_input(!(rawKB.Flags & RI_KEY_BREAK), scancode);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -27,14 +27,14 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/win.h> #include <86box/win.h>
int mouse_capture; int mouse_capture;
double mouse_sensitivity = 1.0; /* Unused. */ double mouse_sensitivity = 1.0; /* Unused. */
typedef struct { typedef struct {
int buttons; int buttons;
int dx; int dx;
int dy; int dy;
int dwheel; int dwheel;
} MOUSESTATE; } MOUSESTATE;
MOUSESTATE mousestate; MOUSESTATE mousestate;
@@ -46,70 +46,69 @@ win_mouse_init(void)
mouse_capture = 0; mouse_capture = 0;
/* Initialize the RawInput (mouse) module. */ /* Initialize the RawInput (mouse) module. */
RAWINPUTDEVICE ridev; RAWINPUTDEVICE ridev;
ridev.dwFlags = 0; ridev.dwFlags = 0;
ridev.hwndTarget = NULL; ridev.hwndTarget = NULL;
ridev.usUsagePage = 0x01; ridev.usUsagePage = 0x01;
ridev.usUsage = 0x02; ridev.usUsage = 0x02;
if (! RegisterRawInputDevices(&ridev, 1, sizeof(ridev))) if (!RegisterRawInputDevices(&ridev, 1, sizeof(ridev)))
fatal("plat_mouse_init: RegisterRawInputDevices failed\n"); fatal("plat_mouse_init: RegisterRawInputDevices failed\n");
memset(&mousestate, 0, sizeof(MOUSESTATE)); memset(&mousestate, 0, sizeof(MOUSESTATE));
} }
void void
win_mouse_handle(PRAWINPUT raw) win_mouse_handle(PRAWINPUT raw)
{ {
RAWMOUSE state = raw->data.mouse; RAWMOUSE state = raw->data.mouse;
static int x, y; static int x, y;
/* read mouse buttons and wheel */ /* read mouse buttons and wheel */
if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
mousestate.buttons |= 1; mousestate.buttons |= 1;
else if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) else if (state.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
mousestate.buttons &= ~1; mousestate.buttons &= ~1;
if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
mousestate.buttons |= 4; mousestate.buttons |= 4;
else if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) else if (state.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
mousestate.buttons &= ~4; mousestate.buttons &= ~4;
if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
mousestate.buttons |= 2; mousestate.buttons |= 2;
else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) else if (state.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
mousestate.buttons &= ~2; mousestate.buttons &= ~2;
if (state.usButtonFlags & RI_MOUSE_WHEEL) {
mousestate.dwheel += (SHORT)state.usButtonData / 120;
}
if (state.usButtonFlags & RI_MOUSE_WHEEL) {
mousestate.dwheel += (SHORT) state.usButtonData / 120;
}
if (state.usFlags & MOUSE_MOVE_ABSOLUTE) { if (state.usFlags & MOUSE_MOVE_ABSOLUTE) {
/* absolute mouse, i.e. RDP or VNC /* absolute mouse, i.e. RDP or VNC
* seems to work fine for RDP on Windows 10 * seems to work fine for RDP on Windows 10
* Not sure about other environments. * Not sure about other environments.
*/ */
mousestate.dx += (state.lLastX - x)/25; mousestate.dx += (state.lLastX - x) / 25;
mousestate.dy += (state.lLastY - y)/25; mousestate.dy += (state.lLastY - y) / 25;
x=state.lLastX; x = state.lLastX;
y=state.lLastY; y = state.lLastY;
} else { } else {
/* relative mouse, i.e. regular mouse */ /* relative mouse, i.e. regular mouse */
mousestate.dx += state.lLastX; mousestate.dx += state.lLastX;
mousestate.dy += state.lLastY; mousestate.dy += state.lLastY;
} }
} }
void void
win_mouse_close(void) win_mouse_close(void)
{ {
RAWINPUTDEVICE ridev; RAWINPUTDEVICE ridev;
ridev.dwFlags = RIDEV_REMOVE; ridev.dwFlags = RIDEV_REMOVE;
ridev.hwndTarget = NULL; ridev.hwndTarget = NULL;
ridev.usUsagePage = 0x01; ridev.usUsagePage = 0x01;
ridev.usUsage = 0x02; ridev.usUsage = 0x02;
RegisterRawInputDevices(&ridev, 1, sizeof(ridev)); RegisterRawInputDevices(&ridev, 1, sizeof(ridev));
} }
void void
@@ -117,21 +116,21 @@ mouse_poll(void)
{ {
static int b = 0; static int b = 0;
if (mouse_capture || video_fullscreen) { if (mouse_capture || video_fullscreen) {
if (mousestate.dx != 0 || mousestate.dy != 0 || mousestate.dwheel != 0) { if (mousestate.dx != 0 || mousestate.dy != 0 || mousestate.dwheel != 0) {
mouse_x += mousestate.dx; mouse_x += mousestate.dx;
mouse_y += mousestate.dy; mouse_y += mousestate.dy;
mouse_z = mousestate.dwheel; mouse_z = mousestate.dwheel;
mousestate.dx=0; mousestate.dx = 0;
mousestate.dy=0; mousestate.dy = 0;
mousestate.dwheel=0; mousestate.dwheel = 0;
//pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z); // pclog("dx=%d, dy=%d, dwheel=%d\n", mouse_x, mouse_y, mouse_z);
} }
if (b != mousestate.buttons) { if (b != mousestate.buttons) {
mouse_buttons = mousestate.buttons; mouse_buttons = mousestate.buttons;
b = mousestate.buttons; b = mousestate.buttons;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -27,12 +27,10 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/plat_dir.h> #include <86box/plat_dir.h>
#define SUFFIX "\\*"
#define SUFFIX "\\*" #define FINDATA struct _finddata_t
#define FINDATA struct _finddata_t #define FINDFIRST _findfirst
#define FINDFIRST _findfirst #define FINDNEXT _findnext
#define FINDNEXT _findnext
/* Open a directory. */ /* Open a directory. */
DIR * DIR *
@@ -43,17 +41,17 @@ opendir(const char *name)
/* Create a new control structure. */ /* Create a new control structure. */
p = (DIR *) malloc(sizeof(DIR)); p = (DIR *) malloc(sizeof(DIR));
if (p == NULL) if (p == NULL)
return(NULL); return (NULL);
memset(p, 0x00, sizeof(DIR)); memset(p, 0x00, sizeof(DIR));
p->flags = (DIR_F_LOWER | DIR_F_SANE); p->flags = (DIR_F_LOWER | DIR_F_SANE);
p->offset = 0; p->offset = 0;
p->sts = 0; p->sts = 0;
/* Create a work area. */ /* Create a work area. */
p->dta = (char *)malloc(sizeof(FINDATA)); p->dta = (char *) malloc(sizeof(FINDATA));
if (p->dta == NULL) { if (p->dta == NULL) {
free(p); free(p);
return(NULL); return (NULL);
} }
memset(p->dta, 0x00, sizeof(struct _finddata_t)); memset(p->dta, 0x00, sizeof(struct _finddata_t));
@@ -63,38 +61,36 @@ opendir(const char *name)
/* Special case: flag if we are in the root directory. */ /* Special case: flag if we are in the root directory. */
if (strlen(p->dir) == 3) if (strlen(p->dir) == 3)
p->flags |= DIR_F_ISROOT; p->flags |= DIR_F_ISROOT;
/* Start the searching by doing a FindFirst. */ /* Start the searching by doing a FindFirst. */
p->handle = FINDFIRST(p->dir, (FINDATA *)p->dta); p->handle = FINDFIRST(p->dir, (FINDATA *) p->dta);
if (p->handle < 0L) { if (p->handle < 0L) {
free(p->dta); free(p->dta);
free(p); free(p);
return(NULL); return (NULL);
} }
/* All OK. */ /* All OK. */
return(p); return (p);
} }
/* Close an open directory. */ /* Close an open directory. */
int int
closedir(DIR *p) closedir(DIR *p)
{ {
if (p == NULL) if (p == NULL)
return(0); return (0);
_findclose(p->handle); _findclose(p->handle);
if (p->dta != NULL) if (p->dta != NULL)
free(p->dta); free(p->dta);
free(p); free(p);
return(0); return (0);
} }
/* /*
* Read the next entry from a directory. * Read the next entry from a directory.
* Note that the DOS (FAT), Windows (FAT, FAT32) and Windows NTFS * Note that the DOS (FAT), Windows (FAT, FAT32) and Windows NTFS
@@ -108,26 +104,26 @@ readdir(DIR *p)
FINDATA *ffp; FINDATA *ffp;
if (p == NULL || p->sts == 1) if (p == NULL || p->sts == 1)
return(NULL); return (NULL);
/* Format structure with current data. */ /* Format structure with current data. */
ffp = (FINDATA *)p->dta; ffp = (FINDATA *) p->dta;
p->dent.d_ino = 1L; p->dent.d_ino = 1L;
p->dent.d_off = p->offset++; p->dent.d_off = p->offset++;
switch(p->offset) { switch (p->offset) {
case 1: /* . */ case 1: /* . */
strncpy(p->dent.d_name, ".", MAXNAMLEN+1); strncpy(p->dent.d_name, ".", MAXNAMLEN + 1);
p->dent.d_reclen = 1; p->dent.d_reclen = 1;
break; break;
case 2: /* .. */ case 2: /* .. */
strncpy(p->dent.d_name, "..", MAXNAMLEN+1); strncpy(p->dent.d_name, "..", MAXNAMLEN + 1);
p->dent.d_reclen = 2; p->dent.d_reclen = 2;
break; break;
default: /* regular entry. */ default: /* regular entry. */
strncpy(p->dent.d_name, ffp->name, MAXNAMLEN+1); strncpy(p->dent.d_name, ffp->name, MAXNAMLEN + 1);
p->dent.d_reclen = (char)strlen(p->dent.d_name); p->dent.d_reclen = (char) strlen(p->dent.d_name);
} }
/* Read next entry. */ /* Read next entry. */
@@ -135,48 +131,47 @@ readdir(DIR *p)
/* Fake the "." and ".." entries here.. */ /* Fake the "." and ".." entries here.. */
if ((p->flags & DIR_F_ISROOT) && (p->offset <= 2)) if ((p->flags & DIR_F_ISROOT) && (p->offset <= 2))
return(&(p->dent)); return (&(p->dent));
/* Get the next entry if we did not fake the above. */ /* Get the next entry if we did not fake the above. */
if (FINDNEXT(p->handle, ffp) < 0) if (FINDNEXT(p->handle, ffp) < 0)
p->sts = 1; p->sts = 1;
return(&(p->dent)); return (&(p->dent));
} }
/* Report current position within the directory. */ /* Report current position within the directory. */
long long
telldir(DIR *p) telldir(DIR *p)
{ {
return(p->offset); return (p->offset);
} }
void void
seekdir(DIR *p, long newpos) seekdir(DIR *p, long newpos)
{ {
short pos; short pos;
/* First off, rewind to start of directory. */ /* First off, rewind to start of directory. */
p->handle = FINDFIRST(p->dir, (FINDATA *)p->dta); p->handle = FINDFIRST(p->dir, (FINDATA *) p->dta);
if (p->handle < 0L) { if (p->handle < 0L) {
p->sts = 1; p->sts = 1;
return; return;
} }
p->offset = 0; p->offset = 0;
p->sts = 0; p->sts = 0;
/* If we are rewinding, that's all... */ /* If we are rewinding, that's all... */
if (newpos == 0L) return; if (newpos == 0L)
return;
/* Nope.. read entries until we hit the right spot. */ /* Nope.. read entries until we hit the right spot. */
pos = (short) newpos; pos = (short) newpos;
while (p->offset != pos) { while (p->offset != pos) {
p->offset++; p->offset++;
if (FINDNEXT(p->handle, (FINDATA *)p->dta) < 0) { if (FINDNEXT(p->handle, (FINDATA *) p->dta) < 0) {
p->sts = 1; p->sts = 1;
return; return;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -40,10 +40,10 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/win_opengl_glslp.h> #include <86box/win_opengl_glslp.h>
/** /**
* @brief Default vertex shader. * @brief Default vertex shader.
*/ */
static const GLchar* vertex_shader = "#version 130\n\ static const GLchar *vertex_shader = "#version 130\n\
in vec2 VertexCoord;\n\ in vec2 VertexCoord;\n\
in vec2 TexCoord;\n\ in vec2 TexCoord;\n\
out vec2 tex;\n\ out vec2 tex;\n\
@@ -55,7 +55,7 @@ void main(){\n\
/** /**
* @brief Default fragment shader. * @brief Default fragment shader.
*/ */
static const GLchar* fragment_shader = "#version 130\n\ static const GLchar *fragment_shader = "#version 130\n\
in vec2 tex;\n\ in vec2 tex;\n\
uniform sampler2D texsampler;\n\ uniform sampler2D texsampler;\n\
out vec4 color;\n\ out vec4 color;\n\
@@ -65,208 +65,204 @@ void main() {\n\
/** /**
* @brief OpenGL shader program build targets * @brief OpenGL shader program build targets
*/ */
typedef enum typedef enum {
{ OPENGL_BUILD_TARGET_VERTEX,
OPENGL_BUILD_TARGET_VERTEX, OPENGL_BUILD_TARGET_FRAGMENT,
OPENGL_BUILD_TARGET_FRAGMENT, OPENGL_BUILD_TARGET_LINK
OPENGL_BUILD_TARGET_LINK
} opengl_build_target_t; } opengl_build_target_t;
/** /**
* @brief Reads a whole file into a null terminated string. * @brief Reads a whole file into a null terminated string.
* @param Path Path to the file relative to executable path. * @param Path Path to the file relative to executable path.
* @return Pointer to the string or NULL on error. Remember to free() after use. * @return Pointer to the string or NULL on error. Remember to free() after use.
*/ */
static char* read_file_to_string(const char* path) static char *
read_file_to_string(const char *path)
{ {
FILE* file_handle = plat_fopen(path, "rb"); FILE *file_handle = plat_fopen(path, "rb");
if (file_handle != NULL) if (file_handle != NULL) {
{ /* get file size */
/* get file size */ fseek(file_handle, 0, SEEK_END);
fseek(file_handle, 0, SEEK_END);
size_t file_size = (size_t)ftell(file_handle); size_t file_size = (size_t) ftell(file_handle);
fseek(file_handle, 0, SEEK_SET); fseek(file_handle, 0, SEEK_SET);
/* read to buffer and close */ /* read to buffer and close */
char* content = (char*)malloc(sizeof(char) * (file_size + 1)); char *content = (char *) malloc(sizeof(char) * (file_size + 1));
if (!content) if (!content)
return NULL; return NULL;
size_t length = fread(content, sizeof(char), file_size, file_handle); size_t length = fread(content, sizeof(char), file_size, file_handle);
fclose(file_handle); fclose(file_handle);
content[length] = 0; content[length] = 0;
return content; return content;
} }
return NULL; return NULL;
} }
static int check_status(GLuint id, opengl_build_target_t build_target, const char* shader_path) static int
check_status(GLuint id, opengl_build_target_t build_target, const char *shader_path)
{ {
GLint status = GL_FALSE; GLint status = GL_FALSE;
if (build_target != OPENGL_BUILD_TARGET_LINK) if (build_target != OPENGL_BUILD_TARGET_LINK)
glGetShaderiv(id, GL_COMPILE_STATUS, &status); glGetShaderiv(id, GL_COMPILE_STATUS, &status);
else else
glGetProgramiv(id, GL_LINK_STATUS, &status); glGetProgramiv(id, GL_LINK_STATUS, &status);
if (status == GL_FALSE) if (status == GL_FALSE) {
{ int info_log_length;
int info_log_length;
if (build_target != OPENGL_BUILD_TARGET_LINK) if (build_target != OPENGL_BUILD_TARGET_LINK)
glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length); glGetShaderiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
else else
glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length); glGetProgramiv(id, GL_INFO_LOG_LENGTH, &info_log_length);
GLchar* info_log_text = (GLchar*)malloc(sizeof(GLchar) * info_log_length); GLchar *info_log_text = (GLchar *) malloc(sizeof(GLchar) * info_log_length);
if (build_target != OPENGL_BUILD_TARGET_LINK) if (build_target != OPENGL_BUILD_TARGET_LINK)
glGetShaderInfoLog(id, info_log_length, NULL, info_log_text); glGetShaderInfoLog(id, info_log_length, NULL, info_log_text);
else else
glGetProgramInfoLog(id, info_log_length, NULL, info_log_text); glGetProgramInfoLog(id, info_log_length, NULL, info_log_text);
const char* reason = NULL; const char *reason = NULL;
switch (build_target) switch (build_target) {
{ case OPENGL_BUILD_TARGET_VERTEX:
case OPENGL_BUILD_TARGET_VERTEX: reason = "compiling vertex shader";
reason = "compiling vertex shader"; break;
break; case OPENGL_BUILD_TARGET_FRAGMENT:
case OPENGL_BUILD_TARGET_FRAGMENT: reason = "compiling fragment shader";
reason = "compiling fragment shader"; break;
break; case OPENGL_BUILD_TARGET_LINK:
case OPENGL_BUILD_TARGET_LINK: reason = "linking shader program";
reason = "linking shader program"; break;
break; }
}
/* Shader compilation log can be lengthy, mark begin and end */ /* Shader compilation log can be lengthy, mark begin and end */
const char* line = "--------------------"; const char *line = "--------------------";
pclog("OpenGL: Error when %s in %s:\n%sBEGIN%s\n%s\n%s END %s\n", reason, shader_path, line, line, info_log_text, line, line); pclog("OpenGL: Error when %s in %s:\n%sBEGIN%s\n%s\n%s END %s\n", reason, shader_path, line, line, info_log_text, line, line);
free(info_log_text); free(info_log_text);
return 0; return 0;
} }
return 1; return 1;
} }
/** /**
* @brief Compile custom shaders into a program. * @brief Compile custom shaders into a program.
* @return Shader program identifier. * @return Shader program identifier.
*/ */
GLuint load_custom_shaders(const char* path) GLuint
load_custom_shaders(const char *path)
{ {
char* shader = read_file_to_string(path); char *shader = read_file_to_string(path);
if (shader != NULL) if (shader != NULL) {
{ int success = 1;
int success = 1;
const char* vertex_sources[3] = { "#version 130\n", "#define VERTEX\n", shader }; const char *vertex_sources[3] = { "#version 130\n", "#define VERTEX\n", shader };
const char* fragment_sources[3] = { "#version 130\n", "#define FRAGMENT\n", shader }; const char *fragment_sources[3] = { "#version 130\n", "#define FRAGMENT\n", shader };
/* Check if the shader program defines version directive */ /* Check if the shader program defines version directive */
char* version_start = strstr(shader, "#version"); char *version_start = strstr(shader, "#version");
/* If the shader program contains a version directive, /* If the shader program contains a version directive,
it must be captured and placed as the first statement. */ it must be captured and placed as the first statement. */
if (version_start != NULL) if (version_start != NULL) {
{ /* Version directive found, search the line end */
/* Version directive found, search the line end */ char *version_end = strchr(version_start, '\n');
char* version_end = strchr(version_start, '\n');
if (version_end != NULL) if (version_end != NULL) {
{ char version[30] = "";
char version[30] = "";
size_t version_len = MIN(version_end - version_start + 1, 29); size_t version_len = MIN(version_end - version_start + 1, 29);
strncat(version, version_start, version_len); strncat(version, version_start, version_len);
/* replace the default version directive */ /* replace the default version directive */
vertex_sources[0] = version; vertex_sources[0] = version;
fragment_sources[0] = version; fragment_sources[0] = version;
} }
/* Comment out the original version directive /* Comment out the original version directive
as only one is allowed. */ as only one is allowed. */
memset(version_start, '/', 2); memset(version_start, '/', 2);
} }
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER); GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER); GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertex_id, 3, vertex_sources, NULL); glShaderSource(vertex_id, 3, vertex_sources, NULL);
glCompileShader(vertex_id); glCompileShader(vertex_id);
success *= check_status(vertex_id, OPENGL_BUILD_TARGET_VERTEX, path); success *= check_status(vertex_id, OPENGL_BUILD_TARGET_VERTEX, path);
glShaderSource(fragment_id, 3, fragment_sources, NULL); glShaderSource(fragment_id, 3, fragment_sources, NULL);
glCompileShader(fragment_id); glCompileShader(fragment_id);
success *= check_status(fragment_id, OPENGL_BUILD_TARGET_FRAGMENT, path); success *= check_status(fragment_id, OPENGL_BUILD_TARGET_FRAGMENT, path);
free(shader); free(shader);
GLuint prog_id = 0; GLuint prog_id = 0;
if (success) if (success) {
{ prog_id = glCreateProgram();
prog_id = glCreateProgram();
glAttachShader(prog_id, vertex_id); glAttachShader(prog_id, vertex_id);
glAttachShader(prog_id, fragment_id); glAttachShader(prog_id, fragment_id);
glLinkProgram(prog_id); glLinkProgram(prog_id);
check_status(prog_id, OPENGL_BUILD_TARGET_LINK, path); check_status(prog_id, OPENGL_BUILD_TARGET_LINK, path);
glDetachShader(prog_id, vertex_id); glDetachShader(prog_id, vertex_id);
glDetachShader(prog_id, fragment_id); glDetachShader(prog_id, fragment_id);
} }
glDeleteShader(vertex_id); glDeleteShader(vertex_id);
glDeleteShader(fragment_id); glDeleteShader(fragment_id);
return prog_id; return prog_id;
} }
return 0; return 0;
} }
/** /**
* @brief Compile default shaders into a program. * @brief Compile default shaders into a program.
* @return Shader program identifier. * @return Shader program identifier.
*/ */
GLuint load_default_shaders() GLuint
load_default_shaders()
{ {
GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER); GLuint vertex_id = glCreateShader(GL_VERTEX_SHADER);
GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER); GLuint fragment_id = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertex_id, 1, &vertex_shader, NULL); glShaderSource(vertex_id, 1, &vertex_shader, NULL);
glCompileShader(vertex_id); glCompileShader(vertex_id);
glShaderSource(fragment_id, 1, &fragment_shader, NULL); glShaderSource(fragment_id, 1, &fragment_shader, NULL);
glCompileShader(fragment_id); glCompileShader(fragment_id);
GLuint prog_id = glCreateProgram(); GLuint prog_id = glCreateProgram();
glAttachShader(prog_id, vertex_id); glAttachShader(prog_id, vertex_id);
glAttachShader(prog_id, fragment_id); glAttachShader(prog_id, fragment_id);
glLinkProgram(prog_id); glLinkProgram(prog_id);
glDetachShader(prog_id, vertex_id); glDetachShader(prog_id, vertex_id);
glDetachShader(prog_id, fragment_id); glDetachShader(prog_id, fragment_id);
glDeleteShader(vertex_id); glDeleteShader(vertex_id);
glDeleteShader(fragment_id); glDeleteShader(fragment_id);
return prog_id; return prog_id;
} }

View File

@@ -35,7 +35,7 @@
/* Language */ /* Language */
static LCID temp_language; static LCID temp_language;
static char temp_icon_set[256] = {0}; static char temp_icon_set[256] = { 0 };
int enum_helper, c; int enum_helper, c;
@@ -44,112 +44,108 @@ HWND hwndPreferences;
BOOL CALLBACK BOOL CALLBACK
EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam) EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam)
{ {
wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1]; wchar_t temp[LOCALE_NAME_MAX_LENGTH + 1];
LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0); LCIDToLocaleName(wIDLanguage, temp, LOCALE_NAME_MAX_LENGTH, 0);
wchar_t dispname[MAX_PATH + 1]; wchar_t dispname[MAX_PATH + 1];
GetLocaleInfoEx(temp, LOCALE_SENGLISHDISPLAYNAME, dispname, MAX_PATH); GetLocaleInfoEx(temp, LOCALE_SENGLISHDISPLAYNAME, dispname, MAX_PATH);
SendMessage((HWND)lParam, CB_ADDSTRING, 0, (LPARAM)dispname); SendMessage((HWND) lParam, CB_ADDSTRING, 0, (LPARAM) dispname);
SendMessage((HWND)lParam, CB_SETITEMDATA, c, (LPARAM)wIDLanguage); SendMessage((HWND) lParam, CB_SETITEMDATA, c, (LPARAM) wIDLanguage);
if (wIDLanguage == lang_id) if (wIDLanguage == lang_id)
enum_helper = c; enum_helper = c;
c++; c++;
return 1; return 1;
} }
/* Load available languages */ /* Load available languages */
static void static void
preferences_fill_languages(HWND hdlg) preferences_fill_languages(HWND hdlg)
{ {
temp_language = GetThreadUILanguage(); temp_language = GetThreadUILanguage();
HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG); HWND lang_combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
SendMessage(lang_combo, CB_RESETCONTENT, 0, 0); SendMessage(lang_combo, CB_RESETCONTENT, 0, 0);
SendMessage(lang_combo, CB_ADDSTRING, 0, win_get_string(IDS_7168)); SendMessage(lang_combo, CB_ADDSTRING, 0, win_get_string(IDS_7168));
SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF); SendMessage(lang_combo, CB_SETITEMDATA, 0, 0xFFFF);
enum_helper = 0; c = 1; enum_helper = 0;
//if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0 c = 1;
//also start enum index from c=1 // if no one is selected, then it was 0xFFFF or unsupported language, in either case go with index enum_helper=0
EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM)lang_combo); // also start enum index from c=1
EnumResourceLanguages(hinstance, RT_MENU, L"MainMenu", &EnumResLangProc, (LPARAM) lang_combo);
SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0); SendMessage(lang_combo, CB_SETCURSEL, enum_helper, 0);
} }
/* Load available iconsets */ /* Load available iconsets */
static void static void
preferences_fill_iconsets(HWND hdlg) preferences_fill_iconsets(HWND hdlg)
{ {
HWND icon_combo = GetDlgItem(hdlg, IDC_COMBO_ICON); HWND icon_combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
/* Add the default one */ /* Add the default one */
wchar_t buffer[512] = L"("; wchar_t buffer[512] = L"(";
wcscat(buffer, plat_get_string(IDS_2090)); wcscat(buffer, plat_get_string(IDS_2090));
wcscat(buffer, L")"); wcscat(buffer, L")");
SendMessage(icon_combo, CB_RESETCONTENT, 0, 0); SendMessage(icon_combo, CB_RESETCONTENT, 0, 0);
SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM)buffer); SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM) buffer);
SendMessage(icon_combo, CB_SETITEMDATA, 0, (LPARAM)strdup("")); SendMessage(icon_combo, CB_SETITEMDATA, 0, (LPARAM) strdup(""));
int combo_index = -1; int combo_index = -1;
/* Find for extra ones */ /* Find for extra ones */
HANDLE hFind; HANDLE hFind;
WIN32_FIND_DATA data; WIN32_FIND_DATA data;
char icon_path_root[512]; char icon_path_root[512];
win_get_icons_path(icon_path_root); win_get_icons_path(icon_path_root);
wchar_t search[512]; wchar_t search[512];
mbstoc16s(search, icon_path_root, strlen(icon_path_root) + 1); mbstoc16s(search, icon_path_root, strlen(icon_path_root) + 1);
wcscat(search, L"*.*"); wcscat(search, L"*.*");
hFind = FindFirstFile((LPCWSTR)search, &data); hFind = FindFirstFile((LPCWSTR) search, &data);
if (hFind != INVALID_HANDLE_VALUE) { if (hFind != INVALID_HANDLE_VALUE) {
do { do {
if (wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..") && if (wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..") && (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) wchar_t temp[512] = { 0 }, dispname[512] = { 0 };
{ mbstoc16s(temp, icon_path_root, strlen(icon_path_root) + 1);
wchar_t temp[512] = {0}, dispname[512] = {0}; wcscat(temp, data.cFileName);
mbstoc16s(temp, icon_path_root, strlen(icon_path_root) + 1); wcscat(temp, L"\\iconinfo.txt");
wcscat(temp, data.cFileName);
wcscat(temp, L"\\iconinfo.txt");
wcscpy(dispname, data.cFileName); wcscpy(dispname, data.cFileName);
FILE *fp = _wfopen(temp, L"r"); FILE *fp = _wfopen(temp, L"r");
if (fp) if (fp) {
{ char line[512] = { 0 };
char line[512] = {0}; if (fgets(line, 511, fp)) {
if (fgets(line, 511, fp)) mbstoc16s(dispname, line, strlen(line) + 1);
{ }
mbstoc16s(dispname, line, strlen(line) + 1);
}
fclose(fp); fclose(fp);
} }
char filename[512]; char filename[512];
c16stombs(filename, data.cFileName, 511); c16stombs(filename, data.cFileName, 511);
int index = SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM)dispname); int index = SendMessage(icon_combo, CB_ADDSTRING, 0, (LPARAM) dispname);
SendMessage(icon_combo, CB_SETITEMDATA, index, (LPARAM)(strdup(filename))); SendMessage(icon_combo, CB_SETITEMDATA, index, (LPARAM) (strdup(filename)));
if (!strcmp(filename, icon_set)) if (!strcmp(filename, icon_set))
combo_index = index; combo_index = index;
} }
} while (FindNextFile(hFind, &data)); } while (FindNextFile(hFind, &data));
FindClose(hFind); FindClose(hFind);
} }
if (combo_index == -1) if (combo_index == -1) {
{ combo_index = 0;
combo_index = 0; strcpy(temp_icon_set, "");
strcpy(temp_icon_set, ""); }
}
SendMessage(icon_combo, CB_SETCURSEL, combo_index, 0); SendMessage(icon_combo, CB_SETCURSEL, combo_index, 0);
} }
/* This returns 1 if any variable has changed, 0 if not. */ /* This returns 1 if any variable has changed, 0 if not. */
@@ -209,85 +205,84 @@ static BOOL CALLBACK
PreferencesDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) PreferencesDlgProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch (message) { switch (message) {
case WM_INITDIALOG: case WM_INITDIALOG:
hwndPreferences = hdlg; hwndPreferences = hdlg;
/* Language */ /* Language */
temp_language = lang_id; temp_language = lang_id;
strcpy(temp_icon_set, icon_set); strcpy(temp_icon_set, icon_set);
preferences_fill_languages(hdlg); preferences_fill_languages(hdlg);
preferences_fill_iconsets(hdlg); preferences_fill_iconsets(hdlg);
break; break;
case WM_COMMAND: case WM_COMMAND:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDOK: case IDOK:
if (preferences_settings_changed()) if (preferences_settings_changed())
preferences_settings_save(); preferences_settings_save();
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
case IDCANCEL: case IDCANCEL:
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
case IDC_COMBO_LANG: case IDC_COMBO_LANG:
if (HIWORD(wParam) == CBN_SELCHANGE) { if (HIWORD(wParam) == CBN_SELCHANGE) {
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG); HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
int index = SendMessage(combo, CB_GETCURSEL, 0, 0); int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0); temp_language = SendMessage(combo, CB_GETITEMDATA, index, 0);
} }
break; break;
case IDC_COMBO_ICON: case IDC_COMBO_ICON:
if (HIWORD(wParam) == CBN_SELCHANGE) { if (HIWORD(wParam) == CBN_SELCHANGE) {
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON); HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
int index = SendMessage(combo, CB_GETCURSEL, 0, 0); int index = SendMessage(combo, CB_GETCURSEL, 0, 0);
strcpy(temp_icon_set, (char*)SendMessage(combo, CB_GETITEMDATA, index, 0)); strcpy(temp_icon_set, (char *) SendMessage(combo, CB_GETITEMDATA, index, 0));
} }
break; break;
case IDC_BUTTON_DEFAULT: { case IDC_BUTTON_DEFAULT:
HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG); {
int index = preferences_indexof(combo, DEFAULT_LANGUAGE); HWND combo = GetDlgItem(hdlg, IDC_COMBO_LANG);
SendMessage(combo, CB_SETCURSEL, index, 0); int index = preferences_indexof(combo, DEFAULT_LANGUAGE);
temp_language = DEFAULT_LANGUAGE; SendMessage(combo, CB_SETCURSEL, index, 0);
break; temp_language = DEFAULT_LANGUAGE;
} break;
}
case IDC_BUTTON_DEFICON: { case IDC_BUTTON_DEFICON:
SendMessage(GetDlgItem(hdlg, IDC_COMBO_ICON), CB_SETCURSEL, 0, 0); {
strcpy(temp_icon_set, ""); SendMessage(GetDlgItem(hdlg, IDC_COMBO_ICON), CB_SETCURSEL, 0, 0);
break; strcpy(temp_icon_set, "");
} break;
default: }
break; default:
} break;
break; }
break;
case WM_DESTROY: {
int i;
LRESULT temp;
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
for (i = 0; i < SendMessage(combo, CB_GETCOUNT, 0, 0); i++)
{
temp = SendMessage(combo, CB_GETITEMDATA, i, 0);
if (temp)
{
free((void*)temp);
SendMessage(combo, CB_SETITEMDATA, i, 0);
}
}
}
break;
case WM_DESTROY:
{
int i;
LRESULT temp;
HWND combo = GetDlgItem(hdlg, IDC_COMBO_ICON);
for (i = 0; i < SendMessage(combo, CB_GETCOUNT, 0, 0); i++) {
temp = SendMessage(combo, CB_GETITEMDATA, i, 0);
if (temp) {
free((void *) temp);
SendMessage(combo, CB_SETITEMDATA, i, 0);
}
}
}
break;
} }
return(FALSE); return (FALSE);
} }
void void
PreferencesDlgCreate(HWND hwnd) PreferencesDlgCreate(HWND hwnd)
{ {
DialogBox(hinstance, (LPCTSTR)DLG_PREFERENCES, hwnd, PreferencesDlgProcedure); DialogBox(hinstance, (LPCTSTR) DLG_PREFERENCES, hwnd, PreferencesDlgProcedure);
} }

View File

@@ -72,48 +72,45 @@
#include <86box/win_sdl.h> #include <86box/win_sdl.h>
#include <86box/version.h> #include <86box/version.h>
#define RENDERER_FULL_SCREEN 1
#define RENDERER_HARDWARE 2
#define RENDERER_OPENGL 4
#define RENDERER_FULL_SCREEN 1 static SDL_Window *sdl_win = NULL;
#define RENDERER_HARDWARE 2 static SDL_Renderer *sdl_render = NULL;
#define RENDERER_OPENGL 4 static SDL_Texture *sdl_tex = NULL;
static HWND sdl_parent_hwnd = NULL;
static int sdl_w, sdl_h;
static SDL_Window *sdl_win = NULL; static int sdl_fs, sdl_flags = -1;
static SDL_Renderer *sdl_render = NULL; static int cur_w, cur_h;
static SDL_Texture *sdl_tex = NULL; static int cur_wx = 0, cur_wy = 0, cur_ww = 0, cur_wh = 0;
static HWND sdl_parent_hwnd = NULL; static volatile int sdl_enabled = 0;
static int sdl_w, sdl_h; static SDL_mutex *sdl_mutex = NULL;
static int sdl_fs, sdl_flags = -1;
static int cur_w, cur_h;
static int cur_wx = 0, cur_wy = 0, cur_ww =0, cur_wh = 0;
static volatile int sdl_enabled = 0;
static SDL_mutex* sdl_mutex = NULL;
typedef struct typedef struct
{ {
const void *magic; const void *magic;
Uint32 id; Uint32 id;
char *title; char *title;
SDL_Surface *icon; SDL_Surface *icon;
int x, y; int x, y;
int w, h; int w, h;
int min_w, min_h; int min_w, min_h;
int max_w, max_h; int max_w, max_h;
Uint32 flags; Uint32 flags;
Uint32 last_fullscreen_flags; Uint32 last_fullscreen_flags;
/* Stored position and size for windowed mode */ /* Stored position and size for windowed mode */
SDL_Rect windowed; SDL_Rect windowed;
SDL_DisplayMode fullscreen_mode; SDL_DisplayMode fullscreen_mode;
float brightness; float brightness;
Uint16 *gamma; Uint16 *gamma;
Uint16 *saved_gamma; /* (just offset into gamma) */ Uint16 *saved_gamma; /* (just offset into gamma) */
SDL_Surface *surface; SDL_Surface *surface;
SDL_bool surface_valid; SDL_bool surface_valid;
SDL_bool is_hiding; SDL_bool is_hiding;
SDL_bool is_destroying; SDL_bool is_destroying;
@@ -121,7 +118,7 @@ typedef struct
void *shaper; void *shaper;
SDL_HitTest hit_test; SDL_HitTest hit_test;
void *hit_test_data; void *hit_test_data;
void *data; void *data;
@@ -131,112 +128,107 @@ typedef struct
SDL_Window *next; SDL_Window *next;
} SDL_Window_Ex; } SDL_Window_Ex;
#ifdef ENABLE_SDL_LOG #ifdef ENABLE_SDL_LOG
int sdl_do_log = ENABLE_SDL_LOG; int sdl_do_log = ENABLE_SDL_LOG;
static void static void
sdl_log(const char *fmt, ...) sdl_log(const char *fmt, ...)
{ {
va_list ap; va_list ap;
if (sdl_do_log) { if (sdl_do_log) {
va_start(ap, fmt); va_start(ap, fmt);
pclog_ex(fmt, ap); pclog_ex(fmt, ap);
va_end(ap); va_end(ap);
} }
} }
#else #else
#define sdl_log(fmt, ...) # define sdl_log(fmt, ...)
#endif #endif
static void static void
sdl_integer_scale(double *d, double *g) sdl_integer_scale(double *d, double *g)
{ {
double ratio; double ratio;
if (*d > *g) { if (*d > *g) {
ratio = floor(*d / *g); ratio = floor(*d / *g);
*d = *g * ratio; *d = *g * ratio;
} else { } else {
ratio = ceil(*d / *g); ratio = ceil(*d / *g);
*d = *g / ratio; *d = *g / ratio;
} }
} }
static void static void
sdl_stretch(int *w, int *h, int *x, int *y) sdl_stretch(int *w, int *h, int *x, int *y)
{ {
double hw, gw, hh, gh, dx, dy, dw, dh, gsr, hsr; double hw, gw, hh, gh, dx, dy, dw, dh, gsr, hsr;
hw = (double) sdl_w; hw = (double) sdl_w;
hh = (double) sdl_h; hh = (double) sdl_h;
gw = (double) *w; gw = (double) *w;
gh = (double) *h; gh = (double) *h;
hsr = hw / hh; hsr = hw / hh;
switch (video_fullscreen_scale) { switch (video_fullscreen_scale) {
case FULLSCR_SCALE_FULL: case FULLSCR_SCALE_FULL:
default: default:
*w = sdl_w; *w = sdl_w;
*h = sdl_h; *h = sdl_h;
*x = 0; *x = 0;
*y = 0; *y = 0;
break; break;
case FULLSCR_SCALE_43: case FULLSCR_SCALE_43:
case FULLSCR_SCALE_KEEPRATIO: case FULLSCR_SCALE_KEEPRATIO:
if (video_fullscreen_scale == FULLSCR_SCALE_43) if (video_fullscreen_scale == FULLSCR_SCALE_43)
gsr = 4.0 / 3.0; gsr = 4.0 / 3.0;
else else
gsr = gw / gh; gsr = gw / gh;
if (gsr <= hsr) { if (gsr <= hsr) {
dw = hh * gsr; dw = hh * gsr;
dh = hh; dh = hh;
} else { } else {
dw = hw; dw = hw;
dh = hw / gsr; dh = hw / gsr;
} }
dx = (hw - dw) / 2.0; dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0; dy = (hh - dh) / 2.0;
*w = (int) dw; *w = (int) dw;
*h = (int) dh; *h = (int) dh;
*x = (int) dx; *x = (int) dx;
*y = (int) dy; *y = (int) dy;
break; break;
case FULLSCR_SCALE_INT: case FULLSCR_SCALE_INT:
gsr = gw / gh; gsr = gw / gh;
if (gsr <= hsr) { if (gsr <= hsr) {
dw = hh * gsr; dw = hh * gsr;
dh = hh; dh = hh;
} else { } else {
dw = hw; dw = hw;
dh = hw / gsr; dh = hw / gsr;
} }
sdl_integer_scale(&dw, &gw); sdl_integer_scale(&dw, &gw);
sdl_integer_scale(&dh, &gh); sdl_integer_scale(&dh, &gh);
dx = (hw - dw) / 2.0; dx = (hw - dw) / 2.0;
dy = (hh - dh) / 2.0; dy = (hh - dh) / 2.0;
*w = (int) dw; *w = (int) dw;
*h = (int) dh; *h = (int) dh;
*x = (int) dx; *x = (int) dx;
*y = (int) dy; *y = (int) dy;
break; break;
} }
} }
static void static void
sdl_blit(int x, int y, int w, int h, int monitor_index) sdl_blit(int x, int y, int w, int h, int monitor_index)
{ {
SDL_Rect r_src; SDL_Rect r_src;
int ret; int ret;
if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL) || monitor_index >= 1) { if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL) || monitor_index >= 1) {
video_blit_complete_monitor(monitor_index); video_blit_complete_monitor(monitor_index);
return; return;
} }
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
@@ -248,7 +240,7 @@ sdl_blit(int x, int y, int w, int h, int monitor_index)
SDL_UpdateTexture(sdl_tex, &r_src, &(buffer32->line[y][x]), 2048 * sizeof(uint32_t)); SDL_UpdateTexture(sdl_tex, &r_src, &(buffer32->line[y][x]), 2048 * sizeof(uint32_t));
if (monitors[0].mon_screenshots) if (monitors[0].mon_screenshots)
video_screenshot((uint32_t *) buffer32->dat, x, y, 2048); video_screenshot((uint32_t *) buffer32->dat, x, y, 2048);
video_blit_complete(); video_blit_complete();
@@ -261,24 +253,23 @@ sdl_blit(int x, int y, int w, int h, int monitor_index)
ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0); ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0);
if (ret) if (ret)
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError()); sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
SDL_RenderPresent(sdl_render); SDL_RenderPresent(sdl_render);
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
static void static void
sdl_blit_ex(int x, int y, int w, int h, int monitor_index) sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
{ {
SDL_Rect r_src; SDL_Rect r_src;
void *pixeldata; void *pixeldata;
int pitch, ret; int pitch, ret;
int row; int row;
if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) {
video_blit_complete(); video_blit_complete();
return; return;
} }
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
@@ -286,10 +277,10 @@ sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch); SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch);
for (row = 0; row < h; ++row) for (row = 0; row < h; ++row)
video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t));
if (monitors[0].mon_screenshots) if (monitors[0].mon_screenshots)
video_screenshot((uint32_t *) pixeldata, 0, 0, 2048); video_screenshot((uint32_t *) pixeldata, 0, 0, 2048);
SDL_UnlockTexture(sdl_tex); SDL_UnlockTexture(sdl_tex);
@@ -304,54 +295,51 @@ sdl_blit_ex(int x, int y, int w, int h, int monitor_index)
ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0); ret = SDL_RenderCopy(sdl_render, sdl_tex, &r_src, 0);
if (ret) if (ret)
sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError()); sdl_log("SDL: unable to copy texture to renderer (%s)\n", sdl_GetError());
SDL_RenderPresent(sdl_render); SDL_RenderPresent(sdl_render);
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
static void static void
sdl_destroy_window(void) sdl_destroy_window(void)
{ {
if (sdl_win != NULL) { if (sdl_win != NULL) {
SDL_DestroyWindow(sdl_win); SDL_DestroyWindow(sdl_win);
sdl_win = NULL; sdl_win = NULL;
} }
} }
static void static void
sdl_destroy_texture(void) sdl_destroy_texture(void)
{ {
if (sdl_tex != NULL) { if (sdl_tex != NULL) {
SDL_DestroyTexture(sdl_tex); SDL_DestroyTexture(sdl_tex);
sdl_tex = NULL; sdl_tex = NULL;
} }
/* SDL_DestroyRenderer also automatically destroys all associated textures. */ /* SDL_DestroyRenderer also automatically destroys all associated textures. */
if (sdl_render != NULL) { if (sdl_render != NULL) {
SDL_DestroyRenderer(sdl_render); SDL_DestroyRenderer(sdl_render);
sdl_render = NULL; sdl_render = NULL;
} }
} }
void void
sdl_close(void) sdl_close(void)
{ {
if (sdl_mutex != NULL) if (sdl_mutex != NULL)
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
/* Unregister our renderer! */ /* Unregister our renderer! */
video_setblit(NULL); video_setblit(NULL);
if (sdl_enabled) if (sdl_enabled)
sdl_enabled = 0; sdl_enabled = 0;
if (sdl_mutex != NULL) { if (sdl_mutex != NULL) {
SDL_DestroyMutex(sdl_mutex); SDL_DestroyMutex(sdl_mutex);
sdl_mutex = NULL; sdl_mutex = NULL;
} }
sdl_destroy_texture(); sdl_destroy_texture();
@@ -360,8 +348,8 @@ sdl_close(void)
SetFocus(hwndMain); SetFocus(hwndMain);
if (sdl_parent_hwnd != NULL) { if (sdl_parent_hwnd != NULL) {
DestroyWindow(sdl_parent_hwnd); DestroyWindow(sdl_parent_hwnd);
sdl_parent_hwnd = NULL; sdl_parent_hwnd = NULL;
} }
/* Quit. */ /* Quit. */
@@ -369,41 +357,36 @@ sdl_close(void)
sdl_flags = -1; sdl_flags = -1;
} }
static int old_capture = 0; static int old_capture = 0;
static void static void
sdl_select_best_hw_driver(void) sdl_select_best_hw_driver(void)
{ {
int i; int i;
SDL_RendererInfo renderInfo; SDL_RendererInfo renderInfo;
for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) for (i = 0; i < SDL_GetNumRenderDrivers(); ++i) {
{ SDL_GetRenderDriverInfo(i, &renderInfo);
SDL_GetRenderDriverInfo(i, &renderInfo); if (renderInfo.flags & SDL_RENDERER_ACCELERATED) {
if (renderInfo.flags & SDL_RENDERER_ACCELERATED) { SDL_SetHint(SDL_HINT_RENDER_DRIVER, renderInfo.name);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, renderInfo.name); return;
return; }
}
} }
} }
static void static void
sdl_init_texture(void) sdl_init_texture(void)
{ {
if (sdl_flags & RENDERER_HARDWARE) { if (sdl_flags & RENDERER_HARDWARE) {
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED); sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_ACCELERATED);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
} else } else
sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE); sdl_render = SDL_CreateRenderer(sdl_win, -1, SDL_RENDERER_SOFTWARE);
sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888, sdl_tex = SDL_CreateTexture(sdl_render, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING, 2048, 2048); SDL_TEXTUREACCESS_STREAMING, 2048, 2048);
} }
static void static void
sdl_reinit_texture(void) sdl_reinit_texture(void)
{ {
@@ -414,67 +397,65 @@ sdl_reinit_texture(void)
sdl_init_texture(); sdl_init_texture();
} }
void void
sdl_set_fs(int fs) sdl_set_fs(int fs)
{ {
int w = 0, h = 0, x = 0, y = 0; int w = 0, h = 0, x = 0, y = 0;
RECT rect; RECT rect;
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
sdl_enabled = 0; sdl_enabled = 0;
if (fs) { if (fs) {
ShowWindow(sdl_parent_hwnd, TRUE); ShowWindow(sdl_parent_hwnd, TRUE);
SetParent(hwndRender, sdl_parent_hwnd); SetParent(hwndRender, sdl_parent_hwnd);
ShowWindow(hwndRender, TRUE); ShowWindow(hwndRender, TRUE);
MoveWindow(sdl_parent_hwnd, 0, 0, sdl_w, sdl_h, TRUE); MoveWindow(sdl_parent_hwnd, 0, 0, sdl_w, sdl_h, TRUE);
/* Show the window, make it topmost, and give it focus. */ /* Show the window, make it topmost, and give it focus. */
w = unscaled_size_x; w = unscaled_size_x;
h = efscrnsz_y; h = efscrnsz_y;
sdl_stretch(&w, &h, &x, &y); sdl_stretch(&w, &h, &x, &y);
MoveWindow(hwndRender, x, y, w, h, TRUE); MoveWindow(hwndRender, x, y, w, h, TRUE);
ImmAssociateContext(sdl_parent_hwnd, NULL); ImmAssociateContext(sdl_parent_hwnd, NULL);
SetFocus(sdl_parent_hwnd); SetFocus(sdl_parent_hwnd);
/* Redirect RawInput to this new window. */ /* Redirect RawInput to this new window. */
old_capture = mouse_capture; old_capture = mouse_capture;
GetWindowRect(hwndRender, &rect); GetWindowRect(hwndRender, &rect);
ClipCursor(&rect); ClipCursor(&rect);
mouse_capture = 1; mouse_capture = 1;
} else { } else {
SetParent(hwndRender, hwndMain); SetParent(hwndRender, hwndMain);
ShowWindow(sdl_parent_hwnd, FALSE); ShowWindow(sdl_parent_hwnd, FALSE);
ShowWindow(hwndRender, TRUE); ShowWindow(hwndRender, TRUE);
ImmAssociateContext(hwndMain, NULL); ImmAssociateContext(hwndMain, NULL);
SetFocus(hwndMain); SetFocus(hwndMain);
mouse_capture = old_capture; mouse_capture = old_capture;
if (mouse_capture) { if (mouse_capture) {
GetWindowRect(hwndRender, &rect); GetWindowRect(hwndRender, &rect);
ClipCursor(&rect); ClipCursor(&rect);
} else } else
ClipCursor(&oldclip); ClipCursor(&oldclip);
} }
sdl_fs = fs; sdl_fs = fs;
if (fs) if (fs)
sdl_flags |= RENDERER_FULL_SCREEN; sdl_flags |= RENDERER_FULL_SCREEN;
else else
sdl_flags &= ~RENDERER_FULL_SCREEN; sdl_flags &= ~RENDERER_FULL_SCREEN;
// sdl_reinit_texture(); // sdl_reinit_texture();
sdl_enabled = 1; sdl_enabled = 1;
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
static int static int
sdl_init_common(int flags) sdl_init_common(int flags)
{ {
wchar_t temp[128]; wchar_t temp[128];
SDL_version ver; SDL_version ver;
sdl_log("SDL: init (fs=%d)\n", fs); sdl_log("SDL: init (fs=%d)\n", fs);
@@ -485,15 +466,15 @@ sdl_init_common(int flags)
/* Initialize the SDL system. */ /* Initialize the SDL system. */
if (SDL_Init(SDL_INIT_VIDEO) < 0) { if (SDL_Init(SDL_INIT_VIDEO) < 0) {
sdl_log("SDL: initialization failed (%s)\n", sdl_GetError()); sdl_log("SDL: initialization failed (%s)\n", sdl_GetError());
return(0); return (0);
} }
if (flags & RENDERER_HARDWARE) { if (flags & RENDERER_HARDWARE) {
if (flags & RENDERER_OPENGL) if (flags & RENDERER_OPENGL)
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL"); SDL_SetHint(SDL_HINT_RENDER_DRIVER, "OpenGL");
else else
sdl_select_best_hw_driver(); sdl_select_best_hw_driver();
} }
/* Get the size of the (current) desktop. */ /* Get the size of the (current) desktop. */
@@ -503,16 +484,16 @@ sdl_init_common(int flags)
/* Create the desktop-covering window. */ /* Create the desktop-covering window. */
_swprintf(temp, L"%s v%s", EMU_NAME_W, EMU_VERSION_FULL_W); _swprintf(temp, L"%s v%s", EMU_NAME_W, EMU_VERSION_FULL_W);
sdl_parent_hwnd = CreateWindow(SDL_CLASS_NAME, temp, WS_POPUP, 0, 0, sdl_w, sdl_h, sdl_parent_hwnd = CreateWindow(SDL_CLASS_NAME, temp, WS_POPUP, 0, 0, sdl_w, sdl_h,
HWND_DESKTOP, NULL, hinstance, NULL); HWND_DESKTOP, NULL, hinstance, NULL);
ShowWindow(sdl_parent_hwnd, FALSE); ShowWindow(sdl_parent_hwnd, FALSE);
sdl_flags = flags; sdl_flags = flags;
if (sdl_win == NULL) { if (sdl_win == NULL) {
sdl_log("SDL: unable to CreateWindowFrom (%s)\n", SDL_GetError()); sdl_log("SDL: unable to CreateWindowFrom (%s)\n", SDL_GetError());
} }
sdl_win = SDL_CreateWindowFrom((void *)hwndRender); sdl_win = SDL_CreateWindowFrom((void *) hwndRender);
sdl_init_texture(); sdl_init_texture();
sdl_set_fs(video_fullscreen & 1); sdl_set_fs(video_fullscreen & 1);
@@ -523,50 +504,45 @@ sdl_init_common(int flags)
video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit); video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit);
sdl_enabled = 1; sdl_enabled = 1;
sdl_mutex = SDL_CreateMutex(); sdl_mutex = SDL_CreateMutex();
return(1); return (1);
} }
int int
sdl_inits(HWND h) sdl_inits(HWND h)
{ {
return sdl_init_common(0); return sdl_init_common(0);
} }
int int
sdl_inith(HWND h) sdl_inith(HWND h)
{ {
return sdl_init_common(RENDERER_HARDWARE); return sdl_init_common(RENDERER_HARDWARE);
} }
int int
sdl_initho(HWND h) sdl_initho(HWND h)
{ {
return sdl_init_common(RENDERER_HARDWARE | RENDERER_OPENGL); return sdl_init_common(RENDERER_HARDWARE | RENDERER_OPENGL);
} }
int int
sdl_pause(void) sdl_pause(void)
{ {
return(0); return (0);
} }
void void
sdl_resize(int x, int y) sdl_resize(int x, int y)
{ {
int ww = 0, wh = 0, wx = 0, wy = 0; int ww = 0, wh = 0, wx = 0, wy = 0;
if (video_fullscreen & 2) if (video_fullscreen & 2)
return; return;
if ((x == cur_w) && (y == cur_h)) if ((x == cur_w) && (y == cur_h))
return; return;
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
@@ -574,8 +550,8 @@ sdl_resize(int x, int y)
wh = y; wh = y;
if (sdl_fs) { if (sdl_fs) {
sdl_stretch(&ww, &wh, &wx, &wy); sdl_stretch(&ww, &wh, &wx, &wy);
MoveWindow(hwndRender, wx, wy, ww, wh, TRUE); MoveWindow(hwndRender, wx, wy, ww, wh, TRUE);
} }
cur_w = x; cur_w = x;
@@ -594,35 +570,33 @@ sdl_resize(int x, int y)
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
void void
sdl_enable(int enable) sdl_enable(int enable)
{ {
if (sdl_flags == -1) if (sdl_flags == -1)
return; return;
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
sdl_enabled = !!enable; sdl_enabled = !!enable;
if (enable == 1) { if (enable == 1) {
SDL_SetWindowSize(sdl_win, cur_ww, cur_wh); SDL_SetWindowSize(sdl_win, cur_ww, cur_wh);
sdl_reinit_texture(); sdl_reinit_texture();
} }
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
void void
sdl_reload(void) sdl_reload(void)
{ {
if (sdl_flags & RENDERER_HARDWARE) { if (sdl_flags & RENDERER_HARDWARE) {
SDL_LockMutex(sdl_mutex); SDL_LockMutex(sdl_mutex);
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, video_filter_method ? "1" : "0");
sdl_reinit_texture(); sdl_reinit_texture();
SDL_UnlockMutex(sdl_mutex); SDL_UnlockMutex(sdl_mutex);
} }
video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit); video_setblit((video_grayscale || invert_display) ? sdl_blit_ex : sdl_blit);

File diff suppressed because it is too large Load Diff

View File

@@ -31,9 +31,7 @@
#include <86box/sound.h> #include <86box/sound.h>
#include <86box/win.h> #include <86box/win.h>
static uint8_t old_gain;
static uint8_t old_gain;
#if defined(__amd64__) || defined(__aarch64__) #if defined(__amd64__) || defined(__aarch64__)
static LRESULT CALLBACK static LRESULT CALLBACK
@@ -45,48 +43,47 @@ SoundGainDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
HWND h; HWND h;
switch (message) { switch (message) {
case WM_INITDIALOG: case WM_INITDIALOG:
old_gain = sound_gain; old_gain = sound_gain;
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN); h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
SendMessage(h, TBM_SETRANGE, (WPARAM)1, (LPARAM)MAKELONG(0, 9)); SendMessage(h, TBM_SETRANGE, (WPARAM) 1, (LPARAM) MAKELONG(0, 9));
SendMessage(h, TBM_SETPOS, (WPARAM)1, 9 - (sound_gain >> 1)); SendMessage(h, TBM_SETPOS, (WPARAM) 1, 9 - (sound_gain >> 1));
SendMessage(h, TBM_SETTICFREQ, (WPARAM)1, 0); SendMessage(h, TBM_SETTICFREQ, (WPARAM) 1, 0);
SendMessage(h, TBM_SETLINESIZE, (WPARAM)0, 1); SendMessage(h, TBM_SETLINESIZE, (WPARAM) 0, 1);
SendMessage(h, TBM_SETPAGESIZE, (WPARAM)0, 2); SendMessage(h, TBM_SETPAGESIZE, (WPARAM) 0, 2);
break; break;
case WM_VSCROLL: case WM_VSCROLL:
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN); h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM)0, 0)) << 1; sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM) 0, 0)) << 1;
break; break;
case WM_COMMAND: case WM_COMMAND:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDOK: case IDOK:
h = GetDlgItem(hdlg, IDC_SLIDER_GAIN); h = GetDlgItem(hdlg, IDC_SLIDER_GAIN);
sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM)0, 0)) << 1; sound_gain = (9 - SendMessage(h, TBM_GETPOS, (WPARAM) 0, 0)) << 1;
config_save(); config_save();
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
case IDCANCEL: case IDCANCEL:
sound_gain = old_gain; sound_gain = old_gain;
config_save(); config_save();
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
default: default:
break; break;
} }
break; break;
} }
return(FALSE); return (FALSE);
} }
void void
SoundGainDialogCreate(HWND hwnd) SoundGainDialogCreate(HWND hwnd)
{ {
DialogBox(hinstance, (LPCTSTR)DLG_SND_GAIN, hwnd, SoundGainDialogProcedure); DialogBox(hinstance, (LPCTSTR) DLG_SND_GAIN, hwnd, SoundGainDialogProcedure);
} }

View File

@@ -32,7 +32,6 @@
#include <86box/sound.h> #include <86box/sound.h>
#include <86box/win.h> #include <86box/win.h>
#if defined(__amd64__) || defined(__aarch64__) #if defined(__amd64__) || defined(__aarch64__)
static LRESULT CALLBACK static LRESULT CALLBACK
#else #else
@@ -40,140 +39,139 @@ static BOOL CALLBACK
#endif #endif
SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) SpecifyDimensionsDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
{ {
HWND h, h2; HWND h, h2;
HMENU hmenu; HMENU hmenu;
UDACCEL accel, accel2; UDACCEL accel, accel2;
RECT r; RECT r;
uint32_t temp_x = 0, temp_y = 0; uint32_t temp_x = 0, temp_y = 0;
int dpi = 96, lock; int dpi = 96, lock;
LPTSTR lptsTemp; LPTSTR lptsTemp;
char *stransi; char *stransi;
switch (message) { switch (message) {
case WM_INITDIALOG: case WM_INITDIALOG:
GetWindowRect(hwndRender, &r); GetWindowRect(hwndRender, &r);
h = GetDlgItem(hdlg, IDC_WIDTHSPIN); h = GetDlgItem(hdlg, IDC_WIDTHSPIN);
h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH); h2 = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0); SendMessage(h, UDM_SETBUDDY, (WPARAM) h2, 0);
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048); SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
accel.nSec = 0; accel.nSec = 0;
accel.nInc = 8; accel.nInc = 8;
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel); SendMessage(h, UDM_SETACCEL, 1, (LPARAM) &accel);
SendMessage(h, UDM_SETPOS, 0, r.right - r.left); SendMessage(h, UDM_SETPOS, 0, r.right - r.left);
h = GetDlgItem(hdlg, IDC_HEIGHTSPIN); h = GetDlgItem(hdlg, IDC_HEIGHTSPIN);
h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT); h2 = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
SendMessage(h, UDM_SETBUDDY, (WPARAM)h2, 0); SendMessage(h, UDM_SETBUDDY, (WPARAM) h2, 0);
SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048); SendMessage(h, UDM_SETRANGE, 0, (120 << 16) | 2048);
accel2.nSec = 0; accel2.nSec = 0;
accel2.nInc = 8; accel2.nInc = 8;
SendMessage(h, UDM_SETACCEL, 1, (LPARAM)&accel2); SendMessage(h, UDM_SETACCEL, 1, (LPARAM) &accel2);
SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top); SendMessage(h, UDM_SETPOS, 0, r.bottom - r.top);
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE); h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0); SendMessage(h, BM_SETCHECK, !!(vid_resize & 2), 0);
break; break;
case WM_COMMAND: case WM_COMMAND:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDOK: case IDOK:
lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR)); lptsTemp = (LPTSTR) malloc(512 * sizeof(WCHAR));
stransi = (char *)malloc(512); stransi = (char *) malloc(512);
h = GetDlgItem(hdlg, IDC_EDIT_WIDTH); h = GetDlgItem(hdlg, IDC_EDIT_WIDTH);
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
wcstombs(stransi, lptsTemp, 512); wcstombs(stransi, lptsTemp, 512);
sscanf(stransi, "%u", &temp_x); sscanf(stransi, "%u", &temp_x);
fixed_size_x = temp_x; fixed_size_x = temp_x;
h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT); h = GetDlgItem(hdlg, IDC_EDIT_HEIGHT);
SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp); SendMessage(h, WM_GETTEXT, 255, (LPARAM) lptsTemp);
wcstombs(stransi, lptsTemp, 512); wcstombs(stransi, lptsTemp, 512);
sscanf(stransi, "%u", &temp_y); sscanf(stransi, "%u", &temp_y);
fixed_size_y = temp_y; fixed_size_y = temp_y;
h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE); h = GetDlgItem(hdlg, IDC_CHECK_LOCK_SIZE);
lock = SendMessage(h, BM_GETCHECK, 0, 0); lock = SendMessage(h, BM_GETCHECK, 0, 0);
if (lock) { if (lock) {
vid_resize = 2; vid_resize = 2;
window_remember = 0; window_remember = 0;
} else { } else {
vid_resize = 1; vid_resize = 1;
window_remember = 1; window_remember = 1;
} }
hmenu = GetMenu(hwndMain); hmenu = GetMenu(hwndMain);
CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, IDM_VID_REMEMBER, (window_remember == 1) ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize == 1) ? MF_CHECKED : MF_UNCHECKED);
EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED); EnableMenuItem(hmenu, IDM_VID_RESIZE, (vid_resize & 2) ? MF_GRAYED : MF_ENABLED);
if (vid_resize == 1) if (vid_resize == 1)
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE); SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW) | WS_VISIBLE);
else else
SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE); SetWindowLongPtr(hwndMain, GWL_STYLE, (WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX) | WS_VISIBLE);
/* scale the screen base on DPI */ /* scale the screen base on DPI */
if (dpi_scale) { if (dpi_scale) {
dpi = win_get_dpi(hwndMain); dpi = win_get_dpi(hwndMain);
temp_x = MulDiv(temp_x, dpi, 96); temp_x = MulDiv(temp_x, dpi, 96);
temp_y = MulDiv(temp_y, dpi, 96); temp_y = MulDiv(temp_y, dpi, 96);
} }
ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height); ResizeWindowByClientArea(hwndMain, temp_x, temp_y + sbar_height + tbar_height);
if (vid_resize) { if (vid_resize) {
CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED); CheckMenuItem(hmenu, IDM_VID_SCALE_1X + scale, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED); CheckMenuItem(hmenu, IDM_VID_SCALE_2X, MF_CHECKED);
scale = 1; scale = 1;
} }
EnableMenuItem(hmenu, IDM_VID_SCALE_1X, vid_resize ? MF_GRAYED : MF_ENABLED); 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_2X, vid_resize ? MF_GRAYED : MF_ENABLED);
EnableMenuItem(hmenu, IDM_VID_SCALE_3X, 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); EnableMenuItem(hmenu, IDM_VID_SCALE_4X, vid_resize ? MF_GRAYED : MF_ENABLED);
scrnsz_x = fixed_size_x; scrnsz_x = fixed_size_x;
scrnsz_y = fixed_size_y; scrnsz_y = fixed_size_y;
atomic_store(&doresize_monitors[0], 1); atomic_store(&doresize_monitors[0], 1);
GetWindowRect(hwndMain, &r); GetWindowRect(hwndMain, &r);
if (mouse_capture) if (mouse_capture)
ClipCursor(&r); ClipCursor(&r);
if (window_remember || (vid_resize & 2)) { if (window_remember || (vid_resize & 2)) {
window_x = r.left; window_x = r.left;
window_y = r.top; window_y = r.top;
if (!(vid_resize & 2)) { if (!(vid_resize & 2)) {
window_w = r.right - r.left; window_w = r.right - r.left;
window_h = r.bottom - r.top; window_h = r.bottom - r.top;
} }
} }
config_save(); config_save();
free(stransi); free(stransi);
free(lptsTemp); free(lptsTemp);
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
case IDCANCEL: case IDCANCEL:
EndDialog(hdlg, 0); EndDialog(hdlg, 0);
return TRUE; return TRUE;
default: default:
break; break;
} }
break; break;
} }
return(FALSE); return (FALSE);
} }
void void
SpecifyDimensionsDialogCreate(HWND hwnd) SpecifyDimensionsDialogCreate(HWND hwnd)
{ {
DialogBox(hinstance, (LPCTSTR)DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure); DialogBox(hinstance, (LPCTSTR) DLG_SPECIFY_DIM, hwnd, SpecifyDimensionsDialogProcedure);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -31,41 +31,38 @@
#include <86box/plat.h> #include <86box/plat.h>
#include <86box/thread.h> #include <86box/thread.h>
typedef struct { typedef struct {
HANDLE handle; HANDLE handle;
} win_event_t; } win_event_t;
thread_t * thread_t *
thread_create(void (*func)(void *param), void *param) thread_create(void (*func)(void *param), void *param)
{ {
uintptr_t bt = _beginthread(func, 0, param); uintptr_t bt = _beginthread(func, 0, param);
return((thread_t *)bt); return ((thread_t *) bt);
} }
int int
thread_test_mutex(thread_t *arg) thread_test_mutex(thread_t *arg)
{ {
if (arg == NULL) return(0); if (arg == NULL)
return (0);
return (WaitForSingleObject(arg, 0) == WAIT_OBJECT_0) ? 1 : 0; return (WaitForSingleObject(arg, 0) == WAIT_OBJECT_0) ? 1 : 0;
} }
int int
thread_wait(thread_t *arg) thread_wait(thread_t *arg)
{ {
if (arg == NULL) return(0); if (arg == NULL)
return (0);
if (WaitForSingleObject(arg, INFINITE)) return(1); if (WaitForSingleObject(arg, INFINITE))
return (1);
return(0); return (0);
} }
event_t * event_t *
thread_create_event(void) thread_create_event(void)
{ {
@@ -73,63 +70,64 @@ thread_create_event(void)
ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL); ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL);
return((event_t *)ev); return ((event_t *) ev);
} }
void void
thread_set_event(event_t *arg) thread_set_event(event_t *arg)
{ {
win_event_t *ev = (win_event_t *)arg; win_event_t *ev = (win_event_t *) arg;
if (arg == NULL) return; if (arg == NULL)
return;
SetEvent(ev->handle); SetEvent(ev->handle);
} }
void void
thread_reset_event(event_t *arg) thread_reset_event(event_t *arg)
{ {
win_event_t *ev = (win_event_t *)arg; win_event_t *ev = (win_event_t *) arg;
if (arg == NULL) return; if (arg == NULL)
return;
ResetEvent(ev->handle); ResetEvent(ev->handle);
} }
int int
thread_wait_event(event_t *arg, int timeout) thread_wait_event(event_t *arg, int timeout)
{ {
win_event_t *ev = (win_event_t *)arg; win_event_t *ev = (win_event_t *) arg;
if (arg == NULL) return(0); if (arg == NULL)
return (0);
if (ev->handle == NULL) return(0); if (ev->handle == NULL)
return (0);
if (timeout == -1) if (timeout == -1)
timeout = INFINITE; timeout = INFINITE;
if (WaitForSingleObject(ev->handle, timeout)) return(1); if (WaitForSingleObject(ev->handle, timeout))
return (1);
return(0); return (0);
} }
void void
thread_destroy_event(event_t *arg) thread_destroy_event(event_t *arg)
{ {
win_event_t *ev = (win_event_t *)arg; win_event_t *ev = (win_event_t *) arg;
if (arg == NULL) return; if (arg == NULL)
return;
CloseHandle(ev->handle); CloseHandle(ev->handle);
free(ev); free(ev);
} }
mutex_t * mutex_t *
thread_create_mutex(void) thread_create_mutex(void)
{ {
@@ -140,39 +138,39 @@ thread_create_mutex(void)
return mutex; return mutex;
} }
int int
thread_wait_mutex(mutex_t *mutex) thread_wait_mutex(mutex_t *mutex)
{ {
if (mutex == NULL) return(0); if (mutex == NULL)
return (0);
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
EnterCriticalSection(critsec); EnterCriticalSection(critsec);
return 1; return 1;
} }
int int
thread_release_mutex(mutex_t *mutex) thread_release_mutex(mutex_t *mutex)
{ {
if (mutex == NULL) return(0); if (mutex == NULL)
return (0);
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
LeaveCriticalSection(critsec); LeaveCriticalSection(critsec);
return 1; return 1;
} }
void void
thread_close_mutex(mutex_t *mutex) thread_close_mutex(mutex_t *mutex)
{ {
if (mutex == NULL) return; if (mutex == NULL)
return;
LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION)mutex; LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex;
DeleteCriticalSection(critsec); DeleteCriticalSection(critsec);

View File

@@ -11,36 +11,34 @@
#include <86box/video.h> #include <86box/video.h>
#include <86box/win.h> #include <86box/win.h>
HWND hwndRebar = NULL; HWND hwndRebar = NULL;
static HWND hwndToolbar = NULL; static HWND hwndToolbar = NULL;
static HIMAGELIST hImageList = NULL; static HIMAGELIST hImageList = NULL;
static wchar_t wTitle[512] = { 0 }; static wchar_t wTitle[512] = { 0 };
static WNDPROC pOriginalProcedure = NULL; static WNDPROC pOriginalProcedure = NULL;
enum image_index { enum image_index {
RUN, RUN,
PAUSE, PAUSE,
CTRL_ALT_DEL, CTRL_ALT_DEL,
CTRL_ALT_ESC, CTRL_ALT_ESC,
HARD_RESET, HARD_RESET,
ACPI_SHUTDOWN, ACPI_SHUTDOWN,
SETTINGS SETTINGS
}; };
void void
ToolBarLoadIcons() ToolBarLoadIcons()
{ {
if (!hwndToolbar) if (!hwndToolbar)
return; return;
if (hImageList) if (hImageList)
ImageList_Destroy(hImageList); ImageList_Destroy(hImageList);
hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi), hImageList = ImageList_Create(win_get_system_metrics(SM_CXSMICON, dpi),
win_get_system_metrics(SM_CYSMICON, dpi), win_get_system_metrics(SM_CYSMICON, dpi),
ILC_MASK | ILC_COLOR32, 1, 1); ILC_MASK | ILC_COLOR32, 1, 1);
// The icons must be loaded in the same order as the `image_index` // The icons must be loaded in the same order as the `image_index`
// enumeration above. // enumeration above.
@@ -56,55 +54,54 @@ ToolBarLoadIcons()
SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList); SendMessage(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM) hImageList);
} }
int int
ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ToolBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
switch (message) { switch (message) {
case WM_NOTIFY: case WM_NOTIFY:
switch (((LPNMHDR) lParam)->code) { switch (((LPNMHDR) lParam)->code) {
case TTN_GETDISPINFO: { case TTN_GETDISPINFO:
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam; {
LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT) lParam;
// Set the instance of the module that contains the resource. // Set the instance of the module that contains the resource.
lpttt->hinst = hinstance; lpttt->hinst = hinstance;
uintptr_t idButton = lpttt->hdr.idFrom; uintptr_t idButton = lpttt->hdr.idFrom;
switch (idButton) { switch (idButton) {
case IDM_ACTION_PAUSE: case IDM_ACTION_PAUSE:
if (dopause) if (dopause)
lpttt->lpszText = MAKEINTRESOURCE(IDS_2154); lpttt->lpszText = MAKEINTRESOURCE(IDS_2154);
else else
lpttt->lpszText = MAKEINTRESOURCE(IDS_2155); lpttt->lpszText = MAKEINTRESOURCE(IDS_2155);
break; break;
case IDM_ACTION_RESET_CAD: case IDM_ACTION_RESET_CAD:
lpttt->lpszText = MAKEINTRESOURCE(IDS_2156); lpttt->lpszText = MAKEINTRESOURCE(IDS_2156);
break; break;
case IDM_ACTION_CTRL_ALT_ESC: case IDM_ACTION_CTRL_ALT_ESC:
lpttt->lpszText = MAKEINTRESOURCE(IDS_2157); lpttt->lpszText = MAKEINTRESOURCE(IDS_2157);
break; break;
case IDM_ACTION_HRESET: case IDM_ACTION_HRESET:
lpttt->lpszText = MAKEINTRESOURCE(IDS_2158); lpttt->lpszText = MAKEINTRESOURCE(IDS_2158);
break; break;
case IDM_CONFIG: case IDM_CONFIG:
lpttt->lpszText = MAKEINTRESOURCE(IDS_2160); lpttt->lpszText = MAKEINTRESOURCE(IDS_2160);
break; break;
} }
return TRUE; return TRUE;
} }
} }
} }
return(CallWindowProc(pOriginalProcedure, hwnd, message, wParam, lParam)); return (CallWindowProc(pOriginalProcedure, hwnd, message, wParam, lParam));
} }
void void
ToolBarUpdatePause(int pause) ToolBarUpdatePause(int pause)
{ {
@@ -117,35 +114,29 @@ ToolBarUpdatePause(int pause)
SendMessage(hwndToolbar, TB_SETBUTTONINFO, IDM_ACTION_PAUSE, (LPARAM) &tbbi); SendMessage(hwndToolbar, TB_SETBUTTONINFO, IDM_ACTION_PAUSE, (LPARAM) &tbbi);
} }
static TBBUTTON buttons[] = { static TBBUTTON buttons[] = {
{ PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, {PAUSE, IDM_ACTION_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
{ HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, { HARD_RESET, IDM_ACTION_HRESET, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
{ ACPI_SHUTDOWN, 0, TBSTATE_HIDDEN, BTNS_BUTTON, { 0 }, 0, 0 }, { ACPI_SHUTDOWN, 0, TBSTATE_HIDDEN, BTNS_BUTTON, { 0 }, 0, 0},
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0},
{ CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, { CTRL_ALT_DEL, IDM_ACTION_RESET_CAD, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
{ CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 }, { CTRL_ALT_ESC, IDM_ACTION_CTRL_ALT_ESC, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0},
{ 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0 }, { 0, 0, TBSTATE_INDETERMINATE, BTNS_SEP, { 0 }, 0, 0},
{ SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0 } { SETTINGS, IDM_CONFIG, TBSTATE_ENABLED, BTNS_BUTTON, { 0 }, 0, 0}
}; };
void void
ToolBarCreate(HWND hwndParent, HINSTANCE hInst) ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
{ {
REBARINFO rbi = { 0 }; REBARINFO rbi = { 0 };
REBARBANDINFO rbbi = { 0 }; REBARBANDINFO rbbi = { 0 };
int btnSize; int btnSize;
// Create the toolbar. // Create the toolbar.
hwndToolbar = CreateWindowEx(WS_EX_PALETTEWINDOW, TOOLBARCLASSNAME, NULL, hwndToolbar = CreateWindowEx(WS_EX_PALETTEWINDOW, TOOLBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER,
WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS | 0, 0, 0, 0,
TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | hwndParent, NULL, hInst, NULL);
CCS_NOPARENTALIGN | CCS_NORESIZE |
CCS_NODIVIDER,
0, 0, 0, 0,
hwndParent, NULL, hInst, NULL);
ToolBarLoadIcons(); ToolBarLoadIcons();
@@ -154,41 +145,39 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
SendMessage(hwndToolbar, TB_ADDBUTTONS, sizeof(buttons) / sizeof(TBBUTTON), (LPARAM) &buttons); SendMessage(hwndToolbar, TB_ADDBUTTONS, sizeof(buttons) / sizeof(TBBUTTON), (LPARAM) &buttons);
// Autosize the toolbar and determine its size. // Autosize the toolbar and determine its size.
btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0,0)); btnSize = LOWORD(SendMessage(hwndToolbar, TB_GETBUTTONSIZE, 0, 0));
// Replace the original procedure with ours. // Replace the original procedure with ours.
pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC); pOriginalProcedure = (WNDPROC) GetWindowLongPtr(hwndToolbar, GWLP_WNDPROC);
SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR)&ToolBarProcedure); SetWindowLongPtr(hwndToolbar, GWLP_WNDPROC, (LONG_PTR) &ToolBarProcedure);
// Make sure the Pause button is in the correct state. // Make sure the Pause button is in the correct state.
ToolBarUpdatePause(dopause); ToolBarUpdatePause(dopause);
// Create the containing Rebar. // Create the containing Rebar.
hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL, hwndRebar = CreateWindowEx(0, REBARCLASSNAME, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | CCS_NODIVIDER | CCS_NOPARENTALIGN,
WS_CLIPCHILDREN | RBS_VARHEIGHT | 0, 0, scrnsz_x, 0,
CCS_NODIVIDER | CCS_NOPARENTALIGN, hwndParent, NULL, hInst, NULL);
0, 0, scrnsz_x, 0,
hwndParent, NULL, hInst, NULL);
// Create and send the REBARINFO structure. // Create and send the REBARINFO structure.
rbi.cbSize = sizeof(rbi); rbi.cbSize = sizeof(rbi);
SendMessage(hwndRebar, RB_SETBARINFO, 0, (LPARAM)&rbi); SendMessage(hwndRebar, RB_SETBARINFO, 0, (LPARAM) &rbi);
// Add the toolbar to the rebar. // Add the toolbar to the rebar.
rbbi.cbSize = sizeof(rbbi); rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE; rbbi.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE;
rbbi.hwndChild = hwndToolbar; rbbi.hwndChild = hwndToolbar;
rbbi.cxMinChild = 0; rbbi.cxMinChild = 0;
rbbi.cyMinChild = btnSize; rbbi.cyMinChild = btnSize;
rbbi.fStyle = RBBS_NOGRIPPER; rbbi.fStyle = RBBS_NOGRIPPER;
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi); SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM) &rbbi);
// Add a label for machine information. // Add a label for machine information.
rbbi.fMask = RBBIM_TEXT | RBBIM_STYLE; rbbi.fMask = RBBIM_TEXT | RBBIM_STYLE;
rbbi.lpText = TEXT("Test"); rbbi.lpText = TEXT("Test");
rbbi.fStyle = RBBS_NOGRIPPER; rbbi.fStyle = RBBS_NOGRIPPER;
SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM)&rbbi); SendMessage(hwndRebar, RB_INSERTBAND, -1, (LPARAM) &rbbi);
SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0); SendMessage(hwndRebar, RB_MAXIMIZEBAND, 0, 0);
ShowWindow(hwndRebar, TRUE); ShowWindow(hwndRebar, TRUE);
@@ -196,25 +185,24 @@ ToolBarCreate(HWND hwndParent, HINSTANCE hInst)
return; return;
} }
wchar_t * wchar_t *
ui_window_title(wchar_t *s) ui_window_title(wchar_t *s)
{ {
REBARBANDINFO rbbi = { 0 }; REBARBANDINFO rbbi = { 0 };
if (! video_fullscreen) { if (!video_fullscreen) {
if (s != NULL) { if (s != NULL) {
wcsncpy(wTitle, s, sizeof_w(wTitle) - 1); wcsncpy(wTitle, s, sizeof_w(wTitle) - 1);
} else } else
s = wTitle; s = wTitle;
rbbi.cbSize = sizeof(rbbi); rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_TEXT; rbbi.fMask = RBBIM_TEXT;
rbbi.lpText = s; rbbi.lpText = s;
SendMessage(hwndRebar, RB_SETBANDINFO, 1, (LPARAM) &rbbi); SendMessage(hwndRebar, RB_SETBANDINFO, 1, (LPARAM) &rbbi);
} else { } else {
if (s == NULL) if (s == NULL)
s = wTitle; s = wTitle;
} }
return(s); return (s);
} }

File diff suppressed because it is too large Load Diff