Merge branch 'master'

This commit is contained in:
MaxwellS04
2025-03-14 16:43:59 +07:00
16 changed files with 322 additions and 218 deletions

View File

@@ -213,6 +213,7 @@ int hook_enabled = 1; /* (C) Keyboar
int test_mode = 0; /* (C) Test mode */
char uuid[MAX_UUID_LEN] = { '\0' }; /* (C) UUID or machine identifier */
int sound_muted = 0; /* (C) Is sound muted? */
int inhibit_multimedia_keys; /* (C) Inhibit multimedia keys on Windows. */
int other_ide_present = 0; /* IDE controllers from non-IDE cards are
present */

View File

@@ -46,6 +46,7 @@
cdrom_t cdrom[CDROM_NUM] = { 0 };
int cdrom_interface_current;
int cdrom_assigned_letters = 0;
#ifdef ENABLE_CDROM_LOG
int cdrom_do_log = ENABLE_CDROM_LOG;
@@ -2795,6 +2796,8 @@ cdrom_global_init(void)
void
cdrom_hard_reset(void)
{
cdrom_assigned_letters = 0;
for (uint8_t i = 0; i < CDROM_NUM; i++) {
cdrom_t *dev = &cdrom[i];
@@ -2825,6 +2828,7 @@ cdrom_hard_reset(void)
}
dev->cd_status = CD_STATUS_EMPTY;
dev->host_letter = 0xff;
if (strlen(dev->image_path) > 0) {
#ifdef _WIN32

View File

@@ -61,6 +61,7 @@
#define VIA_PIPC_586B 0x05864700
#define VIA_PIPC_596A 0x05960900
#define VIA_PIPC_596B 0x05962300
#define VIA_PIPC_596 0x0596
#define VIA_PIPC_686A 0x06861400
#define VIA_PIPC_686B 0x06864000
#define VIA_PIPC_8231 0x82311000
@@ -413,7 +414,7 @@ pipc_reset_hard(void *priv)
dev->power_regs[0x34] = 0x68;
dev->power_regs[0x40] = 0x20;
dev->power_regs[0x42] = 0x00;
dev->power_regs[0x42] = ((dev->local >> 16) == VIA_PIPC_596) ? 0x50 : 0x00;
acpi_set_irq_line(dev->acpi, 0x00);
dev->power_regs[0x48] = 0x01;
@@ -1595,7 +1596,7 @@ pipc_reset(void *priv)
pipc_write(pm_func, 0x48, 0x01, priv);
pipc_write(pm_func, 0x49, 0x00, priv);
dev->power_regs[0x42] = 0x00;
dev->power_regs[0x42] = ((dev->local >> 16) == VIA_PIPC_596) ? 0x50 : 0x00;
acpi_set_irq_line(dev->acpi, 0x00);
pipc_write(1, 0x04, 0x80, priv);

View File

@@ -131,6 +131,8 @@ load_general(void)
video_filter_method = ini_section_get_int(cat, "video_filter_method", 1);
inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0);
force_43 = !!ini_section_get_int(cat, "force_43", 0);
scale = ini_section_get_int(cat, "scale", 1);
if (scale > 9)
@@ -1900,6 +1902,10 @@ save_general(void)
const char *va_name;
ini_section_set_int(cat, "inhibit_multimedia_keys", inhibit_multimedia_keys);
if (inhibit_multimedia_keys == 0)
ini_section_delete_var(cat, "inhibit_multimedia_keys");
ini_section_set_int(cat, "sound_muted", sound_muted);
if (sound_muted == 0)
ini_section_delete_var(cat, "sound_muted");

View File

@@ -107,6 +107,7 @@ extern uint64_t instru_run_ms;
#define window_y monitor_settings[0].mon_window_y
#define window_w monitor_settings[0].mon_window_w
#define window_h monitor_settings[0].mon_window_h
extern int inhibit_multimedia_keys; /* (C) Inhibit multimedia keys on Windows. */
extern int window_remember;
extern int vid_resize; /* (C) allow resizing */
extern int invert_display; /* (C) invert the display */

View File

@@ -335,6 +335,8 @@ typedef struct cdrom {
uint8_t subch_buffer[96];
int cdrom_sector_size;
/* Only used on Windows hosts for disc change notifications. */
uint8_t host_letter;
/* Needs some extra breathing space in case of overflows. */
uint8_t raw_buffer[4096];
@@ -437,6 +439,8 @@ extern int cdrom_is_empty(const uint8_t id);
extern void cdrom_eject(const uint8_t id);
extern void cdrom_reload(const uint8_t id);
extern int cdrom_assigned_letters;
#ifdef __cplusplus
}
#endif

View File

@@ -2141,3 +2141,6 @@ msgstr ""
msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer."
msgstr ""
msgid "Inhibit multimedia keys on Windows"
msgstr ""

View File

@@ -130,16 +130,6 @@ QStatusBar::item {
border: none;
}
QStatusBar QToolTip {
background-color: #666666;
border: 1px solid #272727;
color: #272727;
/* Remove padding, for fix combo box tooltip */
padding: 0px;
/* Reducing transparency to read better */
opacity: 230;
}
QStatusBar QLabel {
/* Fixes Spyder #9120, #9121 */
background: transparent;

View File

@@ -226,7 +226,30 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
detection; rest can't be reliably detected. */
DWORD vkCode = lpKdhs->vkCode;
bool up = !!(lpKdhs->flags & LLKHF_UP);
ret = CallNextHookEx(NULL, nCode, wParam, lParam);;
if (inhibit_multimedia_keys
&& (lpKdhs->vkCode == VK_MEDIA_PLAY_PAUSE
|| lpKdhs->vkCode == VK_MEDIA_NEXT_TRACK
|| lpKdhs->vkCode == VK_MEDIA_PREV_TRACK
|| lpKdhs->vkCode == VK_VOLUME_DOWN
|| lpKdhs->vkCode == VK_VOLUME_UP
|| lpKdhs->vkCode == VK_VOLUME_MUTE
|| lpKdhs->vkCode == VK_MEDIA_STOP
|| lpKdhs->vkCode == VK_LAUNCH_MEDIA_SELECT
|| lpKdhs->vkCode == VK_LAUNCH_MAIL
|| lpKdhs->vkCode == VK_LAUNCH_APP1
|| lpKdhs->vkCode == VK_LAUNCH_APP2
|| lpKdhs->vkCode == VK_HELP
|| lpKdhs->vkCode == VK_BROWSER_BACK
|| lpKdhs->vkCode == VK_BROWSER_FORWARD
|| lpKdhs->vkCode == VK_BROWSER_FAVORITES
|| lpKdhs->vkCode == VK_BROWSER_HOME
|| lpKdhs->vkCode == VK_BROWSER_REFRESH
|| lpKdhs->vkCode == VK_BROWSER_SEARCH
|| lpKdhs->vkCode == VK_BROWSER_STOP))
ret = TRUE;
else
ret = CallNextHookEx(NULL, nCode, wParam, lParam);
switch (vkCode)
{
@@ -349,6 +372,27 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
ret = TRUE;
else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED))
ret = TRUE;
else if (inhibit_multimedia_keys
&& (lpKdhs->vkCode == VK_MEDIA_PLAY_PAUSE
|| lpKdhs->vkCode == VK_MEDIA_NEXT_TRACK
|| lpKdhs->vkCode == VK_MEDIA_PREV_TRACK
|| lpKdhs->vkCode == VK_VOLUME_DOWN
|| lpKdhs->vkCode == VK_VOLUME_UP
|| lpKdhs->vkCode == VK_VOLUME_MUTE
|| lpKdhs->vkCode == VK_MEDIA_STOP
|| lpKdhs->vkCode == VK_LAUNCH_MEDIA_SELECT
|| lpKdhs->vkCode == VK_LAUNCH_MAIL
|| lpKdhs->vkCode == VK_LAUNCH_APP1
|| lpKdhs->vkCode == VK_LAUNCH_APP2
|| lpKdhs->vkCode == VK_HELP
|| lpKdhs->vkCode == VK_BROWSER_BACK
|| lpKdhs->vkCode == VK_BROWSER_FORWARD
|| lpKdhs->vkCode == VK_BROWSER_FAVORITES
|| lpKdhs->vkCode == VK_BROWSER_HOME
|| lpKdhs->vkCode == VK_BROWSER_REFRESH
|| lpKdhs->vkCode == VK_BROWSER_SEARCH
|| lpKdhs->vkCode == VK_BROWSER_STOP))
ret = TRUE;
else
ret = CallNextHookEx(NULL, nCode, wParam, lParam);
@@ -359,7 +403,7 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
} else if (!(lpKdhs->flags & LLKHF_EXTENDED) && (lpKdhs->vkCode == 0x00000013)) {
/* Pause - send E1 1D. */
win_keyboard_handle(0xe1, 0, 0, 0);
win_keyboard_handle(0x1d, LLKHF_UP, 0, 0);
win_keyboard_handle(0x1d, lpKdhs->flags & LLKHF_UP, 0, 0);
}
} else if (!last && (lpKdhs->scanCode == 0x00000036))
/* Non-fake right shift. */
@@ -370,7 +414,11 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
else if (last && (lpKdhs->scanCode == 0x00000036))
last = 0;
win_keyboard_handle(lpKdhs->scanCode, lpKdhs->flags & LLKHF_UP, lpKdhs->flags & LLKHF_EXTENDED, 0);
if ((lpKdhs->scanCode == 0xf1) || (lpKdhs->scanCode == 0xf2))
/* Hanja and Han/Eng keys, suppress the extended flag. */
win_keyboard_handle(lpKdhs->scanCode, lpKdhs->flags & LLKHF_UP, 0, 0);
else
win_keyboard_handle(lpKdhs->scanCode, lpKdhs->flags & LLKHF_UP, lpKdhs->flags & LLKHF_EXTENDED, 0);
return ret;
}
@@ -665,7 +713,7 @@ main(int argc, char *argv[])
/* Force raw input if a debugger is present. */
if (IsDebuggerPresent()) {
pclog("WARNING: Debugged detected, forcing raw input\n");
pclog("WARNING: Debugger detected, forcing raw input\n");
hook_enabled = 0;
}

View File

@@ -34,6 +34,7 @@ extern MainWindow* main_window;
#include <QEvent>
#include <QApplication>
#include <QString>
#include <QByteArray>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
@@ -73,54 +74,76 @@ extern int video_vsync;
extern int video_focus_dim;
extern int video_refresh_rate;
const char *vertex_shader_default_tex_src = "#version 130\n"
"\n"
"in vec4 VertexCoord;\n"
"in vec2 TexCoord;\n"
"\n"
"out vec2 texCoord;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = VertexCoord;\n"
" texCoord = TexCoord;\n"
"}\n";
const char* vertex_shader_default_tex_src =
#ifdef __APPLE__
"#version 150\n"
#else
"#version 130\n"
#endif
"\n"
"in vec4 VertexCoord;\n"
"in vec2 TexCoord;\n"
"\n"
"out vec2 texCoord;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = VertexCoord;\n"
" texCoord = TexCoord;\n"
"}\n";
const char *fragment_shader_default_tex_src = "#version 130\n"
"\n"
"in vec2 texCoord;\n"
"uniform sampler2D Texture;\n"
"\n"
"out vec4 color;"
"\n"
"void main()\n"
"{\n"
" color = texture(Texture, texCoord);\n"
"}\n";
const char* fragment_shader_default_tex_src =
#ifdef __APPLE__
"#version 150\n"
#else
"#version 130\n"
#endif
"\n"
"in vec2 texCoord;\n"
"uniform sampler2D Texture;\n"
"\n"
"out vec4 color;"
"\n"
"void main()\n"
"{\n"
" color = texture(Texture, texCoord);\n"
" color.a = 1.0;\n"
"}\n";
const char *vertex_shader_default_color_src = "#version 130\n"
"\n"
"in vec4 VertexCoord;\n"
"in vec4 Color;\n"
"\n"
"out vec4 color;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = VertexCoord;\n"
" color = Color;\n"
"}\n";
const char* vertex_shader_default_color_src =
#ifdef __APPLE__
"#version 150\n"
#else
"#version 130\n"
#endif
"\n"
"in vec4 VertexCoord;\n"
"in vec4 Color;\n"
"\n"
"out vec4 color;\n"
"\n"
"void main()\n"
"{\n"
" gl_Position = VertexCoord;\n"
" color = Color;\n"
"}\n";
const char *fragment_shader_default_color_src = "#version 130\n"
"\n"
"in vec4 color;\n"
"\n"
"out vec4 outColor;"
"\n"
"void main()\n"
"{\n"
" outColor = color;\n"
"}\n";
const char* fragment_shader_default_color_src =
#ifdef __APPLE__
"#version 150\n"
#else
"#version 130\n"
#endif
"\n"
"in vec4 color;\n"
"\n"
"out vec4 outColor;"
"\n"
"void main()\n"
"{\n"
" outColor = color;\n"
" outColor.a = 1.0;\n"
"}\n";
static inline int
next_pow2(unsigned int n)
@@ -171,30 +194,32 @@ OpenGLRenderer::create_program(struct shader_program *program)
int
OpenGLRenderer::compile_shader(GLenum shader_type, const char *prepend, const char *program, int *dst)
{
const char *source[3];
QRegularExpression versionRegex("^\\s*(#version\\s+\\w+)", QRegularExpression::MultilineOption);
QString progSource = QString(program);
QByteArray finalSource = nullptr;
const char *source[5];
char version[50];
int ver = 0;
char *version_loc = (char *) strstr(program, "#version");
if (version_loc)
ver = (int) strtol(version_loc + 8, (char **) &program, 10);
else {
ver = glsl_version[0] * 100 + glsl_version[1] * 10;
if (ver == 300)
ver = 130;
else if (ver == 310)
ver = 140;
else if (ver == 320)
ver = 150;
if (version_loc) {
snprintf(version, 49, "%s\n", versionRegex.match(progSource).captured(1).toLatin1().data());
progSource.remove(versionRegex);
} else {
snprintf(version, 49, "%s\n", this->glslVersion.toLatin1().data());
}
sprintf(version, "#version %d\n", ver);
source[0] = version;
source[1] = prepend ? prepend : "";
source[2] = program;
/* Remove parameter lines. */
progSource.remove(QRegularExpression("^\\s*#pragma parameter.*?\\n", QRegularExpression::MultilineOption));
pclog("GLSL version %d\n", ver);
finalSource = progSource.toLatin1();
source[0] = version;
source[1] = "\n#extension GL_ARB_shading_language_420pack : enable\n";
source[2] = prepend ? prepend : "";
source[3] = "\n#line 1\n";
source[4] = finalSource.data();
GLuint shader = glw.glCreateShader(shader_type);
glw.glShaderSource(shader, 3, source, NULL);
glw.glShaderSource(shader, 5, source, NULL);
glw.glCompileShader(shader);
GLint status = 0;
@@ -805,6 +830,7 @@ OpenGLRenderer::OpenGLRenderer(QWidget *parent)
source.setRect(0, 0, 100, 100);
isInitialized = false;
isFinalized = false;
context = nullptr;
}
OpenGLRenderer::~OpenGLRenderer() { finalize(); }
@@ -840,6 +866,15 @@ OpenGLRenderer::initialize()
pclog("Using OpenGL %s\n", glw.glGetString(GL_VERSION));
pclog("Using Shading Language %s\n", glw.glGetString(GL_SHADING_LANGUAGE_VERSION));
glslVersion = reinterpret_cast<const char *>(glw.glGetString(GL_SHADING_LANGUAGE_VERSION));
glslVersion.truncate(4);
glslVersion.remove('.');
glslVersion.prepend("#version ");
if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES)
glslVersion.append(" es");
else if (context->format().profile() == QSurfaceFormat::CoreProfile)
glslVersion.append(" core");
glw.glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
pclog("Max texture size: %dx%d\n", max_texture_size, max_texture_size);
@@ -1075,7 +1110,7 @@ OpenGLRenderer::initialize()
void
OpenGLRenderer::finalize()
{
if (isFinalized)
if (isFinalized || !context)
return;
context->makeCurrent(this);

View File

@@ -368,6 +368,8 @@ plat_mmap(size_t size, uint8_t executable)
void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE | (executable ? MAP_JIT : 0), -1, 0);
# elif defined(PROT_MPROTECT)
void *ret = mmap(0, size, PROT_MPROTECT(PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0)), MAP_ANON | MAP_PRIVATE, -1, 0);
if (ret)
mprotect(ret, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0));
# else
void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE, -1, 0);
# endif
@@ -645,7 +647,7 @@ ProgSettings::reloadStrings()
translatedstrings[STRING_NET_ERROR] = QCoreApplication::translate("", "Failed to initialize network driver").toStdWString();
translatedstrings[STRING_NET_ERROR_DESC] = QCoreApplication::translate("", "The network configuration will be switched to the null driver").toStdWString();
translatedstrings[STRING_ESCP_ERROR_TITLE] = QCoreApplication::translate("", "Unable to find Dot-Matrix fonts").toStdWString();
translatedstrings[STRING_ESCP_ERROR_DESC] = QCoreApplication::translate("", "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulatio of the Generic ESC/P Dot-Matrix Printer.").toStdWString();
translatedstrings[STRING_ESCP_ERROR_DESC] = QCoreApplication::translate("", "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P Dot-Matrix Printer.").toStdWString();
}
wchar_t *

View File

@@ -115,14 +115,19 @@ ProgSettings::ProgSettings(QWidget *parent)
mouseSensitivity = mouse_sensitivity;
ui->horizontalSlider->setValue(mouseSensitivity * 100.);
ui->openDirUsrPath->setChecked(open_dir_usr_path > 0);
ui->checkBoxMultimediaKeys->setChecked(inhibit_multimedia_keys);
#ifndef Q_OS_WINDOWS
ui->checkBoxMultimediaKeys->setHidden(true);
#endif
}
void
ProgSettings::accept()
{
strcpy(icon_set, ui->comboBox->currentData().toString().toUtf8().data());
lang_id = ui->comboBoxLanguage->currentData().toUInt();
open_dir_usr_path = ui->openDirUsrPath->isChecked() ? 1 : 0;
lang_id = ui->comboBoxLanguage->currentData().toUInt();
open_dir_usr_path = ui->openDirUsrPath->isChecked() ? 1 : 0;
inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked();
loadTranslators(QCoreApplication::instance());
reloadStrings();

View File

@@ -27,8 +27,122 @@
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="sizeConstraint">
<enum>QLayout::SetFixedSize</enum>
<enum>QLayout::SizeConstraint::SetFixedSize</enum>
</property>
<item row="9" column="0">
<widget class="QCheckBox" name="openDirUsrPath">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Select media images from program working directory</string>
</property>
</widget>
</item>
<item row="8" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="5" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0" colspan="2">
<widget class="QComboBox" name="comboBoxLanguage">
<property name="maxVisibleItems">
<number>30</number>
</property>
<item>
<property name="text">
<string>(System Default)</string>
</property>
</item>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="pushButtonLanguage">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="13" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Icon set:</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Language:</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QSlider" name="horizontalSlider">
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>20</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QComboBox" name="comboBox">
<property name="editable">
@@ -51,13 +165,6 @@
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Icon set:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButton">
<property name="text">
@@ -65,77 +172,6 @@
</property>
</widget>
</item>
<item row="8" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="12" column="0" colspan="2">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
<item row="7" column="0" colspan="3">
<widget class="QSlider" name="horizontalSlider">
<property name="minimum">
<number>10</number>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="pageStep">
<number>20</number>
</property>
<property name="value">
<number>100</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QComboBox" name="comboBoxLanguage">
<property name="maxVisibleItems">
<number>30</number>
</property>
<item>
<property name="text">
<string>(System Default)</string>
</property>
</item>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Language:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="pushButtonLanguage">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QPushButton" name="pushButton_2">
<property name="text">
@@ -143,39 +179,10 @@
</property>
</widget>
</item>
<item row="5" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="9" column="0">
<widget class="QCheckBox" name="openDirUsrPath">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<item row="10" column="0">
<widget class="QCheckBox" name="checkBoxMultimediaKeys">
<property name="text">
<string>Select media images from program working directory</string>
<string>Inhibit multimedia keys on Windows</string>
</property>
</widget>
</item>

View File

@@ -270,7 +270,7 @@ RendererStack::leaveEvent(QEvent *event)
{
mousedata.mouse_tablet_in_proximity = 0;
if (mouse_input_mode == 1 && QApplication::overrideCursor()) {
if (mouse_input_mode >= 1 && QApplication::overrideCursor()) {
while (QApplication::overrideCursor())
QApplication::restoreOverrideCursor();
}

View File

@@ -157,27 +157,16 @@ WindowsRawInputFilter::~WindowsRawInputFilter()
static void
notify_drives(ULONG unitmask, int empty)
{
char p[1024] = { 0 };
if (unitmask & cdrom_assigned_letters) for (int i = 0; i < CDROM_NUM; i++) {
cdrom_t *dev = &(cdrom[i]);
for (int i = 0; i < 26; ++i) {
if (unitmask & 0x1) {
cdrom_t *dev = NULL;
sprintf(p, "ioctl://\\\\.\\%c:", 'A' + i);
for (int i = 0; i < CDROM_NUM; i++)
if (!stricmp(cdrom[i].image_path, p)) {
dev = &(cdrom[i]);
if (empty)
cdrom_set_empty(dev);
else
cdrom_update_status(dev);
// pclog("CD-ROM %i : Drive notified of media %s\n",
// dev->id, empty ? "removal" : "change");
}
if ((dev->host_letter != 0xff) &&
(unitmask & (1 << dev->host_letter))) {
if (empty)
cdrom_set_empty(dev);
else
cdrom_update_status(dev);
}
unitmask = unitmask >> 1;
}
}

View File

@@ -748,6 +748,11 @@ ioctl_close(void *local)
log_close(ioctl->log);
ioctl->log = NULL;
cdrom_assigned_letters &= ~(1 << ioctl->dev->host_letter);
ioctl->dev->host_letter = 0xff;
free(ioctl);
}
static void
@@ -788,19 +793,22 @@ ioctl_open(cdrom_t *dev, const char *drv)
ioctl_t *ioctl = (ioctl_t *) calloc(1, sizeof(ioctl_t));
if (ioctl != NULL) {
char n[1024] = { 0 };
char n[1024] = { 0 };
sprintf(n, "CD-ROM %i IOCtl", dev->id + 1);
ioctl->log = log_open(n);
ioctl->log = log_open(n);
memset(ioctl->path, 0x00, sizeof(ioctl->path));
wsprintf(ioctl->path, L"%S", &(drv[8]));
ioctl_log(ioctl->log, "Path is %S\n", ioctl->path);
ioctl->dev = dev;
ioctl->dev = dev;
dev->ops = &ioctl_ops;
dev->ops = &ioctl_ops;
dev->host_letter = (drv[12] & 0xdf) - 0x41;
cdrom_assigned_letters |= (1 << dev->host_letter);
ioctl_load(ioctl);
}