QWidget* NMGPropertyEditorDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(option); QWidget* editor = 0; if(index.column() == 1) { const QTreeWidgetItem* property = static_cast<QTreeWidgetItem*>(index.internalPointer()); int valueType = property->data(1, Qt::EditRole).type(); QString propertyName = property->text(0); switch(valueType) { case QVariant::Bool: { QComboBox* combo = new QComboBox(parent); combo->setFrame(FALSE); combo->addItems(QStringList() << QString::fromUtf8("false") << QString::fromUtf8("true")); QObject::connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(sync())); editor = combo; break; } case QVariant::String: { if(propertyName == "fontFamily") { QFontDatabase fdb; QStringList list = fdb.families(QFontDatabase::Latin); QStringList result; for(int i = 0; i < list.size(); i++) { if(fdb.isScalable(list.at(i))) result += list.at(i); } QComboBox* combo = new QComboBox(parent); combo->setFrame(FALSE); combo->addItems(result); QObject::connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(sync())); editor = combo; } else if(propertyName == "representation") { QComboBox* combo = new QComboBox(parent); combo->setFrame(FALSE); QStringList list; list << LINE_TYPE << AREA_TYPE << POINTS_TYPE << BARS_TYPE; combo->addItems(list); QObject::connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(sync())); editor = combo; } else if(propertyName == "position")
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/) { /* Start logging: */ LogFlowFuncEnter(); /* Failed result initially: */ int iResultCode = 1; #ifdef Q_WS_X11 if (!VBoxXInitThreads()) return 1; #endif /* Simulate try-catch block: */ do { #ifdef RT_OS_DARWIN ShutUpAppKit(); #endif /* RT_OS_DARWIN */ /* Console help preprocessing: */ bool fHelpShown = false; for (int i = 0; i < argc; ++i) { if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); fHelpShown = true; break; } } if (fHelpShown) { iResultCode = 0; break; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* Install our signal handler to backtrace the call stack: */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); #endif #ifdef Q_WS_MAC /* Mavericks font fix: */ if (VBoxGlobal::osRelease() == MacOSXRelease_Mavericks) QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); # ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); # endif /* QT_MAC_USE_COCOA */ #endif /* Q_WS_MAC */ /* Install Qt console message handler: */ qInstallMsgHandler(QtMessageOutput); #ifdef Q_WS_X11 /* Qt has a complex algorithm for selecting the right visual which * doesn't always seem to work. So we naively choose a visual - the * default one - ourselves and pass that to Qt. This means that we * also have to open the display ourselves. * We check the Qt parameter list and handle Qt's -display argument * ourselves, since we open the display connection. We also check the * to see if the user has passed Qt's -visual parameter, and if so we * assume that the user wants Qt to handle visual selection after all, * and don't supply a visual. */ char *pszDisplay = NULL; bool useDefaultVisual = true; for (int i = 0; i < argc; ++i) { if (!::strcmp(argv[i], "-display") && (i + 1 < argc)) /* What if it isn't? Rely on QApplication to complain? */ { pszDisplay = argv[i + 1]; ++i; } else if (!::strcmp(argv[i], "-visual")) useDefaultVisual = false; } Display *pDisplay = XOpenDisplay(pszDisplay); if (!pDisplay) { RTPrintf(pszDisplay ? "Failed to open the X11 display \"%s\"!\n" : "Failed to open the X11 display!\n", pszDisplay); break; } Visual *pVisual = useDefaultVisual ? DefaultVisual(pDisplay, DefaultScreen(pDisplay)) : NULL; /* Now create the application object: */ QApplication a(pDisplay, argc, argv, (Qt::HANDLE)pVisual); #else /* Q_WS_X11 */ QApplication a(argc, argv); #endif /* Q_WS_X11 */ #ifdef Q_OS_SOLARIS /* Use plastique look&feel for Solaris instead of the default motif (Qt 4.7.x): */ QApplication::setStyle(new QPlastiqueStyle); #endif /* Q_OS_SOLARIS */ #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ # ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily(QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable(currentFamily); QString subFamily(QFont::substitute(currentFamily)); bool isSubScaleable = fontDataBase.isScalable(subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution(currentFamily); # endif /* Q_OS_SOLARIS */ #endif /* Q_WS_X11 */ #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound(NULL, NULL, 0); #endif /* Q_WS_WIN */ #ifdef Q_WS_MAC /* Disable menu icons on MacOS X host: */ ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* Qt version check (major.minor are sensitive, fix number is ignored): */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString strMsg = QApplication::tr("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg(qAppName()) .arg(VBoxGlobal::qtCTVersionString().section('.', 0, 1)) .arg(VBoxGlobal::qtRTVersionString()); QMessageBox::critical(0, QApplication::tr("Incompatible Qt Library Error"), strMsg, QMessageBox::Abort, 0); qFatal("%s", strMsg.toAscii().constData()); break; } #endif /* Q_WS_X11 */ /* Create modal-window manager: */ UIModalWindowManager::create(); /* Create global UI instance: */ VBoxGlobal::create(); /* Simulate try-catch block: */ do { /* Exit if VBoxGlobal is not valid: */ if (!vboxGlobal().isValid()) break; /* Exit if VBoxGlobal was able to pre-process arguments: */ if (vboxGlobal().processArgs()) break; #ifdef RT_OS_LINUX /* Make sure no wrong USB mounted: */ VBoxGlobal::checkForWrongUSBMounted(); #endif /* RT_OS_LINUX */ /* Load application settings: */ VBoxGlobalSettings settings = vboxGlobal().settings(); /* VM console process: */ if (vboxGlobal().isVMConsoleProcess()) { /* Make sure VM is started: */ if (!vboxGlobal().startMachine(vboxGlobal().managedVMUuid())) break; /* Start application: */ iResultCode = a.exec(); } /* VM selector process: */ else { /* Make sure VM selector is permitted: */ if (settings.isFeatureActive("noSelector")) { msgCenter().cannotStartSelector(); break; } #ifdef VBOX_BLEEDING_EDGE msgCenter().showBEBWarning(); #else /* VBOX_BLEEDING_EDGE */ # ifndef DEBUG /* Check for BETA version: */ QString vboxVersion(vboxGlobal().virtualBox().GetVersion()); if (vboxVersion.contains("BETA")) { /* Allow to prevent this message: */ QString str = vboxGlobal().virtualBox().GetExtraData(GUI_PreventBetaWarning); if (str != vboxVersion) msgCenter().showBETAWarning(); } # endif /* !DEBUG */ #endif /* !VBOX_BLEEDING_EDGE*/ /* Create/show selector window: */ vboxGlobal().selectorWnd().show(); /* Start application: */ iResultCode = a.exec(); } } while (0); /* Destroy global UI instance: */ VBoxGlobal::destroy(); /* Destroy modal-window manager: */ UIModalWindowManager::destroy(); } while (0); /* Finish logging: */ LogFlowFunc(("rc=%d\n", iResultCode)); LogFlowFuncLeave(); /* Return result: */ return iResultCode; }
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/) { /* Start logging: */ LogFlowFuncEnter(); /* Failed result initially: */ int iResultCode = 1; #ifdef Q_WS_X11 if (!VBoxXInitThreads()) return 1; #endif /* Q_WS_X11 */ /* Simulate try-catch block: */ do { #ifdef RT_OS_DARWIN ShutUpAppKit(); #endif /* RT_OS_DARWIN */ /* Console help preprocessing: */ bool fHelpShown = false; for (int i = 0; i < argc; ++i) { if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); fHelpShown = true; break; } } if (fHelpShown) { iResultCode = 0; break; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* Install our signal handler to backtrace the call stack: */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); sigaction(SIGBUS, &sa, NULL); sigaction(SIGUSR1, &sa, NULL); #endif #ifdef VBOX_WITH_HARDENING /* Make sure the image verification code works (VBoxDbg.dll and other plugins). */ SUPR3HardenedVerifyInit(); #endif #ifdef Q_WS_MAC /* Font fixes: */ switch (VBoxGlobal::osRelease()) { case MacOSXRelease_Mavericks: QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); break; case MacOSXRelease_Yosemite: QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); break; default: break; } # ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); # endif /* QT_MAC_USE_COCOA */ #endif /* Q_WS_MAC */ /* Install Qt console message handler: */ qInstallMsgHandler(QtMessageOutput); /* Create application: */ QApplication a(argc, argv); #ifdef Q_WS_X11 /* To avoid various Qt crashes * when testing widget attributes or acquiring winIds * we decided to make our widgets native under x11 hosts. * Yes, we aware of note that alien widgets faster to draw * but the only widget we need to be fast - viewport of VM * was always native since we are using his id for 3d service needs. */ a.setAttribute(Qt::AA_NativeWindows); #endif /* Q_WS_X11 */ #ifdef Q_WS_MAC # ifdef VBOX_GUI_WITH_HIDPI /* Enable HiDPI icons. For this we require a patched version of Qt 4.x with * the changes from https://codereview.qt-project.org/#change,54636 applied. */ qApp->setAttribute(Qt::AA_UseHighDpiPixmaps); # endif /* VBOX_GUI_WITH_HIDPI */ #endif /* Q_WS_MAC */ #ifdef Q_OS_SOLARIS /* Use plastique look&feel for Solaris instead of the default motif (Qt 4.7.x): */ QApplication::setStyle(new QPlastiqueStyle); #endif /* Q_OS_SOLARIS */ #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ # ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily(QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable(currentFamily); QString subFamily(QFont::substitute(currentFamily)); bool isSubScaleable = fontDataBase.isScalable(subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution(currentFamily); # endif /* Q_OS_SOLARIS */ #endif /* Q_WS_X11 */ #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound(NULL, NULL, 0); #endif /* Q_WS_WIN */ #ifdef Q_WS_MAC /* Disable menu icons on MacOS X host: */ ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* Qt version check (major.minor are sensitive, fix number is ignored): */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString strMsg = QApplication::tr("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg(qAppName()) .arg(VBoxGlobal::qtCTVersionString().section('.', 0, 1)) .arg(VBoxGlobal::qtRTVersionString()); QMessageBox::critical(0, QApplication::tr("Incompatible Qt Library Error"), strMsg, QMessageBox::Abort, 0); qFatal("%s", strMsg.toUtf8().constData()); break; } #endif /* Q_WS_X11 */ /* Create modal-window manager: */ UIModalWindowManager::create(); /* Create global UI instance: */ VBoxGlobal::create(); /* Simulate try-catch block: */ do { /* Exit if VBoxGlobal is not valid: */ if (!vboxGlobal().isValid()) break; /* Exit if VBoxGlobal was able to pre-process arguments: */ if (vboxGlobal().processArgs()) break; #ifdef RT_OS_LINUX /* Make sure no wrong USB mounted: */ VBoxGlobal::checkForWrongUSBMounted(); #endif /* RT_OS_LINUX */ /* Load application settings: */ VBoxGlobalSettings settings = vboxGlobal().settings(); /* VM console process: */ if (vboxGlobal().isVMConsoleProcess()) { /* Make sure VM is started: */ if (!UIMachine::startMachine(vboxGlobal().managedVMUuid())) break; /* Start application: */ iResultCode = a.exec(); } /* VM selector process: */ else { /* Make sure VM selector is permitted: */ if (settings.isFeatureActive("noSelector")) { msgCenter().cannotStartSelector(); break; } #ifdef VBOX_BLEEDING_EDGE msgCenter().showExperimentalBuildWarning(); #else /* VBOX_BLEEDING_EDGE */ # ifndef DEBUG /* Check for BETA version: */ const QString vboxVersion(vboxGlobal().virtualBox().GetVersion()); if ( vboxVersion.contains("BETA") && gEDataManager->preventBetaBuildWarningForVersion() != vboxVersion) msgCenter().showBetaBuildWarning(); # endif /* !DEBUG */ #endif /* !VBOX_BLEEDING_EDGE*/ /* Create/show selector window: */ vboxGlobal().selectorWnd().show(); /* Start application: */ iResultCode = a.exec(); } } while (0); /* Destroy global UI instance: */ VBoxGlobal::destroy(); /* Destroy modal-window manager: */ UIModalWindowManager::destroy(); } while (0); /* Finish logging: */ LogFlowFunc(("rc=%d\n", iResultCode)); LogFlowFuncLeave(); /* Return result: */ return iResultCode; }
extern "C" DECLEXPORT(int) TrustedMain (int argc, char **argv, char ** /*envp*/) { LogFlowFuncEnter(); # if defined(RT_OS_DARWIN) ShutUpAppKit(); # endif for (int i=0; i<argc; i++) if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { showHelp(); return 0; } #if defined(DEBUG) && defined(Q_WS_X11) && defined(RT_OS_LINUX) /* install our signal handler to backtrace the call stack */ struct sigaction sa; sa.sa_sigaction = bt_sighandler; sigemptyset (&sa.sa_mask); sa.sa_flags = SA_RESTART | SA_SIGINFO; sigaction (SIGSEGV, &sa, NULL); sigaction (SIGBUS, &sa, NULL); sigaction (SIGUSR1, &sa, NULL); #endif #ifdef QT_MAC_USE_COCOA /* Instantiate our NSApplication derivative before QApplication * forces NSApplication to be instantiated. */ UICocoaApplication::instance(); #endif qInstallMsgHandler (QtMessageOutput); int rc = 1; /* failure */ /* scope the QApplication variable */ { #ifdef Q_WS_X11 /* Qt has a complex algorithm for selecting the right visual which * doesn't always seem to work. So we naively choose a visual - the * default one - ourselves and pass that to Qt. This means that we * also have to open the display ourselves. * We check the Qt parameter list and handle Qt's -display argument * ourselves, since we open the display connection. We also check the * to see if the user has passed Qt's -visual parameter, and if so we * assume that the user wants Qt to handle visual selection after all, * and don't supply a visual. */ char *pszDisplay = NULL; bool useDefaultVisual = true; for (int i = 0; i < argc; ++i) { if (!::strcmp(argv[i], "-display") && (i + 1 < argc)) /* What if it isn't? Rely on QApplication to complain? */ { pszDisplay = argv[i + 1]; ++i; } else if (!::strcmp(argv[i], "-visual")) useDefaultVisual = false; } Display *pDisplay = XOpenDisplay(pszDisplay); if (!pDisplay) { RTPrintf(pszDisplay ? "Failed to open the X11 display \"%s\"!\n" : "Failed to open the X11 display!\n", pszDisplay); return 0; } Visual *pVisual = useDefaultVisual ? DefaultVisual(pDisplay, DefaultScreen(pDisplay)) : NULL; /* Now create the application object */ QApplication a (pDisplay, argc, argv, (Qt::HANDLE) pVisual); #else /* Q_WS_X11 */ QApplication a (argc, argv); #endif /* Q_WS_X11 */ /* Qt4.3 version has the QProcess bug which freezing the application * for 30 seconds. This bug is internally used at initialization of * Cleanlooks style. So we have to change this style to another one. * See http://trolltech.com/developer/task-tracker/index_html?id=179200&method=entry * for details. */ if (VBoxGlobal::qtRTVersionString().startsWith ("4.3") && qobject_cast <QCleanlooksStyle*> (QApplication::style())) QApplication::setStyle (new QPlastiqueStyle); #ifdef Q_OS_SOLARIS /* Use plastique look 'n feel for Solaris instead of the default motif (Qt 4.7.x) */ QApplication::setStyle (new QPlastiqueStyle); #endif #ifdef Q_WS_X11 /* This patch is not used for now on Solaris & OpenSolaris because * there is no anti-aliasing enabled by default, Qt4 to be rebuilt. */ #ifndef Q_OS_SOLARIS /* Cause Qt4 has the conflict with fontconfig application as a result * sometimes substituting some fonts with non scaleable-anti-aliased * bitmap font we are reseting substitutes for the current application * font family if it is non scaleable-anti-aliased. */ QFontDatabase fontDataBase; QString currentFamily (QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable (currentFamily); /* LogFlowFunc (("Font: Current family is '%s'. It is %s.\n", currentFamily.toLatin1().constData(), isCurrentScaleable ? "scalable" : "not scalable")); QStringList subFamilies (QFont::substitutes (currentFamily)); foreach (QString sub, subFamilies) { bool isSubScalable = fontDataBase.isScalable (sub); LogFlowFunc (("Font: Substitute family is '%s'. It is %s.\n", sub.toLatin1().constData(), isSubScalable ? "scalable" : "not scalable")); } */ QString subFamily (QFont::substitute (currentFamily)); bool isSubScaleable = fontDataBase.isScalable (subFamily); if (isCurrentScaleable && !isSubScaleable) QFont::removeSubstitution (currentFamily); #endif /* Q_OS_SOLARIS */ #endif #ifdef Q_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound (NULL, NULL, 0); #endif #ifdef Q_WS_MAC ::darwinDisableIconsInMenus(); #endif /* Q_WS_MAC */ #ifdef Q_WS_X11 /* version check (major.minor are sensitive, fix number is ignored) */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString msg = QApplication::tr ("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg (qAppName()) .arg (VBoxGlobal::qtCTVersionString().section ('.', 0, 1)) .arg (VBoxGlobal::qtRTVersionString()); QMessageBox::critical ( 0, QApplication::tr ("Incompatible Qt Library Error"), msg, QMessageBox::Abort, 0); qFatal ("%s", msg.toAscii().constData()); } #endif /* load a translation based on the current locale */ VBoxGlobal::loadLanguage(); do { if (!vboxGlobal().isValid()) break; if (vboxGlobal().processArgs()) return 0; msgCenter().checkForMountedWrongUSB(); VBoxGlobalSettings settings = vboxGlobal().settings(); /* Process known keys */ bool noSelector = settings.isFeatureActive ("noSelector"); if (vboxGlobal().isVMConsoleProcess()) { #ifdef VBOX_GUI_WITH_SYSTRAY if (vboxGlobal().trayIconInstall()) { /* Nothing to do here yet. */ } #endif if (vboxGlobal().startMachine (vboxGlobal().managedVMUuid())) { vboxGlobal().setMainWindow (vboxGlobal().vmWindow()); rc = a.exec(); } } else if (noSelector) { msgCenter().cannotRunInSelectorMode(); } else { #ifdef VBOX_BLEEDING_EDGE msgCenter().showBEBWarning(); #else # ifndef DEBUG /* Check for BETA version */ QString vboxVersion (vboxGlobal().virtualBox().GetVersion()); if (vboxVersion.contains ("BETA")) { /* Allow to prevent this message */ QString str = vboxGlobal().virtualBox(). GetExtraData(GUI_PreventBetaWarning); if (str != vboxVersion) msgCenter().showBETAWarning(); } # endif #endif vboxGlobal().setMainWindow (&vboxGlobal().selectorWnd()); #ifdef VBOX_GUI_WITH_SYSTRAY if (vboxGlobal().trayIconInstall()) { /* Nothing to do here yet. */ } if (false == vboxGlobal().isTrayMenu()) { #endif vboxGlobal().selectorWnd().show(); #ifdef VBOX_WITH_REGISTRATION_REQUEST vboxGlobal().showRegistrationDialog (false /* aForce */); #endif #ifdef VBOX_GUI_WITH_SYSTRAY } do { #endif rc = a.exec(); #ifdef VBOX_GUI_WITH_SYSTRAY } while (vboxGlobal().isTrayMenu()); #endif } } while (0); } LogFlowFunc (("rc=%d\n", rc)); LogFlowFuncLeave(); return rc; }
extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char ** /*envp*/) { #ifdef RT_OS_WINDOWS ATL::CComModule _Module; /* Required internally by ATL (constructor records instance in global variable). */ #endif /* Failed result initially: */ int iResultCode = 1; /* Start logging: */ LogFlowFuncEnter(); /* Simulate try-catch block: */ do { #ifdef VBOX_WS_MAC /* Hide setuid root from AppKit: */ HideSetUidRootFromAppKit(); #endif /* VBOX_WS_MAC */ #ifdef VBOX_WS_X11 /* Make sure multi-threaded environment is safe: */ if (!MakeSureMultiThreadingIsSafe()) break; #endif /* VBOX_WS_X11 */ /* Console help preprocessing: */ bool fHelpShown = false; for (int i = 0; i < argc; ++i) { if ( !strcmp(argv[i], "-h") || !strcmp(argv[i], "-?") || !strcmp(argv[i], "-help") || !strcmp(argv[i], "--help")) { fHelpShown = true; ShowHelp(); break; } } if (fHelpShown) { iResultCode = 0; break; } #ifdef VBOX_WITH_HARDENING /* Make sure the image verification code works: */ SUPR3HardenedVerifyInit(); #endif /* VBOX_WITH_HARDENING */ #ifdef VBOX_WS_MAC /* Apply font fixes (before QApplication get created and instantiated font-hints): */ switch (VBoxGlobal::determineOsRelease()) { case MacOSXRelease_Mavericks: QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); break; case MacOSXRelease_Yosemite: QFont::insertSubstitution(".Helvetica Neue DeskInterface", "Helvetica Neue"); break; case MacOSXRelease_ElCapitan: QFont::insertSubstitution(".SF NS Text", "Helvetica Neue"); break; default: break; } /* Instantiate own NSApplication before QApplication do it for us: */ UICocoaApplication::instance(); #endif /* VBOX_WS_MAC */ #ifdef VBOX_WS_X11 # if defined(RT_OS_LINUX) && defined(DEBUG) /* Install signal handler to backtrace the call stack: */ InstallSignalHandler(); # endif /* RT_OS_LINUX && DEBUG */ #endif /* VBOX_WS_X11 */ #if QT_VERSION >= 0x050000 /* Install Qt console message handler: */ qInstallMessageHandler(QtMessageOutput); #else /* QT_VERSION < 0x050000 */ /* Install Qt console message handler: */ qInstallMsgHandler(QtMessageOutput); #endif /* QT_VERSION < 0x050000 */ /* Create application: */ QApplication a(argc, argv); #ifdef VBOX_WS_WIN /* Drag in the sound drivers and DLLs early to get rid of the delay taking * place when the main menu bar (or any action from that menu bar) is * activated for the first time. This delay is especially annoying if it * happens when the VM is executing in real mode (which gives 100% CPU * load and slows down the load process that happens on the main GUI * thread to several seconds). */ PlaySound(NULL, NULL, 0); #endif /* VBOX_WS_WIN */ #ifdef VBOX_WS_MAC # ifdef VBOX_GUI_WITH_HIDPI /* Enable HiDPI icons. * For this we require a patched version of Qt 4.x with * the changes from https://codereview.qt-project.org/#change,54636 applied. */ a.setAttribute(Qt::AA_UseHighDpiPixmaps); # endif /* VBOX_GUI_WITH_HIDPI */ /* Disable menu icons on MacOS X host: */ ::darwinDisableIconsInMenus(); #endif /* VBOX_WS_MAC */ #ifdef VBOX_WS_X11 /* Make all widget native. * We did it to avoid various Qt crashes while testing widget attributes or acquiring winIds. * Yes, we aware of note that alien widgets faster to draw but the only widget we need to be fast * is viewport of VM which was always native since we are using his id for 3D service needs. */ a.setAttribute(Qt::AA_NativeWindows); # ifdef Q_OS_SOLARIS # if QT_VERSION < 0x050000 /* Use plastique look&feel for Solaris instead of the default motif (Qt 4.7.x): */ QApplication::setStyle(new QPlastiqueStyle); # else /* QT_VERSION >= 0x050000 */ a.setStyle("fusion"); # endif /* QT_VERSION >= 0x050000 */ # endif /* Q_OS_SOLARIS */ # ifndef Q_OS_SOLARIS /* Apply font fixes (after QApplication get created and instantiated font-family): */ QFontDatabase fontDataBase; QString currentFamily(QApplication::font().family()); bool isCurrentScaleable = fontDataBase.isScalable(currentFamily); QString subFamily(QFont::substitute(currentFamily)); bool isSubScaleable = fontDataBase.isScalable(subFamily); if (isCurrentScaleable && !isSubScaleable) # if QT_VERSION >= 0x050000 QFont::removeSubstitutions(currentFamily); # else /* QT_VERSION < 0x050000 */ QFont::removeSubstitution(currentFamily); # endif /* QT_VERSION < 0x050000 */ # endif /* !Q_OS_SOLARIS */ /* Qt version check (major.minor are sensitive, fix number is ignored): */ if (VBoxGlobal::qtRTVersion() < (VBoxGlobal::qtCTVersion() & 0xFFFF00)) { QString strMsg = QApplication::tr("Executable <b>%1</b> requires Qt %2.x, found Qt %3.") .arg(qAppName()) .arg(VBoxGlobal::qtCTVersionString().section('.', 0, 1)) .arg(VBoxGlobal::qtRTVersionString()); QMessageBox::critical(0, QApplication::tr("Incompatible Qt Library Error"), strMsg, QMessageBox::Abort, 0); qFatal("%s", strMsg.toUtf8().constData()); break; } #endif /* VBOX_WS_X11 */ /* Create modal-window manager: */ UIModalWindowManager::create(); /* Create global UI instance: */ VBoxGlobal::create(); /* Simulate try-catch block: */ do { /* Exit if VBoxGlobal is not valid: */ if (!vboxGlobal().isValid()) break; /* Exit if VBoxGlobal pre-processed arguments: */ if (vboxGlobal().processArgs()) break; /* For Runtime UI: */ if (vboxGlobal().isVMConsoleProcess()) { /* Prevent application from exiting when all window(s) closed: */ qApp->setQuitOnLastWindowClosed(false); } /* Request to Show UI _after_ QApplication started: */ QMetaObject::invokeMethod(&vboxGlobal(), "showUI", Qt::QueuedConnection); /* Start application: */ iResultCode = a.exec(); } while (0); /* Destroy global UI instance: */ VBoxGlobal::destroy(); /* Destroy modal-window manager: */ UIModalWindowManager::destroy(); } while (0); /* Finish logging: */ LogFlowFunc(("rc=%d\n", iResultCode)); LogFlowFuncLeave(); /* Return result: */ return iResultCode; }