diff --git a/CHANGES b/CHANGES index 6bc92228a..d0275945d 100644 --- a/CHANGES +++ b/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) diff --git a/include/mgba/debugger/debugger.h b/include/mgba/debugger/debugger.h index 2adfa117c..f3fa0ab85 100644 --- a/include/mgba/debugger/debugger.h +++ b/include/mgba/debugger/debugger.h @@ -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*); }; diff --git a/src/core/thread.c b/src/core/thread.c index 1a9378a77..7f87e9e75 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -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); diff --git a/src/debugger/cli-debugger.c b/src/debugger/cli-debugger.c index 3bac2c8ab..d757f19c2 100644 --- a/src/debugger/cli-debugger.c +++ b/src/debugger/cli-debugger.c @@ -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; diff --git a/src/debugger/gdb-stub.c b/src/debugger/gdb-stub.c index 5526aa0b2..5d625e403 100644 --- a/src/debugger/gdb-stub.c +++ b/src/debugger/gdb-stub.c @@ -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; diff --git a/src/platform/3ds/CMakeLists.txt b/src/platform/3ds/CMakeLists.txt index a0c97b617..36953d18f 100644 --- a/src/platform/3ds/CMakeLists.txt +++ b/src/platform/3ds/CMakeLists.txt @@ -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) diff --git a/src/platform/qt/CheatsModel.cpp b/src/platform/qt/CheatsModel.cpp index 3694424d8..85528c1b6 100644 --- a/src/platform/qt/CheatsModel.cpp +++ b/src/platform/qt/CheatsModel.cpp @@ -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()) { diff --git a/src/platform/qt/ConfigController.cpp b/src/platform/qt/ConfigController.cpp index 74861027d..e6162237b 100644 --- a/src/platform/qt/ConfigController.cpp +++ b/src/platform/qt/ConfigController.cpp @@ -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; } diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 8060c4562..044fae403 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -251,7 +251,11 @@ private: uint64_t m_frameCounter; QList> m_resetActions; QList> 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; diff --git a/src/platform/qt/Display.cpp b/src/platform/qt/Display.cpp index 1eec61d96..9d91b23ea 100644 --- a/src/platform/qt/Display.cpp +++ b/src/platform/qt/Display.cpp @@ -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 controller) { +void QGBA::Display::attach(std::shared_ptr 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 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; } diff --git a/src/platform/qt/LoadSaveState.cpp b/src/platform/qt/LoadSaveState.cpp index 4bcae6175..aa76ed523 100644 --- a/src/platform/qt/LoadSaveState.cpp +++ b/src/platform/qt/LoadSaveState.cpp @@ -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 { diff --git a/src/platform/qt/LogConfigModel.cpp b/src/platform/qt/LogConfigModel.cpp index dd3d48b6a..2748aaf7c 100644 --- a/src/platform/qt/LogConfigModel.cpp +++ b/src/platform/qt/LogConfigModel.cpp @@ -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; } diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index bea9fcaf4..b65dd170d 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -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()); diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 7ba8bb3e1..18f0f3bba 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -564,27 +564,34 @@ + + + Show filename instead of ROM name in library view + + + + Clear cache - + Qt::Horizontal - + Allow opposing input directions - + Suspend screensaver @@ -594,14 +601,14 @@ - + When inactive: - + @@ -619,14 +626,14 @@ - + When minimized: - + @@ -644,14 +651,14 @@ - + Qt::Horizontal - + Dynamically update window title @@ -661,7 +668,7 @@ - + Show FPS in title bar @@ -671,7 +678,7 @@ - + Show filename instead of ROM name in title bar @@ -681,14 +688,14 @@ - + Qt::Horizontal - + Show OSD messages @@ -698,7 +705,7 @@ - + 20 @@ -719,21 +726,21 @@ - + Enable Discord Rich Presence - + Qt::Horizontal - + Automatically save state @@ -743,7 +750,7 @@ - + Automatically load state @@ -753,14 +760,14 @@ - + Qt::Horizontal - + Automatically save cheats @@ -770,7 +777,7 @@ - + Automatically load cheats @@ -2449,7 +2456,7 @@ - + diff --git a/src/platform/qt/TileView.cpp b/src/platform/qt/TileView.cpp index 3e8e58155..23cba18fd 100644 --- a/src/platform/qt/TileView.cpp +++ b/src/platform/qt/TileView.cpp @@ -29,7 +29,7 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) connect(m_ui.tiles, &TilePainter::needsRedraw, this, [this]() { updateTiles(true); }); - connect(m_ui.tilesSelector, qOverload(&QButtonGroup::buttonClicked), this, [this]() { + connect(m_ui.tilesSelector, qOverload(&QButtonGroup::buttonClicked), this, [this]() { updateTiles(true); }); connect(m_ui.paletteId, static_cast(&QSpinBox::valueChanged), this, &TileView::updatePalette); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index f3b6f6d4c..d4cdcbfb8 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -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(value.toInt())); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 13cb5855e..fe30ba2bd 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -189,7 +189,7 @@ private: std::shared_ptr m_controller; std::unique_ptr m_audioProcessor; - std::unique_ptr m_display; + std::unique_ptr m_display; int m_savedScale; // TODO: Move these to a new class diff --git a/src/platform/qt/library/LibraryController.cpp b/src/platform/qt/library/LibraryController.cpp index 403bed6e7..2a1ba1546 100644 --- a/src/platform/qt/library/LibraryController.cpp +++ b/src/platform/qt/library/LibraryController.cpp @@ -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(); +} diff --git a/src/platform/qt/library/LibraryController.h b/src/platform/qt/library/LibraryController.h index c7d6dfc2f..1b5d06572 100644 --- a/src/platform/qt/library/LibraryController.h +++ b/src/platform/qt/library/LibraryController.h @@ -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 m_libraryGrid; std::unique_ptr m_libraryTree; + bool m_showFilename = false; }; } diff --git a/src/platform/qt/library/LibraryGrid.cpp b/src/platform/qt/library/LibraryGrid.cpp index c83d23b60..89fd8265b 100644 --- a/src/platform/qt/library/LibraryGrid.cpp +++ b/src/platform/qt/library/LibraryGrid.cpp @@ -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& 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& items) { diff --git a/src/platform/qt/library/LibraryTree.cpp b/src/platform/qt/library/LibraryTree.cpp index 68a9f31d6..179edd95c 100644 --- a/src/platform/qt/library/LibraryTree.cpp +++ b/src/platform/qt/library/LibraryTree.cpp @@ -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(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); diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index de7d4c51f..21bde5ef9 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -41,7 +41,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. An update is available - + Une mise à jour est disponible @@ -130,7 +130,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Gate type - + Type de porte @@ -164,7 +164,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Add New Code - + Ajouter un nouveau code @@ -174,12 +174,12 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Add Lines - + Ajouter des lignes Code type - + Type de code @@ -220,37 +220,37 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Connect to Dolphin - + Se connecter à Dolphin Local computer - + Ordinateur local IP address - + Adresse IP Connect - + Connecter Disconnect - + Déconnecter Close - + Fermer Reset on connect - + Réinitialiser à la connexion @@ -296,7 +296,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Record GIF/WebP/APNG - + Enregistrer GIF/WebP/APNG @@ -507,7 +507,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Advanced settings - + Paramètres avancés @@ -1004,17 +1004,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. EEPROM 8kB - + EEPROM 8kB EEPROM 512 bytes - + EEPROM 512 octets SRAM 64kB (bootlegs only) - + SRAM 64kB (bootlegs seulement) @@ -1064,7 +1064,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Palette preset - + Palette prédéfinie @@ -1192,41 +1192,46 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. An update to %1 is available. - + Une mise à jour de %1 est disponible. + Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + +Voulez-vous la télécharger et l'installer maintenant ? Vous devrez redémarrer l'émulateur lorsque le téléchargement sera terminé. Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + +La mise à jour automatique n'est pas disponible sur cette plateforme. Si vous souhaitez effectuer une mise à jour, vous devrez le faire manuellement. Current version: %1 New version: %2 Download size: %3 - + Version actuelle : %1 +Nouvelle version : %2 +Taille du téléchargement : %3 Downloading update... - + Téléchargement de la mise à jour... Downloading failed. Please update manually. - + Le téléchargement a échoué. Veuillez mettre à jour manuellement. Downloading done. Press OK to restart %1 and install the update. - + Téléchargement terminé. Appuyez sur OK pour redémarrer %1 et installer la mise à jour. @@ -1234,22 +1239,22 @@ Download size: %3 Stable - + Stable Development - + Développement Unknown - + Inconnue (None) - + (Aucune) @@ -1286,7 +1291,7 @@ Download size: %3 Autodetect (recommended) - + Détecter automatiquement (recommandé) @@ -1300,23 +1305,23 @@ Download size: %3 Reset r%1-%2 %3 - + Réinitialiser r%1-%2 %3 Rewinding not currently enabled - + Le rembobinage n'est pas actuellement activé Reset the game? - + Réinitialiser le jeu ? Most games will require a reset to load the new save. Do you want to reset now? - + La plupart des jeux nécessitent une réinitialisation pour charger la nouvelle sauvegarde. Voulez-vous réinitialiser maintenant ? @@ -1359,7 +1364,7 @@ Download size: %3 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). - + 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). @@ -1392,7 +1397,7 @@ Download size: %3 Objwin - + Objwin @@ -1407,7 +1412,7 @@ Download size: %3 Frame - + Cadre @@ -1466,22 +1471,22 @@ Download size: %3 Write watchpoints behavior - + Écrire le comportement des points de surveillance Standard GDB - + GDB standard Internal change detection - + Détection des changements internes Break on all writes - + Interrompre sur toutes les écritures @@ -1524,7 +1529,7 @@ Download size: %3 Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) - + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) @@ -1632,7 +1637,7 @@ Download size: %3 Swap green components - + Échanger les composants verts @@ -1782,7 +1787,7 @@ Download size: %3 Integer part (low) - + Partie entière (basse) @@ -1790,7 +1795,7 @@ Download size: %3 Integer part (high) - + Partie entière (haute) @@ -2500,7 +2505,7 @@ Download size: %3 Address (low) - + Adresse (bas) @@ -2512,53 +2517,53 @@ Download size: %3 Address (high) - + Adresse (haut) Sound frequency (low) - + Fréquence sonore (bas) Sound frequency (high) - + Fréquence sonore (haut) Source (high) - + Source (haute) Source (low) - + Source (basse) Destination (high) - + Destination (haute) Destination (low) - + Destination (basse) Green (low) - + Vert (bas) Green (high) - + Vert (haut) @@ -3060,22 +3065,22 @@ Download size: %3 Right/A - + Droite/A Left/B - + Gauche/B Up/Select - + Haut/Select Down/Start - + Bas/Start @@ -3085,12 +3090,12 @@ Download size: %3 Active face buttons - + Boutons faciaux actifs Internal clock - + Horloge interne @@ -3100,12 +3105,12 @@ Download size: %3 Transfer active - + Transfert actif Divider - + Diviseur @@ -3122,13 +3127,13 @@ Download size: %3 Timer - + Minuteur Serial - + Série @@ -3139,37 +3144,37 @@ Download size: %3 Volume right - + Volume droit Output right - + Sortie droite Volume left - + Volume gauche Output left - + Sortie gauche Background enable/priority - + Activation/priorité de l'arrière-plan Enable sprites - + Activer les sprites Double-height sprites - + Sprites à double hauteur @@ -3180,13 +3185,13 @@ Download size: %3 0x9800 – 0x9BFF - + 0x9800 – 0x9BFF 0x9C00 – 0x9FFF - + 0x9C00 – 0x9FFF @@ -3196,17 +3201,17 @@ Download size: %3 0x8800 – 0x87FF - + 0x8800 – 0x87FF 0x8000 – 0x8FFF - + 0x8000 – 0x8FFF Enable window - + Activer la fenêtre @@ -3271,115 +3276,115 @@ Download size: %3 Current Y coordinate - + Coordonnée Y actuelle Comparison Y coordinate - + Comparaison de la coordonnée Y Start upper byte - + Début de l'octet supérieur Color 0 shade - + Teinte de la couleur 0 Color 1 shade - + Teinte de la couleur 1 Color 2 shade - + Teinte de la couleur 2 Color 3 shade - + Teinte de la couleur 3 Prepare to switch speed - + Préparation au changement de vitesse Double speed - + Vitesse double VRAM bank - + Banque de mémoire vive (VRAM) Length - + Longueur Timing - + Chronologie Write bit - + Bit d'écriture Read bit - + Bit de lecture Unknown - + Inconnu Current index - + Indice actuel Auto-increment - + Auto-incrémentation Red - Rouge + Rouge Blue - Bleu + Bleu Sprite ordering - + Ordre des sprites @@ -6234,7 +6239,7 @@ Download size: %3 CRF - + CRF diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index 912e0c2fa..b8a92f3af 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -62,12 +62,12 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. Tile # - Numer Kafelka + Kafelek nr Palette # - Numer Palety + Nr palety @@ -188,7 +188,7 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. Load - Wczytaj + Załaduj @@ -790,7 +790,7 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. Load - Wczytaj + Załaduj @@ -863,7 +863,7 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. Off - + Wyłączony @@ -1191,19 +1191,22 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd. An update to %1 is available. - + Dostępna jest aktualizacja %1. + Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + +Czy chcesz ją teraz pobrać i zainstalować? Po zakończeniu pobierania konieczne będzie ponowne uruchomienie emulatora. Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + +Automatyczna aktualizacja nie jest dostępna na tej platformie. Jeśli chcesz zaktualizować, musisz to zrobić ręcznie. @@ -1301,23 +1304,23 @@ Rozmiar pobierania: %3 Reset r%1-%2 %3 - + Reset r%1-%2 %3 Rewinding not currently enabled - + Przewijanie nie jest obecnie włączone Reset the game? - + Zresetować grę? Most games will require a reset to load the new save. Do you want to reset now? - + Większość gier wymaga zresetowania, aby wczytać nowy zapis. Czy chcesz teraz zresetować? @@ -1360,7 +1363,7 @@ Rozmiar pobierania: %3 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). - + Nie udało się otworzyć pliku zapisu; zapisy w grze nie mogą być aktualizowane. Upewnij się, że katalog zapisu jest zapisywalny bez dodatkowych uprawnień (np. UAC w systemie Windows). @@ -1467,22 +1470,22 @@ Rozmiar pobierania: %3 Write watchpoints behavior - + Napisz zachowanie punktów obserwacyjnych Standard GDB - + Standardowy GDB Internal change detection - + Wykrywanie zmian wewnętrznych Break on all writes - + Przerwij podczas zapisywania @@ -1737,7 +1740,7 @@ Rozmiar pobierania: %3 Horizontal offset - + Przesunięcie poziome @@ -1747,7 +1750,7 @@ Rozmiar pobierania: %3 Vertical offset - + Przesunięcie pionowe @@ -1763,7 +1766,7 @@ Rozmiar pobierania: %3 Fractional part - + Część ułamkowa @@ -1775,7 +1778,7 @@ Rozmiar pobierania: %3 Integer part - + Część całkowita @@ -1783,7 +1786,7 @@ Rozmiar pobierania: %3 Integer part (low) - + Część całkowita (niska) @@ -1791,289 +1794,289 @@ Rozmiar pobierania: %3 Integer part (high) - + Część całkowita (wysoka) End x - + Końcowy x Start x - + Początkowy x End y - + Końcowy y Start y - + Początkowy y Window 0 enable BG 0 - + Okno 0 włącz BG 0 Window 0 enable BG 1 - + Okno 0 włącz BG 1 Window 0 enable BG 2 - + Okno 0 włącz BG 2 Window 0 enable BG 3 - + Okno 0 włącz BG 3 Window 0 enable OBJ - + Okno 0 włącz OBI Window 0 enable blend - + Okno 0 włącz mieszanie Window 1 enable BG 0 - + Okno 1 włącz BG 0 Window 1 enable BG 1 - + Okno 1 włącz BG 1 Window 1 enable BG 2 - + Okno 1 włącz BG 2 Window 1 enable BG 3 - + Okno 1 włącz BG 3 Window 1 enable OBJ - + Okno 1 włącz OBI Window 1 enable blend - + Okno 1 włącz mieszanie Outside window enable BG 0 - + Okno zewnętrzne włącz BG 0 Outside window enable BG 1 - + Okno zewnętrzne włącz BG 1 Outside window enable BG 2 - + Okno zewnętrzne włącz BG 2 Outside window enable BG 3 - + Okno zewnętrzne włącz BG 3 Outside window enable OBJ - + Okno zewnętrzne włącz OBI Outside window enable blend - + Okno zewnętrzne włącz mieszanie OBJ window enable BG 0 - + Okno OBI włącz BG 0 OBJ window enable BG 1 - + Okno OBI włącz BG 1 OBJ window enable BG 2 - + Okno OBI włącz BG 2 OBJ window enable BG 3 - + Okno OBI włącz BG 3 OBJ window enable OBJ - + Okno OBI włącz OBI OBJ window enable blend - + Okno OBI włącz mieszanie Background mosaic size vertical - + Rozmiar mozaiki tła w pionie Background mosaic size horizontal - + Rozmiar mozaiki tła w poziomie Object mosaic size vertical - + Rozmiar mozaiki obiektu w pionie Object mosaic size horizontal - + Rozmiar mozaiki obiektu w poziomie BG 0 target 1 - + BG 0 cel 1 BG 1 target 1 - + BG 1 cel 1 BG 2 target 1 - + BG 2 cel 1 BG 3 target 1 - + BG 3 cel 1 OBJ target 1 - + OBI cel 1 Backdrop target 1 - + Tło cel 1 Blend mode - + Tryb mieszania Disabled - + Wyłączone Additive blending - + Mieszanie przyłączeniowe Brighten - + Rozjaśnij Darken - + Zaciemnij BG 0 target 2 - + BG 0 cel 2 BG 1 target 2 - + BG 1 cel 2 BG 2 target 2 - + BG 2 cel 2 BG 3 target 2 - + BG 3 cel 2 OBJ target 2 - + OBI cel 2 Backdrop target 2 - + Tło cel 2 Blend A (target 1) - + Mieszaj A (cel 1) Blend B (target 2) - + Mieszaj B (cel 2) Blend Y - + Mieszaj Y Sweep shifts - + Sweep zmiany Sweep subtract - + Odejmowanie Sweep Sweep time (in 1/128s) - + Czas sweep (w 1/128s) @@ -2085,7 +2088,7 @@ Rozmiar pobierania: %3 Sound length - + Długość dźwięku @@ -2093,7 +2096,7 @@ Rozmiar pobierania: %3 Duty cycle - + Cykl pracy @@ -2103,7 +2106,7 @@ Rozmiar pobierania: %3 Envelope step time - + Czas kroku obwiedni @@ -2113,7 +2116,7 @@ Rozmiar pobierania: %3 Envelope increase - + Zwiększenie obwiedni @@ -2123,14 +2126,14 @@ Rozmiar pobierania: %3 Initial volume - + Głośność początkowa Sound frequency - + Częstotliwość dźwięku @@ -2142,7 +2145,7 @@ Rozmiar pobierania: %3 Timed - + Mierzony Czas @@ -2159,24 +2162,24 @@ Rozmiar pobierania: %3 Double-size wave table - + Podwójny wavetable Active wave table - + Aktywny wavetable Enable channel 3 - + Włącz kanał 3 Volume - + Głośność @@ -2217,13 +2220,13 @@ Rozmiar pobierania: %3 Clock divider - + Dzielnik zegara Register stages - + Zarejestruj etapy @@ -2241,95 +2244,95 @@ Rozmiar pobierania: %3 Shifter frequency - + Shifter częstotliwości PSG volume right - + Głośność PSG prawo PSG volume left - + Głośność PSG lewo Enable channel 1 right - + Włącz kanał 1 prawo Enable channel 2 right - + Włącz kanał 2 prawo Enable channel 3 right - + Włącz kanał 3 prawo Enable channel 4 right - + Włącz kanał 4 prawo Enable channel 1 left - + Włącz kanał 1 lewo Enable channel 2 left - + Włącz kanał 2 lewo Enable channel 3 left - + Włącz kanał 3 lewo Enable channel 4 left - + Włącz kanał 4 lewo PSG master volume - + Głośność główna PSG Loud channel A - + Głośny kanał A Loud channel B - + Głośny kanał B Enable channel A right - + Włącz kanał A prawo Enable channel A left - + Włącz kanał A lewo Channel A timer - + Zegar kanału A @@ -2353,67 +2356,67 @@ Rozmiar pobierania: %3 Channel A reset - + Reset kanału A Enable channel B right - + Włącz kanał B prawo Enable channel B left - + Włącz kanał B lewo Channel B timer - + Zegar kanału B Channel B reset - + Reset kanału B Active channel 1 - + Aktywny kanał 1 Active channel 2 - + Aktywny kanał 2 Active channel 3 - + Aktywny kanał 3 Active channel 4 - + Aktywny kanał 4 Enable audio - + Włącz dźwięk Bias - + Stronniczość Resolution - + Rozdzielczość @@ -2489,7 +2492,7 @@ Rozmiar pobierania: %3 Sample - + Próbka @@ -2501,7 +2504,7 @@ Rozmiar pobierania: %3 Address (low) - + Adres (niski) @@ -2513,53 +2516,53 @@ Rozmiar pobierania: %3 Address (high) - + Adres (wysoki) Sound frequency (low) - + Częstotliwość dźwięku (niska) Sound frequency (high) - + Częstotliwość dźwięku (wysoka) Source (high) - + Źródło (wysokie) Source (low) - + Źródło (niskie) Destination (high) - + Cel (wysoki) Destination (low) - + Cel (niski) Green (low) - + Zielony (niski) Green (high) - + Zielony (wysoki) @@ -2567,7 +2570,7 @@ Rozmiar pobierania: %3 Word count - + Liczba słów @@ -2575,7 +2578,7 @@ Rozmiar pobierania: %3 Destination offset - + Przesunięcie celu @@ -2587,7 +2590,7 @@ Rozmiar pobierania: %3 Increment - + Przyrost @@ -2599,7 +2602,7 @@ Rozmiar pobierania: %3 Decrement - + Zmniejszenie @@ -2611,7 +2614,7 @@ Rozmiar pobierania: %3 Fixed - + Stały @@ -2619,7 +2622,7 @@ Rozmiar pobierania: %3 Increment and reload - + Inkrementuj i przeładuj @@ -2627,7 +2630,7 @@ Rozmiar pobierania: %3 Source offset - + Przesunięcie źródła @@ -2635,7 +2638,7 @@ Rozmiar pobierania: %3 Repeat - + Powtórz @@ -2643,7 +2646,7 @@ Rozmiar pobierania: %3 32-bit - + 32-bitowy @@ -2651,7 +2654,7 @@ Rozmiar pobierania: %3 Start timing - + Rozpocznij czas @@ -2660,7 +2663,7 @@ Rozmiar pobierania: %3 Immediate - + Natychmiastowy @@ -2672,7 +2675,7 @@ Rozmiar pobierania: %3 VBlank - + VBlank @@ -2683,7 +2686,7 @@ Rozmiar pobierania: %3 HBlank - + HBlank @@ -2696,7 +2699,7 @@ Rozmiar pobierania: %3 IRQ - + IRQ @@ -2711,24 +2714,24 @@ Rozmiar pobierania: %3 Enable - + Włącz Audio FIFO - + Dźwiękowe FIFO Video Capture - + Przechwytywanie Wideo DRQ - + DRQ @@ -2748,7 +2751,7 @@ Rozmiar pobierania: %3 Scale - + Skala @@ -2782,13 +2785,13 @@ Rozmiar pobierania: %3 Cascade - + Kaskada A - + A @@ -2800,7 +2803,7 @@ Rozmiar pobierania: %3 Select - + Select @@ -2812,139 +2815,139 @@ Rozmiar pobierania: %3 Right - + Prawo Left - + Lewo Up - + Góra Down - + Dół R - + R L - + L Condition - + Stan SC - + SC SD - + SD SI - + SI SO - + SO VCounter - + VCounter Timer 0 - + Zegar 0 Timer 1 - + Zegar 1 Timer 2 - + Zegar 2 Timer 3 - + Zegar 3 SIO - + SIO DMA 0 - + DMA 0 DMA 1 - + DMA 1 DMA 2 - + DMA 2 DMA 3 - + DMA 3 Keypad - + Klawiatura Gamepak - + Gamepak SRAM wait - + Oczekiwanie na SRAM @@ -2984,58 +2987,58 @@ Rozmiar pobierania: %3 Cart 0 non-sequential - + Kartridż 0 niesekwencyjny Cart 0 sequential - + Kartridż 0 sekwencyjny Cart 1 non-sequential - + Kartridż 1 niesekwencyjny Cart 1 sequential - + Kartridż 1 sekwencyjny Cart 2 non-sequential - + Kartridż 2 niesekwencyjny Cart 2 sequential - + Kartridż 2 sekwencyjny PHI terminal - + Terminal PHI Disable - + Wyłącz 4.19MHz - + 4.19MHz 8.38MHz - + 8.38MHz 16.78MHz - + 16.78MHz @@ -3589,24 +3592,24 @@ Rozmiar pobierania: %3 Horizontal - + Poziomy Vertical - + Pionowy N/A - + N/D Export map - + Eksportuj mapę @@ -3619,7 +3622,7 @@ Rozmiar pobierania: %3 Save memory region - + Zapisz region pamięci @@ -3632,12 +3635,12 @@ Rozmiar pobierania: %3 Copy selection - + Kopiuj zaznaczenie Save selection - + Zapisz wybór @@ -3662,7 +3665,7 @@ Rozmiar pobierania: %3 Save selected memory - + Zapisz wybraną pamięć @@ -3672,12 +3675,12 @@ Rozmiar pobierania: %3 Load memory - + Załaduj pamięć Failed to open input file: %1 - + Nie udało się otworzyć pliku wejściowego: %1 @@ -3687,7 +3690,7 @@ Rozmiar pobierania: %3 ISO-8859-1 - + ISO-8859-1 @@ -3695,22 +3698,22 @@ Rozmiar pobierania: %3 (%0/%1×) - + (%0/%1×) (⅟%0×) - + (⅟%0×) (%0×) - + (%0×) %1 byte%2 - + %1 bajt%2 @@ -3718,7 +3721,7 @@ Rozmiar pobierania: %3 Frame %1 - + Klatka %1 @@ -3727,12 +3730,12 @@ Rozmiar pobierania: %3 0x%0 - + 0x%0 Off - + Wyłączony @@ -3744,7 +3747,7 @@ Rozmiar pobierania: %3 --- - + --- @@ -3754,28 +3757,28 @@ Rozmiar pobierania: %3 Trans - + Trans OBJWIN - + OBJWIN Invalid - + Nieważny N/A - + N/D Export sprite - + Eksportuj sprite @@ -3788,17 +3791,17 @@ Rozmiar pobierania: %3 Official MBCs - + Oficjalne MBC Licensed MBCs - + Licencjonowane MBC Unlicensed MBCs - + Nielicencjonowane MBC @@ -3806,12 +3809,12 @@ Rozmiar pobierania: %3 #%0 - + #%0 0x%0 - + 0x%0 @@ -3824,17 +3827,17 @@ Rozmiar pobierania: %3 Export palette - + Eksportuj paletę Windows PAL (*.pal);;Adobe Color Table (*.act) - + Windows PAL (*.pal);;Adobe Color Table (*.act) Failed to open output palette file: %1 - + Nie udało się otworzyć pliku palety wyjściowej: %1 @@ -3846,18 +3849,18 @@ Rozmiar pobierania: %3 (unknown) - + (nieznany) bytes - + bajty (no database present) - + (brak bazy danych) @@ -3865,12 +3868,12 @@ Rozmiar pobierania: %3 Bug report archive - + Archiwum raportów o błędach ZIP archive (*.zip) - + Archiwum ZIP (*.zip) @@ -3878,62 +3881,62 @@ Rozmiar pobierania: %3 Save games and save states (%1) - + Zapisane gry i stany zapisu (%1) Select save game or save state - + Wybierz zapis gry lub stan zapisu Save games (%1) - + Zapisane gry (%1) Select save game - + Wybierz zapis gry Conversion failed - + Konwersja nie powiodła się Failed to convert the save game. This is probably a bug. - + Nie udało się przekonwertować zapisanej gry. To prawdopodobnie błąd. No file selected - + Nie wybrano pliku Could not open file - + Nie można otworzyć pliku No valid formats found - + Nie znaleziono prawidłowych formatów Please select a valid input file - + Wybierz prawidłowy plik wejściowy No valid conversions found - + Nie znaleziono prawidłowych konwersji Cannot convert save games between platforms - + Nie można konwertować zapisanych gier między platformami @@ -3942,27 +3945,27 @@ Rozmiar pobierania: %3 Qt Multimedia - + Qt Multimedia SDL - + SDL Software (Qt) - + Software (Qt) OpenGL - + OpenGL OpenGL (force version 1.x) - + OpenGL (wymuś wersję 1.x) @@ -3972,75 +3975,75 @@ Rozmiar pobierania: %3 None (Still Image) - + Brak (Obraz Nieruchomy) Keyboard - + Klawiatura Controllers - + Kontrolery Shortcuts - + Skróty Shaders - + Shadery Select BIOS - + Wybierz BIOS Select directory - + Wybierz katalog (%1×%2) - + (%1×%2) Never - + Nigdy Just now - + Właśnie teraz Less than an hour ago - + Mniej niż godzinę temu %n hour(s) ago - - - - + + %n godzinę temu + %n godziny temu + %n godzin temu %n day(s) ago - - - - + + %n dzień temu + %n dni temu + %n dni temu @@ -4049,32 +4052,32 @@ Rozmiar pobierania: %3 No shader active - + Brak aktywnych shaderów Load shader - + Załaduj shader No shader loaded - + Nie załadowano shadera by %1 - + autorstwa %1 Preprocessing - + Przetwarzanie wstępne Pass %1 - + Przejście %1 @@ -4082,17 +4085,17 @@ Rozmiar pobierania: %3 Action - + Akcja Keyboard - + Klawiatura Gamepad - + Kontroler @@ -4100,7 +4103,7 @@ Rozmiar pobierania: %3 Export tiles - + Eksportuj kafelki @@ -4111,7 +4114,7 @@ Rozmiar pobierania: %3 Export tile - + Eksportuj kafelek @@ -4119,12 +4122,12 @@ Rozmiar pobierania: %3 Failed to open output video file: %1 - + Nie udało się otworzyć wyjściowego pliku wideo: %1 Native (%0x%1) - + Natywny (%0x%1) @@ -4137,90 +4140,90 @@ Rozmiar pobierania: %3 Game Boy Advance ROMs (%1) - + ROMy Game Boy Advance (%1) Game Boy ROMs (%1) - + ROMy Game Boy (%1) All ROMs (%1) - + Wszystkie ROMy (%1) %1 Video Logs (*.mvl) - + Dzienniki wideo %1 (*.mvl) Archives (%1) - + Archiwa (%1) Select ROM - + Wybierz ROM Select folder - + Wybierz katalog Select save - + Wybierz zapis Select patch - + Wybierz łatkę Patches (*.ips *.ups *.bps) - + Łatki (*.ips *.ups *.bps) Select e-Reader dotcode - + Wybierz kod kropki e-Reader e-Reader card (*.raw *.bin *.bmp) - + Karta e-Reader (*.raw *.bin *.bmp) Select image - + Wybierz obraz Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + Plik obrazu (*.png *.gif *.jpg *.jpeg);;Wszystkie pliki (*) GameShark saves (*.sps *.xps) - + Zapisy GameShark (*.sps *.xps) Select video log - + Wybierz dziennik wideo Video logs (*.mvl) - + Dzienniki wideo (*.mvl) @@ -4232,37 +4235,39 @@ Rozmiar pobierania: %3 The game has crashed with the following error: %1 - + Gra uległa awarii z następującym błędem: + +%1 Couldn't Start - + Nie udało się uruchomić Could not start game. - + Nie udało się rozpocząć gry. Unimplemented BIOS call - + Niewdrożone wywołanie BIOS This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Ta gra używa wywołania BIOS, które nie jest zaimplementowane. Aby uzyskać najlepsze wrażenia, użyj oficjalnego BIOS. Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Nie udało się utworzyć odpowiedniego urządzenia wyświetlającego, powracam do wyświetlania programowego. Gry mogą działać wolno, zwłaszcza w przypadku większych okien. Really make portable? - + Naprawdę stworzyć wersję portable? @@ -4408,7 +4413,7 @@ Rozmiar pobierania: %3 Make portable - + Stwórz wersję portable diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index c25fc5cfe..05cc072cd 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -390,7 +390,7 @@ Game Boy Advance - зарегистрированная торговая мар %1 State - + %1 состояние @@ -496,7 +496,7 @@ Game Boy Advance - зарегистрированная торговая мар Fatal - + Фатальная ошибка @@ -612,7 +612,7 @@ Game Boy Advance - зарегистрированная торговая мар Guess - + Догадка @@ -1043,7 +1043,7 @@ Game Boy Advance - зарегистрированная торговая мар Memory bank controller - + Контроллер банка памяти @@ -1197,13 +1197,15 @@ Game Boy Advance - зарегистрированная торговая мар Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + +Вы хотите скачать и установить сейчас? Вам надо будет перезагрузить эмулятор когда загрузка закончится. Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + +Автообновление не доступно на этой платформе. Если вы хотите обновить эмулятор вам нужно сделать это вручную. @@ -1301,7 +1303,7 @@ Download size: %3 Reset r%1-%2 %3 - + Сброс r%1-%2 %3 @@ -2335,7 +2337,7 @@ Download size: %3 0 - 0 + 0 @@ -2348,7 +2350,7 @@ Download size: %3 1 - 1 + 1 diff --git a/src/platform/switch/CMakeLists.txt b/src/platform/switch/CMakeLists.txt index 41b93985d..a12473b4c 100644 --- a/src/platform/switch/CMakeLists.txt +++ b/src/platform/switch/CMakeLists.txt @@ -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}) diff --git a/src/platform/wii/CMakeLists.txt b/src/platform/wii/CMakeLists.txt index ed27fae90..3fead14c8 100644 --- a/src/platform/wii/CMakeLists.txt +++ b/src/platform/wii/CMakeLists.txt @@ -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}) diff --git a/src/util/vfs/vfs-fd.c b/src/util/vfs/vfs-fd.c index 01a08e7c7..54046aa10 100644 --- a/src/util/vfs/vfs-fd.c +++ b/src/util/vfs/vfs-fd.c @@ -7,11 +7,13 @@ #include #include -#ifndef _WIN32 +#ifdef _WIN32 +#include +#elif defined(_POSIX_MAPPED_FILES) #include #include #else -#include +#include #endif #include @@ -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