From dbfc39468b3511987cee47e531f00aa8ba92c7d4 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 20:45:24 +0200 Subject: [PATCH 1/7] better workaround --- apps/launcher/graphicspage.cpp | 102 +++++++++++---------------------- apps/launcher/graphicspage.hpp | 13 ----- apps/launcher/main.cpp | 12 +++- 3 files changed, 43 insertions(+), 84 deletions(-) diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index 615b389d2..ad3b2493a 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -153,80 +153,19 @@ bool GraphicsPage::setupOgre() bool GraphicsPage::setupSDL() { - // FIXME: do setupSDLWordaround here instead. - // seems like Qt, SDL and Ogre don't like each other - // results in a segfault if SDL is initialized after Qt - - QStringList screens; - for (int i = 0; i < mScreenCount; i++) - { - screens.append(QString("Screen ") + QString::number(i + 1)); - } - screenComboBox->addItems(screens); - - return true; -} - -std::vector GraphicsPage::mVideoModes; -int GraphicsPage::mScreenCount; - -bool GraphicsPage::setupSDLWordaround() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) - { - std::cout << "SDL_Init failed: " << SDL_GetError() << std::endl; - return false; - } - - SDL_DisplayMode mode; - int displayIndex, modeIndex, displays = SDL_GetNumVideoDisplays(); - mScreenCount = displays; + int displays = SDL_GetNumVideoDisplays(); if(displays < 0) { - std::cout << "SDL_GetNumVideoDisplays failed: " << SDL_GetError() << std::endl; - SDL_Quit(); + qDebug() << "SDL_GetNumVideoDisplays failed: " << QString::fromStdString(SDL_GetError()); return false; } - for (displayIndex = 0; displayIndex < displays; displayIndex++) + for (int i = 0; i < displays; i++) { - int modes = SDL_GetNumDisplayModes(displayIndex); - if(modes < 0) - { - std::cout << "SDL_GetNumDisplayModes failed: " << SDL_GetError() << std::endl; - SDL_Quit(); - return false; - } - for (modeIndex = 0; modeIndex < modes; modeIndex++) - { - if (SDL_GetDisplayMode(displayIndex, modeIndex, &mode) < 0) - { - std::cout << "SDL_GetDisplayMode failed: " << SDL_GetError() << std::endl; - SDL_Quit(); - return false; - } - - bool isDouble = false; - for (std::vector::iterator it = mVideoModes.begin(); it != mVideoModes.end(); it++) - { - if ((*it).w == mode.w && (*it).h == mode.h && (*it).screen == displayIndex) - { - isDouble = true; - break; - } - } - if (isDouble) - continue; - - VideoMode vmode; - vmode.w = mode.w; - vmode.h = mode.h; - vmode.screen = displayIndex; - mVideoModes.push_back(vmode); - } + screenComboBox->addItem(QString("Screen ") + QString::number(i + 1)); } - SDL_Quit(); return true; } @@ -337,10 +276,35 @@ QStringList GraphicsPage::getAvailableOptions(const QString &key, Ogre::RenderSy QStringList GraphicsPage::getAvailableResolutions(int screen) { QStringList result; - for (std::vector::iterator it = mVideoModes.begin(); it != mVideoModes.end(); it++) + SDL_DisplayMode mode; + int modeIndex, modes = SDL_GetNumDisplayModes(screen); + + if(modes < 0) { - VideoMode mode = *it; - if(mode.screen != screen) + qDebug() << "SDL_GetNumDisplayModes failed: " << QString::fromStdString(SDL_GetError()); + return result; + } + + QList resolutions; + for (modeIndex = 0; modeIndex < modes; modeIndex++) + { + if (SDL_GetDisplayMode(screen, modeIndex, &mode) < 0) + { + qDebug() << "SDL_GetDisplayMode failed: " << QString::fromStdString(SDL_GetError()); + return result; + } + + bool isDuplicate = false; + for (int i = 0; i < resolutions.count(); i++) + { + SDL_DisplayMode omode = resolutions.at(i); + if (omode.w == mode.w && omode.h == mode.h) + { + isDuplicate = true; + break; + } + } + if (isDuplicate) continue; QString aspect = getAspect(mode.w, mode.h); @@ -353,8 +317,10 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) resolution.append(tr("\t(Standard 4:3)")); } + resolutions.append(mode); result.append(resolution); } + return result; } diff --git a/apps/launcher/graphicspage.hpp b/apps/launcher/graphicspage.hpp index 5ed4e5632..07330f193 100644 --- a/apps/launcher/graphicspage.hpp +++ b/apps/launcher/graphicspage.hpp @@ -18,13 +18,6 @@ #include "ui_graphicspage.h" -struct VideoMode -{ - int w; - int h; - int screen; -}; - class GraphicsSettings; namespace Files { struct ConfigurationManager; } @@ -39,9 +32,6 @@ public: void saveSettings(); bool loadSettings(); - // SDL workaround - static bool setupSDLWordaround(); - public slots: void rendererChanged(const QString &renderer); void screenChanged(const QString &screen); @@ -69,9 +59,6 @@ private: QStringList getAvailableResolutions(int screen); QRect getMaximumResolution(); - static std::vector mVideoModes; - static int mScreenCount; - bool setupOgre(); bool setupSDL(); }; diff --git a/apps/launcher/main.cpp b/apps/launcher/main.cpp index e444bb9f2..c6df5a909 100644 --- a/apps/launcher/main.cpp +++ b/apps/launcher/main.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "maindialog.hpp" // SDL workaround @@ -8,8 +9,11 @@ int main(int argc, char *argv[]) { - // SDL woraround - GraphicsPage::setupSDLWordaround(); + if (SDL_Init(SDL_INIT_VIDEO) != 0) + { + qDebug() << "SDL_Init failed: " << QString::fromStdString(SDL_GetError()); + return false; + } QApplication app(argc, argv); @@ -46,6 +50,8 @@ int main(int argc, char *argv[]) return 0; } - return app.exec(); + int returnValue = app.exec(); + SDL_Quit(); + return returnValue; } From 6abb5d5f751d4fd0bc2077a58808c691d21ceab7 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 20:53:50 +0200 Subject: [PATCH 2/7] small fixes --- apps/launcher/graphicspage.cpp | 8 ++++---- apps/launcher/main.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index ad3b2493a..b185b3cd2 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -155,7 +155,7 @@ bool GraphicsPage::setupSDL() { int displays = SDL_GetNumVideoDisplays(); - if(displays < 0) + if (displays < 0) { qDebug() << "SDL_GetNumVideoDisplays failed: " << QString::fromStdString(SDL_GetError()); return false; @@ -235,7 +235,7 @@ void GraphicsPage::saveSettings() } QRegExp screenRe(QString(".*(\\d+)")); - if(screenRe.exactMatch(screenComboBox->currentText())) { + if (screenRe.exactMatch(screenComboBox->currentText())) { mGraphicsSettings.setValue(QString("Video/screen"), screenRe.cap(1)); } } @@ -279,7 +279,7 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) SDL_DisplayMode mode; int modeIndex, modes = SDL_GetNumDisplayModes(screen); - if(modes < 0) + if (modes < 0) { qDebug() << "SDL_GetNumDisplayModes failed: " << QString::fromStdString(SDL_GetError()); return result; @@ -351,7 +351,7 @@ void GraphicsPage::rendererChanged(const QString &renderer) void GraphicsPage::screenChanged(const QString &screen) { QRegExp screenRe(QString(".*(\\d+)")); - if(screenRe.exactMatch(screen)) { + if (screenRe.exactMatch(screen)) { resolutionComboBox->clear(); resolutionComboBox->addItems(getAvailableResolutions(screenRe.cap(1).toInt() - 1)); } diff --git a/apps/launcher/main.cpp b/apps/launcher/main.cpp index c6df5a909..5537bdb1a 100644 --- a/apps/launcher/main.cpp +++ b/apps/launcher/main.cpp @@ -12,7 +12,7 @@ int main(int argc, char *argv[]) if (SDL_Init(SDL_INIT_VIDEO) != 0) { qDebug() << "SDL_Init failed: " << QString::fromStdString(SDL_GetError()); - return false; + return 0; } QApplication app(argc, argv); From 89dee80dcff9b726d8132f74a6e0754d3338ee61 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 21:04:49 +0200 Subject: [PATCH 3/7] simpler remove of duplicates --- apps/launcher/graphicspage.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index b185b3cd2..333dff121 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -285,7 +285,6 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) return result; } - QList resolutions; for (modeIndex = 0; modeIndex < modes; modeIndex++) { if (SDL_GetDisplayMode(screen, modeIndex, &mode) < 0) @@ -294,19 +293,6 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) return result; } - bool isDuplicate = false; - for (int i = 0; i < resolutions.count(); i++) - { - SDL_DisplayMode omode = resolutions.at(i); - if (omode.w == mode.w && omode.h == mode.h) - { - isDuplicate = true; - break; - } - } - if (isDuplicate) - continue; - QString aspect = getAspect(mode.w, mode.h); QString resolution = QString::number(mode.w) + QString(" x ") + QString::number(mode.h); @@ -317,10 +303,10 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) resolution.append(tr("\t(Standard 4:3)")); } - resolutions.append(mode); result.append(resolution); } + result.removeDuplicates(); return result; } From c97fac811699b754174eedb49b7aed517afd4266 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 21:16:51 +0200 Subject: [PATCH 4/7] use QMessageBox to show errors --- apps/launcher/graphicspage.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index 333dff121..f6550f2a1 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -157,7 +157,12 @@ bool GraphicsPage::setupSDL() if (displays < 0) { - qDebug() << "SDL_GetNumVideoDisplays failed: " << QString::fromStdString(SDL_GetError()); + QMessageBox msgBox; + msgBox.setWindowTitle(tr("Error receiving number of screens")); + msgBox.setIcon(QMessageBox::Critical); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("
SDL_GetNumDisplayModes failed:

") + QString::fromStdString(SDL_GetError()) + "
"); + msgBox.exec(); return false; } @@ -281,7 +286,12 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) if (modes < 0) { - qDebug() << "SDL_GetNumDisplayModes failed: " << QString::fromStdString(SDL_GetError()); + QMessageBox msgBox; + msgBox.setWindowTitle(tr("Error receiving resolutions")); + msgBox.setIcon(QMessageBox::Critical); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("
SDL_GetNumDisplayModes failed:

") + QString::fromStdString(SDL_GetError()) + "
"); + msgBox.exec(); return result; } @@ -289,7 +299,12 @@ QStringList GraphicsPage::getAvailableResolutions(int screen) { if (SDL_GetDisplayMode(screen, modeIndex, &mode) < 0) { - qDebug() << "SDL_GetDisplayMode failed: " << QString::fromStdString(SDL_GetError()); + QMessageBox msgBox; + msgBox.setWindowTitle(tr("Error receiving resolutions")); + msgBox.setIcon(QMessageBox::Critical); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setText(tr("
SDL_GetDisplayMode failed:

") + QString::fromStdString(SDL_GetError()) + "
"); + msgBox.exec(); return result; } From 357974a4291f4b7a8de63654731283187007e1b0 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 21:34:41 +0200 Subject: [PATCH 5/7] more minor stuff --- apps/launcher/main.cpp | 1 + files/settings-default.cfg | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/launcher/main.cpp b/apps/launcher/main.cpp index 5537bdb1a..414e1a003 100644 --- a/apps/launcher/main.cpp +++ b/apps/launcher/main.cpp @@ -9,6 +9,7 @@ int main(int argc, char *argv[]) { + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "software"); if (SDL_Init(SDL_INIT_VIDEO) != 0) { qDebug() << "SDL_Init failed: " << QString::fromStdString(SDL_GetError()); diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 69aa20883..1819ebb0a 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -6,6 +6,7 @@ resolution x = 800 resolution y = 600 fullscreen = false +screen = 1 # Render system # blank means default From 20e591fe187e61c64dcab4b37854c980165701f0 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 21:56:27 +0200 Subject: [PATCH 6/7] use index instead of string manipulation --- apps/launcher/graphicspage.cpp | 20 +++++++------------- apps/launcher/graphicspage.hpp | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/apps/launcher/graphicspage.cpp b/apps/launcher/graphicspage.cpp index f6550f2a1..1bbf7f897 100644 --- a/apps/launcher/graphicspage.cpp +++ b/apps/launcher/graphicspage.cpp @@ -43,7 +43,7 @@ GraphicsPage::GraphicsPage(Files::ConfigurationManager &cfg, GraphicsSettings &g connect(rendererComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(rendererChanged(const QString&))); connect(fullScreenCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotFullScreenChanged(int))); connect(standardRadioButton, SIGNAL(toggled(bool)), this, SLOT(slotStandardToggled(bool))); - connect(screenComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(screenChanged(const QString&))); + connect(screenComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(screenChanged(int))); } @@ -168,7 +168,7 @@ bool GraphicsPage::setupSDL() for (int i = 0; i < displays; i++) { - screenComboBox->addItem(QString("Screen ") + QString::number(i + 1)); + screenComboBox->addItem(QString(tr("Screen ")) + QString::number(i + 1)); } return true; @@ -196,9 +196,7 @@ bool GraphicsPage::loadSettings() QString resolution = width + QString(" x ") + height; QString screen = mGraphicsSettings.value(QString("Video/screen")); - int screenIndex = screenComboBox->findText(QString("Screen ") + screen); - if (screenIndex != -1) - screenComboBox->setCurrentIndex(screenIndex); + screenComboBox->setCurrentIndex(screen.toInt()); int resIndex = resolutionComboBox->findText(resolution, Qt::MatchStartsWith); @@ -239,10 +237,7 @@ void GraphicsPage::saveSettings() mGraphicsSettings.setValue(QString("Video/resolution y"), QString::number(customHeightSpinBox->value())); } - QRegExp screenRe(QString(".*(\\d+)")); - if (screenRe.exactMatch(screenComboBox->currentText())) { - mGraphicsSettings.setValue(QString("Video/screen"), screenRe.cap(1)); - } + mGraphicsSettings.setValue(QString("Video/screen"), QString::number(screenComboBox->currentIndex())); } QStringList GraphicsPage::getAvailableOptions(const QString &key, Ogre::RenderSystem *renderer) @@ -349,12 +344,11 @@ void GraphicsPage::rendererChanged(const QString &renderer) antiAliasingComboBox->addItems(getAvailableOptions(QString("FSAA"), mSelectedRenderSystem)); } -void GraphicsPage::screenChanged(const QString &screen) +void GraphicsPage::screenChanged(int screen) { - QRegExp screenRe(QString(".*(\\d+)")); - if (screenRe.exactMatch(screen)) { + if (screen >= 0) { resolutionComboBox->clear(); - resolutionComboBox->addItems(getAvailableResolutions(screenRe.cap(1).toInt() - 1)); + resolutionComboBox->addItems(getAvailableResolutions(screen)); } } diff --git a/apps/launcher/graphicspage.hpp b/apps/launcher/graphicspage.hpp index 07330f193..d233ea12e 100644 --- a/apps/launcher/graphicspage.hpp +++ b/apps/launcher/graphicspage.hpp @@ -34,7 +34,7 @@ public: public slots: void rendererChanged(const QString &renderer); - void screenChanged(const QString &screen); + void screenChanged(int screen); private slots: void slotFullScreenChanged(int state); From acaba78a11ce8f9fe9d5b3fa381fa5a75473e80a Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Sun, 23 Jun 2013 23:13:54 +0200 Subject: [PATCH 7/7] wrong number --- files/settings-default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 1819ebb0a..613f12432 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -6,7 +6,7 @@ resolution x = 800 resolution y = 600 fullscreen = false -screen = 1 +screen = 0 # Render system # blank means default