From 45c97640739198cf9a9cc5c42e81fb9811702b46 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Thu, 3 Sep 2015 14:49:59 -0300 Subject: main.cpp -> {android-main, desktop-main} This is needed to compile both in a single call to make. Also it will help removing some of the mistakes in the current android version: it always created the mainwindow, even without using it for anything, so tons of memory will be freed now for the android version, making it snappier and smoother. This is a necessary move so we don't need to #ifdef all over the place for the two different versions, and imo the changes needed to keep both versions will not be that huge if we keep things in subsurface-core sane. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- CMakeLists.txt | 52 +++++++++++++---------- main.cpp | 97 ------------------------------------------- qt-gui.cpp | 91 ---------------------------------------- subsurface-android-helper.cpp | 74 +++++++++++++++++++++++++++++++++ subsurface-android-main.cpp | 81 ++++++++++++++++++++++++++++++++++++ subsurface-desktop-helper.cpp | 62 +++++++++++++++++++++++++++ subsurface-desktop-main.cpp | 97 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 344 insertions(+), 210 deletions(-) delete mode 100644 main.cpp delete mode 100644 qt-gui.cpp create mode 100644 subsurface-android-helper.cpp create mode 100644 subsurface-android-main.cpp create mode 100644 subsurface-desktop-helper.cpp create mode 100644 subsurface-desktop-main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 74b9d0d94..620b496ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,9 +347,10 @@ source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) # the main app. set(SUBSURFACE_APP - main.cpp - qt-gui.cpp + subsurface-desktop-main.cpp + subsurface-desktop-helper.cpp ) + source_group("Subsurface App" FILES ${SUBSURFACE_APP}) add_library(subsurface_models STATIC ${SUBSURFACE_MODELS_LIB_SRCS}) @@ -366,13 +367,19 @@ add_subdirectory(desktop-widgets) # create the executables if(SUBSURFACE_MOBILE) - set(MOBILE_SRC qt-mobile/qmlmanager.cpp qt-mobile/qmlprofile.cpp qt-models/divelistmodel.cpp) + set(MOBILE_SRC + qt-mobile/qmlmanager.cpp + qt-mobile/qmlprofile.cpp + qt-models/divelistmodel.cpp + subsurface-android-main.cpp + subsurface-android-helper.cpp + ) add_definitions(-DSUBSURFACE_MOBILE) qt5_add_resources(MOBILE_RESOURCES qt-mobile/mobile-resources.qrc) if(ANDROID) - add_library(subsurface-mobile SHARED ${MOBILE_SRC} ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES}) + add_library(subsurface-mobile SHARED ${MOBILE_SRC} ${SUBSURFACE_PKG} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES}) else() - add_executable(subsurface-mobile ${MOBILE_SRC} ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES}) + add_executable(subsurface-mobile ${MOBILE_SRC} ${SUBSURFACE_PKG} ${SUBSURFACE_RESOURCES} ${MOBILE_RESOURCES}) endif() target_link_libraries( subsurface-mobile @@ -383,25 +390,26 @@ if(SUBSURFACE_MOBILE) subsurface_models subsurface_corelib ${SUBSURFACE_LINK_LIBRARIES}) +endif() + +if(ANDROID) + # Produce a shared-library instead of a program. + # Something that androiddeployqt can work with. + # this is the desktop version, running on android. + add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) else() - if(ANDROID) - # Produce a shared-library instead of a program. - # Something that androiddeployqt can work with. - add_library(${SUBSURFACE_TARGET} SHARED ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) - else() - add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) - endif() - target_link_libraries( - ${SUBSURFACE_TARGET} - subsurface_generated_ui - subsurface_interface - subsurface_profile - subsurface_statistics - subsurface_models - subsurface_corelib - ${SUBSURFACE_LINK_LIBRARIES} -) + add_executable(${SUBSURFACE_TARGET} MACOSX_BUNDLE WIN32 ${SUBSURFACE_PKG} ${SUBSURFACE_APP} ${SUBSURFACE_RESOURCES}) endif() +target_link_libraries( + ${SUBSURFACE_TARGET} + subsurface_generated_ui + subsurface_interface + subsurface_profile + subsurface_statistics + subsurface_models + subsurface_corelib + ${SUBSURFACE_LINK_LIBRARIES} +) add_dependencies(subsurface_statistics subsurface_generated_ui) add_dependencies(subsurface_profile subsurface_generated_ui) diff --git a/main.cpp b/main.cpp deleted file mode 100644 index e7259c3f3..000000000 --- a/main.cpp +++ /dev/null @@ -1,97 +0,0 @@ -/* main.c */ -#include -#include -#include -#include -#include - -#include "dive.h" -#include "qt-gui.h" -#include "subsurfacestartup.h" -#include "desktop-widgets/mainwindow.h" -#include "desktop-widgets/diveplanner.h" -#include "subsurface-core/color.h" -#include "qthelper.h" - -#include -#include -#include -#include - -QTranslator *qtTranslator, *ssrfTranslator; - -int main(int argc, char **argv) -{ - int i; - bool no_filenames = true; - QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); - QApplication *application = new QApplication(argc, argv); - QStringList files; - QStringList importedFiles; - QStringList arguments = QCoreApplication::arguments(); - - bool dedicated_console = arguments.length() > 1 && - (arguments.at(1) == QString("--win32console")); - subsurface_console_init(dedicated_console); - - const char *default_directory = system_default_directory(); - const char *default_filename = system_default_filename(); - subsurface_mkdir(default_directory); - - for (i = 1; i < arguments.length(); i++) { - QString a = arguments.at(i); - if (a.isEmpty()) - continue; - if (a.at(0) == '-') { - parse_argument(a.toLocal8Bit().data()); - continue; - } - if (imported) { - importedFiles.push_back(a); - } else { - no_filenames = false; - files.push_back(a); - } - } -#if !LIBGIT2_VER_MAJOR && LIBGIT2_VER_MINOR < 22 - git_threads_init(); -#else - git_libgit2_init(); -#endif - setup_system_prefs(); - copy_prefs(&default_prefs, &prefs); - fill_profile_color(); - parse_xml_init(); - taglist_init_global(); - init_ui(); - if (no_filenames) { - if (prefs.default_file_behavior == LOCAL_DEFAULT_FILE) { - QString defaultFile(prefs.default_filename); - if (!defaultFile.isEmpty()) - files.push_back(QString(prefs.default_filename)); - } else if (prefs.default_file_behavior == CLOUD_DEFAULT_FILE) { - QString cloudURL; - if (getCloudURL(cloudURL) == 0) - files.push_back(cloudURL); - } - } - MainWindow *m = MainWindow::instance(); - m->setLoadedWithFiles(!files.isEmpty() || !importedFiles.isEmpty()); - m->loadFiles(files); - m->importFiles(importedFiles); - // in case something has gone wrong make sure we show the error message - m->showError(); - - if (verbose > 0) - print_files(); - if (!quit) - run_ui(); - exit_ui(); - taglist_free(g_tag_list); - parse_xml_exit(); - free((void *)default_directory); - free((void *)default_filename); - subsurface_console_exit(); - free_prefs(); - return 0; -} diff --git a/qt-gui.cpp b/qt-gui.cpp deleted file mode 100644 index 5c7157fe6..000000000 --- a/qt-gui.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* qt-gui.cpp */ -/* Qt UI implementation */ -#include "dive.h" -#include "display.h" -#include "desktop-widgets/mainwindow.h" -#include "helpers.h" - -#include -#include -#include -#include - - -#include "qt-gui.h" - -#ifdef SUBSURFACE_MOBILE -#include -#include -#include -#include -#include "qt-mobile/qmlmanager.h" -#include "qt-models/divelistmodel.h" -#include "qt-mobile/qmlprofile.h" -QObject *qqWindowObject = NULL; -#endif - -static MainWindow *window = NULL; - -void init_ui() -{ - init_qt_late(); - - window = new MainWindow(); - if (existing_filename && existing_filename[0] != '\0') - window->setTitle(MWTF_FILENAME); - else - window->setTitle(MWTF_DEFAULT); -} - -void run_ui() -{ -#ifdef SUBSURFACE_MOBILE - window->hide(); - qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLManager"); - qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLProfile"); - QQmlApplicationEngine engine; - DiveListModel diveListModel; - QSortFilterProxyModel *sortModel = new QSortFilterProxyModel(0); - sortModel->setSourceModel(&diveListModel); - sortModel->setDynamicSortFilter(true); - sortModel->setSortRole(DiveListModel::DiveDateRole); - sortModel->sort(0, Qt::DescendingOrder); - QQmlContext *ctxt = engine.rootContext(); - ctxt->setContextProperty("diveModel", sortModel); - engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml"))); - qqWindowObject = engine.rootObjects().value(0); - if (!qqWindowObject) { - fprintf(stderr, "can't create window object\n"); - exit(1); - } - QQuickWindow *qml_window = qobject_cast(qqWindowObject); - qml_window->setIcon(QIcon(":/subsurface-mobile-icon")); - qqWindowObject->setProperty("messageText", QVariant("Subsurface mobile startup")); -#if !defined(Q_OS_ANDROID) - qml_window->setHeight(1200); - qml_window->setWidth(800); -#endif - qml_window->show(); -#else - window->show(); -#endif - qApp->exec(); -} - -void exit_ui() -{ - delete window; - delete qApp; - free((void *)existing_filename); - free((void *)default_dive_computer_vendor); - free((void *)default_dive_computer_product); - free((void *)default_dive_computer_device); -} - -double get_screen_dpi() -{ - QDesktopWidget *mydesk = qApp->desktop(); - return mydesk->physicalDpiX(); -} - - diff --git a/subsurface-android-helper.cpp b/subsurface-android-helper.cpp new file mode 100644 index 000000000..7b5d5df56 --- /dev/null +++ b/subsurface-android-helper.cpp @@ -0,0 +1,74 @@ +/* qt-gui.cpp */ +/* Qt UI implementation */ +#include "dive.h" +#include "display.h" +#include "desktop-widgets/mainwindow.h" +#include "helpers.h" + +#include +#include +#include +#include + +#include "qt-gui.h" + +#include +#include +#include +#include +#include "qt-mobile/qmlmanager.h" +#include "qt-models/divelistmodel.h" +#include "qt-mobile/qmlprofile.h" + +QObject *qqWindowObject = NULL; + +void init_ui() +{ + init_qt_late(); +} + +void run_ui() +{ + window->hide(); + qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLManager"); + qmlRegisterType("org.subsurfacedivelog.mobile", 1, 0, "QMLProfile"); + QQmlApplicationEngine engine; + DiveListModel diveListModel; + QSortFilterProxyModel *sortModel = new QSortFilterProxyModel(0); + sortModel->setSourceModel(&diveListModel); + sortModel->setDynamicSortFilter(true); + sortModel->setSortRole(DiveListModel::DiveDateRole); + sortModel->sort(0, Qt::DescendingOrder); + QQmlContext *ctxt = engine.rootContext(); + ctxt->setContextProperty("diveModel", sortModel); + engine.load(QUrl(QStringLiteral("qrc:///qml/main.qml"))); + qqWindowObject = engine.rootObjects().value(0); + if (!qqWindowObject) { + fprintf(stderr, "can't create window object\n"); + exit(1); + } + QQuickWindow *qml_window = qobject_cast(qqWindowObject); + qml_window->setIcon(QIcon(":/subsurface-mobile-icon")); + qqWindowObject->setProperty("messageText", QVariant("Subsurface mobile startup")); +#if !defined(Q_OS_ANDROID) + qml_window->setHeight(1200); + qml_window->setWidth(800); +#endif + qml_window->show(); + qApp->exec(); +} + +void exit_ui() +{ + delete qApp; + free((void *)existing_filename); + free((void *)default_dive_computer_vendor); + free((void *)default_dive_computer_product); + free((void *)default_dive_computer_device); +} + +double get_screen_dpi() +{ + QDesktopWidget *mydesk = qApp->desktop(); + return mydesk->physicalDpiX(); +} diff --git a/subsurface-android-main.cpp b/subsurface-android-main.cpp new file mode 100644 index 000000000..db974119e --- /dev/null +++ b/subsurface-android-main.cpp @@ -0,0 +1,81 @@ +/* main.c */ +#include +#include +#include +#include +#include + +#include "dive.h" +#include "qt-gui.h" +#include "subsurfacestartup.h" +#include "desktop-widgets/mainwindow.h" +#include "desktop-widgets/diveplanner.h" +#include "subsurface-core/color.h" +#include "qthelper.h" + +#include +#include +#include +#include + +QTranslator *qtTranslator, *ssrfTranslator; + +int main(int argc, char **argv) +{ + int i; + bool no_filenames = true; + QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); + QApplication *application = new QApplication(argc, argv); + QStringList files; + QStringList importedFiles; + QStringList arguments = QCoreApplication::arguments(); + + bool dedicated_console = arguments.length() > 1 && + (arguments.at(1) == QString("--win32console")); + subsurface_console_init(dedicated_console); + + for (i = 1; i < arguments.length(); i++) { + QString a = arguments.at(i); + if (a.at(0) == '-') { + parse_argument(a.toLocal8Bit().data()); + continue; + } + if (imported) { + importedFiles.push_back(a); + } else { + no_filenames = false; + files.push_back(a); + } + } +#if !LIBGIT2_VER_MAJOR && LIBGIT2_VER_MINOR < 22 + git_threads_init(); +#else + git_libgit2_init(); +#endif + setup_system_prefs(); + prefs = default_prefs; + fill_profile_color(); + parse_xml_init(); + taglist_init_global(); + init_ui(); + if (no_filenames) { + if (prefs.default_file_behavior == LOCAL_DEFAULT_FILE) { + QString defaultFile(prefs.default_filename); + if (!defaultFile.isEmpty()) + files.push_back(QString(prefs.default_filename)); + } else if (prefs.default_file_behavior == CLOUD_DEFAULT_FILE) { + QString cloudURL; + if (getCloudURL(cloudURL) == 0) + files.push_back(cloudURL); + } + } + + if (!quit) + run_ui(); + exit_ui(); + taglist_free(g_tag_list); + parse_xml_exit(); + subsurface_console_exit(); + free_prefs(); + return 0; +} diff --git a/subsurface-desktop-helper.cpp b/subsurface-desktop-helper.cpp new file mode 100644 index 000000000..af366fb84 --- /dev/null +++ b/subsurface-desktop-helper.cpp @@ -0,0 +1,62 @@ +/* qt-gui.cpp */ +/* Qt UI implementation */ +#include "dive.h" +#include "display.h" +#include "desktop-widgets/mainwindow.h" +#include "helpers.h" + +#include +#include +#include +#include + + +#include "qt-gui.h" + +#ifdef SUBSURFACE_MOBILE +#include +#include +#include +#include +#include "qt-mobile/qmlmanager.h" +#include "qt-models/divelistmodel.h" +#include "qt-mobile/qmlprofile.h" +QObject *qqWindowObject = NULL; +#endif + +static MainWindow *window = NULL; + +void init_ui() +{ + init_qt_late(); + + window = new MainWindow(); + if (existing_filename && existing_filename[0] != '\0') + window->setTitle(MWTF_FILENAME); + else + window->setTitle(MWTF_DEFAULT); +} + +void run_ui() +{ + window->show(); + qApp->exec(); +} + +void exit_ui() +{ + delete window; + delete qApp; + free((void *)existing_filename); + free((void *)default_dive_computer_vendor); + free((void *)default_dive_computer_product); + free((void *)default_dive_computer_device); +} + +double get_screen_dpi() +{ + QDesktopWidget *mydesk = qApp->desktop(); + return mydesk->physicalDpiX(); +} + + diff --git a/subsurface-desktop-main.cpp b/subsurface-desktop-main.cpp new file mode 100644 index 000000000..e7259c3f3 --- /dev/null +++ b/subsurface-desktop-main.cpp @@ -0,0 +1,97 @@ +/* main.c */ +#include +#include +#include +#include +#include + +#include "dive.h" +#include "qt-gui.h" +#include "subsurfacestartup.h" +#include "desktop-widgets/mainwindow.h" +#include "desktop-widgets/diveplanner.h" +#include "subsurface-core/color.h" +#include "qthelper.h" + +#include +#include +#include +#include + +QTranslator *qtTranslator, *ssrfTranslator; + +int main(int argc, char **argv) +{ + int i; + bool no_filenames = true; + QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); + QApplication *application = new QApplication(argc, argv); + QStringList files; + QStringList importedFiles; + QStringList arguments = QCoreApplication::arguments(); + + bool dedicated_console = arguments.length() > 1 && + (arguments.at(1) == QString("--win32console")); + subsurface_console_init(dedicated_console); + + const char *default_directory = system_default_directory(); + const char *default_filename = system_default_filename(); + subsurface_mkdir(default_directory); + + for (i = 1; i < arguments.length(); i++) { + QString a = arguments.at(i); + if (a.isEmpty()) + continue; + if (a.at(0) == '-') { + parse_argument(a.toLocal8Bit().data()); + continue; + } + if (imported) { + importedFiles.push_back(a); + } else { + no_filenames = false; + files.push_back(a); + } + } +#if !LIBGIT2_VER_MAJOR && LIBGIT2_VER_MINOR < 22 + git_threads_init(); +#else + git_libgit2_init(); +#endif + setup_system_prefs(); + copy_prefs(&default_prefs, &prefs); + fill_profile_color(); + parse_xml_init(); + taglist_init_global(); + init_ui(); + if (no_filenames) { + if (prefs.default_file_behavior == LOCAL_DEFAULT_FILE) { + QString defaultFile(prefs.default_filename); + if (!defaultFile.isEmpty()) + files.push_back(QString(prefs.default_filename)); + } else if (prefs.default_file_behavior == CLOUD_DEFAULT_FILE) { + QString cloudURL; + if (getCloudURL(cloudURL) == 0) + files.push_back(cloudURL); + } + } + MainWindow *m = MainWindow::instance(); + m->setLoadedWithFiles(!files.isEmpty() || !importedFiles.isEmpty()); + m->loadFiles(files); + m->importFiles(importedFiles); + // in case something has gone wrong make sure we show the error message + m->showError(); + + if (verbose > 0) + print_files(); + if (!quit) + run_ui(); + exit_ui(); + taglist_free(g_tag_list); + parse_xml_exit(); + free((void *)default_directory); + free((void *)default_filename); + subsurface_console_exit(); + free_prefs(); + return 0; +} -- cgit v1.2.3-70-g09d2