diff --git a/docs/index.html b/docs/index.html
index fa03be01e..5ea3f57ed 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1776,7 +1776,9 @@
-joydeadzone <number> |
- Sets the joystick deadzone area for analog joysticks.
+ | Sets the joystick axis deadzone area for joysticks/gamepads.
+ All values within the deadzone are treated as zero-axis values,
+ while only those values outside are registered as valid input.
Accepts a number from 0 - 29, and uses the formula
3200 + number * 1000. So the possible deadzone values
range from 3200 to 32200. |
@@ -2329,7 +2331,7 @@
Item | Brief description | For more information, see CommandLine |
Stelladaptor X is | Specifies which virtual port each Stelladaptor uses (See Advanced Configuration - Stelladaptor Support) | -sa1 & -sa2 |
AVox serial port | Described in further detail in Advanced Configuration - AtariVox/SaveKey Support | -avoxport |
- Joy deadzone | Joystick deadzone area for analog joysticks | -joydeadzone |
+ Joy deadzone | Deadzone area for axes on joysticks/gamepads | -joydeadzone |
Paddle speed | Speed used when emulating a paddle using a digital device | -pspeed |
Allow all 4 ... | Allow all 4 joystick directions to be pressed simultaneously | -joyallow4 |
Use mouse as ... | Use the mouse for various controllers (paddles, driving, etc) | -usemouse |
diff --git a/src/common/FrameBufferGL.cxx b/src/common/FrameBufferGL.cxx
index 5ee34e26f..1b57435f3 100644
--- a/src/common/FrameBufferGL.cxx
+++ b/src/common/FrameBufferGL.cxx
@@ -292,10 +292,14 @@ bool FrameBufferGL::setVidMode(VideoMode& mode)
if(!inUIMode)
{
// Aspect ratio (depends on whether NTSC or PAL is detected)
- const string& frate = myOSystem->console().about().InitialFrameRate;
- int aspect =
- myOSystem->settings().getInt(frate == "60" ? "gl_aspectn" : "gl_aspectp");
- mode.image_w = (uInt16)(float(mode.image_w * aspect) / 100.0);
+ // Not available in 'small' resolutions
+ if(myOSystem->desktopWidth() >= 640)
+ {
+ const string& frate = myOSystem->console().about().InitialFrameRate;
+ int aspect =
+ myOSystem->settings().getInt(frate == "60" ? "gl_aspectn" : "gl_aspectp");
+ mode.image_w = (uInt16)(float(mode.image_w * aspect) / 100.0);
+ }
// Fullscreen mode stretching
if(fullScreen() && myOSystem->settings().getBool("gl_fsmax") &&
diff --git a/src/emucore/OSystem.cxx b/src/emucore/OSystem.cxx
index 7cbffdf20..a8e9951ca 100644
--- a/src/emucore/OSystem.cxx
+++ b/src/emucore/OSystem.cxx
@@ -1057,14 +1057,28 @@ bool OSystem::queryVideoHardware()
else
{
for(uInt32 i = 0; modes[i]; ++i)
+ {
+ if(modes[i]->w >= 320 && modes[i]->w <= myDesktopWidth &&
+ modes[i]->h >= 240 && modes[i]->h <= myDesktopHeight)
+ {
+ Resolution r;
+ r.width = modes[i]->w;
+ r.height = modes[i]->h;
+ buf.str("");
+ buf << r.width << "x" << r.height;
+ r.name = buf.str();
+ myResolutions.insert_at(0, r); // insert in opposite (of descending) order
+ }
+ }
+ // If no modes were valid, use the desktop dimensions
+ if(myResolutions.size() == 0)
{
Resolution r;
- r.width = modes[i]->w;
- r.height = modes[i]->h;
- buf.str("");
+ r.width = myDesktopWidth;
+ r.height = myDesktopHeight;
buf << r.width << "x" << r.height;
r.name = buf.str();
- myResolutions.insert_at(0, r); // insert in opposite (of descending) order
+ myResolutions.push_back(r);
}
}
diff --git a/src/gui/AudioDialog.cxx b/src/gui/AudioDialog.cxx
index 4a3b978c3..9d47f78ca 100644
--- a/src/gui/AudioDialog.cxx
+++ b/src/gui/AudioDialog.cxx
@@ -49,7 +49,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
buttonHeight = font.getLineHeight() + 4;
int xpos, ypos;
int lwidth = font.getStringWidth("Fragment Size: "),
- pwidth = font.getStringWidth("4096");
+ pwidth = font.getStringWidth("512 bytes");
WidgetArray wid;
StringMap items;
@@ -74,12 +74,12 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
// Fragment size
items.clear();
- items.push_back("128", "128");
- items.push_back("256", "256");
- items.push_back("512", "512");
- items.push_back("1024", "1024");
- items.push_back("2048", "2048");
- items.push_back("4096", "4096");
+ items.push_back("128 bytes", "128");
+ items.push_back("256 bytes", "256");
+ items.push_back("512 bytes", "512");
+ items.push_back("1 KB", "1024");
+ items.push_back("2 KB", "2048");
+ items.push_back("4 KB", "4096");
myFragsizePopup = new PopUpWidget(this, font, xpos, ypos,
pwidth + myVolumeLabel->getWidth() - 4, lineHeight,
items, "Fragment size: ", lwidth);
@@ -88,11 +88,11 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
// Output frequency
items.clear();
- items.push_back("11025", "11025");
- items.push_back("22050", "22050");
- items.push_back("31400", "31400");
- items.push_back("44100", "44100");
- items.push_back("48000", "48000");
+ items.push_back("11025 Hz", "11025");
+ items.push_back("22050 Hz", "22050");
+ items.push_back("31400 Hz", "31400");
+ items.push_back("44100 Hz", "44100");
+ items.push_back("48000 Hz", "48000");
myFreqPopup = new PopUpWidget(this, font, xpos, ypos,
pwidth + myVolumeLabel->getWidth() - 4, lineHeight,
items, "Output freq: ", lwidth);
@@ -108,13 +108,13 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent,
ypos += lineHeight + 4;
// Clip volume
- myClipVolumeCheckbox = new CheckboxWidget(this, font, xpos+28, ypos,
+ myClipVolumeCheckbox = new CheckboxWidget(this, font, xpos+50, ypos,
"Clip volume", 0);
wid.push_back(myClipVolumeCheckbox);
ypos += lineHeight + 4;
// Enable sound
- mySoundEnableCheckbox = new CheckboxWidget(this, font, xpos+28, ypos,
+ mySoundEnableCheckbox = new CheckboxWidget(this, font, xpos+50, ypos,
"Enable sound", kSoundEnableChanged);
wid.push_back(mySoundEnableCheckbox);
ypos += lineHeight + 12;
diff --git a/src/gui/FileSnapDialog.cxx b/src/gui/FileSnapDialog.cxx
index 0938262c2..6456214cd 100644
--- a/src/gui/FileSnapDialog.cxx
+++ b/src/gui/FileSnapDialog.cxx
@@ -26,6 +26,7 @@
#include "EditTextWidget.hxx"
#include "FSNode.hxx"
#include "LauncherDialog.hxx"
+#include "PopUpWidget.hxx"
#include "Settings.hxx"
#include "FileSnapDialog.hxx"
@@ -128,7 +129,7 @@ FileSnapDialog::FileSnapDialog(
// Snapshot single or multiple saves
xpos = 30; ypos += b->getHeight() + 5;
mySnapSingle = new CheckboxWidget(this, font, xpos, ypos,
- "Multiple snapshots");
+ "Overwrite snapshots");
wid.push_back(mySnapSingle);
// Snapshot in 1x mode (ignore scaling)
@@ -138,18 +139,23 @@ FileSnapDialog::FileSnapDialog(
wid.push_back(mySnap1x);
// Snapshot interval (continuous mode)
+ StringMap items;
+ items.clear();
+ items.push_back("1 second", "1");
+ items.push_back("2 seconds", "2");
+ items.push_back("3 seconds", "3");
+ items.push_back("4 seconds", "4");
+ items.push_back("5 seconds", "5");
+ items.push_back("6 seconds", "6");
+ items.push_back("7 seconds", "7");
+ items.push_back("8 seconds", "8");
+ items.push_back("9 seconds", "9");
+ items.push_back("10 seconds", "10");
xpos = 30; ypos += b->getHeight();
- mySnapSlider =
- new SliderWidget(this, font, xpos, ypos, 6*fontWidth, lineHeight,
- "Snapshot interval: ", font.getStringWidth("Snapshot interval: "),
- kSnapIntervalChanged);
- mySnapSlider->setMinValue(1); mySnapSlider->setMaxValue(10);
- wid.push_back(mySnapSlider);
- mySnapLabel =
- new StaticTextWidget(this, font, xpos + mySnapSlider->getWidth() + 4,
- ypos + 1, 3*fontWidth, font.getFontHeight(), "",
- kTextAlignLeft);
- mySnapLabel->setFlags(WIDGET_CLEARBG);
+ mySnapInterval = new PopUpWidget(this, font, xpos, ypos,
+ font.getStringWidth("10 seconds"), lineHeight,
+ items, "Continuous snapshot interval: ");
+ wid.push_back(mySnapInterval);
// Add Defaults, OK and Cancel buttons
b = new ButtonWidget(this, font, 10, _h - buttonHeight - 10,
@@ -188,10 +194,9 @@ void FileSnapDialog::loadConfig()
myPropsFile->setEditString(settings.getString("propsfile"));
mySnapPath->setEditString(settings.getString("ssdir"));
myEEPROMPath->setEditString(settings.getString("eepromdir"));
- mySnapSingle->setState(!settings.getBool("sssingle"));
+ mySnapSingle->setState(settings.getBool("sssingle"));
mySnap1x->setState(settings.getBool("ss1x"));
- mySnapSlider->setValue(instance().settings().getInt("ssinterval"));
- mySnapLabel->setLabel(instance().settings().getString("ssinterval"));
+ mySnapInterval->setSelected(instance().settings().getString("ssinterval"), "2");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -204,9 +209,9 @@ void FileSnapDialog::saveConfig()
instance().settings().setString("propsfile", myPropsFile->getEditString());
instance().settings().setString("ssdir", mySnapPath->getEditString());
instance().settings().setString("eepromdir", myEEPROMPath->getEditString());
- instance().settings().setBool("sssingle", !mySnapSingle->getState());
+ instance().settings().setBool("sssingle", mySnapSingle->getState());
instance().settings().setBool("ss1x", mySnap1x->getState());
- instance().settings().setInt("ssinterval", mySnapSlider->getValue());
+ instance().settings().setString("ssinterval", mySnapInterval->getSelectedTag());
// Flush changes to disk and inform the OSystem
instance().settings().saveConfig();
@@ -248,10 +253,9 @@ void FileSnapDialog::setDefaults()
node = FilesystemNode(ssdir);
mySnapPath->setEditString(node.getRelativePath());
- mySnapSingle->setState(true);
+ mySnapSingle->setState(false);
mySnap1x->setState(false);
- mySnapSlider->setValue(2);
- mySnapLabel->setLabel("2");
+ mySnapInterval->setSelected("2", "2");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -359,10 +363,6 @@ void FileSnapDialog::handleCommand(CommandSender* sender, int cmd,
sendCommand(kReloadRomDirCmd, 0, 0);
break;
- case kSnapIntervalChanged:
- mySnapLabel->setValue(mySnapSlider->getValue());
- break;
-
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
diff --git a/src/gui/FileSnapDialog.hxx b/src/gui/FileSnapDialog.hxx
index ce594f691..6380f3c38 100644
--- a/src/gui/FileSnapDialog.hxx
+++ b/src/gui/FileSnapDialog.hxx
@@ -65,8 +65,7 @@ class FileSnapDialog : public Dialog, public CommandSender
kCheatFileChosenCmd = 'LOcc', // cheatfile changed
kPaletteFileChosenCmd = 'LOpc', // palette file changed
kPropsFileChosenCmd = 'LOrc', // properties file changed
- kEEPROMDirChosenCmd = 'LOec', // eeprom dir changed
- kSnapIntervalChanged = 'LOsi' // continuous snapshot interval
+ kEEPROMDirChosenCmd = 'LOec' // eeprom dir changed
};
BrowserDialog* myBrowser;
@@ -81,10 +80,9 @@ class FileSnapDialog : public Dialog, public CommandSender
EditTextWidget* mySnapPath;
// Other snapshot settings
- CheckboxWidget* mySnapSingle;
- CheckboxWidget* mySnap1x;
- SliderWidget* mySnapSlider;
- StaticTextWidget* mySnapLabel;
+ CheckboxWidget* mySnapSingle;
+ CheckboxWidget* mySnap1x;
+ PopUpWidget* mySnapInterval;
// Indicates if this dialog is used for global (vs. in-game) settings
bool myIsGlobal;
diff --git a/src/gui/HelpDialog.cxx b/src/gui/HelpDialog.cxx
index 030e6625c..041373634 100644
--- a/src/gui/HelpDialog.cxx
+++ b/src/gui/HelpDialog.cxx
@@ -103,19 +103,31 @@ void HelpDialog::updateStrings(uInt8 page, uInt8 lines, string& title)
uInt8 i = 0;
switch(page)
{
-#ifndef MAC_OSX
case 1:
title = "Common commands:";
+#ifndef MAC_OSX
ADD_BIND("Ctrl Q", "Quit emulation");
+#else
+ ADD_BIND("Cmd Q", "Quit emulation");
+#endif
ADD_BIND("Escape", "Exit current game");
ADD_BIND("Tab", "Enter options menu");
ADD_BIND("\\", "Toggle command menu");
+#ifndef MAC_OSX
ADD_BIND("Alt =", "Increase window size");
ADD_BIND("Alt -", "Decrease window size");
ADD_BIND("Alt Enter", "Toggle fullscreen /");
ADD_BIND("", " windowed mode");
ADD_BIND("Alt ]", "Increase volume by 2%");
ADD_BIND("Alt [", "Decrease volume by 2%");
+#else
+ ADD_BIND("Cmd =", "Increase window size");
+ ADD_BIND("Cmd -", "Decrease window size");
+ ADD_BIND("Cmd Enter", "Toggle fullscreen /");
+ ADD_BIND("", " windowed mode");
+ ADD_BIND("Cmd ]", "Increase volume by 2%");
+ ADD_BIND("Cmd [", "Decrease volume by 2%");
+#endif
break;
case 2:
@@ -133,47 +145,17 @@ void HelpDialog::updateStrings(uInt8 page, uInt8 lines, string& title)
case 3:
title = "Developer commands:";
+#ifndef MAC_OSX
ADD_BIND("Alt PgUp", "Increase Display.YStart");
ADD_BIND("Alt PgDn", "Decrease Display.YStart");
+#else
+ ADD_BIND("Cmd PgUp", "Increase Display.YStart");
+ ADD_BIND("Cmd PgDn", "Decrease Display.YStart");
+#endif
ADD_BIND("Ctrl PgUp", "Increase Display.Height");
ADD_BIND("Ctrl PgDn", "Decrease Display.Height");
break;
-#else
- case 1:
- title = "Common commands:";
- ADD_BIND("Cmd Q", "Quit emulation");
- ADD_BIND("Escape", "Exit current game");
- ADD_BIND("Tab", "Enter options menu");
- ADD_BIND("\\", "Toggle command menu");
- ADD_BIND("Cmd =", "Increase window size");
- ADD_BIND("Cmd -", "Decrease window size");
- ADD_BIND("Cmd Enter", "Toggle fullscreen /");
- ADD_BIND("", " windowed mode");
- ADD_BIND("Shift-Cmd ]", "Increase volume by 2%");
- ADD_BIND("Shift-Cmd [", "Decrease volume by 2%");
- break;
- case 2:
- title = "Special commands:";
- ADD_BIND("Cmd g", "Grab mouse (keep in window)");
- ADD_BIND("Cmd f", "Switch between NTSC/PAL/SECAM");
- ADD_BIND("Cmd s", "Save game properties");
- ADD_BIND("", " to a new file");
- ADD_LINE;
- ADD_BIND("Cmd 0", "Mouse emulates paddle 0");
- ADD_BIND("Cmd 1", "Mouse emulates paddle 1");
- ADD_BIND("Cmd 2", "Mouse emulates paddle 2");
- ADD_BIND("Cmd 3", "Mouse emulates paddle 3");
- break;
-
- case 3:
- title = "Developer commands:";
- ADD_BIND("Shift-Cmd PgUp", "Increase Display.YStart");
- ADD_BIND("Shift-Cmd PgDn", "Decrease Display.YStart");
- ADD_BIND("Cmd PgUp", "Increase Display.Height");
- ADD_BIND("Cmd PgDn", "Decrease Display.Height");
- break;
-#endif
case 4:
title = "All other commands:";
ADD_LINE;
diff --git a/src/gui/InputDialog.cxx b/src/gui/InputDialog.cxx
index f0fc866af..e9607560e 100644
--- a/src/gui/InputDialog.cxx
+++ b/src/gui/InputDialog.cxx
@@ -99,6 +99,7 @@ InputDialog::~InputDialog()
void InputDialog::addVDeviceTab(const GUI::Font& font)
{
const int lineHeight = font.getLineHeight(),
+ fontWidth = font.getMaxCharWidth(),
fontHeight = font.getFontHeight();
int xpos, ypos, lwidth, pwidth, tabID;
WidgetArray wid;
@@ -143,8 +144,8 @@ void InputDialog::addVDeviceTab(const GUI::Font& font)
"Joystick deadzone: ", lwidth, kDeadzoneChanged);
myDeadzone->setMinValue(0); myDeadzone->setMaxValue(29);
xpos += myDeadzone->getWidth() + 5;
- myDeadzoneLabel = new StaticTextWidget(myTab, font, xpos, ypos+1, 24, lineHeight,
- "", kTextAlignLeft);
+ myDeadzoneLabel = new StaticTextWidget(myTab, font, xpos, ypos+1, 5*fontWidth,
+ lineHeight, "", kTextAlignLeft);
myDeadzoneLabel->setFlags(WIDGET_CLEARBG);
wid.push_back(myDeadzone);
@@ -189,7 +190,7 @@ void InputDialog::loadConfig()
// Joystick deadzone
myDeadzone->setValue(instance().settings().getInt("joydeadzone"));
- myDeadzoneLabel->setLabel(instance().settings().getString("joydeadzone"));
+ myDeadzoneLabel->setValue(Joystick::deadzone());
// Mouse/paddle enabled
bool usemouse = instance().settings().getBool("usemouse");
@@ -315,7 +316,7 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd,
break;
case kDeadzoneChanged:
- myDeadzoneLabel->setValue(myDeadzone->getValue());
+ myDeadzoneLabel->setValue(3200 + 1000*myDeadzone->getValue());
break;
case kPSpeedChanged:
diff --git a/src/gui/LauncherDialog.cxx b/src/gui/LauncherDialog.cxx
index b2642b413..ed8c801e2 100644
--- a/src/gui/LauncherDialog.cxx
+++ b/src/gui/LauncherDialog.cxx
@@ -249,7 +249,7 @@ void LauncherDialog::loadConfig()
msg.push_back("Click 'OK' to select a default ROM directory,");
msg.push_back("or 'Cancel' to browse the filesystem manually.");
myFirstRunMsg = new MessageBox(this, instance().font(), msg,
- kFirstRunMsgChosenCmd);
+ _w, _h, kFirstRunMsgChosenCmd);
}
myFirstRunMsg->show();
}
diff --git a/src/gui/MessageBox.cxx b/src/gui/MessageBox.cxx
index 4fc7c91b3..64ecf8a5c 100644
--- a/src/gui/MessageBox.cxx
+++ b/src/gui/MessageBox.cxx
@@ -26,7 +26,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MessageBox::MessageBox(GuiObject* boss, const GUI::Font& font,
- const StringList& text, int cmd)
+ const StringList& text, int max_w, int max_h, int cmd)
: Dialog(&boss->instance(), &boss->parent(), 0, 0, 16, 16),
CommandSender(boss),
myCmd(cmd)
@@ -38,8 +38,11 @@ MessageBox::MessageBox(GuiObject* boss, const GUI::Font& font,
WidgetArray wid;
// Set real dimensions
- _w = 50 * fontWidth + 8;
- _h = (text.size() + 2) * lineHeight + 20;
+ int str_w = 0;
+ for(uInt32 i = 0; i < text.size(); ++i)
+ str_w = BSPF_max((int)text[i].length(), str_w);
+ _w = BSPF_min(str_w * fontWidth + 20, max_w);
+ _h = BSPF_min(((text.size() + 2) * lineHeight + 20), (uInt32)max_h);
xpos = 10; ypos = 10;
for(uInt32 i = 0; i < text.size(); ++i)
diff --git a/src/gui/MessageBox.hxx b/src/gui/MessageBox.hxx
index 2b13b2f35..e36e77b83 100644
--- a/src/gui/MessageBox.hxx
+++ b/src/gui/MessageBox.hxx
@@ -36,7 +36,7 @@ class MessageBox : public Dialog, public CommandSender
{
public:
MessageBox(GuiObject* boss, const GUI::Font& font, const StringList& text,
- int cmd = 0);
+ int max_w, int max_h, int cmd = 0);
virtual ~MessageBox();
/** Place the input dialog onscreen and center it */
diff --git a/src/gui/RomAuditDialog.cxx b/src/gui/RomAuditDialog.cxx
index ee0a0f17c..94f660e18 100644
--- a/src/gui/RomAuditDialog.cxx
+++ b/src/gui/RomAuditDialog.cxx
@@ -28,6 +28,7 @@
#include "EditTextWidget.hxx"
#include "ProgressDialog.hxx"
#include "FSNode.hxx"
+#include "MessageBox.hxx"
#include "Props.hxx"
#include "PropsSet.hxx"
#include "Settings.hxx"
@@ -37,7 +38,10 @@
RomAuditDialog::RomAuditDialog(OSystem* osystem, DialogContainer* parent,
const GUI::Font& font, int max_w, int max_h)
: Dialog(osystem, parent, 0, 0, 0, 0),
- myBrowser(NULL)
+ myBrowser(NULL),
+ myConfirmMsg(NULL),
+ myMaxWidth(max_w),
+ myMaxHeight(max_h)
{
const int vBorder = 8;
@@ -46,7 +50,7 @@ RomAuditDialog::RomAuditDialog(OSystem* osystem, DialogContainer* parent,
fontHeight = font.getFontHeight(),
buttonWidth = font.getStringWidth("Audit path:") + 20,
buttonHeight = font.getLineHeight() + 4,
- lwidth = font.getStringWidth("ROMs with properties (renamed): ");
+ lwidth = font.getStringWidth("ROMs without properties (skipped): ");
int xpos = vBorder, ypos = vBorder;
WidgetArray wid;
@@ -74,7 +78,7 @@ RomAuditDialog::RomAuditDialog(OSystem* osystem, DialogContainer* parent,
myResults1->setFlags(WIDGET_CLEARBG);
ypos += buttonHeight;
new StaticTextWidget(this, font, xpos, ypos, lwidth, fontHeight,
- "ROMs without properties: ", kTextAlignLeft);
+ "ROMs without properties (skipped): ", kTextAlignLeft);
myResults2 = new StaticTextWidget(this, font, xpos + lwidth, ypos,
_w - lwidth - 20, fontHeight, "",
kTextAlignLeft);
@@ -91,7 +95,7 @@ RomAuditDialog::RomAuditDialog(OSystem* osystem, DialogContainer* parent,
addBGroupToFocusList(wid);
// Create file browser dialog
- myBrowser = new BrowserDialog(this, font, max_w, max_h);
+ myBrowser = new BrowserDialog(this, font, myMaxWidth, myMaxHeight);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -173,6 +177,24 @@ void RomAuditDialog::handleCommand(CommandSender* sender, int cmd,
switch (cmd)
{
case kOKCmd:
+ if(!myConfirmMsg)
+ {
+ StringList msg;
+ msg.push_back("This operation cannot be undone. Your ROMs");
+ msg.push_back("will be modified, and as such there is a chance");
+ msg.push_back("that files may be lost. You are recommended");
+ msg.push_back("to back up your files before proceeding.");
+ msg.push_back("");
+ msg.push_back("If you're sure you want to proceed with the");
+ msg.push_back("audit, click 'OK', otherwise click 'Cancel'.");
+ myConfirmMsg =
+ new MessageBox(this, instance().font(), msg, myMaxWidth, myMaxHeight,
+ kConfirmAuditCmd);
+ }
+ myConfirmMsg->show();
+ break;
+
+ case kConfirmAuditCmd:
auditRoms();
break;
diff --git a/src/gui/RomAuditDialog.hxx b/src/gui/RomAuditDialog.hxx
index fc5d48625..e67a76f27 100644
--- a/src/gui/RomAuditDialog.hxx
+++ b/src/gui/RomAuditDialog.hxx
@@ -29,6 +29,7 @@ class DialogContainer;
class BrowserDialog;
class EditTextWidget;
class StaticTextWidget;
+class MessageBox;
#include "Dialog.hxx"
#include "Command.hxx"
@@ -52,7 +53,8 @@ class RomAuditDialog : public Dialog
private:
enum {
kChooseAuditDirCmd = 'RAsl', // audit dir select
- kAuditDirChosenCmd = 'RAch' // audit dir changed
+ kAuditDirChosenCmd = 'RAch', // audit dir changed
+ kConfirmAuditCmd = 'RAcf' // confirm rom audit
};
// ROM audit path
@@ -64,6 +66,12 @@ class RomAuditDialog : public Dialog
// Select a new ROM audit path
BrowserDialog* myBrowser;
+
+ // Show a message about the dangers of using this function
+ MessageBox* myConfirmMsg;
+
+ // Maximum width and height for this dialog
+ int myMaxWidth, myMaxHeight;
};
#endif
diff --git a/src/gui/UIDialog.cxx b/src/gui/UIDialog.cxx
index 866ce00d5..cb65cbfc2 100644
--- a/src/gui/UIDialog.cxx
+++ b/src/gui/UIDialog.cxx
@@ -72,8 +72,16 @@ UIDialog::UIDialog(OSystem* osystem, DialogContainer* parent,
myLauncherWidthSlider = new SliderWidget(myTab, font, xpos, ypos, pwidth,
lineHeight, "Launcher Width: ",
lwidth, kLWidthChanged);
- myLauncherWidthSlider->setMinValue(320);
- myLauncherWidthSlider->setMaxValue(1920);
+ if(instance().desktopWidth() < 640)
+ {
+ myLauncherWidthSlider->setMinValue(320);
+ myLauncherWidthSlider->setMaxValue(instance().desktopWidth());
+ }
+ else
+ {
+ myLauncherWidthSlider->setMinValue(640);
+ myLauncherWidthSlider->setMaxValue(1920);
+ }
myLauncherWidthSlider->setStepValue(10);
wid.push_back(myLauncherWidthSlider);
myLauncherWidthLabel =
@@ -86,8 +94,16 @@ UIDialog::UIDialog(OSystem* osystem, DialogContainer* parent,
myLauncherHeightSlider = new SliderWidget(myTab, font, xpos, ypos, pwidth,
lineHeight, "Launcher Height: ",
lwidth, kLHeightChanged);
- myLauncherHeightSlider->setMinValue(240);
- myLauncherHeightSlider->setMaxValue(1200);
+ if(instance().desktopHeight() < 480)
+ {
+ myLauncherHeightSlider->setMinValue(240);
+ myLauncherHeightSlider->setMaxValue(instance().desktopHeight());
+ }
+ else
+ {
+ myLauncherHeightSlider->setMinValue(480);
+ myLauncherHeightSlider->setMaxValue(1200);
+ }
myLauncherHeightSlider->setStepValue(10);
wid.push_back(myLauncherHeightSlider);
myLauncherHeightLabel =
@@ -166,6 +182,22 @@ UIDialog::UIDialog(OSystem* osystem, DialogContainer* parent,
ypos + 1, 4*fontWidth, fontHeight, "", kTextAlignLeft);
myDebuggerHeightLabel->setFlags(WIDGET_CLEARBG);
+ // Debugger is only realistically available in windowed modes 800x600 or greater
+ // (and when it's actually been compiled into the app)
+ bool debuggerAvailable =
+#if defined(DEBUGGER_SUPPORT) && defined(WINDOWED_SUPPORT)
+ (instance().desktopWidth() >= 800 && instance().desktopHeight() >= 600);
+#else
+ false;
+#endif
+ if(!debuggerAvailable)
+ {
+ myDebuggerWidthSlider->clearFlags(WIDGET_ENABLED);
+ myDebuggerWidthLabel->clearFlags(WIDGET_ENABLED);
+ myDebuggerHeightSlider->clearFlags(WIDGET_ENABLED);
+ myDebuggerHeightLabel->clearFlags(WIDGET_ENABLED);
+ }
+
// Add message concerning usage
xpos = vBorder; ypos += 2*(lineHeight + 4);
lwidth = font.getStringWidth("(*) Changes require ROM reload");
@@ -193,48 +225,45 @@ UIDialog::UIDialog(OSystem* osystem, DialogContainer* parent,
ypos += lineHeight + 4;
// Delay between quick-selecting characters in ListWidget
- myListDelaySlider = new SliderWidget(myTab, font, xpos, ypos, pwidth,
- lineHeight, "List quick delay: ",
- lwidth, kLQDelayChanged);
- myListDelaySlider->setMinValue(300);
- myListDelaySlider->setMaxValue(1000);
- myListDelaySlider->setStepValue(100);
- wid.push_back(myListDelaySlider);
- myListDelayLabel =
- new StaticTextWidget(myTab, font,
- xpos + myListDelaySlider->getWidth() + 4,
- ypos + 1, 4*fontWidth, fontHeight, "", kTextAlignLeft);
- myListDelayLabel->setFlags(WIDGET_CLEARBG);
+ items.clear();
+ items.push_back("300 ms", "300");
+ items.push_back("400 ms", "400");
+ items.push_back("500 ms", "500");
+ items.push_back("600 ms", "600");
+ items.push_back("700 ms", "700");
+ items.push_back("800 ms", "800");
+ items.push_back("900 ms", "900");
+ items.push_back("1 sec", "1000");
+ myListDelayPopup = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
+ items, "List quick delay: ", lwidth);
+ wid.push_back(myListDelayPopup);
ypos += lineHeight + 4;
// Number of lines a mouse wheel will scroll
- myWheelLinesSlider = new SliderWidget(myTab, font, xpos, ypos, pwidth,
- lineHeight, "Mouse wheel scroll: ",
- lwidth, kWLinesChanged);
- myWheelLinesSlider->setMinValue(1);
- myWheelLinesSlider->setMaxValue(10);
- myWheelLinesSlider->setStepValue(1);
- wid.push_back(myWheelLinesSlider);
- myWheelLinesLabel =
- new StaticTextWidget(myTab, font,
- xpos + myWheelLinesSlider->getWidth() + 4,
- ypos + 1, 2*fontWidth, fontHeight, "", kTextAlignLeft);
- myWheelLinesLabel->setFlags(WIDGET_CLEARBG);
+ items.clear();
+ items.push_back("1 line", "1");
+ items.push_back("2 lines", "2");
+ items.push_back("3 lines", "3");
+ items.push_back("4 lines", "4");
+ items.push_back("5 lines", "5");
+ items.push_back("6 lines", "6");
+ items.push_back("7 lines", "7");
+ items.push_back("8 lines", "8");
+ items.push_back("9 lines", "9");
+ items.push_back("10 lines", "10");
+ myWheelLinesPopup = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
+ items, "Mouse wheel scroll: ", lwidth);
+ wid.push_back(myWheelLinesPopup);
ypos += lineHeight + 4;
// Amount of output to show with 'showinfo'
- myShowInfoSlider = new SliderWidget(myTab, font, xpos, ypos, pwidth,
- lineHeight, "Show Info level: ",
- lwidth, kSInfoChanged);
- myShowInfoSlider->setMinValue(0);
- myShowInfoSlider->setMaxValue(2);
- myShowInfoSlider->setStepValue(1);
- wid.push_back(myShowInfoSlider);
- myShowInfoLabel =
- new StaticTextWidget(myTab, font,
- xpos + myShowInfoSlider->getWidth() + 4,
- ypos + 1, 2*fontWidth, fontHeight, "", kTextAlignLeft);
- myShowInfoLabel->setFlags(WIDGET_CLEARBG);
+ items.clear();
+ items.push_back("None", "0");
+ items.push_back("Basic", "1");
+ items.push_back("Verbose", "2");
+ myShowInfoPopup = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
+ items, "Show Info level: ", lwidth);
+ wid.push_back(myShowInfoPopup);
ypos += lineHeight + 4;
// Add items for tab 2
@@ -251,17 +280,6 @@ UIDialog::UIDialog(OSystem* osystem, DialogContainer* parent,
wid.push_back(b);
addOKCancelBGroup(wid, font);
addBGroupToFocusList(wid);
-
-#ifndef DEBUGGER_SUPPORT
- myDebuggerWidthSlider->clearFlags(WIDGET_ENABLED);
- myDebuggerWidthLabel->clearFlags(WIDGET_ENABLED);
- myDebuggerHeightSlider->clearFlags(WIDGET_ENABLED);
- myDebuggerHeightLabel->clearFlags(WIDGET_ENABLED);
-#endif
-
-#ifdef _WIN32_WCE
- myLauncherPopup->clearFlags(WIDGET_ENABLED);
-#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -294,6 +312,7 @@ void UIDialog::loadConfig()
const string& viewer = instance().settings().getString("romviewer");
myRomViewerPopup->setSelected(viewer, "0");
+#ifdef DEBUGGER_SUPPORT
// Debugger size
instance().settings().getSize("debuggerres", w, h);
w = BSPF_max(w, 1050);
@@ -305,27 +324,23 @@ void UIDialog::loadConfig()
myDebuggerWidthLabel->setValue(w);
myDebuggerHeightSlider->setValue(h);
myDebuggerHeightLabel->setValue(h);
+#endif
// UI palette
const string& pal = instance().settings().getString("uipalette");
myPalettePopup->setSelected(pal, "1");
// Listwidget quick delay
- int delay = instance().settings().getInt("listdelay");
- if(delay < 300 || delay > 1000) delay = 300;
- myListDelaySlider->setValue(delay);
- myListDelayLabel->setValue(delay);
+ const string& delay = instance().settings().getString("listdelay");
+ myListDelayPopup->setSelected(delay, "300");
// Mouse wheel lines
- int mw = instance().settings().getInt("mwheel");
- if(mw < 1 || mw > 10) mw = 1;
- myWheelLinesSlider->setValue(mw);
- myWheelLinesLabel->setValue(mw);
+ const string& mw = instance().settings().getString("mwheel");
+ myWheelLinesPopup->setSelected(mw, "1");
// Showinfo
- int si = instance().settings().getInt("showinfo");
- myShowInfoSlider->setValue(si);
- myShowInfoLabel->setValue(si);
+ const string& si = instance().settings().getString("showinfo");
+ myShowInfoPopup->setSelected(si, "1");
myTab->loadConfig();
}
@@ -354,17 +369,18 @@ void UIDialog::saveConfig()
myPalettePopup->getSelectedTag());
// Listwidget quick delay
- int delay = myListDelaySlider->getValue();
- instance().settings().setInt("listdelay", delay);
- ListWidget::setQuickSelectDelay(delay);
+ instance().settings().setString("listdelay",
+ myListDelayPopup->getSelectedTag());
+ ListWidget::setQuickSelectDelay(atoi(myListDelayPopup->getSelectedTag().c_str()));
// Mouse wheel lines
- int mw = myWheelLinesSlider->getValue();
- instance().settings().setInt("mwheel", mw);
- ScrollBarWidget::setWheelLines(mw);
+ instance().settings().setString("mwheel",
+ myWheelLinesPopup->getSelectedTag());
+ ScrollBarWidget::setWheelLines(atoi(myWheelLinesPopup->getSelectedTag().c_str()));
// Show info
- instance().settings().setInt("showinfo", myShowInfoSlider->getValue());
+ instance().settings().setString("showinfo",
+ myShowInfoPopup->getSelectedTag());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -394,12 +410,9 @@ void UIDialog::setDefaults()
case 2: // Misc. options
myPalettePopup->setSelected("1", "1");
- myListDelaySlider->setValue(300);
- myListDelayLabel->setValue(300);
- myWheelLinesSlider->setValue(4);
- myWheelLinesLabel->setValue(4);
- myShowInfoSlider->setValue(1);
- myShowInfoLabel->setValue(1);
+ myListDelayPopup->setSelected("300", "300");
+ myWheelLinesPopup->setSelected("4", "4");
+ myShowInfoPopup->setSelected("1", "1");
break;
default:
@@ -430,18 +443,6 @@ void UIDialog::handleCommand(CommandSender* sender, int cmd, int data, int id)
myDebuggerHeightLabel->setValue(myDebuggerHeightSlider->getValue());
break;
- case kLQDelayChanged:
- myListDelayLabel->setValue(myListDelaySlider->getValue());
- break;
-
- case kWLinesChanged:
- myWheelLinesLabel->setValue(myWheelLinesSlider->getValue());
- break;
-
- case kSInfoChanged:
- myShowInfoLabel->setValue(myShowInfoSlider->getValue());
- break;
-
case kOKCmd:
saveConfig();
close();
diff --git a/src/gui/UIDialog.hxx b/src/gui/UIDialog.hxx
index cb6ecf36a..44bac1edd 100644
--- a/src/gui/UIDialog.hxx
+++ b/src/gui/UIDialog.hxx
@@ -60,12 +60,9 @@ class UIDialog : public Dialog
// Misc options
PopUpWidget* myPalettePopup;
- SliderWidget* myListDelaySlider;
- StaticTextWidget* myListDelayLabel;
- SliderWidget* myWheelLinesSlider;
- StaticTextWidget* myWheelLinesLabel;
- SliderWidget* myShowInfoSlider;
- StaticTextWidget* myShowInfoLabel;
+ PopUpWidget* myListDelayPopup;
+ PopUpWidget* myWheelLinesPopup;
+ PopUpWidget* myShowInfoPopup;
private:
void loadConfig();
@@ -78,10 +75,7 @@ class UIDialog : public Dialog
kLWidthChanged = 'UIlw',
kLHeightChanged = 'UIlh',
kDWidthChanged = 'UIdw',
- kDHeightChanged = 'UIdh',
- kLQDelayChanged = 'UIqd',
- kWLinesChanged = 'UIsl',
- kSInfoChanged = 'UIsi'
+ kDHeightChanged = 'UIdh'
};
};
diff --git a/src/gui/VideoDialog.cxx b/src/gui/VideoDialog.cxx
index c8c4f1be2..9deb69119 100644
--- a/src/gui/VideoDialog.cxx
+++ b/src/gui/VideoDialog.cxx
@@ -74,8 +74,8 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
// Video renderer
new StaticTextWidget(myTab, font, xpos + (lwidth-fwidth), ypos, fwidth,
fontHeight, "Renderer:", kTextAlignLeft);
- myRenderer = new EditTextWidget(myTab, font, xpos+lwidth, ypos,
- pwidth, fontHeight, "");
+ myRenderer = new StaticTextWidget(myTab, font, xpos+lwidth, ypos,
+ fwidth, fontHeight, "", kTextAlignLeft);
ypos += lineHeight + 4;
items.clear();
@@ -163,10 +163,11 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
new SliderWidget(myTab, font, xpos, ypos, pwidth, lineHeight,
"Framerate: ", lwidth, kFrameRateChanged);
myFrameRateSlider->setMinValue(0); myFrameRateSlider->setMaxValue(300);
+ myFrameRateSlider->setStepValue(10);
wid.push_back(myFrameRateSlider);
myFrameRateLabel =
new StaticTextWidget(myTab, font, xpos + myFrameRateSlider->getWidth() + 4,
- ypos + 1, fontWidth * 3, fontHeight, "", kTextAlignLeft);
+ ypos + 1, fontWidth * 4, fontHeight, "", kTextAlignLeft);
myFrameRateLabel->setFlags(WIDGET_CLEARBG);
// Add message concerning usage
@@ -176,7 +177,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
"(*) Requires application restart", kTextAlignLeft);
// Move over to the next column
- xpos += myNAspectRatioSlider->getWidth() + myNAspectRatioLabel->getWidth() + 10;
+ xpos += myNAspectRatioSlider->getWidth() + myNAspectRatioLabel->getWidth() + 14;
ypos = 10;
// Fullscreen
@@ -357,7 +358,7 @@ void VideoDialog::loadConfig()
bool gl = (instance().frameBuffer().type() == kGLBuffer);
// Renderer settings
- myRenderer->setEditString(gl ? "OpenGL" : "Software");
+ myRenderer->setLabel(gl ? "OpenGL" : "Software");
myRendererPopup->setSelected(
instance().settings().getString("video"), "soft");
@@ -397,22 +398,23 @@ void VideoDialog::loadConfig()
myPAspectRatioLabel->setLabel(instance().settings().getString("gl_aspectp"));
myPAspectRatioLabel->setEnabled(gl);
- // Framerate (0 or -1 means disabled)
+ // Framerate (0 or -1 means automatic framerate calculation)
int rate = instance().settings().getInt("framerate");
myFrameRateSlider->setValue(rate < 0 ? 0 : rate);
- myFrameRateLabel->setLabel(rate < 0 ? "0" :
+ myFrameRateLabel->setLabel(rate <= 0 ? "Auto" :
instance().settings().getString("framerate"));
// Fullscreen
const string& fullscreen = instance().settings().getString("fullscreen");
myFullscreenPopup->setSelected(fullscreen, "0");
- handleFullscreenChange(fullscreen == "1");
+ handleFullscreenChange(fullscreen == "0" || fullscreen == "1");
// PAL color-loss effect
myColorLossCheckbox->setState(instance().settings().getBool("colorloss"));
- // GL stretch setting (item is enabled/disabled in ::handleFullscreenChange)
+ // GL stretch setting (GL mode only)
myGLStretchCheckbox->setState(instance().settings().getBool("gl_fsmax"));
+ myGLStretchCheckbox->setEnabled(gl);
// Use sync to vertical blank (GL mode only)
myUseVSyncCheckbox->setState(instance().settings().getBool("gl_vsync"));
@@ -559,7 +561,7 @@ void VideoDialog::setDefaults()
myPAspectRatioSlider->setValue(100);
myPAspectRatioLabel->setLabel("100");
myFrameRateSlider->setValue(0);
- myFrameRateLabel->setLabel("0");
+ myFrameRateLabel->setLabel("Auto");
myFullscreenPopup->setSelected("0", "");
myColorLossCheckbox->setState(false);
@@ -576,7 +578,7 @@ void VideoDialog::setDefaults()
myPhosphorCheckbox->setState(false);
// Make sure that mutually-exclusive items are not enabled at the same time
- handleFullscreenChange(false);
+ handleFullscreenChange(true);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -584,11 +586,6 @@ void VideoDialog::handleFullscreenChange(bool enable)
{
#ifdef WINDOWED_SUPPORT
myFSResPopup->setEnabled(enable);
-
- // GL stretch is only enabled in OpenGL mode
- myGLStretchCheckbox->setEnabled(
- enable && instance().frameBuffer().type() == kGLBuffer);
-
_dirty = true;
#endif
}
@@ -617,11 +614,14 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
break;
case kFrameRateChanged:
- myFrameRateLabel->setValue(myFrameRateSlider->getValue());
+ if(myFrameRateSlider->getValue() == 0)
+ myFrameRateLabel->setLabel("Auto");
+ else
+ myFrameRateLabel->setValue(myFrameRateSlider->getValue());
break;
case kFullScrChanged:
- handleFullscreenChange(myFullscreenPopup->getSelectedTag() == "1");
+ handleFullscreenChange(myFullscreenPopup->getSelectedTag() != "-1");
break;
default:
diff --git a/src/gui/VideoDialog.hxx b/src/gui/VideoDialog.hxx
index 00adf7f2f..d82b6a134 100644
--- a/src/gui/VideoDialog.hxx
+++ b/src/gui/VideoDialog.hxx
@@ -55,7 +55,7 @@ class VideoDialog : public Dialog
TabWidget* myTab;
// General options
- EditTextWidget* myRenderer;
+ StaticTextWidget* myRenderer;
PopUpWidget* myRendererPopup;
PopUpWidget* myTIAFilterPopup;
PopUpWidget* myTIAPalettePopup;
diff --git a/src/gui/Widget.cxx b/src/gui/Widget.cxx
index e96ec3f86..1ca9b7eb1 100644
--- a/src/gui/Widget.cxx
+++ b/src/gui/Widget.cxx
@@ -670,8 +670,9 @@ int SliderWidget::valueToPos(int value)
{
if(value < _valueMin) value = _valueMin;
else if(value > _valueMax) value = _valueMax;
-
- return ((_w - _labelWidth - 4) * (value - _valueMin) / (_valueMax - _valueMin));
+ int range = BSPF_max(_valueMax - _valueMin, 1); // don't divide by zero
+
+ return ((_w - _labelWidth - 4) * (value - _valueMin) / range);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/macosx/Create_build.sh b/src/macosx/Create_build.sh
index f61aea4ec..62a7f8911 100755
--- a/src/macosx/Create_build.sh
+++ b/src/macosx/Create_build.sh
@@ -14,22 +14,28 @@ fi
VER="$1"
DMG="Stella-${VER}-macosx.dmg"
DISK="/Volumes/Stella"
+DEST=~/Desktop/${DMG}
echo "Creating ${DMG} file ..."
-gunzip -c template.dmg.gz > ${DMG}
+gunzip -c template.dmg.gz > "${DMG}"
echo "Mounting ${DMG} file ..."
-hdiutil attach ${DMG}
+hdiutil attach "${DMG}"
echo "Copying documentation ..."
-ditto ../../Announce.txt ../../Changes.txt ../../Copyright.txt ../../License.txt ../../Readme.txt ../../Todo.txt ${DISK}
+ditto ../../Announce.txt ../../Changes.txt ../../Copyright.txt ../../License.txt ../../Readme.txt ../../Todo.txt "${DISK}"
echo "Copying application ..."
-cp -r build/Deployment/Stella.app ${DISK}
+cp -r build/Deployment/Stella.app "${DISK}"
echo "Ejecting ${DMG} ..."
-hdiutil eject ${DISK}
+hdiutil eject "${DISK}"
+
+if [ -f "${DEST}" ]; then
+ echo "Removing duplicate image found on desktop ..."
+ rm -f "${DEST}"
+fi
echo "Compressing image, moving to Desktop ..."
-hdiutil convert ${DMG} -format UDZO -imagekey zlib-level=9 -o ~/Desktop/${DMG}
-rm -f ${DMG}
+hdiutil convert "${DMG}" -format UDZO -imagekey zlib-level=9 -o "${DEST}"
+rm -f "${DMG}"