diff --git a/projects/msvc/GLideN64.vcxproj b/projects/msvc/GLideN64.vcxproj
index ab8d441a..4a8898a6 100644
--- a/projects/msvc/GLideN64.vcxproj
+++ b/projects/msvc/GLideN64.vcxproj
@@ -322,7 +322,6 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
true
-
true
@@ -476,7 +475,6 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
-
@@ -557,4 +555,4 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")
-
+
\ No newline at end of file
diff --git a/projects/msvc/GLideN64.vcxproj.filters b/projects/msvc/GLideN64.vcxproj.filters
index 85c8cda9..e94f737d 100644
--- a/projects/msvc/GLideN64.vcxproj.filters
+++ b/projects/msvc/GLideN64.vcxproj.filters
@@ -158,9 +158,6 @@
Source Files
-
- Source Files
-
Source Files
@@ -499,9 +496,6 @@
Header Files
-
- Header Files
-
Header Files
@@ -796,4 +790,4 @@
Resource Files
-
+
\ No newline at end of file
diff --git a/projects/msvc/GLideNUI.vcxproj b/projects/msvc/GLideNUI.vcxproj
index d0027245..e7ec7264 100644
--- a/projects/msvc/GLideNUI.vcxproj
+++ b/projects/msvc/GLideNUI.vcxproj
@@ -51,7 +51,7 @@
_WINDOWS;UNICODE;WIN32;QT_STATICPLUGIN;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;QT_UITOOLS_LIB;QT_WINEXTRAS_LIB;%(PreprocessorDefinitions)
- $(QTDIR)\include;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtCore;release;.;$(QTDIR)\mkspecs\win32-msvc2013;.\GeneratedFiles;$(QTDIR)\include\QtUiTools;$(QTDIR)\include\QtWinExtras;%(AdditionalIncludeDirectories)
+ $(QTDIR)\include;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtCore;release;.;$(QTDIR)\mkspecs\win32-msvc2013;.\GeneratedFiles;$(QTDIR)\include\QtUiTools;$(QTDIR)\include\QtWinExtras;$(ProjectDir)..\..\src\osal;%(AdditionalIncludeDirectories)
-Zm200 -w34100 -w34189 %(AdditionalOptions)
$(IntDir)
false
diff --git a/projects/msvc/osal.vcxproj b/projects/msvc/osal.vcxproj
index 0659e90b..b14e49ce 100644
--- a/projects/msvc/osal.vcxproj
+++ b/projects/msvc/osal.vcxproj
@@ -79,10 +79,13 @@
+
+
+
diff --git a/projects/msvc/osal.vcxproj.filters b/projects/msvc/osal.vcxproj.filters
index ef9b56bf..25551938 100644
--- a/projects/msvc/osal.vcxproj.filters
+++ b/projects/msvc/osal.vcxproj.filters
@@ -14,10 +14,19 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5064af0f..e95ce6eb 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -41,7 +41,6 @@ set(GLideN64_SOURCES
GLideN64.cpp
GraphicsDrawer.cpp
gSP.cpp
- Keys.cpp
Log.cpp
N64.cpp
NoiseTexture.cpp
diff --git a/src/Config.cpp b/src/Config.cpp
index 5d7623ef..0aa5dad8 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -8,6 +8,7 @@
#include "Config.h"
#include "GBI.h"
#include "wst.h"
+#include "osal_keys.h"
void Config::resetToDefaults()
{
@@ -91,8 +92,6 @@ void Config::resetToDefaults()
textureFilter.txHiresEnable = 0;
textureFilter.txHiresFullAlphaChannel = 1;
textureFilter.txHresAltCRC = 0;
- textureFilter.txDump = 0;
- textureFilter.txReloadHiresTex = 0;
textureFilter.txForce16bpp = 0;
textureFilter.txCacheCompression = 1;
@@ -133,6 +132,9 @@ void Config::resetToDefaults()
onScreenDisplay.percent = 0;
onScreenDisplay.pos = posBottomLeft;
+ hotkeys.keys[HotKey::hkTexDump] = KEY_D;
+ hotkeys.keys[HotKey::hkHdTexToggle] = KEY_T;
+
debug.dumpMode = 0;
}
@@ -155,3 +157,33 @@ void Config::validate()
graphics2D.correctTexrectCoords = tcDisable;
}
}
+
+const char* Config::hotkeyIniName(u32 _idx)
+{
+ switch (_idx)
+ {
+ case Config::HotKey::hkTexDump:
+ return "hkTexDump";
+ case Config::HotKey::hkHdTexReload:
+ return "hkHdTexReload";
+ case Config::HotKey::hkHdTexToggle:
+ return "hkHdTexToggle";
+ case Config::HotKey::hkVsync:
+ return "hkVsync";
+ case Config::HotKey::hkFBEmulation:
+ return "hkFBEmulation";
+ case Config::HotKey::hkN64DepthCompare:
+ return "hkN64DepthCompare";
+ case Config::HotKey::hkOsdVis:
+ return "hkOsdVis";
+ case Config::HotKey::hkOsdFps:
+ return "hkOsdFps";
+ case Config::HotKey::hkOsdPercent:
+ return "hkOsdPercent";
+ case Config::HotKey::hkOsdInternalResolution:
+ return "hkOsdInternalResolution";
+ case Config::HotKey::hkOsdRenderingResolution:
+ return "hkOsdRenderingResolution";
+ }
+ return nullptr;
+}
diff --git a/src/Config.h b/src/Config.h
index 5ea4e9ac..b665b22b 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -167,8 +167,6 @@ struct Config
u32 txHiresEnable; // Use high-resolution texture packs
u32 txHiresFullAlphaChannel; // Use alpha channel fully
u32 txHresAltCRC; // Use alternative method of paletted textures CRC calculation
- u32 txDump; // Dump textures
- u32 txReloadHiresTex; // Reload hires textures
u32 txForce16bpp; // Force use 16bit color textures
u32 txCacheCompression; // Zip textures cache
@@ -215,12 +213,32 @@ struct Config
u32 pos;
} onScreenDisplay;
+ enum HotKey {
+ hkTexDump = 0,
+ hkHdTexReload,
+ hkHdTexToggle,
+ hkVsync,
+ hkFBEmulation,
+ hkN64DepthCompare,
+ hkOsdVis,
+ hkOsdFps,
+ hkOsdPercent,
+ hkOsdInternalResolution,
+ hkOsdRenderingResolution,
+ hkTotal
+ };
+
+ struct {
+ u8 keys[hkTotal];
+ } hotkeys;
+
struct {
u32 dumpMode;
} debug;
void resetToDefaults();
void validate();
+ static const char* hotkeyIniName(u32 _idx);
};
#define hack_Ogre64 (1<<0) //Ogre Battle 64 background copy
diff --git a/src/Debugger.cpp b/src/Debugger.cpp
index 48379cb3..29339308 100644
--- a/src/Debugger.cpp
+++ b/src/Debugger.cpp
@@ -5,7 +5,6 @@
#include "GLideN64.h"
#include "Revision.h"
#include "RSP.h"
-#include "Keys.h"
#include "Config.h"
#include "Combiner.h"
#include "FrameBuffer.h"
@@ -13,6 +12,7 @@
#include "TextDrawer.h"
#include "DebugDump.h"
#include "Debugger.h"
+#include "osal_keys.h"
#ifndef MUPENPLUSAPI
#include "windows/GLideN64_windows.h"
@@ -153,30 +153,30 @@ Debugger::~Debugger()
void Debugger::checkDebugState()
{
- if (isKeyPressed(G64_VK_SCROLL, 0x0001))
+ if (osal_is_key_pressed(KEY_ScrollLock, 0x0001))
m_bDebugMode = !m_bDebugMode;
- if (m_bDebugMode && isKeyPressed(G64_VK_INSERT, 0x0001))
+ if (m_bDebugMode && osal_is_key_pressed(KEY_Insert, 0x0001))
m_bCapture = true;
}
void Debugger::_debugKeys()
{
- if (isKeyPressed(G64_VK_RIGHT, 0x0001)) {
+ if (osal_is_key_pressed(KEY_Right, 0x0001)) {
if (std::next(m_triSel) != m_triangles.cend())
++m_triSel;
else
m_triSel = m_triangles.cbegin();
}
- if (isKeyPressed(G64_VK_LEFT, 0x0001)) {
+ if (osal_is_key_pressed(KEY_Left, 0x0001)) {
if (m_triSel != m_triangles.cbegin())
--m_triSel;
else
m_triSel = std::prev(m_triangles.cend());
}
- if (isKeyPressed(G64_VK_F, 0x0001)) {
+ if (osal_is_key_pressed(KEY_F, 0x0001)) {
if (m_pCurTexInfo != nullptr) {
auto curTexName = m_pCurTexInfo->texture->name;
auto beginItr =
@@ -200,51 +200,51 @@ void Debugger::_debugKeys()
}
}
- if (isKeyPressed(G64_VK_B, 0x0001)) {
+ if (osal_is_key_pressed(KEY_B, 0x0001)) {
if (std::next(m_curFBAddr) != m_fbAddrs.end())
++m_curFBAddr;
else
m_curFBAddr = m_fbAddrs.begin();
}
- if (isKeyPressed(G64_VK_V, 0x0001)) {
+ if (osal_is_key_pressed(KEY_V, 0x0001)) {
if (m_curFBAddr != m_fbAddrs.begin())
--m_curFBAddr;
else
m_curFBAddr = std::prev(m_fbAddrs.end());
}
- if (isKeyPressed(G64_VK_Q, 0x0001))
+ if (osal_is_key_pressed(KEY_Q, 0x0001))
m_tmu = 0;
- if (isKeyPressed(G64_VK_W, 0x0001))
+ if (osal_is_key_pressed(KEY_W, 0x0001))
m_tmu = 1;
- if (isKeyPressed(G64_VK_A, 0x0001))
+ if (osal_is_key_pressed(KEY_A, 0x0001))
m_textureMode = TextureMode::both; // texture & texture alpha
- if (isKeyPressed(G64_VK_S, 0x0001))
+ if (osal_is_key_pressed(KEY_S, 0x0001))
m_textureMode = TextureMode::texture; // texture
- if (isKeyPressed(G64_VK_D, 0x0001))
+ if (osal_is_key_pressed(KEY_D, 0x0001))
m_textureMode = TextureMode::alpha; // texture alpha
- if (isKeyPressed(G64_VK_1, 0x0001))
+ if (osal_is_key_pressed(KEY_1, 0x0001))
m_curPage = Page::general;
- if (isKeyPressed(G64_VK_2, 0x0001))
+ if (osal_is_key_pressed(KEY_2, 0x0001))
m_curPage = Page::tex1;
- if (isKeyPressed(G64_VK_3, 0x0001))
+ if (osal_is_key_pressed(KEY_3, 0x0001))
m_curPage = Page::tex2;
- if (isKeyPressed(G64_VK_4, 0x0001))
+ if (osal_is_key_pressed(KEY_4, 0x0001))
m_curPage = Page::colors;
- if (isKeyPressed(G64_VK_5, 0x0001))
+ if (osal_is_key_pressed(KEY_5, 0x0001))
m_curPage = Page::blender;
- if (isKeyPressed(G64_VK_6, 0x0001))
+ if (osal_is_key_pressed(KEY_6, 0x0001))
m_curPage = Page::othermode_l;
- if (isKeyPressed(G64_VK_7, 0x0001))
+ if (osal_is_key_pressed(KEY_7, 0x0001))
m_curPage = Page::othermode_h;
- if (isKeyPressed(G64_VK_8, 0x0001))
+ if (osal_is_key_pressed(KEY_8, 0x0001))
m_curPage = Page::texcoords;
- if (isKeyPressed(G64_VK_9, 0x0001))
+ if (osal_is_key_pressed(KEY_9, 0x0001))
m_curPage = Page::coords;
- if (isKeyPressed(G64_VK_0, 0x0001))
+ if (osal_is_key_pressed(KEY_0, 0x0001))
m_curPage = Page::texinfo;
}
@@ -517,17 +517,17 @@ void Debugger::_drawTextureCache()
}
}
- if (isKeyPressed(G64_VK_UP, 0x0001)) {
+ if (osal_is_key_pressed(KEY_Up, 0x0001)) {
if ((m_startTexRow[m_tmu] + 1) * m_cacheViewerCols < texInfos.size())
m_startTexRow[m_tmu]++;
}
- if (isKeyPressed(G64_VK_DOWN, 0x0001)) {
+ if (osal_is_key_pressed(KEY_Down, 0x0001)) {
if (m_startTexRow[m_tmu] > 0)
--m_startTexRow[m_tmu];
}
- if (isKeyPressed(G64_VK_SPACE, 0x0001)) {
+ if (osal_is_key_pressed(KEY_Space, 0x0001)) {
if (m_triSel->tex_info[m_tmu]) {
graphics::ObjectHandle tex = m_triSel->tex_info[m_tmu]->texture->name;
auto iter = std::find_if(texInfos.begin(),
@@ -1264,12 +1264,12 @@ void Debugger::_drawDebugInfo()
const f32 lrx = (f32)(winWidth) * (2.0f * scaleX) - 1.0f;
const f32 lry = -((f32)(winHeight * 5 / 8)* (2.0f * scaleY) - 1.0f);
- while (!isKeyPressed(G64_VK_INSERT, 0x0001)) {
+ while (!osal_is_key_pressed(KEY_Insert, 0x0001)) {
_debugKeys();
_drawFrameBuffer(frameBufferList().findBuffer(*m_curFBAddr));
_drawTextureCache();
- if (isKeyPressed(G64_VK_LBUTTON, 0x0001))
+ if (osal_is_key_pressed(MB_Left, 0x0001))
_findSelected();
_drawTriangleFrame();
_drawMouseCursor();
diff --git a/src/GLideNUI/ConfigDialog.cpp b/src/GLideNUI/ConfigDialog.cpp
index d09df1e0..94dea89d 100644
--- a/src/GLideNUI/ConfigDialog.cpp
+++ b/src/GLideNUI/ConfigDialog.cpp
@@ -16,6 +16,8 @@
#include "Settings.h"
#include "ConfigDialog.h"
#include "FullscreenResolutions.h"
+#include "qevent.h"
+#include "osal_keys.h"
static
struct
@@ -66,6 +68,46 @@ u32 powof(u32 dim)
return i;
}
+QString ConfigDialog::_hotkeyDescription(quint32 _idx) const
+{
+ switch (_idx)
+ {
+ case Config::HotKey::hkTexDump:
+ return tr("Toggle textures dump");
+ case Config::HotKey::hkHdTexReload:
+ return tr("Reload HD textures");
+ case Config::HotKey::hkHdTexToggle:
+ return tr("Toggle HD textures");
+ case Config::HotKey::hkVsync:
+ return tr("Toggle VSync");
+ case Config::HotKey::hkFBEmulation:
+ return tr("Toggle frame buffer emulation");
+ case Config::HotKey::hkN64DepthCompare:
+ return tr("Toggle N64 depth compare");
+ case Config::HotKey::hkOsdVis:
+ return tr("Toggle OSD VI/S");
+ case Config::HotKey::hkOsdFps:
+ return tr("Toggle OSD FPS");
+ case Config::HotKey::hkOsdPercent:
+ return tr("Toggle OSD percent");
+ case Config::HotKey::hkOsdInternalResolution:
+ return tr("Toggle OSD internal resolution");
+ case Config::HotKey::hkOsdRenderingResolution:
+ return tr("Toggle OSD rendering resolution");
+ }
+ return tr("Unknown hotkey");
+}
+
+class HotkeyItemWidget : public QWidget
+{
+// Q_OBJECT
+public:
+ HotkeyItemWidget(QWidget* pParent = Q_NULLPTR) : QWidget(pParent) {}
+ quint32 hidCode() const { return m_hid; }
+ void setHidCode(quint32 _code) { m_hid = _code; }
+private:
+ quint32 m_hid = 0;
+};
void ConfigDialog::_init(bool reInit, bool blockCustomSettings)
{
@@ -268,10 +310,6 @@ void ConfigDialog::_init(bool reInit, bool blockCustomSettings)
ui->texturePackGroupBox->setChecked(config.textureFilter.txHiresEnable != 0);
ui->alphaChannelCheckBox->setChecked(config.textureFilter.txHiresFullAlphaChannel != 0);
ui->alternativeCRCCheckBox->setChecked(config.textureFilter.txHresAltCRC != 0);
- ui->textureDumpCheckBox->toggle();
- ui->textureDumpCheckBox->setChecked(config.textureFilter.txDump != 0);
- ui->textureReloadCheckBox->toggle();
- ui->textureReloadCheckBox->setChecked(config.textureFilter.txReloadHiresTex != 0);
ui->force16bppCheckBox->setChecked(config.textureFilter.txForce16bpp != 0);
ui->compressCacheCheckBox->setChecked(config.textureFilter.txCacheCompression != 0);
ui->saveTextureCacheCheckBox->setChecked(config.textureFilter.txSaveCache != 0);
@@ -337,6 +375,31 @@ void ConfigDialog::_init(bool reInit, bool blockCustomSettings)
ui->dumpNormalCheckBox->setChecked((config.debug.dumpMode & DEBUG_NORMAL) != 0);
ui->dumpDetailCheckBox->setChecked((config.debug.dumpMode & DEBUG_DETAIL) != 0);
+ {
+ ui->hotkeyListWidget->clear();
+ for (quint32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ HotkeyItemWidget* pWgt = new HotkeyItemWidget;
+ QLayout* pLayout = new QHBoxLayout;
+ pLayout->addWidget(new QLabel(_hotkeyDescription(idx)));
+
+ QPushButton* pBtn = new QPushButton(tr("Click me"));
+ connect(pBtn, SIGNAL(clicked()), SLOT(on_btn_clicked()));
+ pLayout->addWidget(pBtn);
+ pWgt->setLayout(pLayout);
+
+ QListWidgetItem* pItem = new QListWidgetItem(ui->hotkeyListWidget);
+ pItem->setSizeHint(pWgt->sizeHint());
+ pItem->setCheckState(Qt::Unchecked);
+ ui->hotkeyListWidget->setItemWidget(pItem, pWgt);
+
+ if (config.hotkeys.keys[idx] != 0) {
+ pWgt->setHidCode(config.hotkeys.keys[idx]);
+ pBtn->setText(osal_keycode_name(config.hotkeys.keys[idx]));
+ pItem->setCheckState(Qt::Checked);
+ }
+ }
+ }
+
#ifndef DEBUG_DUMP
for (int i = 0; i < ui->tabWidget->count(); ++i) {
if (tr("Debug") == ui->tabWidget->tabText(i)) {
@@ -548,8 +611,6 @@ void ConfigDialog::accept(bool justSave) {
config.textureFilter.txHiresEnable = ui->texturePackGroupBox->isChecked() ? 1 : 0;
config.textureFilter.txHiresFullAlphaChannel = ui->alphaChannelCheckBox->isChecked() ? 1 : 0;
config.textureFilter.txHresAltCRC = ui->alternativeCRCCheckBox->isChecked() ? 1 : 0;
- config.textureFilter.txDump = ui->textureDumpCheckBox->isChecked() ? 1 : 0;
- config.textureFilter.txReloadHiresTex = ui->textureReloadCheckBox->isChecked() ? 1 : 0;
config.textureFilter.txCacheCompression = ui->compressCacheCheckBox->isChecked() ? 1 : 0;
config.textureFilter.txForce16bpp = ui->force16bppCheckBox->isChecked() ? 1 : 0;
@@ -590,7 +651,7 @@ void ConfigDialog::accept(bool justSave) {
QDir txDumpPath(ui->texDumpPathLineEdit->text());
if (txDumpPath.exists()) {
config.textureFilter.txDumpPath[txDumpPath.absolutePath().toWCharArray(config.textureFilter.txDumpPath)] = L'\0';
- } else if (config.textureFilter.txHiresEnable != 0 && config.textureFilter.txDump != 0) {
+ } else if (config.textureFilter.txHiresEnable != 0 && config.hotkeys.keys[Config::HotKey::hkTexDump] != 0) {
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Close);
msgBox.setWindowTitle("GLideN64");
@@ -638,6 +699,15 @@ void ConfigDialog::accept(bool justSave) {
config.onScreenDisplay.internalResolution = ui->internalResolutionCheckBox->isChecked() ? 1 : 0;
config.onScreenDisplay.renderingResolution = ui->renderingResolutionCheckBox->isChecked() ? 1 : 0;
+ for (quint32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ config.hotkeys.keys[idx] = 0;
+ QListWidgetItem * pItem = ui->hotkeyListWidget->item(idx);
+ if (pItem->checkState() == Qt::Checked) {
+ HotkeyItemWidget* pWgt = (HotkeyItemWidget*)ui->hotkeyListWidget->itemWidget(pItem);
+ config.hotkeys.keys[idx] = pWgt->hidCode();
+ }
+ }
+
config.debug.dumpMode = 0;
if (ui->dumpLowCheckBox->isChecked())
config.debug.dumpMode |= DEBUG_LOW;
@@ -996,3 +1066,68 @@ void ConfigDialog::on_n64DepthCompareComboBox_currentIndexChanged(int index)
ui->msaaRadioButton->setDisabled(index > 0);
ui->n64DepthCompareComboBox->setStyleSheet("");
}
+
+void ConfigDialog::on_hotkeyListWidget_itemClicked(QListWidgetItem *item)
+{
+ if (item->checkState() == Qt::Unchecked)
+ item->setCheckState(Qt::Checked);
+ else
+ item->setCheckState(Qt::Unchecked);
+}
+
+class HotkeyMessageBox: public QMessageBox
+{
+public:
+ HotkeyMessageBox(QWidget *parent = Q_NULLPTR) : QMessageBox(parent)
+ {
+ setWindowTitle("Hotkey");
+ setIcon(QMessageBox::Information);
+ }
+
+ void keyPressEvent(QKeyEvent * pEvent) override
+ {
+ switch (pEvent->key())
+ {
+ case Qt::Key_Escape:
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+ QMessageBox::keyPressEvent(pEvent);
+ return;
+ }
+ m_nativeVK = pEvent->nativeVirtualKey();
+ QMessageBox::keyPressEvent(pEvent);
+ close();
+ }
+
+ quint32 m_nativeVK = 0;
+};
+
+void ConfigDialog::on_btn_clicked() {
+ if (QPushButton* pBtn = qobject_cast(sender())) {
+ if (QLabel* pLabel = pBtn->parent()->findChild< QLabel* >()) {
+ //QMessageBox::information(this, "Button was clicked!", e->text());
+ HotkeyMessageBox msgBox(this);
+ //msgBox.setWindowTitle("Hotkey");
+ //msgBox.setText("Press a key");
+ msgBox.setInformativeText(QString("Press a key for ") + pLabel->text());
+ //msgBox.setIcon(QMessageBox::Information);
+ msgBox.exec();
+ if (msgBox.m_nativeVK != 0) {
+ const unsigned int hidCode = osal_virtual_key_to_hid(msgBox.m_nativeVK);
+ for (quint32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ QListWidgetItem * pItem = ui->hotkeyListWidget->item(idx);
+ HotkeyItemWidget* pWgt = (HotkeyItemWidget*)ui->hotkeyListWidget->itemWidget(pItem);
+ if (pWgt->hidCode() == hidCode) {
+ QPushButton* pButton = pWgt->findChild();
+ if (pButton != nullptr)
+ pButton->setText(tr("Click me"));
+ pWgt->setHidCode(0u);
+ break;
+ }
+ }
+ pBtn->setText(osal_keycode_name(hidCode));
+ ((HotkeyItemWidget*)pBtn->parent())->setHidCode(hidCode);
+ }
+ }
+ }
+}
diff --git a/src/GLideNUI/ConfigDialog.h b/src/GLideNUI/ConfigDialog.h
index acff2057..a7a11480 100644
--- a/src/GLideNUI/ConfigDialog.h
+++ b/src/GLideNUI/ConfigDialog.h
@@ -3,6 +3,7 @@
#include
#include
+#include "QListWidget"
namespace Ui {
class ConfigDialog;
@@ -78,10 +79,15 @@ private slots:
void on_n64DepthCompareComboBox_currentIndexChanged(int index);
+ void on_hotkeyListWidget_itemClicked(QListWidgetItem *item);
+
+ void on_btn_clicked();
+
private:
void _init(bool reInit = false, bool blockCustomSettings = false);
void _getTranslations(QStringList & _translationFiles) const;
void _switchDest(bool isGame);
+ QString _hotkeyDescription(quint32 _idx) const;
Ui::ConfigDialog *ui;
QFont m_font;
diff --git a/src/GLideNUI/Settings.cpp b/src/GLideNUI/Settings.cpp
index 774b6d7e..b8df06f2 100644
--- a/src/GLideNUI/Settings.cpp
+++ b/src/GLideNUI/Settings.cpp
@@ -94,8 +94,6 @@ void _loadSettings(QSettings & settings)
config.textureFilter.txHiresEnable = settings.value("txHiresEnable", config.textureFilter.txHiresEnable).toInt();
config.textureFilter.txHiresFullAlphaChannel = settings.value("txHiresFullAlphaChannel", config.textureFilter.txHiresFullAlphaChannel).toInt();
config.textureFilter.txHresAltCRC = settings.value("txHresAltCRC", config.textureFilter.txHresAltCRC).toInt();
- config.textureFilter.txDump = settings.value("txDump", config.textureFilter.txDump).toInt();
- config.textureFilter.txReloadHiresTex = settings.value("txReloadHiresTex", config.textureFilter.txReloadHiresTex).toInt();
config.textureFilter.txForce16bpp = settings.value("txForce16bpp", config.textureFilter.txForce16bpp).toInt();
config.textureFilter.txCacheCompression = settings.value("txCacheCompression", config.textureFilter.txCacheCompression).toInt();
config.textureFilter.txSaveCache = settings.value("txSaveCache", config.textureFilter.txSaveCache).toInt();
@@ -138,6 +136,12 @@ void _loadSettings(QSettings & settings)
config.onScreenDisplay.pos = settings.value("osdPos", config.onScreenDisplay.pos).toInt();
settings.endGroup();
+ settings.beginGroup("hotkeys");
+ for (u32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ config.hotkeys.keys[idx] = settings.value(Config::hotkeyIniName(idx), config.hotkeys.keys[idx]).toInt();
+ }
+ settings.endGroup();
+
settings.beginGroup("debug");
config.debug.dumpMode = settings.value("dumpMode", config.debug.dumpMode).toInt();
settings.endGroup();
@@ -272,8 +276,6 @@ void writeSettings(const QString & _strIniFolder)
settings.setValue("txHiresEnable", config.textureFilter.txHiresEnable);
settings.setValue("txHiresFullAlphaChannel", config.textureFilter.txHiresFullAlphaChannel);
settings.setValue("txHresAltCRC", config.textureFilter.txHresAltCRC);
- settings.setValue("txDump", config.textureFilter.txDump);
- settings.setValue("txReloadHiresTex", config.textureFilter.txReloadHiresTex);
settings.setValue("txForce16bpp", config.textureFilter.txForce16bpp);
settings.setValue("txCacheCompression", config.textureFilter.txCacheCompression);
settings.setValue("txSaveCache", config.textureFilter.txSaveCache);
@@ -304,6 +306,12 @@ void writeSettings(const QString & _strIniFolder)
settings.setValue("osdPos", config.onScreenDisplay.pos);
settings.endGroup();
+ settings.beginGroup("hotkeys");
+ for (u32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ settings.setValue(Config::hotkeyIniName(idx), config.hotkeys.keys[idx]);
+ }
+ settings.endGroup();
+
settings.beginGroup("debug");
settings.setValue("dumpMode", config.debug.dumpMode);
settings.endGroup();
@@ -467,8 +475,6 @@ void saveCustomRomSettings(const QString & _strIniFolder, const char * _strRomNa
WriteCustomSetting(textureFilter, txHiresEnable);
WriteCustomSetting(textureFilter, txHiresFullAlphaChannel);
WriteCustomSetting(textureFilter, txHresAltCRC);
- WriteCustomSetting(textureFilter, txDump);
- WriteCustomSetting(textureFilter, txReloadHiresTex);
WriteCustomSetting(textureFilter, txForce16bpp);
WriteCustomSetting(textureFilter, txCacheCompression);
WriteCustomSetting(textureFilter, txSaveCache);
diff --git a/src/GLideNUI/configDialog.ui b/src/GLideNUI/configDialog.ui
index 75e13520..f80845cb 100644
--- a/src/GLideNUI/configDialog.ui
+++ b/src/GLideNUI/configDialog.ui
@@ -9,8 +9,8 @@
0
0
- 559
- 613
+ 747
+ 715
@@ -29,6 +29,9 @@
-
+
+ 0
+
false
@@ -2687,29 +2690,6 @@
- -
-
-
- true
-
-
- <html><head/><body><p>This option dumps textures on screen to a texture pack folder. </p><p>Hotkey:<br/>Use <span style=" font-weight:600;">D</span> to toggle texture dumping on or off</p></body></html>
-
-
- Press 'd' to dump N64 textures (for texture artists)
-
-
-
- -
-
-
- <html><head/><body><p>This option allows texture artists to reload hi-res textures while the game is running to instantly see how they look —big time saver!</p><p>Hotkey:<br/>Use <span style=" font-weight:600;">R</span> to reload textures from the texture pack<br/></p></body></html>
-
-
- Press 'r' to reload hi-res textures (for texture artists)
-
-
-
@@ -3656,6 +3636,20 @@
+
+
+ Hotkey
+
+
+ -
+
+
-
+
+
+
+
+
+
Debug
@@ -3946,54 +3940,6 @@
-
- textureDumpCheckBox
- toggled(bool)
- texDumpPathLabel
- setEnabled(bool)
-
-
- 129
- 356
-
-
- 125
- 257
-
-
-
-
- textureDumpCheckBox
- toggled(bool)
- texDumpPathLineEdit
- setEnabled(bool)
-
-
- 385
- 356
-
-
- 471
- 255
-
-
-
-
- textureDumpCheckBox
- toggled(bool)
- texDumpPathButton
- setEnabled(bool)
-
-
- 525
- 356
-
-
- 526
- 257
-
-
-
gammaCorrectionCheckBox
toggled(bool)
@@ -4076,9 +4022,9 @@
-
-
+
+
diff --git a/src/Keys.cpp b/src/Keys.cpp
deleted file mode 100644
index c687b85b..00000000
--- a/src/Keys.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
-* Glide64 - Glide video plugin for Nintendo 64 emulators.
-* Copyright (c) 2002 Dave2001
-* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-//****************************************************************
-//
-// Glide64 - Glide Plugin for Nintendo 64 emulators
-// Project started on December 29th, 2001
-//
-// Authors:
-// Dave2001, original author, founded the project in 2001, left it in 2002
-// Gugaman, joined the project in 2002, left it in 2002
-// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
-// Hiroshi 'KoolSmoky' Morii, joined the project in 2007
-//
-//****************************************************************
-//
-// To modify Glide64:
-// * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
-// * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
-//
-//****************************************************************
-//
-// Keys, used by Glide64.
-// Since key codes are different for WinAPI and SDL, this difference is managed here
-// Created by Sergey 'Gonetz' Lipski, July 2009
-//
-//****************************************************************
-
-#include "Platform.h"
-#include "Keys.h"
-#ifndef MUPENPLUSAPI
-#include "windows/GLideN64_windows.h"
-#endif
-
-Glide64Keys::Glide64Keys()
-{
-#ifdef OS_WINDOWS
-m_keys[G64_VK_CONTROL] = 0x11;
-m_keys[G64_VK_ALT] = 0x12;
-m_keys[G64_VK_INSERT] = 0x2D;
-m_keys[G64_VK_LBUTTON] = 0x01;
-m_keys[G64_VK_UP] = 0x26;
-m_keys[G64_VK_DOWN] = 0x28;
-m_keys[G64_VK_LEFT] = 0x25;
-m_keys[G64_VK_RIGHT] = 0x27;
-m_keys[G64_VK_SPACE] = 0x20;
-m_keys[G64_VK_BACK] = 0x08;
-m_keys[G64_VK_SCROLL] = 0x91;
-m_keys[G64_VK_1] = 0x31;
-m_keys[G64_VK_2] = 0x32;
-m_keys[G64_VK_3] = 0x33;
-m_keys[G64_VK_4] = 0x34;
-m_keys[G64_VK_5] = 0x35;
-m_keys[G64_VK_6] = 0x36;
-m_keys[G64_VK_7] = 0x37;
-m_keys[G64_VK_8] = 0x38;
-m_keys[G64_VK_9] = 0x39;
-m_keys[G64_VK_0] = 0x30;
-m_keys[G64_VK_A] = 0x41;
-m_keys[G64_VK_B] = 0x42;
-m_keys[G64_VK_D] = 0x44;
-m_keys[G64_VK_F] = 0x46;
-m_keys[G64_VK_G] = 0x47;
-m_keys[G64_VK_Q] = 0x51;
-m_keys[G64_VK_R] = 0x52;
-m_keys[G64_VK_S] = 0x53;
-m_keys[G64_VK_V] = 0x56;
-m_keys[G64_VK_W] = 0x57;
-#else
-m_keys[G64_VK_CONTROL] = 306;
-m_keys[G64_VK_ALT] = 308;
-m_keys[G64_VK_INSERT] = 277;
-m_keys[G64_VK_LBUTTON] = 1;
-m_keys[G64_VK_UP] = 273;
-m_keys[G64_VK_DOWN] = 274;
-m_keys[G64_VK_LEFT] = 276;
-m_keys[G64_VK_RIGHT] = 275;
-m_keys[G64_VK_SPACE] = 32;
-m_keys[G64_VK_BACK] = 8;
-m_keys[G64_VK_SCROLL] = 302;
-m_keys[G64_VK_1] = 49;
-m_keys[G64_VK_2] = 50;
-m_keys[G64_VK_3] = 51;
-m_keys[G64_VK_4] = 52;
-m_keys[G64_VK_5] = 53;
-m_keys[G64_VK_6] = 54;
-m_keys[G64_VK_7] = 55;
-m_keys[G64_VK_8] = 56;
-m_keys[G64_VK_9] = 57;
-m_keys[G64_VK_0] = 48;
-m_keys[G64_VK_A] = 97;
-m_keys[G64_VK_B] = 98;
-m_keys[G64_VK_D] = 100;
-m_keys[G64_VK_F] = 102;
-m_keys[G64_VK_G] = 103;
-m_keys[G64_VK_Q] = 113;
-m_keys[G64_VK_R] = 114;
-m_keys[G64_VK_S] = 115;
-m_keys[G64_VK_V] = 118;
-m_keys[G64_VK_W] = 119;
-#endif
-}
-
-bool isKeyPressed(int _key, int _mask)
-{
- static Glide64Keys g64Keys;
-#ifdef OS_WINDOWS
-#ifdef MUPENPLUSAPI
- return (GetAsyncKeyState(g64Keys[_key]) & _mask) != 0;
-#else
- return (GetAsyncKeyState(g64Keys[_key]) & _mask) != 0 && GetForegroundWindow() == hWnd;
-#endif
-#else
- // TODO
-#endif
- return 0;
-}
diff --git a/src/Keys.h b/src/Keys.h
deleted file mode 100644
index d2b5ba72..00000000
--- a/src/Keys.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-* Glide64 - Glide video plugin for Nintendo 64 emulators.
-* Copyright (c) 2002 Dave2001
-* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-//****************************************************************
-//
-// Glide64 - Glide Plugin for Nintendo 64 emulators
-// Project started on December 29th, 2001
-//
-// Authors:
-// Dave2001, original author, founded the project in 2001, left it in 2002
-// Gugaman, joined the project in 2002, left it in 2002
-// Sergey 'Gonetz' Lipski, joined the project in 2002, main author since fall of 2002
-// Hiroshi 'KoolSmoky' Morii, joined the project in 2007
-//
-//****************************************************************
-//
-// To modify Glide64:
-// * Write your name and (optional)email, commented by your work, so I know who did it, and so that you can find which parts you modified when it comes time to send it to me.
-// * Do NOT send me the whole project or file that you modified. Take out your modified code sections, and tell me where to put them. If people sent the whole thing, I would have many different versions, but no idea how to combine them all.
-//
-//****************************************************************
-//
-// Keys, used by Glide64.
-// Since key codes are different for WinAPI and SDL, this difference is managed here
-// Created by Sergey 'Gonetz' Lipski, July 2009
-//
-//****************************************************************
-
-#ifndef Keys_H
-#define Keys_H
-
-#define G64_VK_CONTROL 0
-#define G64_VK_ALT 1
-#define G64_VK_INSERT 2
-#define G64_VK_LBUTTON 3
-#define G64_VK_UP 4
-#define G64_VK_DOWN 5
-#define G64_VK_LEFT 6
-#define G64_VK_RIGHT 7
-#define G64_VK_SPACE 8
-#define G64_VK_BACK 9
-#define G64_VK_SCROLL 10
-#define G64_VK_1 11
-#define G64_VK_2 12
-#define G64_VK_3 13
-#define G64_VK_4 14
-#define G64_VK_5 15
-#define G64_VK_6 16
-#define G64_VK_7 17
-#define G64_VK_8 18
-#define G64_VK_9 19
-#define G64_VK_0 20
-#define G64_VK_A 21
-#define G64_VK_B 22
-#define G64_VK_D 23
-#define G64_VK_F 24
-#define G64_VK_G 25
-#define G64_VK_Q 26
-#define G64_VK_R 27
-#define G64_VK_S 28
-#define G64_VK_V 29
-#define G64_VK_W 30
-
-#define G64_NUM_KEYS 31
-
-class Glide64Keys
-{
- public:
- Glide64Keys();
- ~Glide64Keys(){}
- int operator[](unsigned int index){return m_keys[index];}
-
- private:
- int m_keys[G64_NUM_KEYS];
-};
-
-bool isKeyPressed(int _key, int _mask);
-
-#endif //Keys_H
diff --git a/src/TextureFilterHandler.cpp b/src/TextureFilterHandler.cpp
index 38ae9bfc..eabfc016 100644
--- a/src/TextureFilterHandler.cpp
+++ b/src/TextureFilterHandler.cpp
@@ -55,7 +55,7 @@ u32 TextureFilterHandler::_getConfigOptions() const
options |= (DUMP_TEXCACHE | DUMP_HIRESTEXCACHE);
if (config.textureFilter.txHiresFullAlphaChannel)
options |= LET_TEXARTISTS_FLY;
- if (config.textureFilter.txDump)
+ if (config.hotkeys.keys[Config::HotKey::hkTexDump] != 0)
options |= DUMP_TEX;
if (config.textureFilter.txDeposterize)
options |= DEPOSTERIZE;
diff --git a/src/Textures.cpp b/src/Textures.cpp
index 7df36e49..72a67f96 100644
--- a/src/Textures.cpp
+++ b/src/Textures.cpp
@@ -14,7 +14,6 @@
#include "convert.h"
#include "FrameBuffer.h"
#include "Config.h"
-#include "Keys.h"
#include "GLideNHQ/Ext_TxFilter.h"
#include "TextureFilterHandler.h"
#include "DisplayLoadProgress.h"
@@ -802,7 +801,7 @@ void TextureCache::_loadBackground(CachedTexture *pTexture)
if (m_toggleDumpTex &&
config.textureFilter.txHiresEnable != 0 &&
- config.textureFilter.txDump != 0) {
+ config.hotkeys.keys[Config::HotKey::hkTexDump] != 0) {
txfilter_dmptx((u8*)pDest, pTexture->width, pTexture->height,
pTexture->width, (u16)u32(glInternalFormat),
(unsigned short)(pTexture->format << 8 | pTexture->size),
@@ -1213,8 +1212,8 @@ void TextureCache::_load(u32 _tile, CachedTexture *_pTexture)
}
if (m_toggleDumpTex &&
- config.textureFilter.txHiresEnable != 0 &&
- config.textureFilter.txDump != 0) {
+ config.textureFilter.txHiresEnable != 0 &&
+ config.hotkeys.keys[Config::HotKey::hkTexDump] != 0) {
txfilter_dmptx((u8*)texData.get(), tmptex.width, tmptex.height,
tmptex.width, (u16)u32(glInternalFormat),
(unsigned short)(_pTexture->format << 8 | _pTexture->size),
@@ -1517,7 +1516,7 @@ void TextureCache::_updateBackground()
current[0] = pCurrent;
}
-void TextureCache::_clear()
+void TextureCache::clear()
{
current[0] = current[1] = nullptr;
@@ -1528,35 +1527,21 @@ void TextureCache::_clear()
m_lruTextureLocations.clear();
}
+void TextureCache::toggleDumpTex()
+{
+ m_toggleDumpTex = !m_toggleDumpTex;
+ if (m_toggleDumpTex) {
+ displayLoadProgress(L"Texture dump - ON\n");
+ clear();
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ } else {
+ displayLoadProgress(L"Texture dump - OFF\n");
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ }
+}
+
void TextureCache::update(u32 _t)
{
- if (config.textureFilter.txHiresEnable != 0) {
- if (config.textureFilter.txReloadHiresTex != 0) {
- /* Force reload hi-res textures. Useful for texture artists */
- if (isKeyPressed(G64_VK_R, 0x0001)) {
- if (txfilter_reloadhirestex()) {
- _clear();
- }
- }
- }
-
- if (config.textureFilter.txDump != 0) {
- /* Turn on texture dump */
- if (isKeyPressed(G64_VK_D, 0x0001)) {
- m_toggleDumpTex = !m_toggleDumpTex;
- if (m_toggleDumpTex) {
- displayLoadProgress(L"Texture dump - ON\n");
- _clear();
- std::this_thread::sleep_for(std::chrono::seconds(1));
- }
- else {
- displayLoadProgress(L"Texture dump - OFF\n");
- std::this_thread::sleep_for(std::chrono::seconds(1));
- }
- }
- }
- }
-
const gDPTile * pTile = gSP.textureTile[_t];
switch (pTile->textureMode) {
case TEXTUREMODE_BGIMAGE:
diff --git a/src/Textures.h b/src/Textures.h
index b2b4c26a..04cd70b2 100644
--- a/src/Textures.h
+++ b/src/Textures.h
@@ -33,7 +33,7 @@ struct CachedTexture
u16 width, height; // N64 width and height
u16 clampWidth, clampHeight; // Size to clamp to
f32 scaleS, scaleT; // Scale to map to 0.0-1.0
- f32 hdRatioS, hdRatioT; // HD / N64 width and height
+ f32 hdRatioS, hdRatioT; // HD / N64 width and height
f32 shiftScaleS, shiftScaleT; // Scale to shift
u32 textureBytes;
@@ -54,12 +54,14 @@ struct TextureCache
void init();
void destroy();
+ void clear();
CachedTexture * addFrameBufferTexture(graphics::Parameter _target);
void removeFrameBufferTexture(CachedTexture * _pTexture);
void activateTexture(u32 _t, CachedTexture *_pTexture);
void activateDummy(u32 _t);
void activateMSDummy(u32 _t);
void update(u32 _t);
+ void toggleDumpTex();
static TextureCache & get();
@@ -86,7 +88,6 @@ private:
bool _loadHiresBackground(CachedTexture *_pTexture, u64 & _ricecrc);
void _loadDepthTexture(CachedTexture * _pTexture, u16* _pDest);
void _updateBackground();
- void _clear();
void _initDummyTexture(CachedTexture * _pDummy);
void _getTextureDestData(CachedTexture& tmptex, u32* pDest, graphics::Parameter glInternalFormat, GetTexelFunc GetTexel, u16* pLine);
diff --git a/src/VI.cpp b/src/VI.cpp
index c299fd95..25ba22be 100644
--- a/src/VI.cpp
+++ b/src/VI.cpp
@@ -13,8 +13,9 @@
#include "Performance.h"
#include "Debugger.h"
#include "DebugDump.h"
-#include "Keys.h"
+#include "osal_keys.h"
#include "DisplayWindow.h"
+#include "GLideNHQ/Ext_TxFilter.h"
#include
using namespace std;
@@ -98,6 +99,94 @@ void VI_UpdateSize()
VI.rheight = VI.height != 0 ? 1.0f / VI.height : 0.0f;
}
+static void checkHotkeys()
+{
+ if (osal_is_key_pressed(KEY_G, 0x0001)) {
+ SwitchDump(config.debug.dumpMode);
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkHdTexToggle], 0x0001)) {
+ if (config.textureFilter.txHiresEnable == 0)
+ dwnd().getDrawer().showMessage("Enable HD textures\n", Milliseconds(750));
+ else
+ dwnd().getDrawer().showMessage("Disable HD textures\n", Milliseconds(750));
+ config.textureFilter.txHiresEnable = !config.textureFilter.txHiresEnable;
+ textureCache().clear();
+ }
+
+ if (config.textureFilter.txHiresEnable != 0) {
+ /* Force reload hi-res textures. Useful for texture artists */
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkHdTexReload], 0x0001)) {
+ dwnd().getDrawer().showMessage("Reload HD textures\n", Milliseconds(750));
+ if (txfilter_reloadhirestex()) {
+ textureCache().clear();
+ }
+ }
+
+ /* Turn on texture dump */
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkTexDump], 0x0001))
+ textureCache().toggleDumpTex();
+ }
+
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkVsync], 0x0001)) {
+ config.video.verticalSync = !config.video.verticalSync;
+ dwnd().stop();
+ dwnd().start();
+ if (config.video.verticalSync == 0)
+ dwnd().getDrawer().showMessage("Disable vertical sync\n", Milliseconds(1000));
+ else
+ dwnd().getDrawer().showMessage("Enable vertical sync\n", Milliseconds(1000));
+ }
+
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkFBEmulation], 0x0001)) {
+ config.frameBufferEmulation.enable = !config.frameBufferEmulation.enable;
+ dwnd().stop();
+ dwnd().start();
+ if (config.frameBufferEmulation.enable == 0)
+ dwnd().getDrawer().showMessage("Disable frame buffer emulation\n", Milliseconds(2000));
+ else
+ dwnd().getDrawer().showMessage("Enable frame buffer emulation\n", Milliseconds(1000));
+ }
+
+ if (config.frameBufferEmulation.enable != 0 &&
+ osal_is_key_pressed(config.hotkeys.keys[Config::hkN64DepthCompare], 0x0001)) {
+ static u32 N64DepthCompare = Config::N64DepthCompareMode::dcCompatible;
+ if (config.frameBufferEmulation.N64DepthCompare != Config::N64DepthCompareMode::dcDisable) {
+ N64DepthCompare = config.frameBufferEmulation.N64DepthCompare;
+ config.frameBufferEmulation.N64DepthCompare = Config::N64DepthCompareMode::dcDisable;
+ } else
+ config.frameBufferEmulation.N64DepthCompare = N64DepthCompare;
+ dwnd().stop();
+ dwnd().start();
+ if (config.frameBufferEmulation.N64DepthCompare == Config::N64DepthCompareMode::dcDisable)
+ dwnd().getDrawer().showMessage("Disable N64 depth compare\n", Milliseconds(1000));
+ else
+ dwnd().getDrawer().showMessage("Enable N64 depth compare\n", Milliseconds(1000));
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkOsdVis], 0x0001)) {
+ config.onScreenDisplay.vis = !config.onScreenDisplay.vis;
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkOsdFps], 0x0001)) {
+ config.onScreenDisplay.fps = !config.onScreenDisplay.fps;
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkOsdPercent], 0x0001)) {
+ config.onScreenDisplay.percent = !config.onScreenDisplay.percent;
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkOsdInternalResolution], 0x0001)) {
+ config.onScreenDisplay.internalResolution = !config.onScreenDisplay.internalResolution;
+ }
+
+ if (osal_is_key_pressed(config.hotkeys.keys[Config::hkOsdRenderingResolution], 0x0001)) {
+ config.onScreenDisplay.renderingResolution = !config.onScreenDisplay.renderingResolution;
+ }
+}
+
void VI_UpdateScreen()
{
if (VI.lastOrigin == -1) // Workaround for Mupen64Plus issue with initialization
@@ -117,9 +206,7 @@ void VI_UpdateScreen()
wnd.saveScreenshot();
g_debugger.checkDebugState();
- if (isKeyPressed(G64_VK_G, 0x0001)) {
- SwitchDump(config.debug.dumpMode);
- }
+ checkHotkeys();
bool bVIUpdated = false;
if (*REG.VI_ORIGIN != VI.lastOrigin) {
diff --git a/src/mupenplus/Config_mupenplus.cpp b/src/mupenplus/Config_mupenplus.cpp
index 504bf6a0..d98671f2 100644
--- a/src/mupenplus/Config_mupenplus.cpp
+++ b/src/mupenplus/Config_mupenplus.cpp
@@ -18,6 +18,74 @@ Config config;
m64p_handle g_configVideoGeneral = nullptr;
m64p_handle g_configVideoGliden64 = nullptr;
+static
+const char* _hotkeyDescription(u32 _idx)
+{
+ switch (_idx)
+ {
+ case Config::HotKey::hkTexDump:
+ return "Hotkey: toggle textures dump";
+ case Config::HotKey::hkHdTexReload:
+ return "Hotkey: reload HD textures";
+ case Config::HotKey::hkHdTexToggle:
+ return "Hotkey: toggle HD textures";
+ case Config::HotKey::hkVsync:
+ return "Hotkey: toggle VSync";
+ case Config::HotKey::hkFBEmulation:
+ return "Hotkey: toggle frame buffer emulation";
+ case Config::HotKey::hkN64DepthCompare:
+ return "Hotkey: toggle N64 depth compare";
+ case Config::HotKey::hkOsdVis:
+ return "Hotkey: toggle OSD VI/S";
+ case Config::HotKey::hkOsdFps:
+ return "Hotkey: toggle OSD FPS";
+ case Config::HotKey::hkOsdPercent:
+ return "Hotkey: toggle OSD percent";
+ case Config::HotKey::hkOsdInternalResolution:
+ return "Hotkey: toggle OSD internal resolution";
+ case Config::HotKey::hkOsdRenderingResolution:
+ return "Hotkey: toggle OSD rendering resolution";
+ }
+ return "Unknown hotkey";
+}
+
+//static const unsigned char HID_TO_ASCII[256] = {
+// 0, 0, 0, 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+// 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50,
+// 51, 52, 53, 54, 55, 56, 57, 48, 0, 0, 0, 32, 45, 43, 91, 93,
+// 92, 59, 34, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+//};
+
+static
+u8 ASCIItoHID(const char * pStr) {
+ static const unsigned char ASCII_TO_HID[128] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 39, 30, 31, 32, 33, 34, 35, 36, 37, 38, 0, 0, 0, 0, 0, 0,
+ 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+
+ if (strlen(pStr) != 1 || pStr[0] < 0)
+ return 0;
+ return ASCII_TO_HID[pStr[0]];
+}
+
bool Config_SetDefault()
{
if (ConfigOpenSection("Video-General", &g_configVideoGeneral) != M64ERR_SUCCESS) {
@@ -167,10 +235,6 @@ bool Config_SetDefault()
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultBool(g_configVideoGliden64, "txHresAltCRC", config.textureFilter.txHresAltCRC, "Use alternative method of paletted textures CRC calculation.");
assert(res == M64ERR_SUCCESS);
- res = ConfigSetDefaultBool(g_configVideoGliden64, "txDump", config.textureFilter.txDump, "Press 'd' to start dump of N64 textures.");
- assert(res == M64ERR_SUCCESS);
- res = ConfigSetDefaultBool(g_configVideoGliden64, "txReloadHiresTex", config.textureFilter.txReloadHiresTex, "Press 'r' to reload HD textures.");
- assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultBool(g_configVideoGliden64, "txCacheCompression", config.textureFilter.txCacheCompression, "Zip textures cache.");
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultBool(g_configVideoGliden64, "txForce16bpp", config.textureFilter.txForce16bpp, "Force use 16bit texture formats for HD textures.");
@@ -221,6 +285,12 @@ bool Config_SetDefault()
"Counters position (1=top left, 2=top center, 4=top right, 8=bottom left, 16=bottom center, 32=bottom right)");
assert(res == M64ERR_SUCCESS);
+ //#Hotkey settings
+ for (u32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ res = ConfigSetDefaultString(g_configVideoGliden64, Config::hotkeyIniName(idx), "", _hotkeyDescription(idx));
+ assert(res == M64ERR_SUCCESS);
+ }
+
#ifdef DEBUG_DUMP
//#Debug settings
res = ConfigSetDefaultInt(g_configVideoGliden64, "DebugDumpMode", config.debug.dumpMode, "Enable debug dump. Set 3 to normal or 7 to detailed dump.");
@@ -370,10 +440,6 @@ void Config_LoadCustomConfig()
result = ConfigExternalGetParameter(fileHandle, sectionName, "textureFilter\\txHresAltCRC", value, sizeof(value));
if (result == M64ERR_SUCCESS) config.textureFilter.txHresAltCRC = atoi(value);
result = ConfigExternalGetParameter(fileHandle, sectionName, "textureFilter\\txDump", value, sizeof(value));
- if (result == M64ERR_SUCCESS) config.textureFilter.txDump = atoi(value);
- result = ConfigExternalGetParameter(fileHandle, sectionName, "textureFilter\\txReloadHiresTex", value, sizeof(value));
- if (result == M64ERR_SUCCESS) config.textureFilter.txReloadHiresTex = atoi(value);
- result = ConfigExternalGetParameter(fileHandle, sectionName, "textureFilter\\txForce16bpp", value, sizeof(value));
if (result == M64ERR_SUCCESS) config.textureFilter.txForce16bpp = atoi(value);
result = ConfigExternalGetParameter(fileHandle, sectionName, "textureFilter\\txCacheCompression", value, sizeof(value));
if (result == M64ERR_SUCCESS) config.textureFilter.txCacheCompression = atoi(value);
@@ -464,8 +530,6 @@ void Config_LoadConfig()
config.textureFilter.txHiresEnable = ConfigGetParamBool(g_configVideoGliden64, "txHiresEnable");
config.textureFilter.txHiresFullAlphaChannel = ConfigGetParamBool(g_configVideoGliden64, "txHiresFullAlphaChannel");
config.textureFilter.txHresAltCRC = ConfigGetParamBool(g_configVideoGliden64, "txHresAltCRC");
- config.textureFilter.txDump = ConfigGetParamBool(g_configVideoGliden64, "txDump");
- config.textureFilter.txReloadHiresTex = ConfigGetParamBool(g_configVideoGliden64, "txReloadHiresTex");
config.textureFilter.txForce16bpp = ConfigGetParamBool(g_configVideoGliden64, "txForce16bpp");
config.textureFilter.txCacheCompression = ConfigGetParamBool(g_configVideoGliden64, "txCacheCompression");
config.textureFilter.txSaveCache = ConfigGetParamBool(g_configVideoGliden64, "txSaveCache");
@@ -508,6 +572,11 @@ void Config_LoadConfig()
config.onScreenDisplay.renderingResolution = ConfigGetParamBool(g_configVideoGliden64, "ShowRenderingResolution");
config.onScreenDisplay.pos = ConfigGetParamInt(g_configVideoGliden64, "CountersPos");
+ //#Hotkey settings
+ for (u32 idx = 0; idx < Config::HotKey::hkTotal; ++idx) {
+ config.hotkeys.keys[idx] = ASCIItoHID(ConfigGetParamString(g_configVideoGliden64, Config::hotkeyIniName(idx)));
+ }
+
#ifdef DEBUG_DUMP
config.debug.dumpMode = ConfigGetParamInt(g_configVideoGliden64, "DebugDumpMode");
#endif
diff --git a/src/osal/CMakeLists.txt b/src/osal/CMakeLists.txt
index 47ea468b..e59a30af 100644
--- a/src/osal/CMakeLists.txt
+++ b/src/osal/CMakeLists.txt
@@ -5,7 +5,7 @@ project( osal )
LINK_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/lib )
if(UNIX)
- set(OSAL_SOURCES osal_files_unix.c)
+ set(OSAL_SOURCES osal_files_unix.c osal_keys_unix.c)
add_definitions(
-DNDEBUG
-DOS_LINUX
@@ -13,7 +13,7 @@ if(UNIX)
endif(UNIX)
if(WIN32)
- set(OSAL_SOURCES osal_files_win32.c)
+ set(OSAL_SOURCES osal_files_win32.c osal_keys_win.c)
add_definitions(
-DOS_WINDOWS
-D_CRT_SECURE_NO_WARNINGS
diff --git a/src/osal/keycode/keycode.h b/src/osal/keycode/keycode.h
new file mode 100644
index 00000000..0dea72aa
--- /dev/null
+++ b/src/osal/keycode/keycode.h
@@ -0,0 +1,148 @@
+/* This file is automatically generated. */
+#ifndef KEYCODE_KEYCODE_H
+#define KEYCODE_KEYCODE_H
+
+/* HID keycode definitions. These keycodes are portable, and correspond to
+ locations on the keyboard. For example, the keycode KEY_A corresponds to the
+ "A" key on US keyboard layouts, but KEY_A corresponds to the "Q" key on
+ French keyboard layouts. In either case, KEY_A is in the same physical
+ location on the keyboard.
+
+ Platform-specific scancodes can be converted to the HID keycodes defined
+ here, see keytable.h. All keycodes which can be generated on at least one
+ platform are included here, but not all platforms will produce all keycodes.
+ The names of these keycodes are taken, with some modifications, from the HID
+ usage tables. Key codes starting with KEY are general keys, and the keys on
+ the numeric keypad have key codes starting with KP. */
+enum {
+ /* Zero, does not correspond to any key. */
+ KEY_None = 0,
+
+ /* Keycode definitions. */
+ KEY_A = 4,
+ KEY_B = 5,
+ KEY_C = 6,
+ KEY_D = 7,
+ KEY_E = 8,
+ KEY_F = 9,
+ KEY_G = 10,
+ KEY_H = 11,
+ KEY_I = 12,
+ KEY_J = 13,
+ KEY_K = 14,
+ KEY_L = 15,
+ KEY_M = 16,
+ KEY_N = 17,
+ KEY_O = 18,
+ KEY_P = 19,
+ KEY_Q = 20,
+ KEY_R = 21,
+ KEY_S = 22,
+ KEY_T = 23,
+ KEY_U = 24,
+ KEY_V = 25,
+ KEY_W = 26,
+ KEY_X = 27,
+ KEY_Y = 28,
+ KEY_Z = 29,
+ KEY_1 = 30,
+ KEY_2 = 31,
+ KEY_3 = 32,
+ KEY_4 = 33,
+ KEY_5 = 34,
+ KEY_6 = 35,
+ KEY_7 = 36,
+ KEY_8 = 37,
+ KEY_9 = 38,
+ KEY_0 = 39,
+ KEY_Escape = 41,
+ KEY_Delete = 42,
+ KEY_Tab = 43,
+ KEY_Space = 44,
+ KEY_Minus = 45,
+ KEY_Equals = 46,
+ KEY_LeftBracket = 47,
+ KEY_RightBracket = 48,
+ KEY_Backslash = 49,
+ KEY_Semicolon = 51,
+ KEY_Quote = 52,
+ KEY_Grave = 53,
+ KEY_Comma = 54,
+ KEY_Period = 55,
+ KEY_Slash = 56,
+ KEY_CapsLock = 57,
+ KEY_F1 = 58,
+ KEY_F2 = 59,
+ KEY_F3 = 60,
+ KEY_F4 = 61,
+ KEY_F5 = 62,
+ KEY_F6 = 63,
+ KEY_F7 = 64,
+ KEY_F8 = 65,
+ KEY_F9 = 66,
+ KEY_F10 = 67,
+ KEY_F11 = 68,
+ KEY_F12 = 69,
+ KEY_PrintScreen = 70,
+ KEY_ScrollLock = 71,
+ KEY_Pause = 72,
+ KEY_Insert = 73,
+ KEY_Home = 74,
+ KEY_PageUp = 75,
+ KEY_DeleteForward = 76,
+ KEY_End = 77,
+ KEY_PageDown = 78,
+ KEY_Right = 79,
+ KEY_Left = 80,
+ KEY_Down = 81,
+ KEY_Up = 82,
+ KP_NumLock = 83,
+ KP_Divide = 84,
+ KP_Multiply = 85,
+ KP_Subtract = 86,
+ KP_Add = 87,
+ KP_Enter = 88,
+ KP_1 = 89,
+ KP_2 = 90,
+ KP_3 = 91,
+ KP_4 = 92,
+ KP_5 = 93,
+ KP_6 = 94,
+ KP_7 = 95,
+ KP_8 = 96,
+ KP_9 = 97,
+ KP_0 = 98,
+ KP_Point = 99,
+ KEY_NonUSBackslash = 100,
+ KP_Equals = 103,
+ KEY_F13 = 104,
+ KEY_F14 = 105,
+ KEY_F15 = 106,
+ KEY_F16 = 107,
+ KEY_F17 = 108,
+ KEY_F18 = 109,
+ KEY_F19 = 110,
+ KEY_F20 = 111,
+ KEY_F21 = 112,
+ KEY_F22 = 113,
+ KEY_F23 = 114,
+ KEY_F24 = 115,
+ KEY_Help = 117,
+ KEY_Menu = 118,
+ KEY_Mute = 127,
+ KEY_SysReq = 154,
+ KEY_Return = 158,
+ KP_Clear = 216,
+ KP_Decimal = 220,
+ KEY_LeftControl = 224,
+ KEY_LeftShift = 225,
+ KEY_LeftAlt = 226,
+ KEY_LeftGUI = 227,
+ KEY_RightControl = 228,
+ KEY_RightShift = 229,
+ KEY_RightAlt = 230,
+ KEY_RightGUI = 231,
+ MB_Left = 233 // GLideN64 - specific. Not an actual HID keycode.
+};
+
+#endif
diff --git a/src/osal/osal_export.h b/src/osal/osal_export.h
new file mode 100644
index 00000000..85e1d62a
--- /dev/null
+++ b/src/osal/osal_export.h
@@ -0,0 +1,12 @@
+#if !defined(OSAL_EXPORT_H)
+#define OSAL_EXPORT_H
+
+#if defined(OS_WINDOWS)
+#define EXPORT __declspec(dllexport)
+#define CALL __cdecl
+#else /* Not WINDOWS */
+#define EXPORT __attribute__((visibility("default")))
+#define CALL
+#endif
+
+#endif /* #define OSAL_EXPORT_H */
diff --git a/src/osal/osal_files.h b/src/osal/osal_files.h
index 2d9f06dc..a5125567 100644
--- a/src/osal/osal_files.h
+++ b/src/osal/osal_files.h
@@ -26,6 +26,8 @@
#if !defined(OSAL_FILES_H)
#define OSAL_FILES_H
+#include "osal_export.h"
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -34,15 +36,11 @@ extern "C" {
#define OSAL_DIR_SEPARATOR_CHAR L'/'
#if defined(OS_WINDOWS)
-#define EXPORT __declspec(dllexport)
-#define CALL __cdecl
#ifndef PATH_MAX
#define PATH_MAX _MAX_PATH
#endif
#define strdup _strdup
-#else /* Not WIN32 */
-#define EXPORT __attribute__((visibility("default")))
-#define CALL
+#else /* Not WINDOWS */
#ifndef PATH_MAX
#define PATH_MAX 260
#endif
diff --git a/src/osal/osal_keys.h b/src/osal/osal_keys.h
new file mode 100644
index 00000000..8da774aa
--- /dev/null
+++ b/src/osal/osal_keys.h
@@ -0,0 +1,22 @@
+#if !defined(OSAL_KEYS_H)
+#define OSAL_KEYS_H
+
+#include "osal_export.h"
+#include "keycode/keycode.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXPORT unsigned int CALL osal_is_key_pressed(unsigned int _key, unsigned int _mask);
+
+EXPORT unsigned int CALL osal_virtual_key_to_hid(unsigned int _key);
+
+EXPORT const char * CALL osal_keycode_name(unsigned int _hidCode);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* #define OSAL_KEYS_H */
+
diff --git a/src/osal/osal_keys_unix.c b/src/osal/osal_keys_unix.c
new file mode 100644
index 00000000..a562e048
--- /dev/null
+++ b/src/osal/osal_keys_unix.c
@@ -0,0 +1,24 @@
+#include "osal_keys.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXPORT unsigned int CALL osal_is_key_pressed(unsigned int _key, unsigned int _mask)
+{
+ return 0;
+}
+
+EXPORT unsigned int CALL osal_virtual_key_to_hid(unsigned int _key)
+{
+ return 0;
+}
+
+EXPORT const char * CALL osal_keycode_name(unsigned int _hidCode)
+{
+ return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/osal/osal_keys_win.c b/src/osal/osal_keys_win.c
new file mode 100644
index 00000000..2aace78f
--- /dev/null
+++ b/src/osal/osal_keys_win.c
@@ -0,0 +1,92 @@
+#include
+#include "osal_keys.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const unsigned char WIN_HID_TO_NATIVE[256] = {
+255,255,255,255, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50,
+ 51, 52, 53, 54, 55, 56, 57, 48, 13, 27, 8, 9, 32,189,187,219,
+221,220,255,186,222,192,188,190,191, 20,112,113,114,115,116,117,
+118,119,120,121,122,123, 44,145, 19, 45, 36, 33, 46, 35, 34, 39,
+ 37, 40, 38,144,111,106,109,107,255, 97, 98, 99,100,101,102,103,
+104,105, 96,110,255,255,255,255,124,125,126,127,128,129,130,131,
+132,133,134,135,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 17, 16, 18,255,255,255,255,255,255, 1,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static const unsigned char WIN_NATIVE_TO_HID[256] = {
+ 255,255,255,255,255,255,255,255, 42, 43,255,255,255, 40,255,255,
+ 225,224,226, 72, 57,255,255,255,255,255,255, 41,255,255,255,255,
+ 44, 75, 78, 77, 74, 80, 82, 79, 81,255,255,255, 70, 73, 76,255,
+ 39, 30, 31, 32, 33, 34, 35, 36, 37, 38,255,255,255,255,255,255,
+ 255, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,255,255,255,255,255,
+ 98, 89, 90, 91, 92, 93, 94, 95, 96, 97, 85, 87,255, 86, 99, 84,
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,104,105,106,107,
+ 108,109,110,111,112,113,114,115,255,255,255,255,255,255,255,255,
+ 83, 71,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255, 51, 46, 54, 45, 55, 56,
+ 53,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255, 47, 49, 48, 52,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
+};
+
+static const char KEYCODE_WINDOWS_NAME_DATA[] =
+"\0'\0,\0-\0.\0/\0;\0=\0A\0B\0Backspace\0C\0Caps Lock\0D\0Delete\0E\0End\0"
+"Enter\0Escape\0F\0F1\0F10\0F11\0F12\0F2\0F3\0F4\0F5\0F6\0F7\0F8\0F9\0G\0H"
+"\0Home\0I\0Insert\0J\0K\0L\0Left\0Left Alt\0Left Control\0Left Shift\0Lef"
+"t Windows\0M\0N\0O\0P\0Page Down\0Page Up\0Pause\0Print Screen\0Q\0R\0Rig"
+"ht\0Right Alt\0Right Control\0Right Shift\0Right Windows\0S\0Scroll Lock"
+"\0T\0Tab\0U\0V\0W\0X\0Y\0Z\0[\0\\\0]\0`";
+static const unsigned short KEYCODE_WINDOWS_NAME_OFFSET[] = {
+ 0,0,0,0,15,17,29,41,50,69,110,112,119,128,130,132,185,187,189,191,230,232,
+ 290,304,310,312,314,316,318,320,72,84,90,93,96,99,102,105,108,76,0,62,19,
+ 306,0,5,13,322,326,324,0,11,1,328,3,7,9,31,71,86,89,92,95,98,101,104,107,74,
+ 78,82,217,292,211,121,114,203,43,52,193,234,134,198,208,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,161,139,172,250,264,240,276
+};
+
+
+EXPORT unsigned int CALL osal_is_key_pressed(unsigned int _key, unsigned int _mask)
+{
+ if (_key == 0 || _key > 255)
+ return 0;
+ return GetAsyncKeyState(WIN_HID_TO_NATIVE[_key]) & _mask;
+}
+
+EXPORT unsigned int CALL osal_virtual_key_to_hid(unsigned int _key)
+{
+ if (_key < 256)
+ return WIN_NATIVE_TO_HID[_key];
+ return 0;
+}
+
+EXPORT const char * CALL osal_keycode_name(unsigned int _hidCode)
+{
+ unsigned offset;
+ if (232 <= _hidCode)
+ return NULL;
+ offset = KEYCODE_WINDOWS_NAME_OFFSET[_hidCode];
+ if (offset == 0)
+ return NULL;
+ return KEYCODE_WINDOWS_NAME_DATA + offset;
+}
+
+#ifdef __cplusplus
+}
+#endif