mirror of https://github.com/mgba-emu/mgba.git
Merge branch 'master' (early part) into medusa
This commit is contained in:
commit
59af897f9d
1
CHANGES
1
CHANGES
|
@ -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)
|
||||
|
|
|
@ -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*);
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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'installer maintenant ? Vous devrez redémarrer l'é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'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 : %1
|
||||
Nouvelle version : %2
|
||||
Taille du téléchargement : %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'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'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'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'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'é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
|
@ -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"/>
|
||||
|
|
|
@ -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})
|
||||
|
|
|
@ -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})
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue