Merge branch 'master' (early part) into medusa

This commit is contained in:
Vicki Pfau 2022-05-30 17:32:31 -07:00
commit 59af897f9d
27 changed files with 582 additions and 468 deletions

View File

@ -87,6 +87,7 @@ Other fixes:
Misc:
- Core: Suspend runloop when a core crashes
- Debugger: Save and restore CLI history
- Debugger: GDB now works while the game is paused
- GB Video: Add default SGB border
- GBA: Automatically skip BIOS if ROM has invalid logo
- GBA: Refine multiboot detection (fixes mgba.io/i/2192)

View File

@ -140,6 +140,7 @@ struct mDebugger {
void (*deinit)(struct mDebugger*);
void (*paused)(struct mDebugger*);
void (*update)(struct mDebugger*);
void (*entered)(struct mDebugger*, enum mDebuggerEntryReason, struct mDebuggerEntryInfo*);
void (*custom)(struct mDebugger*);
};

View File

@ -250,7 +250,15 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) {
}
while (impl->state >= mTHREAD_MIN_WAITING && impl->state <= mTHREAD_MAX_WAITING) {
ConditionWait(&impl->stateCond, &impl->stateMutex);
#ifdef USE_DEBUGGERS
if (debugger && debugger->update && debugger->state != DEBUGGER_SHUTDOWN) {
debugger->update(debugger);
ConditionWaitTimed(&impl->stateCond, &impl->stateMutex, 10);
} else
#endif
{
ConditionWait(&impl->stateCond, &impl->stateMutex);
}
if (impl->sync.audioWait) {
MutexUnlock(&impl->stateMutex);

View File

@ -1124,6 +1124,7 @@ void CLIDebuggerCreate(struct CLIDebugger* debugger) {
debugger->d.deinit = _cliDebuggerDeinit;
debugger->d.custom = _cliDebuggerCustom;
debugger->d.paused = _commandLine;
debugger->d.update = NULL;
debugger->d.entered = _reportEntry;
debugger->d.type = DEBUGGER_CLI;

View File

@ -135,6 +135,12 @@ static void _gdbStubWait(struct mDebugger* debugger) {
GDBStubUpdate(stub);
}
static void _gdbStubUpdate(struct mDebugger* debugger) {
struct GDBStub* stub = (struct GDBStub*) debugger;
stub->shouldBlock = false;
GDBStubUpdate(stub);
}
static void _ack(struct GDBStub* stub) {
char ack = '+';
SocketSend(stub->connection, &ack, 1);
@ -758,6 +764,7 @@ void GDBStubCreate(struct GDBStub* stub) {
stub->d.init = 0;
stub->d.deinit = _gdbStubDeinit;
stub->d.paused = _gdbStubWait;
stub->d.update = _gdbStubUpdate;
stub->d.entered = _gdbStubEntered;
stub->d.custom = _gdbStubPoll;
stub->d.type = DEBUGGER_GDB;

View File

@ -27,8 +27,7 @@ source_group("3DS-specific code" FILES ${OS_SRC})
if(USE_VFS_3DS)
list(APPEND OS_DEFINES USE_VFS_3DS)
else()
list(APPEND OS_DEFINES USE_VFS_FILE)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-file.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c)
endif()
set(CORE_VFS_SRC ${CORE_VFS_SRC} PARENT_SCOPE)
set(OS_DEFINES ${OS_DEFINES} PARENT_SCOPE)

View File

@ -107,7 +107,7 @@ QModelIndex CheatsModel::parent(const QModelIndex& index) const {
Qt::ItemFlags CheatsModel::flags(const QModelIndex& index) const {
if (!index.isValid()) {
return 0;
return Qt::NoItemFlags;
}
if (index.parent().isValid()) {

View File

@ -63,9 +63,9 @@ Action* ConfigOption::addBoolean(const QString& text, ActionMapper* actions, con
}
QObject::connect(action, &QObject::destroyed, this, [this, action]() {
m_actions.removeAll(std::make_pair(action, 1));
m_actions.removeAll(std::make_pair(action, QVariant(1)));
});
m_actions.append(std::make_pair(action, 1));
m_actions.append(std::make_pair(action, QVariant(1)));
return action;
}

View File

@ -251,7 +251,11 @@ private:
uint64_t m_frameCounter;
QList<std::function<void()>> m_resetActions;
QList<std::function<void()>> m_frameActions;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QRecursiveMutex m_actionMutex;
#else
QMutex m_actionMutex{QMutex::Recursive};
#endif
int m_moreFrames = -1;
QMutex m_bufferMutex;

View File

@ -16,12 +16,12 @@
using namespace QGBA;
#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(BUILD_GLES3) || defined(USE_EPOXY)
Display::Driver Display::s_driver = Display::Driver::OPENGL;
QGBA::Display::Driver Display::s_driver = QGBA::Display::Driver::OPENGL;
#else
Display::Driver Display::s_driver = Display::Driver::QT;
QGBA::Display::Driver Display::s_driver = QGBA::Display::Driver::QT;
#endif
Display* Display::create(QWidget* parent) {
QGBA::Display* QGBA::Display::create(QWidget* parent) {
#if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(BUILD_GLES3) || defined(USE_EPOXY)
QSurfaceFormat format;
format.setSwapInterval(1);
@ -76,7 +76,7 @@ Display* Display::create(QWidget* parent) {
}
}
Display::Display(QWidget* parent)
QGBA::Display::Display(QWidget* parent)
: QWidget(parent)
{
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
@ -86,7 +86,7 @@ Display::Display(QWidget* parent)
setMouseTracking(true);
}
QSize Display::viewportSize() {
QSize QGBA::Display::viewportSize() {
QSize s = size();
QSize ds = s;
if (isAspectRatioLocked()) {
@ -103,7 +103,7 @@ QSize Display::viewportSize() {
return ds;
}
void Display::attach(std::shared_ptr<CoreController> controller) {
void QGBA::Display::attach(std::shared_ptr<CoreController> controller) {
CoreController* controllerP = controller.get();
connect(controllerP, &CoreController::stateLoaded, this, &Display::resizeContext);
connect(controllerP, &CoreController::stateLoaded, this, &Display::forceDraw);
@ -120,7 +120,7 @@ void Display::attach(std::shared_ptr<CoreController> controller) {
connect(controllerP, &CoreController::didReset, this, &Display::resizeContext);
}
void Display::configure(ConfigController* config) {
void QGBA::Display::configure(ConfigController* config) {
const mCoreOptions* opts = config->options();
lockAspectRatio(opts->lockAspectRatio);
lockIntegerScaling(opts->lockIntegerScaling);
@ -139,7 +139,7 @@ void Display::configure(ConfigController* config) {
#endif
}
void Display::resizeEvent(QResizeEvent*) {
void QGBA::Display::resizeEvent(QResizeEvent*) {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
m_messagePainter.resize(size(), devicePixelRatioF());
#else
@ -147,48 +147,48 @@ void Display::resizeEvent(QResizeEvent*) {
#endif
}
void Display::lockAspectRatio(bool lock) {
void QGBA::Display::lockAspectRatio(bool lock) {
m_lockAspectRatio = lock;
}
void Display::lockIntegerScaling(bool lock) {
void QGBA::Display::lockIntegerScaling(bool lock) {
m_lockIntegerScaling = lock;
}
void Display::interframeBlending(bool lock) {
void QGBA::Display::interframeBlending(bool lock) {
m_interframeBlending = lock;
}
void Display::showOSDMessages(bool enable) {
void QGBA::Display::showOSDMessages(bool enable) {
m_showOSD = enable;
}
void Display::showFrameCounter(bool enable) {
void QGBA::Display::showFrameCounter(bool enable) {
m_showFrameCounter = enable;
if (!enable) {
m_messagePainter.clearFrameCounter();
}
}
void Display::filter(bool filter) {
void QGBA::Display::filter(bool filter) {
m_filter = filter;
}
void Display::showMessage(const QString& message) {
void QGBA::Display::showMessage(const QString& message) {
m_messagePainter.showMessage(message);
if (!isDrawing()) {
forceDraw();
}
}
void Display::mouseMoveEvent(QMouseEvent* event) {
void QGBA::Display::mouseMoveEvent(QMouseEvent* event) {
emit showCursor();
m_mouseTimer.stop();
m_mouseTimer.start();
event->ignore();
}
void Display::setSystemDimensions(int width, int height) {
void QGBA::Display::setSystemDimensions(int width, int height) {
m_coreWidth = width;
m_coreHeight = height;
}

View File

@ -216,7 +216,7 @@ void LoadSaveState::loadState(int slot) {
m_slots[slot - 1]->setIcon(statePixmap);
}
if (creation.toMSecsSinceEpoch()) {
m_slots[slot - 1]->setText(creation.toString(Qt::DefaultLocaleShortDate));
m_slots[slot - 1]->setText(QLocale().toString(creation, QLocale::ShortFormat));
} else if (stateImage.isNull()) {
m_slots[slot - 1]->setText(tr("Slot %1").arg(slot));
} else {

View File

@ -139,7 +139,7 @@ int LogConfigModel::rowCount(const QModelIndex& parent) const {
Qt::ItemFlags LogConfigModel::flags(const QModelIndex& index) const {
if (!index.isValid() || (index.row() == 0 && index.column() == 0)) {
return 0;
return Qt::NoItemFlags;
}
return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
}

View File

@ -490,6 +490,7 @@ void SettingsView::updateConfig() {
saveSetting("gba.forceGbp", m_ui.forceGbp);
saveSetting("vbaBugCompat", m_ui.vbaBugCompat);
saveSetting("updateAutoCheck", m_ui.updateAutoCheck);
saveSetting("showFilenameInLibrary", m_ui.showFilenameInLibrary);
if (m_ui.audioBufferSize->currentText().toInt() > 8192) {
m_ui.audioBufferSize->setCurrentText("8192");
@ -717,6 +718,7 @@ void SettingsView::reloadConfig() {
loadSetting("gba.forceGbp", m_ui.forceGbp);
loadSetting("vbaBugCompat", m_ui.vbaBugCompat, true);
loadSetting("updateAutoCheck", m_ui.updateAutoCheck);
loadSetting("showFilenameInLibrary", m_ui.showFilenameInLibrary);
m_ui.libraryStyle->setCurrentIndex(loadSetting("libraryStyle").toInt());

View File

@ -564,27 +564,34 @@
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="showFilenameInLibrary">
<property name="text">
<string>Show filename instead of ROM name in library view</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPushButton" name="clearCache">
<property name="text">
<string>Clear cache</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<item row="6" column="0" colspan="2">
<widget class="Line" name="line_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="1">
<item row="7" column="1">
<widget class="QCheckBox" name="allowOpposingDirections">
<property name="text">
<string>Allow opposing input directions</string>
</property>
</widget>
</item>
<item row="7" column="1">
<item row="8" column="1">
<widget class="QCheckBox" name="suspendScreensaver">
<property name="text">
<string>Suspend screensaver</string>
@ -594,14 +601,14 @@
</property>
</widget>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QLabel" name="label_41">
<property name="text">
<string>When inactive:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<item row="9" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_21">
<item>
<widget class="QCheckBox" name="pauseOnFocusLost">
@ -619,14 +626,14 @@
</item>
</layout>
</item>
<item row="9" column="0">
<item row="10" column="0">
<widget class="QLabel" name="label_42">
<property name="text">
<string>When minimized:</string>
</property>
</widget>
</item>
<item row="9" column="1">
<item row="10" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_24">
<item>
<widget class="QCheckBox" name="pauseOnMinimize">
@ -644,14 +651,14 @@
</item>
</layout>
</item>
<item row="10" column="0" colspan="2">
<item row="11" column="0" colspan="2">
<widget class="Line" name="line_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="11" column="1">
<item row="12" column="1">
<widget class="QCheckBox" name="dynamicTitle">
<property name="text">
<string>Dynamically update window title</string>
@ -661,7 +668,7 @@
</property>
</widget>
</item>
<item row="12" column="1">
<item row="13" column="1">
<widget class="QCheckBox" name="showFps">
<property name="text">
<string>Show FPS in title bar</string>
@ -671,7 +678,7 @@
</property>
</widget>
</item>
<item row="13" column="1">
<item row="14" column="1">
<widget class="QCheckBox" name="showFilename">
<property name="text">
<string>Show filename instead of ROM name in title bar</string>
@ -681,14 +688,14 @@
</property>
</widget>
</item>
<item row="14" column="0" colspan="2">
<item row="15" column="0" colspan="2">
<widget class="Line" name="line_18">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="15" column="1">
<item row="16" column="1">
<widget class="QCheckBox" name="showOSD">
<property name="text">
<string>Show OSD messages</string>
@ -698,7 +705,7 @@
</property>
</widget>
</item>
<item row="16" column="1">
<item row="17" column="1">
<layout class="QVBoxLayout" name="osdDisplay">
<property name="leftMargin">
<number>20</number>
@ -719,21 +726,21 @@
</item>
</layout>
</item>
<item row="17" column="1">
<item row="18" column="1">
<widget class="QCheckBox" name="useDiscordPresence">
<property name="text">
<string>Enable Discord Rich Presence</string>
</property>
</widget>
</item>
<item row="18" column="0" colspan="2">
<item row="19" column="0" colspan="2">
<widget class="Line" name="line_13">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="19" column="1">
<item row="20" column="1">
<widget class="QCheckBox" name="autosave">
<property name="text">
<string>Automatically save state</string>
@ -743,7 +750,7 @@
</property>
</widget>
</item>
<item row="20" column="1">
<item row="21" column="1">
<widget class="QCheckBox" name="autoload">
<property name="text">
<string>Automatically load state</string>
@ -753,14 +760,14 @@
</property>
</widget>
</item>
<item row="21" column="0" colspan="2">
<item row="22" column="0" colspan="2">
<widget class="Line" name="line_16">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="22" column="1">
<item row="23" column="1">
<widget class="QCheckBox" name="cheatAutosave">
<property name="text">
<string>Automatically save cheats</string>
@ -770,7 +777,7 @@
</property>
</widget>
</item>
<item row="23" column="1">
<item row="24" column="1">
<widget class="QCheckBox" name="cheatAutoload">
<property name="text">
<string>Automatically load cheats</string>
@ -2449,7 +2456,7 @@
</connection>
</connections>
<buttongroups>
<buttongroup name="gbColors"/>
<buttongroup name="multiplayerAudio"/>
<buttongroup name="gbColors"/>
</buttongroups>
</ui>

View File

@ -29,7 +29,7 @@ TileView::TileView(std::shared_ptr<CoreController> controller, QWidget* parent)
connect(m_ui.tiles, &TilePainter::needsRedraw, this, [this]() {
updateTiles(true);
});
connect(m_ui.tilesSelector, qOverload<int>(&QButtonGroup::buttonClicked), this, [this]() {
connect(m_ui.tilesSelector, qOverload<QAbstractButton*>(&QButtonGroup::buttonClicked), this, [this]() {
updateTiles(true);
});
connect(m_ui.paletteId, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &TileView::updatePalette);

View File

@ -147,6 +147,12 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi
}
}, this);
m_config->updateOption("showLibrary");
ConfigOption* showFilenameInLibrary = m_config->addOption("showFilenameInLibrary");
showFilenameInLibrary->connect([this](const QVariant& value) {
m_libraryView->setShowFilename(value.toBool());
}, this);
m_config->updateOption("showFilenameInLibrary");
ConfigOption* libraryStyle = m_config->addOption("libraryStyle");
libraryStyle->connect([this](const QVariant& value) {
m_libraryView->setViewStyle(static_cast<LibraryStyle>(value.toInt()));

View File

@ -189,7 +189,7 @@ private:
std::shared_ptr<CoreController> m_controller;
std::unique_ptr<AudioProcessor> m_audioProcessor;
std::unique_ptr<Display> m_display;
std::unique_ptr<QGBA::Display> m_display;
int m_savedScale;
// TODO: Move these to a new class

View File

@ -37,6 +37,9 @@ void AbstractGameList::updateEntry(const LibraryEntry& item) {
void AbstractGameList::removeEntry(const QString& item) {
removeEntries({item});
}
void AbstractGameList::setShowFilename(bool showFilename) {
m_showFilename = showFilename;
}
LibraryController::LibraryController(QWidget* parent, const QString& path, ConfigController* config)
: QStackedWidget(parent)
@ -210,3 +213,16 @@ void LibraryController::loadDirectory(const QString& dir, bool recursive) {
mLibraryLoadDirectory(library.get(), dir.toUtf8().constData(), recursive);
m_libraryJob.testAndSetOrdered(libraryJob, -1);
}
void LibraryController::setShowFilename(bool showFilename) {
if (showFilename == m_showFilename) {
return;
}
m_showFilename = showFilename;
if (m_libraryGrid) {
m_libraryGrid->setShowFilename(m_showFilename);
}
if (m_libraryTree) {
m_libraryTree->setShowFilename(m_showFilename);
}
refresh();
}

View File

@ -65,8 +65,12 @@ public:
virtual void addEntry(const LibraryEntry&);
virtual void updateEntry(const LibraryEntry&);
virtual void removeEntry(const QString&);
virtual void setShowFilename(bool showFilename);
virtual QWidget* widget() = 0;
protected:
bool m_showFilename = false;
};
class LibraryController final : public QStackedWidget {
@ -79,6 +83,7 @@ public:
LibraryStyle viewStyle() const { return m_currentStyle; }
void setViewStyle(LibraryStyle newStyle);
void setShowFilename(bool showFilename);
void selectEntry(const QString& fullpath);
LibraryEntry selectedEntry();
@ -112,6 +117,7 @@ private:
std::unique_ptr<LibraryGrid> m_libraryGrid;
std::unique_ptr<LibraryTree> m_libraryTree;
bool m_showFilename = false;
};
}

View File

@ -69,8 +69,7 @@ void LibraryGrid::addEntry(const LibraryEntry& item) {
}
QListWidgetItem* i = new QListWidgetItem;
i->setText(item.displayTitle());
i->setText(m_showFilename ? item.filename : item.displayTitle());
m_widget->addItem(i);
m_items.insert(item.fullpath, i);
}
@ -83,7 +82,7 @@ void LibraryGrid::updateEntries(const QList<LibraryEntry>& items) {
void LibraryGrid::updateEntry(const LibraryEntry& item) {
QListWidgetItem* i = m_items.value(item.fullpath);
i->setText(item.displayTitle());
i->setText(m_showFilename ? item.filename : item.displayTitle());
}
void LibraryGrid::removeEntries(const QList<QString>& items) {

View File

@ -1,4 +1,5 @@
/* Copyright (c) 2014-2017 waddlesplash
* Copyright (c) 2013-2022 Jeffrey Pfau
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
@ -140,7 +141,7 @@ void LibraryTree::updateEntry(const LibraryEntry& item) {
m_entries[item.fullpath] = item;
LibraryTreeItem* i = static_cast<LibraryTreeItem*>(m_items.value(item.fullpath));
i->setText(COL_NAME, item.displayTitle());
i->setText(COL_NAME, m_showFilename ? item.filename : item.displayTitle());
i->setText(COL_PLATFORM, nicePlatformFormat(item.platform));
i->setFilesize(item.filesize);
i->setText(COL_CRC32, QString("%0").arg(item.crc32, 8, 16, QChar('0')));
@ -194,7 +195,7 @@ void LibraryTree::rebuildTree() {
i->setText(COL_LOCATION, QDir::toNativeSeparators(item.base));
i->setText(COL_PLATFORM, nicePlatformFormat(item.platform));
i->setFilesize(item.filesize);
i->setTextAlignment(COL_SIZE, Qt::AlignRight);
i->setTextAlignment(COL_SIZE, Qt::AlignTrailing | Qt::AlignVCenter);
i->setText(COL_CRC32, QString("%0").arg(item.crc32, 8, 16, QChar('0')));
m_items.insert(item.fullpath, i);

View File

@ -41,7 +41,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../ApplicationUpdatePrompt.ui" line="14"/>
<source>An update is available</source>
<translation type="unfinished"></translation>
<translation>Une mise à jour est disponible</translation>
</message>
</context>
<context>
@ -130,7 +130,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../BattleChipView.ui" line="138"/>
<source>Gate type</source>
<translation type="unfinished"></translation>
<translation>Type de porte</translation>
</message>
<message>
<location filename="../BattleChipView.ui" line="180"/>
@ -164,7 +164,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../CheatsView.ui" line="39"/>
<source>Add New Code</source>
<translation type="unfinished"></translation>
<translation>Ajouter un nouveau code</translation>
</message>
<message>
<location filename="../CheatsView.ui" line="60"/>
@ -174,12 +174,12 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../CheatsView.ui" line="93"/>
<source>Add Lines</source>
<translation type="unfinished"></translation>
<translation>Ajouter des lignes</translation>
</message>
<message>
<location filename="../CheatsView.ui" line="100"/>
<source>Code type</source>
<translation type="unfinished"></translation>
<translation>Type de code</translation>
</message>
<message>
<location filename="../CheatsView.ui" line="53"/>
@ -220,37 +220,37 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../DolphinConnector.ui" line="14"/>
<source>Connect to Dolphin</source>
<translation type="unfinished"></translation>
<translation>Se connecter à Dolphin</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="23"/>
<source>Local computer</source>
<translation type="unfinished"></translation>
<translation>Ordinateur local</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="36"/>
<source>IP address</source>
<translation type="unfinished"></translation>
<translation>Adresse IP</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="55"/>
<source>Connect</source>
<translation type="unfinished"></translation>
<translation>Connecter</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="68"/>
<source>Disconnect</source>
<translation type="unfinished"></translation>
<translation>Déconnecter</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="78"/>
<source>Close</source>
<translation type="unfinished"></translation>
<translation>Fermer</translation>
</message>
<message>
<location filename="../DolphinConnector.ui" line="90"/>
<source>Reset on connect</source>
<translation type="unfinished"></translation>
<translation>Réinitialiser à la connexion</translation>
</message>
</context>
<context>
@ -296,7 +296,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../GIFView.ui" line="14"/>
<source>Record GIF/WebP/APNG</source>
<translation type="unfinished"></translation>
<translation>Enregistrer GIF/WebP/APNG</translation>
</message>
<message>
<location filename="../GIFView.ui" line="30"/>
@ -507,7 +507,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../LogView.ui" line="108"/>
<source>Advanced settings</source>
<translation type="unfinished"></translation>
<translation>Paramètres avancés</translation>
</message>
<message>
<location filename="../LogView.ui" line="128"/>
@ -1004,17 +1004,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../OverrideView.ui" line="146"/>
<source>EEPROM 8kB</source>
<translation type="unfinished"></translation>
<translation>EEPROM 8kB</translation>
</message>
<message>
<location filename="../OverrideView.ui" line="151"/>
<source>EEPROM 512 bytes</source>
<translation type="unfinished"></translation>
<translation>EEPROM 512 octets</translation>
</message>
<message>
<location filename="../OverrideView.ui" line="156"/>
<source>SRAM 64kB (bootlegs only)</source>
<translation type="unfinished"></translation>
<translation>SRAM 64kB (bootlegs seulement)</translation>
</message>
<message>
<location filename="../OverrideView.ui" line="164"/>
@ -1064,7 +1064,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<message>
<location filename="../OverrideView.ui" line="529"/>
<source>Palette preset</source>
<translation type="unfinished"></translation>
<translation>Palette prédéfinie</translation>
</message>
</context>
<context>
@ -1192,41 +1192,46 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.</
<location filename="../ApplicationUpdatePrompt.cpp" line="26"/>
<source>An update to %1 is available.
</source>
<translation type="unfinished"></translation>
<translation>Une mise à jour de %1 est disponible.
</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="28"/>
<source>
Do you want to download and install it now? You will need to restart the emulator when the download is complete.</source>
<translation type="unfinished"></translation>
<translation>
Voulez-vous la télécharger et l&apos;installer maintenant ? Vous devrez redémarrer l&apos;émulateur lorsque le téléchargement sera terminé.</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="31"/>
<source>
Auto-update is not available on this platform. If you wish to update you will need to do it manually.</source>
<translation type="unfinished"></translation>
<translation>
La mise à jour automatique n&apos;est pas disponible sur cette plateforme. Si vous souhaitez effectuer une mise à jour, vous devrez le faire manuellement.</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="35"/>
<source>Current version: %1
New version: %2
Download size: %3</source>
<translation type="unfinished"></translation>
<translation>Version actuelle&#xa0;:&#xa0;%1
Nouvelle version&#xa0;:&#xa0;%2
Taille du téléchargement&#xa0;:&#xa0;%3</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="53"/>
<source>Downloading update...</source>
<translation type="unfinished"></translation>
<translation>Téléchargement de la mise à jour...</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="69"/>
<source>Downloading failed. Please update manually.</source>
<translation type="unfinished"></translation>
<translation>Le téléchargement a échoué. Veuillez mettre à jour manuellement.</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="72"/>
<source>Downloading done. Press OK to restart %1 and install the update.</source>
<translation type="unfinished"></translation>
<translation>Téléchargement terminé. Appuyez sur OK pour redémarrer %1 et installer la mise à jour.</translation>
</message>
</context>
<context>
@ -1234,22 +1239,22 @@ Download size: %3</source>
<message>
<location filename="../ApplicationUpdater.cpp" line="88"/>
<source>Stable</source>
<translation type="unfinished"></translation>
<translation>Stable</translation>
</message>
<message>
<location filename="../ApplicationUpdater.cpp" line="91"/>
<source>Development</source>
<translation type="unfinished"></translation>
<translation>Développement</translation>
</message>
<message>
<location filename="../ApplicationUpdater.cpp" line="93"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
<translation>Inconnue</translation>
</message>
<message>
<location filename="../ApplicationUpdater.cpp" line="216"/>
<source>(None)</source>
<translation type="unfinished"></translation>
<translation>(Aucune)</translation>
</message>
</context>
<context>
@ -1286,7 +1291,7 @@ Download size: %3</source>
<location filename="../CheatsView.cpp" line="48"/>
<location filename="../CheatsView.cpp" line="56"/>
<source>Autodetect (recommended)</source>
<translation type="unfinished"></translation>
<translation>Détecter automatiquement (recommandé)</translation>
</message>
<message>
<location filename="../CheatsView.cpp" line="86"/>
@ -1300,23 +1305,23 @@ Download size: %3</source>
<message>
<location filename="../CoreController.cpp" line="99"/>
<source>Reset r%1-%2 %3</source>
<translation type="unfinished"></translation>
<translation>Réinitialiser r%1-%2 %3</translation>
</message>
<message>
<location filename="../CoreController.cpp" line="504"/>
<location filename="../CoreController.cpp" line="524"/>
<source>Rewinding not currently enabled</source>
<translation type="unfinished"></translation>
<translation>Le rembobinage n&apos;est pas actuellement activé</translation>
</message>
<message>
<location filename="../CoreController.cpp" line="567"/>
<source>Reset the game?</source>
<translation type="unfinished"></translation>
<translation>Réinitialiser le jeu ?</translation>
</message>
<message>
<location filename="../CoreController.cpp" line="568"/>
<source>Most games will require a reset to load the new save. Do you want to reset now?</source>
<translation type="unfinished"></translation>
<translation>La plupart des jeux nécessitent une réinitialisation pour charger la nouvelle sauvegarde. Voulez-vous réinitialiser maintenant ?</translation>
</message>
<message>
<location filename="../CoreController.cpp" line="780"/>
@ -1359,7 +1364,7 @@ Download size: %3</source>
<message>
<location filename="../CoreManager.cpp" line="115"/>
<source>Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows).</source>
<translation type="unfinished"></translation>
<translation>Impossible d&apos;ouvrir le fichier de sauvegarde ; les sauvegardes en jeu ne peuvent pas être mises à jour. Veuillez vous assurer que le répertoire de sauvegarde est accessible en écriture sans privilèges supplémentaires (par exemple, UAC sous Windows).</translation>
</message>
</context>
<context>
@ -1392,7 +1397,7 @@ Download size: %3</source>
<message>
<location filename="../FrameView.cpp" line="605"/>
<source>Objwin</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Objwin</translation>
</message>
<message>
<location filename="../FrameView.cpp" line="610"/>
@ -1407,7 +1412,7 @@ Download size: %3</source>
<message>
<location filename="../FrameView.cpp" line="616"/>
<source>Frame</source>
<translation type="unfinished"></translation>
<translation>Cadre</translation>
</message>
<message>
<location filename="../FrameView.cpp" line="622"/>
@ -1466,22 +1471,22 @@ Download size: %3</source>
<message>
<location filename="../GDBWindow.cpp" line="52"/>
<source>Write watchpoints behavior</source>
<translation type="unfinished"></translation>
<translation>Écrire le comportement des points de surveillance</translation>
</message>
<message>
<location filename="../GDBWindow.cpp" line="63"/>
<source>Standard GDB</source>
<translation type="unfinished"></translation>
<translation>GDB standard</translation>
</message>
<message>
<location filename="../GDBWindow.cpp" line="68"/>
<source>Internal change detection</source>
<translation type="unfinished"></translation>
<translation>Détection des changements internes</translation>
</message>
<message>
<location filename="../GDBWindow.cpp" line="72"/>
<source>Break on all writes</source>
<translation type="unfinished"></translation>
<translation>Interrompre sur toutes les écritures</translation>
</message>
<message>
<location filename="../GDBWindow.cpp" line="82"/>
@ -1524,7 +1529,7 @@ Download size: %3</source>
<message>
<location filename="../GIFView.cpp" line="88"/>
<source>Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng)</source>
<translation type="unfinished"></translation>
<translation>Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng)</translation>
</message>
</context>
<context>
@ -1632,7 +1637,7 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="65"/>
<source>Swap green components</source>
<translation type="unfinished"></translation>
<translation>Échanger les composants verts</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="69"/>
@ -1782,7 +1787,7 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="212"/>
<location filename="../IOViewer.cpp" line="221"/>
<source>Integer part (low)</source>
<translation type="unfinished"></translation>
<translation>Partie entière (basse)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="178"/>
@ -1790,7 +1795,7 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="216"/>
<location filename="../IOViewer.cpp" line="225"/>
<source>Integer part (high)</source>
<translation type="unfinished"></translation>
<translation>Partie entière (haute)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="229"/>
@ -2500,7 +2505,7 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="696"/>
<location filename="../IOViewer.cpp" line="704"/>
<source>Address (low)</source>
<translation type="unfinished"></translation>
<translation>Adresse (bas)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="565"/>
@ -2512,53 +2517,53 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="700"/>
<location filename="../IOViewer.cpp" line="708"/>
<source>Address (high)</source>
<translation type="unfinished"></translation>
<translation>Adresse (haut)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1116"/>
<location filename="../IOViewer.cpp" line="1139"/>
<location filename="../IOViewer.cpp" line="1166"/>
<source>Sound frequency (low)</source>
<translation type="unfinished"></translation>
<translation>Fréquence sonore (bas)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1120"/>
<location filename="../IOViewer.cpp" line="1143"/>
<location filename="../IOViewer.cpp" line="1170"/>
<source>Sound frequency (high)</source>
<translation type="unfinished"></translation>
<translation>Fréquence sonore (haut)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1424"/>
<source>Source (high)</source>
<translation type="unfinished"></translation>
<translation>Source (haute)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1428"/>
<source>Source (low)</source>
<translation type="unfinished"></translation>
<translation>Source (basse)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1432"/>
<source>Destination (high)</source>
<translation type="unfinished"></translation>
<translation>Destination (haute)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1436"/>
<source>Destination (low)</source>
<translation type="unfinished"></translation>
<translation>Destination (basse)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1499"/>
<location filename="../IOViewer.cpp" line="1511"/>
<source>Green (low)</source>
<translation type="unfinished"></translation>
<translation>Vert (bas)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1500"/>
<location filename="../IOViewer.cpp" line="1512"/>
<source>Green (high)</source>
<translation type="unfinished"></translation>
<translation>Vert (haut)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="577"/>
@ -3060,22 +3065,22 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1034"/>
<source>Right/A</source>
<translation type="unfinished"></translation>
<translation>Droite/A</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1035"/>
<source>Left/B</source>
<translation type="unfinished"></translation>
<translation>Gauche/B</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1036"/>
<source>Up/Select</source>
<translation type="unfinished"></translation>
<translation>Haut/Select</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1037"/>
<source>Down/Start</source>
<translation type="unfinished"></translation>
<translation>Bas/Start</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1038"/>
@ -3085,12 +3090,12 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1039"/>
<source>Active face buttons</source>
<translation type="unfinished"></translation>
<translation>Boutons faciaux actifs</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1047"/>
<source>Internal clock</source>
<translation type="unfinished"></translation>
<translation>Horloge interne</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1048"/>
@ -3100,12 +3105,12 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1049"/>
<source>Transfer active</source>
<translation type="unfinished"></translation>
<translation>Transfert actif</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1067"/>
<source>Divider</source>
<translation type="unfinished"></translation>
<translation>Diviseur</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1069"/>
@ -3122,13 +3127,13 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="1093"/>
<location filename="../IOViewer.cpp" line="1554"/>
<source>Timer</source>
<translation type="unfinished"></translation>
<translation>Minuteur</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1094"/>
<location filename="../IOViewer.cpp" line="1555"/>
<source>Serial</source>
<translation type="unfinished"></translation>
<translation>Série</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1095"/>
@ -3139,37 +3144,37 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1202"/>
<source>Volume right</source>
<translation type="unfinished"></translation>
<translation>Volume droit</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1203"/>
<source>Output right</source>
<translation type="unfinished"></translation>
<translation>Sortie droite</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1204"/>
<source>Volume left</source>
<translation type="unfinished"></translation>
<translation>Volume gauche</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1205"/>
<source>Output left</source>
<translation type="unfinished"></translation>
<translation>Sortie gauche</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1326"/>
<source>Background enable/priority</source>
<translation type="unfinished"></translation>
<translation>Activation/priorité de l&apos;arrière-plan</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1327"/>
<source>Enable sprites</source>
<translation type="unfinished"></translation>
<translation>Activer les sprites</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1328"/>
<source>Double-height sprites</source>
<translation type="unfinished"></translation>
<translation>Sprites à double hauteur</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1329"/>
@ -3180,13 +3185,13 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="1330"/>
<location filename="../IOViewer.cpp" line="1339"/>
<source>0x9800 0x9BFF</source>
<translation type="unfinished"></translation>
<translation>0x9800 0x9BFF</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1331"/>
<location filename="../IOViewer.cpp" line="1340"/>
<source>0x9C00 0x9FFF</source>
<translation type="unfinished"></translation>
<translation>0x9C00 0x9FFF</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1333"/>
@ -3196,17 +3201,17 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1334"/>
<source>0x8800 0x87FF</source>
<translation type="unfinished"></translation>
<translation>0x8800 0x87FF</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1335"/>
<source>0x8000 0x8FFF</source>
<translation type="unfinished"></translation>
<translation>0x8000 0x8FFF</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1337"/>
<source>Enable window</source>
<translation type="unfinished"></translation>
<translation>Activer la fenêtre</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1338"/>
@ -3271,115 +3276,115 @@ Download size: %3</source>
<message>
<location filename="../IOViewer.cpp" line="1368"/>
<source>Current Y coordinate</source>
<translation type="unfinished"></translation>
<translation>Coordonnée Y actuelle</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1372"/>
<source>Comparison Y coordinate</source>
<translation type="unfinished"></translation>
<translation>Comparaison de la coordonnée Y</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1376"/>
<source>Start upper byte</source>
<translation type="unfinished"></translation>
<translation>Début de l&apos;octet supérieur</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1380"/>
<location filename="../IOViewer.cpp" line="1387"/>
<location filename="../IOViewer.cpp" line="1394"/>
<source>Color 0 shade</source>
<translation type="unfinished"></translation>
<translation>Teinte de la couleur 0</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1381"/>
<location filename="../IOViewer.cpp" line="1388"/>
<location filename="../IOViewer.cpp" line="1395"/>
<source>Color 1 shade</source>
<translation type="unfinished"></translation>
<translation>Teinte de la couleur 1</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1382"/>
<location filename="../IOViewer.cpp" line="1389"/>
<location filename="../IOViewer.cpp" line="1396"/>
<source>Color 2 shade</source>
<translation type="unfinished"></translation>
<translation>Teinte de la couleur 2</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1383"/>
<location filename="../IOViewer.cpp" line="1390"/>
<location filename="../IOViewer.cpp" line="1397"/>
<source>Color 3 shade</source>
<translation type="unfinished"></translation>
<translation>Teinte de la couleur 3</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1411"/>
<source>Prepare to switch speed</source>
<translation type="unfinished"></translation>
<translation>Préparation au changement de vitesse</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1412"/>
<source>Double speed</source>
<translation type="unfinished"></translation>
<translation>Vitesse double</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1418"/>
<source>VRAM bank</source>
<translation type="unfinished"></translation>
<translation>Banque de mémoire vive (VRAM)</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1440"/>
<source>Length</source>
<translation type="unfinished"></translation>
<translation>Longueur</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1441"/>
<source>Timing</source>
<translation type="unfinished"></translation>
<translation>Chronologie</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1448"/>
<source>Write bit</source>
<translation type="unfinished"></translation>
<translation>Bit d&apos;écriture</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1449"/>
<source>Read bit</source>
<translation type="unfinished"></translation>
<translation>Bit de lecture</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1452"/>
<location filename="../IOViewer.cpp" line="1453"/>
<source>Unknown</source>
<translation type="unfinished"></translation>
<translation>Inconnu</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1493"/>
<location filename="../IOViewer.cpp" line="1505"/>
<source>Current index</source>
<translation type="unfinished"></translation>
<translation>Indice actuel</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1494"/>
<location filename="../IOViewer.cpp" line="1506"/>
<source>Auto-increment</source>
<translation type="unfinished"></translation>
<translation>Auto-incrémentation</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1498"/>
<location filename="../IOViewer.cpp" line="1510"/>
<source>Red</source>
<translation type="unfinished">Rouge</translation>
<translation>Rouge</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1501"/>
<location filename="../IOViewer.cpp" line="1513"/>
<source>Blue</source>
<translation type="unfinished">Bleu</translation>
<translation>Bleu</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1517"/>
<source>Sprite ordering</source>
<translation type="unfinished"></translation>
<translation>Ordre des sprites</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="1518"/>
@ -6234,7 +6239,7 @@ Download size: %3</source>
<message>
<location filename="../VideoView.ui" line="468"/>
<source>CRF</source>
<translation type="unfinished"></translation>
<translation>CRF</translation>
</message>
<message>
<location filename="../VideoView.ui" line="484"/>

File diff suppressed because it is too large Load Diff

View File

@ -390,7 +390,7 @@ Game Boy Advance - зарегистрированная торговая мар
<location filename="../LoadSaveState.ui" line="14"/>
<location filename="../LoadSaveState.ui" line="66"/>
<source>%1 State</source>
<translation type="unfinished"></translation>
<translation>%1 состояние</translation>
</message>
<message>
<location filename="../LoadSaveState.ui" line="41"/>
@ -496,7 +496,7 @@ Game Boy Advance - зарегистрированная торговая мар
<message>
<location filename="../LogView.ui" line="78"/>
<source>Fatal</source>
<translation type="unfinished"></translation>
<translation>Фатальная ошибка</translation>
</message>
<message>
<location filename="../LogView.ui" line="95"/>
@ -612,7 +612,7 @@ Game Boy Advance - зарегистрированная торговая мар
<location filename="../MemorySearch.ui" line="125"/>
<location filename="../MemorySearch.ui" line="185"/>
<source>Guess</source>
<translation type="unfinished"></translation>
<translation>Догадка</translation>
</message>
<message>
<location filename="../MemorySearch.ui" line="138"/>
@ -1043,7 +1043,7 @@ Game Boy Advance - зарегистрированная торговая мар
<message>
<location filename="../OverrideView.ui" line="249"/>
<source>Memory bank controller</source>
<translation type="unfinished"></translation>
<translation>Контроллер банка памяти</translation>
</message>
<message>
<location filename="../OverrideView.ui" line="265"/>
@ -1197,13 +1197,15 @@ Game Boy Advance - зарегистрированная торговая мар
<location filename="../ApplicationUpdatePrompt.cpp" line="28"/>
<source>
Do you want to download and install it now? You will need to restart the emulator when the download is complete.</source>
<translation type="unfinished"></translation>
<translation>
Вы хотите скачать и установить сейчас? Вам надо будет перезагрузить эмулятор когда загрузка закончится.</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="31"/>
<source>
Auto-update is not available on this platform. If you wish to update you will need to do it manually.</source>
<translation type="unfinished"></translation>
<translation>
Автообновление не доступно на этой платформе. Если вы хотите обновить эмулятор вам нужно сделать это вручную.</translation>
</message>
<message>
<location filename="../ApplicationUpdatePrompt.cpp" line="35"/>
@ -1301,7 +1303,7 @@ Download size: %3</source>
<message>
<location filename="../CoreController.cpp" line="99"/>
<source>Reset r%1-%2 %3</source>
<translation type="unfinished"></translation>
<translation>Сброс r%1-%2 %3</translation>
</message>
<message>
<location filename="../CoreController.cpp" line="504"/>
@ -2335,7 +2337,7 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="442"/>
<location filename="../IOViewer.cpp" line="449"/>
<source>0</source>
<translation type="unfinished">0</translation>
<translation>0</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="443"/>
@ -2348,7 +2350,7 @@ Download size: %3</source>
<location filename="../IOViewer.cpp" line="1002"/>
<location filename="../IOViewer.cpp" line="1012"/>
<source>1</source>
<translation type="unfinished">1</translation>
<translation>1</translation>
</message>
<message>
<location filename="../IOViewer.cpp" line="445"/>

View File

@ -4,8 +4,8 @@ find_program(BUILD_ROMFS build_romfs)
find_library(GLAPI_LIBRARY glapi REQUIRED)
find_library(EGL_LIBRARY EGL REQUIRED)
set(OS_DEFINES _GNU_SOURCE USE_VFS_FILE IOAPI_NO_64)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-file.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c)
set(OS_DEFINES _GNU_SOURCE IOAPI_NO_64)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c)
list(APPEND GUI_SRC ${CMAKE_CURRENT_SOURCE_DIR}/gui-font.c)
include_directories(AFTER ${OPENGLES3_INCLUDE_DIR} ${OPENGL_EGL_INCLUDE_DIR})

View File

@ -8,8 +8,8 @@ if(WIIDRC_LIBRARY)
add_definitions(-DWIIDRC)
endif()
set(OS_DEFINES _GNU_SOURCE COLOR_16_BIT COLOR_5_6_5 USE_VFS_FILE IOAPI_NO_64 FIXED_ROM_BUFFER)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-file.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-devlist.c)
set(OS_DEFINES _GNU_SOURCE COLOR_16_BIT COLOR_5_6_5 IOAPI_NO_64 FIXED_ROM_BUFFER)
list(APPEND CORE_VFS_SRC ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-dirent.c ${CMAKE_SOURCE_DIR}/src/util/vfs/vfs-devlist.c)
include_directories(${CMAKE_CURRENT_BINARY_DIR})

View File

@ -7,11 +7,13 @@
#include <fcntl.h>
#include <sys/stat.h>
#ifndef _WIN32
#ifdef _WIN32
#include <windows.h>
#elif defined(_POSIX_MAPPED_FILES)
#include <sys/mman.h>
#include <sys/time.h>
#else
#include <windows.h>
#include <mgba-util/memory.h>
#endif
#include <mgba-util/vector.h>
@ -31,6 +33,8 @@ struct VFileFD {
int fd;
#ifdef _WIN32
struct HandleMappingList handles;
#elif !defined(_POSIX_MAPPED_FILES)
bool writable;
#endif
};
@ -88,6 +92,8 @@ struct VFile* VFileFromFD(int fd) {
vfd->d.sync = _vfdSync;
#ifdef _WIN32
HandleMappingListInit(&vfd->handles, 4);
#elif !defined(_POSIX_MAPPED_FILES)
vfd->writable = false;
#endif
return &vfd->d;
@ -125,7 +131,7 @@ ssize_t _vfdWrite(struct VFile* vf, const void* buffer, size_t size) {
return write(vfd->fd, buffer, size);
}
#ifndef _WIN32
#ifdef _POSIX_MAPPED_FILES
static void* _vfdMap(struct VFile* vf, size_t size, int flags) {
struct VFileFD* vfd = (struct VFileFD*) vf;
int mmapFlags = MAP_PRIVATE;
@ -144,7 +150,7 @@ static void _vfdUnmap(struct VFile* vf, void* memory, size_t size) {
msync(memory, size, MS_SYNC);
munmap(memory, size);
}
#else
#elif defined(_WIN32)
static void* _vfdMap(struct VFile* vf, size_t size, int flags) {
struct VFileFD* vfd = (struct VFileFD*) vf;
int createFlags = PAGE_WRITECOPY;
@ -183,6 +189,34 @@ static void _vfdUnmap(struct VFile* vf, void* memory, size_t size) {
}
}
}
#else
static void* _vfdMap(struct VFile* vf, size_t size, int flags) {
struct VFileFD* vfd = (struct VFileFD*) vf;
if (flags & MAP_WRITE) {
vfd->writable = true;
}
void* mem = anonymousMemoryMap(size);
if (!mem) {
return 0;
}
off_t pos = lseek(vfd->fd, 0, SEEK_CUR);
lseek(vfd->fd, 0, SEEK_SET);
read(vfd->fd, mem, size);
lseek(vfd->fd, pos, SEEK_SET);
return mem;
}
static void _vfdUnmap(struct VFile* vf, void* memory, size_t size) {
struct VFileFD* vfd = (struct VFileFD*) vf;
if (vfd->writable) {
off_t pos = lseek(vfd->fd, 0, SEEK_CUR);
lseek(vfd->fd, 0, SEEK_SET);
write(vfd->fd, memory, size);
lseek(vfd->fd, pos, SEEK_SET);
}
mappedMemoryFree(memory, size);
}
#endif
static void _vfdTruncate(struct VFile* vf, size_t size) {
@ -210,7 +244,17 @@ static bool _vfdSync(struct VFile* vf, void* buffer, size_t size) {
futimes(vfd->fd, NULL);
#endif
if (buffer && size) {
#ifdef _POSIX_MAPPED_FILES
return msync(buffer, size, MS_ASYNC) == 0;
#else
off_t pos = lseek(vfd->fd, 0, SEEK_CUR);
lseek(vfd->fd, 0, SEEK_SET);
ssize_t res = write(vfd->fd, buffer, size);
lseek(vfd->fd, pos, SEEK_SET);
if (res < 0) {
return false;
}
#endif
}
return fsync(vfd->fd) == 0;
#else