/*===========================================================================*\ * * * OpenFlipper * * Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen * * www.openflipper.org * * * *--------------------------------------------------------------------------- * * This file is part of OpenFlipper. * * * * OpenFlipper is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation, either version 3 of * * the License, or (at your option) any later version with the * * following exceptions: * * * * If other files instantiate templates or use macros * * or inline functions from this file, or you compile this file and * * link it with other files to produce an executable, this file does * * not by itself cause the resulting executable to be covered by the * * GNU Lesser General Public License. This exception does not however * * invalidate any other reasons why the executable file might be * * covered by the GNU Lesser General Public License. * * * * OpenFlipper is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU LesserGeneral Public * * License along with OpenFlipper. If not, * * see . * * * \*===========================================================================*/ /*===========================================================================*\ * * * $Revision$ * * $LastChangedBy$ * * $Date$ * * * \*===========================================================================*/ //============================================================================= // // CLASS Core - IMPLEMENTATION // //============================================================================= //== INCLUDES ================================================================= #include "CoreWidget.hh" #include #include #include #ifndef WIN32 #ifndef ARCH_DARWIN #include #endif #endif #ifdef ARCH_DARWIN #include #include #endif //== IMPLEMENTATION ========================================================== void CoreWidget::showAboutWidget( ) { if ( OpenFlipper::Options::nogui() ) return; if ( aboutWidget_ == 0 ) { aboutWidget_ = new AboutWidget( this ); } else { aboutWidget_->OpenFlipperAbout->clear(); } QFont standardFont = aboutWidget_->OpenFlipperAbout->currentFont(); QFont boldFont = standardFont; boldFont.setBold(true); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("OpenFlipper Core Version: ") + OpenFlipper::Options::coreVersion() ) ; aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); // ===================================================================================== // Directory info // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("OpenFlipper Directories:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); // Get the dataDir QDir tempDir = QDir(OpenFlipper::Options::applicationDir()); #ifdef OPENFLIPPER_DATADIR tempDir.cd(OPENFLIPPER_DATADIR); #endif aboutWidget_->OpenFlipperAbout->append("Data:\t " + tempDir.absolutePath() ); aboutWidget_->OpenFlipperAbout->append("Shaders:\t " + OpenFlipper::Options::shaderDirStr() ); aboutWidget_->OpenFlipperAbout->append("Textures:\t " + OpenFlipper::Options::textureDirStr() ); aboutWidget_->OpenFlipperAbout->append("Scripts:\t " + OpenFlipper::Options::scriptDirStr() ); aboutWidget_->OpenFlipperAbout->append("Icons:\t " + OpenFlipper::Options::iconDirStr() ); aboutWidget_->OpenFlipperAbout->append("Fonts:\t" + OpenFlipper::Options::fontsDirStr() ); aboutWidget_->OpenFlipperAbout->append("Help:\t" + OpenFlipper::Options::helpDirStr() ); // ===================================================================================== // Memory infos // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Memory Information:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); #ifdef WIN32 // Define memory structure MEMORYSTATUSEX ms; // Set the size ( required according to spec ... why???? ) ms.dwLength = sizeof (ms); // Get the info GlobalMemoryStatusEx(&ms); // Output to widget aboutWidget_->OpenFlipperAbout->append(tr("Physical Memory:\t")+ QString::number(ms.ullAvailPhys/1024/1024) + "MB/"+ QString::number(ms.ullTotalPhys/1024/1024) + "MB used ("+ QString::number(ms.dwMemoryLoad) + "%)"); aboutWidget_->OpenFlipperAbout->append(tr("Pagefile Memory:\t")+ QString::number(ms.ullAvailPageFile/1024/1024) + "MB/" + QString::number(ms.ullTotalPageFile/1024/1024) + "MB used"); #elif defined ARCH_DARWIN aboutWidget_->OpenFlipperAbout->append(tr("Not available for this platform (MacOS)")); #else unsigned long memory = 0; struct mallinfo info; info = mallinfo(); // add mmap-allocated memory memory += info.hblkhd; // add sbrk-allocated memory memory += info.uordblks; double mmapAllocated = double(info.hblkhd ) / 1024 / 1024; double sbrkAllocated = double(info.uordblks) / 1024 / 1024; double totalAllocated = double(memory) / 1024 / 1024; double pageSize = double(getpagesize()) /1024 ; double availablePages = double( sysconf (_SC_AVPHYS_PAGES) ); double freeMem = availablePages * pageSize / 1024; aboutWidget_->OpenFlipperAbout->append(tr("Total Memory allocated:\t ") + QString::number(totalAllocated,'f' ,2 ) + tr("MB ") + tr("( mmap: ") + QString::number(mmapAllocated ,'f' ,2 ) + tr("MB") + tr(", sbrk: ") + QString::number(sbrkAllocated ,'f' ,2 ) + tr("MB )") ); aboutWidget_->OpenFlipperAbout->append(tr("Free Memory:\t\t ") + QString::number(freeMem,'f' ,2 ) + tr("MB ") + tr("(") + QString::number(availablePages,'f' ,0 ) + tr(" pages of ") + QString::number(pageSize,'f' ,2 ) + tr("KB size)")); #endif // ===================================================================================== // Memory infos // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("CPU Information:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); #ifdef WIN32 QSettings registryCPU("HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor", QSettings::NativeFormat); QStringList cpus = registryCPU.childGroups(); if ( cpus.size() != 0 ) { aboutWidget_->OpenFlipperAbout->append(tr("CPU vendor:\t\t ") + registryCPU.value( cpus[0]+"/VendorIdentifier", "Unknown" ).toString() ); aboutWidget_->OpenFlipperAbout->append(tr("CPU model:\t\t ") + registryCPU.value( cpus[0]+"/ProcessorNameString", "Unknown" ).toString() ); aboutWidget_->OpenFlipperAbout->append(tr("CPU identifier:\t\t ") + registryCPU.value( cpus[0]+"/Identifier", "Unknown" ).toString() ); aboutWidget_->OpenFlipperAbout->append(tr("CPU Speed:\t\t ") + registryCPU.value( cpus[0]+"/~MHz", "Unknown" ).toString()+ " MHz" ); aboutWidget_->OpenFlipperAbout->append("CPU Cores:\t\t " + QString::number(cpus.size())); } else { aboutWidget_->OpenFlipperAbout->append(tr("Unable to retrieve CPU information")); } #elif defined ARCH_DARWIN size_t lenCPU; char *pCPU; // First call to get required size sysctlbyname("machdep.cpu.brand_string", NULL, &lenCPU, NULL, 0); // allocate pCPU = (char * )malloc(lenCPU); // Second call to get data sysctlbyname("machdep.cpu.brand_string", pCPU, &lenCPU, NULL, 0); // Output aboutWidget_->OpenFlipperAbout->append(tr("CPU Brand:\t\t ") + QString(pCPU) ); // free memory delete pCPU; int physicalCPUS = 0; // Get data lenCPU = sizeof(int); sysctlbyname("hw.physicalcpu", &physicalCPUS, &lenCPU , NULL, 0); // Output aboutWidget_->OpenFlipperAbout->append(tr("Physical Cores:\t\t ") + QString::number(physicalCPUS) ); int logicalCPUS = 0; // Get data lenCPU = sizeof(int); sysctlbyname("hw.logicalcpu", &logicalCPUS, &lenCPU, NULL, 0); // Output aboutWidget_->OpenFlipperAbout->append(tr("LogicalCores:\t\t ") + QString::number(logicalCPUS) ); #else QFile cpuinfo("/proc/cpuinfo"); if (! cpuinfo.exists() ) aboutWidget_->OpenFlipperAbout->append(tr("Unable to retrieve CPU information")); else { cpuinfo.open(QFile::ReadOnly); QTextStream stream(&cpuinfo); QStringList splitted = stream.readAll().split("\n",QString::SkipEmptyParts); int position = splitted.indexOf ( QRegExp("^vendor_id.*") ); if ( position != -1 ){ QString cpuVendor = splitted[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("CPU vendor:\t\t ") + cpuVendor ); } else { aboutWidget_->OpenFlipperAbout->append(tr("CPU vendor:\t\t vendor specification not found")); } position = splitted.indexOf ( QRegExp("^model name.*") ); if ( position != -1 ){ QString cpuModel = splitted[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("CPU model:\t\t ") + cpuModel ); } else { aboutWidget_->OpenFlipperAbout->append(tr("CPU model:\t\t Model specification not found")); } position = splitted.indexOf ( QRegExp("^cpu cores.*") ); if ( position != -1 ){ QString cpuCoresPhysical = splitted[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Physical CPU cores:\t\t ") + cpuCoresPhysical ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Physical CPU cores:\t\t CPU Core specification not found")); } position = splitted.indexOf ( QRegExp("^siblings.*") ); if ( position != -1 ){ QString cpuCoresLogical = splitted[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Logical CPU cores:\t\t ") + cpuCoresLogical ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Logical CPU cores:\t\t CPU Core specification not found")); } position = splitted.indexOf ( QRegExp("^flags.*") ); if ( position != -1 ){ QString cpuFlags = splitted[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("CPU capabilities:\t\t ") + cpuFlags ); } else { aboutWidget_->OpenFlipperAbout->append(tr("CPU capabilities:\t\t CPU flag specification not found")); } #if Q_BYTE_ORDER == Q_BIG_ENDIAN aboutWidget_->OpenFlipperAbout->append(tr("System is Big Endian")); #endif #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN aboutWidget_->OpenFlipperAbout->append(tr("System is Little Endian")); #endif } #endif // ===================================================================================== // OS info // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Operating System Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); #ifdef WIN32 QSettings registryOS("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", QSettings::NativeFormat); aboutWidget_->OpenFlipperAbout->append(tr("Product Name:\t\t ") + registryOS.value( "ProductName", "Unknown" ).toString() ); aboutWidget_->OpenFlipperAbout->append(tr("Current Version:\t\t ") + registryOS.value( "CurrentVersion", "Unknown" ).toString() ); #elif defined ARCH_DARWIN int mib[2]; size_t len; char *p; mib[0] = CTL_KERN; mib[1] = KERN_VERSION; sysctl(mib, 2, NULL, &len, NULL, 0); p = (char * )malloc(len); sysctl(mib, 2, p, &len, NULL, 0); aboutWidget_->OpenFlipperAbout->append(tr("OS Version:\t\t ") + QString(p) ); delete(p); #else QFile versionInfo("/proc/version"); if (! versionInfo.exists() ) aboutWidget_->OpenFlipperAbout->append(tr("Unable to retrieve Kernel information")); else { versionInfo.open(QFile::ReadOnly); QTextStream versionStream(&versionInfo); aboutWidget_->OpenFlipperAbout->append(tr("Kernel Version:\t\t ") + versionStream.readAll().simplified()); QString program = "/usr/bin/lsb_release"; QFile lsb(program); if ( lsb.exists() ) { QStringList arguments; arguments << "-a"; QProcess myProcess; myProcess.start(program, arguments); if ( myProcess.waitForFinished ( 4000 ) ) { QStringList outputLSB = QString(myProcess.readAllStandardOutput()).split('\n'); int position = outputLSB.indexOf ( QRegExp("^Distributor ID.*") ); if ( position != -1 ){ QString distributorID = outputLSB[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Distributor ID:\t\t ") + distributorID ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Distributor ID:\t\t Unknown")); } position = outputLSB.indexOf ( QRegExp("^Description.*") ); if ( position != -1 ){ QString description = outputLSB[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Description:\t\t ") + description ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Description:\t\t Unknown")); } position = outputLSB.indexOf ( QRegExp("^Release.*") ); if ( position != -1 ){ QString release = outputLSB[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Release number:\t\t ") + release ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Release number:\t\t Unknown")); } position = outputLSB.indexOf ( QRegExp("^Codename.*") ); if ( position != -1 ){ QString codename = outputLSB[position].section(':', -1).simplified(); aboutWidget_->OpenFlipperAbout->append(tr("Codename:\t\t ") + codename ); } else { aboutWidget_->OpenFlipperAbout->append(tr("Codename:\t\t Unknown")); } } else { aboutWidget_->OpenFlipperAbout->append(tr("Unable to get LSB info")); } } else { aboutWidget_->OpenFlipperAbout->append(tr("No additional information. Unable to get info via LSB.")); } } #endif // ===================================================================================== // OpenGL Renderer/Vendor and version info // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("OpenGL Specific Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); QString vendor = QString((const char*)glGetString(GL_VENDOR)); aboutWidget_->OpenFlipperAbout->append(tr("Vendor:\t") + vendor); QString renderer = QString((const char*)glGetString(GL_RENDERER)); aboutWidget_->OpenFlipperAbout->append(tr("Renderer:\t") + renderer); QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags(); if ( flags.testFlag(QGLFormat::OpenGL_Version_3_0) ) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t3.0 or higher") ); else if (flags.testFlag(QGLFormat::OpenGL_Version_2_1)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t2.1 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_2_0)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t2.0 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_1_5)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t1.5 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_1_4)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t1.4 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_1_3)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t1.3 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_1_2)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t1.2 or higher" )); else if (flags.testFlag(QGLFormat::OpenGL_Version_1_1)) aboutWidget_->OpenFlipperAbout->append(tr("Version:\t1.1 or higher" )); else aboutWidget_->OpenFlipperAbout->append(tr("Version:\tUNKNOWN!" )); // ===================================================================================== // OpenGL Extensions // ===================================================================================== aboutWidget_->OpenFlipperAbout->append(tr("Supported Extensions:")); QString glExtensions = QString((const char*)glGetString(GL_EXTENSIONS)); aboutWidget_->OpenFlipperAbout->append(glExtensions); // ===================================================================================== // glu Information // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Glu Specific Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); QString gluVersion = QString((const char *)gluGetString(GLU_VERSION)); aboutWidget_->OpenFlipperAbout->append(tr("GLU Version:\t") + gluVersion); aboutWidget_->OpenFlipperAbout->append(tr("Supported GLU Extensions:")); QString gluExtensions = QString((const char*)gluGetString(GLU_EXTENSIONS)); aboutWidget_->OpenFlipperAbout->append(gluExtensions); aboutWidget_->OpenFlipperAbout->moveCursor(QTextCursor::Start); // ===================================================================================== // glew Information // ===================================================================================== #ifndef __APPLE__ aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("GLEW Specific Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); QString glewVersion = QString((const char *)glewGetString(GLEW_VERSION)); aboutWidget_->OpenFlipperAbout->append(tr("GLEW Version:\t") + glewVersion); #endif // ===================================================================================== // Qt information // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Qt Version Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); aboutWidget_->OpenFlipperAbout->append(tr("Currently used Version:\t") + qVersion() ); aboutWidget_->OpenFlipperAbout->append(tr("Link time Version:\t\t") + QT_VERSION_STR ); aboutWidget_->OpenFlipperAbout->append(tr("Currently used Library paths:") ); QStringList libPaths = QCoreApplication::libraryPaths(); for(int i = 0 ; i < libPaths.size() ; ++i) aboutWidget_->OpenFlipperAbout->append(" " + libPaths[i]); // ===================================================================================== // Compiler information // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Compiler Version Info:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); aboutWidget_->OpenFlipperAbout->append( OpenFlipper::Options::compilerInfo() ); // ===================================================================================== // List the currently registered data types // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Registered data types:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); QString types; // Iterate over all Types known to the core // Start at 1: // 0 type is defined as DATA_UNKNOWN DataType currentType = 1; for ( uint i = 0 ; i < typeCount() - 2 ; ++i) { types += typeName( currentType ) + "\t\t typeId: " + QString::number(currentType.value()) + "\n"; // Advance to next type ( Indices are bits so multiply by to to get next bit) currentType++; } aboutWidget_->OpenFlipperAbout->append( types ); // ===================================================================================== // List The File Plugins with their filters // ===================================================================================== aboutWidget_->OpenFlipperAbout->append("\n"); aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append(tr("Registered File Plugins:")); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); for ( uint i = 0 ; i < supportedTypes().size() ; ++i ) { aboutWidget_->OpenFlipperAbout->setCurrentFont(boldFont); aboutWidget_->OpenFlipperAbout->append( "\t" + supportedTypes()[i].name ); aboutWidget_->OpenFlipperAbout->setCurrentFont(standardFont); aboutWidget_->OpenFlipperAbout->append( "\t\t Load: " + supportedTypes()[i].loadFilters ); aboutWidget_->OpenFlipperAbout->append( "\t\t Save: " + supportedTypes()[i].saveFilters ); } aboutWidget_->show(); } //=============================================================================