Run clang-formats for merge
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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*/
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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*/
|
||||||
|
|||||||
@@ -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*/
|
|
||||||
|
|||||||
1596
src/win/glad.c
1596
src/win/glad.c
File diff suppressed because it is too large
Load Diff
907
src/win/win.c
907
src/win/win.c
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1476
src/win/win_opengl.c
1476
src/win/win_opengl.c
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
1098
src/win/win_stbar.c
1098
src/win/win_stbar.c
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
1923
src/win/win_ui.c
1923
src/win/win_ui.c
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user