mirror of https://github.com/stella-emu/stella.git
Merge branch 'master' into sqlite
This commit is contained in:
commit
4d0da9b8e7
6
Makefile
6
Makefile
|
@ -89,7 +89,11 @@ endif
|
|||
# Misc stuff - you should never have to edit this #
|
||||
#######################################################################
|
||||
|
||||
OBJECT_ROOT := out
|
||||
ifdef STELLA_BUILD_ROOT
|
||||
OBJECT_ROOT := $(STELLA_BUILD_ROOT)/stella-out
|
||||
else
|
||||
OBJECT_ROOT := out
|
||||
endif
|
||||
OBJECT_ROOT_PROFILE_GENERERATE := out.pgen
|
||||
OBJECT_ROOT_PROFILE_USE := out.pgo
|
||||
|
||||
|
|
|
@ -95,6 +95,11 @@ FilesystemNodeZIP::FilesystemNodeZIP(const string& p)
|
|||
else
|
||||
_isDirectory = true;
|
||||
|
||||
// Create a concrete FSNode to use
|
||||
// This *must not* be a ZIP file; it must be a real FSNode object that
|
||||
// has direct access to the actual filesystem (aka, a 'System' node)
|
||||
// Behind the scenes, this node is actually a platform-specific object
|
||||
// for whatever system we are running on
|
||||
_realNode = FilesystemNodeFactory::create(_zipFile, FilesystemNodeFactory::Type::SYSTEM);
|
||||
|
||||
setFlags(_zipFile, _virtualPath, _realNode);
|
||||
|
|
|
@ -93,7 +93,10 @@ class FilesystemNodeZIP : public AbstractFSNode
|
|||
NO_ROMS
|
||||
};
|
||||
|
||||
// Since a ZIP file is itself an abstraction, it still needs access to
|
||||
// an actual concrete filesystem node
|
||||
AbstractFSNodePtr _realNode;
|
||||
|
||||
string _zipFile, _virtualPath;
|
||||
string _name, _path, _shortPath;
|
||||
zip_error _error;
|
||||
|
|
|
@ -163,11 +163,11 @@ void PhysicalKeyboardHandler::setDefaultMapping(Event::Type event, EventMode mod
|
|||
// use the '1' define for testing
|
||||
#if defined(RETRON77)
|
||||
// #if 1
|
||||
setDefaultKey( KBDK_F4, Event::ConsoleColorToggle );
|
||||
setDefaultKey( KBDK_F6, Event::ConsoleLeftDiffToggle );
|
||||
setDefaultKey( KBDK_F8, Event::ConsoleRightDiffToggle );
|
||||
setDefaultKey( KBDK_F13, Event::VidmodeIncrease );
|
||||
setDefaultKey( KBDK_BACKSPACE, Event::LauncherMode );
|
||||
setDefaultKey( KBDK_F4, Event::ConsoleColorToggle ); // back ("COLOR","B/W")
|
||||
setDefaultKey( KBDK_F6, Event::ConsoleLeftDiffToggle ); // front ("SKILL P1")
|
||||
setDefaultKey( KBDK_F8, Event::ConsoleRightDiffToggle ); // front ("SKILL P2")
|
||||
setDefaultKey( KBDK_F13, Event::CmdMenuMode ); // back ("4:3","16:9")
|
||||
setDefaultKey( KBDK_BACKSPACE, Event::LauncherMode ); // back ("FRY")
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -189,13 +189,14 @@ void PhysicalKeyboardHandler::setDefaultMapping(Event::Type event, EventMode mod
|
|||
// use the '1' define for testing
|
||||
#if defined(RETRON77)
|
||||
// #if 1
|
||||
setDefaultKey( KBDK_F9, Event::UIUp );
|
||||
setDefaultKey( KBDK_F2, Event::UIDown );
|
||||
setDefaultKey( KBDK_F11, Event::UINavPrev );
|
||||
setDefaultKey( KBDK_F1, Event::UINavNext );
|
||||
setDefaultKey( KBDK_F6, Event::UISelect );
|
||||
setDefaultKey( KBDK_F13, Event::UIPgUp );
|
||||
setDefaultKey( KBDK_BACKSPACE, Event::UIPgDown );
|
||||
setDefaultKey( KBDK_F9, Event::UIUp ); // front ("SAVE")
|
||||
setDefaultKey( KBDK_F2, Event::UIDown ); // front ("RESET")
|
||||
setDefaultKey( KBDK_F11, Event::UINavPrev ); // front ("LOAD")
|
||||
setDefaultKey( KBDK_F1, Event::UINavNext ); // front ("MODE")
|
||||
setDefaultKey( KBDK_F6, Event::UISelect ); // front ("SKILL P1")
|
||||
setDefaultKey( KBDK_F8, Event::UICancel ); // front ("SKILL P2")
|
||||
setDefaultKey( KBDK_F13, Event::UIPgUp ); // back ("4:3","16:9")(redundant)
|
||||
setDefaultKey( KBDK_BACKSPACE, Event::UIPgDown ); // back (FRY)(redundant)
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
|
|
@ -72,13 +72,13 @@ DataGridOpsWidget::DataGridOpsWidget(GuiObject* boss, const GUI::Font& font,
|
|||
|
||||
// We don't enable the buttons until the DataGridWidget is attached
|
||||
// Don't call setEnabled(false), since that does an immediate redraw
|
||||
_zeroButton->clearFlags(WIDGET_ENABLED);
|
||||
_invButton->clearFlags(WIDGET_ENABLED);
|
||||
_negButton->clearFlags(WIDGET_ENABLED);
|
||||
_incButton->clearFlags(WIDGET_ENABLED);
|
||||
_decButton->clearFlags(WIDGET_ENABLED);
|
||||
_shiftLeftButton->clearFlags(WIDGET_ENABLED);
|
||||
_shiftRightButton->clearFlags(WIDGET_ENABLED);
|
||||
_zeroButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_invButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_negButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_incButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_decButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_shiftLeftButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
_shiftRightButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -50,7 +50,7 @@ DataGridWidget::DataGridWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_opsWidget(nullptr),
|
||||
_scrollBar(nullptr)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_RETAIN_FOCUS | WIDGET_WANTS_RAWDATA;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_WANTS_RAWDATA;
|
||||
_editMode = false;
|
||||
|
||||
// The item is selected, thus _bgcolor is used to draw the caret and
|
||||
|
@ -252,14 +252,14 @@ void DataGridWidget::setRange(int lower, int upper)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DataGridWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DataGridWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ DebuggerDialog::DebuggerDialog(OSystem& osystem, DialogContainer& parent,
|
|||
myTiaOutput->setZoomWidget(myTiaZoom);
|
||||
|
||||
myOptions = make_unique<OptionsDialog>(osystem, parent, this, w, h,
|
||||
OptionsDialog::AppMode::debugger);
|
||||
Menu::AppMode::debugger);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -504,7 +504,7 @@ void DebuggerDialog::addStatusArea()
|
|||
xpos, ypos, myTiaZoom->getWidth(),
|
||||
myLFont->getLineHeight(), "");
|
||||
myMessageBox->setEditable(false, false);
|
||||
myMessageBox->clearFlags(WIDGET_RETAIN_FOCUS);
|
||||
myMessageBox->clearFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
myMessageBox->setTextColor(kTextColorEm);
|
||||
}
|
||||
|
||||
|
@ -577,7 +577,7 @@ void DebuggerDialog::addRomArea()
|
|||
myRewindButton =
|
||||
new ButtonWidget(this, *myLFont, buttonX, buttonY,
|
||||
bwidth, bheight, LEFT_ARROW, 7, 11, kDDRewindCmd);
|
||||
myRewindButton->clearFlags(WIDGET_ENABLED);
|
||||
myRewindButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
buttonY += bheight + 4;
|
||||
bheight = (myLFont->getLineHeight() + 2) * 2 + 4 * 1;
|
||||
|
@ -585,7 +585,7 @@ void DebuggerDialog::addRomArea()
|
|||
myUnwindButton =
|
||||
new ButtonWidget(this, *myLFont, buttonX, buttonY,
|
||||
bwidth, bheight, RIGHT_ARROW, 7, 11, kDDUnwindCmd);
|
||||
myUnwindButton->clearFlags(WIDGET_ENABLED);
|
||||
myUnwindButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
int xpos = buttonX - 8*myLFont->getMaxCharWidth() - 20, ypos = 30;
|
||||
|
||||
|
|
|
@ -41,8 +41,8 @@ PromptWidget::PromptWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_firstTime(true),
|
||||
_exitedEarly(false)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS |
|
||||
WIDGET_WANTS_TAB | WIDGET_WANTS_RAWDATA;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS |
|
||||
Widget::FLAG_WANTS_TAB | Widget::FLAG_WANTS_RAWDATA;
|
||||
_textcolor = kTextColor;
|
||||
_bgcolor = kWidColor;
|
||||
_bgcolorlo = kDlgColor;
|
||||
|
|
|
@ -158,8 +158,8 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& lfont, const GUI::Font& n
|
|||
myInputBox->setTarget(this);
|
||||
|
||||
// Start with these buttons disabled
|
||||
myCompareButton->clearFlags(WIDGET_ENABLED);
|
||||
myRestartButton->clearFlags(WIDGET_ENABLED);
|
||||
myCompareButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
myRestartButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
// Calculate final height
|
||||
if(_h == 0) _h = ypos + myLineHeight - y;
|
||||
|
|
|
@ -43,7 +43,7 @@ RomListWidget::RomListWidget(GuiObject* boss, const GUI::Font& lfont,
|
|||
myDisasm(nullptr),
|
||||
myBPState(nullptr)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS;
|
||||
_bgcolor = kWidColor;
|
||||
_bgcolorhi = kWidColor;
|
||||
_textcolor = kTextColor;
|
||||
|
@ -130,12 +130,12 @@ void RomListWidget::setList(const CartDebug::Disassembly& disasm,
|
|||
|
||||
// Enable all checkboxes
|
||||
for(int i = 0; i < _rows; ++i)
|
||||
myCheckList[i]->setFlags(WIDGET_ENABLED);
|
||||
myCheckList[i]->setFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
// Then turn off any extras
|
||||
if(int(myDisasm->list.size()) < _rows)
|
||||
for(int i = int(myDisasm->list.size()); i < _rows; ++i)
|
||||
myCheckList[i]->clearFlags(WIDGET_ENABLED);
|
||||
myCheckList[i]->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
recalc();
|
||||
}
|
||||
|
@ -290,14 +290,14 @@ void RomListWidget::handleMouseWheel(int x, int y, int direction)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void RomListWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void RomListWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -32,8 +32,8 @@ TiaZoomWidget::TiaZoomWidget(GuiObject* boss, const GUI::Font& font,
|
|||
: Widget(boss, font, x, y, 16, 16),
|
||||
CommandSender(boss)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG |
|
||||
WIDGET_RETAIN_FOCUS | WIDGET_TRACK_MOUSE;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG |
|
||||
Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_TRACK_MOUSE;
|
||||
_bgcolor = _bgcolorhi = kDlgColor;
|
||||
|
||||
// Use all available space, up to the maximum bounds of the TIA image
|
||||
|
@ -167,14 +167,14 @@ void TiaZoomWidget::handleMouseMoved(int x, int y)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void TiaZoomWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void TiaZoomWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
myMouseMoving = false;
|
||||
}
|
||||
|
|
|
@ -36,21 +36,21 @@ ToggleWidget::ToggleWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_clicksToChange(clicksToChange),
|
||||
_editable(true)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS |
|
||||
WIDGET_WANTS_RAWDATA;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS |
|
||||
Widget::FLAG_WANTS_RAWDATA;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void ToggleWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void ToggleWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -137,7 +137,7 @@ Bankswitch::Description Bankswitch::BSList[int(Bankswitch::Type::NumSchemes)] =
|
|||
{ "UA", "UA (8K UA Ltd.)" },
|
||||
{ "WD", "WD (Experimental)" },
|
||||
{ "X07", "X07 (64K AtariAge)" },
|
||||
#ifdef CUSTOM_ARM
|
||||
#if defined(CUSTOM_ARM)
|
||||
{ "CUSTOM", "CUSTOM (ARM)" }
|
||||
#endif
|
||||
};
|
||||
|
@ -149,11 +149,12 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
|
|||
{ "a26", Bankswitch::Type::_AUTO },
|
||||
{ "bin", Bankswitch::Type::_AUTO },
|
||||
{ "rom", Bankswitch::Type::_AUTO },
|
||||
{ "gz", Bankswitch::Type::_AUTO },
|
||||
#if defined(ZIP_SUPPORT)
|
||||
{ "zip", Bankswitch::Type::_AUTO },
|
||||
#endif
|
||||
{ "cu", Bankswitch::Type::_AUTO },
|
||||
|
||||
// All bankswitch types (tose that UnoCart and HarmonyCart support have the same name)
|
||||
// All bankswitch types (those that UnoCart and HarmonyCart support have the same name)
|
||||
{ "084", Bankswitch::Type::_0840 },
|
||||
{ "2N1", Bankswitch::Type::_2IN1 },
|
||||
{ "4N1", Bankswitch::Type::_4IN1 },
|
||||
|
|
|
@ -123,6 +123,13 @@ class M6532 : public Device
|
|||
*/
|
||||
void updateEmulation();
|
||||
|
||||
/**
|
||||
Get a pointer to the RAM contents.
|
||||
|
||||
@return Pointer to RAM array.
|
||||
*/
|
||||
const uInt8* getRAM() const { return myRAM; }
|
||||
|
||||
private:
|
||||
|
||||
void setTimerRegister(uInt8 data, uInt8 interval);
|
||||
|
|
|
@ -121,6 +121,7 @@ Settings::Settings()
|
|||
setPermanent("uipalette", "standard");
|
||||
setPermanent("listdelay", "300");
|
||||
setPermanent("mwheel", "4");
|
||||
setPermanent("basic_settings", false);
|
||||
|
||||
// Misc options
|
||||
setPermanent("autoslot", "false");
|
||||
|
|
|
@ -47,7 +47,7 @@ AboutDialog::AboutDialog(OSystem& osystem, DialogContainer& parent,
|
|||
myPrevButton =
|
||||
new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
|
||||
"Previous", GuiObject::kPrevCmd);
|
||||
myPrevButton->clearFlags(WIDGET_ENABLED);
|
||||
myPrevButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
wid.push_back(myPrevButton);
|
||||
|
||||
xpos += buttonWidth + 8;
|
||||
|
@ -237,9 +237,9 @@ void AboutDialog::handleCommand(CommandSender* sender, int cmd, int data, int id
|
|||
case GuiObject::kNextCmd:
|
||||
myPage++;
|
||||
if(myPage >= myNumPages)
|
||||
myNextButton->clearFlags(WIDGET_ENABLED);
|
||||
myNextButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
if(myPage >= 2)
|
||||
myPrevButton->setFlags(WIDGET_ENABLED);
|
||||
myPrevButton->setFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
displayInfo();
|
||||
break;
|
||||
|
@ -247,9 +247,9 @@ void AboutDialog::handleCommand(CommandSender* sender, int cmd, int data, int id
|
|||
case GuiObject::kPrevCmd:
|
||||
myPage--;
|
||||
if(myPage <= myNumPages)
|
||||
myNextButton->setFlags(WIDGET_ENABLED);
|
||||
myNextButton->setFlags(Widget::FLAG_ENABLED);
|
||||
if(myPage <= 1)
|
||||
myPrevButton->clearFlags(WIDGET_ENABLED);
|
||||
myPrevButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
displayInfo();
|
||||
break;
|
||||
|
|
|
@ -117,23 +117,23 @@ void BrowserDialog::show(const string& startpath,
|
|||
_fileList->setFileListMode(FilesystemNode::ListMode::All);
|
||||
_fileList->setFileExtension(ext);
|
||||
_selected->setEditable(false);
|
||||
_selected->clearFlags(WIDGET_INVISIBLE);
|
||||
_type->clearFlags(WIDGET_INVISIBLE);
|
||||
_selected->clearFlags(Widget::FLAG_INVISIBLE);
|
||||
_type->clearFlags(Widget::FLAG_INVISIBLE);
|
||||
break;
|
||||
|
||||
case FileSave:
|
||||
_fileList->setFileListMode(FilesystemNode::ListMode::All);
|
||||
_fileList->setFileExtension(ext);
|
||||
_selected->setEditable(false); // FIXME - disable user input for now
|
||||
_selected->clearFlags(WIDGET_INVISIBLE);
|
||||
_type->clearFlags(WIDGET_INVISIBLE);
|
||||
_selected->clearFlags(Widget::FLAG_INVISIBLE);
|
||||
_type->clearFlags(Widget::FLAG_INVISIBLE);
|
||||
break;
|
||||
|
||||
case Directories:
|
||||
_fileList->setFileListMode(FilesystemNode::ListMode::DirectoriesOnly);
|
||||
_selected->setEditable(false);
|
||||
_selected->setFlags(WIDGET_INVISIBLE);
|
||||
_type->setFlags(WIDGET_INVISIBLE);
|
||||
_selected->setFlags(Widget::FLAG_INVISIBLE);
|
||||
_type->setFlags(Widget::FLAG_INVISIBLE);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,14 +49,14 @@ CheckListWidget::CheckListWidget(GuiObject* boss, const GUI::Font& font,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CheckListWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CheckListWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
@ -70,12 +70,12 @@ void CheckListWidget::setList(const StringList& list, const BoolArray& state)
|
|||
|
||||
// Enable all checkboxes
|
||||
for(int i = 0; i < _rows; ++i)
|
||||
_checkList[i]->setFlags(WIDGET_ENABLED);
|
||||
_checkList[i]->setFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
// Then turn off any extras
|
||||
if(int(_stateList.size()) < _rows)
|
||||
for(int i = int(_stateList.size()); i < _rows; ++i)
|
||||
_checkList[i]->clearFlags(WIDGET_ENABLED);
|
||||
_checkList[i]->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
ListWidget::recalc();
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ ColorWidget::ColorWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_cmd(cmd),
|
||||
_crossGrid(false)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -17,11 +17,15 @@
|
|||
|
||||
#include "Dialog.hxx"
|
||||
#include "CommandDialog.hxx"
|
||||
#include "MinUICommandDialog.hxx"
|
||||
#include "CommandMenu.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
CommandMenu::CommandMenu(OSystem& osystem)
|
||||
: DialogContainer(osystem)
|
||||
{
|
||||
myBaseDialog = new CommandDialog(myOSystem, *this);
|
||||
if (osystem.settings().getBool("minimal_ui"))
|
||||
myBaseDialog = new MinUICommandDialog(myOSystem, *this);
|
||||
else
|
||||
myBaseDialog = new CommandDialog(myOSystem, *this);
|
||||
}
|
||||
|
|
|
@ -559,8 +559,8 @@ void DeveloperDialog::addDebuggerTab(const GUI::Font& font)
|
|||
#endif
|
||||
if(!debuggerAvailable)
|
||||
{
|
||||
myDebuggerWidthSlider->clearFlags(WIDGET_ENABLED);
|
||||
myDebuggerHeightSlider->clearFlags(WIDGET_ENABLED);
|
||||
myDebuggerWidthSlider->clearFlags(Widget::FLAG_ENABLED);
|
||||
myDebuggerHeightSlider->clearFlags(Widget::FLAG_ENABLED);
|
||||
}
|
||||
#else
|
||||
new StaticTextWidget(myTab, font, 0, 20, _w - 20, font.getFontHeight(),
|
||||
|
@ -1331,8 +1331,8 @@ void DeveloperDialog::handleDebugColours(int idx, int color)
|
|||
|
||||
if(!instance().hasConsole())
|
||||
{
|
||||
myDbgColour[idx]->clearFlags(WIDGET_ENABLED);
|
||||
myDbgColourSwatch[idx]->clearFlags(WIDGET_ENABLED);
|
||||
myDbgColour[idx]->clearFlags(Widget::FLAG_ENABLED);
|
||||
myDbgColourSwatch[idx]->clearFlags(Widget::FLAG_ENABLED);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ Dialog::Dialog(OSystem& instance, DialogContainer& parent, const GUI::Font& font
|
|||
_th(0),
|
||||
_surface(nullptr),
|
||||
_tabID(0),
|
||||
_flags(WIDGET_ENABLED | WIDGET_BORDER | WIDGET_CLEARBG),
|
||||
_flags(Widget::FLAG_ENABLED | Widget::FLAG_BORDER | Widget::FLAG_CLEARBG),
|
||||
_max_w(0),
|
||||
_max_h(0)
|
||||
{
|
||||
|
@ -198,7 +198,7 @@ void Dialog::addFocusWidget(Widget* w)
|
|||
return;
|
||||
|
||||
// All focusable widgets should retain focus
|
||||
w->setFlags(WIDGET_RETAIN_FOCUS);
|
||||
w->setFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
|
||||
_myFocus.widget = w;
|
||||
_myFocus.list.push_back(w);
|
||||
|
@ -209,7 +209,7 @@ void Dialog::addToFocusList(WidgetArray& list)
|
|||
{
|
||||
// All focusable widgets should retain focus
|
||||
for(const auto& w: list)
|
||||
w->setFlags(WIDGET_RETAIN_FOCUS);
|
||||
w->setFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
|
||||
Vec::append(_myFocus.list, list);
|
||||
_focusList = _myFocus.list;
|
||||
|
@ -222,14 +222,14 @@ void Dialog::addToFocusList(WidgetArray& list)
|
|||
void Dialog::addToFocusList(WidgetArray& list, TabWidget* w, int tabId)
|
||||
{
|
||||
// Only add the list if the tab actually exists
|
||||
if(!w || w->getID() < 0 || uInt32(w->getID()) >= _myTabList.size())
|
||||
if(!w || w->getID() >= _myTabList.size())
|
||||
return;
|
||||
|
||||
assert(w == _myTabList[w->getID()].widget);
|
||||
|
||||
// All focusable widgets should retain focus
|
||||
for(const auto& fw: list)
|
||||
fw->setFlags(WIDGET_RETAIN_FOCUS);
|
||||
fw->setFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
|
||||
// First get the appropriate focus list
|
||||
FocusList& focus = _myTabList[w->getID()].focus;
|
||||
|
@ -254,7 +254,7 @@ void Dialog::addToFocusList(WidgetArray& list, TabWidget* w, int tabId)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void Dialog::addTabWidget(TabWidget* w)
|
||||
{
|
||||
if(!w || w->getID() < 0)
|
||||
if(!w)
|
||||
return;
|
||||
|
||||
// Make sure the array is large enough
|
||||
|
@ -341,7 +341,7 @@ void Dialog::drawDialog()
|
|||
|| (parent().myDialogStack.get(parent().myDialogStack.size() - 2) == this
|
||||
&& !parent().myDialogStack.top()->hasTitle());
|
||||
|
||||
if(_flags & WIDGET_CLEARBG)
|
||||
if(_flags & Widget::FLAG_CLEARBG)
|
||||
{
|
||||
// cerr << "Dialog::drawDialog(): w = " << _w << ", h = " << _h << " @ " << &s << endl << endl;
|
||||
s.fillRect(_x, _y + _th, _w, _h - _th, _onTop ? kDlgColor : kBGColorLo);
|
||||
|
@ -354,7 +354,7 @@ void Dialog::drawDialog()
|
|||
}
|
||||
else
|
||||
s.invalidate();
|
||||
if(_flags & WIDGET_BORDER) // currently only used by Dialog itself
|
||||
if(_flags & Widget::FLAG_BORDER) // currently only used by Dialog itself
|
||||
s.frameRect(_x, _y, _w, _h, _onTop ? kColor : kShadowColor);
|
||||
|
||||
// Make all child widget dirty
|
||||
|
@ -459,7 +459,7 @@ void Dialog::handleMouseUp(int x, int y, MouseButton b, int clickCount)
|
|||
if(_focusedWidget)
|
||||
{
|
||||
// Lose focus on mouseup unless the widget requested to retain the focus
|
||||
if(! (_focusedWidget->getFlags() & WIDGET_RETAIN_FOCUS ))
|
||||
if(! (_focusedWidget->getFlags() & Widget::FLAG_RETAIN_FOCUS ))
|
||||
releaseFocus();
|
||||
}
|
||||
|
||||
|
@ -531,7 +531,7 @@ void Dialog::handleMouseMoved(int x, int y)
|
|||
_mouseWidget = w;
|
||||
}
|
||||
|
||||
if (w && (w->getFlags() & WIDGET_TRACK_MOUSE))
|
||||
if (w && (w->getFlags() & Widget::FLAG_TRACK_MOUSE))
|
||||
w->handleMouseMoved(x - (w->getAbsX() - _x), y - (w->getAbsY() - _y));
|
||||
}
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ void DialogContainer::reStack()
|
|||
while(!myDialogStack.empty())
|
||||
myDialogStack.top()->close();
|
||||
|
||||
myBaseDialog->open();
|
||||
getBaseDialog()->open();
|
||||
|
||||
// Reset all continuous events
|
||||
reset();
|
||||
|
|
|
@ -141,6 +141,11 @@ class DialogContainer
|
|||
*/
|
||||
const Dialog* baseDialog() const { return myBaseDialog; }
|
||||
|
||||
/**
|
||||
Return the bottom-most dialog of this container. Can be overwritten.
|
||||
*/
|
||||
virtual Dialog* getBaseDialog() { return myBaseDialog; }
|
||||
|
||||
/**
|
||||
Inform the container that it should resize according to the current
|
||||
screen dimensions. We make this virtual, since the container may or
|
||||
|
|
|
@ -27,7 +27,7 @@ EditTextWidget::EditTextWidget(GuiObject* boss, const GUI::Font& font,
|
|||
: EditableWidget(boss, font, x, y, w, h + 2, text),
|
||||
_changed(false)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS;
|
||||
|
||||
startEditMode(); // We're always in edit mode
|
||||
}
|
||||
|
@ -43,14 +43,14 @@ void EditTextWidget::setText(const string& str, bool changed)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void EditTextWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void EditTextWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -70,12 +70,12 @@ void EditableWidget::setEditable(bool editable, bool hiliteBG)
|
|||
_editable = editable;
|
||||
if(_editable)
|
||||
{
|
||||
setFlags(WIDGET_WANTS_RAWDATA | WIDGET_RETAIN_FOCUS);
|
||||
setFlags(Widget::FLAG_WANTS_RAWDATA | Widget::FLAG_RETAIN_FOCUS);
|
||||
_bgcolor = kWidColor;
|
||||
}
|
||||
else
|
||||
{
|
||||
clearFlags(WIDGET_WANTS_RAWDATA | WIDGET_RETAIN_FOCUS);
|
||||
clearFlags(Widget::FLAG_WANTS_RAWDATA | Widget::FLAG_RETAIN_FOCUS);
|
||||
_bgcolor = hiliteBG ? kBGColorHi : kWidColor;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -64,9 +64,9 @@ class EditableWidget : public Widget, public CommandSender
|
|||
void setTextFilter(const TextFilter& filter) { _filter = filter; }
|
||||
|
||||
protected:
|
||||
virtual void startEditMode() { setFlags(WIDGET_WANTS_RAWDATA); }
|
||||
virtual void endEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); }
|
||||
virtual void abortEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); }
|
||||
virtual void startEditMode() { setFlags(Widget::FLAG_WANTS_RAWDATA); }
|
||||
virtual void endEditMode() { clearFlags(Widget::FLAG_WANTS_RAWDATA); }
|
||||
virtual void abortEditMode() { clearFlags(Widget::FLAG_WANTS_RAWDATA); }
|
||||
|
||||
virtual GUI::Rect getEditRect() const = 0;
|
||||
virtual int getCaretOffset() const;
|
||||
|
|
|
@ -78,7 +78,7 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font,
|
|||
buttonWidth, buttonHeight,
|
||||
"Cancel", kStopMapCmd);
|
||||
myCancelMapButton->setTarget(this);
|
||||
myCancelMapButton->clearFlags(WIDGET_ENABLED);
|
||||
myCancelMapButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
addFocusWidget(myCancelMapButton);
|
||||
|
||||
ypos += lineHeight + 20;
|
||||
|
@ -119,7 +119,7 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font,
|
|||
myKeyMapping = new EditTextWidget(boss, font, xpos + t->getWidth() + 8, ypos,
|
||||
_w - xpos - t->getWidth() - 8 - HBORDER, lineHeight, "");
|
||||
myKeyMapping->setEditable(false, true);
|
||||
myKeyMapping->clearFlags(WIDGET_RETAIN_FOCUS);
|
||||
myKeyMapping->clearFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
|
||||
// Add information for hardcoded keys
|
||||
ypos += lineHeight + 8;
|
||||
|
@ -178,7 +178,7 @@ void EventMappingWidget::startRemapping()
|
|||
|
||||
// Make sure that this widget receives all raw data, before any
|
||||
// pre-processing occurs
|
||||
myActionsList->setFlags(WIDGET_WANTS_RAWDATA);
|
||||
myActionsList->setFlags(Widget::FLAG_WANTS_RAWDATA);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -223,7 +223,7 @@ void EventMappingWidget::stopRemapping()
|
|||
drawKeyMapping();
|
||||
|
||||
// Widget is now free to process events normally
|
||||
myActionsList->clearFlags(WIDGET_WANTS_RAWDATA);
|
||||
myActionsList->clearFlags(Widget::FLAG_WANTS_RAWDATA);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -45,7 +45,7 @@ HelpDialog::HelpDialog(OSystem& osystem, DialogContainer& parent,
|
|||
myPrevButton =
|
||||
new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
|
||||
"Previous", GuiObject::kPrevCmd);
|
||||
myPrevButton->clearFlags(WIDGET_ENABLED);
|
||||
myPrevButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
wid.push_back(myPrevButton);
|
||||
|
||||
xpos += buttonWidth + 8;
|
||||
|
@ -195,9 +195,9 @@ void HelpDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
case GuiObject::kNextCmd:
|
||||
++myPage;
|
||||
if(myPage >= myNumPages)
|
||||
myNextButton->clearFlags(WIDGET_ENABLED);
|
||||
myNextButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
if(myPage >= 2)
|
||||
myPrevButton->setFlags(WIDGET_ENABLED);
|
||||
myPrevButton->setFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
displayInfo();
|
||||
break;
|
||||
|
@ -205,9 +205,9 @@ void HelpDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
case GuiObject::kPrevCmd:
|
||||
--myPage;
|
||||
if(myPage <= myNumPages)
|
||||
myNextButton->setFlags(WIDGET_ENABLED);
|
||||
myNextButton->setFlags(Widget::FLAG_ENABLED);
|
||||
if(myPage <= 1)
|
||||
myPrevButton->clearFlags(WIDGET_ENABLED);
|
||||
myPrevButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
displayInfo();
|
||||
break;
|
||||
|
|
|
@ -136,7 +136,7 @@ void InputDialog::addDevicePortTab(const GUI::Font& font)
|
|||
"Mouse cursor visibility ", lwidth);
|
||||
wid.push_back(myCursorState);
|
||||
#ifndef WINDOWED_SUPPORT
|
||||
myCursorState->clearFlags(WIDGET_ENABLED);
|
||||
myCursorState->clearFlags(Widget::FLAG_ENABLED);
|
||||
#endif
|
||||
|
||||
lwidth = font.getStringWidth("Digital paddle sensitivity ");
|
||||
|
@ -196,7 +196,7 @@ void InputDialog::addDevicePortTab(const GUI::Font& font)
|
|||
"Grab mouse in emulation mode");
|
||||
wid.push_back(myGrabMouse);
|
||||
#ifndef WINDOWED_SUPPORT
|
||||
myGrabMouse->clearFlags(WIDGET_ENABLED);
|
||||
myGrabMouse->clearFlags(Widget::FLAG_ENABLED);
|
||||
#endif
|
||||
|
||||
// Enable/disable control key-combos
|
||||
|
|
|
@ -61,7 +61,7 @@ JoystickDialog::JoystickDialog(GuiObject* boss, const GUI::Font& font,
|
|||
xpos -= buttonWidth + 8;
|
||||
myRemoveBtn = new ButtonWidget(this, font, xpos, ypos,
|
||||
buttonWidth, buttonHeight, "Remove", kRemoveCmd);
|
||||
myRemoveBtn->clearFlags(WIDGET_ENABLED);
|
||||
myRemoveBtn->clearFlags(Widget::FLAG_ENABLED);
|
||||
|
||||
// Now we can finally add the widgets to the focus list
|
||||
wid.push_back(myRemoveBtn);
|
||||
|
|
|
@ -164,7 +164,7 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
xpos += lwidth;
|
||||
myDir = new EditTextWidget(this, font, xpos, ypos, _w - xpos - HBORDER, lineHeight, "");
|
||||
myDir->setEditable(false, true);
|
||||
myDir->clearFlags(WIDGET_RETAIN_FOCUS);
|
||||
myDir->clearFlags(Widget::FLAG_RETAIN_FOCUS);
|
||||
|
||||
if(!myUseMinimalUI)
|
||||
{
|
||||
|
@ -206,10 +206,6 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
}
|
||||
mySelectedItem = 0; // Highlight 'Rom Listing'
|
||||
|
||||
// Create an options dialog, similar to the in-game one
|
||||
myOptions = make_unique<OptionsDialog>(osystem, parent, this, w, h,
|
||||
OptionsDialog::AppMode::launcher);
|
||||
|
||||
// Create a game list, which contains all the information about a ROM that
|
||||
// the launcher needs
|
||||
myGameList = make_unique<GameList>();
|
||||
|
@ -226,9 +222,6 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
// ROM properties
|
||||
myGlobalProps = make_unique<GlobalPropsDialog>(this,
|
||||
myUseMinimalUI ? osystem.frameBuffer().launcherFont() : osystem.frameBuffer().font());
|
||||
if (myUseMinimalUI)
|
||||
myStellaSettingsDialog =
|
||||
make_unique<StellaSettingsDialog>(osystem, parent, osystem.frameBuffer().launcherFont(), w, h);
|
||||
|
||||
// Do we show only ROMs or all files?
|
||||
bool onlyROMs = instance().settings().getBool("launcherroms");
|
||||
|
@ -467,20 +460,20 @@ void LauncherDialog::handleKeyDown(StellaKey key, StellaMod mod)
|
|||
// handle keys used by R77
|
||||
switch(key)
|
||||
{
|
||||
case KBDK_F8:
|
||||
myStellaSettingsDialog->open();
|
||||
case KBDK_F8: // front ("Skill P2")
|
||||
openSettings();
|
||||
break;
|
||||
|
||||
case KBDK_F4:
|
||||
case KBDK_F4: // back ("COLOR", "B/W")
|
||||
myGlobalProps->open();
|
||||
break;
|
||||
|
||||
case KBDK_F11:
|
||||
case KBDK_F11: // front ("LOAD")
|
||||
// convert unused previous item key into page-up key
|
||||
Dialog::handleKeyDown(KBDK_F13, mod);
|
||||
break;
|
||||
|
||||
case KBDK_F1:
|
||||
case KBDK_F1: // front ("MODE")
|
||||
// convert unused next item key into page-down key
|
||||
Dialog::handleKeyDown(KBDK_BACKSPACE, mod);
|
||||
break;
|
||||
|
@ -553,7 +546,7 @@ void LauncherDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
}
|
||||
|
||||
case kOptionsCmd:
|
||||
myOptions->open();
|
||||
openSettings();
|
||||
break;
|
||||
|
||||
case kPrevDirCmd:
|
||||
|
@ -640,3 +633,22 @@ void LauncherDialog::startGame()
|
|||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void LauncherDialog::openSettings()
|
||||
{
|
||||
// Create an options dialog, similar to the in-game one
|
||||
if (instance().settings().getBool("basic_settings"))
|
||||
{
|
||||
if (myStellaSettingsDialog == nullptr)
|
||||
myStellaSettingsDialog = make_unique<StellaSettingsDialog>(instance(), parent(),
|
||||
instance().frameBuffer().launcherFont(), _w, _h, Menu::AppMode::launcher);
|
||||
myStellaSettingsDialog->open();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (myOptionsDialog == nullptr)
|
||||
myOptionsDialog = make_unique<OptionsDialog>(instance(), parent(), this, _w, _h,
|
||||
Menu::AppMode::launcher);
|
||||
myOptionsDialog->open();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,13 +99,14 @@ class LauncherDialog : public Dialog
|
|||
void showOnlyROMs(bool state);
|
||||
bool matchPattern(const string& s, const string& pattern) const;
|
||||
void startGame();
|
||||
void openSettings();
|
||||
|
||||
private:
|
||||
unique_ptr<OptionsDialog> myOptions;
|
||||
unique_ptr<OptionsDialog> myOptionsDialog;
|
||||
unique_ptr<StellaSettingsDialog> myStellaSettingsDialog;
|
||||
unique_ptr<GameList> myGameList;
|
||||
unique_ptr<ContextMenu> myMenu;
|
||||
unique_ptr<GlobalPropsDialog> myGlobalProps;
|
||||
unique_ptr<StellaSettingsDialog> myStellaSettingsDialog;
|
||||
unique_ptr<BrowserDialog> myRomDir;
|
||||
|
||||
ButtonWidget* myStartButton;
|
||||
|
|
|
@ -41,7 +41,7 @@ ListWidget::ListWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_quickSelect(quickSelect),
|
||||
_quickSelectTime(0)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG | Widget::FLAG_RETAIN_FOCUS;
|
||||
_bgcolor = kWidColor;
|
||||
_bgcolorhi = kWidColor;
|
||||
_textcolor = kTextColor;
|
||||
|
|
|
@ -18,13 +18,33 @@
|
|||
#include "Dialog.hxx"
|
||||
#include "FrameBufferConstants.hxx"
|
||||
#include "OptionsDialog.hxx"
|
||||
#include "StellaSettingsDialog.hxx"
|
||||
#include "FrameBuffer.hxx"
|
||||
#include "bspf.hxx"
|
||||
#include "Menu.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Menu::Menu(OSystem& osystem)
|
||||
: DialogContainer(osystem)
|
||||
: DialogContainer(osystem),
|
||||
stellaSettingDialog(nullptr),
|
||||
optionsDialog(nullptr)
|
||||
{}
|
||||
|
||||
Dialog* Menu::getBaseDialog()
|
||||
{
|
||||
myBaseDialog = new OptionsDialog(myOSystem, *this, nullptr,
|
||||
FBMinimum::Width, FBMinimum::Height, OptionsDialog::AppMode::emulator);
|
||||
if (myOSystem.settings().getBool("basic_settings"))
|
||||
{
|
||||
if (stellaSettingDialog == nullptr)
|
||||
stellaSettingDialog = new StellaSettingsDialog(myOSystem, *this, myOSystem.frameBuffer().font(),
|
||||
FBMinimum::Width, FBMinimum::Height, AppMode::emulator);
|
||||
return stellaSettingDialog;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (optionsDialog == nullptr)
|
||||
optionsDialog = new OptionsDialog(myOSystem, *this, nullptr,
|
||||
FBMinimum::Width, FBMinimum::Height, AppMode::emulator);
|
||||
return optionsDialog;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#define MENU_HXX
|
||||
|
||||
class OSystem;
|
||||
class StellaSettingsDialog;
|
||||
class OptionsDialog;
|
||||
|
||||
#include "DialogContainer.hxx"
|
||||
|
||||
|
@ -30,12 +32,20 @@ class OSystem;
|
|||
class Menu : public DialogContainer
|
||||
{
|
||||
public:
|
||||
// Current Stella mode
|
||||
enum class AppMode { launcher, emulator, debugger };
|
||||
|
||||
/**
|
||||
Create a new menu stack
|
||||
*/
|
||||
explicit Menu(OSystem& osystem);
|
||||
virtual ~Menu() = default;
|
||||
|
||||
StellaSettingsDialog* stellaSettingDialog;
|
||||
OptionsDialog* optionsDialog;
|
||||
|
||||
Dialog* getBaseDialog() override;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
Menu() = delete;
|
||||
|
|
|
@ -0,0 +1,295 @@
|
|||
//============================================================================
|
||||
//
|
||||
// SSSS tt lll lll
|
||||
// SS SS tt ll ll
|
||||
// SS tttttt eeee ll ll aaaa
|
||||
// SSSS tt ee ee ll ll aa
|
||||
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||
// SS SS tt ee ll ll aa aa
|
||||
// SSSS ttt eeeee llll llll aaaaa
|
||||
//
|
||||
// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
|
||||
// and the Stella Team
|
||||
//
|
||||
// See the file "License.txt" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//============================================================================
|
||||
|
||||
#include "Console.hxx"
|
||||
#include "TIA.hxx"
|
||||
#include "Switches.hxx"
|
||||
#include "Dialog.hxx"
|
||||
#include "Font.hxx"
|
||||
#include "EventHandler.hxx"
|
||||
#include "StateManager.hxx"
|
||||
#include "RewindManager.hxx"
|
||||
#include "OSystem.hxx"
|
||||
#include "Widget.hxx"
|
||||
#include "StellaSettingsDialog.hxx"
|
||||
#include "OptionsDialog.hxx"
|
||||
#include "TIASurface.hxx"
|
||||
#include "MinUICommandDialog.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
MinUICommandDialog::MinUICommandDialog(OSystem& osystem, DialogContainer& parent)
|
||||
: Dialog(osystem, parent, osystem.frameBuffer().font(), "Commands"),
|
||||
myStellaSettingsDialog(nullptr),
|
||||
myOptionsDialog(nullptr)
|
||||
{
|
||||
const int HBORDER = 10;
|
||||
const int VBORDER = 10;
|
||||
const int HGAP = 8;
|
||||
const int VGAP = 5;
|
||||
const int buttonWidth = _font.getStringWidth(" Load State 0") + 20,
|
||||
buttonHeight = _font.getLineHeight() + 8,
|
||||
rowHeight = buttonHeight + VGAP;
|
||||
|
||||
// Set real dimensions
|
||||
_w = 3 * (buttonWidth + 5) + HBORDER * 2;
|
||||
_h = 6 * rowHeight - VGAP + VBORDER * 2 + _th;
|
||||
ButtonWidget* bw = nullptr;
|
||||
WidgetArray wid;
|
||||
int xoffset = HBORDER, yoffset = VBORDER + _th;
|
||||
|
||||
auto ADD_CD_BUTTON = [&](const string& label, int cmd)
|
||||
{
|
||||
ButtonWidget* b = new ButtonWidget(this, _font, xoffset, yoffset,
|
||||
buttonWidth, buttonHeight, label, cmd);
|
||||
yoffset += buttonHeight + VGAP;
|
||||
return b;
|
||||
};
|
||||
|
||||
// Column 1
|
||||
bw = ADD_CD_BUTTON("Select", kSelectCmd);
|
||||
wid.push_back(bw);
|
||||
bw = ADD_CD_BUTTON("Reset", kResetCmd);
|
||||
wid.push_back(bw);
|
||||
myColorButton = ADD_CD_BUTTON("", kColorCmd);
|
||||
wid.push_back(myColorButton);
|
||||
myLeftDiffButton = ADD_CD_BUTTON("", kLeftDiffCmd);
|
||||
wid.push_back(myLeftDiffButton);
|
||||
myRightDiffButton = ADD_CD_BUTTON("", kLeftDiffCmd);
|
||||
wid.push_back(myRightDiffButton);
|
||||
|
||||
// Column 2
|
||||
xoffset += buttonWidth + HGAP;
|
||||
yoffset = VBORDER + _th;
|
||||
|
||||
mySaveStateButton = ADD_CD_BUTTON("", kSaveStateCmd);
|
||||
wid.push_back(mySaveStateButton);
|
||||
myStateSlotButton = ADD_CD_BUTTON("", kStateSlotCmd);
|
||||
wid.push_back(myStateSlotButton);
|
||||
myLoadStateButton = ADD_CD_BUTTON("", kLoadStateCmd);
|
||||
wid.push_back(myLoadStateButton);
|
||||
myRewindButton = ADD_CD_BUTTON("Rewind", kRewindCmd);
|
||||
wid.push_back(myRewindButton);
|
||||
myUnwindButton = ADD_CD_BUTTON("Unwind", kUnwindCmd);
|
||||
wid.push_back(myUnwindButton);
|
||||
bw = ADD_CD_BUTTON("Close", GuiObject::kCloseCmd);
|
||||
wid.push_back(bw);
|
||||
|
||||
// Column 3
|
||||
xoffset += buttonWidth + HGAP;
|
||||
yoffset = VBORDER + _th;
|
||||
|
||||
myTVFormatButton = ADD_CD_BUTTON("", kFormatCmd);
|
||||
wid.push_back(myTVFormatButton);
|
||||
myStretchButton = ADD_CD_BUTTON("", kStretchCmd);
|
||||
wid.push_back(myStretchButton);
|
||||
myPhosphorButton = ADD_CD_BUTTON("", kPhosphorCmd);
|
||||
wid.push_back(myPhosphorButton);
|
||||
bw = ADD_CD_BUTTON("Settings"+ ELLIPSIS, kSettings);
|
||||
wid.push_back(bw);
|
||||
bw = ADD_CD_BUTTON("Exit Game", kExitGameCmd);
|
||||
wid.push_back(bw);
|
||||
|
||||
addToFocusList(wid);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::loadConfig()
|
||||
{
|
||||
// Column 1
|
||||
myColorButton->setLabel(instance().console().switches().tvColor() ? "Color Mode" : "B/W Mode");
|
||||
myLeftDiffButton->setLabel(instance().console().switches().leftDifficultyA() ? "P1 Skill A" : "P1 Skill B");
|
||||
myRightDiffButton->setLabel(instance().console().switches().rightDifficultyA() ? "P2 Skill A" : "P2 Skill B");
|
||||
// Column 2
|
||||
updateSlot(instance().state().currentSlot());
|
||||
updateWinds();
|
||||
|
||||
// Column 3
|
||||
updateTVFormat();
|
||||
myStretchButton->setLabel(instance().settings().getBool("tia.fs_stretch") ? "Stretched" : "4:3 Format");
|
||||
myPhosphorButton->setLabel(instance().frameBuffer().tiaSurface().phosphorEnabled() ? "Phosphor On" : "Phosphor Off");
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::handleKeyDown(StellaKey key, StellaMod mod)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case KBDK_F8: // front ("Skill P2")
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
break;
|
||||
|
||||
default:
|
||||
Dialog::handleKeyDown(key, mod);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::handleCommand(CommandSender* sender, int cmd,
|
||||
int data, int id)
|
||||
{
|
||||
bool consoleCmd = false, stateCmd = false;
|
||||
Event::Type event = Event::NoType;
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
// Column 1
|
||||
case kSelectCmd:
|
||||
event = Event::ConsoleSelect;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kResetCmd:
|
||||
event = Event::ConsoleReset;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kColorCmd:
|
||||
event = Event::ConsoleColorToggle;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kLeftDiffCmd:
|
||||
event = Event::ConsoleLeftDiffToggle;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kRightDiffCmd:
|
||||
event = Event::ConsoleRightDiffToggle;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
// Column 2
|
||||
case kSaveStateCmd:
|
||||
event = Event::SaveState;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kStateSlotCmd:
|
||||
{
|
||||
event = Event::ChangeState;
|
||||
stateCmd = true;
|
||||
int slot = (instance().state().currentSlot() + 1) % 10;
|
||||
updateSlot(slot);
|
||||
break;
|
||||
}
|
||||
|
||||
case kLoadStateCmd:
|
||||
event = Event::LoadState;
|
||||
consoleCmd = true;
|
||||
break;
|
||||
|
||||
case kRewindCmd:
|
||||
// rewind 5s
|
||||
instance().state().rewindStates(5);
|
||||
updateWinds();
|
||||
break;
|
||||
|
||||
case kUnwindCmd:
|
||||
// unwind 5s
|
||||
instance().state().unwindStates(5);
|
||||
updateWinds();
|
||||
break;
|
||||
|
||||
case GuiObject::kCloseCmd:
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
break;
|
||||
|
||||
// Column 3
|
||||
case kFormatCmd:
|
||||
instance().console().toggleFormat();
|
||||
updateTVFormat();
|
||||
break;
|
||||
|
||||
case kStretchCmd:
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
instance().settings().setValue("tia.fs_stretch", !instance().settings().getBool("tia.fs_stretch"));
|
||||
break;
|
||||
|
||||
case kPhosphorCmd:
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
instance().console().togglePhosphor();
|
||||
break;
|
||||
|
||||
case kSettings:
|
||||
openSettings();
|
||||
break;
|
||||
|
||||
case kExitGameCmd:
|
||||
instance().eventHandler().handleEvent(Event::LauncherMode);
|
||||
break;
|
||||
}
|
||||
|
||||
// Console commands should be performed right away, after leaving the menu
|
||||
// State commands require you to exit the menu manually
|
||||
if(consoleCmd)
|
||||
{
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
instance().eventHandler().handleEvent(event);
|
||||
instance().console().switches().update();
|
||||
instance().console().tia().update();
|
||||
instance().eventHandler().handleEvent(event, false);
|
||||
}
|
||||
else if(stateCmd)
|
||||
instance().eventHandler().handleEvent(event);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::updateSlot(int slot)
|
||||
{
|
||||
ostringstream buf;
|
||||
buf << " " << slot;
|
||||
|
||||
mySaveStateButton->setLabel("Save State" + buf.str());
|
||||
myStateSlotButton->setLabel("State Slot" + buf.str());
|
||||
myLoadStateButton->setLabel("Load State" + buf.str());
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::updateTVFormat()
|
||||
{
|
||||
myTVFormatButton->setLabel(instance().console().getFormatString() + " Mode");
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::updateWinds()
|
||||
{
|
||||
RewindManager& r = instance().state().rewindManager();
|
||||
|
||||
myRewindButton->setEnabled(!r.atFirst());
|
||||
myUnwindButton->setEnabled(!r.atLast());
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void MinUICommandDialog::openSettings()
|
||||
{
|
||||
// Create an options dialog, similar to the in-game one
|
||||
if (instance().settings().getBool("basic_settings"))
|
||||
{
|
||||
if (myStellaSettingsDialog == nullptr)
|
||||
myStellaSettingsDialog = make_unique<StellaSettingsDialog>(instance(), parent(),
|
||||
instance().frameBuffer().launcherFont(), FBMinimum::Width, FBMinimum::Height, Menu::AppMode::launcher);
|
||||
myStellaSettingsDialog->open();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (myOptionsDialog == nullptr)
|
||||
myOptionsDialog = make_unique<OptionsDialog>(instance(), parent(), this,
|
||||
FBMinimum::Width, FBMinimum::Height, Menu::AppMode::launcher);
|
||||
myOptionsDialog->open();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
//============================================================================
|
||||
//
|
||||
// SSSS tt lll lll
|
||||
// SS SS tt ll ll
|
||||
// SS tttttt eeee ll ll aaaa
|
||||
// SSSS tt ee ee ll ll aa
|
||||
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
||||
// SS SS tt ee ll ll aa aa
|
||||
// SSSS ttt eeeee llll llll aaaaa
|
||||
//
|
||||
// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
|
||||
// and the Stella Team
|
||||
//
|
||||
// See the file "License.txt" for information on usage and redistribution of
|
||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//============================================================================
|
||||
|
||||
#ifndef MIN_UI_COMMAND_DIALOG_HXX
|
||||
#define MIN_UI_COMMAND_DIALOG_HXX
|
||||
|
||||
class Properties;
|
||||
class CommandSender;
|
||||
class DialogContainer;
|
||||
class OSystem;
|
||||
class StellaSettingsDialog;
|
||||
class OptionsDialog;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
|
||||
class MinUICommandDialog : public Dialog
|
||||
{
|
||||
public:
|
||||
MinUICommandDialog(OSystem& osystem, DialogContainer& parent);
|
||||
virtual ~MinUICommandDialog() = default;
|
||||
|
||||
protected:
|
||||
void loadConfig() override;
|
||||
void handleKeyDown(StellaKey key, StellaMod mod) override;
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
void updateSlot(int slot);
|
||||
void updateWinds();
|
||||
void updateTVFormat();
|
||||
void openSettings();
|
||||
|
||||
// column 0
|
||||
ButtonWidget* myColorButton;
|
||||
ButtonWidget* myLeftDiffButton;
|
||||
ButtonWidget* myRightDiffButton;
|
||||
// column 1
|
||||
ButtonWidget* mySaveStateButton;
|
||||
ButtonWidget* myStateSlotButton;
|
||||
ButtonWidget* myLoadStateButton;
|
||||
ButtonWidget* myRewindButton;
|
||||
ButtonWidget* myUnwindButton;
|
||||
// column 2
|
||||
ButtonWidget* myTVFormatButton;
|
||||
ButtonWidget* myStretchButton;
|
||||
ButtonWidget* myPhosphorButton;
|
||||
|
||||
unique_ptr<StellaSettingsDialog> myStellaSettingsDialog;
|
||||
unique_ptr<OptionsDialog> myOptionsDialog;
|
||||
|
||||
enum
|
||||
{
|
||||
kSelectCmd = 'Csel',
|
||||
kResetCmd = 'Cres',
|
||||
kColorCmd = 'Ccol',
|
||||
kLeftDiffCmd = 'Cldf',
|
||||
kRightDiffCmd = 'Crdf',
|
||||
kSaveStateCmd = 'Csst',
|
||||
kStateSlotCmd = 'Ccst',
|
||||
kLoadStateCmd = 'Clst',
|
||||
kSnapshotCmd = 'Csnp',
|
||||
kRewindCmd = 'Crew',
|
||||
kUnwindCmd = 'Cunw',
|
||||
kFormatCmd = 'Cfmt',
|
||||
kStretchCmd = 'Cstr',
|
||||
kPhosphorCmd = 'Cpho',
|
||||
kSettings = 'Cscn',
|
||||
kExitGameCmd = 'Cext',
|
||||
};
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
MinUICommandDialog() = delete;
|
||||
MinUICommandDialog(const MinUICommandDialog&) = delete;
|
||||
MinUICommandDialog(MinUICommandDialog&&) = delete;
|
||||
MinUICommandDialog& operator=(const MinUICommandDialog&) = delete;
|
||||
MinUICommandDialog& operator=(MinUICommandDialog&&) = delete;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -32,12 +32,12 @@
|
|||
#include "GameInfoDialog.hxx"
|
||||
#include "LoggerDialog.hxx"
|
||||
#include "DeveloperDialog.hxx"
|
||||
#include "StellaSettingsDialog.hxx"
|
||||
#include "HelpDialog.hxx"
|
||||
#include "AboutDialog.hxx"
|
||||
#include "OptionsDialog.hxx"
|
||||
#include "Launcher.hxx"
|
||||
#include "Settings.hxx"
|
||||
#include "Menu.hxx"
|
||||
|
||||
#ifdef CHEATCODE_SUPPORT
|
||||
#include "CheatCodeDialog.hxx"
|
||||
|
@ -47,14 +47,16 @@
|
|||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
||||
GuiObject* boss, int max_w, int max_h, AppMode mode)
|
||||
GuiObject* boss, int max_w, int max_h, Menu::AppMode mode)
|
||||
: Dialog(osystem, parent, osystem.frameBuffer().font(), "Options"),
|
||||
myMode(mode)
|
||||
{
|
||||
const int buttonWidth = _font.getStringWidth("Game Properties" + ELLIPSIS) + 20,
|
||||
buttonHeight = _font.getLineHeight() + 6,
|
||||
// do not show basic settings options in debugger
|
||||
bool minSettings = osystem.settings().getBool("minimal_ui") && mode != Menu::AppMode::debugger;
|
||||
const int buttonHeight = _font.getLineHeight() + 6,
|
||||
rowHeight = _font.getLineHeight() + 10;
|
||||
const int VBORDER = 10 + _th;
|
||||
int buttonWidth = _font.getStringWidth("Game Properties" + ELLIPSIS) + 20;
|
||||
|
||||
_w = 2 * buttonWidth + 30;
|
||||
_h = 7 * rowHeight + 15 + _th;
|
||||
|
@ -63,6 +65,15 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
WidgetArray wid;
|
||||
ButtonWidget* b = nullptr;
|
||||
|
||||
if (minSettings)
|
||||
{
|
||||
ButtonWidget* bw = new ButtonWidget(this, _font, xoffset, yoffset,
|
||||
_w - 10 * 2, buttonHeight, "Switch to Basic Settings" + ELLIPSIS, kBasSetCmd);
|
||||
wid.push_back(bw);
|
||||
yoffset += rowHeight + 8;
|
||||
_h += rowHeight + 8;
|
||||
}
|
||||
|
||||
auto ADD_OD_BUTTON = [&](const string& label, int cmd)
|
||||
{
|
||||
ButtonWidget* bw = new ButtonWidget(this, _font, xoffset, yoffset,
|
||||
|
@ -76,7 +87,7 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
|
||||
b = ADD_OD_BUTTON("Audio" + ELLIPSIS, kAudCmd);
|
||||
#ifndef SOUND_SUPPORT
|
||||
b->clearFlags(WIDGET_ENABLED);
|
||||
b->clearFlags(Widget::FLAG_ENABLED);
|
||||
#endif
|
||||
wid.push_back(b);
|
||||
|
||||
|
@ -90,23 +101,18 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
wid.push_back(b);
|
||||
|
||||
//yoffset += rowHeight;
|
||||
// R77 TEST
|
||||
b = ADD_OD_BUTTON("Stella Options" + ELLIPSIS, kStellaOptionsCmd);
|
||||
wid.push_back(b);
|
||||
|
||||
|
||||
b = ADD_OD_BUTTON("Developer" + ELLIPSIS, kDevelopCmd);
|
||||
wid.push_back(b);
|
||||
|
||||
// Move to second column
|
||||
xoffset += buttonWidth + 10; yoffset = VBORDER;
|
||||
xoffset += buttonWidth + 10; yoffset = minSettings ? VBORDER + rowHeight + 8 : VBORDER;
|
||||
|
||||
myGameInfoButton = ADD_OD_BUTTON("Game Properties" + ELLIPSIS, kInfoCmd);
|
||||
wid.push_back(myGameInfoButton);
|
||||
|
||||
myCheatCodeButton = ADD_OD_BUTTON("Cheat Codes" + ELLIPSIS, kCheatCmd);
|
||||
#ifndef CHEATCODE_SUPPORT
|
||||
myCheatCodeButton->clearFlags(WIDGET_ENABLED);
|
||||
myCheatCodeButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
#endif
|
||||
wid.push_back(myCheatCodeButton);
|
||||
|
||||
|
@ -122,6 +128,8 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
b = ADD_OD_BUTTON("About" + ELLIPSIS, kAboutCmd);
|
||||
wid.push_back(b);
|
||||
|
||||
buttonWidth = _font.getStringWidth(" Close ") + 20;
|
||||
xoffset -= (buttonWidth + 10) / 2;
|
||||
b = ADD_OD_BUTTON("Close", kExitCmd);
|
||||
wid.push_back(b);
|
||||
addCancelWidget(b);
|
||||
|
@ -132,7 +140,6 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
myInputDialog = make_unique<InputDialog>(osystem, parent, _font, max_w, max_h);
|
||||
myUIDialog = make_unique<UIDialog>(osystem, parent, _font, boss, max_w, max_h);
|
||||
mySnapshotDialog = make_unique<SnapshotDialog>(osystem, parent, _font, max_w, max_h);
|
||||
myStellaOptionsDialog = make_unique<StellaSettingsDialog>(osystem, parent, _font, max_w, max_h);
|
||||
myDeveloperDialog = make_unique<DeveloperDialog>(osystem, parent, _font, max_w, max_h);
|
||||
myGameInfoDialog = make_unique<GameInfoDialog>(osystem, parent, _font, this, max_w, max_h);
|
||||
#ifdef CHEATCODE_SUPPORT
|
||||
|
@ -145,13 +152,13 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
|
|||
addToFocusList(wid);
|
||||
|
||||
// Certain buttons are disabled depending on mode
|
||||
if(myMode == AppMode::launcher)
|
||||
if(myMode == Menu::AppMode::launcher)
|
||||
{
|
||||
myCheatCodeButton->clearFlags(WIDGET_ENABLED);
|
||||
myCheatCodeButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
}
|
||||
else
|
||||
{
|
||||
myRomAuditButton->clearFlags(WIDGET_ENABLED);
|
||||
myRomAuditButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,13 +176,13 @@ void OptionsDialog::loadConfig()
|
|||
switch(instance().eventHandler().state())
|
||||
{
|
||||
case EventHandlerState::EMULATION:
|
||||
myGameInfoButton->setFlags(WIDGET_ENABLED);
|
||||
myGameInfoButton->setFlags(Widget::FLAG_ENABLED);
|
||||
break;
|
||||
case EventHandlerState::LAUNCHER:
|
||||
if(instance().launcher().selectedRomMD5() != "")
|
||||
myGameInfoButton->setFlags(WIDGET_ENABLED);
|
||||
myGameInfoButton->setFlags(Widget::FLAG_ENABLED);
|
||||
else
|
||||
myGameInfoButton->clearFlags(WIDGET_ENABLED);
|
||||
myGameInfoButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -188,6 +195,15 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
{
|
||||
switch(cmd)
|
||||
{
|
||||
case kBasSetCmd:
|
||||
// enable basic settings
|
||||
instance().settings().setValue("basic_settings", true);
|
||||
if (myMode != Menu::AppMode::emulator)
|
||||
close();
|
||||
else
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
break;
|
||||
|
||||
case kVidCmd:
|
||||
{
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
|
@ -257,21 +273,6 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
}
|
||||
|
||||
case kStellaOptionsCmd:
|
||||
{
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
uInt32 w = 0, h = 0;
|
||||
|
||||
if (myStellaOptionsDialog == nullptr || myStellaOptionsDialog->shouldResize(w, h))
|
||||
{
|
||||
myStellaOptionsDialog = make_unique<StellaSettingsDialog>(instance(), parent(),
|
||||
instance().frameBuffer().font(), w, h);
|
||||
}
|
||||
myStellaOptionsDialog->open();
|
||||
break;
|
||||
}
|
||||
|
||||
case kInfoCmd:
|
||||
{
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
|
@ -322,7 +323,7 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
|
||||
case kExitCmd:
|
||||
if(myMode != AppMode::emulator)
|
||||
if(myMode != Menu::AppMode::emulator)
|
||||
close();
|
||||
else
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
|
|
|
@ -35,20 +35,16 @@ class RomAuditDialog;
|
|||
class HelpDialog;
|
||||
class AboutDialog;
|
||||
class LoggerDialog;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
|
||||
class DeveloperDialog;
|
||||
class StellaSettingsDialog;
|
||||
|
||||
#include "Menu.hxx"
|
||||
#include "Dialog.hxx"
|
||||
|
||||
class OptionsDialog : public Dialog
|
||||
{
|
||||
public:
|
||||
// Current Stella mode
|
||||
enum class AppMode { launcher, emulator, debugger };
|
||||
|
||||
OptionsDialog(OSystem& osystem, DialogContainer& parent, GuiObject* boss,
|
||||
int max_w, int max_h, AppMode mode);
|
||||
int max_w, int max_h, Menu::AppMode mode);
|
||||
virtual ~OptionsDialog();
|
||||
|
||||
private:
|
||||
|
@ -62,7 +58,6 @@ class OptionsDialog : public Dialog
|
|||
unique_ptr<UIDialog> myUIDialog;
|
||||
unique_ptr<SnapshotDialog> mySnapshotDialog;
|
||||
unique_ptr<DeveloperDialog> myDeveloperDialog;
|
||||
unique_ptr<StellaSettingsDialog> myStellaOptionsDialog;
|
||||
unique_ptr<GameInfoDialog> myGameInfoDialog;
|
||||
#ifdef CHEATCODE_SUPPORT
|
||||
unique_ptr<CheatCodeDialog> myCheatCodeDialog;
|
||||
|
@ -77,9 +72,10 @@ class OptionsDialog : public Dialog
|
|||
ButtonWidget* myCheatCodeButton;
|
||||
|
||||
// Indicates if this dialog is used for global (vs. in-game) settings
|
||||
AppMode myMode;
|
||||
Menu::AppMode myMode;
|
||||
|
||||
enum {
|
||||
kBasSetCmd = 'BAST',
|
||||
kVidCmd = 'VIDO',
|
||||
kAudCmd = 'AUDO',
|
||||
kInptCmd = 'INPT',
|
||||
|
@ -90,7 +86,6 @@ class OptionsDialog : public Dialog
|
|||
kCheatCmd = 'CHET',
|
||||
kLoggerCmd = 'LOGG',
|
||||
kDevelopCmd = 'DEVL',
|
||||
kStellaOptionsCmd = 'STOP',
|
||||
kHelpCmd = 'HELP',
|
||||
kAboutCmd = 'ABOU',
|
||||
kExitCmd = 'EXIM'
|
||||
|
|
|
@ -45,7 +45,7 @@ PopUpWidget::PopUpWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_labelWidth(labelWidth),
|
||||
_changed(false)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_RETAIN_FOCUS;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorhi = kDlgColor; // do not highlight the background
|
||||
_textcolor = kTextColor;
|
||||
|
@ -143,14 +143,14 @@ void PopUpWidget::handleMouseWheel(int x, int y, int direction)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void PopUpWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void PopUpWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -91,7 +91,7 @@ RadioButtonWidget::RadioButtonWidget(GuiObject* boss, const GUI::Font& font,
|
|||
: CheckboxWidget(boss, font, x, y, label, cmd),
|
||||
myGroup(group)
|
||||
{
|
||||
_flags = WIDGET_ENABLED;
|
||||
_flags = Widget::FLAG_ENABLED;
|
||||
_bgcolor = _bgcolorhi = kWidColor;
|
||||
|
||||
_editable = true;
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
RomAuditDialog::RomAuditDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h)
|
||||
: Dialog(osystem, parent, font, "Audit ROMs"),
|
||||
myConfirmMsg(nullptr),
|
||||
myMaxWidth(max_w),
|
||||
myMaxHeight(max_h)
|
||||
{
|
||||
|
|
|
@ -39,7 +39,7 @@ RomInfoWidget::RomInfoWidget(GuiObject* boss, const GUI::Font& font,
|
|||
GUI::Size(TIAConstants::viewableWidth*2, TIAConstants::viewableHeight*2) :
|
||||
GUI::Size(TIAConstants::viewableWidth, TIAConstants::viewableHeight))
|
||||
{
|
||||
_flags = WIDGET_ENABLED;
|
||||
_flags = Widget::FLAG_ENABLED;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorlo = kBGColorLo;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ ScrollBarWidget::ScrollBarWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_sliderPos(0),
|
||||
_sliderDeltaMouseDownPos(0)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE | WIDGET_CLEARBG;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_TRACK_MOUSE | Widget::FLAG_CLEARBG;
|
||||
_bgcolor = kWidColor;
|
||||
_bgcolorhi = kWidColor;
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ void ScrollBarWidget::checkBounds(int old_pos)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void ScrollBarWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
@ -216,7 +216,7 @@ void ScrollBarWidget::handleMouseEntered()
|
|||
void ScrollBarWidget::handleMouseLeft()
|
||||
{
|
||||
_part = kNoPart;
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -22,35 +22,43 @@
|
|||
#include "ControllerDetector.hxx"
|
||||
#include "NTSCFilter.hxx"
|
||||
#include "PopUpWidget.hxx"
|
||||
#include "MessageBox.hxx"
|
||||
|
||||
#include "StellaSettingsDialog.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
StellaSettingsDialog::StellaSettingsDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h)
|
||||
: Dialog(osystem, parent, font, "Stella settings")
|
||||
const GUI::Font& font, int max_w, int max_h, Menu::AppMode mode)
|
||||
: Dialog(osystem, parent, font, "Stella settings"),
|
||||
myMode(mode)
|
||||
{
|
||||
const int VGAP = 4;
|
||||
const int VBORDER = 8;
|
||||
const int HBORDER = 10;
|
||||
const int INDENT = 20;
|
||||
const int lineHeight = font.getLineHeight(),
|
||||
const int buttonHeight = font.getLineHeight() + 6,
|
||||
lineHeight = font.getLineHeight(),
|
||||
fontWidth = font.getMaxCharWidth();
|
||||
const int VGAP = 5;
|
||||
int xpos, ypos;
|
||||
|
||||
WidgetArray wid;
|
||||
VariantList items;
|
||||
|
||||
// Set real dimensions
|
||||
setSize(33 * fontWidth + HBORDER * 2, 15 * (lineHeight + VGAP) + _th, max_w, max_h);
|
||||
setSize(33 * fontWidth + HBORDER * 2, 14 * (lineHeight + VGAP) + VGAP * 9 + 6 + _th, max_w, max_h);
|
||||
|
||||
xpos = HBORDER;
|
||||
ypos = VBORDER + _th;
|
||||
|
||||
myAdvancedSettings = new ButtonWidget(this, font, xpos, ypos, _w - HBORDER * 2, buttonHeight,
|
||||
"Switch to Advanced Settings" + ELLIPSIS, kAdvancedSettings);
|
||||
ypos += lineHeight + VGAP*4;
|
||||
|
||||
new StaticTextWidget(this, font, xpos, ypos + 1, "Global settings:");
|
||||
xpos += INDENT;
|
||||
ypos += lineHeight + VGAP;
|
||||
|
||||
|
||||
addUIOptions(wid, xpos, ypos, font);
|
||||
ypos += VGAP * 4;
|
||||
addVideoOptions(wid, xpos, ypos, font);
|
||||
|
@ -75,7 +83,7 @@ void StellaSettingsDialog::addUIOptions(WidgetArray& wid, int& xpos, int& ypos,
|
|||
const int VGAP = 4;
|
||||
const int lineHeight = font.getLineHeight();
|
||||
VariantList items;
|
||||
int pwidth = font.getStringWidth("Bad adjust");
|
||||
int pwidth = font.getStringWidth("Bad adjust"); // align width with other popup
|
||||
|
||||
ypos += 1;
|
||||
VarList::push_back(items, "Standard", "standard");
|
||||
|
@ -284,15 +292,32 @@ void StellaSettingsDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case GuiObject::kOKCmd:
|
||||
saveConfig();
|
||||
close();
|
||||
break;
|
||||
|
||||
case GuiObject::kDefaultsCmd:
|
||||
setDefaults();
|
||||
break;
|
||||
|
||||
case GuiObject::kOKCmd:
|
||||
saveConfig();
|
||||
[[fallthrough]];
|
||||
case GuiObject::kCloseCmd:
|
||||
if (myMode != Menu::AppMode::emulator)
|
||||
close();
|
||||
else
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
break;
|
||||
|
||||
case kAdvancedSettings:
|
||||
switchSettingsMode();
|
||||
break;
|
||||
|
||||
case kConfirmSwitchCmd:
|
||||
instance().settings().setValue("basic_settings", false);
|
||||
if (myMode != Menu::AppMode::emulator)
|
||||
close();
|
||||
else
|
||||
instance().eventHandler().leaveMenuMode();
|
||||
break;
|
||||
|
||||
case kScanlinesChanged:
|
||||
if(myTVScanIntense->getValue() == 0)
|
||||
myTVScanIntense->setValueLabel("Off");
|
||||
|
@ -309,6 +334,26 @@ void StellaSettingsDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StellaSettingsDialog::switchSettingsMode()
|
||||
{
|
||||
StringList msg;
|
||||
|
||||
msg.push_back("Warning!");
|
||||
msg.push_back("");
|
||||
msg.push_back("Advanced settings should be");
|
||||
msg.push_back("handled with care! When in");
|
||||
msg.push_back("doubt, read the manual.");
|
||||
msg.push_back("");
|
||||
msg.push_back("If you are sure you want to");
|
||||
msg.push_back("proceed with the switch, click");
|
||||
msg.push_back("'OK', otherwise click 'Cancel'.");
|
||||
|
||||
myConfirmMsg = make_unique<GUI::MessageBox>(this, instance().frameBuffer().font(), msg,
|
||||
_w-16, _h, kConfirmSwitchCmd, "OK", "Cancel", "Switch settings mode", false);
|
||||
myConfirmMsg->show();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StellaSettingsDialog::loadControllerProperties(const Properties& props)
|
||||
{
|
||||
|
@ -321,6 +366,7 @@ void StellaSettingsDialog::loadControllerProperties(const Properties& props)
|
|||
switch (instance().eventHandler().state())
|
||||
{
|
||||
case EventHandlerState::OPTIONSMENU: // game is running!
|
||||
case EventHandlerState::CMDMENU: // game is running!
|
||||
enable = true;
|
||||
break;
|
||||
case EventHandlerState::LAUNCHER:
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
class PopUpWidget;
|
||||
|
||||
#include "Props.hxx"
|
||||
#include "Menu.hxx"
|
||||
#include "Dialog.hxx"
|
||||
#include "MessageBox.hxx"
|
||||
|
||||
namespace GUI {
|
||||
class Font;
|
||||
|
@ -31,7 +33,7 @@ class StellaSettingsDialog : public Dialog
|
|||
{
|
||||
public:
|
||||
StellaSettingsDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h);
|
||||
const GUI::Font& font, int max_w, int max_h, Menu::AppMode mode);
|
||||
virtual ~StellaSettingsDialog() = default;
|
||||
|
||||
private:
|
||||
|
@ -45,6 +47,9 @@ class StellaSettingsDialog : public Dialog
|
|||
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
|
||||
// switch to advanced settings after user confirmation
|
||||
void switchSettingsMode();
|
||||
|
||||
// load the properties for the controller settings
|
||||
void loadControllerProperties(const Properties& props);
|
||||
|
||||
|
@ -53,6 +58,9 @@ class StellaSettingsDialog : public Dialog
|
|||
int valueToLevel(int value);
|
||||
|
||||
private:
|
||||
// advanced settings mode:
|
||||
ButtonWidget* myAdvancedSettings;
|
||||
|
||||
// UI theme
|
||||
PopUpWidget* myThemePopup;
|
||||
|
||||
|
@ -76,7 +84,14 @@ class StellaSettingsDialog : public Dialog
|
|||
PopUpWidget* myRightPort;
|
||||
StaticTextWidget* myRightPortDetected;
|
||||
|
||||
unique_ptr<GUI::MessageBox> myConfirmMsg;
|
||||
|
||||
// Indicates if this dialog is used for global (vs. in-game) settings
|
||||
Menu::AppMode myMode;
|
||||
|
||||
enum {
|
||||
kAdvancedSettings = 'SSad',
|
||||
kConfirmSwitchCmd = 'SScf',
|
||||
kScanlinesChanged = 'SSsc',
|
||||
kPhosphorChanged = 'SSph'
|
||||
};
|
||||
|
|
|
@ -43,14 +43,14 @@ void StringListWidget::setList(const StringList& list)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StringListWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StringListWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ TabWidget::TabWidget(GuiObject* boss, const GUI::Font& font,
|
|||
{
|
||||
_id = 0; // For dialogs with multiple tab widgets, they should specifically
|
||||
// call ::setID to differentiate among them
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorhi = kDlgColor;
|
||||
_textcolor = kTextColor;
|
||||
|
@ -219,14 +219,14 @@ void TabWidget::handleMouseDown(int x, int y, MouseButton b, int clickCount)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void TabWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void TabWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
setDirty();
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ TimeLineWidget::TimeLineWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_isDragging(false),
|
||||
_labelWidth(labelWidth)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_TRACK_MOUSE;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorhi = kDlgColor;
|
||||
|
||||
|
|
|
@ -177,8 +177,8 @@ TimeMachineDialog::TimeMachineDialog(OSystem& osystem, DialogContainer& parent,
|
|||
_w = width; // Parent determines our width (based on window size)
|
||||
_h = V_BORDER * 2 + rowHeight + buttonHeight + 2;
|
||||
|
||||
this->clearFlags(WIDGET_CLEARBG); // does only work combined with blending (0..100)!
|
||||
this->clearFlags(WIDGET_BORDER);
|
||||
this->clearFlags(Widget::FLAG_CLEARBG); // does only work combined with blending (0..100)!
|
||||
this->clearFlags(Widget::FLAG_BORDER);
|
||||
|
||||
xpos = H_BORDER;
|
||||
ypos = V_BORDER;
|
||||
|
|
|
@ -207,7 +207,7 @@ UIDialog::UIDialog(OSystem& osystem, DialogContainer& parent,
|
|||
// All ROM settings are disabled while in game mode
|
||||
if(!myIsGlobal)
|
||||
{
|
||||
romButton->clearFlags(WIDGET_ENABLED);
|
||||
romButton->clearFlags(Widget::FLAG_ENABLED);
|
||||
myRomPath->setEditable(false);
|
||||
}
|
||||
|
||||
|
|
|
@ -321,8 +321,8 @@ VideoDialog::VideoDialog(OSystem& osystem, DialogContainer& parent,
|
|||
|
||||
// Disable certain functions when we know they aren't present
|
||||
#ifndef WINDOWED_SUPPORT
|
||||
myFullscreen->clearFlags(WIDGET_ENABLED);
|
||||
myCenter->clearFlags(WIDGET_ENABLED);
|
||||
myFullscreen->clearFlags(Widget::FLAG_ENABLED);
|
||||
myCenter->clearFlags(Widget::FLAG_ENABLED);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ void Widget::draw()
|
|||
|
||||
bool onTop = _boss->dialog().isOnTop();
|
||||
|
||||
bool hasBorder = _flags & WIDGET_BORDER; // currently only used by Dialog widget
|
||||
bool hasBorder = _flags & Widget::FLAG_BORDER; // currently only used by Dialog widget
|
||||
int oldX = _x, oldY = _y;
|
||||
|
||||
// Account for our relative position in the dialog
|
||||
|
@ -89,20 +89,20 @@ void Widget::draw()
|
|||
_y = getAbsY();
|
||||
|
||||
// Clear background (unless alpha blending is enabled)
|
||||
if(_flags & WIDGET_CLEARBG)
|
||||
if(_flags & Widget::FLAG_CLEARBG)
|
||||
{
|
||||
int x = _x, y = _y, w = _w, h = _h;
|
||||
if(hasBorder)
|
||||
{
|
||||
x++; y++; w-=2; h-=2;
|
||||
}
|
||||
s.fillRect(x, y, w, h, !onTop ? _bgcolorlo : (_flags & WIDGET_HILITED) && isEnabled() ? _bgcolorhi : _bgcolor);
|
||||
s.fillRect(x, y, w, h, !onTop ? _bgcolorlo : (_flags & Widget::FLAG_HILITED) && isEnabled() ? _bgcolorhi : _bgcolor);
|
||||
}
|
||||
|
||||
// Draw border
|
||||
if(hasBorder)
|
||||
{
|
||||
s.frameRect(_x, _y, _w, _h, !onTop ? kColor : (_flags & WIDGET_HILITED) && isEnabled() ? kWidColorHi : kColor);
|
||||
s.frameRect(_x, _y, _w, _h, !onTop ? kColor : (_flags & Widget::FLAG_HILITED) && isEnabled() ? kWidColorHi : kColor);
|
||||
_x += 4;
|
||||
_y += 4;
|
||||
_w -= 8;
|
||||
|
@ -110,7 +110,7 @@ void Widget::draw()
|
|||
}
|
||||
|
||||
// Now perform the actual widget draw
|
||||
drawWidget((_flags & WIDGET_HILITED) ? true : false);
|
||||
drawWidget((_flags & Widget::FLAG_HILITED) ? true : false);
|
||||
|
||||
// Restore x/y
|
||||
if (hasBorder)
|
||||
|
@ -156,8 +156,8 @@ void Widget::lostFocus()
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void Widget::setEnabled(bool e)
|
||||
{
|
||||
if(e) setFlags(WIDGET_ENABLED);
|
||||
else clearFlags(WIDGET_ENABLED);
|
||||
if(e) setFlags(Widget::FLAG_ENABLED);
|
||||
else clearFlags(Widget::FLAG_ENABLED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -311,7 +311,7 @@ StaticTextWidget::StaticTextWidget(GuiObject* boss, const GUI::Font& font,
|
|||
: Widget(boss, font, x, y, w, h),
|
||||
_align(align)
|
||||
{
|
||||
_flags = WIDGET_ENABLED;
|
||||
_flags = Widget::FLAG_ENABLED;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorhi = kDlgColor;
|
||||
_textcolor = kTextColor;
|
||||
|
@ -373,7 +373,7 @@ ButtonWidget::ButtonWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_bmw(0),
|
||||
_bmh(0)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_CLEARBG;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_CLEARBG;
|
||||
_bgcolor = kBtnColor;
|
||||
_bgcolorhi = kBtnColorHi;
|
||||
_bgcolorlo = kColor;
|
||||
|
@ -416,13 +416,13 @@ ButtonWidget::ButtonWidget(GuiObject* boss, const GUI::Font& font,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void ButtonWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void ButtonWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -447,7 +447,7 @@ void ButtonWidget::handleMouseUp(int x, int y, MouseButton b, int clickCount)
|
|||
{
|
||||
if(isEnabled() && x >= 0 && x < _w && y >= 0 && y < _h)
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
sendCommand(_cmd, 0, _id);
|
||||
}
|
||||
}
|
||||
|
@ -541,7 +541,7 @@ CheckboxWidget::CheckboxWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_boxY(0),
|
||||
_textY(0)
|
||||
{
|
||||
_flags = WIDGET_ENABLED;
|
||||
_flags = Widget::FLAG_ENABLED;
|
||||
_bgcolor = _bgcolorhi = kWidColor;
|
||||
_bgcolorlo = kDlgColor;
|
||||
|
||||
|
@ -567,13 +567,13 @@ CheckboxWidget::CheckboxWidget(GuiObject* boss, const GUI::Font& font,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CheckboxWidget::handleMouseEntered()
|
||||
{
|
||||
setFlags(WIDGET_HILITED);
|
||||
setFlags(Widget::FLAG_HILITED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CheckboxWidget::handleMouseLeft()
|
||||
{
|
||||
clearFlags(WIDGET_HILITED);
|
||||
clearFlags(Widget::FLAG_HILITED);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -677,7 +677,7 @@ SliderWidget::SliderWidget(GuiObject* boss, const GUI::Font& font,
|
|||
_valueLabelWidth(valueLabelWidth),
|
||||
_numIntervals(0)
|
||||
{
|
||||
_flags = WIDGET_ENABLED | WIDGET_TRACK_MOUSE;
|
||||
_flags = Widget::FLAG_ENABLED | Widget::FLAG_TRACK_MOUSE;
|
||||
_bgcolor = kDlgColor;
|
||||
_bgcolorhi = kDlgColor;
|
||||
|
||||
|
|
|
@ -34,18 +34,6 @@ namespace GUI {
|
|||
#include "GuiObject.hxx"
|
||||
#include "Font.hxx"
|
||||
|
||||
enum {
|
||||
WIDGET_ENABLED = 1 << 0,
|
||||
WIDGET_INVISIBLE = 1 << 1,
|
||||
WIDGET_HILITED = 1 << 2,
|
||||
WIDGET_BORDER = 1 << 3,
|
||||
WIDGET_CLEARBG = 1 << 4,
|
||||
WIDGET_TRACK_MOUSE = 1 << 5,
|
||||
WIDGET_RETAIN_FOCUS = 1 << 6,
|
||||
WIDGET_WANTS_TAB = 1 << 7,
|
||||
WIDGET_WANTS_RAWDATA = 1 << 8
|
||||
};
|
||||
|
||||
/**
|
||||
This is the base class for all widgets.
|
||||
|
||||
|
@ -55,6 +43,19 @@ class Widget : public GuiObject
|
|||
{
|
||||
friend class Dialog;
|
||||
|
||||
public:
|
||||
enum : uInt32 {
|
||||
FLAG_ENABLED = 1 << 0,
|
||||
FLAG_INVISIBLE = 1 << 1,
|
||||
FLAG_HILITED = 1 << 2,
|
||||
FLAG_BORDER = 1 << 3,
|
||||
FLAG_CLEARBG = 1 << 4,
|
||||
FLAG_TRACK_MOUSE = 1 << 5,
|
||||
FLAG_RETAIN_FOCUS = 1 << 6,
|
||||
FLAG_WANTS_TAB = 1 << 7,
|
||||
FLAG_WANTS_RAWDATA = 1 << 8
|
||||
};
|
||||
|
||||
public:
|
||||
Widget(GuiObject* boss, const GUI::Font& font, int x, int y, int w, int h);
|
||||
virtual ~Widget();
|
||||
|
@ -91,21 +92,21 @@ class Widget : public GuiObject
|
|||
Vec::append(_focusList, list);
|
||||
}
|
||||
|
||||
/** Set/clear WIDGET_ENABLED flag */
|
||||
/** Set/clear FLAG_ENABLED */
|
||||
void setEnabled(bool e);
|
||||
|
||||
void setFlags(int flags) { _flags |= flags; setDirty(); }
|
||||
void clearFlags(int flags) { _flags &= ~flags; setDirty(); }
|
||||
int getFlags() const { return _flags; }
|
||||
void setFlags(uInt32 flags) { _flags |= flags; setDirty(); }
|
||||
void clearFlags(uInt32 flags) { _flags &= ~flags; setDirty(); }
|
||||
uInt32 getFlags() const { return _flags; }
|
||||
|
||||
bool isEnabled() const { return _flags & WIDGET_ENABLED; }
|
||||
bool isVisible() const override { return !(_flags & WIDGET_INVISIBLE); }
|
||||
virtual bool wantsFocus() const { return _flags & WIDGET_RETAIN_FOCUS; }
|
||||
bool wantsTab() const { return _flags & WIDGET_WANTS_TAB; }
|
||||
bool wantsRaw() const { return _flags & WIDGET_WANTS_RAWDATA; }
|
||||
bool isEnabled() const { return _flags & FLAG_ENABLED; }
|
||||
bool isVisible() const override { return !(_flags & FLAG_INVISIBLE); }
|
||||
virtual bool wantsFocus() const { return _flags & FLAG_RETAIN_FOCUS; }
|
||||
bool wantsTab() const { return _flags & FLAG_WANTS_TAB; }
|
||||
bool wantsRaw() const { return _flags & FLAG_WANTS_RAWDATA; }
|
||||
|
||||
void setID(int id) { _id = id; }
|
||||
int getID() const { return _id; }
|
||||
void setID(uInt32 id) { _id = id; }
|
||||
uInt32 getID() const { return _id; }
|
||||
|
||||
virtual const GUI::Font& font() const { return _font; }
|
||||
|
||||
|
@ -135,8 +136,8 @@ class Widget : public GuiObject
|
|||
GuiObject* _boss;
|
||||
const GUI::Font& _font;
|
||||
Widget* _next;
|
||||
int _id;
|
||||
int _flags;
|
||||
uInt32 _id;
|
||||
uInt32 _flags;
|
||||
bool _hasFocus;
|
||||
int _fontWidth;
|
||||
int _fontHeight;
|
||||
|
|
|
@ -31,6 +31,7 @@ MODULE_OBJS := \
|
|||
src/gui/LoggerDialog.o \
|
||||
src/gui/Menu.o \
|
||||
src/gui/MessageBox.o \
|
||||
src/gui/MinUICommandDialog.o\
|
||||
src/gui/OptionsDialog.o \
|
||||
src/gui/PopUpWidget.o \
|
||||
src/gui/ProgressDialog.o \
|
||||
|
|
|
@ -79,6 +79,7 @@ SOURCES_CXX := \
|
|||
$(CORE_DIR)/gui/FileListWidget.cxx \
|
||||
$(CORE_DIR)/gui/JoystickDialog.cxx \
|
||||
$(CORE_DIR)/gui/LoggerDialog.cxx \
|
||||
$(CORE_DIR)/gui/MinUICommandDialog.cxx \
|
||||
$(CORE_DIR)/gui/RadioButtonWidget.cxx \
|
||||
$(CORE_DIR)/gui/SnapshotDialog.cxx \
|
||||
$(CORE_DIR)/gui/TimeLineWidget.cxx \
|
||||
|
|
|
@ -210,6 +210,7 @@
|
|||
<ClCompile Include="..\gui\FileListWidget.cxx" />
|
||||
<ClCompile Include="..\gui\JoystickDialog.cxx" />
|
||||
<ClCompile Include="..\gui\LoggerDialog.cxx" />
|
||||
<ClCompile Include="..\gui\MinUICommandDialog.cxx" />
|
||||
<ClCompile Include="..\gui\RadioButtonWidget.cxx" />
|
||||
<ClCompile Include="..\gui\SnapshotDialog.cxx" />
|
||||
<ClCompile Include="..\gui\StellaSettingsDialog.cxx" />
|
||||
|
@ -401,6 +402,7 @@
|
|||
<ClInclude Include="..\gui\FileListWidget.hxx" />
|
||||
<ClInclude Include="..\gui\JoystickDialog.hxx" />
|
||||
<ClInclude Include="..\gui\LoggerDialog.hxx" />
|
||||
<ClInclude Include="..\gui\MinUICommandDialog.hxx" />
|
||||
<ClInclude Include="..\gui\RadioButtonWidget.hxx" />
|
||||
<ClInclude Include="..\gui\SnapshotDialog.hxx" />
|
||||
<ClInclude Include="..\gui\StellaSettingsDialog.hxx" />
|
||||
|
|
|
@ -41,7 +41,7 @@ StellaLIBRETRO::StellaLIBRETRO()
|
|||
video_aspect_pal = 0;
|
||||
|
||||
video_palette = "standard";
|
||||
video_filter = NTSCFilter::Preset::OFF;
|
||||
video_filter = 0;
|
||||
video_ready = false;
|
||||
|
||||
audio_samples = 0;
|
||||
|
@ -108,7 +108,7 @@ bool StellaLIBRETRO::create(bool logging)
|
|||
//fastscbios
|
||||
// Fast loading of Supercharger BIOS
|
||||
|
||||
settings.setValue("tv.filter", static_cast<int>(video_filter));
|
||||
settings.setValue("tv.filter", video_filter);
|
||||
|
||||
settings.setValue("tv.phosphor", video_phosphor);
|
||||
settings.setValue("tv.phosblend", video_phosphor_blend);
|
||||
|
@ -131,6 +131,7 @@ bool StellaLIBRETRO::create(bool logging)
|
|||
if(myOSystem->createConsole(rom) != EmptyString)
|
||||
return false;
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
if(video_phosphor == "never") setVideoPhosphor(1, video_phosphor_blend);
|
||||
|
||||
|
@ -157,6 +158,10 @@ void StellaLIBRETRO::destroy()
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StellaLIBRETRO::runFrame()
|
||||
{
|
||||
// write ram updates
|
||||
for(int lcv = 0; lcv <= 127; lcv++)
|
||||
myOSystem->console().system().m6532().poke(lcv | 0x80, system_ram[lcv]);
|
||||
|
||||
// poll input right at vsync
|
||||
updateInput();
|
||||
|
||||
|
@ -166,7 +171,8 @@ void StellaLIBRETRO::runFrame()
|
|||
// drain generated audio
|
||||
updateAudio();
|
||||
|
||||
// give user time to respond
|
||||
// refresh ram copy
|
||||
memcpy(system_ram, myOSystem->console().system().m6532().getRAM(), 128);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -250,30 +256,57 @@ size_t StellaLIBRETRO::getStateSize()
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
float StellaLIBRETRO::getVideoAspect()
|
||||
float StellaLIBRETRO::getVideoAspectPar()
|
||||
{
|
||||
uInt32 width = myOSystem->console().tia().width() * 2;
|
||||
float par;
|
||||
|
||||
if (getVideoNTSC())
|
||||
{
|
||||
if (!video_aspect_ntsc)
|
||||
// non-interlace square pixel clock -- 1.0 pixel @ color burst -- double-width pixels
|
||||
par = (6.1363635f / 3.579545454f) / 2;
|
||||
else
|
||||
par = video_aspect_ntsc / 100.0;
|
||||
if (!video_aspect_ntsc)
|
||||
{
|
||||
if (!video_filter)
|
||||
{
|
||||
// non-interlace square pixel clock -- 1.0 pixel @ color burst -- double-width pixels
|
||||
par = (6.1363635f / 3.579545454f) / 2.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
// blargg filter
|
||||
par = 1.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
par = video_aspect_ntsc / 100.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!video_aspect_pal)
|
||||
// non-interlace square pixel clock -- 0.8 pixel @ color burst -- double-width pixels
|
||||
par = (7.3750000f / (4.43361875f * 4/5)) / 2;
|
||||
else
|
||||
par = video_aspect_pal / 100.0;
|
||||
if (!video_aspect_pal)
|
||||
{
|
||||
if (!video_filter)
|
||||
{
|
||||
// non-interlace square pixel clock -- 0.8 pixel @ color burst -- double-width pixels
|
||||
par = (7.3750000f / (4.43361875f * 4.0f / 5.0f)) / 2.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
// blargg filter
|
||||
par = 1.0;
|
||||
}
|
||||
}
|
||||
else
|
||||
par = video_aspect_pal / 100.0;
|
||||
}
|
||||
|
||||
return par;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
float StellaLIBRETRO::getVideoAspect()
|
||||
{
|
||||
uInt32 width = myOSystem->console().tia().width() * 2;
|
||||
|
||||
// display aspect ratio
|
||||
return (width * par) / getVideoHeight();
|
||||
return (width * getVideoAspectPar()) / getVideoHeight();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -322,13 +355,13 @@ void StellaLIBRETRO::setConsoleFormat(uInt32 mode)
|
|||
{
|
||||
switch(mode)
|
||||
{
|
||||
case 0: console_format = "AUTO"; break;
|
||||
case 1: console_format = "NTSC"; break;
|
||||
case 2: console_format = "PAL"; break;
|
||||
case 3: console_format = "SECAM"; break;
|
||||
case 4: console_format = "NTSC50"; break;
|
||||
case 5: console_format = "PAL60"; break;
|
||||
case 6: console_format = "SECAM60"; break;
|
||||
case 0: console_format = "AUTO"; break;
|
||||
case 1: console_format = "NTSC"; break;
|
||||
case 2: console_format = "PAL"; break;
|
||||
case 3: console_format = "SECAM"; break;
|
||||
case 4: console_format = "NTSC50"; break;
|
||||
case 5: console_format = "PAL60"; break;
|
||||
case 6: console_format = "SECAM60"; break;
|
||||
}
|
||||
|
||||
if (system_ready)
|
||||
|
@ -338,7 +371,9 @@ void StellaLIBRETRO::setConsoleFormat(uInt32 mode)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void StellaLIBRETRO::setVideoFilter(uInt32 mode)
|
||||
{
|
||||
if (system_ready && mode <= 5)
|
||||
video_filter = mode;
|
||||
|
||||
if (system_ready)
|
||||
{
|
||||
myOSystem->settings().setValue("tv.filter", mode);
|
||||
myOSystem->frameBuffer().tiaSurface().setNTSC(static_cast<NTSCFilter::Preset>(mode));
|
||||
|
@ -350,9 +385,9 @@ void StellaLIBRETRO::setVideoPalette(uInt32 mode)
|
|||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0: video_palette = "standard"; break;
|
||||
case 1: video_palette = "z26"; break;
|
||||
case 2: video_palette = "custom"; break;
|
||||
case 0: video_palette = "standard"; break;
|
||||
case 1: video_palette = "z26"; break;
|
||||
case 2: video_palette = "custom"; break;
|
||||
}
|
||||
|
||||
if (system_ready)
|
||||
|
@ -367,9 +402,9 @@ void StellaLIBRETRO::setVideoPhosphor(uInt32 mode, uInt32 blend)
|
|||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0: video_phosphor = "byrom"; break;
|
||||
case 1: video_phosphor = "never"; break;
|
||||
case 2: video_phosphor = "always"; break;
|
||||
case 0: video_phosphor = "byrom"; break;
|
||||
case 1: video_phosphor = "never"; break;
|
||||
case 2: video_phosphor = "always"; break;
|
||||
}
|
||||
|
||||
video_phosphor_blend = blend;
|
||||
|
@ -381,9 +416,9 @@ void StellaLIBRETRO::setVideoPhosphor(uInt32 mode, uInt32 blend)
|
|||
|
||||
switch (mode)
|
||||
{
|
||||
case 0: myOSystem->frameBuffer().tiaSurface().enablePhosphor(phosphor_default, blend); break;
|
||||
case 1: myOSystem->frameBuffer().tiaSurface().enablePhosphor(false, blend); break;
|
||||
case 2: myOSystem->frameBuffer().tiaSurface().enablePhosphor(true, blend); break;
|
||||
case 0: myOSystem->frameBuffer().tiaSurface().enablePhosphor(phosphor_default, blend); break;
|
||||
case 1: myOSystem->frameBuffer().tiaSurface().enablePhosphor(false, blend); break;
|
||||
case 2: myOSystem->frameBuffer().tiaSurface().enablePhosphor(true, blend); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -393,9 +428,9 @@ void StellaLIBRETRO::setAudioStereo(int mode)
|
|||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0: audio_mode = "byrom"; break;
|
||||
case 1: audio_mode = "mono"; break;
|
||||
case 2: audio_mode = "stereo"; break;
|
||||
case 0: audio_mode = "byrom"; break;
|
||||
case 1: audio_mode = "mono"; break;
|
||||
case 2: audio_mode = "stereo"; break;
|
||||
}
|
||||
|
||||
if (system_ready)
|
||||
|
|
|
@ -23,9 +23,11 @@
|
|||
|
||||
#include "Console.hxx"
|
||||
#include "ConsoleTiming.hxx"
|
||||
#include "Control.hxx"
|
||||
#include "EmulationTiming.hxx"
|
||||
#include "EventHandler.hxx"
|
||||
#include "M6532.hxx"
|
||||
#include "Paddles.hxx"
|
||||
#include "System.hxx"
|
||||
#include "TIA.hxx"
|
||||
#include "TIASurface.hxx"
|
||||
|
@ -60,13 +62,14 @@ class StellaLIBRETRO
|
|||
uInt32 getROMSize() { return rom_size; }
|
||||
uInt32 getROMMax() { return 512 * 1024; }
|
||||
|
||||
//uInt8* getRAM() { return myOSystem->console().system().m6532().getRAM(); }
|
||||
//uInt32 getRAMSize() { return 128; }
|
||||
uInt8* getRAM() { return system_ram; }
|
||||
uInt32 getRAMSize() { return 128; }
|
||||
|
||||
size_t getStateSize();
|
||||
|
||||
bool getConsoleNTSC() { return console_timing == ConsoleTiming::ntsc; }
|
||||
|
||||
float getVideoAspectPar();
|
||||
float getVideoAspect();
|
||||
bool getVideoNTSC();
|
||||
float getVideoRate() { return getVideoNTSC() ? 60.0 : 50.0; }
|
||||
|
@ -108,6 +111,17 @@ class StellaLIBRETRO
|
|||
|
||||
void setInputEvent(Event::Type type, Int32 state) { myOSystem->eventHandler().handleEvent(type, state); }
|
||||
|
||||
Controller::Type getLeftControllerType() { return myOSystem->console().leftController().type(); }
|
||||
Controller::Type getRightControllerType() { return myOSystem->console().rightController().type(); }
|
||||
|
||||
void setPaddleJoypadSensitivity(int sensitivity)
|
||||
{
|
||||
if(getLeftControllerType() == Controller::Type::Paddles)
|
||||
static_cast<Paddles&>(myOSystem->console().leftController()).setDigitalSensitivity(sensitivity);
|
||||
if(getRightControllerType() == Controller::Type::Paddles)
|
||||
static_cast<Paddles&>(myOSystem->console().rightController()).setDigitalSensitivity(sensitivity);
|
||||
}
|
||||
|
||||
protected:
|
||||
void updateInput();
|
||||
void updateVideo();
|
||||
|
@ -136,8 +150,10 @@ class StellaLIBRETRO
|
|||
unique_ptr<Int16[]> audio_buffer;
|
||||
uInt32 audio_samples;
|
||||
|
||||
// (31440 rate / 50 Hz) * 16-bit stereo * 1.25x padding
|
||||
static const uInt32 audio_buffer_max = (31440 / 50 * 4 * 5) / 4;
|
||||
// (31440 rate / 50 Hz) * 16-bit stereo * 1.25x padding
|
||||
const uInt32 audio_buffer_max = (31440 / 50 * 4 * 5) / 4;
|
||||
|
||||
uInt8 system_ram[128];
|
||||
|
||||
private:
|
||||
string video_palette;
|
||||
|
@ -146,7 +162,7 @@ class StellaLIBRETRO
|
|||
|
||||
uInt32 video_aspect_ntsc;
|
||||
uInt32 video_aspect_pal;
|
||||
NTSCFilter::Preset video_filter;
|
||||
uInt32 video_filter;
|
||||
|
||||
string audio_mode;
|
||||
|
||||
|
|
|
@ -32,10 +32,14 @@ static struct retro_system_av_info g_av_info;
|
|||
static int setting_ntsc, setting_pal;
|
||||
static int setting_stereo, setting_filter, setting_palette;
|
||||
static int setting_phosphor, setting_console, setting_phosphor_blend;
|
||||
static int stella_paddle_joypad_sensitivity;
|
||||
static int setting_crop_hoverscan, crop_left;
|
||||
|
||||
static bool system_reset;
|
||||
|
||||
static unsigned input_devices[2];
|
||||
static unsigned input_devices[4];
|
||||
static Controller::Type input_type[2];
|
||||
|
||||
|
||||
// TODO input:
|
||||
// https://github.com/libretro/blueMSX-libretro/blob/master/libretro.c
|
||||
|
@ -58,17 +62,68 @@ static void update_input()
|
|||
|
||||
#define EVENT stella.setInputEvent
|
||||
|
||||
EVENT(Event::JoystickZeroUp, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
EVENT(Event::JoystickZeroDown, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
EVENT(Event::JoystickZeroLeft, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::JoystickZeroRight, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::JoystickZeroFire, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
switch(input_type[0])
|
||||
{
|
||||
case Controller::Type::BoosterGrip:
|
||||
EVENT(Event::JoystickZeroFire5, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A));
|
||||
EVENT(Event::JoystickZeroFire9, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y));
|
||||
// Fallthrough
|
||||
|
||||
case Controller::Type::Joystick:
|
||||
default:
|
||||
EVENT(Event::JoystickZeroUp, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
EVENT(Event::JoystickZeroDown, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
// Fallthrough
|
||||
|
||||
case Controller::Type::Driving:
|
||||
EVENT(Event::JoystickZeroLeft, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::JoystickZeroRight, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::JoystickZeroFire, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
break;
|
||||
|
||||
case Controller::Type::Paddles:
|
||||
EVENT(Event::PaddleZeroIncrease, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::PaddleZeroDecrease, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::PaddleZeroFire, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
//WIP = Event::PaddleZeroAnalog
|
||||
|
||||
EVENT(Event::PaddleOneIncrease, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::PaddleOneDecrease, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::PaddleOneFire, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
switch(input_type[1])
|
||||
{
|
||||
case Controller::Type::BoosterGrip:
|
||||
EVENT(Event::JoystickOneFire5, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A));
|
||||
EVENT(Event::JoystickOneFire9, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y));
|
||||
// Fallthrough
|
||||
|
||||
case Controller::Type::Joystick:
|
||||
default:
|
||||
EVENT(Event::JoystickOneUp, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
EVENT(Event::JoystickOneDown, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
// Fallthrough
|
||||
|
||||
case Controller::Type::Driving:
|
||||
EVENT(Event::JoystickOneLeft, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::JoystickOneRight, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::JoystickOneFire, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
break;
|
||||
|
||||
case Controller::Type::Paddles:
|
||||
EVENT(Event::PaddleTwoIncrease, input_state_cb(2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::PaddleTwoDecrease, input_state_cb(2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::PaddleTwoFire, input_state_cb(2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
|
||||
EVENT(Event::PaddleThreeIncrease, input_state_cb(3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::PaddleThreeDecrease, input_state_cb(3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::PaddleThreeFire, input_state_cb(3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
break;
|
||||
}
|
||||
|
||||
EVENT(Event::JoystickOneUp, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP));
|
||||
EVENT(Event::JoystickOneDown, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN));
|
||||
EVENT(Event::JoystickOneLeft, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT));
|
||||
EVENT(Event::JoystickOneRight, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT));
|
||||
EVENT(Event::JoystickOneFire, input_state_cb(1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B));
|
||||
|
||||
EVENT(Event::ConsoleLeftDiffA, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L));
|
||||
EVENT(Event::ConsoleLeftDiffB, input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2));
|
||||
|
@ -112,7 +167,7 @@ static void update_variables(bool init = false)
|
|||
#define RETRO_GET(x) \
|
||||
var.key = x; \
|
||||
var.value = NULL; \
|
||||
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
||||
if(environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||
|
||||
RETRO_GET("stella_filter")
|
||||
{
|
||||
|
@ -133,6 +188,13 @@ static void update_variables(bool init = false)
|
|||
}
|
||||
}
|
||||
|
||||
RETRO_GET("stella_crop_hoverscan")
|
||||
{
|
||||
setting_crop_hoverscan = !strcmp(var.value, "enabled");
|
||||
|
||||
geometry_update = true;
|
||||
}
|
||||
|
||||
RETRO_GET("stella_ntsc_aspect")
|
||||
{
|
||||
int value = 0;
|
||||
|
@ -246,9 +308,25 @@ static void update_variables(bool init = false)
|
|||
setting_phosphor_blend = value;
|
||||
}
|
||||
}
|
||||
|
||||
RETRO_GET("stella_paddle_joypad_sensitivity")
|
||||
{
|
||||
int value = 0;
|
||||
|
||||
value = atoi(var.value);
|
||||
|
||||
if(stella_paddle_joypad_sensitivity != value)
|
||||
{
|
||||
if(!init) stella.setPaddleJoypadSensitivity(value);
|
||||
|
||||
stella_paddle_joypad_sensitivity = value;
|
||||
}
|
||||
}
|
||||
|
||||
if(!init && !system_reset)
|
||||
{
|
||||
crop_left = setting_crop_hoverscan ? (stella.getVideoZoom() == 2 ? 26 : 8) : 0;
|
||||
|
||||
if(geometry_update) update_geometry();
|
||||
}
|
||||
|
||||
|
@ -261,16 +339,22 @@ static bool reset_system()
|
|||
// clean restart
|
||||
stella.destroy();
|
||||
|
||||
// apply libretro settings first
|
||||
// apply pre-boot settings first
|
||||
update_variables(true);
|
||||
|
||||
// start system
|
||||
if(!stella.create(log_cb ? true : false)) return false;
|
||||
|
||||
// reset libretro window
|
||||
update_geometry();
|
||||
// get auto-detect controllers
|
||||
input_type[0] = stella.getLeftControllerType();
|
||||
input_type[1] = stella.getRightControllerType();
|
||||
stella.setPaddleJoypadSensitivity(stella_paddle_joypad_sensitivity);
|
||||
|
||||
system_reset = false;
|
||||
|
||||
// reset libretro window, apply post-boot settings
|
||||
update_variables(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -316,41 +400,41 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
|
|||
info->timing.fps = stella.getVideoRate();
|
||||
info->timing.sample_rate = stella.getAudioRate();
|
||||
|
||||
info->geometry.base_width = stella.getRenderWidth();
|
||||
info->geometry.base_width = stella.getRenderWidth() - crop_left * (stella.getVideoZoom() == 1 ? 2 : 1);
|
||||
info->geometry.base_height = stella.getRenderHeight();
|
||||
|
||||
info->geometry.max_width = stella.getVideoWidthMax();
|
||||
info->geometry.max_height = stella.getVideoHeightMax();
|
||||
|
||||
info->geometry.aspect_ratio = stella.getVideoAspect();
|
||||
info->geometry.aspect_ratio = stella.getVideoAspectPar() * (float) info->geometry.base_width / (float) info->geometry.base_height;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void retro_set_controller_port_device(unsigned port, unsigned device)
|
||||
{
|
||||
if(port < 2)
|
||||
if(port < 4)
|
||||
{
|
||||
switch (device)
|
||||
{
|
||||
case RETRO_DEVICE_NONE:
|
||||
input_devices[port] = RETRO_DEVICE_NONE;
|
||||
break;
|
||||
case RETRO_DEVICE_NONE:
|
||||
input_devices[port] = RETRO_DEVICE_NONE;
|
||||
break;
|
||||
|
||||
case RETRO_DEVICE_JOYPAD:
|
||||
input_devices[port] = RETRO_DEVICE_JOYPAD;
|
||||
break;
|
||||
case RETRO_DEVICE_JOYPAD:
|
||||
input_devices[port] = RETRO_DEVICE_JOYPAD;
|
||||
break;
|
||||
|
||||
case RETRO_DEVICE_MOUSE:
|
||||
input_devices[port] = RETRO_DEVICE_MOUSE;
|
||||
break;
|
||||
case RETRO_DEVICE_MOUSE:
|
||||
input_devices[port] = RETRO_DEVICE_MOUSE;
|
||||
break;
|
||||
|
||||
case RETRO_DEVICE_KEYBOARD:
|
||||
input_devices[port] = RETRO_DEVICE_KEYBOARD;
|
||||
break;
|
||||
case RETRO_DEVICE_KEYBOARD:
|
||||
input_devices[port] = RETRO_DEVICE_KEYBOARD;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (log_cb) log_cb(RETRO_LOG_ERROR, "%s\n", "[libretro]: Invalid device, setting type to RETRO_DEVICE_JOYPAD ...");
|
||||
input_devices[port] = RETRO_DEVICE_JOYPAD;
|
||||
default:
|
||||
if (log_cb) log_cb(RETRO_LOG_ERROR, "%s\n", "[libretro]: Invalid device, setting type to RETRO_DEVICE_JOYPAD ...");
|
||||
input_devices[port] = RETRO_DEVICE_JOYPAD;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -362,14 +446,16 @@ void retro_set_environment(retro_environment_t cb)
|
|||
|
||||
struct retro_variable variables[] = {
|
||||
// Adding more variables and rearranging them is safe.
|
||||
{ "stella_console", "Console display; auto|ntsc|pal|secam|ntsc50|pal60|secam60"},
|
||||
{ "stella_filter", "TV effects; disabled|composite|s-video|rgb|badly adjusted"},
|
||||
{ "stella_ntsc_aspect", "NTSC aspect %; par|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|50|75|76|77|78|79|80|81|82|83|84|85"},
|
||||
{ "stella_pal_aspect", "PAL aspect %; par|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|50|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103"},
|
||||
{ "stella_stereo", "Stereo sound; auto|off|on"},
|
||||
{ "stella_palette", "Palette colors; standard|z26"},
|
||||
{ "stella_phosphor", "Phosphor mode; auto|off|on"},
|
||||
{ "stella_phosphor_blend", "Phosphor blend %; 60|65|70|75|80|85|90|95|100|0|5|10|15|20|25|30|35|40|45|50|55"},
|
||||
{ "stella_console", "Console display; auto|ntsc|pal|secam|ntsc50|pal60|secam60" },
|
||||
{ "stella_filter", "TV effects; disabled|composite|s-video|rgb|badly adjusted" },
|
||||
{ "stella_ntsc_aspect", "NTSC aspect %; par|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|50|75|76|77|78|79|80|81|82|83|84|85" },
|
||||
{ "stella_pal_aspect", "PAL aspect %; par|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|50|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103" },
|
||||
{ "stella_crop_hoverscan", "Crop horizontal overscan; disabled|enabled" },
|
||||
{ "stella_stereo", "Stereo sound; auto|off|on" },
|
||||
{ "stella_palette", "Palette colors; standard|z26" },
|
||||
{ "stella_phosphor", "Phosphor mode; auto|off|on" },
|
||||
{ "stella_phosphor_blend", "Phosphor blend %; 60|65|70|75|80|85|90|95|100|0|5|10|15|20|25|30|35|40|45|50|55" },
|
||||
{ "stella_paddle_joypad_sensitivity", "Paddle joypad sensitivity; 3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|1|2" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
|
@ -399,6 +485,8 @@ bool retro_load_game(const struct retro_game_info *info)
|
|||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" },
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" },
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Fire" },
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Trigger" },
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Booster" },
|
||||
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L, "Left Difficulty A" },
|
||||
{ 0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2, "Left Difficulty B" },
|
||||
|
@ -414,6 +502,16 @@ bool retro_load_game(const struct retro_game_info *info)
|
|||
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN, "Down" },
|
||||
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" },
|
||||
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Fire" },
|
||||
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A, "Trigger" },
|
||||
{ 1, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y, "Booster" },
|
||||
|
||||
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" },
|
||||
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" },
|
||||
{ 2, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Fire" },
|
||||
|
||||
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT, "Left" },
|
||||
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT, "Right" },
|
||||
{ 3, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B, "Fire" },
|
||||
|
||||
{ 0 },
|
||||
};
|
||||
|
@ -474,7 +572,7 @@ void retro_run()
|
|||
//printf("retro_run - %d %d %d - %d\n", stella.getVideoWidth(), stella.getVideoHeight(), stella.getVideoPitch(), stella.getAudioSize() );
|
||||
|
||||
if(stella.getVideoReady())
|
||||
video_cb(stella.getVideoBuffer(), stella.getVideoWidth(), stella.getVideoHeight(), stella.getVideoPitch());
|
||||
video_cb(reinterpret_cast<uInt32*>(stella.getVideoBuffer()) + crop_left, stella.getVideoWidth() - crop_left, stella.getVideoHeight(), stella.getVideoPitch());
|
||||
|
||||
if(stella.getAudioReady())
|
||||
audio_batch_cb(stella.getAudioBuffer(), stella.getAudioSize());
|
||||
|
@ -515,8 +613,11 @@ void *retro_get_memory_data(unsigned id)
|
|||
{
|
||||
switch (id)
|
||||
{
|
||||
//case RETRO_MEMORY_SYSTEM_RAM: return stella.getRAM();
|
||||
default: return NULL;
|
||||
case RETRO_MEMORY_SYSTEM_RAM:
|
||||
return stella.getRAM();
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -525,8 +626,11 @@ size_t retro_get_memory_size(unsigned id)
|
|||
{
|
||||
switch (id)
|
||||
{
|
||||
//case RETRO_MEMORY_SYSTEM_RAM: return stella.getRAMSize();
|
||||
default: return 0;
|
||||
case RETRO_MEMORY_SYSTEM_RAM:
|
||||
return stella.getRAMSize();
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -233,6 +233,8 @@
|
|||
DC21E5C021CA903E007D0E1A /* OSystemMACOS.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC21E5BA21CA903E007D0E1A /* OSystemMACOS.hxx */; };
|
||||
DC21E5C121CA903E007D0E1A /* SerialPortMACOS.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC21E5BB21CA903E007D0E1A /* SerialPortMACOS.cxx */; };
|
||||
DC21E5C221CA903E007D0E1A /* SerialPortMACOS.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC21E5BC21CA903E007D0E1A /* SerialPortMACOS.hxx */; };
|
||||
DC2410E32274BDA8007A4CBF /* MinUICommandDialog.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC2410E12274BDA7007A4CBF /* MinUICommandDialog.hxx */; };
|
||||
DC2410E42274BDA8007A4CBF /* MinUICommandDialog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC2410E22274BDA8007A4CBF /* MinUICommandDialog.cxx */; };
|
||||
DC2874071F8F2278004BF21A /* TrapArray.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC2874061F8F2278004BF21A /* TrapArray.hxx */; };
|
||||
DC2AADAE194F389C0026C7A4 /* CartDASH.cxx in Sources */ = {isa = PBXBuildFile; fileRef = DC2AADAA194F389C0026C7A4 /* CartDASH.cxx */; };
|
||||
DC2AADAF194F389C0026C7A4 /* CartDASH.hxx in Headers */ = {isa = PBXBuildFile; fileRef = DC2AADAB194F389C0026C7A4 /* CartDASH.hxx */; };
|
||||
|
@ -945,6 +947,8 @@
|
|||
DC21E5BA21CA903E007D0E1A /* OSystemMACOS.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = OSystemMACOS.hxx; sourceTree = SOURCE_ROOT; };
|
||||
DC21E5BB21CA903E007D0E1A /* SerialPortMACOS.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SerialPortMACOS.cxx; sourceTree = SOURCE_ROOT; };
|
||||
DC21E5BC21CA903E007D0E1A /* SerialPortMACOS.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = SerialPortMACOS.hxx; sourceTree = SOURCE_ROOT; };
|
||||
DC2410E12274BDA7007A4CBF /* MinUICommandDialog.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MinUICommandDialog.hxx; sourceTree = "<group>"; };
|
||||
DC2410E22274BDA8007A4CBF /* MinUICommandDialog.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MinUICommandDialog.cxx; sourceTree = "<group>"; };
|
||||
DC2874061F8F2278004BF21A /* TrapArray.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = TrapArray.hxx; sourceTree = "<group>"; };
|
||||
DC2AADAA194F389C0026C7A4 /* CartDASH.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CartDASH.cxx; sourceTree = "<group>"; };
|
||||
DC2AADAB194F389C0026C7A4 /* CartDASH.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = CartDASH.hxx; sourceTree = "<group>"; };
|
||||
|
@ -1997,6 +2001,8 @@
|
|||
2DDBEAC3084578BF00812C11 /* Menu.hxx */,
|
||||
DC98F35411F5B56200AA520F /* MessageBox.cxx */,
|
||||
DC98F35511F5B56200AA520F /* MessageBox.hxx */,
|
||||
DC2410E22274BDA8007A4CBF /* MinUICommandDialog.cxx */,
|
||||
DC2410E12274BDA7007A4CBF /* MinUICommandDialog.hxx */,
|
||||
2DDBEAC4084578BF00812C11 /* OptionsDialog.cxx */,
|
||||
2DDBEAC5084578BF00812C11 /* OptionsDialog.hxx */,
|
||||
2DDBEAC6084578BF00812C11 /* PopUpWidget.cxx */,
|
||||
|
@ -2566,6 +2572,7 @@
|
|||
DC676A4A1729A0B000E4E73D /* CartCTYWidget.hxx in Headers */,
|
||||
DC676A4C1729A0B000E4E73D /* CartDPCPlusWidget.hxx in Headers */,
|
||||
DC676A4E1729A0B000E4E73D /* CartDPCWidget.hxx in Headers */,
|
||||
DC2410E32274BDA8007A4CBF /* MinUICommandDialog.hxx in Headers */,
|
||||
DCCA26B31FA64D5E000EE4D8 /* AbstractFrameManager.hxx in Headers */,
|
||||
DC3EE8631E2C0E6D00905161 /* inffast.h in Headers */,
|
||||
DC676A501729A0B000E4E73D /* CartE0Widget.hxx in Headers */,
|
||||
|
@ -2808,6 +2815,7 @@
|
|||
2D9174CF09BA90380026E9FF /* CpuDebug.cxx in Sources */,
|
||||
2D9174F109BA90380026E9FF /* InputTextDialog.cxx in Sources */,
|
||||
DC6DC920205DB879004A5FC3 /* PJoystickHandler.cxx in Sources */,
|
||||
DC2410E42274BDA8007A4CBF /* MinUICommandDialog.cxx in Sources */,
|
||||
DC74E5C6198AF12700F37E36 /* CartDASHWidget.cxx in Sources */,
|
||||
2D9174F209BA90380026E9FF /* CheckListWidget.cxx in Sources */,
|
||||
2D9174F309BA90380026E9FF /* StringListWidget.cxx in Sources */,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
all : evdev-joystick
|
||||
|
||||
evdev-joystick: evdev-joystick.c
|
||||
gcc -Wall -O2 -o evdev-joystick evdev-joystick.c
|
||||
$(CC) -Wall -O2 -o evdev-joystick evdev-joystick.c
|
||||
|
||||
install: evdev-joystick 80-stelladaptor-joystick.rules
|
||||
install -s evdev-joystick /usr/local/bin/
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <getopt.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
|
@ -32,16 +33,20 @@
|
|||
*/
|
||||
#define test_bit(bit, array) (array[bit/8] & (1<<(bit%8)))
|
||||
|
||||
/* The default location for evdev devices in Linux */
|
||||
// The default location for evdev devices in Linux
|
||||
#define EVDEV_DIR "/dev/input/by-id/"
|
||||
|
||||
/* Function signatures; see actual functions for documentation */
|
||||
////////////////////////////////////////////////////////////////
|
||||
// Function signatures; see actual functions for documentation
|
||||
void help(void);
|
||||
void listDevices(void);
|
||||
void printAxisType(int i);
|
||||
int showCalibration(const char* const evdev);
|
||||
int setDeadzoneAndFuzz(const char* const evdev, int axisindex,
|
||||
__s32 deadzonevalue, __s32 fuzzvalue);
|
||||
int setAxisInfo(const char* evdev, int axisindex,
|
||||
__s32 minvalue, __s32 maxvalue,
|
||||
__s32 deadzonevalue, __s32 fuzzvalue);
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void help(void)
|
||||
|
@ -51,6 +56,8 @@ void help(void)
|
|||
" --listdevs, --l List all joystick devices found\n"
|
||||
" --showcal, --s [path] Show current calibration for joystick device\n"
|
||||
" --evdev, --e [path] Set the joystick device to modify\n"
|
||||
" --minimum, --m [val] Change minimum for current joystick\n"
|
||||
" --maximum, --M [val] Change maximum for current joystick\n"
|
||||
" --deadzone, --d [val] Change deadzone for current joystick\n"
|
||||
" --fuzz, --f [val] Change fuzz for current joystick\n"
|
||||
" --axis, --a [val] The axis to modify for current joystick (by default, all axes)\n"
|
||||
|
@ -61,18 +68,21 @@ void help(void)
|
|||
"To set the deadzone values:\n"
|
||||
" evdev-joystick [ --e /path/to/event/device/file --d deadzone_value [ --a axis_index ] ]\n"
|
||||
"\n"
|
||||
"To set the minimum and maximum range values:\n"
|
||||
" evdev-joystick [ --e /path/to/event/device/file --m minimum_value --M maximum_value [ --a axis_index ] ]\n"
|
||||
"\n"
|
||||
"Example:\n"
|
||||
"\n"
|
||||
"I want to see the calibration values of my event managed joystick:\n"
|
||||
" evdev-joystick --s /dev/input/event6\n"
|
||||
"\n"
|
||||
"Supported Absolute axes:\n"
|
||||
" Absolute axis 0x00 (0) (X Axis) (min: 0, max: 16383, flatness: 1023 (=6.24%), fuzz: 63)\n"
|
||||
" Absolute axis 0x01 (1) (Y Axis) (min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x02 (2) (Z Axis) (min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x05 (5) (Z Rate Axis) (min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x10 (16) (Hat zero, x axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)\n"
|
||||
" Absolute axis 0x11 (17) (Hat zero, y axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)\n"
|
||||
" Absolute axis 0x00 (0) (X Axis) (value: 387, min: 0, max: 16383, flatness: 1023 (=6.24%), fuzz: 63)\n"
|
||||
" Absolute axis 0x01 (1) (Y Axis) (value: 216, min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x02 (2) (Z Axis) (value: 0, min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x05 (5) (Z Rate Axis) (value: 101, min: 0, max: 255, flatness: 15 (=5.88%), fuzz: 0)\n"
|
||||
" Absolute axis 0x10 (16) (Hat zero, x axis) (value: 0, min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)\n"
|
||||
" Absolute axis 0x11 (17) (Hat zero, y axis) (value: 0, min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)\n"
|
||||
"\n"
|
||||
"I want to get rid of the deadzone on all axes on my joystick:\n"
|
||||
" evdev-joystick --e /dev/input/event6 --d 0\n"
|
||||
|
@ -167,10 +177,10 @@ int showCalibration(const char* const evdev)
|
|||
if(ioctl(fd, EVIOCGABS(axisindex), &abs_features))
|
||||
perror("evdev EVIOCGABS ioctl");
|
||||
|
||||
percent_deadzone = (double)(abs_features.flat * 100.0 / abs_features.maximum);
|
||||
printf("(min: %d, max: %d, flatness: %d (=%.2f%%), fuzz: %d)\n",
|
||||
abs_features.minimum, abs_features.maximum, abs_features.flat,
|
||||
percent_deadzone, abs_features.fuzz);
|
||||
percent_deadzone = (double)abs_features.flat * 100 / (double)abs_features.maximum;
|
||||
printf("(value: %d, min: %d, max: %d, flatness: %d (=%.2f%%), fuzz: %d)\n",
|
||||
abs_features.value, abs_features.minimum, abs_features.maximum,
|
||||
abs_features.flat, percent_deadzone, abs_features.fuzz);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -179,8 +189,9 @@ int showCalibration(const char* const evdev)
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
int setDeadzoneAndFuzz(const char* const evdev, int axisindex,
|
||||
__s32 deadzonevalue, __s32 fuzzvalue)
|
||||
int setAxisInfo(const char* evdev, int axisindex,
|
||||
__s32 minvalue, __s32 maxvalue,
|
||||
__s32 deadzonevalue, __s32 fuzzvalue)
|
||||
{
|
||||
int fd = -1;
|
||||
uint8_t abs_bitmask[ABS_MAX/8 + 1];
|
||||
|
@ -218,7 +229,19 @@ int setDeadzoneAndFuzz(const char* const evdev, int axisindex,
|
|||
return 1;
|
||||
}
|
||||
|
||||
if(deadzonevalue != -1)
|
||||
if(minvalue != INT_MIN)
|
||||
{
|
||||
printf("Setting min value to : %d\n", minvalue);
|
||||
abs_features.minimum = minvalue;
|
||||
}
|
||||
|
||||
if(maxvalue != INT_MIN)
|
||||
{
|
||||
printf("Setting max value to : %d\n", maxvalue);
|
||||
abs_features.maximum = maxvalue;
|
||||
}
|
||||
|
||||
if(deadzonevalue != INT_MIN)
|
||||
{
|
||||
if(deadzonevalue < abs_features.minimum ||
|
||||
deadzonevalue > abs_features.maximum )
|
||||
|
@ -232,7 +255,7 @@ int setDeadzoneAndFuzz(const char* const evdev, int axisindex,
|
|||
abs_features.flat = deadzonevalue;
|
||||
}
|
||||
|
||||
if(fuzzvalue != -1)
|
||||
if(fuzzvalue != INT_MIN)
|
||||
{
|
||||
if(fuzzvalue < abs_features.minimum ||
|
||||
fuzzvalue > abs_features.maximum )
|
||||
|
@ -256,10 +279,10 @@ int setDeadzoneAndFuzz(const char* const evdev, int axisindex,
|
|||
perror("evdev EVIOCGABS ioctl");
|
||||
return 1;
|
||||
}
|
||||
percent_deadzone = (double)(abs_features.flat * 100.0 / abs_features.maximum);
|
||||
printf(" (min: %d, max: %d, flatness: %d (=%.2f%%), fuzz: %d)\n",
|
||||
abs_features.minimum, abs_features.maximum, abs_features.flat,
|
||||
percent_deadzone, abs_features.fuzz);
|
||||
percent_deadzone = (double)abs_features.flat * 100 / (double)abs_features.maximum;
|
||||
printf(" (value: %d, min: %d, max: %d, flatness: %d (=%.2f%%), fuzz: %d)\n",
|
||||
abs_features.value, abs_features.minimum, abs_features.maximum,
|
||||
abs_features.flat, percent_deadzone, abs_features.fuzz);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -272,7 +295,7 @@ int main(int argc, char* argv[])
|
|||
{
|
||||
char* evdevice = NULL;
|
||||
int c, axisindex = -1;
|
||||
__s32 flat = -1, fuzz = -1;
|
||||
__s32 min = INT_MIN, max = INT_MIN, flat = INT_MIN, fuzz = INT_MIN;
|
||||
|
||||
// Show help by default
|
||||
if(argc == 1)
|
||||
|
@ -289,6 +312,8 @@ int main(int argc, char* argv[])
|
|||
{ "listdevs", no_argument, 0, 'l' },
|
||||
{ "showcal", required_argument, 0, 's' },
|
||||
{ "evdev", required_argument, 0, 'e' },
|
||||
{ "minimum", required_argument, 0, 'm' },
|
||||
{ "maximum", required_argument, 0, 'M' },
|
||||
{ "deadzone", required_argument, 0, 'd' },
|
||||
{ "fuzz", required_argument, 0, 'f' },
|
||||
{ "axis", required_argument, 0, 'a' },
|
||||
|
@ -297,7 +322,7 @@ int main(int argc, char* argv[])
|
|||
// getopt_long stores the option index here
|
||||
int option_index = 0;
|
||||
|
||||
c = getopt_long(argc, argv, "h:l:s:e:d:f:a:", long_options, &option_index);
|
||||
c = getopt_long(argc, argv, "h:l:s:e:d:m:M:f:a:", long_options, &option_index);
|
||||
|
||||
// Detect the end of the options
|
||||
if(c == -1)
|
||||
|
@ -338,6 +363,16 @@ int main(int argc, char* argv[])
|
|||
printf("New dead zone value: %d\n", flat);
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
min = atoi(optarg);
|
||||
printf("New min value: %d\n", min);
|
||||
break;
|
||||
|
||||
case 'M':
|
||||
max = atoi(optarg);
|
||||
printf("New max value: %d\n", max);
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
fuzz = atoi(optarg);
|
||||
printf("New fuzz value: %d\n", fuzz);
|
||||
|
@ -366,7 +401,7 @@ int main(int argc, char* argv[])
|
|||
putchar('\n');
|
||||
}
|
||||
|
||||
if(flat != -1 || fuzz != -1)
|
||||
if(min != INT_MIN || max != INT_MIN || flat != INT_MIN || fuzz != INT_MIN)
|
||||
{
|
||||
if(evdevice == NULL)
|
||||
{
|
||||
|
@ -377,20 +412,28 @@ int main(int argc, char* argv[])
|
|||
{
|
||||
if(axisindex == -1)
|
||||
{
|
||||
if(flat != -1)
|
||||
if(min != INT_MIN)
|
||||
printf( "Trying to set all axes minimum to: %d\n", min);
|
||||
if(max != INT_MIN)
|
||||
printf( "Trying to set all axes maximum to: %d\n", max);
|
||||
if(flat != INT_MIN)
|
||||
printf( "Trying to set all axes deadzone to: %d\n", flat);
|
||||
if(fuzz != -1)
|
||||
if(fuzz != INT_MIN)
|
||||
printf( "Trying to set all axes fuzz to: %d\n", fuzz);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(flat != -1)
|
||||
if(min != INT_MIN)
|
||||
printf( "Trying to set axis %d minimum to: %d\n", axisindex, min);
|
||||
if(max != INT_MIN)
|
||||
printf( "Trying to set axis %d maximum to: %d\n", axisindex, max);
|
||||
if(flat != INT_MIN)
|
||||
printf( "Trying to set axis %d deadzone to: %d\n", axisindex, flat);
|
||||
if(fuzz != -1)
|
||||
if(fuzz != INT_MIN)
|
||||
printf( "Trying to set axis %d fuzz to: %d\n", axisindex, fuzz);
|
||||
}
|
||||
|
||||
setDeadzoneAndFuzz(evdevice, axisindex, flat, fuzz);
|
||||
setAxisInfo(evdevice, axisindex, min, max, flat, fuzz);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ SettingsR77::SettingsR77()
|
|||
setPermanent("audio.resampling_quality", "2");
|
||||
setPermanent("audio.sample_rate", "48000");
|
||||
setPermanent("audio.stereo", "0");
|
||||
setPermanent("audio.volume", "80");
|
||||
setPermanent("audio.volume", "100");
|
||||
|
||||
setPermanent("romdir", "/mnt/games");
|
||||
setPermanent("snapsavedir", "/mnt/stella/snapshots");
|
||||
|
@ -55,12 +55,22 @@ SettingsR77::SettingsR77()
|
|||
setPermanent("exitlauncher", "true");
|
||||
|
||||
setTemporary("minimal_ui", true);
|
||||
setPermanent("basic_settings", true);
|
||||
|
||||
setPermanent("dev.settings", false);
|
||||
setPermanent("plr.timemachine", false);
|
||||
// record states for 60 seconds
|
||||
setPermanent("plr.timemachine", true);
|
||||
setPermanent("plr.tm.size", 60);
|
||||
setPermanent("plr.tm.uncompressed", 60);
|
||||
setPermanent("plr.tm.interval", "1s");
|
||||
|
||||
setPermanent("threads", "1");
|
||||
setPermanent("tv.filter", "3");
|
||||
|
||||
// all TV effects off by default (aligned to StellaSettingsDialog defaults!)
|
||||
setPermanent("tv.filter", "0");
|
||||
setPermanent("tv.phosphor", "always");
|
||||
setPermanent("tv.phosblend", "0");
|
||||
setPermanent("tv.scanlines", "0");
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -501,6 +501,7 @@
|
|||
<ClCompile Include="..\gui\FileListWidget.cxx" />
|
||||
<ClCompile Include="..\gui\JoystickDialog.cxx" />
|
||||
<ClCompile Include="..\gui\LoggerDialog.cxx" />
|
||||
<ClCompile Include="..\gui\MinUICommandDialog.cxx" />
|
||||
<ClCompile Include="..\gui\RadioButtonWidget.cxx" />
|
||||
<ClCompile Include="..\gui\SnapshotDialog.cxx" />
|
||||
<ClCompile Include="..\gui\StellaSettingsDialog.cxx" />
|
||||
|
@ -1219,6 +1220,7 @@
|
|||
<ClInclude Include="..\gui\FileListWidget.hxx" />
|
||||
<ClInclude Include="..\gui\JoystickDialog.hxx" />
|
||||
<ClInclude Include="..\gui\LoggerDialog.hxx" />
|
||||
<ClInclude Include="..\gui\MinUICommandDialog.hxx" />
|
||||
<ClInclude Include="..\gui\RadioButtonWidget.hxx" />
|
||||
<ClInclude Include="..\gui\SnapshotDialog.hxx" />
|
||||
<ClInclude Include="..\gui\StellaSettingsDialog.hxx" />
|
||||
|
|
|
@ -957,6 +957,9 @@
|
|||
<ClCompile Include="..\gui\StellaSettingsDialog.cxx">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\gui\MinUICommandDialog.cxx">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\common\bspf.hxx">
|
||||
|
@ -1958,6 +1961,9 @@
|
|||
<ClInclude Include="..\emucore\ControlLowLevel.hxx">
|
||||
<Filter>Header Files\emucore</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\gui\MinUICommandDialog.hxx">
|
||||
<Filter>Header Files\gui</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="stella.ico">
|
||||
|
|
Loading…
Reference in New Issue