Update to bsnes v041 release.

I apologize for posting a new version so quickly. This is mostly a maintenance release: joypad analog axes can once again be mapped to the mouse / super scope axis controls, the input capture window has been rewritten to be much more compact, and I've omitted all unneeded features of Qt 4.5 to reduce the final binary size as much as possible (from ~3.33MB to ~2.3MB.) The source archive is also ~20% smaller.
Barring any unforseen problems, this will likely be the last official release for a while.
Also, I finally have dedicated hosting for byuu.org. I ask that you please update any bookmarks to point here, rather than to byuu.cinnamonpirate.com from this point on, as we'd like to free up the cinnamonpirate sub-domain slot.
This commit is contained in:
byuu 2009-03-15 03:42:52 +00:00
parent def86470f4
commit f976998222
10 changed files with 98 additions and 87 deletions

View File

@ -1,4 +1,4 @@
#define BSNES_VERSION "0.040"
#define BSNES_VERSION "0.041"
#define BSNES_TITLE "bsnes v" BSNES_VERSION
#define BUSCORE sBus

Binary file not shown.

Before

Width:  |  Height:  |  Size: 190 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -71,13 +71,13 @@ public:
//external
//========
attach(snes.config.controller_port1 = SNES::Input::DeviceJoypad, "snes.controller_port1");
attach(snes.config.controller_port2 = SNES::Input::DeviceJoypad, "snes.controller_port2");
attach(snes.config.expansion_port = SNES::ExpansionBSX, "snes.expansion_port");
attach(snes.config.controller_port1 = SNES::Input::DeviceJoypad, "snes.controllerPort1");
attach(snes.config.controller_port2 = SNES::Input::DeviceJoypad, "snes.controllerPort2");
attach(snes.config.expansion_port = SNES::ExpansionBSX, "snes.expansionPort");
attach(snes.config.region = SNES::Autodetect, "snes.region");
attach(snes.config.file.autodetect_type = false, "file.autodetect_type");
attach(snes.config.file.bypass_patch_crc32 = false, "file.bypass_patch_crc32");
attach(snes.config.file.autodetect_type = false, "file.autodetectType");
attach(snes.config.file.bypass_patch_crc32 = false, "file.bypassPatchCrc32");
attach(snes.config.path.rom = "", "path.rom");
attach(snes.config.path.save = "", "path.save");
@ -88,14 +88,14 @@ public:
attach(snes.config.path.st = "", "path.st");
attach(snes.config.cpu.version = 2, "cpu.version", "Valid version(s) are: 1, 2");
attach(snes.config.cpu.ntsc_clock_rate = 21477272, "cpu.ntsc_clock_rate");
attach(snes.config.cpu.pal_clock_rate = 21281370, "cpu.pal_clock_rate");
attach(snes.config.cpu.alu_mul_delay = 2, "cpu.alu_mul_delay");
attach(snes.config.cpu.alu_div_delay = 2, "cpu.alu_div_delay");
attach(snes.config.cpu.wram_init_value = 0x55, "cpu.wram_init_value");
attach(snes.config.cpu.ntsc_clock_rate = 21477272, "cpu.ntscClockRate");
attach(snes.config.cpu.pal_clock_rate = 21281370, "cpu.palClockRate");
attach(snes.config.cpu.alu_mul_delay = 2, "cpu.aluMulDelay");
attach(snes.config.cpu.alu_div_delay = 2, "cpu.aluDivDelay");
attach(snes.config.cpu.wram_init_value = 0x55, "cpu.wramInitValue");
attach(snes.config.smp.ntsc_clock_rate = 32041 * 768, "smp.ntsc_clock_rate");
attach(snes.config.smp.pal_clock_rate = 32041 * 768, "smp.pal_clock_rate");
attach(snes.config.smp.ntsc_clock_rate = 32041 * 768, "smp.ntscClockRate");
attach(snes.config.smp.pal_clock_rate = 32041 * 768, "smp.palClockRate");
attach(snes.config.ppu1.version = 1, "ppu1.version", "Valid version(s) are: 1");
attach(snes.config.ppu2.version = 3, "ppu2.version", "Valid version(s) are: 1, 2, 3");

View File

@ -47,8 +47,8 @@ void InputManager::refresh() {
input.poll(stateTable[next]);
for(unsigned i = 0; i < nall::input_limit; i++) {
//call on_input() whenever button is pressed down; ignore axes
if(!stateTable[last][i] && stateTable[next][i] && InputCode::isButton(i) && onInput) onInput(i);
//alert via callback whenever input state changes for any ID ...
if(onInput && stateTable[last][i] != stateTable[next][i]) onInput(i);
}
}

View File

@ -31,10 +31,10 @@ void InputSettingsWindow::setup() {
layout->addSpacing(Style::WidgetSpacing);
controls = new QHBoxLayout; {
assign = new QPushButton("Assign Key ...");
assign = new QPushButton("Assign ...");
controls->addWidget(assign);
unassign = new QPushButton("Unassign Key");
unassign = new QPushButton("Unassign");
controls->addWidget(unassign);
}
controls->setSpacing(Style::WidgetSpacing);

View File

@ -7,52 +7,41 @@ void InputCaptureWindow::setup() {
layout->setMargin(Style::WindowMargin);
layout->setSpacing(0);
title = new QLabel;
layout->addWidget(title);
hlayout = new QHBoxLayout;
hlayout->setSpacing(Style::WidgetSpacing); {
title = new QLabel;
hlayout->addWidget(title, 0, Qt::AlignTop);
axisGroup = new QGroupBox("Mouse axes"); {
axisLayout = new QHBoxLayout;
axisLayout->setSpacing(Style::WidgetSpacing); {
mouseAxisX = new QPushButton("X-axis");
axisLayout->addWidget(mouseAxisX);
mouseAxes = new QPushButton(" Assign Mouse Axis ");
mouseAxes->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
mouseAxisMenu = new QMenu;
mouseAxisX = mouseAxisMenu->addAction("X-axis");
mouseAxisY = mouseAxisMenu->addAction("Y-axis");
mouseAxes->setMenu(mouseAxisMenu);
hlayout->addWidget(mouseAxes, 0, Qt::AlignTop);
mouseAxisY = new QPushButton("Y-axis");
axisLayout->addWidget(mouseAxisY);
}
axisGroup->setLayout(axisLayout);
mouseButtons = new QPushButton(" Assign Mouse Button ");
mouseButtons->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
mouseButtonMenu = new QMenu;
mouseButton[0] = mouseButtonMenu->addAction("Button 0 (left)");
mouseButton[1] = mouseButtonMenu->addAction("Button 1 (middle)");
mouseButton[2] = mouseButtonMenu->addAction("Button 2 (right)");
mouseButtonMenu->addSeparator();
mouseButton[3] = mouseButtonMenu->addAction("Button 3");
mouseButton[4] = mouseButtonMenu->addAction("Button 4");
mouseButton[5] = mouseButtonMenu->addAction("Button 5");
mouseButton[6] = mouseButtonMenu->addAction("Button 6");
mouseButton[7] = mouseButtonMenu->addAction("Button 7");
mouseButtons->setMenu(mouseButtonMenu);
hlayout->addWidget(mouseButtons, 0, Qt::AlignTop);
}
layout->addWidget(axisGroup);
buttonGroup = new QGroupBox("Mouse buttons"); {
buttonLayout = new QGridLayout;
buttonLayout->setSpacing(Style::WidgetSpacing); {
mouseButton[0] = new QPushButton("Left");
buttonLayout->addWidget(mouseButton[0], 0, 0);
mouseButton[1] = new QPushButton("Middle");
buttonLayout->addWidget(mouseButton[1], 0, 1);
mouseButton[2] = new QPushButton("Right");
buttonLayout->addWidget(mouseButton[2], 0, 2);
mouseButton[3] = new QPushButton("Extra 1");
buttonLayout->addWidget(mouseButton[3], 1, 0);
mouseButton[4] = new QPushButton("Extra 2");
buttonLayout->addWidget(mouseButton[4], 1, 1);
mouseButton[5] = new QPushButton("Extra 3");
buttonLayout->addWidget(mouseButton[5], 1, 2);
}
buttonGroup->setLayout(buttonLayout);
}
layout->addWidget(buttonGroup);
layout->addLayout(hlayout);
imageSpacer = new QWidget;
imageSpacer->setFixedSize(Style::WidgetSpacing, Style::WidgetSpacing);
layout->addWidget(imageSpacer);
imageWidget = new InputImage;
imageWidget = new ImageWidget;
layout->addWidget(imageWidget, 0, Qt::AlignHCenter);
spacer = new QWidget;
@ -60,14 +49,16 @@ void InputCaptureWindow::setup() {
layout->addWidget(spacer);
window->setLayout(layout);
connect(mouseAxisX, SIGNAL(released()), this, SLOT(assignMouseX()));
connect(mouseAxisY, SIGNAL(released()), this, SLOT(assignMouseY()));
connect(mouseButton[0], SIGNAL(released()), this, SLOT(assignMouse0()));
connect(mouseButton[1], SIGNAL(released()), this, SLOT(assignMouse1()));
connect(mouseButton[2], SIGNAL(released()), this, SLOT(assignMouse2()));
connect(mouseButton[3], SIGNAL(released()), this, SLOT(assignMouse3()));
connect(mouseButton[4], SIGNAL(released()), this, SLOT(assignMouse4()));
connect(mouseButton[5], SIGNAL(released()), this, SLOT(assignMouse5()));
connect(mouseAxisX, SIGNAL(triggered()), this, SLOT(assignMouseX()));
connect(mouseAxisY, SIGNAL(triggered()), this, SLOT(assignMouseY()));
connect(mouseButton[0], SIGNAL(triggered()), this, SLOT(assignMouse0()));
connect(mouseButton[1], SIGNAL(triggered()), this, SLOT(assignMouse1()));
connect(mouseButton[2], SIGNAL(triggered()), this, SLOT(assignMouse2()));
connect(mouseButton[3], SIGNAL(triggered()), this, SLOT(assignMouse3()));
connect(mouseButton[4], SIGNAL(triggered()), this, SLOT(assignMouse4()));
connect(mouseButton[5], SIGNAL(triggered()), this, SLOT(assignMouse5()));
connect(mouseButton[6], SIGNAL(triggered()), this, SLOT(assignMouse6()));
connect(mouseButton[7], SIGNAL(triggered()), this, SLOT(assignMouse7()));
}
void InputCaptureWindow::activate(InputObject *object) {
@ -85,20 +76,20 @@ void InputCaptureWindow::activate(InputObject *object) {
activeObject = object;
if(activeObject->type == InputObject::Button) {
axisGroup->hide();
buttonGroup->show();
mouseAxes->hide();
mouseButtons->show();
info << "Press any keyboard key / joypad button, or click the desired mouse button below to set assignment.";
info << "Press any key or button to assign to this ID.";
} else /*(activeObject->type == InputObject::Axis)*/ {
axisGroup->show();
buttonGroup->hide();
mouseAxes->show();
mouseButtons->hide();
info << "Move any joypad axis, or click the desired mouse axis below to set assignment.";
info << "Move any axis to assign to this ID.";
}
if(dynamic_cast<Joypad*>(activeObject->parent)) {
imageSpacer->show();
imageWidget->setFixedSize(600, 300);
imageWidget->setFixedSize(480, 210);
imageWidget->show();
} else {
imageSpacer->hide();
@ -121,25 +112,34 @@ void InputCaptureWindow::activate(InputObject *object) {
window->raise();
}
void InputCaptureWindow::inputEvent(uint16_t code, bool forceAssign) {
void InputCaptureWindow::inputEvent(uint16_t code, bool forceAssign /* = false */) {
if(!activeObject) return;
//input polling is global, need to block mouse actions that may be UI interactions.
//custom controls on window allow mouse assignment instead.
if(forceAssign == false) {
InputCode::type_t type = InputCode::type(code);
int16_t state = inputManager.state(code);
if(activeObject->type == InputObject::Axis) {
if(type == InputCode::KeyboardButton
|| type == InputCode::MouseAxis
|| type == InputCode::MouseButton
|| type == InputCode::JoypadButton
) return;
//only capture when axis is positioned at least 50% toward a given direction
if(abs(state) < 16384) return;
}
if(activeObject->type == InputObject::Button) {
if(type == InputCode::MouseAxis
|| type == InputCode::MouseButton
|| type == InputCode::JoypadAxis
) return;
} else /*(activeObject->type == InputObject::Axis)*/ {
if(type == InputCode::KeyboardButton
|| type == InputCode::MouseAxis
|| type == InputCode::MouseButton
|| type == InputCode::JoypadButton
) return;
//only capture on button press, not release
if(state == false) return;
}
}
@ -160,6 +160,8 @@ void InputCaptureWindow::assignMouse2() { inputEvent(mouse::button + 2, true); }
void InputCaptureWindow::assignMouse3() { inputEvent(mouse::button + 3, true); }
void InputCaptureWindow::assignMouse4() { inputEvent(mouse::button + 4, true); }
void InputCaptureWindow::assignMouse5() { inputEvent(mouse::button + 5, true); }
void InputCaptureWindow::assignMouse6() { inputEvent(mouse::button + 6, true); }
void InputCaptureWindow::assignMouse7() { inputEvent(mouse::button + 7, true); }
InputCaptureWindow::InputCaptureWindow() {
activeObject = 0;
@ -170,7 +172,7 @@ void InputCaptureWindow::Window::closeEvent(QCloseEvent*) {
winInputCapture->activeObject = 0;
}
void InputCaptureWindow::InputImage::paintEvent(QPaintEvent*) {
void InputCaptureWindow::ImageWidget::paintEvent(QPaintEvent*) {
//currently, there is only an image available for the joypad.
//in the future, this routine should determine which type of
//image to draw via activeObject->parent's derived class type.

View File

@ -8,16 +8,17 @@ public:
void closeEvent(QCloseEvent*);
} *window;
QVBoxLayout *layout;
QLabel *title;
QGroupBox *axisGroup;
QHBoxLayout *axisLayout;
QPushButton *mouseAxisX;
QPushButton *mouseAxisY;
QGroupBox *buttonGroup;
QGridLayout *buttonLayout;
QPushButton *mouseButton[6];
QHBoxLayout *hlayout;
QLabel *title;
QPushButton *mouseAxes;
QMenu *mouseAxisMenu;
QAction *mouseAxisX;
QAction *mouseAxisY;
QPushButton *mouseButtons;
QMenu *mouseButtonMenu;
QAction *mouseButton[8];
QWidget *imageSpacer;
struct InputImage : public QWidget {
struct ImageWidget : public QWidget {
void paintEvent(QPaintEvent*);
} *imageWidget;
QWidget *spacer;
@ -36,4 +37,6 @@ public slots:
void assignMouse3();
void assignMouse4();
void assignMouse5();
void assignMouse6();
void assignMouse7();
} *winInputCapture;

View File

@ -108,6 +108,8 @@ void Application::init() {
config.save(configFilename);
inputManager.bind();
inputManager.refresh();
inputManager.refresh();
inputManager.onInput = bind(&Utility::inputEvent, &utility);
utility.updateAvSync();

View File

@ -5,6 +5,10 @@ void Utility::inputEvent(uint16_t code) {
//if input capture assignment window is currently active, forward key-press event
if(winInputCapture->activeObject) winInputCapture->inputEvent(code);
//only match buttons being pressed down ...
if(InputCode::isButton(code) == false) return;
if(inputManager.state(code) == false) return;
if(code == keyboard::escape && input.acquired()) {
input.unacquire();
return; //do not trigger other UI actions that may be bound to escape key