mirror of
https://invent.kde.org/system/dolphin
synced 2024-11-05 18:47:12 +00:00
Complete source rewrite/improvement of KInfocenter :
- Complete port to KDE/Qt 4, no more use of QT3 Support - Simplify interface (remove multiple left tabs, add quick help in the top of the layout, use a KListWidgetSearchLine to filter by keywords and name) - Fix General Page (modules were not displayed), and allow user to select it from the left panel - Clean code and indentation structure - Remove big margins and useless layout/widgets to integrate KCMModule (request from Aaron Siego) - Memory module is now in a separate folder - Memory module has been rewritten, and the chart generation is now simpler. - Use color gradient and color scheme of System Monitor app (request from John Tapsell) - Use a default icon when the requested icon does not exist (request from David Jarvie) - Integrate patch from Konrad Rzepecki about improve PCI module by using libpci API. Add an optional dependency in CMake for this library FEATURE:88625 - The porting to KDE4 of all architecture may add some compilation errors (sorry, I have no AIX, HPUX, Solaris, SGI, FreeBSD, OpenBSD systems to test those source). However, some existing codes already did not compile. - Simplify source code by removing some part corresponding to the moment where KInfocenter and KControl were the same (it seems to). - Name and comments of each modules are now normalized. (even IOSlaves Info and Samba Status) CCMAIL:kde-core-devel@kde.org - Allow the future move of inner modules of kcm_info to a dedicated module (examples: Sound, X-Server, Partitions,...) TODO : - Improve Loading page layout - Port Partitions, Sound and Network Interfaces modules to Solid - Set my email as current maintainer svn path=/trunk/KDE/kdebase/apps/; revision=795596
This commit is contained in:
parent
d3fd6ab778
commit
a410c025ea
114 changed files with 8578 additions and 9019 deletions
|
@ -11,8 +11,6 @@ include (KDE4Defaults)
|
|||
include (MacroLibrary)
|
||||
include(MacroOptionalAddSubdirectory)
|
||||
|
||||
macro_optional_find_package(OpenGL)
|
||||
|
||||
include(ConfigureChecks.cmake)
|
||||
configure_file (config-apps.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-apps.h )
|
||||
include_directories (${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
|
20
cmake/modules/FindPCIUTILS.cmake
Normal file
20
cmake/modules/FindPCIUTILS.cmake
Normal file
|
@ -0,0 +1,20 @@
|
|||
# - Try to find the pciutils directory library
|
||||
# Once done this will define
|
||||
#
|
||||
# PCIUTILS_FOUND - system has PCIUtils
|
||||
# PCIUTILS_INCLUDE_DIR - the PCIUTILS include directory
|
||||
# PCIUTILS_LIBRARIES - The libraries needed to use FAM
|
||||
|
||||
if(PCIUTILS_INCLUDE_DIR AND PCIUTILS_LIBRARIES)
|
||||
set(PCIUTILS_FIND_QUIETLY TRUE)
|
||||
endif(PCIUTILS_INCLUDE_DIR AND PCIUTILS_LIBRARIES)
|
||||
|
||||
FIND_PATH(PCIUTILS_INCLUDE_DIR pci/pci.h)
|
||||
|
||||
FIND_LIBRARY(PCIUTILS_LIBRARIES NAMES pci )
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(PCIUTILS DEFAULT_MSG PCIUTILS_LIBRARIES PCIUTILS_INCLUDE_DIR)
|
||||
|
||||
MARK_AS_ADVANCED(PCIUTILS_INCLUDE_DIR PCIUTILS_LIBRARIES)
|
||||
|
|
@ -1,12 +1,32 @@
|
|||
|
||||
add_definitions( -DKDE_DEFAULT_DEBUG_AREA=1208 )
|
||||
|
||||
add_subdirectory( about )
|
||||
|
||||
add_definitions (-DQT3_SUPPORT -DQT3_SUPPORT_WARNINGS)
|
||||
|
||||
add_subdirectory( solidproc )
|
||||
|
||||
add_subdirectory( info )
|
||||
|
||||
add_subdirectory( nics )
|
||||
add_subdirectory( usbview )
|
||||
add_subdirectory( memory )
|
||||
|
||||
macro_optional_find_package(OpenGL)
|
||||
macro_log_feature(OPENGL_FOUND "OpenGL" "API for developing portable, interactive 2D and 3D graphics applications" "http://mesa3d.sourceforge.net" FALSE "" "View OpenGL details in kinfocenter.")
|
||||
|
||||
if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
add_subdirectory( opengl )
|
||||
else(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
MESSAGE(STATUS "OpenGL information module has been disabled.")
|
||||
endif(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
|
||||
|
||||
macro_optional_find_package(PCIUTILS)
|
||||
macro_log_feature(PCIUTILS_FOUND "PCIUTILS" "PciUtils is a library for direct access to PCI slots" "http://atrey.karlin.mff.cuni.cz/~mj/pciutils.shtml" FALSE "" "View PCI details in kinfocenter.")
|
||||
|
||||
if(NOT APPLE)
|
||||
add_subdirectory( pci )
|
||||
endif(NOT APPLE)
|
||||
|
||||
macro_optional_find_package(RAW1394)
|
||||
macro_log_feature(RAW1394_FOUND "RAW1394" "library for direct access to IEEE 1394 bus" "http://www.linux1394.org/" FALSE "" "View FireWire devices in kinfocenter.")
|
||||
|
@ -19,25 +39,13 @@ set(kinfocenter_SRCS
|
|||
main.cpp
|
||||
toplevel.cpp
|
||||
indexwidget.cpp
|
||||
helpwidget.cpp
|
||||
dockcontainer.cpp
|
||||
aboutwidget.cpp
|
||||
quickhelp.cpp
|
||||
moduletreeview.cpp
|
||||
moduleiconview.cpp
|
||||
moduleIface.cpp
|
||||
global.cpp
|
||||
modules.cpp
|
||||
proxywidget.cpp
|
||||
kcrootonly.cpp
|
||||
searchwidget.cpp )
|
||||
|
||||
set(kinfocenter_adaptor ${KDEBASE_APPS_SOURCE_DIR}/kinfocenter/moduleIface.h)
|
||||
set(kinfocenter_xml ${CMAKE_CURRENT_BINARY_DIR}/org.kde.Kinfocenter.xml)
|
||||
ADD_CUSTOM_COMMAND(OUTPUT ${kinfocenter_xml}
|
||||
COMMAND ${QT_DBUSCPP2XML_EXECUTABLE} ${kinfocenter_adaptor} > ${kinfocenter_xml}
|
||||
DEPENDS ${kinfocenter_adaptor})
|
||||
QT4_ADD_DBUS_INTERFACE( kinfocenter_SRCS ${kinfocenter_xml} kinfocenter_interface )
|
||||
)
|
||||
|
||||
set(kinfocenter_KDEINIT_SRCS ${kinfocenter_SRCS})
|
||||
|
||||
|
|
|
@ -44,9 +44,3 @@
|
|||
font-size: xx-small;
|
||||
}
|
||||
|
||||
.kcm_link {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* vim:set sw=2 et nocindent smartindent: */
|
||||
|
||||
|
|
|
@ -4,13 +4,10 @@
|
|||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta name="generator" content=
|
||||
"HTML Tidy for Linux/x86 (vers 1st August 2004), see www.w3.org" />
|
||||
|
||||
<style type="text/css">
|
||||
/*<![CDATA[*/
|
||||
@import "%1"; /* kde_infopage.css */
|
||||
%1 /* maybe @import "kde_infopage_rtl.css"; */
|
||||
%2 /* maybe @import "kde_infopage_rtl.css"; */
|
||||
@import "kinfocenter.css";
|
||||
/*body {font-size: px;}*/
|
||||
/*]]>*/
|
||||
|
@ -23,11 +20,11 @@
|
|||
<div id="headerR"/>
|
||||
|
||||
<div id="title">
|
||||
%2 <!-- Title -->
|
||||
%3 <!-- Title -->
|
||||
</div>
|
||||
|
||||
<div id="tagline">
|
||||
%3 <!-- Catchphrase -->
|
||||
%4 <!-- Catchphrase -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -37,7 +34,7 @@
|
|||
<div id="barL">
|
||||
<div id="barR">
|
||||
<div id="barCenter" class="bar_text">
|
||||
%4<!-- Summary -->
|
||||
%5<!-- Summary -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -51,7 +48,7 @@
|
|||
<div id="boxR">
|
||||
<div id="boxCenter">
|
||||
<!--Content-->
|
||||
%5
|
||||
%6
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -61,4 +58,3 @@
|
|||
<div id="footer"><div id="footerL"/><div id="footerR"/></div>
|
||||
</body>
|
||||
</html>
|
||||
<!-- vim:set sw=2 et nocindent smartindent: -->
|
||||
|
|
|
@ -35,16 +35,6 @@
|
|||
|
||||
#include "aboutwidget.moc"
|
||||
|
||||
static const char kcc_text[] = I18N_NOOP("KDE Control Center");
|
||||
|
||||
static const char title_text[] = I18N_NOOP("Configure your desktop environment");
|
||||
|
||||
static const char intro_text[] = I18N_NOOP("Welcome to the \"KDE Control Center\", "
|
||||
"a central place to configure your "
|
||||
"desktop environment. "
|
||||
"Select an item from the index on the left "
|
||||
"to load a configuration module.");
|
||||
|
||||
static const char kcc_infotext[]= I18N_NOOP("KDE Info Center");
|
||||
|
||||
static const char title_infotext[]= I18N_NOOP("Get system and desktop environment information");
|
||||
|
@ -66,42 +56,21 @@ static const char system_text[] = I18N_NOOP("System:");
|
|||
static const char release_text[]= I18N_NOOP("Release:");
|
||||
static const char machine_text[]= I18N_NOOP("Machine:");
|
||||
|
||||
AboutWidget::AboutWidget(QWidget *parent, Q3ListViewItem* category, const QString &caption)
|
||||
: KHBox(parent),
|
||||
_moduleList(false),
|
||||
_category(category),
|
||||
_caption(caption)
|
||||
{
|
||||
if (_category)
|
||||
_moduleList = true;
|
||||
AboutWidget::AboutWidget(QWidget *parent, ConfigModuleList* configModules, const QString &caption) :
|
||||
KHBox(parent), _configModules(configModules), _caption(caption) {
|
||||
|
||||
setMinimumSize(400, 400);
|
||||
|
||||
// set qwhatsthis help
|
||||
this->setWhatsThis( i18n(intro_text));
|
||||
this->setWhatsThis(i18n(intro_infotext));
|
||||
_viewer = new KHTMLPart( this );
|
||||
_viewer->widget()->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||
connect(_viewer->browserExtension(),
|
||||
SIGNAL(openUrlRequest(const KUrl&, const KParts::OpenUrlArguments&, const KParts::BrowserArguments&)),
|
||||
this, SLOT(slotModuleLinkClicked(const KUrl&)) );
|
||||
SIGNAL(openUrlRequest(const KUrl&, const KParts::OpenUrlArguments&, const KParts::BrowserArguments&)), this, SLOT(slotModuleLinkClicked(const KUrl&)));
|
||||
updatePixmap();
|
||||
}
|
||||
|
||||
void AboutWidget::setCategory( Q3ListViewItem* category, const QString &caption )
|
||||
{
|
||||
_caption = caption;
|
||||
_category = category;
|
||||
if ( _category )
|
||||
_moduleList = true;
|
||||
else
|
||||
_moduleList = true;
|
||||
|
||||
// Update the pixmap to be shown:
|
||||
updatePixmap();
|
||||
}
|
||||
|
||||
void AboutWidget::updatePixmap()
|
||||
{
|
||||
void AboutWidget::updatePixmap() {
|
||||
QString file = KStandardDirs::locate("data", "kinfocenter/about/main.html");
|
||||
QFile f(file);
|
||||
f.open(QIODevice::ReadOnly);
|
||||
|
@ -114,25 +83,14 @@ void AboutWidget::updatePixmap()
|
|||
else
|
||||
res = res.arg("");
|
||||
|
||||
|
||||
QString title, intro, caption;
|
||||
if (KCGlobal::isInfoCenter())
|
||||
{
|
||||
res = res.arg(i18n(kcc_infotext))
|
||||
.arg(i18n(title_infotext))
|
||||
.arg(i18n(intro_infotext));
|
||||
}
|
||||
else
|
||||
{
|
||||
res = res.arg(i18n(kcc_text))
|
||||
.arg(i18n(title_text))
|
||||
.arg(i18n(intro_text));
|
||||
}
|
||||
res = res.arg(i18n(kcc_infotext));
|
||||
res = res.arg(i18n(title_infotext));
|
||||
res = res.arg(i18n(intro_infotext));
|
||||
|
||||
QString content;
|
||||
|
||||
if (!_moduleList)
|
||||
{
|
||||
if (_configModules == NULL) {
|
||||
content += "<table class=\"kc_table\">\n";
|
||||
#define KC_HTMLROW( a, b ) "<tr><td class=\"kc_leftcol\">" + i18n( a ) + "</td><td class=\"kc_rightcol\">" + b + "</tr>\n"
|
||||
content += KC_HTMLROW( version_text, KCGlobal::kdeVersion() );
|
||||
|
@ -144,51 +102,40 @@ void AboutWidget::updatePixmap()
|
|||
#undef KC_HTMLROW
|
||||
content += "</table>\n";
|
||||
content += "<p class=\"kc_use_text\">" + i18n(use_text) + "</p>\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
content += "<div id=\"tableTitle\">" + _caption + "</div>";
|
||||
|
||||
content += "<table class=\"kc_table\">\n";
|
||||
// traverse the list
|
||||
Q3ListViewItem* pEntry = _category;
|
||||
while (pEntry != NULL)
|
||||
{
|
||||
|
||||
foreach(ConfigModule* configModule, *_configModules) {
|
||||
QString szName;
|
||||
QString szComment;
|
||||
ConfigModule *module = static_cast<ModuleTreeItem*>(pEntry)->module();
|
||||
/* TODO: work out link */
|
||||
|
||||
content += "<tr><td class=\"kc_leftcol\">";
|
||||
if (module)
|
||||
{
|
||||
szName = module->moduleName();
|
||||
szComment = module->comment();
|
||||
content += "<a href=\"%1\" class=\"kcm_link\">" + szName + "</a></td><td class=\"kc_rightcol\">" + szComment;
|
||||
KUrl moduleURL(QString("kcm://%1").arg(QString().sprintf("%p",(void*)module)) );
|
||||
szName = configModule->moduleName();
|
||||
szComment = configModule->comment();
|
||||
content += "<a href=\"%1\">" + szName + "</a></td><td class=\"kc_rightcol\">" + szComment;
|
||||
KUrl moduleURL(QString("kcm://%1").arg(QString().sprintf("%p", (void*)configModule)) );
|
||||
QString linkURL(moduleURL.url() );
|
||||
content = content.arg(linkURL);
|
||||
_moduleMap.insert( linkURL, module );
|
||||
}
|
||||
else
|
||||
{
|
||||
szName = static_cast<ModuleTreeItem*>(pEntry)->caption();
|
||||
content += szName + "</td><td class=\"kc_rightcol\">" + szName;
|
||||
}
|
||||
_moduleMap.insert(linkURL, configModule);
|
||||
|
||||
content += "</td></tr>\n";
|
||||
pEntry = pEntry->nextSibling();
|
||||
|
||||
}
|
||||
content += "</table>";
|
||||
}
|
||||
|
||||
_viewer->begin(KUrl(file));
|
||||
_viewer->write(res.arg(content) );
|
||||
_viewer->end();
|
||||
}
|
||||
|
||||
void AboutWidget::slotModuleLinkClicked( const KUrl& url )
|
||||
{
|
||||
ConfigModule* module;
|
||||
module = _moduleMap[url.url()];
|
||||
if ( module )
|
||||
void AboutWidget::slotModuleLinkClicked(const KUrl& url) {
|
||||
ConfigModule* module = _moduleMap[url.url()];
|
||||
if (module) {
|
||||
emit moduleSelected(module);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#define __aboutwidget_h__
|
||||
|
||||
#include <QWidget>
|
||||
#include <Qt3Support/Q3CheckListItem>
|
||||
#include <QListWidgetItem>
|
||||
#include <QMap>
|
||||
#include <QPixmap>
|
||||
#include <kvbox.h>
|
||||
|
@ -29,21 +29,16 @@ class QPixmap;
|
|||
class ConfigModule;
|
||||
class KHTMLPart;
|
||||
class KUrl;
|
||||
class ConfigModuleList;
|
||||
|
||||
class AboutWidget : public KHBox
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit AboutWidget(QWidget *parent, Q3ListViewItem* category=0, const QString &caption=QString());
|
||||
explicit AboutWidget(QWidget *parent, ConfigModuleList* modules = NULL, const QString &caption=QString());
|
||||
|
||||
/**
|
||||
* Set a new category without creating a new AboutWidget if there is
|
||||
* one visible already (reduces flicker)
|
||||
*/
|
||||
void setCategory( Q3ListViewItem* category, const QString& caption);
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
void moduleSelected(ConfigModule *);
|
||||
|
||||
private Q_SLOTS:
|
||||
|
@ -56,8 +51,7 @@ private:
|
|||
*/
|
||||
void updatePixmap();
|
||||
|
||||
bool _moduleList;
|
||||
Q3ListViewItem* _category;
|
||||
ConfigModuleList * _configModules;
|
||||
QString _caption;
|
||||
KHTMLPart *_viewer;
|
||||
QMap<QString,ConfigModule*> _moduleMap;
|
||||
|
|
13
kinfocenter/base/CMakeLists.txt
Normal file
13
kinfocenter/base/CMakeLists.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
# TODO: HAVE_COREAUDIO (for OSX)
|
||||
# TODO: HAVE_LIBDEVINFO_H (for Solaris 7 and later)
|
||||
# to be set if both -ldevinfo and libdevinfo.h exist
|
||||
|
||||
check_include_files(devinfo.h HAVE_DEVINFO_H) # info_fbsd.cpp
|
||||
check_include_files(fstab.h HAVE_FSTAB_H) # info_linux.cpp
|
||||
check_include_files(linux/raw.h HAVE_LINUX_RAW_H) # info_linux.cpp
|
||||
check_include_files(mntent.h HAVE_MNTENT_H) # info_linux.cpp
|
||||
check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) # info_linux.cpp
|
||||
check_include_files(sys/raw.h HAVE_SYS_RAW_H) # info_linux.cpp
|
||||
check_include_files(Alib.h HAVE_ALIB_H) # info_hpux.cpp
|
||||
|
||||
configure_file (../base/config-infocenter.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/config-infocenter.h )
|
345
kinfocenter/base/info_aix.cpp
Normal file
345
kinfocenter/base/info_aix.cpp
Normal file
|
@ -0,0 +1,345 @@
|
|||
/*
|
||||
* info_aix.cpp
|
||||
*
|
||||
* Reza Arbab <arbab@austin.ibm.com>
|
||||
*
|
||||
* GetInfo_Partitions() and its helpers (get_fs_usage, fs_adjust_blocks)
|
||||
* taken from info_hpux.cpp.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <cf.h>
|
||||
#define class _class
|
||||
#include <odmi.h>
|
||||
#include <sys/cfgodm.h>
|
||||
#include <sys/cfgdb.h>
|
||||
#undef class
|
||||
#include <nl_types.h>
|
||||
#include <string.h>
|
||||
#include <kdebug.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <sys/statfs.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <fstab.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
char * device_description(struct CuDv *cudv) {
|
||||
char *desc= NULL;
|
||||
struct PdDv *pddv = cudv->PdDvLn; /* link to Predefined Devices database */
|
||||
nl_catd cat;
|
||||
|
||||
cat = catopen("/usr/lib/methods/devices.cat", NL_CAT_LOCALE);
|
||||
if ((int)cat == -1)
|
||||
return NULL;
|
||||
|
||||
desc = strdup(catgets(cat, pddv->setno, pddv->msgno, "N/A") );
|
||||
catclose(cat);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
bool list_devices(QListView *lBox, char *criteria) {
|
||||
struct CuDv *cudv; /* Customized Devices */
|
||||
struct listinfo info;
|
||||
int i;
|
||||
char *cudv_desc;
|
||||
QString cudv_status;
|
||||
QListViewItem *lastitem= NULL;
|
||||
|
||||
lBox->addColumn(i18n("Name"));
|
||||
lBox->addColumn(i18n("Status"));
|
||||
lBox->addColumn(i18n("Location"));
|
||||
lBox->addColumn(i18n("Description"));
|
||||
|
||||
if (odm_initialize() == -1) {
|
||||
kError(0) << "odm_initialize() failed: odmerrno = " << odmerrno << endl;
|
||||
return (false);
|
||||
}
|
||||
|
||||
cudv = (struct CuDv *) odm_get_list(CuDv_CLASS, criteria, &info, 100, 2);
|
||||
|
||||
if ((int)cudv == -1) {
|
||||
odm_terminate();
|
||||
kError(0) << "odm_get_list() failed: odmerrno = " << odmerrno << endl;
|
||||
return (false);
|
||||
} else if (!cudv) /* empty list */
|
||||
{
|
||||
odm_terminate();
|
||||
return (true);
|
||||
}
|
||||
|
||||
for (i=0; i<info.num; i++) {
|
||||
switch (cudv[i].status) {
|
||||
case DEFINED:
|
||||
cudv_status = QString("Defined");
|
||||
break;
|
||||
case AVAILABLE:
|
||||
cudv_status = QString("Available");
|
||||
break;
|
||||
case STOPPED:
|
||||
cudv_status = QString("Stopped");
|
||||
break;
|
||||
default:
|
||||
cudv_status = QString("Unknown");
|
||||
}
|
||||
cudv_desc = device_description(&cudv[i]);
|
||||
|
||||
lastitem = new QListViewItem(lBox, lastitem,
|
||||
QString(cudv[i].name),
|
||||
cudv_status,
|
||||
QString(cudv[i].location),
|
||||
QString(cudv_desc ? cudv_desc : "N/A") );
|
||||
|
||||
if (cudv_desc)
|
||||
free(cudv_desc);
|
||||
}
|
||||
|
||||
if (odm_free_list(cudv, &info) == -1) {
|
||||
odm_terminate();
|
||||
kError(0) << "odm_free_list() failed: odmerrno = " << odmerrno << endl;
|
||||
return (false);
|
||||
}
|
||||
|
||||
odm_terminate();
|
||||
return true;
|
||||
}
|
||||
|
||||
enum CHIP
|
||||
{
|
||||
P2SC, Power, Power2, Power3, Power3_II, PowerPC,
|
||||
PowerPC_604e, PowerPersonal, RD64_II, RS_III, RS64, RS64_II,
|
||||
RS64_III, RS64_IV, RSC, ThinkPad, unknown,
|
||||
NUM_CHIPS
|
||||
};
|
||||
static const char chip_name[NUM_CHIPS][16] = { "P2SC", "Power", "Power2", "Power3", "Power3-II", "PowerPC", "PowerPC 604e", "PowerPersonal", "RD64-II", "RS-III", "RS64", "RS64-II", "RS64-III", "RS64-IV", "RSC", "ThinkPad", "unknown" };
|
||||
|
||||
struct model {
|
||||
char model_ID[21];
|
||||
char machine_type[21];
|
||||
char processor_speed[21];
|
||||
unsigned short architecture; /* enum CHIP */
|
||||
};
|
||||
|
||||
struct model _models[] = { { "02", "7015-930", "25", Power }, { "10", "7013-530", "25", Power }, { "10", "7016-730", "25", Power }, { "11", "7013-540", "30", Power }, { "14", "7013-540", "30", Power }, { "18", "7013-53H", "33", Power }, { "1C", "7013-550", "41.6", Power }, { "20", "7015-930", "25",
|
||||
Power }, { "2E", "7015-950", "41", Power }, { "30", "7013-520", "20", Power }, { "31", "7012-320", "20", Power }, { "34", "7013-52H", "25", Power }, { "35", "7012-32H", "25", Power }, { "37", "7012-340", "33", Power }, { "38", "7012-350", "41", Power }, { "41", "7011-20", "33", PowerPC }, {
|
||||
"45", "7011-220", "33", PowerPC }, { "42", "7006-41T/41W", "80", PowerPC }, { "43", "7008-M20", "33", Power }, { "43", "7008-M2A", "33", Power }, { "46", "7011-250", "66", PowerPC }, { "47", "7011-230", "45", RSC }, { "48", "7009-C10", "80", PowerPC },
|
||||
/* 4C models use a different table -- see below */
|
||||
{ "4C", "70XX", "(unknown)", unknown }, { "57", "7012-390", "67", Power2 }, { "57", "7030-3BT", "67", Power2 }, { "57", "9076-SP2 Thin", "67", Power2 }, { "58", "7012-380", "59", Power2 }, { "58", "7030-3AT", "59", Power2 }, { "59", "7012-39H", "67", Power2 }, { "59", "9076-SP2 Thin w/L2", "67",
|
||||
Power2 }, { "5C", "7013-560", "50", Power }, { "63", "7015-970", "50", Power }, { "63", "7015-97B", "50", Power }, { "64", "7015-980", "62.5", Power }, { "64", "7015-98B", "62.5", Power }, { "66", "7013-580", "62.5", Power }, { "67", "7013-570", "50", Power }, { "67", "7015-R10", "50",
|
||||
Power }, { "70", "7013-590", "66", Power2 }, { "70", "9076-SP2 Wide", "66", Power2 }, { "71", "7013-58H", "55", Power2 }, { "72", "7013-59H", "66", Power2 }, { "72", "7015-R20", "66", Power2 }, { "72", "9076-SP2 Wide", "66", Power2 }, { "75", "7012-370", "62", Power }, { "75", "7012-375",
|
||||
"62", Power }, { "75", "9076-SP1 Thin", "62", Power }, { "76", "7012-360", "50", Power }, { "76", "7012-365", "50", Power }, { "77", "7012-350", "41", Power }, { "77", "7012-355", "41", Power }, { "77", "7013-55L", "41.6", Power }, { "79", "7013-591", "77", Power2 }, { "79",
|
||||
"9076-SP2 Wide", "77", Power2 }, { "80", "7015-990", "71.5", Power2 }, { "81", "7015-R24", "71.5", P2SC }, { "89", "7013-595", "135", P2SC }, { "89", "9076-SP2 Wide", "135", P2SC }, { "90", "7009-C20", "120", PowerPC }, { "91", "7006-42W/42T", "120", PowerPC }, { "94", "7012-397", "160",
|
||||
P2SC }, { "94", "9076-SP2 Thin", "160", P2SC }, { "A0", "7013-J30", "75", PowerPC }, { "A1", "7013-J40", "112", PowerPC }, { "A3", "7015-R30", "(unknown)", PowerPC }, { "A4", "7015-R40", "(unknown)", PowerPC }, { "A4", "7015-R50", "(unknown)", PowerPC }, { "A4", "9076-SP2 High",
|
||||
"(unknown)", PowerPC }, { "A6", "7012-G30", "(unknown)", PowerPC }, { "A7", "7012-G40", "(unknown)", PowerPC }, { "C0", "7024-E20", "(unknown)", PowerPC }, { "C0", "7024-E30", "(unknown)", PowerPC }, { "C4", "7025-F30", "(unknown)", PowerPC }, { "F0", "7007-N40", "50", ThinkPad }, { "", "",
|
||||
"0", 0 } };
|
||||
|
||||
struct model _4C_models[] = { { "IBM,7017-S70", "7017-S70", "125", RS64 }, { "IBM,7017-S7A", "7017-S7A", "262", RD64_II }, { "IBM,7017-S80", "7017-S80", "450", RS_III }, { "IBM,7017-S85", "pSeries 680", "600", RS64_IV }, { "IBM,7025-F40", "7025-F40", "166/233", PowerPC_604e }, { "IBM,7025-F50",
|
||||
"7025-F50", "(unknown)", PowerPC_604e }, { "IBM,7025-F80", "7025-F80", "(unknown)", RS64_III }, { "IBM,7026-H10", "7025-H10", "166/233", PowerPC_604e }, { "IBM,7026-H50", "7025-H50", "(unknown)", PowerPC_604e }, { "IBM,7026-H80", "7025-H80", "(unknown)", RS64_III }, { "IBM,7026-M80",
|
||||
"7026-M80", "500", RS64_III }, { "IBM,7025-F40", "7025-F40", "166/233", PowerPC }, { "IBM,7025-F50", "7025-F50", "(unknown)", PowerPC }, { "IBM,7025-F80", "7025-F80", "450", PowerPC }, { "IBM,7026-B80", "pSeries 640", "375", Power3_II }, { "IBM,7026-H10", "7026-H10", "166/233", PowerPC }, {
|
||||
"IBM,7026-H50", "7026-H50", "(unknown)", PowerPC }, { "IBM,7026-H70", "7026-H70", "340", RS64_II }, { "IBM,7026-H80", "7026-H80", "450", PowerPC }, { "IBM,7026-M80", "7026-M80", "500", PowerPC }, { "IBM,7042-140", "7043-140", "166/200/233/332", PowerPC }, { "IBM,7042-150", "7043-150",
|
||||
"375", PowerPC }, { "IBM,7042-240", "7043-240", "166/233", PowerPC }, { "IBM,7043-140", "7043-140", "166/200/233/332", PowerPC }, { "IBM,7043-150", "7043-150", "375", PowerPC }, { "IBM,7043-240", "7043-240", "166/233", PowerPC }, { "IBM,7043-260", "7043-260", "200", Power3 }, { "IBM,7248",
|
||||
"7248-100", "100", PowerPersonal }, { "IBM,7248", "7248-120", "120", PowerPersonal }, { "IBM,7248", "7248-132", "132", PowerPersonal }, { "IBM,9076-270", "9076-SP Silver Node", "(unknown)", PowerPC }, { "", "", "", 0 },
|
||||
};
|
||||
|
||||
/* all GetInfo_ functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool GetInfo_XServer_and_Video(QListView *lBox) {
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
||||
|
||||
/*
|
||||
* Written using information from:
|
||||
*
|
||||
* http://service.software.ibm.com/cgi-bin/support/rs6000.support/techbrowse/tbgaus?gaus_mode=8&documents=B93576892313352&database=task
|
||||
*
|
||||
* Not fully implemented. In particular there are ways to resolve the
|
||||
* "(unknown)" clock speeds of many of these models. See page for details.
|
||||
*
|
||||
*/
|
||||
bool GetInfo_CPU(QListView *lBox) {
|
||||
struct utsname info;
|
||||
struct model *table = _models; /* table of model information */
|
||||
char model_ID[21] = ""; /* information for table lookup */
|
||||
char cpu_ID[7] = ""; /* unique CPU ID */
|
||||
int i;
|
||||
QListViewItem *lastitem= NULL;
|
||||
|
||||
lBox->addColumn(i18n("Information"));
|
||||
lBox->addColumn(i18n("Value"));
|
||||
|
||||
if (uname(&info) == -1) {
|
||||
kError(0) << "uname() failed: errno = " << errno << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
strncat(model_ID, info.machine+8, 2); /* we want the ninth and tenth digits */
|
||||
strncat(cpu_ID, info.machine+2, 6);
|
||||
|
||||
if (strcmp(model_ID, "4C") == 0) /* need to use a different model_ID and model table */
|
||||
{
|
||||
if (odm_initialize() == -1)
|
||||
kError(0) << "odm_initialize() failed: odmerrno = " << odmerrno << endl;
|
||||
else {
|
||||
struct CuAt cuat; /* Customized Device attribute */
|
||||
|
||||
/* equivalent to uname -M */
|
||||
if (odm_get_first(CuAt_CLASS, (char *)"name='sys0' and attribute='modelname'", &cuat) ) {
|
||||
strcpy(model_ID, cuat.value);
|
||||
table = _4C_models;
|
||||
}
|
||||
|
||||
odm_terminate();
|
||||
}
|
||||
}
|
||||
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("CPU ID"), QString(cpu_ID));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Node"), QString(info.nodename));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("OS"), QString(info.sysname) +
|
||||
QString(" ") + QString(info.version) + QString(".") + QString(info.release));
|
||||
|
||||
for (i=0; *(table[i].model_ID); i++)
|
||||
if (strcmp(model_ID, table[i].model_ID) == 0) {
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Machine Type"), QString(table[i].machine_type));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Architecture"), QString(chip_name[table[i].architecture]));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Speed"), QString(table[i].processor_speed) + QString(" Mhz"));
|
||||
break;
|
||||
}
|
||||
|
||||
return (true);
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
return list_devices(tree, (char *)"PdDvLn like '*/pci/*'");
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QListView *lBox) {
|
||||
return list_devices(lBox, (char *)"PdDvLn like '*'");
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QListView *lBox) {
|
||||
return list_devices(lBox, (char *)"PdDvLn like '*/scsi/*'");
|
||||
}
|
||||
|
||||
/* Parts taken from fsusage.c from the Midnight Commander (mc)
|
||||
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, In
|
||||
|
||||
Return the number of TOSIZE-byte blocks used by
|
||||
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
|
||||
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
|
||||
|
||||
static long fs_adjust_blocks(long blocks, int fromsize, int tosize) {
|
||||
if (tosize <= 0)
|
||||
abort();
|
||||
if (fromsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (fromsize == tosize) /* E.g., from 512 to 512. */
|
||||
return blocks;
|
||||
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
|
||||
return blocks * (fromsize / tosize);
|
||||
else
|
||||
/* E.g., from 256 to 512. */
|
||||
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
|
||||
}
|
||||
|
||||
/* Fill in the fields of FSP with information about space usage for
|
||||
the filesystem on which PATH resides.
|
||||
Return 0 if successful, -1 if not. */
|
||||
|
||||
#define CONVERT_BLOCKS(b) fs_adjust_blocks ((b), fsd.f_bsize, 512)
|
||||
|
||||
static int get_fs_usage(char *path, long *l_total, long *l_avail) {
|
||||
struct statfs fsd; /* 4.3BSD, SunOS 4, HP-UX, AIX. */
|
||||
unsigned long fsu_blocks, fsu_bfree, fsu_bavail;
|
||||
|
||||
*l_total = *l_avail = 0;
|
||||
if (statfs(path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
|
||||
fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
|
||||
fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
|
||||
|
||||
*l_avail = getuid() ? fsu_bavail/2 : fsu_bfree/2;
|
||||
*l_total = fsu_blocks/2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
bool GetInfo_Partitions(QListView *lbox) {
|
||||
#define NUMCOLS 5
|
||||
QString Title[NUMCOLS];
|
||||
int n;
|
||||
|
||||
struct fstab *fstab_ent;
|
||||
struct statvfs svfs;
|
||||
long total, avail;
|
||||
QString str;
|
||||
QString MB(i18n("MB")+ " "); // International Text for MB=Mega-Byte
|
||||
|
||||
if (setfsent() != 1) // Try to open fstab
|
||||
return false;
|
||||
|
||||
Title[0] = i18n("Device");
|
||||
Title[1] = i18n("Mount Point");
|
||||
Title[2] = i18n("FS Type");
|
||||
Title[3] = i18n("Total Size");
|
||||
Title[4] = i18n("Free Size");
|
||||
|
||||
for (n=0; n<NUMCOLS; ++n) {
|
||||
lbox->addColumn(Title[n]);
|
||||
}
|
||||
|
||||
while ((fstab_ent=getfsent())!=NULL) {
|
||||
/* fstab_ent->fs_type holds only "rw","xx","ro"... */
|
||||
memset(&svfs, 0, sizeof(svfs));
|
||||
statvfs(fstab_ent->fs_file, &svfs);
|
||||
get_fs_usage(fstab_ent->fs_file, &total, &avail);
|
||||
|
||||
if (!strcmp(fstab_ent->fs_type, FSTAB_XX)) // valid drive ?
|
||||
svfs.f_basetype[0] = 0;
|
||||
|
||||
if (svfs.f_basetype[0]) {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")),
|
||||
Value((total+512)/1024,6) + MB,
|
||||
Value((avail+512)/1024,6) + MB);
|
||||
} else {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")));
|
||||
}
|
||||
|
||||
}
|
||||
endfsent();
|
||||
|
||||
return true;
|
||||
}
|
|
@ -8,25 +8,13 @@
|
|||
* during the creation of info_fbsd.cpp. Thanks Mike.
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
/*
|
||||
* all following functions should return true, when the Information
|
||||
* was filled into the lBox-Widget. Returning false indicates that
|
||||
* was filled into the QTreeWidget. Returning false indicates that
|
||||
* information was not available.
|
||||
*/
|
||||
#include "config-infocenter.h" // HAVE_DEVINFO_H
|
||||
|
||||
#include "config-infocenter.h" // HAVE_DEVINFO_H
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
|
@ -40,15 +28,17 @@
|
|||
#include <fstab.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <Qt3Support/Q3Dict>
|
||||
#include <QMap>
|
||||
#include <QFile>
|
||||
|
||||
#include <QTextStream>
|
||||
|
||||
class Device {
|
||||
public:
|
||||
Device (QString n=QString(), QString d=QString())
|
||||
{name=n; description=d;}
|
||||
Device(QString n=QString(), QString d=QString()) {
|
||||
name=n;
|
||||
description=d;
|
||||
}
|
||||
QString name, description;
|
||||
};
|
||||
|
||||
|
@ -65,8 +55,7 @@ extern "C" {
|
|||
}
|
||||
#endif
|
||||
|
||||
bool GetInfo_CPU (Q3ListView *lBox)
|
||||
{
|
||||
bool GetInfo_CPU(QTreeWidget* tree) {
|
||||
// Modified 13 July 2000 for SMP by Brad Hughes - bhughes@trolltech.com
|
||||
|
||||
int ncpu;
|
||||
|
@ -95,7 +84,9 @@ bool GetInfo_CPU (Q3ListView *lBox)
|
|||
}
|
||||
|
||||
/* Put everything in the listbox */
|
||||
new Q3ListViewItem(lBox, cpustring);
|
||||
QStringList list;
|
||||
list << cpustring;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
|
||||
/* Clean up after ourselves, this time I mean it ;-) */
|
||||
delete buf;
|
||||
|
@ -104,8 +95,7 @@ bool GetInfo_CPU (Q3ListView *lBox)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_IRQ(QTreeWidget* tree) {
|
||||
#ifdef HAVE_DEVINFO_H
|
||||
/* systat lists the interrupts assigned to devices as well as how many were
|
||||
generated. Parsing its output however is about as fun as a sandpaper
|
||||
|
@ -114,54 +104,55 @@ bool GetInfo_IRQ (Q3ListView *lbox)
|
|||
/* Oh neat, current now has a neat little utility called devinfo */
|
||||
if (devinfo_init())
|
||||
return false;
|
||||
devinfo_foreach_rman(print_irq, lbox);
|
||||
devinfo_foreach_rman(print_irq, tree);
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool GetInfo_DMA (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_DMA(QTreeWidget* tree) {
|
||||
#ifdef HAVE_DEVINFO_H
|
||||
/* Oh neat, current now has a neat little utility called devinfo */
|
||||
if (devinfo_init())
|
||||
return false;
|
||||
devinfo_foreach_rman(print_dma, lbox);
|
||||
devinfo_foreach_rman(print_dma, tree);
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_IO_Ports(QTreeWidget* tree) {
|
||||
#ifdef HAVE_DEVINFO_H
|
||||
/* Oh neat, current now has a neat little utility called devinfo */
|
||||
if (devinfo_init())
|
||||
return false;
|
||||
devinfo_foreach_rman(print_ioports, lbox);
|
||||
devinfo_foreach_rman(print_ioports, tree);
|
||||
return true;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool GetInfo_Sound (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_Sound(QTreeWidget* tree) {
|
||||
QFile *sndstat = new QFile("/dev/sndstat");
|
||||
QTextStream *t;
|
||||
QString s;
|
||||
Q3ListViewItem *olditem = 0;
|
||||
|
||||
if (!sndstat->exists() || !sndstat->open(QIODevice::ReadOnly)) {
|
||||
|
||||
s = i18n("Your sound system could not be queried. /dev/sndstat does not exist or is not readable.");
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
} else {
|
||||
t = new QTextStream(sndstat);
|
||||
while (!(s=t->readLine()).isNull()) {
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
delete t;
|
||||
|
@ -172,20 +163,22 @@ bool GetInfo_Sound (Q3ListView *lbox)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_SCSI(QTreeWidget* tree) {
|
||||
FILE *pipe;
|
||||
QFile *camcontrol = new QFile("/sbin/camcontrol");
|
||||
QTextStream *t;
|
||||
QString s;
|
||||
Q3ListViewItem *olditem = 0;
|
||||
|
||||
if (!camcontrol->exists()) {
|
||||
s = i18n("SCSI subsystem could not be queried: /sbin/camcontrol could not be found");
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
} else if ((pipe = popen("/sbin/camcontrol devlist 2>&1", "r")) == NULL) {
|
||||
s = i18n("SCSI subsystem could not be queried: /sbin/camcontrol could not be executed");
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
} else {
|
||||
|
||||
/* This prints out a list of all the scsi devies, perhaps eventually we could
|
||||
|
@ -197,7 +190,9 @@ bool GetInfo_SCSI (Q3ListView *lbox)
|
|||
s = t->readLine();
|
||||
if (s.isEmpty() )
|
||||
break;
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
delete t;
|
||||
|
@ -206,18 +201,17 @@ bool GetInfo_SCSI (Q3ListView *lbox)
|
|||
|
||||
delete camcontrol;
|
||||
|
||||
if (!lbox->childCount())
|
||||
if (!tree->topLevelItemCount())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
FILE *pipe;
|
||||
QFile *pcicontrol;
|
||||
QString s, cmd;
|
||||
Q3ListViewItem *olditem = 0;
|
||||
QTreeWidgetItem *olditem= NULL;
|
||||
|
||||
pcicontrol = new QFile("/usr/sbin/pciconf");
|
||||
|
||||
|
@ -228,9 +222,9 @@ bool GetInfo_PCI (Q3ListView *lbox)
|
|||
delete pcicontrol;
|
||||
pcicontrol = new QFile("/usr/X11R6/bin/pcitweak");
|
||||
if (!pcicontrol->exists()) {
|
||||
QString s;
|
||||
s = i18n("Could not find any programs with which to query your system's PCI information");
|
||||
(void) new Q3ListViewItem(lbox, 0, s);
|
||||
QStringList list;
|
||||
list << i18n("Could not find any programs with which to query your system's PCI information");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
delete pcicontrol;
|
||||
return true;
|
||||
} else {
|
||||
|
@ -245,28 +239,29 @@ bool GetInfo_PCI (Q3ListView *lbox)
|
|||
delete pcicontrol;
|
||||
|
||||
if ((pipe = popen(cmd.toLatin1(), "r")) == NULL) {
|
||||
s = i18n ("PCI subsystem could not be queried: %1 could not be executed", cmd);
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
QStringList list;
|
||||
list << i18n("PCI subsystem could not be queried: %1 could not be executed", cmd);
|
||||
olditem = new QTreeWidgetItem(olditem, list);
|
||||
} else {
|
||||
|
||||
/* This prints out a list of all the pci devies, perhaps eventually we could
|
||||
parse it as opposed to schlepping it into a listbox */
|
||||
|
||||
pclose(pipe);
|
||||
GetInfo_ReadfromPipe(lbox, cmd.toLatin1(), true);
|
||||
GetInfo_ReadfromPipe(tree, cmd.toLatin1(), true);
|
||||
}
|
||||
|
||||
if (!lbox->childCount()) {
|
||||
s = i18n("The PCI subsystem could not be queried, this may need root privileges.");
|
||||
olditem = new Q3ListViewItem(lbox, olditem, s);
|
||||
if (!tree->topLevelItemCount()) {
|
||||
QStringList list;
|
||||
list << i18n("The PCI subsystem could not be queried, this may need root privileges.");
|
||||
olditem = new QTreeWidgetItem(tree, olditem, list);
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_Partitions(QTreeWidget* tree) {
|
||||
struct fstab *fstab_ent;
|
||||
|
||||
if (setfsent() != 1) /* Try to open fstab */{
|
||||
|
@ -274,43 +269,41 @@ bool GetInfo_Partitions (Q3ListView *lbox)
|
|||
QString s;
|
||||
s = i18n("Could not check filesystem info: ");
|
||||
s += strerror(s_err);
|
||||
(void)new Q3ListViewItem(lbox, 0, s);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
} else {
|
||||
lbox->addColumn(i18n("Device"));
|
||||
lbox->addColumn(i18n("Mount Point"));
|
||||
lbox->addColumn(i18n("FS Type"));
|
||||
lbox->addColumn(i18n("Mount Options"));
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Mount Point") << i18n("FS Type") << i18n("Mount Options");
|
||||
|
||||
while ((fstab_ent=getfsent())!=NULL) {
|
||||
new Q3ListViewItem(lbox, fstab_ent->fs_spec,
|
||||
fstab_ent->fs_file, fstab_ent->fs_vfstype,
|
||||
fstab_ent->fs_mntops);
|
||||
QString list;
|
||||
list << fstab_ent->fs_spec << fstab_ent->fs_file << fstab_ent->fs_vfstype << fstab_ent->fs_mntops;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
lbox->setSorting(0);
|
||||
lbox->header()->setClickEnabled(true);
|
||||
tree->sortItems(0, Qt::AscendingOrder);
|
||||
|
||||
endfsent(); /* Close fstab */
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video (Q3ListView *lBox)
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
||||
|
||||
bool GetInfo_Devices (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_Devices(QTreeWidget* tree) {
|
||||
QFile *f = new QFile("/var/run/dmesg.boot");
|
||||
if (f->open(QIODevice::ReadOnly)) {
|
||||
QTextStream qts(f);
|
||||
Q3Dict<Q3ListViewItem> lv_items;
|
||||
QMap<QString, QTreeWidgetItem*> lv_items;
|
||||
Device *dev;
|
||||
QString line, controller;
|
||||
lbox->setRootIsDecorated(true);
|
||||
lbox->addColumn("Device");
|
||||
lbox->addColumn("Description");
|
||||
tree->setRootIsDecorated(true);
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Description");
|
||||
tree->setHeaderLabels(headers);
|
||||
while ( !(line=qts.readLine()).isNull() ) {
|
||||
controller = GetController(line);
|
||||
if (controller.isNull())
|
||||
|
@ -320,13 +313,18 @@ bool GetInfo_Devices (Q3ListView *lbox)
|
|||
continue;
|
||||
// Ewww assuing motherboard is the only toplevel controller is rather gross
|
||||
if (controller == "motherboard") {
|
||||
if (!lv_items[dev->name]) {
|
||||
lv_items.insert(dev->name, new Q3ListViewItem(lbox, dev->name, dev->description) );
|
||||
if (lv_items.contains(QString(dev->name))==false) {
|
||||
QStringList list;
|
||||
list << dev->name << dev->description;
|
||||
|
||||
lv_items.insert(QString(dev->name), new QTreeWidgetItem(tree, list));
|
||||
}
|
||||
} else {
|
||||
Q3ListViewItem *parent=lv_items[controller];
|
||||
if (parent && !lv_items[dev->name]) {
|
||||
lv_items.insert(dev->name, new Q3ListViewItem(parent, dev->name, dev->description) );
|
||||
QTreeWidgetItem* parent=lv_items[controller];
|
||||
if (parent && lv_items.contains(dev->name)==false) {
|
||||
QStringList list;
|
||||
list << dev->name << dev->description;
|
||||
lv_items.insert(QString(dev->name), new QTreeWidgetItem(parent, list));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -335,8 +333,7 @@ bool GetInfo_Devices (Q3ListView *lbox)
|
|||
return false;
|
||||
}
|
||||
|
||||
QString GetController(const QString &line)
|
||||
{
|
||||
QString GetController(const QString &line) {
|
||||
if ( ( (line.startsWith("ad")) || (line.startsWith("afd")) || (line.startsWith("acd")) ) && (line.find(":") < 6)) {
|
||||
QString controller = line;
|
||||
controller.remove(0, controller.find(" at ")+4);
|
||||
|
@ -360,8 +357,7 @@ QString GetController(const QString &line)
|
|||
return QString();
|
||||
}
|
||||
|
||||
Device *GetDevice(const QString &line)
|
||||
{
|
||||
Device *GetDevice(const QString &line) {
|
||||
Device *dev;
|
||||
int colon = line.find(":");
|
||||
if (colon == -1)
|
||||
|
@ -375,21 +371,25 @@ Device *GetDevice(const QString &line)
|
|||
|
||||
#ifdef HAVE_DEVINFO_H
|
||||
|
||||
int print_irq(struct devinfo_rman *rman, void *arg)
|
||||
{
|
||||
Q3ListView *lbox = (Q3ListView *)arg;
|
||||
int print_irq(struct devinfo_rman *rman, void *arg) {
|
||||
QTreeWidget* tree = (QTreeWidget *)arg;
|
||||
if (strcmp(rman->dm_desc, "Interrupt request lines")==0) {
|
||||
(void)new Q3ListViewItem(lbox, 0, rman->dm_desc);
|
||||
|
||||
QStringList list;
|
||||
list << rman->dm_desc;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
devinfo_foreach_rman_resource(rman, print_resource, arg);
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int print_dma(struct devinfo_rman *rman, void *arg)
|
||||
{
|
||||
Q3ListView *lbox = (Q3ListView *)arg;
|
||||
QTreeWidget* tree = (QTreeWidget *)arg;
|
||||
if (strcmp(rman->dm_desc, "DMA request lines")==0) {
|
||||
(void)new Q3ListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
|
||||
QStringList list;
|
||||
list << rman->dm_desc;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
devinfo_foreach_rman_resource(rman, print_resource, arg);
|
||||
}
|
||||
return(0);
|
||||
|
@ -397,17 +397,23 @@ int print_dma(struct devinfo_rman *rman, void *arg)
|
|||
|
||||
int print_ioports(struct devinfo_rman *rman, void *arg)
|
||||
{
|
||||
Q3ListView *lbox = (Q3ListView *)arg;
|
||||
QTreeWidget* tree = (QTreeWidget*) arg;
|
||||
|
||||
if (strcmp(rman->dm_desc, "I/O ports")==0) {
|
||||
(void)new Q3ListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
|
||||
QStringList list;
|
||||
list << rman->dm_desc;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
|
||||
devinfo_foreach_rman_resource(rman, print_resource, arg);
|
||||
}
|
||||
else if (strcmp(rman->dm_desc, "I/O memory addresses")==0) {
|
||||
(void)new Q3ListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
|
||||
QStringList list;
|
||||
list << rman->dm_desc;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
|
||||
devinfo_foreach_rman_resource(rman, print_resource, arg);
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int print_resource(struct devinfo_res *res, void *arg)
|
||||
|
@ -416,9 +422,7 @@ int print_resource(struct devinfo_res *res, void *arg)
|
|||
struct devinfo_rman *rman;
|
||||
int hexmode;
|
||||
|
||||
Q3ListView *lbox;
|
||||
|
||||
lbox = (Q3ListView *)arg;
|
||||
QTreeWidget* tree = (QTreeWidget*) arg;
|
||||
|
||||
QString s, tmp;
|
||||
|
||||
|
@ -440,8 +444,11 @@ int print_resource(struct devinfo_res *res, void *arg)
|
|||
}
|
||||
s += tmp;
|
||||
|
||||
(void)new Q3ListViewItem(lbox, lbox->lastItem(), s);
|
||||
return(0);
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
55
kinfocenter/base/info_generic.cpp
Normal file
55
kinfocenter/base/info_generic.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
|
||||
1998 by Helge Deller (deller@gmx.de)
|
||||
free source under GPL
|
||||
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
*/
|
||||
|
||||
// Default for unsupportet systems
|
||||
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool GetInfo_CPU(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
560
kinfocenter/base/info_hpux.cpp
Normal file
560
kinfocenter/base/info_hpux.cpp
Normal file
|
@ -0,0 +1,560 @@
|
|||
/*
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
|
||||
Mostly written 1998-1999 by Helge Deller (deller@gmx.de),
|
||||
with some pieces of code from Aubert Pierre.
|
||||
|
||||
Last modified: done:
|
||||
1999-06-21 added more models to the lookup-table (deller)
|
||||
1999-06-18 added support for 64-Bit HP-UX in CPU-detection(deller)
|
||||
1999-05-04 added audio(alib)-support (deller)
|
||||
1999-04-27 [tested with HP-UX 10.20 (HP9000/715/64-EISA)]
|
||||
added support for nearly all categories
|
||||
(means: not finished!)
|
||||
1998-11-01 first, nearly empty version (deller)
|
||||
with a little source for CPU from Aubert Pierre
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/pstat.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <fstab.h>
|
||||
#include <stdlib.h>
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <QTextStream>
|
||||
|
||||
# define INFO_CPU_MODEL "/bin/model" // as pipe !!
|
||||
# define INFO_PCI "" // Please, who know it ????
|
||||
# define INFO_PCI_EISA "/etc/eisa/system.sci" // File !
|
||||
# define INFO_IOPORTS_1 "/etc/dmesg" // as pipe !
|
||||
# define INFO_IOPORTS_2 "/usr/sbin/dmesg" // as pipe !
|
||||
# define INFO_DEVICES "/etc/ioscan" // as pipe !!
|
||||
# define INFO_PARTITIONS_1 FSTAB // = "/etc/fstab" (in fstab.h)
|
||||
# define INFO_PARTITIONS_2 "/etc/checklist"
|
||||
|
||||
/* The following table is from an HP-UX 10.20 System
|
||||
build out of the files
|
||||
"/usr/lib/sched.models"
|
||||
or
|
||||
"/opt/langtools/lib/sched.models"
|
||||
If you have more entries, then please add them or send them to me!
|
||||
*/
|
||||
|
||||
// entries for PA_REVISION[]
|
||||
enum V_ENTRIES
|
||||
{ V_1x0,
|
||||
V_1x1, V_1x1a, V_1x1b, V_1x1c, V_1x1d, V_1x1e,
|
||||
V_2x0,
|
||||
V_LAST};
|
||||
|
||||
static const char PA_REVISION[V_LAST][7] = { "1.0", "1.1", "1.1a", "1.1b", "1.1c", "1.1d", "1.1e", "2.0" };
|
||||
|
||||
// entries for PA_NAME[]
|
||||
enum PA_ENTRIES
|
||||
{ PA7000,
|
||||
PA7100, PA7100LC, PA7200, PA7300,
|
||||
PA8000, PA8200, PA8500,
|
||||
PARISC_PA_LAST};
|
||||
|
||||
static const char PA_NAME[PARISC_PA_LAST][11] = { "PA7000", "PA7100", "PA7100LC", "PA7200", "PA7300", "PA8000", "PA8200", "PA8500" };
|
||||
|
||||
struct _type_LOOKUPTABLE {
|
||||
char Name[8];
|
||||
unsigned short parisc_rev; // = enum V_ENTRIES
|
||||
unsigned short parisc_name; // = enum PA_ENTRIES
|
||||
};
|
||||
|
||||
static const struct _type_LOOKUPTABLE PA_LOOKUPTABLE[] = {
|
||||
/* VERSION A.00.07
|
||||
(there seems to exist several different files with same version-number !)*/
|
||||
{ "600", V_1x0, PA7000 }, { "635", V_1x0, PA7000 }, { "645", V_1x0, PA7000 }, { "700", V_1x1, PA7000 }, { "705", V_1x1a, PA7000 }, { "710", V_1x1a, PA7000 }, { "712", V_1x1c, PA7100LC }, { "715", V_1x1c, PA7100LC }, { "720", V_1x1a, PA7000 }, { "722", V_1x1c, PA7100LC },
|
||||
{ "725", V_1x1c, PA7100LC }, { "728", V_1x1d, PA7200 }, { "730", V_1x1a, PA7000 }, { "735", V_1x1b, PA7100 },
|
||||
{ "742", V_1x1b, PA7100 },
|
||||
{ "743", V_1x1b, PA7100 }, // or a 1.1c,PA7100LC !!
|
||||
{ "744", V_1x1e, PA7300 }, { "745", V_1x1b, PA7100 }, { "747", V_1x1b, PA7100 }, { "750", V_1x1a, PA7000 }, { "755", V_1x1b, PA7100 }, { "770", V_1x1d, PA7200 }, { "777", V_1x1d, PA7200 }, { "778", V_1x1e, PA7300 }, { "779", V_1x1e, PA7300 }, { "780", V_2x0, PA8000 },
|
||||
{ "781", V_2x0, PA8000 }, { "782", V_2x0, PA8200 }, { "783", V_2x0, PA8500 }, { "785", V_2x0, PA8500 },
|
||||
{ "800", V_1x0, PA7000 }, // and one with: 2.0 / PA8000
|
||||
{ "801", V_1x1c, PA7100LC }, { "802", V_2x0, PA8000 }, { "803", V_1x1e, PA7300 }, { "804", V_2x0, PA8000 }, { "806", V_1x1c, PA7100LC }, { "807", V_1x1a, PA7000 }, { "808", V_1x0, PA7000 }, { "809", V_1x1d, PA7200 }, { "810", V_2x0, PA8000 }, { "811", V_1x1c, PA7100LC }, { "813", V_1x1e,
|
||||
PA7300 }, { "815", V_1x0, PA7000 }, { "816", V_1x1c, PA7100LC }, { "817", V_1x1a, PA7000 }, { "819", V_1x1d, PA7200 }, { "820", V_2x0, PA8000 }, { "821", V_1x1d, PA7200 }, { "822", V_1x0, PA7000 }, { "825", V_1x0, PA7000 }, { "826", V_1x1c, PA7100LC }, { "827", V_1x1a, PA7000 }, {
|
||||
"829", V_1x1d, PA7200 }, { "831", V_1x1d, PA7200 }, { "832", V_1x0, PA7000 }, { "834", V_1x0, PA7000 }, { "835", V_1x0, PA7000 }, { "837", V_1x1a, PA7000 }, { "839", V_1x1d, PA7200 }, { "840", V_1x0, PA7000 }, { "841", V_1x1d, PA7200 }, { "842", V_1x0, PA7000 }, { "845", V_1x0,
|
||||
PA7000 }, { "847", V_1x1a, PA7000 }, { "849", V_1x1d, PA7200 }, { "850", V_1x0, PA7000 }, { "851", V_1x1d, PA7200 }, { "852", V_1x0, PA7000 }, { "855", V_1x0, PA7000 }, { "856", V_1x1c, PA7100LC }, { "857", V_1x1a, PA7000 }, { "859", V_1x1d, PA7200 }, { "860", V_1x0, PA7000 }, {
|
||||
"861", V_2x0, PA8000 }, { "865", V_1x0, PA7000 }, { "869", V_1x1d, PA7200 }, { "870", V_1x0, PA7000 }, { "871", V_2x0, PA8000 }, { "877", V_1x1a, PA7000 }, { "879", V_2x0, PA8000 }, { "887", V_1x1b, PA7100 }, { "889", V_2x0, PA8000 }, { "890", V_1x0, PA7000 }, { "891", V_1x1b,
|
||||
PA7100 }, { "892", V_1x1b, PA7100 }, { "893", V_2x0, PA8000 }, { "895", V_2x0, PA8000 }, { "896", V_2x0, PA8000 }, { "897", V_1x1b, PA7100 }, { "898", V_2x0, PA8200 }, { "899", V_2x0, PA8200 }, { "900", V_1x0, PA7000 }, { "B115", V_1x1e, PA7300 }, { "B120", V_1x1e, PA7300 }, {
|
||||
"B132L", V_1x1e, PA7300 }, { "B160L", V_1x1e, PA7300 }, { "B180L", V_1x1e, PA7300 }, { "C100", V_1x1d, PA7200 }, { "C110", V_1x1d, PA7200 }, { "C115", V_1x1e, PA7300 }, { "C120", V_1x1e, PA7300 }, { "C130", V_2x0, PA8000 }, { "C140", V_2x0, PA8000 }, { "C160L", V_1x1e, PA7300 }, {
|
||||
"C160", V_2x0, PA8000 }, { "C180L", V_1x1e, PA7300 }, { "C180-XP", V_2x0, PA8000 }, { "C180", V_2x0, PA8000 }, { "C200+", V_2x0, PA8200 }, { "C230+", V_2x0, PA8200 }, { "C240+", V_2x0, PA8200 }, { "CB260", V_2x0, PA8200 },
|
||||
{ "D200", V_1x1d, PA7200 }, // or: 1.1c, PA7100LC
|
||||
{ "D210", V_1x1d, PA7200 }, // or: 1.1c, PA7100LC
|
||||
{ "D220", V_1x1e, PA7300 }, { "D230", V_1x1e, PA7300 }, { "D250", V_1x1d, PA7200 }, { "D260", V_1x1d, PA7200 }, { "D270", V_2x0, PA8000 }, { "D280", V_2x0, PA8000 }, { "D310", V_1x1c, PA7100LC }, { "D320", V_1x1e, PA7300 }, { "D330", V_1x1e, PA7300 }, { "D350", V_1x1d, PA7200 }, { "D360",
|
||||
V_1x1d, PA7200 }, { "D370", V_2x0, PA8000 }, { "D380", V_2x0, PA8000 }, { "D400", V_1x1d, PA7200 }, { "D410", V_1x1d, PA7200 }, { "D650", V_2x0, PA8000 }, { "DX0", V_1x1c, PA7100LC }, { "DX5", V_1x1c, PA7100LC }, { "DXO", V_1x1c, PA7100LC }, { "E25", V_1x1c, PA7100LC }, { "E35",
|
||||
V_1x1c, PA7100LC }, { "E45", V_1x1c, PA7100LC }, { "E55", V_1x1c, PA7100LC }, { "F10", V_1x1a, PA7000 }, { "F20", V_1x1a, PA7000 }, { "F30", V_1x1a, PA7000 }, { "G30", V_1x1a, PA7000 }, { "G40", V_1x1a, PA7000 }, { "G50", V_1x1b, PA7100 }, { "G60", V_1x1b, PA7100 }, { "G70", V_1x1b,
|
||||
PA7100 }, { "H20", V_1x1a, PA7000 }, { "H30", V_1x1a, PA7000 }, { "H40", V_1x1a, PA7000 }, { "H50", V_1x1b, PA7100 }, { "H60", V_1x1b, PA7100 }, { "H70", V_1x1b, PA7100 }, { "I30", V_1x1a, PA7000 }, { "I40", V_1x1a, PA7000 }, { "I50", V_1x1b, PA7100 }, { "I60", V_1x1b, PA7100 }, {
|
||||
"I70", V_1x1b, PA7100 }, { "J200", V_1x1d, PA7200 }, { "J210XC", V_1x1d, PA7200 }, { "J210", V_1x1d, PA7200 }, { "J220", V_2x0, PA8000 }, { "J2240", V_2x0, PA8200 }, { "J280", V_2x0, PA8000 }, { "J282", V_2x0, PA8000 }, { "J400", V_2x0, PA8000 }, { "J410", V_2x0, PA8000 }, { "K100",
|
||||
V_1x1d, PA7200 }, { "K200", V_1x1d, PA7200 }, { "K210", V_1x1d, PA7200 }, { "K230", V_1x1d, PA7200 }, { "K250", V_2x0, PA8000 }, { "K260", V_2x0, PA8000 }, { "K370", V_2x0, PA8200 }, { "K380", V_2x0, PA8200 }, { "K400", V_1x1d, PA7200 }, { "K410", V_1x1d, PA7200 }, { "K420", V_1x1d,
|
||||
PA7200 }, { "K430", V_1x1d, PA7200 }, { "K450", V_2x0, PA8000 }, { "K460", V_2x0, PA8000 }, { "K470", V_2x0, PA8200 }, { "K570", V_2x0, PA8200 }, { "K580", V_2x0, PA8200 }, { "S700i", V_1x1e, PA7300 }, { "S715", V_1x1e, PA7300 }, { "S744", V_1x1e, PA7300 },
|
||||
{ "S760", V_1x1e, PA7300 }, { "T500", V_1x1c, PA7100LC }, // or: 1.1b, PA7100
|
||||
{ "T520", V_1x1b, PA7100 }, { "T540", V_2x0, PA8000 }, { "T600", V_2x0, PA8000 }, { "V2000", V_2x0, PA8000 }, { "V2200", V_2x0, PA8200 }, { "V2250", V_2x0, PA8200 }, { "V2500", V_2x0, PA8500 },
|
||||
|
||||
{ "", 0, 0 } /* Last Entry has to be empty. */
|
||||
};
|
||||
|
||||
/* Helper-Functions */
|
||||
|
||||
// Value() is defined in info.cpp !!!
|
||||
|
||||
static bool Find_in_LOOKUPTABLE(QListView *lBox, char *machine) {
|
||||
char *Machine;
|
||||
int len;
|
||||
const struct _type_LOOKUPTABLE *Entry = PA_LOOKUPTABLE;
|
||||
QString str;
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
Machine = machine; // machine is like: "9000/715/D"
|
||||
while ((*Machine) && (*Machine!='/'))
|
||||
++Machine;
|
||||
|
||||
if (*Machine)
|
||||
++Machine;
|
||||
else
|
||||
Machine=machine;
|
||||
|
||||
len = strlen(Machine);
|
||||
|
||||
while (Entry->Name[0]) {
|
||||
if (strncmp(Entry->Name, Machine, len)==0) {
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("PA-RISC Processor"),
|
||||
QString(PA_NAME[Entry->parisc_name]));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("PA-RISC Revision"),
|
||||
QString("PA-RISC ") + QString(PA_REVISION[Entry->parisc_rev]));
|
||||
return true;
|
||||
} else
|
||||
++Entry; // next Entry !
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool GetInfo_CPU(QListView *lBox) {
|
||||
FILE *pipe;
|
||||
QFile *model;
|
||||
|
||||
struct pst_dynamic psd;
|
||||
struct pst_static pst;
|
||||
struct pst_processor pro;
|
||||
struct utsname info;
|
||||
QString str, str2;
|
||||
QListViewItem* olditem = 0;
|
||||
int maxwidth, i;
|
||||
|
||||
if ((pstat_getstatic(&pst, sizeof(pst), (size_t)1, 0) == -1) || (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)== -1)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
maxwidth = 0;
|
||||
lBox->addColumn(i18n("Information") );
|
||||
lBox->addColumn(i18n("Value") );
|
||||
|
||||
uname(&info);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Machine"), info.machine);
|
||||
|
||||
model = new QFile(INFO_CPU_MODEL);
|
||||
if (model->exists()) {
|
||||
if ((pipe = popen(INFO_CPU_MODEL, "r"))) {
|
||||
QTextStream *t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
str = t->readLine();
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Model"), str);
|
||||
delete t;
|
||||
}
|
||||
delete pipe;
|
||||
}
|
||||
delete model;
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Machine Identification Number"),
|
||||
strlen(info.__idnumber) ? QString(info.__idnumber) : i18n("(none)") );
|
||||
|
||||
if (psd.psd_proc_cnt<=0)
|
||||
psd.psd_proc_cnt=1; // Minimum one CPU !
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Number of Active Processors"),
|
||||
Value(psd.psd_proc_cnt));
|
||||
|
||||
pstat_getprocessor( &pro, sizeof(pro), 1, 0);
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("CPU Clock"),
|
||||
Value(pro.psp_iticksperclktick/10000) + ' ' + i18n("MHz"));
|
||||
|
||||
switch (sysconf(_SC_CPU_VERSION)) {
|
||||
case CPU_HP_MC68020:
|
||||
str2 = "Motorola 68020";
|
||||
break;
|
||||
case CPU_HP_MC68030:
|
||||
str2 = "Motorola 68030";
|
||||
break;
|
||||
case CPU_HP_MC68040:
|
||||
str2 = "Motorola 68040";
|
||||
break;
|
||||
case CPU_PA_RISC1_0:
|
||||
str2 = "PA-RISC 1.0";
|
||||
break;
|
||||
case CPU_PA_RISC1_1:
|
||||
str2 = "PA-RISC 1.1";
|
||||
break;
|
||||
case CPU_PA_RISC1_2:
|
||||
str2 = "PA-RISC 1.2";
|
||||
break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (sysconf(_SC_KERNEL_BITS)) {
|
||||
case 64: str2 = "PA-RISC 2.0w (64 bit)"; break;
|
||||
case 32: str2 = "PA-RISC 2.0n (32 bit)"; break;
|
||||
default: str2 = "PA-RISC 2.0"; break;
|
||||
}; break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
str2 = "PA-RISC 2.0";
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
str2 = i18n("(unknown)");
|
||||
break;
|
||||
}
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("CPU Architecture"), str2);
|
||||
|
||||
Find_in_LOOKUPTABLE(lBox, info.machine);// try to get extended Information.
|
||||
|
||||
for (i=PS_PA83_FPU; i<=PS_PA89_FPU; ++i) {
|
||||
if ((1<<(i-1)) & pro.psp_coprocessor.psc_present) {
|
||||
str = QString( (i==PS_PA83_FPU) ? "PS_PA83_FPU" : "PS_PA89_FPU") + QString(" (") + QString(((1<<(i-1))&pro.psp_coprocessor.psc_enabled) ? i18n("enabled") : i18n("disabled") ) + QString(")");
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Numerical Coprocessor (FPU)"), str);
|
||||
}
|
||||
}// for(coprocessor..)
|
||||
|
||||
str = Value(((pst.physical_memory*pst.page_size)/1024/1024)) + QString(" ") + i18n("MB"); // Mega-Byte
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Total Physical Memory"), str);
|
||||
|
||||
str = Value(pst.page_size) + QString(" ") + i18n("Bytes");
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Size of One Page"), str);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_ReadfromFile(QListView *lBox, const char *Name) {
|
||||
char buf[2048];
|
||||
|
||||
QFile *file = new QFile(Name);
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
if (!file->open(QIODevice::ReadOnly)) {
|
||||
delete file;
|
||||
return false;
|
||||
}
|
||||
|
||||
while (file->readLine(buf, sizeof(buf)-1) >= 0) {
|
||||
if (strlen(buf))
|
||||
olditem = new QListViewItem(lBox, olditem, QString::fromLocal8Bit(buf));
|
||||
}
|
||||
|
||||
file->close();
|
||||
delete file;
|
||||
return (lBox->childCount());
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
return (GetInfo_ReadfromFile(tree, INFO_PCI) + GetInfo_ReadfromFile(tree, INFO_PCI_EISA) );
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QListView *lBox) {
|
||||
if (GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_1, false))
|
||||
return true;
|
||||
else
|
||||
return GetInfo_ReadfromPipe(lBox, INFO_IOPORTS_2, false);
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QListView *lBox) {
|
||||
return GetInfo_ReadfromPipe(lBox, INFO_DEVICES, false);
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QListView *lBox) {
|
||||
return GetInfo_Devices(lBox);
|
||||
}
|
||||
/* Parts taken from fsusage.c from the Midnight Commander (mc)
|
||||
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, In
|
||||
|
||||
Return the number of TOSIZE-byte blocks used by
|
||||
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
|
||||
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
|
||||
|
||||
static long fs_adjust_blocks(long blocks, int fromsize, int tosize) {
|
||||
if (tosize <= 0)
|
||||
abort();
|
||||
if (fromsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (fromsize == tosize) /* E.g., from 512 to 512. */
|
||||
return blocks;
|
||||
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
|
||||
return blocks * (fromsize / tosize);
|
||||
else
|
||||
/* E.g., from 256 to 512. */
|
||||
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
|
||||
}
|
||||
|
||||
/* Fill in the fields of FSP with information about space usage for
|
||||
the filesystem on which PATH resides.
|
||||
Return 0 if successful, -1 if not. */
|
||||
|
||||
#define CONVERT_BLOCKS(b) fs_adjust_blocks ((b), fsd.f_bsize, 512)
|
||||
|
||||
static int get_fs_usage(char *path, long *l_total, long *l_avail) {
|
||||
struct statfs fsd; /* 4.3BSD, SunOS 4, HP-UX, AIX. */
|
||||
unsigned long fsu_blocks, fsu_bfree, fsu_bavail;
|
||||
|
||||
*l_total = *l_avail = 0;
|
||||
if (statfs(path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
|
||||
fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
|
||||
fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
|
||||
|
||||
*l_avail = getuid() ? fsu_bavail/2 : fsu_bfree/2;
|
||||
*l_total = fsu_blocks/2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
bool GetInfo_Partitions(QListView *lbox) {
|
||||
#define NUMCOLS 5
|
||||
QString Title[NUMCOLS];
|
||||
int n;
|
||||
|
||||
struct fstab *fstab_ent;
|
||||
struct statvfs svfs;
|
||||
long total, avail;
|
||||
QString str;
|
||||
QString MB(i18n("MB")+ " "); // International Text for MB=Mega-Byte
|
||||
|
||||
if (setfsent() != 1) // Try to open fstab
|
||||
return false;
|
||||
|
||||
Title[0] = i18n("Device");
|
||||
Title[1] = i18n("Mount Point");
|
||||
Title[2] = i18n("FS Type");
|
||||
Title[3] = i18n("Total Size");
|
||||
Title[4] = i18n("Free Size");
|
||||
|
||||
for (n=0; n<NUMCOLS; ++n) {
|
||||
lbox->addColumn(Title[n]);
|
||||
}
|
||||
|
||||
while ((fstab_ent=getfsent())!=NULL) {
|
||||
/* fstab_ent->fs_type holds only "rw","xx","ro"... */
|
||||
memset(&svfs, 0, sizeof(svfs));
|
||||
statvfs(fstab_ent->fs_file, &svfs);
|
||||
get_fs_usage(fstab_ent->fs_file, &total, &avail);
|
||||
|
||||
if (!strcmp(fstab_ent->fs_type, FSTAB_XX)) // valid drive ?
|
||||
svfs.f_basetype[0] = 0;
|
||||
|
||||
if (svfs.f_basetype[0]) {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")),
|
||||
Value((total+512)/1024,6) + MB,
|
||||
Value((avail+512)/1024,6) + MB);
|
||||
} else {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")));
|
||||
}
|
||||
|
||||
}
|
||||
endfsent();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QListView *lBox) {
|
||||
lBox = lBox;
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
||||
|
||||
#ifndef HAVE_ALIB_H
|
||||
|
||||
bool GetInfo_Sound(QListView * /*lBox*/) {
|
||||
return false;
|
||||
}
|
||||
|
||||
#else // defined(HAVE_ALIB_H)
|
||||
#include "Alib.h"
|
||||
|
||||
static const char formatNames[6][15] = {
|
||||
"ADFUnknown", "ADFMuLaw", "ADFALaw",
|
||||
"ADFLin16", "ADFLin8", "ADFLin8Offset"};
|
||||
|
||||
/* handle typo in 1st release of Alib.h */
|
||||
#ifndef ARightOutputChMask
|
||||
#define ARightOutputChMask ARighOutputChMask
|
||||
#endif
|
||||
|
||||
bool GetInfo_Sound( QListView *lBox )
|
||||
{
|
||||
Audio *audio;
|
||||
long status;
|
||||
char server[80];
|
||||
int i;
|
||||
|
||||
QString str,str2;
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
// server = Hostname....
|
||||
server[0] = 0;
|
||||
audio = AOpenAudio( server, &status );
|
||||
if( status ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
lBox->addColumn(i18n("Information") );
|
||||
lBox->addColumn(i18n("Value") );
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Audio Name"), QString(audio->audio_name));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Vendor"), QString(audio->vendor));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Alib Version"),
|
||||
Value(audio->alib_major_version) + QString(".") +
|
||||
Value(audio->alib_minor_version));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Protocol Revision"),
|
||||
Value(audio->proto_major_version) + QString(".") +
|
||||
Value(audio->proto_minor_version));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Vendor Number"),
|
||||
Value(audio->vnumber));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Release"),
|
||||
Value(audio->release));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Byte Order"),
|
||||
QString((audio->byte_order==ALSBFirst)? i18n("ALSBFirst (LSB)"):
|
||||
((audio->byte_order==AMSBFirst)? i18n("AMSBFirst (MSB)"):
|
||||
i18n("Invalid Byteorder.")) ));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Bit Order"),
|
||||
QString((audio->sound_bit_order==ALeastSignificant)?
|
||||
i18n("ALeastSignificant (LSB)") :
|
||||
((audio->sound_bit_order==AMostSignificant) ?
|
||||
i18n("AMostSignificant (MSB)"):i18n("Invalid Bitorder.")) ));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Data Formats"));
|
||||
for ( i = 0; i < audio->n_data_format; i++ ) {
|
||||
if (audio->data_format_list[i] <= ADFLin8Offset)
|
||||
new QListViewItem(olditem, QString(formatNames[audio->data_format_list[i]]));
|
||||
}
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Sampling Rates"));
|
||||
for ( i = 0; i < audio->n_sampling_rate; i++ ) {
|
||||
new QListViewItem(olditem, Value(audio->sampling_rate_list[i]));
|
||||
}
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Input Sources"));
|
||||
if ( audio->input_sources & AMonoMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Microphone"));
|
||||
if ( audio->input_sources & AMonoAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Auxiliary"));
|
||||
if ( audio->input_sources & ALeftMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Left-Microphone"));
|
||||
if ( audio->input_sources & ARightMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Right-Microphone"));
|
||||
if ( audio->input_sources & ALeftAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Left-Auxiliary"));
|
||||
if ( audio->input_sources & ARightAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Right-Auxiliary"));
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem,i18n("Input Channels"));
|
||||
if ( audio->input_channels & AMonoInputChMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Channel"));
|
||||
if ( audio->input_channels & ALeftInputChMask )
|
||||
new QListViewItem(olditem, i18n("Left-Channel"));
|
||||
if ( audio->input_channels & ARightInputChMask )
|
||||
new QListViewItem(olditem, i18n("Right-Channel"));
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Output Destinations"));
|
||||
if ( audio->output_destinations & AMonoIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Mono-InternalSpeaker"));
|
||||
if ( audio->output_destinations & AMonoJackMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Jack"));
|
||||
if ( audio->output_destinations & ALeftIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Left-InternalSpeaker"));
|
||||
if ( audio->output_destinations & ARightIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Right-InternalSpeaker"));
|
||||
if ( audio->output_destinations & ALeftJackMask )
|
||||
new QListViewItem(olditem, i18n("Left-Jack"));
|
||||
if ( audio->output_destinations & ARightJackMask )
|
||||
new QListViewItem(olditem, i18n("Right-Jack"));
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Output Channels"));
|
||||
if ( audio->output_channels & AMonoOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Channel"));
|
||||
if ( audio->output_channels & ALeftOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Left-Channel"));
|
||||
if ( audio->output_channels & ARightOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Right-Channel"));
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Gain"));
|
||||
new QListViewItem(olditem, i18n("Input Gain Limits"),
|
||||
Value(audio->max_input_gain));
|
||||
new QListViewItem(olditem,i18n("Output Gain Limits"),
|
||||
Value(audio->min_output_gain) + QString(" ")
|
||||
+ Value(audio->max_output_gain));
|
||||
new QListViewItem(olditem, i18n("Monitor Gain Limits"),
|
||||
Value(audio->min_monitor_gain) + QString(" ")
|
||||
+ Value(audio->max_monitor_gain));
|
||||
new QListViewItem(olditem, i18n("Gain Restricted"),
|
||||
Value(audio->gm_gain_restricted));
|
||||
olditem->setExpanded(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem,i18n("Lock"),
|
||||
Value(audio->lock));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Queue Length"),
|
||||
Value(audio->qlen));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Block Size"),
|
||||
Value(audio->block_size));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Stream Port (decimal)"),
|
||||
Value(audio->stream_port));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Ev Buffer Size"),
|
||||
Value(audio->ev_buf_size));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Ext Number"),
|
||||
Value(audio->ext_number));
|
||||
|
||||
ACloseAudio( audio, &status );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // defined(HAVE_ALIB_H)
|
531
kinfocenter/base/info_linux.cpp
Normal file
531
kinfocenter/base/info_linux.cpp
Normal file
|
@ -0,0 +1,531 @@
|
|||
/*
|
||||
|
||||
Linux-specific Information about the Hardware.
|
||||
|
||||
(C) Copyright 1998-2001 by Helge Deller <deller@gmx.de>
|
||||
|
||||
To do (maybe?):
|
||||
- include Information about XFree86 and/or Accelerated X
|
||||
(needs to change configure-script, to see, if Header-files are available !)
|
||||
- maybe also include information about the video-framebuffer devices
|
||||
- rewrite detection-routines (maybe not to use the /proc-fs)
|
||||
- more & better sound-information
|
||||
|
||||
/dev/sndstat support added: 1998-12-08 Duncan Haldane (f.d.m.haldane@cwix.com)
|
||||
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <syscall.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <ctype.h>
|
||||
#include "config-infocenter.h"
|
||||
|
||||
#ifdef HAVE_FSTAB_H /* some Linux-versions don't have fstab.h */
|
||||
# include <fstab.h>
|
||||
# include <sys/statfs.h>
|
||||
# define INFO_PARTITIONS_FULL_INFO /* show complete info */
|
||||
#elif defined HAVE_MNTENT_H /* but maybe they have mntent.h ? */
|
||||
# include <mntent.h>
|
||||
# include <sys/vfs.h>
|
||||
# define INFO_PARTITIONS_FULL_INFO /* show complete info */
|
||||
#else
|
||||
# undef INFO_PARTITIONS_FULL_INFO /* no partitions-info */
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PCIUTILS
|
||||
#include "pci.h"
|
||||
#endif //HAVE_PCIUTILS
|
||||
#include <QRegExp>
|
||||
#include <QFile>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kiconloader.h>
|
||||
#include <kglobalsettings.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#define INFO_CPU "/proc/cpuinfo"
|
||||
|
||||
#define INFO_IRQ "/proc/interrupts"
|
||||
#define INFO_DMA "/proc/dma"
|
||||
|
||||
#define INFO_PCI "/proc/pci"
|
||||
|
||||
#define INFO_IOPORTS "/proc/ioports"
|
||||
|
||||
#define INFO_DEV_SNDSTAT "/dev/sndstat"
|
||||
#define INFO_SOUND "/proc/sound"
|
||||
#define INFO_ASOUND "/proc/asound/oss/sndstat"
|
||||
#define INFO_ASOUND09 "/proc/asound/sndstat"
|
||||
|
||||
#define INFO_DEVICES "/proc/devices"
|
||||
#define INFO_MISC "/proc/misc"
|
||||
|
||||
#define INFO_SCSI "/proc/scsi/scsi"
|
||||
|
||||
#define INFO_PARTITIONS "/proc/partitions"
|
||||
#define INFO_MOUNTED_PARTITIONS "/etc/mtab" /* on Linux... */
|
||||
|
||||
#define MAXCOLUMNWIDTH 600
|
||||
|
||||
bool GetInfo_ReadfromFile(QTreeWidget* tree, const char *FileName, const QChar& splitChar) {
|
||||
bool added = false;
|
||||
QFile file(FileName);
|
||||
|
||||
if (!file.exists()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
return false;
|
||||
}
|
||||
QTextStream stream(&file);
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
QString s1, s2;
|
||||
if (!line.isEmpty()) {
|
||||
if (!splitChar.isNull()) {
|
||||
int pos = line.indexOf(splitChar);
|
||||
s1 = line.left(pos-1).trimmed();
|
||||
s2 = line.mid(pos+1).trimmed();
|
||||
} else
|
||||
s1 = line;
|
||||
}
|
||||
QStringList list;
|
||||
list << s1 << s2;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
added = true;
|
||||
line = stream.readLine();
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
return added;
|
||||
}
|
||||
|
||||
bool GetInfo_CPU(QTreeWidget* tree) {
|
||||
QStringList headers;
|
||||
headers << i18n("Information") << i18n("Value");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
return GetInfo_ReadfromFile(tree, INFO_CPU, ':');
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QTreeWidget* tree) {
|
||||
tree->setFont(KGlobalSettings::fixedFont());
|
||||
return GetInfo_ReadfromFile(tree, INFO_IRQ, 0);
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QTreeWidget* tree) {
|
||||
QFile file(INFO_DMA);
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("DMA-Channel") << i18n("Used By");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
if (file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
QString line;
|
||||
|
||||
line = stream.readLine();
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
QRegExp rx("^\\s*(\\S+)\\s*:\\s*(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
QStringList list;
|
||||
list << rx.cap(1) << rx.cap(2);
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
int num;
|
||||
|
||||
#ifdef HAVE_PCIUTILS
|
||||
if ( (num = GetInfo_PCIUtils(tree))) {
|
||||
return num;
|
||||
}
|
||||
|
||||
#endif //HAVE_PCIUTILS
|
||||
tree->header()->setVisible(false);
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
/* try to get the output of the lspci package first */
|
||||
if ((num = GetInfo_ReadfromPipe(tree, "lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/usr/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree, "/usr/local/sbin/lspci -v", true)) || (num = GetInfo_ReadfromPipe(tree,
|
||||
"/usr/bin/lspci -v", true)))
|
||||
return num;
|
||||
|
||||
/* if lspci failed, read the contents of /proc/pci */
|
||||
return GetInfo_ReadfromFile(tree, INFO_PCI, 0);
|
||||
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QTreeWidget* tree) {
|
||||
QStringList headers;
|
||||
headers << i18n("I/O-Range") << i18n("Used By");
|
||||
tree->setHeaderLabels(headers);
|
||||
return GetInfo_ReadfromFile(tree, INFO_IOPORTS, ':');
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QTreeWidget* tree) {
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
if (GetInfo_ReadfromFile(tree, INFO_DEV_SNDSTAT, 0))
|
||||
return true;
|
||||
else if (GetInfo_ReadfromFile(tree, INFO_SOUND, 0))
|
||||
return true;
|
||||
else if (GetInfo_ReadfromFile(tree, INFO_ASOUND, 0))
|
||||
return true;
|
||||
else
|
||||
return GetInfo_ReadfromFile(tree, INFO_ASOUND09, 0);
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QTreeWidget* tree) {
|
||||
kDebug() << "Linux Info Devices" << endl;
|
||||
QFile file;
|
||||
QTreeWidgetItem *misc=NULL;
|
||||
|
||||
tree->setRootIsDecorated(true);
|
||||
QStringList headers;
|
||||
headers << i18n("Devices") << i18n("Major Number") << i18n("Minor Number");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
file.setFileName(INFO_DEVICES);
|
||||
if (file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
QTreeWidgetItem *parent=0L, *child=0L;
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
if (-1 != line.indexOf("character device", 0, Qt::CaseInsensitive)) {
|
||||
QStringList list;
|
||||
list << i18n("Character Devices");
|
||||
parent = new QTreeWidgetItem(tree, list);
|
||||
parent->setIcon(0, SmallIcon("chardevice"));
|
||||
parent->setExpanded(true);
|
||||
|
||||
} else if (-1 != line.indexOf("block device", 0, Qt::CaseInsensitive)) {
|
||||
QStringList list;
|
||||
list << i18n("Block Devices");
|
||||
parent = new QTreeWidgetItem(tree, list);
|
||||
parent->setIcon(0, SmallIcon("blockdevice"));
|
||||
parent->setExpanded(true);
|
||||
|
||||
} else {
|
||||
QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
if (parent) {
|
||||
QStringList list;
|
||||
list << rx.cap(2) << rx.cap(1);
|
||||
child = new QTreeWidgetItem(parent, list);
|
||||
} else {
|
||||
QStringList list;
|
||||
list << rx.cap(2) << rx.cap(1);
|
||||
child = new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
if (rx.cap(2)=="misc") {
|
||||
misc=child;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
file.setFileName(INFO_MISC);
|
||||
if (misc && file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
|
||||
misc->setText(0, i18n("Miscellaneous Devices"));
|
||||
misc->setIcon(0, SmallIcon("memory"));
|
||||
misc->setExpanded(true);
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
QStringList list;
|
||||
list << rx.cap(2) << "10" << rx.cap(1);
|
||||
new QTreeWidgetItem(misc, list);
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QTreeWidget* tree) {
|
||||
return GetInfo_ReadfromFile(tree, INFO_SCSI, 0);
|
||||
}
|
||||
|
||||
static void cleanPassword(QString & str) {
|
||||
int index = 0;
|
||||
QString passwd("password=");
|
||||
|
||||
while (index >= 0) {
|
||||
index = str.indexOf(passwd, index, Qt::CaseInsensitive);
|
||||
if (index >= 0) {
|
||||
index += passwd.length();
|
||||
while (index < (int) str.length() && str[index] != ' ' && str[index] != ',')
|
||||
str[index++] = '*';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef INFO_PARTITIONS_FULL_INFO
|
||||
|
||||
bool GetInfo_Partitions(QTreeWidget* tree)
|
||||
{
|
||||
return GetInfo_ReadfromFile(tree, INFO_PARTITIONS, 0);
|
||||
}
|
||||
|
||||
#else /* INFO_PARTITIONS_FULL_INFO */
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
|
||||
#if ( defined(HAVE_LINUX_RAW_H) || defined(HAVE_SYS_RAW_H) ) && defined(HAVE_SYS_IOCTL_H) && defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#if defined(HAVE_SYS_RAW_H)
|
||||
#include <sys/raw.h>
|
||||
#elif defined(HAVE_LINUX_RAW_H)
|
||||
#include <linux/raw.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* get raw device bindings and information
|
||||
*/
|
||||
void Get_LinuxRawDevices(QTreeWidget* tree)
|
||||
{
|
||||
int f, i, err;
|
||||
int new_raw_devs = 1;
|
||||
struct raw_config_request rq;
|
||||
QString devname;
|
||||
QString MB(i18n("MB")); /* "MB" = "Mega-Byte" */
|
||||
|
||||
/* try to open the raw device control file */
|
||||
f = open("/dev/rawctl", O_RDWR);
|
||||
if (f == -1) {
|
||||
f = open("/dev/raw", O_RDWR);
|
||||
new_raw_devs = 0;
|
||||
}
|
||||
if (f == -1)
|
||||
return;
|
||||
|
||||
for (i=1; i<256; i++) {
|
||||
rq.raw_minor = i;
|
||||
if (ioctl(f, RAW_GETBIND, &rq))
|
||||
continue;
|
||||
if (!rq.block_major) /* unbound ? */
|
||||
continue;
|
||||
unsigned int minor = rq.block_minor;
|
||||
char first_letter;
|
||||
switch ((int)rq.block_major) {
|
||||
|
||||
/* IDE drives */
|
||||
case 3: first_letter = 'a';
|
||||
set_ide_name:
|
||||
devname = QString("/dev/hd%1%2")
|
||||
.arg(QChar(first_letter + minor/64))
|
||||
.arg(minor&63);
|
||||
break;
|
||||
case 22:first_letter = 'c'; goto set_ide_name;
|
||||
case 33:first_letter = 'e'; goto set_ide_name;
|
||||
case 34:first_letter = 'g'; goto set_ide_name;
|
||||
case 56:first_letter = 'i'; goto set_ide_name;
|
||||
case 57:first_letter = 'k'; goto set_ide_name;
|
||||
case 88:first_letter = 'm'; goto set_ide_name;
|
||||
case 89:first_letter = 'o'; goto set_ide_name;
|
||||
case 90:first_letter = 'q'; goto set_ide_name;
|
||||
case 91:first_letter = 's'; goto set_ide_name;
|
||||
|
||||
/* SCSI drives */
|
||||
case 8: first_letter = 'a';
|
||||
set_scsi_name:
|
||||
devname = QString("/dev/sd%1%2")
|
||||
.arg(QChar(first_letter + minor/16))
|
||||
.arg(minor&15);
|
||||
break;
|
||||
case 65:first_letter = 'q'; goto set_scsi_name;
|
||||
|
||||
/* Compaq /dev/cciss devices */
|
||||
case 104: case 105: case 106:
|
||||
case 107: case 108: case 109:
|
||||
devname = QString("/dev/cciss/c%1d%2")
|
||||
.arg((int)rq.block_major-104)
|
||||
.arg(minor&15);
|
||||
break;
|
||||
|
||||
/* Compaq Intelligent Drive Array (ida) */
|
||||
case 72: case 73: case 74: case 75:
|
||||
case 76: case 77: case 78: case 79:
|
||||
devname = QString("/dev/ida/c%1d%2")
|
||||
.arg((int)rq.block_major-72)
|
||||
.arg(minor&15);
|
||||
break;
|
||||
|
||||
default: devname = QString("%1/%2")
|
||||
.arg((int)rq.block_major)
|
||||
.arg(minor);
|
||||
|
||||
}
|
||||
|
||||
/* TODO: get device size */
|
||||
QString size = "";
|
||||
|
||||
QStringList list;
|
||||
list << devname;
|
||||
if (new_raw_devs)
|
||||
list << QString("/dev/raw/raw%1").arg(i);
|
||||
else
|
||||
list << QString("/dev/raw%1").arg(i);
|
||||
|
||||
list << "raw" << size << " " << "";
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
close(f);
|
||||
}
|
||||
#else
|
||||
#define Get_LinuxRawDevices(x) /* nothing */
|
||||
#endif
|
||||
|
||||
bool GetInfo_Partitions(QTreeWidget* tree) {
|
||||
QStringList Mounted_Partitions;
|
||||
bool found_in_List;
|
||||
int n;
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
struct fstab *fstab_ent;
|
||||
# define FS_NAME fstab_ent->fs_spec // device-name
|
||||
# define FS_FILE fstab_ent->fs_file // mount-point
|
||||
# define FS_TYPE fstab_ent->fs_vfstype // fs-type
|
||||
# define FS_MNTOPS fstab_ent->fs_mntops // mount-options
|
||||
#else
|
||||
struct mntent *mnt_ent;
|
||||
FILE *fp;
|
||||
# define FS_NAME mnt_ent->mnt_fsname // device-name
|
||||
# define FS_FILE mnt_ent->mnt_dir // mount-point
|
||||
# define FS_TYPE mnt_ent->mnt_type // fs-type
|
||||
# define FS_MNTOPS mnt_ent->mnt_opts // mount-options
|
||||
#endif
|
||||
|
||||
struct statfs sfs;
|
||||
quint64 total, avail;
|
||||
QString str, mountopts;
|
||||
QString MB(i18n("MB")); /* "MB" = "Mega-Byte" */
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
if (setfsent() == 0) /* Try to open fstab */
|
||||
return false;
|
||||
#else
|
||||
if (!(fp = setmntent("/etc/fstab", "r")))
|
||||
return false;
|
||||
#endif
|
||||
|
||||
/* read the list of already mounted file-systems.. */
|
||||
QFile *file = new QFile(INFO_MOUNTED_PARTITIONS);
|
||||
if (file->open(QIODevice::ReadOnly)) {
|
||||
char buf[1024];
|
||||
while (file->readLine(buf, sizeof(buf )) > 0) {
|
||||
str = QString::fromLocal8Bit(buf);
|
||||
if (str.length()) {
|
||||
int p = str.indexOf(' '); /* find first space. */
|
||||
if (p)
|
||||
str.remove(p, 1024); /* erase all chars including space. */
|
||||
Mounted_Partitions.append(str);
|
||||
}
|
||||
}
|
||||
file->close();
|
||||
}
|
||||
delete file;
|
||||
|
||||
/* create the header-tables */
|
||||
MB = QString(" ") + MB;
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Mount Point") << i18n("FS Type") << i18n("Total Size") << i18n("Free Size") << i18n("Mount Options");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
for (n = 0; n < 6; ++n)
|
||||
|
||||
/* loop through all partitions... */
|
||||
#ifdef HAVE_FSTAB_H
|
||||
while ((fstab_ent = getfsent()) != NULL)
|
||||
#else
|
||||
while ((mnt_ent = getmntent(fp)) != NULL)
|
||||
#endif
|
||||
{
|
||||
total = avail = 0; /* initialize size.. */
|
||||
found_in_List = (Mounted_Partitions.contains(FS_NAME) > 0);
|
||||
if (found_in_List && statfs(FS_FILE, &sfs) == 0) {
|
||||
total = ((quint64) sfs.f_blocks) * sfs.f_bsize;
|
||||
avail = (getuid() ? sfs.f_bavail : sfs.f_bfree) * ((quint64) sfs.f_bsize);
|
||||
};
|
||||
/*
|
||||
if (stat(fstab_ent->fs_file,&st)!=0)
|
||||
total = 0;
|
||||
if (!S_ISDIR(st.st_mode))
|
||||
total = 0;
|
||||
*/
|
||||
mountopts = FS_MNTOPS;
|
||||
cleanPassword(mountopts);
|
||||
if (total) {
|
||||
QStringList list;
|
||||
list << QString(FS_NAME) + " " << QString(FS_FILE) + " " << QString(FS_TYPE) + " " << Value((int) (((total / 1024) + 512) / 1024), 6) + MB << Value((int) (((avail / 1024) + 512) / 1024), 6) + MB << mountopts;
|
||||
|
||||
new QTreeWidgetItem(tree, list);
|
||||
} else {
|
||||
QStringList list;
|
||||
list << QString(FS_NAME) + " " << QString(FS_FILE) + " " << QString(FS_TYPE) + " " << " " << " " << mountopts;
|
||||
|
||||
new QTreeWidgetItem(tree, list);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
endfsent(); /* close fstab.. */
|
||||
#else
|
||||
endmntent(fp); /* close fstab.. */
|
||||
#endif
|
||||
|
||||
/* get raw device entires if available... */
|
||||
Get_LinuxRawDevices(tree);
|
||||
|
||||
tree->sortItems(1, Qt::AscendingOrder);
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif /* INFO_PARTITIONS_FULL_INFO */
|
||||
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
|
@ -11,21 +11,9 @@
|
|||
* The code is placed into public domain. Do whatever you want with it.
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
/*
|
||||
* all following functions should return true, when the Information
|
||||
* was filled into the lBox-Widget. Returning false indicates that
|
||||
* was filled into the Tree Widget. Returning false indicates that
|
||||
* information was not available.
|
||||
*/
|
||||
|
||||
|
@ -39,29 +27,21 @@
|
|||
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <Q3StrList>
|
||||
#include <QStringList>
|
||||
#include <QTextStream>
|
||||
#include <QTreeWidgetItemIterator>
|
||||
|
||||
#include <kdebug.h>
|
||||
#include <kio/global.h> /* for KIO::convertSize() */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
int string;
|
||||
int name;
|
||||
const char *title;
|
||||
} hw_info_mib_list_t;
|
||||
|
||||
bool GetInfo_CPU(Q3ListView *lBox)
|
||||
{
|
||||
static hw_info_mib_list_t hw_info_mib_list[]= {
|
||||
{ 1, HW_MODEL, "Model" },
|
||||
{ 1, HW_MACHINE, "Machine" },
|
||||
{ 1, HW_MACHINE_ARCH, "Architecture" },
|
||||
{ 0, HW_NCPU, "Number of CPUs" },
|
||||
{ 0, HW_PAGESIZE, "Pagesize" },
|
||||
{ 0,0,0 }
|
||||
};
|
||||
bool GetInfo_CPU(QTreeWidget* tree) {
|
||||
static hw_info_mib_list_t hw_info_mib_list[]= { { 1, HW_MODEL, "Model" }, { 1, HW_MACHINE, "Machine" }, { 1, HW_MACHINE_ARCH, "Architecture" }, { 0, HW_NCPU, "Number of CPUs" }, { 0, HW_PAGESIZE, "Pagesize" }, { 0, 0, 0 } };
|
||||
hw_info_mib_list_t *hw_info_mib;
|
||||
|
||||
int mib[2], num;
|
||||
|
@ -69,11 +49,11 @@ bool GetInfo_CPU(Q3ListView *lBox)
|
|||
size_t len;
|
||||
QString value;
|
||||
|
||||
lBox->addColumn(i18n("Information"));
|
||||
lBox->addColumn(i18n("Value"));
|
||||
QStringList list;
|
||||
list << i18n("Information") << i18n("Value");
|
||||
tree->setHeaderLabels(list);
|
||||
|
||||
for ( hw_info_mib = hw_info_mib_list ; hw_info_mib->title ; ++hw_info_mib )
|
||||
{
|
||||
for (hw_info_mib = hw_info_mib_list; hw_info_mib->title; ++hw_info_mib) {
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = hw_info_mib->name;
|
||||
if (hw_info_mib->string) {
|
||||
|
@ -82,17 +62,19 @@ bool GetInfo_CPU(Q3ListView *lBox)
|
|||
sysctl(mib, 2, buf, &len, NULL, 0);
|
||||
value = QString::fromLocal8Bit(buf);
|
||||
free(buf);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
value = QString("Unknown");
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
len = sizeof(num);
|
||||
sysctl(mib, 2, &num, &len, NULL, 0);
|
||||
value = QString::number(num);
|
||||
}
|
||||
new Q3ListViewItem(lBox, hw_info_mib->title, value);
|
||||
|
||||
QStringList list;
|
||||
list << hw_info_mib->title << value;
|
||||
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -100,9 +82,7 @@ bool GetInfo_CPU(Q3ListView *lBox)
|
|||
|
||||
// this is used to find out which devices are currently
|
||||
// on system
|
||||
static bool GetDmesgInfo(Q3ListView *lBox, const char *filter,
|
||||
void func(Q3ListView *, QString s))
|
||||
{
|
||||
static bool GetDmesgInfo(QTreeWidget* tree, const char *filter, void func(QTreeWidget* tree, QString s)) {
|
||||
QFile *dmesg = new QFile("/var/run/dmesg.boot");
|
||||
bool usepipe = false;
|
||||
FILE *pipe= NULL;
|
||||
|
@ -113,15 +93,15 @@ static bool GetDmesgInfo(Q3ListView *lBox, const char *filter,
|
|||
|
||||
if (dmesg->exists() && dmesg->open(QIODevice::ReadOnly)) {
|
||||
t = new QTextStream(dmesg);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
delete dmesg;
|
||||
pipe = popen("/sbin/dmesg", "r");
|
||||
if (!pipe) return false;
|
||||
if (!pipe)
|
||||
return false;
|
||||
usepipe = true;
|
||||
t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
}
|
||||
Q3ListViewItem *olditem = NULL;
|
||||
|
||||
while (!(s = t->readLine().toLocal8Bit()).isNull()) {
|
||||
if (!seencpu) {
|
||||
if (s.contains("cpu"))
|
||||
|
@ -129,15 +109,17 @@ static bool GetDmesgInfo(Q3ListView *lBox, const char *filter,
|
|||
else
|
||||
continue;
|
||||
}
|
||||
if (s.contains("boot device") ||
|
||||
s.contains("WARNING: old BSD partition ID!"))
|
||||
if (s.contains("boot device") || s.contains("WARNING: old BSD partition ID!"))
|
||||
break;
|
||||
|
||||
if (!filter || s.contains(QRegExp(filter))) {
|
||||
if (func)
|
||||
func(lBox, s);
|
||||
else
|
||||
olditem = new Q3ListViewItem(lBox, olditem, s);
|
||||
func(tree, s);
|
||||
else {
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
@ -153,10 +135,7 @@ static bool GetDmesgInfo(Q3ListView *lBox, const char *filter,
|
|||
return found;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
AddIRQLine(Q3ListView *lBox, QString s)
|
||||
{
|
||||
void AddIRQLine(QTreeWidget* tree, QString s) {
|
||||
int irqnum;
|
||||
QString s2;
|
||||
char numstr[3];
|
||||
|
@ -171,95 +150,111 @@ AddIRQLine(Q3ListView *lBox, QString s)
|
|||
strcpy(numstr, "??");
|
||||
}
|
||||
|
||||
new Q3ListViewItem(lBox, numstr, s);
|
||||
QStringList list;
|
||||
list << numstr << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ (Q3ListView *lBox)
|
||||
{
|
||||
lBox->addColumn(i18n("IRQ"));
|
||||
lBox->addColumn(i18n("Device"));
|
||||
lBox->setSorting(0);
|
||||
lBox->setShowSortIndicator(false);
|
||||
(void) GetDmesgInfo(lBox, "[ (]irq ", AddIRQLine);
|
||||
bool GetInfo_IRQ(QTreeWidget* tree) {
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("IRQ") << i18n("Device");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
tree->sortItems(0, Qt::AscendingOrder);
|
||||
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
(void) GetDmesgInfo(tree, "[ (]irq ", AddIRQLine);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA (Q3ListView *)
|
||||
{
|
||||
bool GetInfo_DMA(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "at pci", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No PCI devices found."));
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "at pci", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No PCI devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "port 0x", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No I/O port devices found."));
|
||||
bool GetInfo_IO_Ports(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "port 0x", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No I/O port devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound (Q3ListView *lbox)
|
||||
{
|
||||
lbox->setSorting(false);
|
||||
bool GetInfo_Sound(QTreeWidget* tree) {
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
if (!GetDmesgInfo(lbox, "audio", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No audio devices found."));
|
||||
if (!GetDmesgInfo(tree, "audio", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No audio devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
// append information for each audio devices found
|
||||
Q3ListViewItem *lvitem = lbox->firstChild();
|
||||
for(; lvitem; lvitem = lvitem->nextSibling()) {
|
||||
|
||||
QTreeWidgetItemIterator it(tree, QTreeWidgetItemIterator::All);
|
||||
while ( *it != NULL) {
|
||||
QString s, s2;
|
||||
int pos;
|
||||
char *dev;
|
||||
|
||||
s = lvitem->text(0);
|
||||
s = (*it)->text(0);
|
||||
// The autoconf message is in form 'audio0 at auvia0: ...'
|
||||
if (s.find("audio") == 0 && (pos = s.find(" at ")) > 0) {
|
||||
s2 = s.mid(pos+4); // skip " at "
|
||||
s2.remove(QRegExp("[:\n\t ].*"));
|
||||
dev = strdup(s2.toAscii().data());
|
||||
|
||||
GetDmesgInfo(lbox, dev, NULL);
|
||||
GetDmesgInfo(tree, dev, NULL);
|
||||
|
||||
free(dev);
|
||||
}
|
||||
|
||||
++it;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices (Q3ListView *lBox)
|
||||
{
|
||||
(void) GetDmesgInfo(lBox, NULL, NULL);
|
||||
bool GetInfo_Devices(QTreeWidget* tree) {
|
||||
(void) GetDmesgInfo(tree, NULL, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "scsibus", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No SCSI devices found."));
|
||||
bool GetInfo_SCSI(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "scsibus", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No SCSI devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
// remove the 'waiting %d seconds for devices to settle' message
|
||||
Q3ListViewItem *lvitem = lbox->firstChild();
|
||||
for(; lvitem; lvitem = lvitem->nextSibling()) {
|
||||
QString s = lvitem->text(0);
|
||||
QTreeWidgetItemIterator it(tree, QTreeWidgetItemIterator::All);
|
||||
while ( *it != NULL) {
|
||||
QString s = (*it)->text(0);
|
||||
|
||||
if (s.contains("seconds for devices to settle")) {
|
||||
lbox->removeItem(lvitem);
|
||||
delete tree->takeItem( tree->indexOfTopLevelItem(*it) );
|
||||
break;
|
||||
}
|
||||
|
||||
++it;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions (Q3ListView *lbox)
|
||||
{
|
||||
bool GetInfo_Partitions(QTreeWidget* tree) {
|
||||
int num; // number of mounts
|
||||
#ifdef HAVE_STATVFS
|
||||
struct statvfs *mnt; // mount data pointer
|
||||
|
@ -274,14 +269,9 @@ bool GetInfo_Partitions (Q3ListView *lbox)
|
|||
}
|
||||
|
||||
// table headers
|
||||
lbox->addColumn(i18n("Device"));
|
||||
lbox->addColumn(i18n("Mount Point"));
|
||||
lbox->addColumn(i18n("FS Type"));
|
||||
lbox->addColumn(i18n("Total Size"));
|
||||
lbox->addColumn(i18n("Free Size"));
|
||||
lbox->addColumn(i18n("Total Nodes"));
|
||||
lbox->addColumn(i18n("Free Nodes"));
|
||||
lbox->addColumn(i18n("Flags"));
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Mount Point") << i18n("FS Type") << i18n("Total Size") << i18n("Free Size") << i18n("Total Nodes") << i18n("Free Nodes") << i18n("Flags");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
// mnt points into a static array (no need to free it)
|
||||
for (; num--; ++mnt) {
|
||||
|
@ -341,20 +331,18 @@ bool GetInfo_Partitions (Q3ListView *lbox)
|
|||
#undef MNTF
|
||||
|
||||
// put it in the table
|
||||
|
||||
QStringList list;
|
||||
// FIXME: there're more data but we have limited args (this is wrong! just add!)
|
||||
new Q3ListViewItem(lbox,
|
||||
// FIXME: names need pad space
|
||||
mnt->f_mntfromname,
|
||||
mnt->f_mntonname,
|
||||
mnt->f_fstypename,
|
||||
vv[0], vv[1], vv[2], vv[3], vv[4]);
|
||||
list << mnt->f_mntfromname << mnt->f_mntonname << mnt->f_fstypename << vv[0] << vv[1] << vv[2] << vv[3] << vv[4];
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
// job well done
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video (Q3ListView *lBox)
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
297
kinfocenter/base/info_openbsd.cpp
Normal file
297
kinfocenter/base/info_openbsd.cpp
Normal file
|
@ -0,0 +1,297 @@
|
|||
/*
|
||||
* info_netbsd.cpp is part of the KDE program kcminfo. This displays
|
||||
* various information about the OpenBSD system it's running on.
|
||||
*
|
||||
* Originally written by Jaromir Dolecek <dolecek@ics.muni.cz>. CPU info
|
||||
* code has been imported from implementation of processor.cpp for KDE 1.0
|
||||
* by David Brownlee <abs@NetBSD.org> as found in NetBSD packages collection.
|
||||
* Hubert Feyer <hubertf@NetBSD.org> enhanced the sound information printing
|
||||
* quite a lot, too.
|
||||
*
|
||||
* The code is placed into public domain. Do whatever you want with it.
|
||||
*/
|
||||
|
||||
/*
|
||||
* all following functions should return true, when the Information
|
||||
* was filled into the QTreeWidget. Returning false indicates that
|
||||
* information was not available.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <stdio.h> /* for NULL */
|
||||
#include <stdlib.h> /* for malloc(3) */
|
||||
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <QTextStream>
|
||||
#include <QTreeWidgetItemIterator>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
typedef struct {
|
||||
int string;
|
||||
int name;
|
||||
const char *title;
|
||||
} hw_info_mib_list_t;
|
||||
|
||||
bool GetInfo_CPU(QTreeWidget* tree) {
|
||||
static hw_info_mib_list_t hw_info_mib_list[]= { { 1, HW_MODEL, "Model" }, { 1, HW_MACHINE, "Machine" }, { 0, HW_NCPU, "Number of CPUs" }, { 0, HW_PAGESIZE, "Pagesize" }, { 0, 0, 0 } };
|
||||
hw_info_mib_list_t *hw_info_mib;
|
||||
|
||||
int mib[2], num;
|
||||
char *buf;
|
||||
size_t len;
|
||||
QString value;
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Information") << i18n("Value");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
for (hw_info_mib = hw_info_mib_list; hw_info_mib->title; ++hw_info_mib) {
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = hw_info_mib->name;
|
||||
if (hw_info_mib->string) {
|
||||
sysctl(mib, 2, NULL, &len, NULL, 0);
|
||||
if ( (buf = (char*)malloc(len))) {
|
||||
sysctl(mib, 2, buf, &len, NULL, 0);
|
||||
value = QString::fromLocal8Bit(buf);
|
||||
free(buf);
|
||||
} else {
|
||||
value = QString("Unknown");
|
||||
}
|
||||
} else {
|
||||
len = sizeof(num);
|
||||
sysctl(mib, 2, &num, &len, NULL, 0);
|
||||
value.sprintf("%d", num);
|
||||
}
|
||||
|
||||
QStringList list;
|
||||
list << hw_info_mib->title << value;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// this is used to find out which devices are currently
|
||||
// on system
|
||||
static bool GetDmesgInfo(QTreeWidget* tree, const char *filter, void func(QTreeWidget *, QString s, void **, bool)) {
|
||||
QFile *dmesg = new QFile("/var/run/dmesg.boot");
|
||||
bool usepipe=false;
|
||||
FILE *pipe=NULL;
|
||||
QTextStream *t;
|
||||
bool seencpu=false;
|
||||
void *opaque=NULL;
|
||||
QString s;
|
||||
bool found=false;
|
||||
|
||||
if (dmesg->exists() && dmesg->open(QIODevice::ReadOnly)) {
|
||||
t = new QTextStream(dmesg);
|
||||
} else {
|
||||
delete dmesg;
|
||||
pipe = popen("/sbin/dmesg", "r");
|
||||
if (!pipe)
|
||||
return false;
|
||||
usepipe = true;
|
||||
t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
}
|
||||
|
||||
while (!(s = t->readLine()).isNull()) {
|
||||
if (!seencpu) {
|
||||
if (s.contains("cpu"))
|
||||
seencpu = true;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if (s.contains("boot device") || s.contains("WARNING: old BSD partition ID!"))
|
||||
break;
|
||||
|
||||
if (!filter || s.contains(filter)) {
|
||||
if (func) {
|
||||
func(tree, s, &opaque, false);
|
||||
} else {
|
||||
QStringList list;
|
||||
list << s;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (func) {
|
||||
func(tree, s, &opaque, true);
|
||||
}
|
||||
//tree->triggerUpdate();
|
||||
|
||||
delete t;
|
||||
if (pipe) {
|
||||
pclose(pipe);
|
||||
} else {
|
||||
dmesg->close();
|
||||
delete dmesg;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
void AddIRQLine(QTreeWidget* tree, QString s, void **opaque, bool ending) {
|
||||
QStringList *strlist = (QStringList *) *opaque;
|
||||
QString str;
|
||||
int pos, irqnum=0;
|
||||
const char *p;
|
||||
p = s.toLatin1();
|
||||
|
||||
if (!strlist) {
|
||||
strlist = new QStringList();
|
||||
*opaque = (void *) strlist;
|
||||
}
|
||||
if (ending) {
|
||||
foreach(QString temp, *strlist) {
|
||||
QStringList tempList;
|
||||
tempList << temp;
|
||||
new QTreeWidgetItem(tree, tempList);
|
||||
}
|
||||
delete strlist;
|
||||
return;
|
||||
}
|
||||
|
||||
pos = s.find(" irq ");
|
||||
irqnum = (pos < 0) ? 0 : atoi(&p[pos+5]);
|
||||
if (irqnum) {
|
||||
s.sprintf("%02d%s", irqnum, p);
|
||||
} else {
|
||||
s.sprintf("??%s", p);
|
||||
}
|
||||
strlist->append(s);
|
||||
strlist->sort();
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QTreeWidget* tree) {
|
||||
QStringList headers;
|
||||
headers << i18n("IRQ") << i18n("Device");
|
||||
tree->setHeaderLabels(headers);
|
||||
(void) GetDmesgInfo(tree, " irq ", AddIRQLine);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QTreeWidget *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "at pci", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No PCI devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "port 0x", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No I/O port devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "audio", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No audio devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
// append information on any audio devices found
|
||||
QTreeWidgetItemIterator it(tree, QTreeWidgetItemIterator::All);
|
||||
while ( *it != NULL ) {
|
||||
QTreeWidgetItem* lvitem = *it;
|
||||
|
||||
QString s;
|
||||
int pos, len;
|
||||
const char *start, *end;
|
||||
char *dev;
|
||||
|
||||
s = lvitem->text(0);
|
||||
if ((pos = s.find("at ")) >= 0) {
|
||||
pos += 3; // skip "at "
|
||||
start = end = s.toAscii();
|
||||
for (; *end && (*end!=':') && (*end!='\n'); end++)
|
||||
;
|
||||
len = end - start;
|
||||
dev = (char *) malloc(len + 1);
|
||||
strncpy(dev, start, len);
|
||||
dev[len] = '\0';
|
||||
|
||||
GetDmesgInfo(tree, dev, NULL);
|
||||
|
||||
free(dev);
|
||||
}
|
||||
|
||||
++it;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QTreeWidget* tree) {
|
||||
(void) GetDmesgInfo(tree, NULL, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QTreeWidget* tree) {
|
||||
if (!GetDmesgInfo(tree, "scsibus", NULL)) {
|
||||
QStringList list;
|
||||
list << i18n("No SCSI devices found.");
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions(QTreeWidget* tree) {
|
||||
QString s;
|
||||
char *line, *orig_line;
|
||||
const char *device, *mountpoint, *type, *flags;
|
||||
FILE *pipe = popen("/sbin/mount", "r");
|
||||
QTextStream *t;
|
||||
|
||||
if (!pipe) {
|
||||
kError(0) << i18n("Unable to run /sbin/mount.") << endl;
|
||||
return false;
|
||||
}
|
||||
t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Mount Point") << i18n("FS Type") << i18n("Mount Options");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
while (!(s = t->readLine()).isNull()) {
|
||||
orig_line = line = strdup(s.toLatin1());
|
||||
|
||||
device = strsep(&line, " ");
|
||||
|
||||
(void) strsep(&line, " "); // consume word "on"
|
||||
mountpoint = strsep(&line, " ");
|
||||
|
||||
(void) strsep(&line, " "); // consume word "type"
|
||||
type = strsep(&line, " ");
|
||||
|
||||
flags = line;
|
||||
|
||||
QStringList mountList;
|
||||
mountList << device << mountpoint << type << flags;
|
||||
new QTreeWidgetItem(tree, mountList);
|
||||
|
||||
free(orig_line);
|
||||
}
|
||||
|
||||
delete t;
|
||||
pclose(pipe);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
|
@ -19,17 +19,6 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
//#define INFO_IRQ_AVAILABLE
|
||||
//#define INFO_DMA_AVAILABLE
|
||||
//#define INFO_PCI_AVAILABLE
|
||||
//#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
/*
|
||||
* all following functions should return true, when the Information
|
||||
* was filled into the lBox-Widget. Returning false indicates that
|
||||
|
@ -48,7 +37,6 @@
|
|||
#include <qdict.h>
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <Q3PtrList>
|
||||
|
||||
#include <QTextStream>
|
||||
|
||||
|
@ -63,8 +51,7 @@
|
|||
|
||||
#include <machine/limits.h>
|
||||
|
||||
bool GetInfo_CPU (QListView *lBox)
|
||||
{
|
||||
bool GetInfo_CPU(QListView *lBox) {
|
||||
|
||||
QString cpustring;
|
||||
|
||||
|
@ -72,8 +59,7 @@ bool GetInfo_CPU (QListView *lBox)
|
|||
struct host_basic_info basic_info;
|
||||
unsigned int count=HOST_BASIC_INFO_COUNT;
|
||||
|
||||
ret=host_info(mach_host_self(), HOST_BASIC_INFO,
|
||||
(host_info_t)&basic_info, &count);
|
||||
ret=host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&basic_info, &count);
|
||||
if (ret != KERN_SUCCESS) {
|
||||
kDebug() << "unable to get host information from mach";
|
||||
return false;
|
||||
|
@ -91,28 +77,23 @@ bool GetInfo_CPU (QListView *lBox)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ (QListView *)
|
||||
{
|
||||
bool GetInfo_IRQ(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA (QListView *)
|
||||
{
|
||||
bool GetInfo_DMA(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI (QListView *)
|
||||
{
|
||||
bool GetInfo_PCI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports (QListView *)
|
||||
{
|
||||
bool GetInfo_IO_Ports(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound (QListView *lBox)
|
||||
{
|
||||
bool GetInfo_Sound(QListView *lBox) {
|
||||
#ifdef HAVE_COREAUDIO
|
||||
#define qMaxStringSize 1024
|
||||
OSStatus status;
|
||||
|
@ -155,22 +136,18 @@ bool GetInfo_Sound (QListView *lBox)
|
|||
#endif
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI (QListView *lbox)
|
||||
{
|
||||
bool GetInfo_SCSI(QListView *lbox) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions (QListView *lbox)
|
||||
{
|
||||
bool GetInfo_Partitions(QListView *lbox) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video (QListView *lBox)
|
||||
{
|
||||
bool GetInfo_XServer_and_Video(QListView *lBox) {
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
||||
|
||||
bool GetInfo_Devices (QListView *lbox)
|
||||
{
|
||||
bool GetInfo_Devices(QListView *lbox) {
|
||||
return false;
|
||||
}
|
58
kinfocenter/base/info_sgi.cpp
Normal file
58
kinfocenter/base/info_sgi.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
/* info_sgi.cpp
|
||||
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
*/
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
#include <sys/systeminfo.h>
|
||||
|
||||
bool GetInfo_CPU(QListView *lBox) {
|
||||
QString str;
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_ARCHITECTURE, buf, sizeof(buf));
|
||||
str = QString::fromLocal8Bit(buf);
|
||||
new QListViewItem(lBox, str);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QListView *lBox) {
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
||||
|
718
kinfocenter/base/info_solaris.cpp
Normal file
718
kinfocenter/base/info_solaris.cpp
Normal file
|
@ -0,0 +1,718 @@
|
|||
/*
|
||||
* info_solaris.cpp
|
||||
*
|
||||
* Torsten Kasch <tk@Genetik.Uni-Bielefeld.DE>
|
||||
*/
|
||||
|
||||
#include "config-infocenter.h"
|
||||
|
||||
#include <QTreeWidgetItemIterator>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mnttab.h>
|
||||
#include <kstat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef HAVE_LIBDEVINFO_H
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mkdev.h>
|
||||
#include <sys/stat.h>
|
||||
#include <devid.h>
|
||||
#include <libdevinfo.h>
|
||||
#endif /* HAVE_LIBDEVINFO_H */
|
||||
|
||||
bool GetInfo_CPU(QTreeWidget* tree) {
|
||||
|
||||
kstat_ctl_t *kctl;
|
||||
kstat_t *ksp;
|
||||
kstat_named_t *kdata;
|
||||
char cputype[16], fputype[16];
|
||||
char *timetxt;
|
||||
char *ptr;
|
||||
uint32_t i, ncpus;
|
||||
unsigned long state_begin;
|
||||
QString state;
|
||||
QString mhz;
|
||||
QString inst;
|
||||
|
||||
/*
|
||||
* get a kstat handle first and update the user's kstat chain
|
||||
*/
|
||||
if ( (kctl = kstat_open()) == NULL) {
|
||||
return false;
|
||||
}
|
||||
while (kstat_chain_update(kctl) != 0)
|
||||
;
|
||||
|
||||
/*
|
||||
* get the # of CPUs
|
||||
*/
|
||||
if ( (ksp = kstat_lookup(kctl, "unix", 0, "system_misc")) == NULL) {
|
||||
return false;
|
||||
}
|
||||
if (kstat_read(kctl, ksp, NULL) == -1) {
|
||||
return false;
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "ncpus");
|
||||
if (kdata != NULL) {
|
||||
ncpus = kdata->value.ui32;
|
||||
} else {
|
||||
ncpus = 0;
|
||||
}
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Instance") << i18n("CPU Type") << i18n("FPU Type") << i18n("MHz") << i18n("State");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
/*
|
||||
* get the per-processor info
|
||||
*/
|
||||
for (i = 0; i < ncpus; i++) {
|
||||
|
||||
if ( (ksp = kstat_lookup(kctl, "cpu_info", i, NULL)) == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (kstat_read(kctl, ksp, NULL) == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
inst.setNum(i);
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "cpu_type");
|
||||
if (kdata != NULL) {
|
||||
strcpy(cputype, kdata->value.c);
|
||||
} else {
|
||||
sprintf(cputype, "???");
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "fpu_type");
|
||||
if (kdata != NULL) {
|
||||
strcpy(fputype, kdata->value.c);
|
||||
} else {
|
||||
sprintf(fputype, "???");
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "clock_MHz");
|
||||
if (kdata != NULL) {
|
||||
mhz.setNum(kdata->value.ul);
|
||||
} else {
|
||||
mhz.setNum( 0);
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "state");
|
||||
if (kdata != NULL) {
|
||||
state = QString(kdata->value.c);
|
||||
} else {
|
||||
state = "???";
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup(ksp, "state_begin");
|
||||
if (kdata != NULL) {
|
||||
state_begin = kdata->value.i32;
|
||||
if ( (timetxt = ctime( (time_t *) &state_begin )) != NULL) {
|
||||
ptr = strrchr(timetxt, '\n');
|
||||
*ptr = '\0';
|
||||
state += " since " + QString(timetxt);
|
||||
}
|
||||
}
|
||||
|
||||
QStringList list;
|
||||
list << inst << cputype << fputype << mhz << state;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
tree->sortItems(0, Qt::AscendingOrder);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions(QTreeWidget* tree) {
|
||||
|
||||
FILE *mnttab;
|
||||
struct mnttab mnt;
|
||||
struct statvfs statbuf;
|
||||
fsblkcnt_t tmp;
|
||||
QString total;
|
||||
QString avail;
|
||||
time_t mnttime;
|
||||
char *timetxt;
|
||||
char *ptr;
|
||||
|
||||
if ( (mnttab = fopen(MNTTAB, "r")) == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* set up column headers
|
||||
*/
|
||||
QStringList headers;
|
||||
headers << i18n("Device") << i18n("Mount Point") << i18n("FS Type") << i18n("Total Size") << i18n("Free Size") << i18n("Mount Time") << i18n("Mount Options");
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
// XXX: FIXME: how do I set column alignment correctly?
|
||||
//tree->setColumnAlignment( 3, 2 );
|
||||
// XXX: FIXME: how do I set column alignment correctly?
|
||||
//tree->setColumnAlignment( 4, 2 );
|
||||
|
||||
/*
|
||||
* get info about mounted file systems
|
||||
*/
|
||||
rewind(mnttab);
|
||||
while (getmntent(mnttab, &mnt) == 0) {
|
||||
/*
|
||||
* skip fstype "nfs" and "autofs" for two reasons:
|
||||
* o if the mountpoint is visible, the fs is not
|
||||
* necessarily available (autofs option "-nobrowse")
|
||||
* and we don't want to mount every remote fs just
|
||||
* to get its size, do we?
|
||||
* o the name "Partitions" for this statistics implies
|
||||
* "local file systems only"
|
||||
*/
|
||||
if ( (strcmp(mnt.mnt_fstype, "nfs") == 0) || (strcmp(mnt.mnt_fstype, "autofs") == 0))
|
||||
continue;
|
||||
if (statvfs(mnt.mnt_mountp, &statbuf) == 0) {
|
||||
if (statbuf.f_blocks > 0) {
|
||||
/*
|
||||
* produce output in KB, MB, or GB for
|
||||
* readability -- unfortunately, this
|
||||
* breaks sorting for these columns...
|
||||
*/
|
||||
tmp = statbuf.f_blocks * (statbuf.f_frsize / 1024);
|
||||
if (tmp > 9999) {
|
||||
tmp /= 1024;
|
||||
if (tmp > 9999) {
|
||||
tmp /= 1024;
|
||||
total.setNum(tmp);
|
||||
total += " G";
|
||||
} else {
|
||||
total.setNum(tmp);
|
||||
total += " M";
|
||||
}
|
||||
} else {
|
||||
total.setNum(tmp);
|
||||
total += " K";
|
||||
}
|
||||
// avail.setNum( statbuf.f_bavail );
|
||||
// avail += " K";
|
||||
tmp = statbuf.f_bavail * (statbuf.f_frsize / 1024);
|
||||
if (tmp > 9999) {
|
||||
tmp /= 1024;
|
||||
if (tmp > 9999) {
|
||||
tmp /= 1024;
|
||||
avail.setNum(tmp);
|
||||
avail += " G";
|
||||
} else {
|
||||
avail.setNum(tmp);
|
||||
avail += " M";
|
||||
}
|
||||
} else {
|
||||
avail.setNum(tmp);
|
||||
avail += " K";
|
||||
}
|
||||
} else {
|
||||
total = "-";
|
||||
avail = "-";
|
||||
}
|
||||
} else {
|
||||
total = "???";
|
||||
avail = "???";
|
||||
}
|
||||
/*
|
||||
* ctime() adds a '\n' which we have to remove
|
||||
* so that we get a one-line output for the QTreeWidgetItem
|
||||
*/
|
||||
mnttime = (time_t) atol(mnt.mnt_time);
|
||||
if ( (timetxt = ctime( &mnttime)) != NULL) {
|
||||
ptr = strrchr(timetxt, '\n');
|
||||
*ptr = '\0';
|
||||
}
|
||||
|
||||
QStringList list;
|
||||
list << mnt.mnt_special << mnt.mnt_mountp << mnt.mnt_fstype << total << avail << QString(timetxt) << mnt.mnt_mntopts;
|
||||
new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
fclose(mnttab);
|
||||
|
||||
tree->sortItems(0, Qt::AscendingOrder);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree) {
|
||||
return GetInfo_XServer_Generic(tree);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEVINFO_H
|
||||
/*
|
||||
* get Solaris' device configuration data through libdevinfo(3)
|
||||
* and display it in a prtconf(1M) style tree
|
||||
*
|
||||
* NOTE: though the devinfo library seems to be present on earlier
|
||||
* Solaris releases, this interface is documented to be available
|
||||
* since Solaris 7 (libdevinfo.h is missing on pre-Solaris 7 systems)
|
||||
*
|
||||
* documentation for libdevinfo(3) including code samples on which
|
||||
* this implementation is based on is available at
|
||||
* http://soldc.sun.com/developer/support/driver/wps/libdevinfo/
|
||||
*/
|
||||
|
||||
/*
|
||||
* we start with various helper routines for GetInfo_Devices()
|
||||
*/
|
||||
|
||||
/*
|
||||
* mktree() -- break up the device path and place its components
|
||||
* into the tree widget
|
||||
*/
|
||||
QTreeWidgetItem* mktree( QTreeWidgetItem* top, const char* path ) {
|
||||
|
||||
QTreeWidgetItem* parent;
|
||||
QTreeWidgetItem* previous;
|
||||
QTreeWidgetItem* result;
|
||||
char* str = strdup( path );
|
||||
char* token;
|
||||
|
||||
/*
|
||||
* start at "/"
|
||||
*/
|
||||
parent = top;
|
||||
result = top->child(0);
|
||||
previous = top->child(0);
|
||||
|
||||
token = strtok( str, "/" );
|
||||
while( token != NULL ) {
|
||||
/*
|
||||
* find insert pos:
|
||||
* try to match the node at the current level
|
||||
*
|
||||
* NOTE: this implementation assumes that there are
|
||||
* no two nodes with identical names at the
|
||||
* same level of the device tree
|
||||
*/
|
||||
QTreeWidgetItemIterator it(top, QTreeWidgetItemIterator::All);
|
||||
while ( *it != NULL ) {
|
||||
if( strcmp( token, (*it)->text( 0 ).toLatin1()) == 0 )
|
||||
break;
|
||||
|
||||
previous = *it;
|
||||
|
||||
++it;
|
||||
result = *it;
|
||||
}
|
||||
if( result == NULL ) {
|
||||
QStringList list;
|
||||
list << token;
|
||||
|
||||
/*
|
||||
* we haven't found the node, create a new one
|
||||
*/
|
||||
result = new QTreeWidgetItem(parent, previous, list);
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* we've found the node
|
||||
*/
|
||||
parent = result;
|
||||
previous = NULL;
|
||||
if( result->child(0) == NULL ) {
|
||||
/*
|
||||
* create new node during next iteration
|
||||
*/
|
||||
result->setExpanded(false);
|
||||
} else {
|
||||
/*
|
||||
* follow the child path
|
||||
*/
|
||||
result = result->child(0);
|
||||
}
|
||||
}
|
||||
token = strtok( NULL, "/" );
|
||||
}
|
||||
|
||||
free( str );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* prop_type_str() -- return the property type as a string
|
||||
*/
|
||||
char *prop_type_str( di_prop_t prop ) {
|
||||
|
||||
switch( di_prop_type( prop )) {
|
||||
case DI_PROP_TYPE_UNDEF_IT:
|
||||
return( "undefined" );
|
||||
case DI_PROP_TYPE_BOOLEAN:
|
||||
return( "BOOL" );
|
||||
case DI_PROP_TYPE_INT:
|
||||
return( "INT" );
|
||||
case DI_PROP_TYPE_STRING:
|
||||
return( "STRING" );
|
||||
case DI_PROP_TYPE_BYTE:
|
||||
return( "BYTE" );
|
||||
default:
|
||||
return( "unknown" );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* prop_type_guess() -- guess the property type
|
||||
*/
|
||||
int prop_type_guess( uchar_t *data, int len ) {
|
||||
|
||||
int slen;
|
||||
int guess;
|
||||
int i, c;
|
||||
|
||||
if( len < 0 )
|
||||
return( -1 );
|
||||
else if( len == 0 )
|
||||
return( DI_PROP_TYPE_BOOLEAN );
|
||||
|
||||
slen = 0;
|
||||
guess = DI_PROP_TYPE_STRING;
|
||||
|
||||
for( i = 0; i < len; i++ ) {
|
||||
c = (int) data[i];
|
||||
switch( c ) {
|
||||
case 0:
|
||||
if( i == (len - 1 ))
|
||||
break;
|
||||
if( slen == 0 )
|
||||
guess = DI_PROP_TYPE_BYTE;
|
||||
else
|
||||
guess = slen = 0;
|
||||
break;
|
||||
default:
|
||||
if( ! isprint( c ))
|
||||
guess = DI_PROP_TYPE_BYTE;
|
||||
else
|
||||
slen++;
|
||||
}
|
||||
if( guess != DI_PROP_TYPE_STRING )
|
||||
break;
|
||||
}
|
||||
|
||||
// if( (guess == DI_PROP_TYPE_BYTE) && (len % sizeof( int ) == 0 ))
|
||||
// guess = DI_PROP_TYPE_INT;
|
||||
|
||||
return( guess );
|
||||
}
|
||||
|
||||
/*
|
||||
* dump_minor_node() -- examine a device minor node
|
||||
* this routine gets passed to di_walk_node()
|
||||
*/
|
||||
int dump_minor_node( di_node_t node, di_minor_t minor, void *arg ) {
|
||||
|
||||
QString majmin;
|
||||
char *type;
|
||||
dev_t dev;
|
||||
|
||||
QStringList list;
|
||||
list << di_minor_name( minor );
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem( (QTreeWidgetItem *) arg, list);
|
||||
item->setExpanded(false);
|
||||
|
||||
QString specResult;
|
||||
if (di_minor_spectype( minor ) == S_IFCHR)
|
||||
specResult = i18n( "character special" );
|
||||
else
|
||||
specResult = i18n( "block special" );
|
||||
|
||||
QStringList spec;
|
||||
spec << i18n( "Spectype:" ) << specResult;
|
||||
|
||||
new QTreeWidgetItem(item, spec);
|
||||
|
||||
type = di_minor_nodetype( minor );
|
||||
|
||||
QString nodeResult;
|
||||
if (type == NULL)
|
||||
nodeResult = "NULL";
|
||||
else
|
||||
nodeResult = type;
|
||||
|
||||
QStringList node;
|
||||
node << i18n( "Nodetype:" ) << nodeResult;
|
||||
|
||||
new QTreeWidgetItem(item, node);
|
||||
|
||||
if( (dev = di_minor_devt( minor )) != DDI_DEV_T_NONE ) {
|
||||
majmin.sprintf( "%ld/%ld", major( dev ), minor( dev ));
|
||||
QStringList mn;
|
||||
mn << i18n( "Major/Minor:" ) << majmin;
|
||||
new QTreeWidgetItem(item, mn);
|
||||
}
|
||||
|
||||
if( di_minor_next( node, minor ) == DI_MINOR_NIL )
|
||||
return DI_WALK_TERMINATE;
|
||||
else
|
||||
return DI_WALK_CONTINUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* propvalue() -- return the property value
|
||||
*/
|
||||
QString propvalue( di_prop_t prop ) {
|
||||
|
||||
int type;
|
||||
int i, n;
|
||||
char *strp;
|
||||
int *intp;
|
||||
uchar_t *bytep;
|
||||
QString result;
|
||||
|
||||
/*
|
||||
* Since a lot of printable strings seem to be tagged as 'byte',
|
||||
* we're going to guess, if the property is not STRING or INT
|
||||
* The actual type is shown in the info tree, though.
|
||||
*/
|
||||
type = di_prop_type( prop );
|
||||
if( (type != DI_PROP_TYPE_STRING) && (type != DI_PROP_TYPE_INT) ) {
|
||||
n = di_prop_bytes( prop, &bytep );
|
||||
type = prop_type_guess( bytep, n );
|
||||
}
|
||||
|
||||
result = "";
|
||||
switch( type ) {
|
||||
case DI_PROP_TYPE_STRING:
|
||||
if( (n = di_prop_strings( prop, &strp )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
result += "\"";
|
||||
result += strp;
|
||||
result += "\" ";
|
||||
strp += strlen( strp ) + 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DI_PROP_TYPE_INT:
|
||||
if( (n = di_prop_ints( prop, &intp )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
QString tmp;
|
||||
tmp.setNum( intp[i] );
|
||||
result += tmp;
|
||||
result += ' ';
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DI_PROP_TYPE_BOOLEAN:
|
||||
/*
|
||||
* hmm, Sun's sample code handles the existence
|
||||
* of a boolean property as "true", whereas
|
||||
* prtconf(1M) obviously does not (Sol8, at least)
|
||||
* -- we're doing the same and handle "bool" as "byte"
|
||||
*/
|
||||
case DI_PROP_TYPE_BYTE:
|
||||
if( (n = di_prop_bytes( prop, &bytep )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
if( n == 0 ) {
|
||||
result = i18n( "(no value)" );
|
||||
break;
|
||||
}
|
||||
result = "0x";
|
||||
for( i = 0; i < n; i++ ) {
|
||||
QString tmp;
|
||||
unsigned byte = (unsigned) bytep[i];
|
||||
tmp.sprintf( "%2.2x", byte );
|
||||
result += tmp;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
result = "???";
|
||||
}
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
||||
/*
|
||||
* dump_node() -- examine a device node and its children
|
||||
* this routine gets passed to di_walk_node()
|
||||
*/
|
||||
int dump_node( di_node_t node, void *arg ) {
|
||||
|
||||
QTreeWidgetItem *top = (QTreeWidgetItem *) arg;
|
||||
QTreeWidgetItem *parent;
|
||||
char *path;
|
||||
char *drivername;
|
||||
char *names;
|
||||
QString compatnames;
|
||||
int i, n;
|
||||
di_prop_t prop;
|
||||
|
||||
path = di_devfs_path( node );
|
||||
|
||||
/*
|
||||
* if this is the root node ("/"), initialize the tree
|
||||
*/
|
||||
if( strlen( path ) == 1 ) {
|
||||
top->setText( 0, QString( di_binding_name( node )));
|
||||
top->setIcon( 0, SmallIcon( "kcmdevices" ));
|
||||
top->setExpanded( true );
|
||||
}
|
||||
|
||||
/*
|
||||
* place the node in the tree
|
||||
*/
|
||||
parent = mktree( top, path );
|
||||
|
||||
/*
|
||||
* we have to handle the root node differently...
|
||||
*/
|
||||
if( strlen( path ) > 1 ) {
|
||||
parent->setExpanded(false);
|
||||
} else {
|
||||
parent = top;
|
||||
}
|
||||
|
||||
/*
|
||||
* node name and physical device path
|
||||
*/
|
||||
drivername = di_driver_name( node );
|
||||
|
||||
QStringList driverList;
|
||||
driverList << i18n( "Driver Name:" );
|
||||
if (drivername==NULL)
|
||||
driverList << i18n( "(driver not attached)" );
|
||||
else
|
||||
driverList << drivername;
|
||||
|
||||
new QTreeWidgetItem(parent, driverList);
|
||||
|
||||
QStringList bindingList;
|
||||
bindingList << i18n( "Binding Name:" ) << di_binding_name( node );
|
||||
new QTreeWidgetItem(parent, bindingList);
|
||||
|
||||
n = di_compatible_names( node, &names );
|
||||
if( n < 1 ) {
|
||||
compatnames = i18n( "(none)" );
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
compatnames += names;
|
||||
compatnames += ' ';
|
||||
names += strlen( names ) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
QStringList compatibleList;
|
||||
compatibleList << i18n( "Compatible Names:" ) << compatnames;
|
||||
new QTreeWidgetItem(parent, compatibleList);
|
||||
|
||||
QStringList physicalList;
|
||||
physicalList << i18n( "Physical Path:" ) << QString( path );
|
||||
new QTreeWidgetItem(parent, physicalList);
|
||||
|
||||
/*
|
||||
* dump the node's property list (if any)
|
||||
*/
|
||||
if( (prop = di_prop_next( node, DI_PROP_NIL )) != DI_PROP_NIL ) {
|
||||
|
||||
QTreeWidgetItem *previous;
|
||||
QStringList propertiesList;
|
||||
propertiesList << i18n( "Properties" );
|
||||
previous = new QTreeWidgetItem(parent, propertiesList);
|
||||
previous->setExpanded( false );
|
||||
|
||||
do {
|
||||
/*
|
||||
* property type & value
|
||||
*/
|
||||
QStringList propList;
|
||||
propList << di_prop_name( prop );
|
||||
QTreeWidgetItem* tmp = new QTreeWidgetItem(previous, propList);
|
||||
tmp->setExpanded( false );
|
||||
|
||||
QStringList typeList;
|
||||
typeList << i18n( "Type:" ) << prop_type_str( prop );
|
||||
new QTreeWidgetItem( tmp, typeList);
|
||||
|
||||
QStringList valueList;
|
||||
valueList << i18n( "Value:" ) << propvalue( prop );
|
||||
new QTreeWidgetItem( tmp, valueList);
|
||||
|
||||
}while( (prop = di_prop_next( node, prop )) != DI_PROP_NIL );
|
||||
}
|
||||
|
||||
/*
|
||||
* if there are minor nodes, expand the tree appropriately
|
||||
*/
|
||||
if( di_minor_next( node, DI_MINOR_NIL ) != DI_MINOR_NIL ) {
|
||||
QStringList minorList;
|
||||
minorList << i18n( "Minor Nodes" );
|
||||
QTreeWidgetItem* previous = new QTreeWidgetItem(parent, minorList);
|
||||
previous->setExpanded(false);
|
||||
di_walk_minor( node, NULL, 0, previous, dump_minor_node );
|
||||
}
|
||||
|
||||
return DI_WALK_CONTINUE;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices( QTreeWidget* tree ) {
|
||||
|
||||
di_node_t root_node;
|
||||
|
||||
/*
|
||||
* create a snapshot of the device tree
|
||||
*/
|
||||
if( (root_node = di_init( "/", DINFOCPYALL )) == DI_NODE_NIL ) {
|
||||
return( false );
|
||||
}
|
||||
// XXX: might try to di_prom_init() here as well (if we're setgid sys)
|
||||
|
||||
/*
|
||||
* prepare the tree widget
|
||||
*/
|
||||
QStringList headers;
|
||||
headers << i18n( "Device Information" ) << i18n( "Value" );
|
||||
tree->setHeaderLabels(headers);
|
||||
|
||||
QTreeWidgetItem* top = new QTreeWidgetItem( tree );
|
||||
|
||||
/*
|
||||
* traverse the device tree
|
||||
*/
|
||||
di_walk_node( root_node, DI_WALK_CLDFIRST, top, dump_node );
|
||||
|
||||
di_fini( root_node );
|
||||
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* ! HAVE_LIBDEVINFO_H */
|
||||
bool GetInfo_Devices(QTreeWidget*) {
|
||||
return false;
|
||||
}
|
||||
#endif /* ! HAVE_LIBDEVINFO_H */
|
112
kinfocenter/base/info_svr4.cpp
Normal file
112
kinfocenter/base/info_svr4.cpp
Normal file
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
info_svr4.cpp
|
||||
|
||||
UNIX System V Release 4 specific Information about the Hardware.
|
||||
Appropriate for SCO OpenServer and UnixWare.
|
||||
Written 20-Feb-99 by Ronald Joe Record (rr@sco.com)
|
||||
Initially based on info_sgi.cpp
|
||||
*/
|
||||
|
||||
#define INFO_DEV_SNDSTAT "/dev/sndstat"
|
||||
|
||||
#include <sys/systeminfo.h>
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool GetInfo_ReadfromFile(QListView *lBox, char *Name, char splitchar) {
|
||||
QString str;
|
||||
char buf[512];
|
||||
|
||||
QFile *file = new QFile(Name);
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
if (!file->open(QIODevice::ReadOnly)) {
|
||||
delete file;
|
||||
return false;
|
||||
}
|
||||
|
||||
while (file->readLine(buf, sizeof(buf)-1) > 0) {
|
||||
if (strlen(buf)) {
|
||||
char *p=buf;
|
||||
if (splitchar!=0) /* remove leading spaces between ':' and the following text */
|
||||
while (*p) {
|
||||
if (*p==splitchar) {
|
||||
*p++ = ' ';
|
||||
while (*p==' ')
|
||||
++p;
|
||||
*(--p) = splitchar;
|
||||
++p;
|
||||
} else
|
||||
++p;
|
||||
}
|
||||
|
||||
QString s1 = QString::fromLocal8Bit(buf);
|
||||
QString s2 = s1.mid(s1.find(splitchar)+1);
|
||||
|
||||
s1.truncate(s1.find(splitchar));
|
||||
if (!(s1.isEmpty() || s2.isEmpty()))
|
||||
olditem = new QListViewItem(lBox, olditem, s1, s2);
|
||||
}
|
||||
}
|
||||
file->close();
|
||||
|
||||
delete file;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_CPU(QListView *lBox) {
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_ARCHITECTURE, buf, sizeof(buf));
|
||||
new QListViewItem(lBox, QString::fromLocal8Bit(buf));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(QTreeWidget* tree) {
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_BUSTYPES, buf, sizeof(buf));
|
||||
QStringList list;
|
||||
list << QString::fromLocal8Bit(buf);
|
||||
new QTreeWidgetItem(tree, list);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(QListView *lBox) {
|
||||
if (GetInfo_ReadfromFile(lBox, INFO_DEV_SNDSTAT, 0))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions(QListView *) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video(QListView *lBox) {
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
||||
|
331
kinfocenter/base/os_base.h
Normal file
331
kinfocenter/base/os_base.h
Normal file
|
@ -0,0 +1,331 @@
|
|||
#ifndef OS_BASE_H_
|
||||
#define OS_BASE_H_
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
|
||||
#include <QProcess>
|
||||
#include <QTextStream>
|
||||
#include <QTreeWidget>
|
||||
#include <QTreeWidgetItem>
|
||||
|
||||
#include <kiconloader.h>
|
||||
#include <kglobal.h>
|
||||
#include <klocale.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "config-infocenter.h"
|
||||
|
||||
static const QString Value(int val, int numbers=1) {
|
||||
return KGlobal::locale()->formatNumber(val, 0).rightJustified(numbers);
|
||||
}
|
||||
|
||||
static const QString HexStr(unsigned long val, int digits) {
|
||||
QString hexstr;
|
||||
int i;
|
||||
hexstr = QString::fromLatin1("0x%1").arg(val, digits, 16/*=HEX*/);
|
||||
for (i=hexstr.length()-1; i>0; --i)
|
||||
if (hexstr[i]==' ')
|
||||
hexstr[i] = '0';
|
||||
return hexstr;
|
||||
}
|
||||
|
||||
static const QString Order(int order) {
|
||||
if (order==LSBFirst)
|
||||
return i18n("LSBFirst");
|
||||
else if (order==MSBFirst)
|
||||
return i18n("MSBFirst");
|
||||
else
|
||||
return i18n("Unknown Order %1", order);
|
||||
}
|
||||
|
||||
static const QString BitString(unsigned long n) {
|
||||
return i18np("1 Bit", "%1 Bits", n); // singular & plural form of "%d Bit"
|
||||
}
|
||||
|
||||
static const QString ByteString(unsigned long n) {
|
||||
/* explanation in BR #52640 (http://bugs.kde.org/show_bug.cgi?id=52640) */
|
||||
if (n == 1)
|
||||
return i18nc("singular form: '1 Byte' (yes, it is '1', not '%1'!)", "1 Byte");
|
||||
|
||||
return i18nc("plural form: '%1 Bytes'", "%1 Bytes", KGlobal::locale()->formatNumber(n, 0));
|
||||
}
|
||||
|
||||
static struct _event_table {
|
||||
const char *name;
|
||||
long value;
|
||||
} event_table[] = { { "KeyPressMask", KeyPressMask }, { "KeyReleaseMask", KeyReleaseMask }, { "ButtonPressMask", ButtonPressMask }, { "ButtonReleaseMask", ButtonReleaseMask }, { "EnterWindowMask", EnterWindowMask }, { "LeaveWindowMask", LeaveWindowMask }, { "PointerMotionMask", PointerMotionMask },
|
||||
{ "PointerMotionHintMask", PointerMotionHintMask }, { "Button1MotionMask", Button1MotionMask }, { "Button2MotionMask", Button2MotionMask }, { "Button3MotionMask", Button3MotionMask }, { "Button4MotionMask", Button4MotionMask }, { "Button5MotionMask", Button5MotionMask }, {
|
||||
"ButtonMotionMask", ButtonMotionMask }, { "KeymapStateMask", KeymapStateMask }, { "ExposureMask", ExposureMask }, { "VisibilityChangeMask", VisibilityChangeMask }, { "StructureNotifyMask", StructureNotifyMask }, { "ResizeRedirectMask", ResizeRedirectMask }, {
|
||||
"SubstructureNotifyMask", SubstructureNotifyMask }, { "SubstructureRedirectMask", SubstructureRedirectMask }, { "FocusChangeMask", FocusChangeMask }, { "PropertyChangeMask", PropertyChangeMask }, { "ColormapChangeMask", ColormapChangeMask }, { "OwnerGrabButtonMask",
|
||||
OwnerGrabButtonMask }, { 0L, 0 } };
|
||||
|
||||
/* easier to read with such a define ! */
|
||||
#define I18N_MAX(txt,in,fm,maxw) \
|
||||
{ int n = fm.width(txt=in); if (n>maxw) maxw=n; }
|
||||
|
||||
#define PIXEL_ADD 20 // add x Pixel to multicolumns..
|
||||
#define HEXDIGITS (sizeof(int)*8/4) /* 4 Bytes = 32 Bits = 8 Hex-Digits */
|
||||
|
||||
static QTreeWidgetItem* XServer_fill_screen_info(QTreeWidgetItem *lBox, QTreeWidgetItem *last, Display *dpy, int scr, int default_scr) {
|
||||
unsigned width, height;
|
||||
double xres, yres;
|
||||
int i, ndepths, *depths;
|
||||
Screen *s= ScreenOfDisplay(dpy,scr); /* opaque structure */
|
||||
QTreeWidgetItem *item;
|
||||
|
||||
/*
|
||||
* there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
|
||||
*
|
||||
* dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
|
||||
* = N pixels / (M inch / 25.4)
|
||||
* = N * 25.4 pixels / M inch
|
||||
*/
|
||||
|
||||
xres = ((double)(DisplayWidth(dpy,scr) *25.4)/DisplayWidthMM(dpy,scr) );
|
||||
yres = ((double)(DisplayHeight(dpy,scr)*25.4)/DisplayHeightMM(dpy,scr));
|
||||
|
||||
QStringList screenList;
|
||||
screenList << ki18n("Screen # %1").subs((int)scr,-1).toString();
|
||||
if (scr==default_scr)
|
||||
screenList << i18n("(Default Screen)");
|
||||
else
|
||||
screenList << QString();
|
||||
|
||||
item = new QTreeWidgetItem(lBox, screenList);
|
||||
if (scr==default_scr)
|
||||
item->setExpanded(true);
|
||||
|
||||
QStringList dimensionList;
|
||||
dimensionList << i18n("Dimensions") << i18n("%1 x %2 Pixel (%3 x %4 mm)", (int)DisplayWidth(dpy,scr) , (int)DisplayHeight(dpy,scr) , (int)DisplayWidthMM(dpy,scr) , (int)DisplayHeightMM (dpy,scr) );
|
||||
last = new QTreeWidgetItem(item, dimensionList);
|
||||
|
||||
QStringList resolutionList;
|
||||
resolutionList << i18n("Resolution") << i18n("%1 x %2 dpi", (int)(xres+0.5) , (int)(yres+0.5) );
|
||||
|
||||
last = new QTreeWidgetItem(item, resolutionList);
|
||||
|
||||
ndepths = 0;
|
||||
depths = 0;
|
||||
depths = XListDepths(dpy, scr, &ndepths);
|
||||
if (depths) {
|
||||
QString txt;
|
||||
|
||||
for (i = 0; i < ndepths; i++) {
|
||||
txt = txt + Value(depths[i]);
|
||||
if (i < ndepths - 1)
|
||||
txt = txt + QLatin1String(", ");
|
||||
}
|
||||
|
||||
QStringList depthList;
|
||||
depthList << ki18n("Depths (%1)").subs(ndepths,-1).toString() << txt;
|
||||
last = new QTreeWidgetItem(item, depthList);
|
||||
XFree((char *) depths);
|
||||
}
|
||||
|
||||
QStringList rootList;
|
||||
rootList << i18n("Root Window ID") << HexStr((unsigned long)RootWindow(dpy,scr), HEXDIGITS);
|
||||
last = new QTreeWidgetItem(item, rootList);
|
||||
|
||||
QStringList depthRootList;
|
||||
depthRootList << i18n("Depth of Root Window") << i18np("%1 plane", "%1 planes", DisplayPlanes(dpy,scr));
|
||||
last = new QTreeWidgetItem(item, depthRootList);
|
||||
|
||||
QStringList colormapList;
|
||||
colormapList << i18n("Number of Colormaps") << i18n("minimum %1, maximum %2", (int)MinCmapsOfScreen(s), (int)MaxCmapsOfScreen(s));
|
||||
last = new QTreeWidgetItem(item, colormapList);
|
||||
|
||||
QStringList defaultColormap;
|
||||
defaultColormap << i18n("Default Colormap"), Value((int)DefaultColormap(dpy,scr));
|
||||
last = new QTreeWidgetItem(item, defaultColormap);
|
||||
|
||||
QStringList colormapCellList;
|
||||
colormapCellList << i18n("Default Number of Colormap Cells") << Value((int)DisplayCells(dpy, scr));
|
||||
last = new QTreeWidgetItem(item, colormapCellList);
|
||||
|
||||
QStringList preallocatedList;
|
||||
preallocatedList << i18n("Preallocated Pixels") << i18n("Black %1, White %2", KGlobal::locale()->formatNumber(BlackPixel(dpy,scr), 0), KGlobal::locale()->formatNumber(WhitePixel(dpy,scr), 0));
|
||||
last = new QTreeWidgetItem(item, preallocatedList);
|
||||
|
||||
QString YES(i18n("Yes"));
|
||||
QString NO(i18n("No"));
|
||||
|
||||
QStringList optionList;
|
||||
optionList << i18n("Options") << i18n("backing-store: %1, save-unders: %2", (DoesBackingStore(s) == NotUseful) ? NO : ((DoesBackingStore(s) == Always) ? YES : i18n("When mapped")),
|
||||
DoesSaveUnders(s) ? YES : NO);
|
||||
last = new QTreeWidgetItem(item, optionList);
|
||||
|
||||
XQueryBestSize(dpy, CursorShape, RootWindow(dpy,scr), 65535, 65535, &width, &height);
|
||||
QStringList largestList;
|
||||
largestList << i18n("Largest Cursor");
|
||||
if (width == 65535 && height == 65535)
|
||||
largestList << i18n("unlimited");
|
||||
else
|
||||
largestList << QString::fromLatin1("%1 x %2").arg(width).arg(height);
|
||||
last = new QTreeWidgetItem(item, largestList);
|
||||
|
||||
QStringList currentInput;
|
||||
currentInput << i18n("Current Input Event Mask") << HexStr((unsigned long)EventMaskOfScreen(s), HEXDIGITS);
|
||||
last = new QTreeWidgetItem(item, currentInput);
|
||||
struct _event_table *etp;
|
||||
for (etp=event_table; etp->name; etp++) {
|
||||
if (EventMaskOfScreen(s) & etp->value) {
|
||||
QStringList eventList;
|
||||
eventList << i18n("Event = %1", HexStr(etp->value, HEXDIGITS)) << etp->name;
|
||||
new QTreeWidgetItem(last, eventList);
|
||||
}
|
||||
}
|
||||
|
||||
if (last->childCount()==0)
|
||||
return last;
|
||||
else
|
||||
return last->child(last->childCount()-1);
|
||||
}
|
||||
|
||||
static bool GetInfo_XServer_Generic(QTreeWidget *lBox) {
|
||||
/* Many parts of this source are taken from the X11-program "xdpyinfo" */
|
||||
|
||||
int i, n;
|
||||
long req_size;
|
||||
|
||||
Display *dpy;
|
||||
XPixmapFormatValues *pmf;
|
||||
|
||||
QString str, txt;
|
||||
QTreeWidgetItem *last, *item, *next;
|
||||
|
||||
dpy = XOpenDisplay(0);
|
||||
if (!dpy)
|
||||
return false;
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Information") << i18n("Value");
|
||||
lBox->setHeaderLabels(headers);
|
||||
lBox->setSortingEnabled(false);
|
||||
|
||||
QStringList serverInfo;
|
||||
serverInfo << i18n("Server Information");
|
||||
next = new QTreeWidgetItem(lBox, serverInfo);
|
||||
next->setIcon(0, SmallIcon("xorg"));
|
||||
next->setExpanded(true);
|
||||
|
||||
QStringList displayNameList;
|
||||
displayNameList << i18n("Name of the Display") << DisplayString(dpy);
|
||||
last = new QTreeWidgetItem(next, displayNameList);
|
||||
|
||||
QStringList vendorList;
|
||||
vendorList << i18n("Vendor String") << QLatin1String(ServerVendor(dpy));
|
||||
last = new QTreeWidgetItem(next, vendorList);
|
||||
|
||||
QStringList vendorReleaseList;
|
||||
vendorReleaseList << i18n("Vendor Release Number") << Value((int)VendorRelease(dpy));
|
||||
last = new QTreeWidgetItem(next, vendorReleaseList);
|
||||
|
||||
QStringList versionList;
|
||||
versionList << i18n("Version Number") << QString::fromLatin1("%1.%2").arg((int)ProtocolVersion(dpy)).arg((int)ProtocolRevision(dpy));
|
||||
last = new QTreeWidgetItem(next, versionList);
|
||||
|
||||
QStringList screenList;
|
||||
screenList << i18n("Available Screens");
|
||||
last = item = new QTreeWidgetItem(next, screenList);
|
||||
last->setExpanded(true);
|
||||
for (i=0; i<ScreenCount(dpy); i++) {
|
||||
item = XServer_fill_screen_info(last, item, dpy, i, (int)DefaultScreen(dpy));
|
||||
if (i==0)
|
||||
item->setExpanded(true);
|
||||
}
|
||||
|
||||
QStringList extensionList;
|
||||
extensionList << i18n("Supported Extensions");
|
||||
last = new QTreeWidgetItem(next, extensionList );
|
||||
item = last;
|
||||
|
||||
int extCount;
|
||||
char **extensions = XListExtensions(dpy, &extCount);
|
||||
for (i = 0; i < extCount; i++) {
|
||||
QStringList extensionInfoList;
|
||||
extensionInfoList << QLatin1String(extensions[i]);
|
||||
item = new QTreeWidgetItem( last, extensionInfoList );
|
||||
}
|
||||
XFreeExtensionList(extensions);
|
||||
|
||||
pmf = XListPixmapFormats(dpy, &n);
|
||||
QStringList pixmapFormatList;
|
||||
pixmapFormatList << i18n("Supported Pixmap Formats");
|
||||
last = item = new QTreeWidgetItem(next, pixmapFormatList);
|
||||
|
||||
if (pmf) {
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
QStringList pixmapList;
|
||||
pixmapList << i18n("Pixmap Format #%1", i+1) << i18n("%1 BPP, Depth: %2, Scanline padding: %3", pmf[i].bits_per_pixel, BitString(pmf[i].depth), BitString(pmf[i].scanline_pad));
|
||||
|
||||
item = new QTreeWidgetItem(last, pixmapList);
|
||||
}
|
||||
XFree((char *)pmf);
|
||||
}
|
||||
|
||||
req_size = XExtendedMaxRequestSize(dpy);
|
||||
if (!req_size)
|
||||
req_size = XMaxRequestSize(dpy);
|
||||
|
||||
QStringList requestSizeList;
|
||||
requestSizeList << i18n("Maximum Request Size") << ByteString(req_size*4);
|
||||
last = new QTreeWidgetItem(next, requestSizeList);
|
||||
|
||||
QStringList motionList;
|
||||
motionList << i18n("Motion Buffer Size") << ByteString(XDisplayMotionBufferSize(dpy));
|
||||
last = new QTreeWidgetItem(next, motionList);
|
||||
|
||||
QStringList bitmapList;
|
||||
bitmapList << i18n("Bitmap");
|
||||
last = item = new QTreeWidgetItem(next, bitmapList);
|
||||
|
||||
QStringList unitList;
|
||||
unitList << i18n("Unit") << Value(BitmapUnit(dpy));
|
||||
item = new QTreeWidgetItem(last, unitList);
|
||||
|
||||
QStringList orderList;
|
||||
orderList << i18n("Order") << Order(BitmapBitOrder(dpy));
|
||||
item = new QTreeWidgetItem(last, orderList);
|
||||
|
||||
QStringList paddingList;
|
||||
paddingList << i18n("Padding") << Value(BitmapPad(dpy));
|
||||
item = new QTreeWidgetItem(last, paddingList);
|
||||
|
||||
QStringList imageByteList;
|
||||
imageByteList << i18n("Image Byte Order") << Order(ImageByteOrder(dpy));
|
||||
last = new QTreeWidgetItem(next, imageByteList);
|
||||
|
||||
XCloseDisplay(dpy);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Helper-function to read output from an external program */
|
||||
static int GetInfo_ReadfromPipe(QTreeWidget* tree, const char *FileName, bool WithEmptyLines = true) {
|
||||
QProcess proc;
|
||||
QTreeWidgetItem* olditem= NULL;
|
||||
QString s;
|
||||
|
||||
proc.start(FileName, QIODevice::ReadOnly);
|
||||
if (!proc.waitForFinished()) {
|
||||
// Process hanged or did not start
|
||||
return 0;
|
||||
}
|
||||
|
||||
QTextStream t(&proc);
|
||||
|
||||
while (!t.atEnd()) {
|
||||
s = t.readLine();
|
||||
if (!WithEmptyLines && s.length()==0)
|
||||
continue;
|
||||
QStringList list;
|
||||
list << s;
|
||||
olditem = new QTreeWidgetItem(tree, list);
|
||||
}
|
||||
|
||||
return tree->topLevelItemCount();
|
||||
}
|
||||
|
||||
#endif /*OS_BASE_H_*/
|
28
kinfocenter/base/os_current.cpp
Normal file
28
kinfocenter/base/os_current.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
|
||||
#include "os_current.h"
|
||||
|
||||
#include "os_base.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include "info_linux.cpp"
|
||||
#elif defined(sgi) && sgi
|
||||
#include "info_sgi.cpp"
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
#include "info_fbsd.cpp"
|
||||
#elif __hpux
|
||||
#include "info_hpux.cpp"
|
||||
#elif __NetBSD__
|
||||
#include "info_netbsd.cpp"
|
||||
#elif __OpenBSD__
|
||||
#include "info_openbsd.cpp"
|
||||
#elif defined(__svr4__) && defined(sun)
|
||||
#include "info_solaris.cpp"
|
||||
#elif __svr4__
|
||||
#include "info_svr4.cpp"
|
||||
#elif _AIX
|
||||
#include "info_aix.cpp"
|
||||
#elif defined(__APPLE__)
|
||||
#include "info_osx.cpp"
|
||||
#else
|
||||
#include "info_generic.cpp" /* Default for unsupported systems.... */
|
||||
#endif
|
185
kinfocenter/base/os_current.h
Normal file
185
kinfocenter/base/os_current.h
Normal file
|
@ -0,0 +1,185 @@
|
|||
#ifndef OS_CURRENT_H_
|
||||
#define OS_CURRENT_H_
|
||||
|
||||
class QTreeWidget;
|
||||
class QTreeWidgetItem;
|
||||
class QString;
|
||||
|
||||
/* function call-back-prototypes... */
|
||||
|
||||
bool GetInfo_CPU(QTreeWidget* tree);
|
||||
bool GetInfo_IRQ(QTreeWidget* tree);
|
||||
bool GetInfo_DMA(QTreeWidget* tree);
|
||||
bool GetInfo_PCI(QTreeWidget* tree);
|
||||
bool GetInfo_IO_Ports(QTreeWidget* tree);
|
||||
bool GetInfo_Sound(QTreeWidget* tree);
|
||||
bool GetInfo_Devices(QTreeWidget* tree);
|
||||
bool GetInfo_SCSI(QTreeWidget* tree);
|
||||
bool GetInfo_Partitions(QTreeWidget* tree);
|
||||
bool GetInfo_XServer_and_Video(QTreeWidget* tree);
|
||||
|
||||
|
||||
#ifdef __linux__
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
/* i18n("Maybe the proc-filesystem is not enabled in Linux-Kernel.") */
|
||||
#define DEFAULT_ERRORSTRING QString()
|
||||
|
||||
|
||||
#elif defined(sgi) && sgi
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif __hpux
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING QString()
|
||||
|
||||
#elif __NetBSD__
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif __OpenBSD__
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif defined(__svr4__) && defined(sun)
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif __svr4__
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif _AIX
|
||||
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_CPU_AVAILABLE
|
||||
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
//#define INFO_IRQ_AVAILABLE
|
||||
//#define INFO_DMA_AVAILABLE
|
||||
//#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#else
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
|
||||
#endif
|
||||
|
||||
#endif /*OS_CURRENT_H_*/
|
|
@ -17,9 +17,6 @@
|
|||
*/
|
||||
|
||||
#include "dockcontainer.h"
|
||||
#include "global.h"
|
||||
#include "modules.h"
|
||||
#include "proxywidget.h"
|
||||
|
||||
#include <kapplication.h>
|
||||
#include <kmessagebox.h>
|
||||
|
@ -34,224 +31,158 @@
|
|||
#include <QFont>
|
||||
#include <QApplication>
|
||||
|
||||
#include "global.h"
|
||||
#include "modules.h"
|
||||
#include "proxywidget.h"
|
||||
#include "aboutwidget.h"
|
||||
|
||||
#include "dockcontainer.moc"
|
||||
|
||||
class ModuleTitle : public KHBox
|
||||
{
|
||||
public:
|
||||
ModuleTitle( QWidget *parent );
|
||||
~ModuleTitle() {}
|
||||
ModuleTitle::ModuleTitle(QWidget *parent) :
|
||||
KTitleWidget(parent) {
|
||||
|
||||
void showTitleFor( ConfigModule *module );
|
||||
void clear();
|
||||
|
||||
protected:
|
||||
QLabel *m_icon;
|
||||
QLabel *m_name;
|
||||
};
|
||||
|
||||
ModuleTitle::ModuleTitle( QWidget *parent )
|
||||
: KHBox( parent )
|
||||
{
|
||||
QWidget *spacer = new QWidget( this );
|
||||
spacer->setFixedWidth( KDialog::marginHint()-KDialog::spacingHint() );
|
||||
m_icon = new QLabel( this );
|
||||
m_name = new QLabel( this );
|
||||
|
||||
QFont font = m_name->font();
|
||||
font.setPointSize( font.pointSize()+1 );
|
||||
font.setBold( true );
|
||||
m_name->setFont( font );
|
||||
|
||||
setSpacing( KDialog::spacingHint() );
|
||||
if ( QApplication::isRightToLeft() )
|
||||
{
|
||||
spacer = new QWidget( this );
|
||||
setStretchFactor( spacer, 10 );
|
||||
}
|
||||
else
|
||||
setStretchFactor( m_name, 10 );
|
||||
}
|
||||
|
||||
void ModuleTitle::showTitleFor( ConfigModule *config )
|
||||
{
|
||||
ModuleTitle::~ModuleTitle() {
|
||||
|
||||
}
|
||||
|
||||
void ModuleTitle::showTitleFor(ConfigModule* config) {
|
||||
kDebug() << "Show title for" << endl;
|
||||
if ( !config)
|
||||
return;
|
||||
|
||||
this->setWhatsThis( config->comment() );
|
||||
KIconLoader *loader = KIconLoader::global();
|
||||
QPixmap icon = loader->loadIcon( config->icon(), KIconLoader::NoGroup, 22 );
|
||||
m_icon->setPixmap( icon );
|
||||
m_name->setText( config->moduleName() );
|
||||
setWhatsThis(config->comment() );
|
||||
setCommentText(config->docPath(), config->comment(), config->module()->quickHelp());
|
||||
setPixmap(config->realIcon(KIconLoader::SizeLarge));
|
||||
setText(config->moduleName());
|
||||
|
||||
show();
|
||||
kDebug() << "Show title for done" << endl;
|
||||
}
|
||||
|
||||
void ModuleTitle::clear()
|
||||
{
|
||||
m_icon->setPixmap( QPixmap() );
|
||||
m_name->setText( QString() );
|
||||
kapp->processEvents();
|
||||
void ModuleTitle::setCommentText(const QString& docPath, const QString& text, const QString& quickHelp) {
|
||||
if (text.isEmpty() && docPath.isEmpty())
|
||||
setCommentBaseText();
|
||||
else if (docPath.isEmpty())
|
||||
setComment(text);
|
||||
else {
|
||||
setComment(quickHelp + i18n("<p>Click here to consult the full <a href=\"%1\">Manual</a>.</p>", "help:/" + docPath));
|
||||
}
|
||||
}
|
||||
|
||||
class ModuleWidget : public QWidget
|
||||
{
|
||||
public:
|
||||
ModuleWidget( QWidget *parent, const char *name );
|
||||
~ModuleWidget() {}
|
||||
|
||||
ProxyWidget* load( ConfigModule *module );
|
||||
|
||||
protected:
|
||||
QVBoxLayout *m_layout;
|
||||
ModuleTitle *m_title;
|
||||
};
|
||||
|
||||
ModuleWidget::ModuleWidget( QWidget *parent, const char * )
|
||||
: QWidget( parent )
|
||||
, m_layout (new QVBoxLayout (this))
|
||||
, m_title (new ModuleTitle (this))
|
||||
{
|
||||
m_layout->addWidget (m_title);
|
||||
void ModuleTitle::setCommentBaseText() {
|
||||
setComment(i18n("<h1>KDE Info Center</h1>"
|
||||
"There is no quick help available for the active info module."
|
||||
"<br /><br />"
|
||||
"Click <a href = \"kinfocenter/index.html\">here</a> to read the general Info Center manual.") );
|
||||
}
|
||||
|
||||
ProxyWidget *ModuleWidget::load( ConfigModule *module )
|
||||
{
|
||||
m_title->clear();
|
||||
ProxyWidget *proxy = module->module();
|
||||
DockContainer::DockContainer(AboutWidget* aboutWidget, QWidget *parent) :
|
||||
QWidget(parent) {
|
||||
|
||||
if ( proxy )
|
||||
{
|
||||
proxy->setParent(this);
|
||||
m_layout->addWidget (proxy);
|
||||
proxy->show();
|
||||
proxy->setSizePolicy (QSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding));
|
||||
m_title->showTitleFor( module );
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||||
|
||||
_moduleTitle = new ModuleTitle(this);
|
||||
mainLayout->addWidget(_moduleTitle);
|
||||
|
||||
_moduleWidgets = new QStackedWidget(this);
|
||||
mainLayout->addWidget(_moduleWidgets);
|
||||
|
||||
_busyWidget = new QLabel(i18n("<big><b>Loading...</b></big>"), this);
|
||||
_busyWidget->setAlignment(Qt::AlignCenter);
|
||||
_busyWidget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
|
||||
_moduleWidgets->addWidget(_busyWidget);
|
||||
|
||||
_generalWidget = aboutWidget;
|
||||
_moduleWidgets->addWidget(_generalWidget);
|
||||
|
||||
showAboutWidget();
|
||||
}
|
||||
|
||||
return proxy;
|
||||
DockContainer::~DockContainer() {
|
||||
|
||||
}
|
||||
|
||||
DockContainer::DockContainer(QWidget *parent)
|
||||
: QStackedWidget(parent)
|
||||
, _basew(0L)
|
||||
, _module(0L)
|
||||
{
|
||||
_busyw = new QLabel(i18n("<big><b>Loading...</b></big>"), this);
|
||||
_busyw->setAlignment(Qt::AlignCenter);
|
||||
_busyw->setTextFormat(Qt::RichText);
|
||||
_busyw->setGeometry(0,0, width(), height());
|
||||
addWidget( _busyw );
|
||||
|
||||
_modulew = new ModuleWidget( this, "_modulew" );
|
||||
addWidget( _modulew );
|
||||
}
|
||||
ProxyWidget* DockContainer::initializeModule(ConfigModule * module) {
|
||||
showBusyWidget();
|
||||
|
||||
DockContainer::~DockContainer()
|
||||
{
|
||||
deleteModule();
|
||||
}
|
||||
|
||||
void DockContainer::setBaseWidget(QWidget *widget)
|
||||
{
|
||||
removeWidget( _basew );
|
||||
delete _basew;
|
||||
_basew = 0;
|
||||
if (!widget) return;
|
||||
|
||||
_basew = widget;
|
||||
|
||||
addWidget( _basew );
|
||||
setCurrentWidget( _basew );
|
||||
|
||||
emit newModule(widget->windowTitle(), "", "");
|
||||
}
|
||||
|
||||
ProxyWidget* DockContainer::loadModule( ConfigModule *module )
|
||||
{
|
||||
QApplication::setOverrideCursor(Qt::WaitCursor);
|
||||
|
||||
ProxyWidget *widget = _modulew->load( module );
|
||||
ProxyWidget* proxy = module->module();
|
||||
|
||||
if (widget)
|
||||
{
|
||||
_module = module;
|
||||
connect(_module, SIGNAL(childClosed()), SLOT(removeModule()));
|
||||
connect(_module, SIGNAL(changed(ConfigModule *)),
|
||||
SIGNAL(changedModule(ConfigModule *)));
|
||||
connect(widget, SIGNAL(quickHelpChanged()), SLOT(quickHelpChanged()));
|
||||
|
||||
setCurrentWidget( _modulew );
|
||||
emit newModule(widget->windowTitle(), module->docPath(), widget->quickHelp());
|
||||
if (proxy!=NULL) {
|
||||
//If this module was not in the stack, add it.
|
||||
if ( _moduleWidgets->indexOf(proxy) == -1) {
|
||||
_moduleWidgets->addWidget(proxy);
|
||||
}
|
||||
else
|
||||
{
|
||||
setCurrentWidget( _basew );
|
||||
emit newModule(_basew->windowTitle(), "", "");
|
||||
|
||||
}
|
||||
|
||||
QApplication::restoreOverrideCursor();
|
||||
|
||||
return widget;
|
||||
return proxy;
|
||||
}
|
||||
|
||||
bool DockContainer::dockModule(ConfigModule *module)
|
||||
{
|
||||
if (module == _module) return true;
|
||||
bool DockContainer::dockModule(ConfigModule *module) {
|
||||
|
||||
if (_module && _module->isChanged())
|
||||
{
|
||||
ProxyWidget* widget = initializeModule(module);
|
||||
|
||||
int res = KMessageBox::warningYesNoCancel(this,
|
||||
module ?
|
||||
i18n("There are unsaved changes in the active module.\n"
|
||||
if (widget==NULL) {
|
||||
kDebug() << "Failed to display module" << module->moduleName() << endl;
|
||||
showAboutWidget();
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
if (widget == _moduleWidgets->currentWidget()) {
|
||||
kDebug() << "Module already displayed" << endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (widget->isChanged()) {
|
||||
|
||||
int res = KMessageBox::warningYesNoCancel(this, module ? i18n("There are unsaved changes in the active module.\n"
|
||||
"Do you want to apply the changes before running "
|
||||
"the new module or discard the changes?") :
|
||||
i18n("There are unsaved changes in the active module.\n"
|
||||
"the new module or discard the changes?") : i18n("There are unsaved changes in the active module.\n"
|
||||
"Do you want to apply the changes before exiting "
|
||||
"the Control Center or discard the changes?"),
|
||||
i18n("Unsaved Changes"),
|
||||
KStandardGuiItem::apply(),
|
||||
KStandardGuiItem::discard());
|
||||
if (res == KMessageBox::Yes)
|
||||
_module->module()->applyClicked();
|
||||
"the Control Center or discard the changes?"), i18n("Unsaved Changes"), KStandardGuiItem::apply(), KStandardGuiItem::discard());
|
||||
if (res == KMessageBox::Cancel)
|
||||
return false;
|
||||
}
|
||||
|
||||
setCurrentWidget( _busyw );
|
||||
kDebug() << "Docking module..." << endl;
|
||||
|
||||
showConfigWidget(module);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void DockContainer::showAboutWidget() {
|
||||
kDebug() << "Show About Widget" << endl;
|
||||
_moduleWidgets->setCurrentWidget(_generalWidget);
|
||||
|
||||
_moduleTitle->hide();
|
||||
|
||||
}
|
||||
|
||||
void DockContainer::showBusyWidget() {
|
||||
kDebug() << "Show Busy Widget" << endl;
|
||||
_moduleWidgets->setCurrentWidget(_busyWidget);
|
||||
|
||||
_moduleTitle->hide();
|
||||
|
||||
kapp->processEvents();
|
||||
|
||||
deleteModule();
|
||||
if (!module) return true;
|
||||
|
||||
ProxyWidget *widget = loadModule( module );
|
||||
|
||||
KCGlobal::repairAccels( window() );
|
||||
return ( widget!=0 );
|
||||
}
|
||||
|
||||
void DockContainer::removeModule()
|
||||
{
|
||||
setCurrentWidget( _basew );
|
||||
deleteModule();
|
||||
void DockContainer::showConfigWidget(ConfigModule* module) {
|
||||
kDebug() << "Show Config Widget" << endl;
|
||||
|
||||
if (_basew)
|
||||
emit newModule(_basew->windowTitle(), "", "");
|
||||
else
|
||||
emit newModule("", "", "");
|
||||
}
|
||||
_moduleTitle->showTitleFor(module);
|
||||
_moduleTitle->show();
|
||||
|
||||
void DockContainer::deleteModule()
|
||||
{
|
||||
if(_module) {
|
||||
_module->deleteClient();
|
||||
_module = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void DockContainer::quickHelpChanged()
|
||||
{
|
||||
if (_module && _module->module())
|
||||
emit newModule(_module->module()->windowTitle(), _module->docPath(), _module->module()->quickHelp());
|
||||
_moduleWidgets->setCurrentWidget(module->module());
|
||||
}
|
||||
|
|
|
@ -22,46 +22,55 @@
|
|||
|
||||
#include <QStackedWidget>
|
||||
#include <QLabel>
|
||||
#include <kvbox.h>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <kvbox.h>
|
||||
#include <ktitlewidget.h>
|
||||
|
||||
class AboutWidget;
|
||||
class ConfigModule;
|
||||
class ModuleWidget;
|
||||
class ProxyWidget;
|
||||
|
||||
class DockContainer : public QStackedWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
class ModuleTitle : public KTitleWidget {
|
||||
public:
|
||||
DockContainer(QWidget *parent=0);
|
||||
virtual ~DockContainer();
|
||||
ModuleTitle(QWidget *parent);
|
||||
~ModuleTitle();
|
||||
|
||||
void setBaseWidget(QWidget *widget);
|
||||
QWidget *baseWidget() { return _basew; }
|
||||
|
||||
bool dockModule(ConfigModule *module);
|
||||
ConfigModule *module() { return _module; }
|
||||
|
||||
public Q_SLOTS:
|
||||
void removeModule();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void quickHelpChanged();
|
||||
|
||||
protected:
|
||||
void deleteModule();
|
||||
ProxyWidget* loadModule( ConfigModule *module );
|
||||
|
||||
Q_SIGNALS:
|
||||
void newModule(const QString &name, const QString& docPath, const QString &quickhelp);
|
||||
void changedModule(ConfigModule *module);
|
||||
void showTitleFor(ConfigModule *module);
|
||||
|
||||
private:
|
||||
QWidget *_basew;
|
||||
QLabel *_busyw;
|
||||
ModuleWidget *_modulew;
|
||||
ConfigModule *_module;
|
||||
void setCommentText(const QString& docPath, const QString& text, const QString& quickHelp);
|
||||
void setCommentBaseText();
|
||||
|
||||
};
|
||||
|
||||
class DockContainer : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DockContainer(AboutWidget* aboutWidget, QWidget *parent=NULL);
|
||||
virtual ~DockContainer();
|
||||
|
||||
bool dockModule(ConfigModule *module);
|
||||
|
||||
public slots:
|
||||
void showAboutWidget();
|
||||
|
||||
signals:
|
||||
void newModule(const QString& name);
|
||||
|
||||
private:
|
||||
void showBusyWidget();
|
||||
void showConfigWidget(ConfigModule* module);
|
||||
|
||||
ProxyWidget* initializeModule(ConfigModule* module);
|
||||
|
||||
QLabel *_busyWidget;
|
||||
|
||||
ModuleTitle* _moduleTitle;
|
||||
QStackedWidget* _moduleWidgets;
|
||||
|
||||
AboutWidget* _generalWidget;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
#include <kuser.h>
|
||||
|
||||
#include <QObject>
|
||||
#include <Qt3Support/Q3Accel>
|
||||
#include <QByteArray>
|
||||
#include <QWidget>
|
||||
|
||||
|
@ -35,7 +34,6 @@
|
|||
#include <sys/utsname.h>
|
||||
|
||||
bool KCGlobal::_root = false;
|
||||
bool KCGlobal::_infocenter = false;
|
||||
QStringList KCGlobal::_types;
|
||||
QString KCGlobal::_uname = "";
|
||||
QString KCGlobal::_hname = "";
|
||||
|
@ -44,12 +42,9 @@ QString KCGlobal::_isystem = "";
|
|||
QString KCGlobal::_irelease = "";
|
||||
QString KCGlobal::_iversion = "";
|
||||
QString KCGlobal::_imachine = "";
|
||||
IndexViewMode KCGlobal::_viewmode = Icon;
|
||||
KIconLoader::StdSizes KCGlobal::_iconsize = KIconLoader::SizeMedium;
|
||||
QString KCGlobal::_baseGroup = "";
|
||||
|
||||
void KCGlobal::init()
|
||||
{
|
||||
void KCGlobal::init() {
|
||||
char buf[256];
|
||||
buf[0] = '\0';
|
||||
if (!gethostname(buf, sizeof(buf)))
|
||||
|
@ -71,49 +66,24 @@ void KCGlobal::init()
|
|||
setSystemMachine(info.machine);
|
||||
}
|
||||
|
||||
void KCGlobal::setType(const QByteArray& s)
|
||||
{
|
||||
void KCGlobal::setType(const QByteArray& s) {
|
||||
QString string = s.toLower();
|
||||
_types = string.split( ',');
|
||||
}
|
||||
|
||||
QString KCGlobal::baseGroup()
|
||||
{
|
||||
if ( _baseGroup.isEmpty() )
|
||||
{
|
||||
KServiceGroup::Ptr group = KServiceGroup::baseGroup( _infocenter ? "info" : "settings" );
|
||||
if (group)
|
||||
{
|
||||
QString KCGlobal::baseGroup() {
|
||||
if (_baseGroup.isEmpty() ) {
|
||||
KServiceGroup::Ptr group = KServiceGroup::baseGroup("info");
|
||||
if (group) {
|
||||
_baseGroup = group->relPath();
|
||||
kDebug(1208) << "Found basegroup = " << _baseGroup;
|
||||
kDebug() << "Found basegroup = " << _baseGroup;
|
||||
return _baseGroup;
|
||||
}
|
||||
// Compatibility with old behaviour, in case of missing .directory files.
|
||||
if (_baseGroup.isEmpty())
|
||||
{
|
||||
if (_infocenter)
|
||||
{
|
||||
if (_baseGroup.isEmpty()) {
|
||||
kWarning() << "No K menu group with X-KDE-BaseGroup=info found ! Defaulting to Settings/Information/";
|
||||
_baseGroup = QLatin1String("Settings/Information/");
|
||||
}
|
||||
else
|
||||
{
|
||||
kWarning() << "No K menu group with X-KDE-BaseGroup=settings found ! Defaulting to Settings/" ;
|
||||
_baseGroup = QLatin1String("Settings/");
|
||||
}
|
||||
}
|
||||
}
|
||||
return _baseGroup;
|
||||
}
|
||||
|
||||
void KCGlobal::repairAccels( QWidget * tw )
|
||||
{
|
||||
const QList<QObject*> &l = tw->children();
|
||||
for (QList<QObject*>::const_iterator it( l.begin() ); it != l.end(); ++it)
|
||||
{
|
||||
QObject *obj = *it;
|
||||
|
||||
if (qobject_cast<Q3Accel*>(obj))
|
||||
qobject_cast<Q3Accel*>(obj)->repairEventFilter();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,57 +17,78 @@
|
|||
|
||||
*/
|
||||
|
||||
#ifndef __global_h__
|
||||
#define __global_h__
|
||||
#ifndef _GLOBAL_H_
|
||||
#define _GLOBAL_H_
|
||||
|
||||
#include <kicontheme.h>
|
||||
#define KINFOCENTER_ICON_NAME "hwinfo"
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
|
||||
|
||||
enum IndexViewMode {Icon, Tree};
|
||||
|
||||
class KCGlobal
|
||||
{
|
||||
class KCGlobal {
|
||||
public:
|
||||
|
||||
static void init();
|
||||
|
||||
static bool isInfoCenter() { return _infocenter; }
|
||||
static bool root() { return _root; }
|
||||
static QStringList types() { return _types; }
|
||||
static QString userName() { return _uname; }
|
||||
static QString hostName() { return _hname; }
|
||||
static QString kdeVersion() { return _kdeversion; }
|
||||
static QString systemName() { return _isystem; }
|
||||
static QString systemRelease() { return _irelease; }
|
||||
static QString systemVersion() { return _iversion; }
|
||||
static QString systemMachine() { return _imachine; }
|
||||
static IndexViewMode viewMode() { return _viewmode; }
|
||||
static KIconLoader::StdSizes iconSize() { return _iconsize; }
|
||||
static bool root() {
|
||||
return _root;
|
||||
}
|
||||
static QStringList types() {
|
||||
return _types;
|
||||
}
|
||||
static QString userName() {
|
||||
return _uname;
|
||||
}
|
||||
static QString hostName() {
|
||||
return _hname;
|
||||
}
|
||||
static QString kdeVersion() {
|
||||
return _kdeversion;
|
||||
}
|
||||
static QString systemName() {
|
||||
return _isystem;
|
||||
}
|
||||
static QString systemRelease() {
|
||||
return _irelease;
|
||||
}
|
||||
static QString systemVersion() {
|
||||
return _iversion;
|
||||
}
|
||||
static QString systemMachine() {
|
||||
return _imachine;
|
||||
}
|
||||
static QString baseGroup();
|
||||
|
||||
static void setIsInfoCenter(bool b) { _infocenter = b; }
|
||||
static void setRoot(bool r) { _root = r; }
|
||||
static void setRoot(bool r) {
|
||||
_root = r;
|
||||
}
|
||||
static void setType(const QByteArray& s);
|
||||
static void setUserName(const QString& n){ _uname = n; }
|
||||
static void setHostName(const QString& n){ _hname = n; }
|
||||
static void setKDEVersion(const QString& n){ _kdeversion = n; }
|
||||
static void setSystemName(const QString& n){ _isystem = n; }
|
||||
static void setSystemRelease(const QString& n){ _irelease = n; }
|
||||
static void setSystemVersion(const QString& n){ _iversion = n; }
|
||||
static void setSystemMachine(const QString& n){ _imachine = n; }
|
||||
static void setViewMode(IndexViewMode m) { _viewmode = m; }
|
||||
static void setIconSize(KIconLoader::StdSizes s) { _iconsize = s; }
|
||||
|
||||
static void repairAccels( QWidget * tw );
|
||||
static void setUserName(const QString& n) {
|
||||
_uname = n;
|
||||
}
|
||||
static void setHostName(const QString& n) {
|
||||
_hname = n;
|
||||
}
|
||||
static void setKDEVersion(const QString& n) {
|
||||
_kdeversion = n;
|
||||
}
|
||||
static void setSystemName(const QString& n) {
|
||||
_isystem = n;
|
||||
}
|
||||
static void setSystemRelease(const QString& n) {
|
||||
_irelease = n;
|
||||
}
|
||||
static void setSystemVersion(const QString& n) {
|
||||
_iversion = n;
|
||||
}
|
||||
static void setSystemMachine(const QString& n) {
|
||||
_imachine = n;
|
||||
}
|
||||
|
||||
private:
|
||||
static bool _root;
|
||||
static bool _infocenter;
|
||||
static QStringList _types;
|
||||
static QString _uname, _hname, _isystem, _irelease, _iversion, _imachine, _kdeversion;
|
||||
static IndexViewMode _viewmode;
|
||||
static KIconLoader::StdSizes _iconsize;
|
||||
static QString _baseGroup;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,89 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "helpwidget.h"
|
||||
#include "global.h"
|
||||
#include "quickhelp.h"
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
#include <kprocess.h>
|
||||
#include <kapplication.h>
|
||||
#include <krun.h>
|
||||
#include <ktoolinvocation.h>
|
||||
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "helpwidget.moc"
|
||||
|
||||
HelpWidget::HelpWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
QVBoxLayout *l = new QVBoxLayout(this);
|
||||
|
||||
_browser = new QuickHelp(this);
|
||||
connect(_browser, SIGNAL(urlClick(const QString &)),
|
||||
SLOT(urlClicked(const QString &)));
|
||||
connect(_browser, SIGNAL(mailClick(const QString &,const QString &)),
|
||||
SLOT(mailClicked(const QString &,const QString &)));
|
||||
|
||||
l->addWidget(_browser);
|
||||
|
||||
setBaseText();
|
||||
}
|
||||
|
||||
void HelpWidget::setText( const QString& docPath, const QString& text)
|
||||
{
|
||||
docpath = docPath;
|
||||
if (text.isEmpty() && docPath.isEmpty())
|
||||
setBaseText();
|
||||
else if (docPath.isEmpty())
|
||||
_browser->setText(text);
|
||||
else
|
||||
{
|
||||
QByteArray a = docPath.toLocal8Bit();
|
||||
QString path = QString::fromLocal8Bit (a.data(), a.size());
|
||||
|
||||
_browser->setText(text + i18n("<p>Use the \"Whats This\" (Shift+F1) to get help on specific options.</p><p>To read the full manual click <a href=\"%1\">here</a>.</p>",
|
||||
path));
|
||||
}
|
||||
}
|
||||
|
||||
void HelpWidget::setBaseText()
|
||||
{
|
||||
_browser->setText(i18n("<h1>KDE Info Center</h1>"
|
||||
"There is no quick help available for the active info module."
|
||||
"<br /><br />"
|
||||
"Click <a href = \"kinfocenter/index.html\">here</a> to read the general Info Center manual.") );
|
||||
}
|
||||
|
||||
void HelpWidget::urlClicked(const QString & _url)
|
||||
{
|
||||
KUrl url(KUrl("help:/"), _url);
|
||||
|
||||
if (url.protocol() == "help" || url.protocol() == "man" || url.protocol() == "info") {
|
||||
KProcess::startDetached("khelpcenter", QStringList() << url.url());
|
||||
} else {
|
||||
new KRun(url, this);
|
||||
}
|
||||
}
|
||||
|
||||
void HelpWidget::mailClicked(const QString &,const QString & addr)
|
||||
{
|
||||
KToolInvocation::invokeMailer(addr, QString());
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __helpwidget_h__
|
||||
#define __helpwidget_h__
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class QuickHelp;
|
||||
|
||||
class HelpWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
HelpWidget(QWidget *parent);
|
||||
|
||||
void setText( const QString& docPath, const QString& text);
|
||||
void setBaseText();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void urlClicked(const QString &);
|
||||
void mailClicked(const QString &,const QString &);
|
||||
|
||||
private:
|
||||
QuickHelp *_browser;
|
||||
QString docpath;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -18,120 +18,85 @@
|
|||
*/
|
||||
|
||||
#include "indexwidget.h"
|
||||
#include "moduletreeview.h"
|
||||
#include "moduleiconview.h"
|
||||
|
||||
#include <Qt3Support/Q3CheckListItem>
|
||||
#include <QWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
|
||||
#include "moduletreeview.h"
|
||||
|
||||
#include <kdebug.h>
|
||||
#include <klocale.h>
|
||||
|
||||
#include "indexwidget.moc"
|
||||
|
||||
IndexWidget::IndexWidget(ConfigModuleList *modules, QWidget *parent ,const char *)
|
||||
: QStackedWidget(parent)
|
||||
, _tree(0L)
|
||||
, _icon(0L)
|
||||
, _modules(modules)
|
||||
, viewMode(Icon)
|
||||
{
|
||||
activateView(Icon);
|
||||
}
|
||||
IndexWidget::IndexWidget(ConfigModuleList *modules, QWidget *parent) :
|
||||
QWidget(parent) {
|
||||
|
||||
IndexWidget::~IndexWidget() {}
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout();
|
||||
setLayout(mainLayout);
|
||||
|
||||
void IndexWidget::reload()
|
||||
{
|
||||
if (_icon)
|
||||
_icon->fill();
|
||||
}
|
||||
_tree=new ModuleTreeView(modules, this);
|
||||
|
||||
Q3ListViewItem *IndexWidget::firstTreeViewItem()
|
||||
{
|
||||
if (_tree)
|
||||
return _tree->firstChild();
|
||||
else
|
||||
return 0L;
|
||||
}
|
||||
QHBoxLayout* searchLayout = new QHBoxLayout();
|
||||
searchLayout->setMargin(0);
|
||||
|
||||
void IndexWidget::moduleSelected(ConfigModule *m)
|
||||
{
|
||||
const QObject *obj = sender();
|
||||
if(!m) return;
|
||||
QLabel* searchLabel = new QLabel(i18n("Filter:"), this);
|
||||
_searchLine = new ModuleWidgetSearchLine(this, _tree);
|
||||
searchLabel->setBuddy(_searchLine);
|
||||
|
||||
emit moduleActivated(m);
|
||||
searchLayout->addWidget(searchLabel);
|
||||
searchLayout->addWidget(_searchLine);
|
||||
|
||||
if (obj->inherits("ModuleIconView") && _tree)
|
||||
{
|
||||
_tree->makeVisible(m);
|
||||
|
||||
_tree->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
|
||||
_tree->makeSelected(m);
|
||||
connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
else if (obj->inherits("ModuleTreeView") && _icon)
|
||||
{
|
||||
_icon->makeVisible(m);
|
||||
|
||||
_icon->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
|
||||
_icon->makeSelected(m);
|
||||
connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
}
|
||||
|
||||
void IndexWidget::makeSelected(ConfigModule *module)
|
||||
{
|
||||
if (_icon)
|
||||
{
|
||||
_icon->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
|
||||
_icon->makeSelected(module);
|
||||
connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
if (_tree)
|
||||
{
|
||||
_tree->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
|
||||
_tree->makeSelected(module);
|
||||
connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
}
|
||||
|
||||
void IndexWidget::makeVisible(ConfigModule *module)
|
||||
{
|
||||
if (_icon)
|
||||
_icon->makeVisible(module);
|
||||
if (_tree)
|
||||
_tree->makeVisible(module);
|
||||
}
|
||||
|
||||
void IndexWidget::activateView(IndexViewMode mode)
|
||||
{
|
||||
viewMode = mode;
|
||||
|
||||
if (mode == Icon)
|
||||
{
|
||||
if (!_icon)
|
||||
{
|
||||
_icon=new ModuleIconView(_modules, this);
|
||||
addWidget (_icon);
|
||||
_icon->fill();
|
||||
connect(_icon, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
setCurrentWidget( _icon );
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_tree)
|
||||
{
|
||||
_tree=new ModuleTreeView(_modules, this);
|
||||
addWidget (_tree);
|
||||
_tree->fill();
|
||||
connect(_tree, SIGNAL(moduleSelected(ConfigModule*)),
|
||||
this, SLOT(moduleSelected(ConfigModule*)));
|
||||
connect(_tree, SIGNAL(categorySelected(Q3ListViewItem*)),
|
||||
this, SIGNAL(categorySelected(Q3ListViewItem*)));
|
||||
connectTree();
|
||||
|
||||
mainLayout->addLayout(searchLayout);
|
||||
mainLayout->addWidget(_tree);
|
||||
|
||||
kDebug() << "Index Widget initialized" << endl;
|
||||
}
|
||||
setCurrentWidget( _tree );
|
||||
|
||||
IndexWidget::~IndexWidget() {
|
||||
}
|
||||
|
||||
void IndexWidget::reload() {
|
||||
}
|
||||
|
||||
void IndexWidget::selectModule(ConfigModule *module) {
|
||||
kDebug() << "Selecting module..." << endl;
|
||||
|
||||
ModuleTreeItem* moduleTreeItem = _tree->findMatchingItem(module);
|
||||
|
||||
disconnectTree();
|
||||
|
||||
_tree->scrollToItem(moduleTreeItem);
|
||||
moduleTreeItem->setSelected(true);
|
||||
|
||||
connectTree();
|
||||
|
||||
emit moduleActivated(module);
|
||||
}
|
||||
|
||||
void IndexWidget::selectGeneral() {
|
||||
_tree->scrollToItem(_tree->generalItem());
|
||||
|
||||
disconnectTree();
|
||||
|
||||
_tree->generalItem()->setSelected(true);
|
||||
|
||||
connectTree();
|
||||
|
||||
emit generalActivated();
|
||||
}
|
||||
|
||||
void IndexWidget::connectTree() {
|
||||
connect(_tree, SIGNAL(moduleSelected(ConfigModule*)), this, SLOT(selectModule(ConfigModule*)));
|
||||
connect(_tree, SIGNAL(generalSelected()), this, SLOT(selectGeneral()));
|
||||
}
|
||||
|
||||
void IndexWidget::disconnectTree() {
|
||||
_tree->disconnect(SIGNAL(generalSelected()));
|
||||
_tree->disconnect(SIGNAL(moduleSelected(ConfigModule*)));
|
||||
}
|
||||
|
|
|
@ -21,40 +21,41 @@
|
|||
|
||||
#include "global.h"
|
||||
|
||||
#include <QStackedWidget>
|
||||
#include <QWidget>
|
||||
|
||||
class QListWidgetItem;
|
||||
|
||||
class ConfigModuleList;
|
||||
class ConfigModule;
|
||||
class ModuleTreeView;
|
||||
class ModuleIconView;
|
||||
class Q3ListViewItem;
|
||||
class IndexWidget : public QStackedWidget
|
||||
{
|
||||
class ModuleTreeItem;
|
||||
class ModuleWidgetSearchLine;
|
||||
|
||||
class IndexWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
IndexWidget(ConfigModuleList *list, QWidget *parent, const char *name=0);
|
||||
IndexWidget(ConfigModuleList *list, QWidget *parent);
|
||||
virtual ~IndexWidget();
|
||||
|
||||
Q3ListViewItem *firstTreeViewItem();
|
||||
public Q_SLOTS:
|
||||
void makeVisible(ConfigModule *module);
|
||||
void makeSelected(ConfigModule *module);
|
||||
void activateView(IndexViewMode);
|
||||
public slots:
|
||||
void reload();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void moduleSelected(ConfigModule *);
|
||||
void selectGeneral();
|
||||
void selectModule(ConfigModule *);
|
||||
|
||||
Q_SIGNALS:
|
||||
signals:
|
||||
void generalActivated();
|
||||
void moduleActivated(ConfigModule *module);
|
||||
void categorySelected(Q3ListViewItem *);
|
||||
|
||||
private:
|
||||
|
||||
void connectTree();
|
||||
void disconnectTree();
|
||||
|
||||
ModuleTreeView *_tree;
|
||||
ModuleIconView *_icon;
|
||||
ConfigModuleList *_modules;
|
||||
IndexViewMode viewMode;
|
||||
|
||||
ModuleWidgetSearchLine* _searchLine;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,33 +1,35 @@
|
|||
# TODO: HAVE_COREAUDIO (for OSX)
|
||||
# TODO: HAVE_LIBDEVINFO_H (for Solaris 7 and later)
|
||||
# to be set if both -ldevinfo and libdevinfo.h exist
|
||||
|
||||
check_include_files(devinfo.h HAVE_DEVINFO_H) # info_fbsd.cpp
|
||||
check_include_files(fstab.h HAVE_FSTAB_H) # info_linux.cpp
|
||||
check_include_files(linux/raw.h HAVE_LINUX_RAW_H) # info_linux.cpp
|
||||
check_include_files(mntent.h HAVE_MNTENT_H) # info_linux.cpp
|
||||
check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) # info_linux.cpp
|
||||
check_include_files(sys/raw.h HAVE_SYS_RAW_H) # info_linux.cpp
|
||||
check_include_files(Alib.h HAVE_ALIB_H) # info_hpux.cpp
|
||||
# OS Base includes
|
||||
include(../base/CMakeLists.txt)
|
||||
|
||||
configure_file (config-infocenter.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-infocenter.h )
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../base
|
||||
)
|
||||
|
||||
########### next target ###############
|
||||
|
||||
set(kcm_info_PART_SRCS main.cpp memory.cpp )
|
||||
|
||||
set(kcm_info_PART_SRCS main.cpp info.cpp ../base/os_current.cpp )
|
||||
|
||||
kde4_add_plugin(kcm_info ${kcm_info_PART_SRCS})
|
||||
|
||||
target_link_libraries(kcm_info ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} ${X11_X11_LIB})
|
||||
|
||||
target_link_libraries(kcm_info ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} ${QT_QT3SUPPORT_LIBRARY} ${X11_X11_LIB})
|
||||
|
||||
install(TARGETS kcm_info DESTINATION ${PLUGIN_INSTALL_DIR} )
|
||||
|
||||
|
||||
########### install files ###############
|
||||
|
||||
install(FILES memory.desktop
|
||||
# processor.desktop # currently broken
|
||||
dma.desktop interrupts.desktop ioports.desktop pci.desktop sound.desktop devices.desktop scsi.desktop partitions.desktop xserver.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
|
||||
install(
|
||||
FILES
|
||||
dma.desktop
|
||||
interrupts.desktop
|
||||
ioports.desktop
|
||||
sound.desktop
|
||||
devices.desktop
|
||||
scsi.desktop
|
||||
partitions.desktop
|
||||
xserver.desktop
|
||||
DESTINATION ${SERVICES_INSTALL_DIR}
|
||||
)
|
||||
|
||||
|
|
|
@ -4,498 +4,101 @@
|
|||
|
||||
(C) 1998-2003 by Helge Deller <deller@kde.org>
|
||||
|
||||
** main.cpp includes this file ! **
|
||||
|
||||
This source-file includes another system-dependet sourcefile called
|
||||
info_<systemname>.cpp
|
||||
which should define one or more of the following defines to
|
||||
indicate, that this information is really available.
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
right now, there is the problem, that also the .desktop-files should
|
||||
depend on the systemname, so that only available .desktop-files will
|
||||
be copied to kde/applnk/Settings/Information !!
|
||||
*/
|
||||
|
||||
#include <Qt3Support/Q3Header>
|
||||
#include <klocale.h>
|
||||
#include "info.h"
|
||||
|
||||
#include <QLayout>
|
||||
#include <QProcess>
|
||||
//Added by qt3to4:
|
||||
#include <QLabel>
|
||||
#include <QHBoxLayout>
|
||||
#include <QTextStream>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include <kglobalsettings.h>
|
||||
#include <kiconloader.h>
|
||||
#include <kdialog.h>
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "info.h" /* include the forward declares... */
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
/* All Functions GetInfo_xyz() can set GetInfo_ErrorString, when a special
|
||||
error-message should be shown to the user....
|
||||
If GetInfo_ErrorString is not modified in the function, the default string
|
||||
DEFAULT_ERRORSTRING will be used...
|
||||
*/
|
||||
|
||||
static QString *GetInfo_ErrorString; /* should always point to:
|
||||
KInfoListWidget::ErrorString */
|
||||
static bool sorting_allowed; /* is sorting allowed by user ? */
|
||||
|
||||
|
||||
|
||||
#if defined(__linux__)
|
||||
# define DEFAULT_ERRORSTRING QString() /* i18n("Maybe the proc-filesystem is not enabled in Linux-Kernel.") */
|
||||
#elif defined(__hpux)
|
||||
# define DEFAULT_ERRORSTRING QString()
|
||||
#else
|
||||
#define DEFAULT_ERRORSTRING i18n("This system may not be completely supported yet.")
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* easier to read with such a define ! */
|
||||
#define I18N_MAX(txt,in,fm,maxw) \
|
||||
{ int n = fm.width(txt=in); if (n>maxw) maxw=n; }
|
||||
|
||||
#define PIXEL_ADD 20 // add x Pixel to multicolumns..
|
||||
|
||||
#define HEXDIGITS (sizeof(int)*8/4) /* 4 Bytes = 32 Bits = 8 Hex-Digits */
|
||||
|
||||
static const QString Value( int val, int numbers=1 )
|
||||
{
|
||||
return KGlobal::locale()->formatNumber(val, 0).rightJustified(numbers);
|
||||
}
|
||||
|
||||
static const QString HexStr(unsigned long val, int digits )
|
||||
{
|
||||
QString hexstr;
|
||||
int i;
|
||||
hexstr = QString::fromLatin1("0x%1").arg(val, digits, 16/*=HEX*/);
|
||||
for (i=hexstr.length()-1; i>0; --i)
|
||||
if (hexstr[i]==' ')
|
||||
hexstr[i] = '0';
|
||||
return hexstr;
|
||||
}
|
||||
|
||||
static struct _event_table {
|
||||
const char *name;
|
||||
long value;
|
||||
} event_table[] = {
|
||||
{ "KeyPressMask", KeyPressMask },
|
||||
{ "KeyReleaseMask", KeyReleaseMask },
|
||||
{ "ButtonPressMask", ButtonPressMask },
|
||||
{ "ButtonReleaseMask", ButtonReleaseMask },
|
||||
{ "EnterWindowMask", EnterWindowMask },
|
||||
{ "LeaveWindowMask", LeaveWindowMask },
|
||||
{ "PointerMotionMask", PointerMotionMask },
|
||||
{ "PointerMotionHintMask", PointerMotionHintMask },
|
||||
{ "Button1MotionMask", Button1MotionMask },
|
||||
{ "Button2MotionMask", Button2MotionMask },
|
||||
{ "Button3MotionMask", Button3MotionMask },
|
||||
{ "Button4MotionMask", Button4MotionMask },
|
||||
{ "Button5MotionMask", Button5MotionMask },
|
||||
{ "ButtonMotionMask", ButtonMotionMask },
|
||||
{ "KeymapStateMask", KeymapStateMask },
|
||||
{ "ExposureMask", ExposureMask },
|
||||
{ "VisibilityChangeMask", VisibilityChangeMask },
|
||||
{ "StructureNotifyMask", StructureNotifyMask },
|
||||
{ "ResizeRedirectMask", ResizeRedirectMask },
|
||||
{ "SubstructureNotifyMask", SubstructureNotifyMask },
|
||||
{ "SubstructureRedirectMask",SubstructureRedirectMask },
|
||||
{ "FocusChangeMask", FocusChangeMask },
|
||||
{ "PropertyChangeMask", PropertyChangeMask },
|
||||
{ "ColormapChangeMask", ColormapChangeMask },
|
||||
{ "OwnerGrabButtonMask", OwnerGrabButtonMask },
|
||||
{ 0L, 0 }};
|
||||
|
||||
|
||||
static Q3ListViewItem* XServer_fill_screen_info( Q3ListViewItem *lBox, Q3ListViewItem *last,
|
||||
Display *dpy, int scr, int default_scr)
|
||||
{
|
||||
unsigned width, height;
|
||||
double xres, yres;
|
||||
int i,
|
||||
ndepths,
|
||||
*depths;
|
||||
Screen *s = ScreenOfDisplay(dpy,scr); /* opaque structure */
|
||||
Q3ListViewItem *item;
|
||||
|
||||
/*
|
||||
* there are 2.54 centimeters to an inch; so there are 25.4 millimeters.
|
||||
*
|
||||
* dpi = N pixels / (M millimeters / (25.4 millimeters / 1 inch))
|
||||
* = N pixels / (M inch / 25.4)
|
||||
* = N * 25.4 pixels / M inch
|
||||
*/
|
||||
|
||||
xres = ((double)(DisplayWidth(dpy,scr) *25.4)/DisplayWidthMM(dpy,scr) );
|
||||
yres = ((double)(DisplayHeight(dpy,scr)*25.4)/DisplayHeightMM(dpy,scr));
|
||||
|
||||
item = new Q3ListViewItem(lBox,last, ki18n("Screen # %1").subs((int)scr,-1).toString(),
|
||||
(scr==default_scr) ? i18n("(Default Screen)") : QString() );
|
||||
item->setExpandable(true);
|
||||
if (scr==default_scr)
|
||||
item->setOpen(true);
|
||||
last = new Q3ListViewItem(item, i18n("Dimensions"),
|
||||
i18n("%1 x %2 Pixel (%3 x %4 mm)",
|
||||
(int)DisplayWidth(dpy,scr) ,
|
||||
(int)DisplayHeight(dpy,scr) ,
|
||||
(int)DisplayWidthMM(dpy,scr) ,
|
||||
(int)DisplayHeightMM (dpy,scr) ));
|
||||
|
||||
last = new Q3ListViewItem(item, last, i18n("Resolution"),
|
||||
i18n("%1 x %2 dpi",
|
||||
(int)(xres+0.5) ,
|
||||
(int)(yres+0.5) ));
|
||||
|
||||
ndepths = 0;
|
||||
depths = 0;
|
||||
depths = XListDepths (dpy, scr, &ndepths);
|
||||
if (depths) {
|
||||
QString txt;
|
||||
|
||||
for (i = 0; i < ndepths; i++) {
|
||||
txt = txt + Value(depths[i]);
|
||||
if (i < ndepths - 1)
|
||||
txt = txt + QLatin1String(", ");
|
||||
}
|
||||
|
||||
last = new Q3ListViewItem(item, last, ki18n("Depths (%1)").subs(ndepths,-1).toString(), txt);
|
||||
XFree((char *) depths);
|
||||
}
|
||||
|
||||
last = new Q3ListViewItem(item, last, i18n("Root Window ID"),
|
||||
HexStr((unsigned long)RootWindow(dpy,scr),HEXDIGITS));
|
||||
last = new Q3ListViewItem(item, last, i18n("Depth of Root Window"),
|
||||
(DisplayPlanes (dpy, scr) == 1)
|
||||
? i18n("%1 plane", DisplayPlanes(dpy,scr)) /*singular*/
|
||||
: i18n("%1 planes", DisplayPlanes(dpy,scr)));/*plural*/
|
||||
last = new Q3ListViewItem(item, last, i18n("Number of Colormaps"),
|
||||
i18n("minimum %1, maximum %2",
|
||||
(int)MinCmapsOfScreen(s), (int)MaxCmapsOfScreen(s)));
|
||||
last = new Q3ListViewItem(item, last, i18n("Default Colormap"),
|
||||
Value((int)DefaultColormap(dpy,scr)));
|
||||
last = new Q3ListViewItem(item, last, i18n("Default Number of Colormap Cells"),
|
||||
Value((int)DisplayCells(dpy, scr)));
|
||||
last = new Q3ListViewItem(item, last, i18n("Preallocated Pixels"),
|
||||
i18n("Black %1, White %2",
|
||||
KGlobal::locale()->formatNumber(BlackPixel(dpy,scr), 0),
|
||||
KGlobal::locale()->formatNumber(WhitePixel(dpy,scr), 0)));
|
||||
|
||||
QString YES(i18n("Yes"));
|
||||
QString NO(i18n("No"));
|
||||
last = new Q3ListViewItem(item, last, i18n("Options"),
|
||||
i18n("backing-store: %1, save-unders: %2",
|
||||
(DoesBackingStore(s) == NotUseful) ? NO :
|
||||
((DoesBackingStore(s) == Always) ? YES : i18n("When mapped")) ,
|
||||
DoesSaveUnders(s) ? YES : NO ));
|
||||
|
||||
XQueryBestSize (dpy, CursorShape, RootWindow(dpy,scr), 65535, 65535,
|
||||
&width, &height);
|
||||
last = new Q3ListViewItem(item, last, i18n("Largest Cursor"),
|
||||
(width == 65535 && height == 65535)
|
||||
? i18n("unlimited") : QString::fromLatin1("%1 x %2").arg(width).arg(height));
|
||||
|
||||
last = new Q3ListViewItem(item, last, i18n("Current Input Event Mask"),
|
||||
HexStr((unsigned long)EventMaskOfScreen(s),HEXDIGITS));
|
||||
item = last;
|
||||
struct _event_table *etp;
|
||||
for (etp=event_table; etp->name; etp++) {
|
||||
if (EventMaskOfScreen(s) & etp->value)
|
||||
item = new Q3ListViewItem(last, item,
|
||||
i18n("Event = %1", HexStr(etp->value,HEXDIGITS)),
|
||||
etp->name );
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
static const QString Order( int order )
|
||||
{
|
||||
if (order==LSBFirst) return i18n("LSBFirst"); else
|
||||
if (order==MSBFirst) return i18n("MSBFirst"); else
|
||||
return i18n("Unknown Order %1", order);
|
||||
}
|
||||
|
||||
static const QString BitString( unsigned long n )
|
||||
{
|
||||
return i18np("1 Bit", "%1 Bits", n); // singular & plural form of "%d Bit"
|
||||
}
|
||||
|
||||
static const QString ByteString( unsigned long n )
|
||||
{
|
||||
/* explanation in BR #52640 (http://bugs.kde.org/show_bug.cgi?id=52640) */
|
||||
if (n == 1)
|
||||
return i18n("1 Byte"); // singular form: "1 Byte" (yes, it is "1", not "%1"!)
|
||||
|
||||
return i18n("%1 Bytes", // plural form: "%1 Bytes"
|
||||
KGlobal::locale()->formatNumber(n,0));
|
||||
}
|
||||
|
||||
static bool GetInfo_XServer_Generic( Q3ListView *lBox )
|
||||
{
|
||||
/* Many parts of this source are taken from the X11-program "xdpyinfo" */
|
||||
|
||||
int i,n;
|
||||
long req_size;
|
||||
|
||||
Display *dpy;
|
||||
XPixmapFormatValues *pmf;
|
||||
|
||||
QString str,txt;
|
||||
Q3ListViewItem *last, *item, *next;
|
||||
|
||||
dpy = XOpenDisplay(0);
|
||||
if (!dpy)
|
||||
return false;
|
||||
|
||||
lBox->addColumn(i18n("Information") );
|
||||
lBox->addColumn(i18n("Value") );
|
||||
sorting_allowed = false;
|
||||
|
||||
next = new Q3ListViewItem(lBox, i18n("Server Information"));
|
||||
next->setPixmap(0, SmallIcon("xorg"));
|
||||
next->setOpen(true);
|
||||
next->setSelectable(false);
|
||||
next->setExpandable(false);
|
||||
|
||||
last = new Q3ListViewItem(next, i18n("Name of the Display"),
|
||||
DisplayString(dpy));
|
||||
|
||||
last = new Q3ListViewItem(next, last, i18n("Vendor String"), QLatin1String(ServerVendor(dpy)));
|
||||
last = new Q3ListViewItem(next, last, i18n("Vendor Release Number"),
|
||||
Value((int)VendorRelease(dpy)));
|
||||
|
||||
last = new Q3ListViewItem(next, last, i18n("Version Number"),
|
||||
QString::fromLatin1("%1.%2").arg((int)ProtocolVersion(dpy))
|
||||
.arg((int)ProtocolRevision(dpy)));
|
||||
|
||||
last = item = new Q3ListViewItem(next, last, i18n("Available Screens"));
|
||||
last->setOpen(true);
|
||||
last->setExpandable(true);
|
||||
for (i=0; i<ScreenCount(dpy); i++) {
|
||||
item = XServer_fill_screen_info(last, item, dpy, i, (int)DefaultScreen(dpy));
|
||||
if (i==0) item->setOpen(true);
|
||||
}
|
||||
|
||||
last = new Q3ListViewItem( next, last, i18n("Supported Extensions") );
|
||||
item = last;
|
||||
|
||||
int extCount;
|
||||
char **extensions = XListExtensions( dpy, &extCount );
|
||||
for ( i = 0; i < extCount; i++ ) {
|
||||
item = new Q3ListViewItem( last, item, QLatin1String( extensions[i] ) );
|
||||
}
|
||||
XFreeExtensionList( extensions );
|
||||
|
||||
pmf = XListPixmapFormats(dpy, &n);
|
||||
last = item = new Q3ListViewItem(next, last, i18n("Supported Pixmap Formats"));
|
||||
if (pmf) {
|
||||
last->setExpandable(true);
|
||||
for (i=0; i<n; i++) {
|
||||
item = new Q3ListViewItem(last, item,
|
||||
i18n("Pixmap Format #%1", i+1),
|
||||
i18n("%1 BPP, Depth: %2, Scanline padding: %3",
|
||||
pmf[i].bits_per_pixel,
|
||||
BitString(pmf[i].depth),
|
||||
BitString(pmf[i].scanline_pad)));
|
||||
}
|
||||
XFree ((char *)pmf);
|
||||
}
|
||||
|
||||
req_size = XExtendedMaxRequestSize(dpy);
|
||||
if (!req_size) req_size = XMaxRequestSize(dpy);
|
||||
last = new Q3ListViewItem(next, last, i18n("Maximum Request Size"),
|
||||
ByteString(req_size*4));
|
||||
last = new Q3ListViewItem(next, last, i18n("Motion Buffer Size"),
|
||||
ByteString(XDisplayMotionBufferSize(dpy)));
|
||||
|
||||
last = item = new Q3ListViewItem(next, last, i18n("Bitmap"));
|
||||
last->setExpandable(true);
|
||||
item = new Q3ListViewItem(last, item, i18n("Unit"),
|
||||
Value(BitmapUnit(dpy)) );
|
||||
item = new Q3ListViewItem(last, item, i18n("Order"),
|
||||
Order(BitmapBitOrder(dpy)));
|
||||
item = new Q3ListViewItem(last, item, i18n("Padding"),
|
||||
Value(BitmapPad(dpy)));
|
||||
|
||||
last = new Q3ListViewItem(next, last, i18n("Image Byte Order"),
|
||||
Order(ImageByteOrder(dpy)));
|
||||
|
||||
XCloseDisplay (dpy);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
***************************************************************************
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
void KInfoListWidget::load()
|
||||
{
|
||||
bool ok = false;
|
||||
|
||||
lBox->clear();
|
||||
|
||||
/* Delete the user-visible ErrorString, before calling the
|
||||
retrieve-function. If the function wants the widget to show
|
||||
another string, then it change *GetInfo_ErrorString ! */
|
||||
ErrorString = i18n("No information available about %1.", title)
|
||||
+ QLatin1String("\n\n") + DEFAULT_ERRORSTRING;
|
||||
GetInfo_ErrorString = &ErrorString; /* save the address of ErrorString */
|
||||
|
||||
sorting_allowed = true; /* the functions may set that */
|
||||
lBox->setSorting(-1); /* No Sorting per default */
|
||||
|
||||
if (getlistbox)
|
||||
ok = (*getlistbox)(lBox); /* retrieve the information */
|
||||
|
||||
if (lBox->header()->count()<=1)
|
||||
lBox->addColumn(title); /* set default title */
|
||||
|
||||
/* is the user allowed to use sorting ? */
|
||||
lBox->header()->setClickEnabled(sorting_allowed);
|
||||
lBox->header()->setFont(KGlobalSettings::generalFont());
|
||||
lBox->setShowSortIndicator(sorting_allowed);
|
||||
|
||||
if (ok)
|
||||
{
|
||||
widgetStack->setCurrentWidget(lBox);
|
||||
}
|
||||
else
|
||||
{
|
||||
NoInfoText->setText(ErrorString);
|
||||
widgetStack->setCurrentWidget(NoInfoText);
|
||||
}
|
||||
|
||||
emit changed(false);
|
||||
}
|
||||
|
||||
|
||||
QString KInfoListWidget::quickHelp() const
|
||||
{
|
||||
return i18n("<h1>System Information</h1>"
|
||||
" All the information modules return information about a certain"
|
||||
" aspect of your computer hardware or your operating system."
|
||||
" Not all modules are available on all hardware architectures"
|
||||
" and/or operating systems." );
|
||||
}
|
||||
|
||||
|
||||
KInfoListWidget::KInfoListWidget(const KComponentData &inst,const QString &_title, QWidget *parent,
|
||||
bool _getlistbox(Q3ListView *lbox))
|
||||
: KCModule(inst,parent),
|
||||
title(_title)
|
||||
{
|
||||
KAboutData *about =
|
||||
new KAboutData(I18N_NOOP("kcminfo"), 0,
|
||||
KInfoListWidget::KInfoListWidget(const KComponentData &inst, const QString &_title, QWidget *parent, bool _getlistbox(QTreeWidget *tree) ) :
|
||||
KCModule(inst, parent), title(_title) {
|
||||
KAboutData *about = new KAboutData(I18N_NOOP("kcminfo"), 0,
|
||||
ki18n("KDE Panel System Information Control Module"),
|
||||
0, KLocalizedString(), KAboutData::License_GPL,
|
||||
ki18n("(c) 1998 - 2002 Helge Deller"));
|
||||
ki18n( "(c) 2008 Nicolas Ternisien\n"
|
||||
"(c) 1998 - 2002 Helge Deller"));
|
||||
|
||||
about->addAuthor(ki18n("Nicolas Ternisien"), KLocalizedString(), "nicolas.ternisien@gmail.com");
|
||||
about->addAuthor(ki18n("Helge Deller"), KLocalizedString(), "deller@kde.org");
|
||||
setAboutData(about);
|
||||
|
||||
setButtons(KCModule::Help);
|
||||
kDebug() << "Constructing a KInfoListWidget..." << endl;
|
||||
|
||||
//setButtons(KCModule::Help);
|
||||
getlistbox = _getlistbox;
|
||||
GetInfo_ErrorString = 0;
|
||||
QHBoxLayout *layout = new QHBoxLayout(this);
|
||||
layout->setSpacing(KDialog::spacingHint());
|
||||
layout->setMargin(0);
|
||||
widgetStack = new QStackedWidget(this);
|
||||
layout->addWidget(widgetStack);
|
||||
lBox = new Q3ListView(widgetStack);
|
||||
widgetStack->insertWidget(0,lBox);
|
||||
lBox->setMinimumSize(200,120);
|
||||
lBox->setFont(KGlobalSettings::generalFont()); /* default font */
|
||||
lBox->setAllColumnsShowFocus(true);
|
||||
lBox->setWhatsThis( i18n( "This list displays system information on the selected category." ) );
|
||||
NoInfoText = new QLabel(widgetStack);
|
||||
widgetStack->insertWidget(1,NoInfoText);
|
||||
NoInfoText->setAlignment( Qt::AlignCenter );
|
||||
NoInfoText->setWordWrap( true );
|
||||
widgetStack->setCurrentWidget(NoInfoText);
|
||||
load();
|
||||
|
||||
tree = new QTreeWidget(widgetStack);
|
||||
widgetStack->addWidget(tree);
|
||||
tree->setMinimumSize(200, 120);
|
||||
tree->setFont(KGlobalSettings::generalFont()); /* default font */
|
||||
tree->setSortingEnabled(true);
|
||||
tree->setRootIsDecorated(false);
|
||||
tree->header()->setSortIndicatorShown(true);
|
||||
tree->setWhatsThis(i18n("This list displays system information on the selected category.") );
|
||||
|
||||
noInfoText = new QLabel(widgetStack);
|
||||
widgetStack->addWidget(noInfoText);
|
||||
noInfoText->setAlignment(Qt::AlignCenter);
|
||||
noInfoText->setWordWrap( true);
|
||||
widgetStack->setCurrentWidget(noInfoText);
|
||||
|
||||
}
|
||||
|
||||
void KInfoListWidget::load() {
|
||||
kDebug() << "Loading KInfoListWidget..." << endl;
|
||||
|
||||
//TODO Remove tree content before clear it
|
||||
tree->clear();
|
||||
|
||||
errorString = i18n("No information available about %1.", title) + QLatin1String("\n\n") + DEFAULT_ERRORSTRING;
|
||||
|
||||
/* No Sorting per default */
|
||||
tree->setSortingEnabled(false);
|
||||
|
||||
bool ok = false;
|
||||
/* retrieve the information */
|
||||
if (getlistbox) {
|
||||
ok = (*getlistbox)(tree);
|
||||
}
|
||||
|
||||
/* set default title */
|
||||
if (tree->headerItem()->columnCount()<=1) {
|
||||
QStringList headers;
|
||||
headers << title;
|
||||
tree->setHeaderLabels(headers);
|
||||
}
|
||||
|
||||
if (ok) {
|
||||
widgetStack->setCurrentWidget(tree);
|
||||
} else {
|
||||
noInfoText->setText(errorString);
|
||||
widgetStack->setCurrentWidget(noInfoText);
|
||||
}
|
||||
|
||||
tree->resizeColumnToContents(0);
|
||||
|
||||
emit changed(false);
|
||||
}
|
||||
|
||||
QString KInfoListWidget::quickHelp() const {
|
||||
return i18n("All the information modules return information about a certain"
|
||||
" aspect of your computer hardware or your operating system.");
|
||||
}
|
||||
|
||||
|
||||
/* Helper-function to read output from an external program */
|
||||
static int GetInfo_ReadfromPipe( Q3ListView *lBox, const char *FileName, bool WithEmptyLines = true )
|
||||
{
|
||||
QProcess proc;
|
||||
Q3ListViewItem* olditem = 0L;
|
||||
QString s;
|
||||
|
||||
proc.start(FileName, QIODevice::ReadOnly);
|
||||
if (!proc.waitForFinished()) {
|
||||
// Process hanged or did not start
|
||||
return 0;
|
||||
}
|
||||
|
||||
QTextStream t(&proc);
|
||||
|
||||
while (!t.atEnd()) {
|
||||
s = t.readLine();
|
||||
if (!WithEmptyLines && s.length()==0)
|
||||
continue;
|
||||
olditem = new Q3ListViewItem(lBox, olditem, s);
|
||||
}
|
||||
|
||||
return (lBox->childCount());
|
||||
}
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
** Include system-specific code **
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifdef __linux__
|
||||
#include "info_linux.cpp"
|
||||
#elif defined(sgi) && sgi
|
||||
#include "info_sgi.cpp"
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
#include "info_fbsd.cpp"
|
||||
#elif __hpux
|
||||
#include "info_hpux.cpp"
|
||||
#elif __NetBSD__
|
||||
#include "info_netbsd.cpp"
|
||||
#elif __OpenBSD__
|
||||
#include "info_openbsd.cpp"
|
||||
#elif defined(__svr4__) && defined(sun)
|
||||
#include "info_solaris.cpp"
|
||||
#elif __svr4__
|
||||
#include "info_svr4.cpp"
|
||||
#elif _AIX
|
||||
#include "info_aix.cpp"
|
||||
#elif defined(__APPLE__)
|
||||
#include "info_osx.cpp"
|
||||
#else
|
||||
#include "info_generic.cpp" /* Default for unsupported systems.... */
|
||||
#endif
|
||||
|
||||
/*
|
||||
***************************************************************************
|
||||
** End of: Include system-specific code **
|
||||
***************************************************************************
|
||||
*/
|
||||
|
|
|
@ -6,43 +6,30 @@
|
|||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
#include <Qt3Support/Q3CheckListItem>
|
||||
#include <QTreeWidget>
|
||||
#include <QFile>
|
||||
#include <QEvent>
|
||||
|
||||
#include <kcmodule.h>
|
||||
#include <kaboutdata.h>
|
||||
|
||||
#include "config-infocenter.h"
|
||||
|
||||
/* function call-back-prototypes... */
|
||||
|
||||
bool GetInfo_CPU( Q3ListView *lBox );
|
||||
bool GetInfo_IRQ( Q3ListView *lBox );
|
||||
bool GetInfo_DMA( Q3ListView *lBox );
|
||||
bool GetInfo_PCI( Q3ListView *lBox );
|
||||
bool GetInfo_IO_Ports( Q3ListView *lBox );
|
||||
bool GetInfo_Sound( Q3ListView *lBox );
|
||||
bool GetInfo_Devices( Q3ListView *lBox );
|
||||
bool GetInfo_SCSI( Q3ListView *lBox );
|
||||
bool GetInfo_Partitions( Q3ListView *lBox );
|
||||
bool GetInfo_XServer_and_Video( Q3ListView *lBox );
|
||||
#include "os_current.h"
|
||||
|
||||
class KInfoListWidget : public KCModule
|
||||
{
|
||||
public:
|
||||
KInfoListWidget(const KComponentData &inst,const QString &_title, QWidget *parent, bool _getlistbox (Q3ListView *)=0);
|
||||
KInfoListWidget(const KComponentData &inst,const QString &_title, QWidget *parent, bool _getlistbox (QTreeWidget*) = NULL);
|
||||
|
||||
virtual void load();
|
||||
virtual QString quickHelp() const;
|
||||
|
||||
private:
|
||||
Q3ListView *lBox;
|
||||
bool (*getlistbox) (Q3ListView *);
|
||||
QTreeWidget* tree;
|
||||
bool (*getlistbox) (QTreeWidget*);
|
||||
QString title;
|
||||
|
||||
QLabel *NoInfoText;
|
||||
QString ErrorString;
|
||||
QLabel *noInfoText;
|
||||
QString errorString;
|
||||
QStackedWidget *widgetStack;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,486 +0,0 @@
|
|||
/*
|
||||
* info_aix.cpp
|
||||
*
|
||||
* Reza Arbab <arbab@austin.ibm.com>
|
||||
*
|
||||
* GetInfo_Partitions() and its helpers (get_fs_usage, fs_adjust_blocks)
|
||||
* taken from info_hpux.cpp.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <cf.h>
|
||||
#define class _class
|
||||
#include <odmi.h>
|
||||
#include <sys/cfgodm.h>
|
||||
#include <sys/cfgdb.h>
|
||||
#undef class
|
||||
#include <nl_types.h>
|
||||
#include <string.h>
|
||||
#include <kdebug.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
|
||||
#include <sys/statfs.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <fstab.h>
|
||||
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
char *
|
||||
device_description(struct CuDv *cudv)
|
||||
{
|
||||
char *desc = NULL;
|
||||
struct PdDv *pddv = cudv->PdDvLn; /* link to Predefined Devices database */
|
||||
nl_catd cat;
|
||||
|
||||
cat = catopen("/usr/lib/methods/devices.cat", NL_CAT_LOCALE);
|
||||
if ((int)cat == -1)
|
||||
return NULL;
|
||||
|
||||
desc = strdup( catgets(cat, pddv->setno, pddv->msgno, "N/A") );
|
||||
catclose(cat);
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
bool
|
||||
list_devices(QListView *lBox, char *criteria)
|
||||
{
|
||||
struct CuDv *cudv; /* Customized Devices */
|
||||
struct listinfo info;
|
||||
int i;
|
||||
char *cudv_desc;
|
||||
QString cudv_status;
|
||||
QListViewItem *lastitem = NULL;
|
||||
|
||||
lBox->addColumn(i18n("Name"));
|
||||
lBox->addColumn(i18n("Status"));
|
||||
lBox->addColumn(i18n("Location"));
|
||||
lBox->addColumn(i18n("Description"));
|
||||
|
||||
if (odm_initialize() == -1)
|
||||
{
|
||||
kError(0) << "odm_initialize() failed: odmerrno = " << odmerrno << endl;
|
||||
return(false);
|
||||
}
|
||||
|
||||
cudv = (struct CuDv *) odm_get_list(CuDv_CLASS, criteria, &info, 100, 2);
|
||||
|
||||
if ((int)cudv == -1)
|
||||
{
|
||||
odm_terminate();
|
||||
kError(0) << "odm_get_list() failed: odmerrno = " << odmerrno << endl;
|
||||
return(false);
|
||||
}
|
||||
else if (!cudv) /* empty list */
|
||||
{
|
||||
odm_terminate();
|
||||
return(true);
|
||||
}
|
||||
|
||||
for (i=0; i<info.num; i++)
|
||||
{
|
||||
switch(cudv[i].status)
|
||||
{
|
||||
case DEFINED: cudv_status = QString("Defined"); break;
|
||||
case AVAILABLE: cudv_status = QString("Available"); break;
|
||||
case STOPPED: cudv_status = QString("Stopped"); break;
|
||||
default: cudv_status = QString("Unknown");
|
||||
}
|
||||
cudv_desc = device_description(&cudv[i]);
|
||||
|
||||
lastitem = new QListViewItem(lBox, lastitem,
|
||||
QString(cudv[i].name),
|
||||
cudv_status,
|
||||
QString(cudv[i].location),
|
||||
QString(cudv_desc ? cudv_desc : "N/A") );
|
||||
|
||||
if (cudv_desc) free(cudv_desc);
|
||||
}
|
||||
|
||||
if (odm_free_list(cudv, &info) == -1)
|
||||
{
|
||||
odm_terminate();
|
||||
kError(0) << "odm_free_list() failed: odmerrno = " << odmerrno << endl;
|
||||
return(false);
|
||||
}
|
||||
|
||||
odm_terminate();
|
||||
return true;
|
||||
}
|
||||
|
||||
enum CHIP
|
||||
{
|
||||
P2SC, Power, Power2, Power3, Power3_II, PowerPC,
|
||||
PowerPC_604e, PowerPersonal, RD64_II, RS_III, RS64, RS64_II,
|
||||
RS64_III, RS64_IV, RSC, ThinkPad, unknown,
|
||||
NUM_CHIPS
|
||||
};
|
||||
static const char chip_name[NUM_CHIPS][16] =
|
||||
{
|
||||
"P2SC", "Power", "Power2", "Power3", "Power3-II", "PowerPC",
|
||||
"PowerPC 604e", "PowerPersonal", "RD64-II", "RS-III", "RS64", "RS64-II",
|
||||
"RS64-III", "RS64-IV", "RSC", "ThinkPad", "unknown"
|
||||
};
|
||||
|
||||
struct model
|
||||
{
|
||||
char model_ID[21];
|
||||
char machine_type[21];
|
||||
char processor_speed[21];
|
||||
unsigned short architecture; /* enum CHIP */
|
||||
};
|
||||
|
||||
struct model _models[] =
|
||||
{
|
||||
{ "02", "7015-930", "25", Power },
|
||||
{ "10", "7013-530", "25", Power },
|
||||
{ "10", "7016-730", "25", Power },
|
||||
{ "11", "7013-540", "30", Power },
|
||||
{ "14", "7013-540", "30", Power },
|
||||
{ "18", "7013-53H", "33", Power },
|
||||
{ "1C", "7013-550", "41.6", Power },
|
||||
{ "20", "7015-930", "25", Power },
|
||||
{ "2E", "7015-950", "41", Power },
|
||||
{ "30", "7013-520", "20", Power },
|
||||
{ "31", "7012-320", "20", Power },
|
||||
{ "34", "7013-52H", "25", Power },
|
||||
{ "35", "7012-32H", "25", Power },
|
||||
{ "37", "7012-340", "33", Power },
|
||||
{ "38", "7012-350", "41", Power },
|
||||
{ "41", "7011-20", "33", PowerPC },
|
||||
{ "45", "7011-220", "33", PowerPC },
|
||||
{ "42", "7006-41T/41W", "80", PowerPC },
|
||||
{ "43", "7008-M20", "33", Power },
|
||||
{ "43", "7008-M2A", "33", Power },
|
||||
{ "46", "7011-250", "66", PowerPC },
|
||||
{ "47", "7011-230", "45", RSC },
|
||||
{ "48", "7009-C10", "80", PowerPC },
|
||||
/* 4C models use a different table -- see below */
|
||||
{ "4C", "70XX", "(unknown)", unknown },
|
||||
{ "57", "7012-390", "67", Power2 },
|
||||
{ "57", "7030-3BT", "67", Power2 },
|
||||
{ "57", "9076-SP2 Thin", "67", Power2 },
|
||||
{ "58", "7012-380", "59", Power2 },
|
||||
{ "58", "7030-3AT", "59", Power2 },
|
||||
{ "59", "7012-39H", "67", Power2 },
|
||||
{ "59", "9076-SP2 Thin w/L2", "67", Power2 },
|
||||
{ "5C", "7013-560", "50", Power },
|
||||
{ "63", "7015-970", "50", Power },
|
||||
{ "63", "7015-97B", "50", Power },
|
||||
{ "64", "7015-980", "62.5", Power },
|
||||
{ "64", "7015-98B", "62.5", Power },
|
||||
{ "66", "7013-580", "62.5", Power },
|
||||
{ "67", "7013-570", "50", Power },
|
||||
{ "67", "7015-R10", "50", Power },
|
||||
{ "70", "7013-590", "66", Power2 },
|
||||
{ "70", "9076-SP2 Wide", "66", Power2 },
|
||||
{ "71", "7013-58H", "55", Power2 },
|
||||
{ "72", "7013-59H", "66", Power2 },
|
||||
{ "72", "7015-R20", "66", Power2 },
|
||||
{ "72", "9076-SP2 Wide", "66", Power2 },
|
||||
{ "75", "7012-370", "62", Power },
|
||||
{ "75", "7012-375", "62", Power },
|
||||
{ "75", "9076-SP1 Thin", "62", Power },
|
||||
{ "76", "7012-360", "50", Power },
|
||||
{ "76", "7012-365", "50", Power },
|
||||
{ "77", "7012-350", "41", Power },
|
||||
{ "77", "7012-355", "41", Power },
|
||||
{ "77", "7013-55L", "41.6", Power },
|
||||
{ "79", "7013-591", "77", Power2 },
|
||||
{ "79", "9076-SP2 Wide", "77", Power2 },
|
||||
{ "80", "7015-990", "71.5", Power2 },
|
||||
{ "81", "7015-R24", "71.5", P2SC },
|
||||
{ "89", "7013-595", "135", P2SC },
|
||||
{ "89", "9076-SP2 Wide", "135", P2SC },
|
||||
{ "90", "7009-C20", "120", PowerPC },
|
||||
{ "91", "7006-42W/42T", "120", PowerPC },
|
||||
{ "94", "7012-397", "160", P2SC },
|
||||
{ "94", "9076-SP2 Thin", "160", P2SC },
|
||||
{ "A0", "7013-J30", "75", PowerPC },
|
||||
{ "A1", "7013-J40", "112", PowerPC },
|
||||
{ "A3", "7015-R30", "(unknown)", PowerPC },
|
||||
{ "A4", "7015-R40", "(unknown)", PowerPC },
|
||||
{ "A4", "7015-R50", "(unknown)", PowerPC },
|
||||
{ "A4", "9076-SP2 High", "(unknown)", PowerPC },
|
||||
{ "A6", "7012-G30", "(unknown)", PowerPC },
|
||||
{ "A7", "7012-G40", "(unknown)", PowerPC },
|
||||
{ "C0", "7024-E20", "(unknown)", PowerPC },
|
||||
{ "C0", "7024-E30", "(unknown)", PowerPC },
|
||||
{ "C4", "7025-F30", "(unknown)", PowerPC },
|
||||
{ "F0", "7007-N40", "50", ThinkPad },
|
||||
{ "", "", "0", 0 }
|
||||
};
|
||||
|
||||
struct model _4C_models[] =
|
||||
{
|
||||
{ "IBM,7017-S70", "7017-S70", "125", RS64 },
|
||||
{ "IBM,7017-S7A", "7017-S7A", "262", RD64_II },
|
||||
{ "IBM,7017-S80", "7017-S80", "450", RS_III },
|
||||
{ "IBM,7017-S85", "pSeries 680", "600", RS64_IV },
|
||||
{ "IBM,7025-F40", "7025-F40", "166/233", PowerPC_604e },
|
||||
{ "IBM,7025-F50", "7025-F50", "(unknown)", PowerPC_604e },
|
||||
{ "IBM,7025-F80", "7025-F80", "(unknown)", RS64_III },
|
||||
{ "IBM,7026-H10", "7025-H10", "166/233", PowerPC_604e },
|
||||
{ "IBM,7026-H50", "7025-H50", "(unknown)", PowerPC_604e },
|
||||
{ "IBM,7026-H80", "7025-H80", "(unknown)", RS64_III },
|
||||
{ "IBM,7026-M80", "7026-M80", "500", RS64_III },
|
||||
{ "IBM,7025-F40", "7025-F40", "166/233", PowerPC },
|
||||
{ "IBM,7025-F50", "7025-F50", "(unknown)", PowerPC },
|
||||
{ "IBM,7025-F80", "7025-F80", "450", PowerPC },
|
||||
{ "IBM,7026-B80", "pSeries 640", "375", Power3_II },
|
||||
{ "IBM,7026-H10", "7026-H10", "166/233", PowerPC },
|
||||
{ "IBM,7026-H50", "7026-H50", "(unknown)", PowerPC },
|
||||
{ "IBM,7026-H70", "7026-H70", "340", RS64_II },
|
||||
{ "IBM,7026-H80", "7026-H80", "450", PowerPC },
|
||||
{ "IBM,7026-M80", "7026-M80", "500", PowerPC },
|
||||
{ "IBM,7042-140", "7043-140", "166/200/233/332", PowerPC },
|
||||
{ "IBM,7042-150", "7043-150", "375", PowerPC },
|
||||
{ "IBM,7042-240", "7043-240", "166/233", PowerPC },
|
||||
{ "IBM,7043-140", "7043-140", "166/200/233/332", PowerPC },
|
||||
{ "IBM,7043-150", "7043-150", "375", PowerPC },
|
||||
{ "IBM,7043-240", "7043-240", "166/233", PowerPC },
|
||||
{ "IBM,7043-260", "7043-260", "200", Power3 },
|
||||
{ "IBM,7248", "7248-100", "100", PowerPersonal },
|
||||
{ "IBM,7248", "7248-120", "120", PowerPersonal },
|
||||
{ "IBM,7248", "7248-132", "132", PowerPersonal },
|
||||
{ "IBM,9076-270", "9076-SP Silver Node", "(unknown)", PowerPC },
|
||||
{ "", "", "", 0 },
|
||||
};
|
||||
|
||||
|
||||
/* all GetInfo_ functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool
|
||||
GetInfo_XServer_and_Video( QListView *lBox )
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
||||
|
||||
/*
|
||||
* Written using information from:
|
||||
*
|
||||
* http://service.software.ibm.com/cgi-bin/support/rs6000.support/techbrowse/tbgaus?gaus_mode=8&documents=B93576892313352&database=task
|
||||
*
|
||||
* Not fully implemented. In particular there are ways to resolve the
|
||||
* "(unknown)" clock speeds of many of these models. See page for details.
|
||||
*
|
||||
*/
|
||||
bool
|
||||
GetInfo_CPU( QListView *lBox )
|
||||
{
|
||||
struct utsname info;
|
||||
struct model *table = _models; /* table of model information */
|
||||
char model_ID[21] = ""; /* information for table lookup */
|
||||
char cpu_ID[7] = ""; /* unique CPU ID */
|
||||
int i;
|
||||
QListViewItem *lastitem = NULL;
|
||||
|
||||
lBox->addColumn(i18n("Information"));
|
||||
lBox->addColumn(i18n("Value"));
|
||||
|
||||
if (uname(&info) == -1)
|
||||
{
|
||||
kError(0) << "uname() failed: errno = " << errno << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
strncat(model_ID, info.machine+8, 2); /* we want the ninth and tenth digits */
|
||||
strncat(cpu_ID, info.machine+2, 6);
|
||||
|
||||
if (strcmp(model_ID, "4C") == 0) /* need to use a different model_ID and model table */
|
||||
{
|
||||
if (odm_initialize() == -1)
|
||||
kError(0) << "odm_initialize() failed: odmerrno = " << odmerrno << endl;
|
||||
else
|
||||
{
|
||||
struct CuAt cuat; /* Customized Device attribute */
|
||||
|
||||
/* equivalent to uname -M */
|
||||
if ( odm_get_first(CuAt_CLASS, (char *)"name='sys0' and attribute='modelname'", &cuat) )
|
||||
{
|
||||
strcpy(model_ID, cuat.value);
|
||||
table = _4C_models;
|
||||
}
|
||||
|
||||
odm_terminate();
|
||||
}
|
||||
}
|
||||
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("CPU ID"), QString(cpu_ID));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Node"), QString(info.nodename));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("OS"), QString(info.sysname) +
|
||||
QString(" ") + QString(info.version) + QString(".") + QString(info.release));
|
||||
|
||||
for (i=0; *(table[i].model_ID); i++)
|
||||
if (strcmp(model_ID, table[i].model_ID) == 0)
|
||||
{
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Machine Type"), QString(table[i].machine_type));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Architecture"), QString(chip_name[table[i].architecture]));
|
||||
lastitem = new QListViewItem(lBox, lastitem, QString("Speed"), QString(table[i].processor_speed) + QString(" Mhz"));
|
||||
break;
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
GetInfo_PCI( QListView *lBox )
|
||||
{
|
||||
return list_devices(lBox, (char *)"PdDvLn like '*/pci/*'");
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
GetInfo_Devices( QListView *lBox )
|
||||
{
|
||||
return list_devices(lBox, (char *)"PdDvLn like '*'");
|
||||
}
|
||||
|
||||
bool
|
||||
GetInfo_SCSI( QListView *lBox )
|
||||
{
|
||||
return list_devices(lBox, (char *)"PdDvLn like '*/scsi/*'");
|
||||
}
|
||||
|
||||
/* Parts taken from fsusage.c from the Midnight Commander (mc)
|
||||
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, In
|
||||
|
||||
Return the number of TOSIZE-byte blocks used by
|
||||
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
|
||||
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
|
||||
|
||||
static long fs_adjust_blocks(long blocks, int fromsize, int tosize)
|
||||
{
|
||||
if (tosize <= 0)
|
||||
abort ();
|
||||
if (fromsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (fromsize == tosize) /* E.g., from 512 to 512. */
|
||||
return blocks;
|
||||
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
|
||||
return blocks * (fromsize / tosize);
|
||||
else /* E.g., from 256 to 512. */
|
||||
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
|
||||
}
|
||||
|
||||
/* Fill in the fields of FSP with information about space usage for
|
||||
the filesystem on which PATH resides.
|
||||
Return 0 if successful, -1 if not. */
|
||||
|
||||
#define CONVERT_BLOCKS(b) fs_adjust_blocks ((b), fsd.f_bsize, 512)
|
||||
|
||||
static int get_fs_usage (char *path, long *l_total, long *l_avail)
|
||||
{ struct statfs fsd; /* 4.3BSD, SunOS 4, HP-UX, AIX. */
|
||||
unsigned long fsu_blocks,fsu_bfree,fsu_bavail;
|
||||
|
||||
*l_total = *l_avail = 0;
|
||||
if (statfs (path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
|
||||
fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
|
||||
fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
|
||||
|
||||
*l_avail = getuid () ? fsu_bavail/2 : fsu_bfree/2;
|
||||
*l_total = fsu_blocks/2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
bool
|
||||
GetInfo_Partitions ( QListView *lbox )
|
||||
{
|
||||
#define NUMCOLS 5
|
||||
QString Title[NUMCOLS];
|
||||
int n;
|
||||
|
||||
struct fstab *fstab_ent;
|
||||
struct statvfs svfs;
|
||||
long total,avail;
|
||||
QString str;
|
||||
QString MB(i18n("MB")+ " "); // International Text for MB=Mega-Byte
|
||||
|
||||
if (setfsent() != 1) // Try to open fstab
|
||||
return false;
|
||||
|
||||
Title[0] = i18n("Device");
|
||||
Title[1] = i18n("Mount Point");
|
||||
Title[2] = i18n("FS Type");
|
||||
Title[3] = i18n("Total Size");
|
||||
Title[4] = i18n("Free Size");
|
||||
|
||||
for (n=0; n<NUMCOLS; ++n) {
|
||||
lbox->addColumn(Title[n] );
|
||||
}
|
||||
|
||||
while ((fstab_ent=getfsent())!=NULL) {
|
||||
/* fstab_ent->fs_type holds only "rw","xx","ro"... */
|
||||
memset(&svfs,0,sizeof(svfs));
|
||||
statvfs(fstab_ent->fs_file,&svfs);
|
||||
get_fs_usage(fstab_ent->fs_file, &total, &avail);
|
||||
|
||||
if (!strcmp(fstab_ent->fs_type,FSTAB_XX)) // valid drive ?
|
||||
svfs.f_basetype[0] = 0;
|
||||
|
||||
if(svfs.f_basetype[0]) {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")),
|
||||
Value((total+512)/1024,6) + MB,
|
||||
Value((avail+512)/1024,6) + MB);
|
||||
}
|
||||
else {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")));
|
||||
}
|
||||
|
||||
}
|
||||
endfsent();
|
||||
|
||||
return true;
|
||||
}
|
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
|
||||
1998 by Helge Deller (deller@gmx.de)
|
||||
free source under GPL
|
||||
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
*/
|
||||
|
||||
|
||||
// Default for unsupportet systems
|
||||
|
||||
// the following defines are not really ok here, but maybe we should show, what
|
||||
// Information could be displayed here....
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
|
||||
bool GetInfo_CPU( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions( Q3ListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video( Q3ListView *lBox )
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
|
@ -1,785 +0,0 @@
|
|||
|
||||
/*
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
|
||||
Mostly written 1998-1999 by Helge Deller (deller@gmx.de),
|
||||
with some pieces of code from Aubert Pierre.
|
||||
|
||||
Last modified: done:
|
||||
1999-06-21 added more models to the lookup-table (deller)
|
||||
1999-06-18 added support for 64-Bit HP-UX in CPU-detection(deller)
|
||||
1999-05-04 added audio(alib)-support (deller)
|
||||
1999-04-27 [tested with HP-UX 10.20 (HP9000/715/64-EISA)]
|
||||
added support for nearly all categories
|
||||
(means: not finished!)
|
||||
1998-11-01 first, nearly empty version (deller)
|
||||
with a little source for CPU from Aubert Pierre
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/pstat.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <fstab.h>
|
||||
#include <stdlib.h>
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <QTextStream>
|
||||
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
# define INFO_CPU_MODEL "/bin/model" // as pipe !!
|
||||
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
|
||||
#define INFO_DMA_AVAILABLE
|
||||
|
||||
#define INFO_PCI_AVAILABLE
|
||||
# define INFO_PCI "" // Please, who know it ????
|
||||
# define INFO_PCI_EISA "/etc/eisa/system.sci" // File !
|
||||
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
# define INFO_IOPORTS_1 "/etc/dmesg" // as pipe !
|
||||
# define INFO_IOPORTS_2 "/usr/sbin/dmesg" // as pipe !
|
||||
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
# define INFO_DEVICES "/etc/ioscan" // as pipe !!
|
||||
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
# define INFO_PARTITIONS_1 FSTAB // = "/etc/fstab" (in fstab.h)
|
||||
# define INFO_PARTITIONS_2 "/etc/checklist"
|
||||
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
|
||||
/* The following table is from an HP-UX 10.20 System
|
||||
build out of the files
|
||||
"/usr/lib/sched.models"
|
||||
or
|
||||
"/opt/langtools/lib/sched.models"
|
||||
If you have more entries, then please add them or send them to me!
|
||||
*/
|
||||
|
||||
// entries for PA_REVISION[]
|
||||
enum V_ENTRIES
|
||||
{ V_1x0,
|
||||
V_1x1, V_1x1a, V_1x1b, V_1x1c, V_1x1d, V_1x1e,
|
||||
V_2x0,
|
||||
V_LAST };
|
||||
|
||||
static const char PA_REVISION[V_LAST][7]
|
||||
= { "1.0",
|
||||
"1.1", "1.1a", "1.1b", "1.1c", "1.1d", "1.1e",
|
||||
"2.0" };
|
||||
|
||||
// entries for PA_NAME[]
|
||||
enum PA_ENTRIES
|
||||
{ PA7000,
|
||||
PA7100, PA7100LC, PA7200, PA7300,
|
||||
PA8000, PA8200, PA8500,
|
||||
PARISC_PA_LAST };
|
||||
|
||||
static const char PA_NAME[PARISC_PA_LAST][11]
|
||||
= { "PA7000",
|
||||
"PA7100", "PA7100LC", "PA7200", "PA7300",
|
||||
"PA8000", "PA8200", "PA8500" };
|
||||
|
||||
struct _type_LOOKUPTABLE {
|
||||
char Name[8];
|
||||
unsigned short parisc_rev; // = enum V_ENTRIES
|
||||
unsigned short parisc_name; // = enum PA_ENTRIES
|
||||
};
|
||||
|
||||
|
||||
static const struct _type_LOOKUPTABLE PA_LOOKUPTABLE[] = {
|
||||
/* VERSION A.00.07
|
||||
(there seems to exist several different files with same version-number !)*/
|
||||
{ "600" ,V_1x0 ,PA7000 },
|
||||
{ "635" ,V_1x0 ,PA7000 },
|
||||
{ "645" ,V_1x0 ,PA7000 },
|
||||
{ "700" ,V_1x1 ,PA7000 },
|
||||
{ "705" ,V_1x1a ,PA7000 },
|
||||
{ "710" ,V_1x1a ,PA7000 },
|
||||
{ "712" ,V_1x1c ,PA7100LC },
|
||||
{ "715" ,V_1x1c ,PA7100LC },
|
||||
{ "720" ,V_1x1a ,PA7000 },
|
||||
{ "722" ,V_1x1c ,PA7100LC },
|
||||
{ "725" ,V_1x1c ,PA7100LC },
|
||||
{ "728" ,V_1x1d ,PA7200 },
|
||||
{ "730" ,V_1x1a ,PA7000 },
|
||||
{ "735" ,V_1x1b ,PA7100 },
|
||||
{ "742" ,V_1x1b ,PA7100 },
|
||||
{ "743" ,V_1x1b ,PA7100 }, // or a 1.1c,PA7100LC !!
|
||||
{ "744" ,V_1x1e ,PA7300 },
|
||||
{ "745" ,V_1x1b ,PA7100 },
|
||||
{ "747" ,V_1x1b ,PA7100 },
|
||||
{ "750" ,V_1x1a ,PA7000 },
|
||||
{ "755" ,V_1x1b ,PA7100 },
|
||||
{ "770" ,V_1x1d ,PA7200 },
|
||||
{ "777" ,V_1x1d ,PA7200 },
|
||||
{ "778" ,V_1x1e ,PA7300 },
|
||||
{ "779" ,V_1x1e ,PA7300 },
|
||||
{ "780" ,V_2x0 ,PA8000 },
|
||||
{ "781" ,V_2x0 ,PA8000 },
|
||||
{ "782" ,V_2x0 ,PA8200 },
|
||||
{ "783" ,V_2x0 ,PA8500 },
|
||||
{ "785" ,V_2x0 ,PA8500 },
|
||||
{ "800" ,V_1x0 ,PA7000 }, // and one with: 2.0 / PA8000
|
||||
{ "801" ,V_1x1c ,PA7100LC },
|
||||
{ "802" ,V_2x0 ,PA8000 },
|
||||
{ "803" ,V_1x1e ,PA7300 },
|
||||
{ "804" ,V_2x0 ,PA8000 },
|
||||
{ "806" ,V_1x1c ,PA7100LC },
|
||||
{ "807" ,V_1x1a ,PA7000 },
|
||||
{ "808" ,V_1x0 ,PA7000 },
|
||||
{ "809" ,V_1x1d ,PA7200 },
|
||||
{ "810" ,V_2x0 ,PA8000 },
|
||||
{ "811" ,V_1x1c ,PA7100LC },
|
||||
{ "813" ,V_1x1e ,PA7300 },
|
||||
{ "815" ,V_1x0 ,PA7000 },
|
||||
{ "816" ,V_1x1c ,PA7100LC },
|
||||
{ "817" ,V_1x1a ,PA7000 },
|
||||
{ "819" ,V_1x1d ,PA7200 },
|
||||
{ "820" ,V_2x0 ,PA8000 },
|
||||
{ "821" ,V_1x1d ,PA7200 },
|
||||
{ "822" ,V_1x0 ,PA7000 },
|
||||
{ "825" ,V_1x0 ,PA7000 },
|
||||
{ "826" ,V_1x1c ,PA7100LC },
|
||||
{ "827" ,V_1x1a ,PA7000 },
|
||||
{ "829" ,V_1x1d ,PA7200 },
|
||||
{ "831" ,V_1x1d ,PA7200 },
|
||||
{ "832" ,V_1x0 ,PA7000 },
|
||||
{ "834" ,V_1x0 ,PA7000 },
|
||||
{ "835" ,V_1x0 ,PA7000 },
|
||||
{ "837" ,V_1x1a ,PA7000 },
|
||||
{ "839" ,V_1x1d ,PA7200 },
|
||||
{ "840" ,V_1x0 ,PA7000 },
|
||||
{ "841" ,V_1x1d ,PA7200 },
|
||||
{ "842" ,V_1x0 ,PA7000 },
|
||||
{ "845" ,V_1x0 ,PA7000 },
|
||||
{ "847" ,V_1x1a ,PA7000 },
|
||||
{ "849" ,V_1x1d ,PA7200 },
|
||||
{ "850" ,V_1x0 ,PA7000 },
|
||||
{ "851" ,V_1x1d ,PA7200 },
|
||||
{ "852" ,V_1x0 ,PA7000 },
|
||||
{ "855" ,V_1x0 ,PA7000 },
|
||||
{ "856" ,V_1x1c ,PA7100LC },
|
||||
{ "857" ,V_1x1a ,PA7000 },
|
||||
{ "859" ,V_1x1d ,PA7200 },
|
||||
{ "860" ,V_1x0 ,PA7000 },
|
||||
{ "861" ,V_2x0 ,PA8000 },
|
||||
{ "865" ,V_1x0 ,PA7000 },
|
||||
{ "869" ,V_1x1d ,PA7200 },
|
||||
{ "870" ,V_1x0 ,PA7000 },
|
||||
{ "871" ,V_2x0 ,PA8000 },
|
||||
{ "877" ,V_1x1a ,PA7000 },
|
||||
{ "879" ,V_2x0 ,PA8000 },
|
||||
{ "887" ,V_1x1b ,PA7100 },
|
||||
{ "889" ,V_2x0 ,PA8000 },
|
||||
{ "890" ,V_1x0 ,PA7000 },
|
||||
{ "891" ,V_1x1b ,PA7100 },
|
||||
{ "892" ,V_1x1b ,PA7100 },
|
||||
{ "893" ,V_2x0 ,PA8000 },
|
||||
{ "895" ,V_2x0 ,PA8000 },
|
||||
{ "896" ,V_2x0 ,PA8000 },
|
||||
{ "897" ,V_1x1b ,PA7100 },
|
||||
{ "898" ,V_2x0 ,PA8200 },
|
||||
{ "899" ,V_2x0 ,PA8200 },
|
||||
{ "900" ,V_1x0 ,PA7000 },
|
||||
{ "B115" ,V_1x1e ,PA7300 },
|
||||
{ "B120" ,V_1x1e ,PA7300 },
|
||||
{ "B132L" ,V_1x1e ,PA7300 },
|
||||
{ "B160L" ,V_1x1e ,PA7300 },
|
||||
{ "B180L" ,V_1x1e ,PA7300 },
|
||||
{ "C100" ,V_1x1d ,PA7200 },
|
||||
{ "C110" ,V_1x1d ,PA7200 },
|
||||
{ "C115" ,V_1x1e ,PA7300 },
|
||||
{ "C120" ,V_1x1e ,PA7300 },
|
||||
{ "C130" ,V_2x0 ,PA8000 },
|
||||
{ "C140" ,V_2x0 ,PA8000 },
|
||||
{ "C160L" ,V_1x1e ,PA7300 },
|
||||
{ "C160" ,V_2x0 ,PA8000 },
|
||||
{ "C180L" ,V_1x1e ,PA7300 },
|
||||
{ "C180-XP" ,V_2x0 ,PA8000 },
|
||||
{ "C180" ,V_2x0 ,PA8000 },
|
||||
{ "C200+" ,V_2x0 ,PA8200 },
|
||||
{ "C230+" ,V_2x0 ,PA8200 },
|
||||
{ "C240+" ,V_2x0 ,PA8200 },
|
||||
{ "CB260" ,V_2x0 ,PA8200 },
|
||||
{ "D200" ,V_1x1d ,PA7200 }, // or: 1.1c, PA7100LC
|
||||
{ "D210" ,V_1x1d ,PA7200 }, // or: 1.1c, PA7100LC
|
||||
{ "D220" ,V_1x1e ,PA7300 },
|
||||
{ "D230" ,V_1x1e ,PA7300 },
|
||||
{ "D250" ,V_1x1d ,PA7200 },
|
||||
{ "D260" ,V_1x1d ,PA7200 },
|
||||
{ "D270" ,V_2x0 ,PA8000 },
|
||||
{ "D280" ,V_2x0 ,PA8000 },
|
||||
{ "D310" ,V_1x1c ,PA7100LC },
|
||||
{ "D320" ,V_1x1e ,PA7300 },
|
||||
{ "D330" ,V_1x1e ,PA7300 },
|
||||
{ "D350" ,V_1x1d ,PA7200 },
|
||||
{ "D360" ,V_1x1d ,PA7200 },
|
||||
{ "D370" ,V_2x0 ,PA8000 },
|
||||
{ "D380" ,V_2x0 ,PA8000 },
|
||||
{ "D400" ,V_1x1d ,PA7200 },
|
||||
{ "D410" ,V_1x1d ,PA7200 },
|
||||
{ "D650" ,V_2x0 ,PA8000 },
|
||||
{ "DX0" ,V_1x1c ,PA7100LC },
|
||||
{ "DX5" ,V_1x1c ,PA7100LC },
|
||||
{ "DXO" ,V_1x1c ,PA7100LC },
|
||||
{ "E25" ,V_1x1c ,PA7100LC },
|
||||
{ "E35" ,V_1x1c ,PA7100LC },
|
||||
{ "E45" ,V_1x1c ,PA7100LC },
|
||||
{ "E55" ,V_1x1c ,PA7100LC },
|
||||
{ "F10" ,V_1x1a ,PA7000 },
|
||||
{ "F20" ,V_1x1a ,PA7000 },
|
||||
{ "F30" ,V_1x1a ,PA7000 },
|
||||
{ "G30" ,V_1x1a ,PA7000 },
|
||||
{ "G40" ,V_1x1a ,PA7000 },
|
||||
{ "G50" ,V_1x1b ,PA7100 },
|
||||
{ "G60" ,V_1x1b ,PA7100 },
|
||||
{ "G70" ,V_1x1b ,PA7100 },
|
||||
{ "H20" ,V_1x1a ,PA7000 },
|
||||
{ "H30" ,V_1x1a ,PA7000 },
|
||||
{ "H40" ,V_1x1a ,PA7000 },
|
||||
{ "H50" ,V_1x1b ,PA7100 },
|
||||
{ "H60" ,V_1x1b ,PA7100 },
|
||||
{ "H70" ,V_1x1b ,PA7100 },
|
||||
{ "I30" ,V_1x1a ,PA7000 },
|
||||
{ "I40" ,V_1x1a ,PA7000 },
|
||||
{ "I50" ,V_1x1b ,PA7100 },
|
||||
{ "I60" ,V_1x1b ,PA7100 },
|
||||
{ "I70" ,V_1x1b ,PA7100 },
|
||||
{ "J200" ,V_1x1d ,PA7200 },
|
||||
{ "J210XC" ,V_1x1d ,PA7200 },
|
||||
{ "J210" ,V_1x1d ,PA7200 },
|
||||
{ "J220" ,V_2x0 ,PA8000 },
|
||||
{ "J2240" ,V_2x0 ,PA8200 },
|
||||
{ "J280" ,V_2x0 ,PA8000 },
|
||||
{ "J282" ,V_2x0 ,PA8000 },
|
||||
{ "J400" ,V_2x0 ,PA8000 },
|
||||
{ "J410" ,V_2x0 ,PA8000 },
|
||||
{ "K100" ,V_1x1d ,PA7200 },
|
||||
{ "K200" ,V_1x1d ,PA7200 },
|
||||
{ "K210" ,V_1x1d ,PA7200 },
|
||||
{ "K230" ,V_1x1d ,PA7200 },
|
||||
{ "K250" ,V_2x0 ,PA8000 },
|
||||
{ "K260" ,V_2x0 ,PA8000 },
|
||||
{ "K370" ,V_2x0 ,PA8200 },
|
||||
{ "K380" ,V_2x0 ,PA8200 },
|
||||
{ "K400" ,V_1x1d ,PA7200 },
|
||||
{ "K410" ,V_1x1d ,PA7200 },
|
||||
{ "K420" ,V_1x1d ,PA7200 },
|
||||
{ "K430" ,V_1x1d ,PA7200 },
|
||||
{ "K450" ,V_2x0 ,PA8000 },
|
||||
{ "K460" ,V_2x0 ,PA8000 },
|
||||
{ "K470" ,V_2x0 ,PA8200 },
|
||||
{ "K570" ,V_2x0 ,PA8200 },
|
||||
{ "K580" ,V_2x0 ,PA8200 },
|
||||
{ "S700i" ,V_1x1e ,PA7300 },
|
||||
{ "S715" ,V_1x1e ,PA7300 },
|
||||
{ "S744" ,V_1x1e ,PA7300 },
|
||||
{ "S760" ,V_1x1e ,PA7300 },
|
||||
{ "T500" ,V_1x1c ,PA7100LC }, // or: 1.1b, PA7100
|
||||
{ "T520" ,V_1x1b ,PA7100 },
|
||||
{ "T540" ,V_2x0 ,PA8000 },
|
||||
{ "T600" ,V_2x0 ,PA8000 },
|
||||
{ "V2000" ,V_2x0 ,PA8000 },
|
||||
{ "V2200" ,V_2x0 ,PA8200 },
|
||||
{ "V2250" ,V_2x0 ,PA8200 },
|
||||
{ "V2500" ,V_2x0 ,PA8500 },
|
||||
|
||||
{ "" ,0 ,0 } /* Last Entry has to be empty. */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Helper-Functions */
|
||||
|
||||
// Value() is defined in info.cpp !!!
|
||||
|
||||
static bool Find_in_LOOKUPTABLE( QListView *lBox, char *machine )
|
||||
{ char *Machine;
|
||||
int len;
|
||||
const struct _type_LOOKUPTABLE *Entry = PA_LOOKUPTABLE;
|
||||
QString str;
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
|
||||
Machine = machine; // machine is like: "9000/715/D"
|
||||
while ((*Machine) && (*Machine!='/'))
|
||||
++Machine;
|
||||
|
||||
if (*Machine)
|
||||
++Machine;
|
||||
else
|
||||
Machine=machine;
|
||||
|
||||
len = strlen(Machine);
|
||||
|
||||
while (Entry->Name[0])
|
||||
{ if (strncmp(Entry->Name,Machine,len)==0)
|
||||
{
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("PA-RISC Processor"),
|
||||
QString(PA_NAME[Entry->parisc_name]));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("PA-RISC Revision"),
|
||||
QString("PA-RISC ") + QString(PA_REVISION[Entry->parisc_rev]));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
++Entry; // next Entry !
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
|
||||
bool GetInfo_CPU( QListView *lBox )
|
||||
{
|
||||
FILE *pipe;
|
||||
QFile *model;
|
||||
|
||||
struct pst_dynamic psd;
|
||||
struct pst_static pst;
|
||||
struct pst_processor pro;
|
||||
struct utsname info;
|
||||
QString str,str2;
|
||||
QListViewItem* olditem = 0;
|
||||
int maxwidth,i;
|
||||
|
||||
if((pstat_getstatic(&pst, sizeof(pst), (size_t)1, 0) == -1) ||
|
||||
(pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)== -1)) {
|
||||
*GetInfo_ErrorString = i18n("Could not get Information."); /* Error */
|
||||
return false;
|
||||
}
|
||||
|
||||
maxwidth = 0;
|
||||
lBox->addColumn(i18n("Information") );
|
||||
lBox->addColumn(i18n("Value") );
|
||||
|
||||
uname(&info);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Machine"), info.machine);
|
||||
|
||||
model = new QFile(INFO_CPU_MODEL);
|
||||
if (model->exists())
|
||||
{ if ((pipe = popen(INFO_CPU_MODEL, "r")))
|
||||
{ QTextStream *t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
str = t->readLine();
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Model"), str);
|
||||
delete t;
|
||||
}
|
||||
delete pipe;
|
||||
}
|
||||
delete model;
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Machine Identification Number"),
|
||||
strlen(info.__idnumber) ? QString(info.__idnumber) : i18n("(none)") );
|
||||
|
||||
if (psd.psd_proc_cnt<=0)
|
||||
psd.psd_proc_cnt=1; // Minimum one CPU !
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Number of Active Processors"),
|
||||
Value(psd.psd_proc_cnt));
|
||||
|
||||
pstat_getprocessor( &pro, sizeof(pro), 1, 0 );
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("CPU Clock"),
|
||||
Value(pro.psp_iticksperclktick/10000) + ' ' + i18n("MHz"));
|
||||
|
||||
switch(sysconf(_SC_CPU_VERSION))
|
||||
{ case CPU_HP_MC68020: str2 = "Motorola 68020"; break;
|
||||
case CPU_HP_MC68030: str2 = "Motorola 68030"; break;
|
||||
case CPU_HP_MC68040: str2 = "Motorola 68040"; break;
|
||||
case CPU_PA_RISC1_0: str2 = "PA-RISC 1.0"; break;
|
||||
case CPU_PA_RISC1_1: str2 = "PA-RISC 1.1"; break;
|
||||
case CPU_PA_RISC1_2: str2 = "PA-RISC 1.2"; break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (sysconf(_SC_KERNEL_BITS)) {
|
||||
case 64: str2 = "PA-RISC 2.0w (64 bit)"; break;
|
||||
case 32: str2 = "PA-RISC 2.0n (32 bit)"; break;
|
||||
default: str2 = "PA-RISC 2.0"; break;
|
||||
}; break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
str2 = "PA-RISC 2.0"; break;
|
||||
#endif
|
||||
default: str2 = i18n("(unknown)"); break;
|
||||
}
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("CPU Architecture"), str2);
|
||||
|
||||
Find_in_LOOKUPTABLE( lBox, info.machine );// try to get extended Information.
|
||||
|
||||
for (i=PS_PA83_FPU; i<=PS_PA89_FPU; ++i) {
|
||||
if ((1<<(i-1)) & pro.psp_coprocessor.psc_present) {
|
||||
str = QString( (i==PS_PA83_FPU) ? "PS_PA83_FPU":"PS_PA89_FPU" )
|
||||
+ QString(" (")
|
||||
+ QString(((1<<(i-1))&pro.psp_coprocessor.psc_enabled) ?
|
||||
i18n("enabled") : i18n("disabled") )
|
||||
+ QString(")");
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Numerical Coprocessor (FPU)"), str);
|
||||
}
|
||||
}// for(coprocessor..)
|
||||
|
||||
str = Value(((pst.physical_memory*pst.page_size)/1024/1024))
|
||||
+ QString(" ")
|
||||
+ i18n("MB"); // Mega-Byte
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Total Physical Memory"), str);
|
||||
|
||||
str = Value(pst.page_size) + QString(" ") + i18n("Bytes");
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Size of One Page"), str);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_ReadfromFile( QListView *lBox, const char *Name )
|
||||
{
|
||||
char buf[2048];
|
||||
|
||||
QFile *file = new QFile(Name);
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
if(!file->open(QIODevice::ReadOnly)) {
|
||||
delete file;
|
||||
return false;
|
||||
}
|
||||
|
||||
while (file->readLine(buf,sizeof(buf)-1) >= 0)
|
||||
{ if (strlen(buf))
|
||||
olditem = new QListViewItem(lBox, olditem, QString::fromLocal8Bit(buf));
|
||||
}
|
||||
|
||||
file->close();
|
||||
delete file;
|
||||
return (lBox->childCount());
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_IRQ( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI( QListView *lBox )
|
||||
{
|
||||
return( GetInfo_ReadfromFile(lBox,INFO_PCI) +
|
||||
GetInfo_ReadfromFile(lBox,INFO_PCI_EISA) );
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( QListView *lBox )
|
||||
{
|
||||
if (GetInfo_ReadfromPipe( lBox, INFO_IOPORTS_1, false ))
|
||||
return true;
|
||||
else
|
||||
return GetInfo_ReadfromPipe( lBox, INFO_IOPORTS_2, false );
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_Devices( QListView *lBox )
|
||||
{
|
||||
return GetInfo_ReadfromPipe( lBox, INFO_DEVICES, false );
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI( QListView *lBox )
|
||||
{
|
||||
return GetInfo_Devices( lBox );
|
||||
}
|
||||
/* Parts taken from fsusage.c from the Midnight Commander (mc)
|
||||
|
||||
Copyright (C) 1991, 1992 Free Software Foundation, In
|
||||
|
||||
Return the number of TOSIZE-byte blocks used by
|
||||
BLOCKS FROMSIZE-byte blocks, rounding away from zero.
|
||||
TOSIZE must be positive. Return -1 if FROMSIZE is not positive. */
|
||||
|
||||
static long fs_adjust_blocks(long blocks, int fromsize, int tosize)
|
||||
{
|
||||
if (tosize <= 0)
|
||||
abort ();
|
||||
if (fromsize <= 0)
|
||||
return -1;
|
||||
|
||||
if (fromsize == tosize) /* E.g., from 512 to 512. */
|
||||
return blocks;
|
||||
else if (fromsize > tosize) /* E.g., from 2048 to 512. */
|
||||
return blocks * (fromsize / tosize);
|
||||
else /* E.g., from 256 to 512. */
|
||||
return (blocks + (blocks < 0 ? -1 : 1)) / (tosize / fromsize);
|
||||
}
|
||||
|
||||
/* Fill in the fields of FSP with information about space usage for
|
||||
the filesystem on which PATH resides.
|
||||
Return 0 if successful, -1 if not. */
|
||||
|
||||
#define CONVERT_BLOCKS(b) fs_adjust_blocks ((b), fsd.f_bsize, 512)
|
||||
|
||||
static int get_fs_usage (char *path, long *l_total, long *l_avail)
|
||||
{ struct statfs fsd; /* 4.3BSD, SunOS 4, HP-UX, AIX. */
|
||||
unsigned long fsu_blocks,fsu_bfree,fsu_bavail;
|
||||
|
||||
*l_total = *l_avail = 0;
|
||||
if (statfs (path, &fsd) < 0)
|
||||
return -1;
|
||||
|
||||
fsu_blocks = CONVERT_BLOCKS (fsd.f_blocks);
|
||||
fsu_bfree = CONVERT_BLOCKS (fsd.f_bfree);
|
||||
fsu_bavail = CONVERT_BLOCKS (fsd.f_bavail);
|
||||
|
||||
*l_avail = getuid () ? fsu_bavail/2 : fsu_bfree/2;
|
||||
*l_total = fsu_blocks/2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
bool GetInfo_Partitions (QListView *lbox)
|
||||
{
|
||||
#define NUMCOLS 5
|
||||
QString Title[NUMCOLS];
|
||||
int n;
|
||||
|
||||
struct fstab *fstab_ent;
|
||||
struct statvfs svfs;
|
||||
long total,avail;
|
||||
QString str;
|
||||
QString MB(i18n("MB")+ " "); // International Text for MB=Mega-Byte
|
||||
|
||||
if (setfsent() != 1) // Try to open fstab
|
||||
return false;
|
||||
|
||||
Title[0] = i18n("Device");
|
||||
Title[1] = i18n("Mount Point");
|
||||
Title[2] = i18n("FS Type");
|
||||
Title[3] = i18n("Total Size");
|
||||
Title[4] = i18n("Free Size");
|
||||
|
||||
for (n=0; n<NUMCOLS; ++n) {
|
||||
lbox->addColumn(Title[n] );
|
||||
}
|
||||
|
||||
while ((fstab_ent=getfsent())!=NULL) {
|
||||
/* fstab_ent->fs_type holds only "rw","xx","ro"... */
|
||||
memset(&svfs,0,sizeof(svfs));
|
||||
statvfs(fstab_ent->fs_file,&svfs);
|
||||
get_fs_usage(fstab_ent->fs_file, &total, &avail);
|
||||
|
||||
if (!strcmp(fstab_ent->fs_type,FSTAB_XX)) // valid drive ?
|
||||
svfs.f_basetype[0] = 0;
|
||||
|
||||
if(svfs.f_basetype[0]) {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")),
|
||||
Value((total+512)/1024,6) + MB,
|
||||
Value((avail+512)/1024,6) + MB);
|
||||
}
|
||||
else {
|
||||
new QListViewItem(lbox, QString(fstab_ent->fs_spec),
|
||||
QString(fstab_ent->fs_file) + QString(" "),
|
||||
(svfs.f_basetype[0] ? QString(svfs.f_basetype) : i18n("n/a")));
|
||||
}
|
||||
|
||||
}
|
||||
endfsent();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_XServer_and_Video( QListView *lBox )
|
||||
{
|
||||
lBox = lBox;
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef HAVE_ALIB_H
|
||||
|
||||
bool GetInfo_Sound( QListView *lBox )
|
||||
{ lBox = lBox;
|
||||
*GetInfo_ErrorString = i18n("Audio-Support (Alib) was disabled during configuration and compile-time.");
|
||||
return false;
|
||||
}
|
||||
|
||||
#else // defined(HAVE_ALIB_H)
|
||||
|
||||
#include "Alib.h"
|
||||
|
||||
static const char formatNames[6][15] = {
|
||||
"ADFUnknown", "ADFMuLaw", "ADFALaw",
|
||||
"ADFLin16", "ADFLin8", "ADFLin8Offset" };
|
||||
|
||||
/* handle typo in 1st release of Alib.h */
|
||||
#ifndef ARightOutputChMask
|
||||
#define ARightOutputChMask ARighOutputChMask
|
||||
#endif
|
||||
|
||||
|
||||
bool GetInfo_Sound( QListView *lBox )
|
||||
{
|
||||
Audio *audio;
|
||||
long status;
|
||||
char server[80];
|
||||
int i;
|
||||
|
||||
QString str,str2;
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
// server = Hostname....
|
||||
server[0] = 0;
|
||||
audio = AOpenAudio( server, &status );
|
||||
if( status ) {
|
||||
*GetInfo_ErrorString = i18n("Unable to open Audio-Server (Alib).");
|
||||
return false;
|
||||
}
|
||||
|
||||
lBox->addColumn(i18n("Information") );
|
||||
lBox->addColumn(i18n("Value") );
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Audio Name"), QString(audio->audio_name));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Vendor"), QString(audio->vendor));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Alib Version"),
|
||||
Value(audio->alib_major_version) + QString(".") +
|
||||
Value(audio->alib_minor_version));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Protocol Revision"),
|
||||
Value(audio->proto_major_version) + QString(".") +
|
||||
Value(audio->proto_minor_version));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Vendor Number"),
|
||||
Value(audio->vnumber));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Release"),
|
||||
Value(audio->release));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Byte Order"),
|
||||
QString((audio->byte_order==ALSBFirst)? i18n("ALSBFirst (LSB)"):
|
||||
((audio->byte_order==AMSBFirst)? i18n("AMSBFirst (MSB)"):
|
||||
i18n("Invalid Byteorder.")) ));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Bit Order"),
|
||||
QString((audio->sound_bit_order==ALeastSignificant)?
|
||||
i18n("ALeastSignificant (LSB)") :
|
||||
((audio->sound_bit_order==AMostSignificant) ?
|
||||
i18n("AMostSignificant (MSB)"):i18n("Invalid Bitorder.")) ));
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Data Formats"));
|
||||
for ( i = 0; i < audio->n_data_format; i++ ) {
|
||||
if (audio->data_format_list[i] <= ADFLin8Offset)
|
||||
new QListViewItem(olditem, QString(formatNames[audio->data_format_list[i]]));
|
||||
}
|
||||
olditem->setOpen(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Sampling Rates"));
|
||||
for ( i = 0; i < audio->n_sampling_rate; i++ ) {
|
||||
new QListViewItem(olditem, Value(audio->sampling_rate_list[i]));
|
||||
}
|
||||
olditem->setOpen(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Input Sources"));
|
||||
if ( audio->input_sources & AMonoMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Microphone"));
|
||||
if ( audio->input_sources & AMonoAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Auxiliary"));
|
||||
if ( audio->input_sources & ALeftMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Left-Microphone"));
|
||||
if ( audio->input_sources & ARightMicrophoneMask )
|
||||
new QListViewItem(olditem, i18n("Right-Microphone"));
|
||||
if ( audio->input_sources & ALeftAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Left-Auxiliary"));
|
||||
if ( audio->input_sources & ARightAuxiliaryMask )
|
||||
new QListViewItem(olditem, i18n("Right-Auxiliary"));
|
||||
olditem->setOpen(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem,i18n("Input Channels"));
|
||||
if ( audio->input_channels & AMonoInputChMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Channel"));
|
||||
if ( audio->input_channels & ALeftInputChMask )
|
||||
new QListViewItem(olditem, i18n("Left-Channel"));
|
||||
if ( audio->input_channels & ARightInputChMask )
|
||||
new QListViewItem(olditem, i18n("Right-Channel"));
|
||||
olditem->setOpen(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Output Destinations"));
|
||||
if ( audio->output_destinations & AMonoIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Mono-InternalSpeaker"));
|
||||
if ( audio->output_destinations & AMonoJackMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Jack"));
|
||||
if ( audio->output_destinations & ALeftIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Left-InternalSpeaker"));
|
||||
if ( audio->output_destinations & ARightIntSpeakerMask )
|
||||
new QListViewItem(olditem, i18n("Right-InternalSpeaker"));
|
||||
if ( audio->output_destinations & ALeftJackMask )
|
||||
new QListViewItem(olditem, i18n("Left-Jack"));
|
||||
if ( audio->output_destinations & ARightJackMask )
|
||||
new QListViewItem(olditem, i18n("Right-Jack"));
|
||||
olditem->setOpen(true);
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Output Channels"));
|
||||
if ( audio->output_channels & AMonoOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Mono-Channel"));
|
||||
if ( audio->output_channels & ALeftOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Left-Channel"));
|
||||
if ( audio->output_channels & ARightOutputChMask )
|
||||
new QListViewItem(olditem, i18n("Right-Channel"));
|
||||
olditem->setOpen(true);
|
||||
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Gain"));
|
||||
new QListViewItem(olditem, i18n("Input Gain Limits"),
|
||||
Value(audio->max_input_gain));
|
||||
new QListViewItem(olditem,i18n("Output Gain Limits"),
|
||||
Value(audio->min_output_gain) + QString(" ")
|
||||
+ Value(audio->max_output_gain));
|
||||
new QListViewItem(olditem, i18n("Monitor Gain Limits"),
|
||||
Value(audio->min_monitor_gain) + QString(" ")
|
||||
+ Value(audio->max_monitor_gain));
|
||||
new QListViewItem(olditem, i18n("Gain Restricted"),
|
||||
Value(audio->gm_gain_restricted));
|
||||
olditem->setOpen(true);
|
||||
|
||||
|
||||
olditem = new QListViewItem(lBox, olditem,i18n("Lock"),
|
||||
Value(audio->lock));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Queue Length"),
|
||||
Value(audio->qlen));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Block Size"),
|
||||
Value(audio->block_size));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Stream Port (decimal)"),
|
||||
Value(audio->stream_port));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Ev Buffer Size"),
|
||||
Value(audio->ev_buf_size));
|
||||
olditem = new QListViewItem(lBox, olditem, i18n("Ext Number"),
|
||||
Value(audio->ext_number));
|
||||
|
||||
ACloseAudio( audio, &status );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // defined(HAVE_ALIB_H)
|
|
@ -1,541 +0,0 @@
|
|||
/*
|
||||
|
||||
Linux-specific Information about the Hardware.
|
||||
|
||||
(C) Copyright 1998-2001 by Helge Deller <deller@gmx.de>
|
||||
|
||||
To do (maybe?):
|
||||
- include Information about XFree86 and/or Accelerated X
|
||||
(needs to change configure-script, to see, if Header-files are available !)
|
||||
- maybe also include information about the video-framebuffer devices
|
||||
- rewrite detection-routines (maybe not to use the /proc-fs)
|
||||
- more & better sound-information
|
||||
|
||||
/dev/sndstat support added: 1998-12-08 Duncan Haldane (f.d.m.haldane@cwix.com)
|
||||
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <syscall.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/stat.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <ctype.h>
|
||||
#include "config-infocenter.h"
|
||||
|
||||
#ifdef HAVE_FSTAB_H /* some Linux-versions don't have fstab.h */
|
||||
# include <fstab.h>
|
||||
# include <sys/statfs.h>
|
||||
# define INFO_PARTITIONS_FULL_INFO /* show complete info */
|
||||
#elif defined HAVE_MNTENT_H /* but maybe they have mntent.h ? */
|
||||
# include <mntent.h>
|
||||
# include <sys/vfs.h>
|
||||
# define INFO_PARTITIONS_FULL_INFO /* show complete info */
|
||||
#else
|
||||
# undef INFO_PARTITIONS_FULL_INFO /* no partitions-info */
|
||||
#endif
|
||||
|
||||
#include <QRegExp>
|
||||
|
||||
#include <kiconloader.h>
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_CPU "/proc/cpuinfo"
|
||||
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_IRQ "/proc/interrupts"
|
||||
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_DMA "/proc/dma"
|
||||
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_PCI "/proc/pci"
|
||||
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_IOPORTS "/proc/ioports"
|
||||
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEV_SNDSTAT "/dev/sndstat"
|
||||
#define INFO_SOUND "/proc/sound"
|
||||
#define INFO_ASOUND "/proc/asound/oss/sndstat"
|
||||
#define INFO_ASOUND09 "/proc/asound/sndstat"
|
||||
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_DEVICES "/proc/devices"
|
||||
#define INFO_MISC "/proc/misc"
|
||||
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_SCSI "/proc/scsi/scsi"
|
||||
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_PARTITIONS "/proc/partitions"
|
||||
#define INFO_MOUNTED_PARTITIONS "/etc/mtab" /* on Linux... */
|
||||
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
#define MAXCOLUMNWIDTH 600
|
||||
|
||||
bool GetInfo_ReadfromFile(Q3ListView * lbox, const char *FileName,
|
||||
const QChar& splitChar,
|
||||
Q3ListViewItem * lastitem = 0,
|
||||
Q3ListViewItem ** newlastitem = 0)
|
||||
{
|
||||
bool added = false;
|
||||
QFile file(FileName);
|
||||
|
||||
if (!file.exists()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
/* *GetInfo_ErrorString =
|
||||
i18n("You do not have read-access to the file %1.\nPlease ask your system administrator for advice.")
|
||||
.arg(FileName);
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
QTextStream stream(&file);
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
QString s1, s2;
|
||||
if (!line.isEmpty()) {
|
||||
if (!splitChar.isNull()) {
|
||||
int pos = line.indexOf(splitChar);
|
||||
s1 = line.left(pos-1).trimmed();
|
||||
s2 = line.mid(pos+1).trimmed();
|
||||
}
|
||||
else
|
||||
s1 = line;
|
||||
}
|
||||
lastitem = new Q3ListViewItem(lbox, lastitem, s1, s2);
|
||||
added = true;
|
||||
line = stream.readLine();
|
||||
}
|
||||
|
||||
file.close();
|
||||
if (newlastitem)
|
||||
*newlastitem = lastitem;
|
||||
|
||||
return added;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool GetInfo_CPU(Q3ListView * lBox)
|
||||
{
|
||||
lBox->addColumn(i18n("Information"));
|
||||
lBox->addColumn(i18n("Value"));
|
||||
return GetInfo_ReadfromFile(lBox, INFO_CPU, ':');
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_IRQ(Q3ListView * lBox)
|
||||
{
|
||||
lBox->setFont(KGlobalSettings::fixedFont());
|
||||
return GetInfo_ReadfromFile(lBox, INFO_IRQ, 0);
|
||||
}
|
||||
|
||||
bool GetInfo_DMA(Q3ListView * lBox)
|
||||
{
|
||||
QFile file(INFO_DMA);
|
||||
|
||||
lBox->addColumn(i18n("DMA-Channel"));
|
||||
lBox->addColumn(i18n("Used By"));
|
||||
|
||||
if (file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
QString line;
|
||||
Q3ListViewItem *child=0L;
|
||||
|
||||
line = stream.readLine();
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
QRegExp rx("^\\s*(\\S+)\\s*:\\s*(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
child = new Q3ListViewItem(lBox,child,rx.cap(1),rx.cap(2));
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI(Q3ListView * lBox)
|
||||
{
|
||||
int num;
|
||||
sorting_allowed = false; /* no sorting by user */
|
||||
|
||||
/* ry to get the output of the lspci package first */
|
||||
if ((num = GetInfo_ReadfromPipe(lBox, "lspci -v", true)) ||
|
||||
(num = GetInfo_ReadfromPipe(lBox, "/sbin/lspci -v", true)) ||
|
||||
(num = GetInfo_ReadfromPipe(lBox, "/usr/sbin/lspci -v", true)) ||
|
||||
(num = GetInfo_ReadfromPipe(lBox, "/usr/local/sbin/lspci -v", true)) ||
|
||||
(num = GetInfo_ReadfromPipe(lBox, "/usr/bin/lspci -v", true)))
|
||||
return num;
|
||||
|
||||
/* if lspci failed, read the contents of /proc/pci */
|
||||
return GetInfo_ReadfromFile(lBox, INFO_PCI, 0);
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports(Q3ListView * lBox)
|
||||
{
|
||||
lBox->addColumn(i18n("I/O-Range"));
|
||||
lBox->addColumn(i18n("Used By"));
|
||||
return GetInfo_ReadfromFile(lBox, INFO_IOPORTS, ':');
|
||||
}
|
||||
|
||||
bool GetInfo_Sound(Q3ListView * lBox)
|
||||
{
|
||||
sorting_allowed = false; /* no sorting by user */
|
||||
if (GetInfo_ReadfromFile(lBox, INFO_DEV_SNDSTAT, 0))
|
||||
return true;
|
||||
else if (GetInfo_ReadfromFile(lBox, INFO_SOUND, 0))
|
||||
return true;
|
||||
else if (GetInfo_ReadfromFile(lBox, INFO_ASOUND, 0))
|
||||
return true;
|
||||
else
|
||||
return GetInfo_ReadfromFile(lBox, INFO_ASOUND09, 0);
|
||||
}
|
||||
|
||||
bool GetInfo_Devices(Q3ListView * lBox)
|
||||
{
|
||||
QFile file;
|
||||
Q3ListViewItem *misc=0L;
|
||||
|
||||
lBox->setRootIsDecorated(true);
|
||||
lBox->addColumn(i18n("Devices"));
|
||||
lBox->addColumn(i18n("Major Number"));
|
||||
lBox->addColumn(i18n("Minor Number"));
|
||||
|
||||
file.setFileName(INFO_DEVICES);
|
||||
if (file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
Q3ListViewItem *parent=0L, *child=0L;
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
if (-1 != line.indexOf("character device",0,Qt::CaseInsensitive)) {
|
||||
parent = new Q3ListViewItem(lBox,parent,i18n("Character Devices"));
|
||||
parent->setPixmap(0,SmallIcon("chardevice"));
|
||||
parent->setOpen(true);
|
||||
} else if (-1 != line.indexOf("block device",0,Qt::CaseInsensitive)) {
|
||||
parent = new Q3ListViewItem(lBox,parent,i18n("Block Devices"));
|
||||
parent->setPixmap(0,SmallIcon("blockdevice"));
|
||||
parent->setOpen(true);
|
||||
} else {
|
||||
QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
if (parent) {
|
||||
child = new Q3ListViewItem(parent,child,rx.cap(2),rx.cap(1));
|
||||
} else {
|
||||
child = new Q3ListViewItem(lBox,parent,rx.cap(2),rx.cap(1));
|
||||
}
|
||||
if (rx.cap(2)=="misc") {
|
||||
misc=child;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
file.setFileName(INFO_MISC);
|
||||
if (misc && file.exists() && file.open(QIODevice::ReadOnly)) {
|
||||
QTextStream stream(&file);
|
||||
Q3ListViewItem *child=0L;
|
||||
|
||||
misc->setText(0,i18n("Miscellaneous Devices"));
|
||||
misc->setPixmap(0,SmallIcon("memory"));
|
||||
misc->setOpen(true);
|
||||
|
||||
QString line = stream.readLine();
|
||||
|
||||
while (!line.isNull()) {
|
||||
if (!line.isEmpty()) {
|
||||
QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
|
||||
if (-1 != rx.indexIn(line)) {
|
||||
child = new Q3ListViewItem(misc,child,rx.cap(2),"10",rx.cap(1));
|
||||
}
|
||||
}
|
||||
line = stream.readLine();
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI(Q3ListView * lBox)
|
||||
{
|
||||
return GetInfo_ReadfromFile(lBox, INFO_SCSI, 0);
|
||||
}
|
||||
|
||||
static void cleanPassword(QString & str)
|
||||
{
|
||||
int index = 0;
|
||||
QString passwd("password=");
|
||||
|
||||
while (index >= 0)
|
||||
{
|
||||
index = str.indexOf(passwd, index, Qt::CaseInsensitive);
|
||||
if (index >= 0) {
|
||||
index += passwd.length();
|
||||
while (index < (int) str.length() &&
|
||||
str[index] != ' ' && str[index] != ',')
|
||||
str[index++] = '*';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef INFO_PARTITIONS_FULL_INFO
|
||||
|
||||
bool GetInfo_Partitions(Q3ListView * lBox)
|
||||
{
|
||||
return GetInfo_ReadfromFile(lBox, INFO_PARTITIONS, 0);
|
||||
}
|
||||
|
||||
#else /* INFO_PARTITIONS_FULL_INFO */
|
||||
|
||||
// Some Ideas taken from garbazo from his source in info_fbsd.cpp
|
||||
|
||||
|
||||
#if ( defined(HAVE_LINUX_RAW_H) || defined(HAVE_SYS_RAW_H) ) && defined(HAVE_SYS_IOCTL_H) && defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#if defined(HAVE_SYS_RAW_H)
|
||||
#include <sys/raw.h>
|
||||
#elif defined(HAVE_LINUX_RAW_H)
|
||||
#include <linux/raw.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* get raw device bindings and information
|
||||
*/
|
||||
void Get_LinuxRawDevices(Q3ListView *lbox)
|
||||
{
|
||||
int f, i, err;
|
||||
int new_raw_devs = 1;
|
||||
struct raw_config_request rq;
|
||||
QString devname;
|
||||
QString MB(i18n("MB")); /* "MB" = "Mega-Byte" */
|
||||
|
||||
/* try to open the raw device control file */
|
||||
f = open("/dev/rawctl", O_RDWR);
|
||||
if (f == -1) {
|
||||
f = open("/dev/raw", O_RDWR);
|
||||
new_raw_devs = 0;
|
||||
}
|
||||
if (f == -1)
|
||||
return;
|
||||
|
||||
for (i=1; i<256; i++) {
|
||||
rq.raw_minor = i;
|
||||
if (ioctl(f, RAW_GETBIND, &rq))
|
||||
continue;
|
||||
if (!rq.block_major) /* unbound ? */
|
||||
continue;
|
||||
unsigned int minor = rq.block_minor;
|
||||
char first_letter;
|
||||
switch ((int)rq.block_major) {
|
||||
|
||||
/* IDE drives */
|
||||
case 3: first_letter = 'a';
|
||||
set_ide_name:
|
||||
devname = QString("/dev/hd%1%2")
|
||||
.arg(QChar(first_letter + minor/64))
|
||||
.arg(minor&63);
|
||||
break;
|
||||
case 22:first_letter = 'c'; goto set_ide_name;
|
||||
case 33:first_letter = 'e'; goto set_ide_name;
|
||||
case 34:first_letter = 'g'; goto set_ide_name;
|
||||
case 56:first_letter = 'i'; goto set_ide_name;
|
||||
case 57:first_letter = 'k'; goto set_ide_name;
|
||||
case 88:first_letter = 'm'; goto set_ide_name;
|
||||
case 89:first_letter = 'o'; goto set_ide_name;
|
||||
case 90:first_letter = 'q'; goto set_ide_name;
|
||||
case 91:first_letter = 's'; goto set_ide_name;
|
||||
|
||||
/* SCSI drives */
|
||||
case 8: first_letter = 'a';
|
||||
set_scsi_name:
|
||||
devname = QString("/dev/sd%1%2")
|
||||
.arg(QChar(first_letter + minor/16))
|
||||
.arg(minor&15);
|
||||
break;
|
||||
case 65:first_letter = 'q'; goto set_scsi_name;
|
||||
|
||||
/* Compaq /dev/cciss devices */
|
||||
case 104: case 105: case 106:
|
||||
case 107: case 108: case 109:
|
||||
devname = QString("/dev/cciss/c%1d%2")
|
||||
.arg((int)rq.block_major-104)
|
||||
.arg(minor&15);
|
||||
break;
|
||||
|
||||
/* Compaq Intelligent Drive Array (ida) */
|
||||
case 72: case 73: case 74: case 75:
|
||||
case 76: case 77: case 78: case 79:
|
||||
devname = QString("/dev/ida/c%1d%2")
|
||||
.arg((int)rq.block_major-72)
|
||||
.arg(minor&15);
|
||||
break;
|
||||
|
||||
default: devname = QString("%1/%2")
|
||||
.arg((int)rq.block_major)
|
||||
.arg(minor);
|
||||
|
||||
}
|
||||
|
||||
/* TODO: get device size */
|
||||
QString size = "";
|
||||
|
||||
new Q3ListViewItem(lbox, devname,
|
||||
QString(new_raw_devs ? "/dev/raw/raw%1" : "/dev/raw%1").arg(i),
|
||||
"raw", size, " ", "");
|
||||
}
|
||||
close(f);
|
||||
}
|
||||
#else
|
||||
#define Get_LinuxRawDevices(x) /* nothing */
|
||||
#endif
|
||||
|
||||
bool GetInfo_Partitions(Q3ListView * lbox)
|
||||
{
|
||||
#define NUMCOLS 6
|
||||
QString Title[NUMCOLS];
|
||||
QStringList Mounted_Partitions;
|
||||
bool found_in_List;
|
||||
int n;
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
struct fstab *fstab_ent;
|
||||
# define FS_NAME fstab_ent->fs_spec // device-name
|
||||
# define FS_FILE fstab_ent->fs_file // mount-point
|
||||
# define FS_TYPE fstab_ent->fs_vfstype // fs-type
|
||||
# define FS_MNTOPS fstab_ent->fs_mntops // mount-options
|
||||
#else
|
||||
struct mntent *mnt_ent;
|
||||
FILE *fp;
|
||||
# define FS_NAME mnt_ent->mnt_fsname // device-name
|
||||
# define FS_FILE mnt_ent->mnt_dir // mount-point
|
||||
# define FS_TYPE mnt_ent->mnt_type // fs-type
|
||||
# define FS_MNTOPS mnt_ent->mnt_opts // mount-options
|
||||
#endif
|
||||
|
||||
struct statfs sfs;
|
||||
quint64 total, avail;
|
||||
QString str, mountopts;
|
||||
QString MB(i18n("MB")); /* "MB" = "Mega-Byte" */
|
||||
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
if (setfsent() == 0) /* Try to open fstab */
|
||||
return false;
|
||||
#else
|
||||
if (!(fp = setmntent("/etc/fstab", "r")))
|
||||
return false;
|
||||
#endif
|
||||
|
||||
/* read the list of already mounted file-systems.. */
|
||||
QFile *file = new QFile(INFO_MOUNTED_PARTITIONS);
|
||||
if (file->open(QIODevice::ReadOnly)) {
|
||||
char buf[1024];
|
||||
while (file->readLine(buf, sizeof( buf )) > 0) {
|
||||
str = QString::fromLocal8Bit(buf);
|
||||
if (str.length()) {
|
||||
int p = str.indexOf(' '); /* find first space. */
|
||||
if (p)
|
||||
str.remove(p, 1024); /* erase all chars including space. */
|
||||
Mounted_Partitions.append(str);
|
||||
}
|
||||
}
|
||||
file->close();
|
||||
}
|
||||
delete file;
|
||||
|
||||
/* create the header-tables */
|
||||
MB = QString(" ") + MB;
|
||||
Title[0] = i18n("Device");
|
||||
Title[1] = i18n("Mount Point");
|
||||
Title[2] = i18n("FS Type");
|
||||
Title[3] = i18n("Total Size");
|
||||
Title[4] = i18n("Free Size");
|
||||
Title[5] = i18n("Mount Options");
|
||||
|
||||
for (n = 0; n < NUMCOLS; ++n)
|
||||
lbox->addColumn(Title[n]);
|
||||
|
||||
/* loop through all partitions... */
|
||||
#ifdef HAVE_FSTAB_H
|
||||
while ((fstab_ent = getfsent()) != NULL)
|
||||
#else
|
||||
while ((mnt_ent = getmntent(fp)) != NULL)
|
||||
#endif
|
||||
{
|
||||
total = avail = 0; /* initialize size.. */
|
||||
found_in_List = (Mounted_Partitions.contains(FS_NAME) > 0);
|
||||
if (found_in_List && statfs(FS_FILE, &sfs) == 0) {
|
||||
total = ((quint64) sfs.f_blocks) * sfs.f_bsize;
|
||||
avail = (getuid()? sfs.f_bavail : sfs.f_bfree)
|
||||
* ((quint64) sfs.f_bsize);
|
||||
};
|
||||
/*
|
||||
if (stat(fstab_ent->fs_file,&st)!=0)
|
||||
total = 0;
|
||||
if (!S_ISDIR(st.st_mode))
|
||||
total = 0;
|
||||
*/
|
||||
mountopts = FS_MNTOPS;
|
||||
cleanPassword(mountopts);
|
||||
if (total)
|
||||
new Q3ListViewItem(lbox, QString(FS_NAME) + " ",
|
||||
QString(FS_FILE) + " ",
|
||||
QString(FS_TYPE) + " ",
|
||||
Value((int) (((total / 1024) + 512) / 1024),
|
||||
6) + MB,
|
||||
Value((int) (((avail / 1024) + 512) / 1024),
|
||||
6) + MB, mountopts);
|
||||
else
|
||||
new Q3ListViewItem(lbox, QString(FS_NAME), QString(FS_FILE),
|
||||
QString(FS_TYPE), " ", " ", mountopts);
|
||||
}
|
||||
|
||||
#ifdef HAVE_FSTAB_H
|
||||
endfsent(); /* close fstab.. */
|
||||
#else
|
||||
endmntent(fp); /* close fstab.. */
|
||||
#endif
|
||||
|
||||
/* get raw device entires if available... */
|
||||
Get_LinuxRawDevices(lbox);
|
||||
|
||||
sorting_allowed = true; /* sorting by user allowed ! */
|
||||
lbox->setSorting(1);
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif /* INFO_PARTITIONS_FULL_INFO */
|
||||
|
||||
|
||||
|
||||
|
||||
bool GetInfo_XServer_and_Video(Q3ListView * lBox)
|
||||
{
|
||||
return GetInfo_XServer_Generic(lBox);
|
||||
}
|
|
@ -1,313 +0,0 @@
|
|||
/*
|
||||
* info_netbsd.cpp is part of the KDE program kcminfo. This displays
|
||||
* various information about the OpenBSD system it's running on.
|
||||
*
|
||||
* Originally written by Jaromir Dolecek <dolecek@ics.muni.cz>. CPU info
|
||||
* code has been imported from implementation of processor.cpp for KDE 1.0
|
||||
* by David Brownlee <abs@NetBSD.org> as found in NetBSD packages collection.
|
||||
* Hubert Feyer <hubertf@NetBSD.org> enhanced the sound information printing
|
||||
* quite a lot, too.
|
||||
*
|
||||
* The code is placed into public domain. Do whatever you want with it.
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
/*
|
||||
* all following functions should return true, when the Information
|
||||
* was filled into the lBox-Widget. Returning false indicates that
|
||||
* information was not available.
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <stdio.h> /* for NULL */
|
||||
#include <stdlib.h> /* for malloc(3) */
|
||||
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <Q3StrList>
|
||||
#include <QTextStream>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int string;
|
||||
int name;
|
||||
const char *title;
|
||||
} hw_info_mib_list_t;
|
||||
|
||||
bool GetInfo_CPU(Q3ListView *lBox)
|
||||
{
|
||||
static hw_info_mib_list_t hw_info_mib_list[]= {
|
||||
{ 1, HW_MODEL, "Model" },
|
||||
{ 1, HW_MACHINE, "Machine" },
|
||||
{ 0, HW_NCPU, "Number of CPUs" },
|
||||
{ 0, HW_PAGESIZE, "Pagesize" },
|
||||
{ 0,0,0 }
|
||||
};
|
||||
hw_info_mib_list_t *hw_info_mib;
|
||||
|
||||
int mib[2], num;
|
||||
char *buf;
|
||||
size_t len;
|
||||
QString value;
|
||||
|
||||
lBox->addColumn(i18n("Information"));
|
||||
lBox->addColumn(i18n("Value"));
|
||||
|
||||
for ( hw_info_mib = hw_info_mib_list ; hw_info_mib->title ; ++hw_info_mib )
|
||||
{
|
||||
mib[0] = CTL_HW;
|
||||
mib[1] = hw_info_mib->name;
|
||||
if ( hw_info_mib->string ) {
|
||||
sysctl(mib,2,NULL,&len,NULL,0);
|
||||
if ( (buf = (char*)malloc(len)) ) {
|
||||
sysctl(mib,2,buf,&len,NULL,0);
|
||||
value = QString::fromLocal8Bit(buf);
|
||||
free(buf);
|
||||
}
|
||||
else {
|
||||
value = QString("Unknown");
|
||||
}
|
||||
}
|
||||
else {
|
||||
len = sizeof(num);
|
||||
sysctl(mib,2,&num,&len,NULL,0);
|
||||
value.sprintf("%d", num);
|
||||
}
|
||||
new Q3ListViewItem(lBox, hw_info_mib->title, value);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// this is used to find out which devices are currently
|
||||
// on system
|
||||
static bool GetDmesgInfo(Q3ListView *lBox, const char *filter,
|
||||
void func(Q3ListView *, QString s, void **, bool))
|
||||
{
|
||||
QFile *dmesg = new QFile("/var/run/dmesg.boot");
|
||||
bool usepipe=false;
|
||||
FILE *pipe=NULL;
|
||||
QTextStream *t;
|
||||
bool seencpu=false;
|
||||
void *opaque=NULL;
|
||||
QString s;
|
||||
bool found=false;
|
||||
|
||||
if (dmesg->exists() && dmesg->open(QIODevice::ReadOnly)) {
|
||||
t = new QTextStream(dmesg);
|
||||
}
|
||||
else {
|
||||
delete dmesg;
|
||||
pipe = popen("/sbin/dmesg", "r");
|
||||
if (!pipe) return false;
|
||||
usepipe = true;
|
||||
t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
}
|
||||
|
||||
Q3ListViewItem *olditem = NULL;
|
||||
while(!(s = t->readLine()).isNull()) {
|
||||
if (!seencpu) {
|
||||
if (s.contains("cpu"))
|
||||
seencpu = true;
|
||||
else
|
||||
continue;
|
||||
}
|
||||
if (s.contains("boot device") ||
|
||||
s.contains("WARNING: old BSD partition ID!"))
|
||||
break;
|
||||
|
||||
if (!filter || s.contains(filter)) {
|
||||
if (func) {
|
||||
func(lBox, s, &opaque, false);
|
||||
}
|
||||
else {
|
||||
olditem = new Q3ListViewItem(lBox, olditem, s);
|
||||
}
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (func) {
|
||||
func(lBox, s, &opaque, true);
|
||||
}
|
||||
//lBox->triggerUpdate();
|
||||
|
||||
delete t;
|
||||
if (pipe) {
|
||||
pclose(pipe);
|
||||
}
|
||||
else {
|
||||
dmesg->close();
|
||||
delete dmesg;
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
void AddIRQLine(Q3ListView *lBox, QString s, void **opaque, bool ending)
|
||||
{
|
||||
Q3StrList *strlist = (Q3StrList *) *opaque;
|
||||
const char *str;
|
||||
int pos, irqnum=0;
|
||||
const char *p;
|
||||
p = s.toLatin1();
|
||||
|
||||
if (!strlist) {
|
||||
strlist = new Q3StrList();
|
||||
*opaque = (void *) strlist;
|
||||
}
|
||||
if (ending) {
|
||||
str = strlist->first();
|
||||
for(;str; str = strlist->next()) {
|
||||
new Q3ListViewItem(lBox, str);
|
||||
}
|
||||
delete strlist;
|
||||
return;
|
||||
}
|
||||
|
||||
pos = s.find(" irq ");
|
||||
irqnum = (pos < 0) ? 0 : atoi(&p[pos+5]);
|
||||
if (irqnum) {
|
||||
s.sprintf("%02d%s", irqnum, p);
|
||||
}
|
||||
else {
|
||||
s.sprintf("??%s", p);
|
||||
}
|
||||
strlist->inSort(s.toLatin1());
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ (Q3ListView *lBox)
|
||||
{
|
||||
lBox->addColumn(i18n("IRQ"));
|
||||
lBox->addColumn(i18n("Device"));
|
||||
(void) GetDmesgInfo(lBox, " irq ", AddIRQLine);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA (Q3ListView *)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "at pci", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No PCI devices found."));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "port 0x", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No I/O port devices found."));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "audio", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No audio devices found."));
|
||||
|
||||
// append information on any audio devices found
|
||||
Q3ListViewItem *lvitem = lbox->firstChild();
|
||||
for(; lvitem; lvitem = lvitem->nextSibling()) {
|
||||
QString s;
|
||||
int pos, len;
|
||||
const char *start, *end;
|
||||
char *dev;
|
||||
|
||||
s = lvitem->text(0);
|
||||
if ((pos = s.find("at ")) >= 0) {
|
||||
pos += 3; // skip "at "
|
||||
start = end = s.toAscii();
|
||||
for(; *end && (*end!=':') && (*end!='\n'); end++);
|
||||
len = end - start;
|
||||
dev = (char *) malloc(len + 1);
|
||||
strncpy(dev, start, len);
|
||||
dev[len] = '\0';
|
||||
|
||||
GetDmesgInfo(lbox, dev, NULL);
|
||||
|
||||
free(dev);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices (Q3ListView *lBox)
|
||||
{
|
||||
(void) GetDmesgInfo(lBox, NULL, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI (Q3ListView *lbox)
|
||||
{
|
||||
if (!GetDmesgInfo(lbox, "scsibus", NULL))
|
||||
new Q3ListViewItem(lbox, i18n("No SCSI devices found."));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions (Q3ListView *lbox)
|
||||
{
|
||||
QString s;
|
||||
char *line, *orig_line;
|
||||
const char *device, *mountpoint, *type, *flags;
|
||||
FILE *pipe = popen("/sbin/mount", "r");
|
||||
QTextStream *t;
|
||||
|
||||
if (!pipe) {
|
||||
kError(0) << i18n("Unable to run /sbin/mount.") << endl;
|
||||
return false;
|
||||
}
|
||||
t = new QTextStream(pipe, QIODevice::ReadOnly);
|
||||
|
||||
lbox->addColumn(i18n("Device"));
|
||||
lbox->addColumn(i18n("Mount Point"));
|
||||
lbox->addColumn(i18n("FS Type"));
|
||||
lbox->addColumn(i18n("Mount Options"));
|
||||
|
||||
Q3ListViewItem *olditem = 0;
|
||||
while (!(s = t->readLine()).isNull()) {
|
||||
orig_line = line = strdup(s.toLatin1());
|
||||
|
||||
device = strsep(&line, " ");
|
||||
|
||||
(void) strsep(&line, " "); // consume word "on"
|
||||
mountpoint = strsep(&line, " ");
|
||||
|
||||
(void) strsep(&line, " "); // consume word "type"
|
||||
type = strsep(&line, " ");
|
||||
|
||||
flags = line;
|
||||
|
||||
olditem = new Q3ListViewItem(lbox, olditem, device, mountpoint,
|
||||
type, flags);
|
||||
|
||||
free(orig_line);
|
||||
}
|
||||
|
||||
delete t;
|
||||
pclose(pipe);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video (Q3ListView *lBox)
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/* info_sgi.cpp
|
||||
|
||||
!!!!! this file will be included by info.cpp !!!!!
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
|
||||
#include <sys/systeminfo.h>
|
||||
|
||||
bool GetInfo_CPU( QListView *lBox )
|
||||
{
|
||||
QString str;
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_ARCHITECTURE, buf, sizeof(buf));
|
||||
str = QString::fromLocal8Bit(buf);
|
||||
new QListViewItem(lBox, str);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_IRQ( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video( QListView *lBox )
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
||||
|
|
@ -1,707 +0,0 @@
|
|||
/*
|
||||
* info_solaris.cpp
|
||||
*
|
||||
* Torsten Kasch <tk@Genetik.Uni-Bielefeld.DE>
|
||||
*/
|
||||
|
||||
#include "config-infocenter.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/mnttab.h>
|
||||
#include <kstat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/statvfs.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef HAVE_LIBDEVINFO_H
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mkdev.h>
|
||||
#include <sys/stat.h>
|
||||
#include <devid.h>
|
||||
#include <libdevinfo.h>
|
||||
#endif /* HAVE_LIBDEVINFO_H */
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
|
||||
bool GetInfo_CPU( Q3ListView *lBox ) {
|
||||
|
||||
kstat_ctl_t *kctl;
|
||||
kstat_t *ksp;
|
||||
kstat_named_t *kdata;
|
||||
char cputype[16],
|
||||
fputype[16];
|
||||
char *timetxt;
|
||||
char *ptr;
|
||||
uint32_t i, ncpus;
|
||||
unsigned long state_begin;
|
||||
QString state;
|
||||
QString mhz;
|
||||
QString inst;
|
||||
|
||||
/*
|
||||
* get a kstat handle first and update the user's kstat chain
|
||||
*/
|
||||
if( (kctl = kstat_open()) == NULL ) {
|
||||
return false;
|
||||
}
|
||||
while( kstat_chain_update( kctl ) != 0 )
|
||||
;
|
||||
|
||||
/*
|
||||
* get the # of CPUs
|
||||
*/
|
||||
if( (ksp = kstat_lookup( kctl, "unix", 0, "system_misc" )) == NULL ) {
|
||||
return false;
|
||||
}
|
||||
if( kstat_read( kctl, ksp, NULL ) == -1 ) {
|
||||
return false;
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "ncpus" );
|
||||
if( kdata != NULL ) {
|
||||
ncpus = kdata->value.ui32;
|
||||
} else {
|
||||
ncpus = 0;
|
||||
}
|
||||
|
||||
lBox->addColumn( i18n( "Instance" ));
|
||||
lBox->addColumn( i18n( "CPU Type" ));
|
||||
lBox->addColumn( i18n( "FPU Type" ));
|
||||
lBox->addColumn( i18n( "MHz" ));
|
||||
lBox->addColumn( i18n( "State" ));
|
||||
|
||||
/*
|
||||
* get the per-processor info
|
||||
*/
|
||||
for( i = 0; i < ncpus; i++ ) {
|
||||
|
||||
if( (ksp = kstat_lookup( kctl, "cpu_info", i, NULL )) == NULL ){
|
||||
return false;
|
||||
}
|
||||
|
||||
if( kstat_read( kctl, ksp, NULL ) == -1 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
inst.setNum( i );
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "cpu_type" );
|
||||
if( kdata != NULL ) {
|
||||
strcpy( cputype, kdata->value.c );
|
||||
} else {
|
||||
sprintf( cputype, "???" );
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "fpu_type" );
|
||||
if( kdata != NULL ) {
|
||||
strcpy( fputype, kdata->value.c );
|
||||
} else {
|
||||
sprintf( fputype, "???" );
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "clock_MHz" );
|
||||
if( kdata != NULL ) {
|
||||
mhz.setNum( kdata->value.ul );
|
||||
} else {
|
||||
mhz.setNum( 0 );
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "state" );
|
||||
if( kdata != NULL ) {
|
||||
state = QString( kdata->value.c );
|
||||
} else {
|
||||
state = "???";
|
||||
}
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "state_begin" );
|
||||
if( kdata != NULL ) {
|
||||
state_begin = kdata->value.i32;
|
||||
if( (timetxt = ctime( (time_t *) &state_begin )) != NULL ) {
|
||||
ptr = strrchr( timetxt, '\n' );
|
||||
*ptr = '\0';
|
||||
state += " since " + QString( timetxt );
|
||||
}
|
||||
}
|
||||
|
||||
new Q3ListViewItem( lBox, inst, cputype, fputype, mhz, state );
|
||||
}
|
||||
|
||||
// sorting_allowed = true;
|
||||
lBox->setSorting( 0 );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IRQ( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions( Q3ListView *lBox ) {
|
||||
|
||||
FILE *mnttab;
|
||||
struct mnttab mnt;
|
||||
struct statvfs statbuf;
|
||||
fsblkcnt_t tmp;
|
||||
QString total;
|
||||
QString avail;
|
||||
time_t mnttime;
|
||||
char *timetxt;
|
||||
char *ptr;
|
||||
|
||||
if( (mnttab = fopen( MNTTAB, "r" )) == NULL ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* set up column headers
|
||||
*/
|
||||
lBox->addColumn( i18n( "Device" ));
|
||||
lBox->addColumn( i18n( "Mount Point" ));
|
||||
lBox->addColumn( i18n( "FS Type" ));
|
||||
lBox->addColumn( i18n( "Total Size" ));
|
||||
// XXX: FIXME: how do I set column alignment correctly?
|
||||
lBox->setColumnAlignment( 3, 2 );
|
||||
lBox->addColumn( i18n( "Free Size" ));
|
||||
// XXX: FIXME: how do I set column alignment correctly?
|
||||
lBox->setColumnAlignment( 4, 2 );
|
||||
lBox->addColumn( i18n( "Mount Time" ));
|
||||
lBox->addColumn( i18n( "Mount Options" ));
|
||||
|
||||
/*
|
||||
* get info about mounted file systems
|
||||
*/
|
||||
rewind( mnttab );
|
||||
while( getmntent( mnttab, &mnt ) == 0 ) {
|
||||
/*
|
||||
* skip fstype "nfs" and "autofs" for two reasons:
|
||||
* o if the mountpoint is visible, the fs is not
|
||||
* necessarily available (autofs option "-nobrowse")
|
||||
* and we don't want to mount every remote fs just
|
||||
* to get its size, do we?
|
||||
* o the name "Partitions" for this statistics implies
|
||||
* "local file systems only"
|
||||
*/
|
||||
if( (strcmp( mnt.mnt_fstype, "nfs" ) == 0)
|
||||
|| (strcmp( mnt.mnt_fstype, "autofs" ) == 0) )
|
||||
continue;
|
||||
if( statvfs( mnt.mnt_mountp, &statbuf ) == 0 ) {
|
||||
if( statbuf.f_blocks > 0 ) {
|
||||
/*
|
||||
* produce output in KB, MB, or GB for
|
||||
* readability -- unfortunately, this
|
||||
* breaks sorting for these columns...
|
||||
*/
|
||||
tmp = statbuf.f_blocks
|
||||
* (statbuf.f_frsize / 1024);
|
||||
if( tmp > 9999 ) {
|
||||
tmp /= 1024;
|
||||
if( tmp > 9999 ) {
|
||||
tmp /= 1024;
|
||||
total.setNum( tmp );
|
||||
total += " G";
|
||||
} else {
|
||||
total.setNum( tmp );
|
||||
total += " M";
|
||||
}
|
||||
} else {
|
||||
total.setNum( tmp );
|
||||
total += " K";
|
||||
}
|
||||
// avail.setNum( statbuf.f_bavail );
|
||||
// avail += " K";
|
||||
tmp = statbuf.f_bavail
|
||||
* (statbuf.f_frsize / 1024);
|
||||
if( tmp > 9999 ) {
|
||||
tmp /= 1024;
|
||||
if( tmp > 9999 ) {
|
||||
tmp /= 1024;
|
||||
avail.setNum( tmp );
|
||||
avail += " G";
|
||||
} else {
|
||||
avail.setNum( tmp );
|
||||
avail += " M";
|
||||
}
|
||||
} else {
|
||||
avail.setNum( tmp );
|
||||
avail += " K";
|
||||
}
|
||||
} else {
|
||||
total = "-";
|
||||
avail = "-";
|
||||
}
|
||||
} else {
|
||||
total = "???";
|
||||
avail = "???";
|
||||
}
|
||||
/*
|
||||
* ctime() adds a '\n' which we have to remove
|
||||
* so that we get a one-line output for the Q3ListViewItem
|
||||
*/
|
||||
mnttime = (time_t) atol( mnt.mnt_time );
|
||||
if( (timetxt = ctime( &mnttime )) != NULL ) {
|
||||
ptr = strrchr( timetxt, '\n' );
|
||||
*ptr = '\0';
|
||||
}
|
||||
|
||||
new Q3ListViewItem(
|
||||
lBox,
|
||||
mnt.mnt_special,
|
||||
mnt.mnt_mountp,
|
||||
mnt.mnt_fstype,
|
||||
total,
|
||||
avail,
|
||||
QString( timetxt ),
|
||||
mnt.mnt_mntopts
|
||||
);
|
||||
}
|
||||
fclose( mnttab );
|
||||
|
||||
lBox->setSorting( 0 );
|
||||
// sorting_allowed = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video( Q3ListView *lBox ) {
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBDEVINFO_H
|
||||
/*
|
||||
* get Solaris' device configuration data through libdevinfo(3)
|
||||
* and display it in a prtconf(1M) style tree
|
||||
*
|
||||
* NOTE: though the devinfo library seems to be present on earlier
|
||||
* Solaris releases, this interface is documented to be available
|
||||
* since Solaris 7 (libdevinfo.h is missing on pre-Solaris 7 systems)
|
||||
*
|
||||
* documentation for libdevinfo(3) including code samples on which
|
||||
* this implementation is based on is available at
|
||||
* http://soldc.sun.com/developer/support/driver/wps/libdevinfo/
|
||||
*/
|
||||
|
||||
/*
|
||||
* we start with various helper routines for GetInfo_Devices()
|
||||
*/
|
||||
|
||||
/*
|
||||
* mktree() -- break up the device path and place its components
|
||||
* into the tree widget
|
||||
*/
|
||||
Q3ListViewItem *mktree( Q3ListViewItem *top, const char *path ) {
|
||||
|
||||
Q3ListViewItem *parent,
|
||||
*previous,
|
||||
*result;
|
||||
char *str = strdup( path ),
|
||||
*token;
|
||||
|
||||
/*
|
||||
* start at "/"
|
||||
*/
|
||||
parent = top;
|
||||
result = (*top).firstChild();
|
||||
previous = (*top).firstChild();
|
||||
|
||||
token = strtok( str, "/" );
|
||||
while( token != NULL ) {
|
||||
/*
|
||||
* find insert pos:
|
||||
* try to match the node at the current level
|
||||
*
|
||||
* NOTE: this implementation assumes that there are
|
||||
* no two nodes with identical names at the
|
||||
* same level of the device tree
|
||||
*/
|
||||
while( result != NULL ) {
|
||||
if( strcmp( token, (*result).text( 0 ).toLatin1()) == 0 )
|
||||
break;
|
||||
previous = result;
|
||||
result = (*result).nextSibling();
|
||||
}
|
||||
if( result == NULL ) {
|
||||
/*
|
||||
* we haven't found the node, create a new one
|
||||
*/
|
||||
result = new Q3ListViewItem( parent,
|
||||
previous,
|
||||
token );
|
||||
} else {
|
||||
/*
|
||||
* we've found the node
|
||||
*/
|
||||
parent = result;
|
||||
previous = NULL;
|
||||
if( (*result).firstChild() == NULL ) {
|
||||
/*
|
||||
* create new node during next iteration
|
||||
*/
|
||||
result->setExpandable( true );
|
||||
result->setOpen( false );
|
||||
} else {
|
||||
/*
|
||||
* follow the child path
|
||||
*/
|
||||
result = (*result).firstChild();
|
||||
}
|
||||
}
|
||||
token = strtok( NULL, "/" );
|
||||
}
|
||||
free( str );
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
||||
/*
|
||||
* prop_type_str() -- return the property type as a string
|
||||
*/
|
||||
char *prop_type_str( di_prop_t prop ) {
|
||||
|
||||
switch( di_prop_type( prop )) {
|
||||
case DI_PROP_TYPE_UNDEF_IT:
|
||||
return( "undefined" );
|
||||
case DI_PROP_TYPE_BOOLEAN:
|
||||
return( "BOOL" );
|
||||
case DI_PROP_TYPE_INT:
|
||||
return( "INT" );
|
||||
case DI_PROP_TYPE_STRING:
|
||||
return( "STRING" );
|
||||
case DI_PROP_TYPE_BYTE:
|
||||
return( "BYTE" );
|
||||
default:
|
||||
return( "unknown" );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* prop_type_guess() -- guess the property type
|
||||
*/
|
||||
int prop_type_guess( uchar_t *data, int len ) {
|
||||
|
||||
int slen;
|
||||
int guess;
|
||||
int i, c;
|
||||
|
||||
if( len < 0 )
|
||||
return( -1 );
|
||||
else if( len == 0 )
|
||||
return( DI_PROP_TYPE_BOOLEAN );
|
||||
|
||||
slen = 0;
|
||||
guess = DI_PROP_TYPE_STRING;
|
||||
|
||||
for( i = 0; i < len; i++ ) {
|
||||
c = (int) data[i];
|
||||
switch( c ) {
|
||||
case 0:
|
||||
if( i == (len - 1 ))
|
||||
break;
|
||||
if( slen == 0 )
|
||||
guess = DI_PROP_TYPE_BYTE;
|
||||
else
|
||||
guess = slen = 0;
|
||||
break;
|
||||
default:
|
||||
if( ! isprint( c ))
|
||||
guess = DI_PROP_TYPE_BYTE;
|
||||
else
|
||||
slen++;
|
||||
}
|
||||
if( guess != DI_PROP_TYPE_STRING )
|
||||
break;
|
||||
}
|
||||
|
||||
// if( (guess == DI_PROP_TYPE_BYTE) && (len % sizeof( int ) == 0 ))
|
||||
// guess = DI_PROP_TYPE_INT;
|
||||
|
||||
return( guess );
|
||||
}
|
||||
|
||||
/*
|
||||
* dump_minor_node() -- examine a device minor node
|
||||
* this routine gets passed to di_walk_node()
|
||||
*/
|
||||
int dump_minor_node( di_node_t node, di_minor_t minor, void *arg ) {
|
||||
|
||||
Q3ListViewItem *item;
|
||||
QString majmin;
|
||||
char *type;
|
||||
dev_t dev;
|
||||
|
||||
item = new Q3ListViewItem( (Q3ListViewItem *) arg,
|
||||
di_minor_name( minor ));
|
||||
item->setExpandable( true );
|
||||
item->setOpen( false );
|
||||
new Q3ListViewItem( item, i18n( "Spectype:" ),
|
||||
(di_minor_spectype( minor ) == S_IFCHR)
|
||||
? i18n( "character special" )
|
||||
: i18n( "block special" ));
|
||||
type = di_minor_nodetype( minor );
|
||||
new Q3ListViewItem( item, i18n( "Nodetype:" ),
|
||||
(type == NULL) ? "NULL" : type );
|
||||
|
||||
if( (dev = di_minor_devt( minor )) != DDI_DEV_T_NONE ) {
|
||||
majmin.sprintf( "%ld/%ld", major( dev ), minor( dev ));
|
||||
new Q3ListViewItem( item, i18n( "Major/Minor:" ), majmin );
|
||||
}
|
||||
|
||||
if( di_minor_next( node, minor ) == DI_MINOR_NIL )
|
||||
return( DI_WALK_TERMINATE );
|
||||
else
|
||||
return( DI_WALK_CONTINUE );
|
||||
}
|
||||
|
||||
/*
|
||||
* propvalue() -- return the property value
|
||||
*/
|
||||
QString propvalue( di_prop_t prop ) {
|
||||
|
||||
int type;
|
||||
int i, n;
|
||||
char *strp;
|
||||
int *intp;
|
||||
uchar_t *bytep;
|
||||
QString result;
|
||||
|
||||
/*
|
||||
* Since a lot of printable strings seem to be tagged as 'byte',
|
||||
* we're going to guess, if the property is not STRING or INT
|
||||
* The actual type is shown in the info tree, though.
|
||||
*/
|
||||
type = di_prop_type( prop );
|
||||
if( (type != DI_PROP_TYPE_STRING) && (type != DI_PROP_TYPE_INT) ) {
|
||||
n = di_prop_bytes( prop, &bytep );
|
||||
type = prop_type_guess( bytep, n );
|
||||
}
|
||||
|
||||
result = "";
|
||||
switch( type ) {
|
||||
case DI_PROP_TYPE_STRING:
|
||||
if( (n = di_prop_strings( prop, &strp )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
result += "\"";
|
||||
result += strp;
|
||||
result += "\" ";
|
||||
strp += strlen( strp ) + 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DI_PROP_TYPE_INT:
|
||||
if( (n = di_prop_ints( prop, &intp )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
QString tmp;
|
||||
tmp.setNum( intp[i] );
|
||||
result += tmp;
|
||||
result += ' ';
|
||||
}
|
||||
}
|
||||
break;
|
||||
case DI_PROP_TYPE_BOOLEAN:
|
||||
/*
|
||||
* hmm, Sun's sample code handles the existence
|
||||
* of a boolean property as "true", whereas
|
||||
* prtconf(1M) obviously does not (Sol8, at least)
|
||||
* -- we're doing the same and handle "bool" as "byte"
|
||||
*/
|
||||
case DI_PROP_TYPE_BYTE:
|
||||
if( (n = di_prop_bytes( prop, &bytep )) < 0 ) {
|
||||
result = "(error)";
|
||||
} else {
|
||||
if( n == 0 ) {
|
||||
result = i18n( "(no value)" );
|
||||
break;
|
||||
}
|
||||
result = "0x";
|
||||
for( i = 0; i < n; i++ ) {
|
||||
QString tmp;
|
||||
unsigned byte = (unsigned) bytep[i];
|
||||
tmp.sprintf( "%2.2x", byte );
|
||||
result += tmp;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
result = "???";
|
||||
}
|
||||
|
||||
return( result );
|
||||
}
|
||||
|
||||
/*
|
||||
* dump_node() -- examine a device node and its children
|
||||
* this routine gets passed to di_walk_node()
|
||||
*/
|
||||
int dump_node( di_node_t node, void *arg ) {
|
||||
|
||||
Q3ListViewItem *top = (Q3ListViewItem *) arg,
|
||||
*parent,
|
||||
*previous;
|
||||
char *path;
|
||||
char *drivername;
|
||||
char *names;
|
||||
QString compatnames;
|
||||
int i, n;
|
||||
di_prop_t prop;
|
||||
|
||||
path = di_devfs_path( node );
|
||||
|
||||
/*
|
||||
* if this is the root node ("/"), initialize the tree
|
||||
*/
|
||||
if( strlen( path ) == 1 ) {
|
||||
top->setText( 0, QString( di_binding_name( node )));
|
||||
top->setPixmap( 0, SmallIcon( "kcmdevices" ));
|
||||
top->setOpen( true );
|
||||
top->setSelectable( false );
|
||||
top->setExpandable( false );
|
||||
}
|
||||
|
||||
/*
|
||||
* place the node in the tree
|
||||
*/
|
||||
parent = mktree( top, path );
|
||||
|
||||
/*
|
||||
* we have to handle the root node differently...
|
||||
*/
|
||||
if( strlen( path ) > 1 ) {
|
||||
parent->setExpandable( true );
|
||||
parent->setOpen( false );
|
||||
} else {
|
||||
previous = parent;
|
||||
parent = top;
|
||||
}
|
||||
|
||||
/*
|
||||
* node name and physical device path
|
||||
*/
|
||||
drivername = di_driver_name( node );
|
||||
previous = new Q3ListViewItem( parent,
|
||||
i18n( "Driver Name:" ),
|
||||
(drivername == NULL)
|
||||
? i18n( "(driver not attached)" )
|
||||
: drivername );
|
||||
previous = new Q3ListViewItem( parent, previous,
|
||||
i18n( "Binding Name:" ), di_binding_name( node ));
|
||||
|
||||
n = di_compatible_names( node, &names );
|
||||
if( n < 1 ) {
|
||||
compatnames = i18n( "(none)" );
|
||||
} else {
|
||||
for( i = 0; i < n; i++ ) {
|
||||
compatnames += names;
|
||||
compatnames += ' ';
|
||||
names += strlen( names ) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
previous = new Q3ListViewItem( parent, previous,
|
||||
i18n( "Compatible Names:" ), compatnames );
|
||||
|
||||
previous = new Q3ListViewItem( parent, previous,
|
||||
i18n( "Physical Path:" ), QString( path ));
|
||||
|
||||
/*
|
||||
* dump the node's property list (if any)
|
||||
*/
|
||||
if( (prop = di_prop_next( node, DI_PROP_NIL )) != DI_PROP_NIL ) {
|
||||
previous = new Q3ListViewItem( parent, previous, i18n( "Properties" ));
|
||||
previous->setExpandable( true );
|
||||
previous->setOpen( false );
|
||||
do {
|
||||
/*
|
||||
* property type & value
|
||||
*/
|
||||
Q3ListViewItem *tmp,
|
||||
*prev;
|
||||
tmp = new Q3ListViewItem( previous, di_prop_name( prop ));
|
||||
tmp->setExpandable( true );
|
||||
tmp->setOpen( false );
|
||||
prev = new Q3ListViewItem( tmp, i18n( "Type:" ),
|
||||
prop_type_str( prop ));
|
||||
new Q3ListViewItem( tmp, prev, i18n( "Value:" ),
|
||||
propvalue( prop ));
|
||||
} while( (prop = di_prop_next( node, prop )) != DI_PROP_NIL );
|
||||
}
|
||||
|
||||
/*
|
||||
* if there are minor nodes, expand the tree appropriately
|
||||
*/
|
||||
if( di_minor_next( node, DI_MINOR_NIL ) != DI_MINOR_NIL ) {
|
||||
previous = new Q3ListViewItem( parent, previous, i18n( "Minor Nodes" ));
|
||||
previous->setExpandable( true );
|
||||
previous->setOpen( false );
|
||||
di_walk_minor( node, NULL, 0, previous, dump_minor_node );
|
||||
}
|
||||
|
||||
return( DI_WALK_CONTINUE );
|
||||
}
|
||||
|
||||
bool GetInfo_Devices( Q3ListView *lBox ) {
|
||||
|
||||
Q3ListViewItem *top;
|
||||
di_node_t root_node;
|
||||
|
||||
/*
|
||||
* create a snapshot of the device tree
|
||||
*/
|
||||
if( (root_node = di_init( "/", DINFOCPYALL )) == DI_NODE_NIL ) {
|
||||
return( false );
|
||||
}
|
||||
// XXX: might try to di_prom_init() here as well (if we're setgid sys)
|
||||
|
||||
/*
|
||||
* prepare the tree widget
|
||||
*/
|
||||
lBox->addColumn( i18n( "Device Information" ));
|
||||
lBox->addColumn( i18n( "Value" ));
|
||||
|
||||
top = new Q3ListViewItem( lBox );
|
||||
|
||||
/*
|
||||
* traverse the device tree
|
||||
*/
|
||||
di_walk_node( root_node, DI_WALK_CLDFIRST, top, dump_node );
|
||||
|
||||
di_fini( root_node );
|
||||
|
||||
sorting_allowed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* ! HAVE_LIBDEVINFO_H */
|
||||
bool GetInfo_Devices( Q3ListView * ) {
|
||||
return false;
|
||||
}
|
||||
#endif /* ! HAVE_LIBDEVINFO_H */
|
|
@ -1,132 +0,0 @@
|
|||
/*
|
||||
info_svr4.cpp
|
||||
|
||||
UNIX System V Release 4 specific Information about the Hardware.
|
||||
Appropriate for SCO OpenServer and UnixWare.
|
||||
Written 20-Feb-99 by Ronald Joe Record (rr@sco.com)
|
||||
Initially based on info_sgi.cpp
|
||||
*/
|
||||
|
||||
#define INFO_CPU_AVAILABLE
|
||||
#define INFO_IRQ_AVAILABLE
|
||||
#define INFO_DMA_AVAILABLE
|
||||
#define INFO_PCI_AVAILABLE
|
||||
#define INFO_IOPORTS_AVAILABLE
|
||||
#define INFO_SOUND_AVAILABLE
|
||||
#define INFO_DEVICES_AVAILABLE
|
||||
#define INFO_SCSI_AVAILABLE
|
||||
#define INFO_PARTITIONS_AVAILABLE
|
||||
#define INFO_XSERVER_AVAILABLE
|
||||
|
||||
#define INFO_DEV_SNDSTAT "/dev/sndstat"
|
||||
|
||||
#include <sys/systeminfo.h>
|
||||
|
||||
/* all following functions should return true, when the Information
|
||||
was filled into the lBox-Widget.
|
||||
returning false indicates, that information was not available.
|
||||
*/
|
||||
|
||||
bool GetInfo_ReadfromFile( QListView *lBox, char *Name, char splitchar )
|
||||
{
|
||||
QString str;
|
||||
char buf[512];
|
||||
|
||||
QFile *file = new QFile(Name);
|
||||
QListViewItem* olditem = 0;
|
||||
|
||||
if(!file->open(QIODevice::ReadOnly)) {
|
||||
delete file;
|
||||
return false;
|
||||
}
|
||||
|
||||
while (file->readLine(buf,sizeof(buf)-1) > 0) {
|
||||
if (strlen(buf)) {
|
||||
char *p=buf;
|
||||
if (splitchar!=0) /* remove leading spaces between ':' and the following text */
|
||||
while (*p) {
|
||||
if (*p==splitchar) {
|
||||
*p++ = ' ';
|
||||
while (*p==' ') ++p;
|
||||
*(--p) = splitchar;
|
||||
++p;
|
||||
}
|
||||
else ++p;
|
||||
}
|
||||
|
||||
QString s1 = QString::fromLocal8Bit(buf);
|
||||
QString s2 = s1.mid(s1.find(splitchar)+1);
|
||||
|
||||
s1.truncate(s1.find(splitchar));
|
||||
if(!(s1.isEmpty() || s2.isEmpty()))
|
||||
olditem = new QListViewItem(lBox, olditem, s1, s2);
|
||||
}
|
||||
}
|
||||
file->close();
|
||||
|
||||
delete file;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_CPU( QListView *lBox )
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_ARCHITECTURE, buf, sizeof(buf));
|
||||
new QListViewItem(lBox, QString::fromLocal8Bit(buf));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool GetInfo_IRQ( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_DMA( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_PCI( QListView *lBox )
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
sysinfo(SI_BUSTYPES, buf, sizeof(buf));
|
||||
new QListViewItem(lBox, QString::fromLocal8Bit(buf));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GetInfo_IO_Ports( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Sound( QListView *lBox )
|
||||
{
|
||||
if ( GetInfo_ReadfromFile( lBox, INFO_DEV_SNDSTAT, 0 ))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Devices( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_SCSI( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_Partitions( QListView * )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetInfo_XServer_and_Video( QListView *lBox )
|
||||
{
|
||||
return GetInfo_XServer_Generic( lBox );
|
||||
}
|
||||
|
|
@ -21,16 +21,15 @@
|
|||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "memory.h"
|
||||
#include <kcomponentdata.h>
|
||||
#include <KPluginFactory>
|
||||
#include <KPluginLoader>
|
||||
|
||||
/* we have to include the info.cpp-file, to get the DEFINES about possible properties.
|
||||
example: we need the "define INFO_CPU_AVAILABLE" */
|
||||
#include "info.cpp"
|
||||
#include "info.h"
|
||||
|
||||
#include "os_current.h"
|
||||
|
||||
class KInfoModulesFactory : public KPluginFactory
|
||||
{
|
||||
|
@ -60,12 +59,6 @@ CREATE_FACTORY(CPU, i18n("Processor(s)"))
|
|||
#ifdef INFO_IRQ_AVAILABLE
|
||||
CREATE_FACTORY(IRQ, i18n("Interrupt"))
|
||||
#endif
|
||||
#ifdef INFO_PCI_AVAILABLE
|
||||
CREATE_FACTORY(PCI, i18n("PCI"))
|
||||
#endif
|
||||
#ifdef INFO_DMA_AVAILABLE
|
||||
CREATE_FACTORY(DMA, i18n("DMA-Channel"))
|
||||
#endif
|
||||
#ifdef INFO_IOPORTS_AVAILABLE
|
||||
CREATE_FACTORY(IO_Ports, i18n("I/O-Port"))
|
||||
#endif
|
||||
|
@ -75,6 +68,9 @@ CREATE_FACTORY(Sound, i18n("Soundcard"))
|
|||
#ifdef INFO_SCSI_AVAILABLE
|
||||
CREATE_FACTORY(SCSI, i18n("SCSI"))
|
||||
#endif
|
||||
#ifdef INFO_DMA_AVAILABLE
|
||||
CREATE_FACTORY(DMA, i18n("DMA-Channel"))
|
||||
#endif
|
||||
#ifdef INFO_DEVICES_AVAILABLE
|
||||
CREATE_FACTORY(Devices, i18n("Devices"))
|
||||
#endif
|
||||
|
@ -89,19 +85,13 @@ KInfoModulesFactory::KInfoModulesFactory(const char *componentName)
|
|||
: KPluginFactory(componentName)
|
||||
{
|
||||
s_instance = this;
|
||||
registerPlugin<KMemoryWidget>("memory");
|
||||
|
||||
#ifdef INFO_CPU_AVAILABLE
|
||||
registerPlugin<KCPUInfoWidget>("cpu");
|
||||
#endif
|
||||
#ifdef INFO_IRQ_AVAILABLE
|
||||
registerPlugin<KIRQInfoWidget>("irq");
|
||||
#endif
|
||||
#ifdef INFO_PCI_AVAILABLE
|
||||
registerPlugin<KPCIInfoWidget>("pci");
|
||||
#endif
|
||||
#ifdef INFO_DMA_AVAILABLE
|
||||
registerPlugin<KDMAInfoWidget>("dma");
|
||||
#endif
|
||||
#ifdef INFO_IOPORTS_AVAILABLE
|
||||
registerPlugin<KIO_PortsInfoWidget>("ioports");
|
||||
#endif
|
||||
|
@ -111,6 +101,9 @@ KInfoModulesFactory::KInfoModulesFactory(const char *componentName)
|
|||
#ifdef INFO_SCSI_AVAILABLE
|
||||
registerPlugin<KSCSIInfoWidget>("scsi");
|
||||
#endif
|
||||
#ifdef INFO_DMA_AVAILABLE
|
||||
registerPlugin<KDMAInfoWidget>("dma");
|
||||
#endif
|
||||
#ifdef INFO_DEVICES_AVAILABLE
|
||||
registerPlugin<KDevicesInfoWidget>("devices");
|
||||
#endif
|
||||
|
|
|
@ -1,493 +0,0 @@
|
|||
/*
|
||||
* memory.cpp
|
||||
*
|
||||
* prints memory-information and shows a graphical display.
|
||||
*
|
||||
* Copyright (c) 1999-2002 Helge Deller <deller@gmx.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include <sys/param.h> /* for BSD */
|
||||
|
||||
#include <QLayout>
|
||||
#include <QPainter>
|
||||
#include <QtGui/qdrawutil.h>
|
||||
|
||||
//Added by qt3to4:
|
||||
#include <QPixmap>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <klocale.h>
|
||||
#include <kglobal.h>
|
||||
#include <kdialog.h>
|
||||
#include <kseparator.h>
|
||||
#include <KPluginFactory>
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
enum { /* entries for Memory_Info[] */
|
||||
TOTAL_MEM = 0, /* total physical memory (without swaps) */
|
||||
FREE_MEM, /* total free physical memory (without swaps) */
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
SHARED_MEM, /* shared memory size */
|
||||
BUFFER_MEM, /* buffered memory size */
|
||||
#else
|
||||
ACTIVE_MEM,
|
||||
INACTIVE_MEM,
|
||||
#endif
|
||||
#endif
|
||||
CACHED_MEM, /* cache memory size (located in ram) */
|
||||
SWAP_MEM, /* total size of all swap-partitions */
|
||||
FREESWAP_MEM, /* free memory in swap-partitions */
|
||||
MEM_LAST_ENTRY
|
||||
};
|
||||
|
||||
/*
|
||||
all fetchValues()-functions should put either
|
||||
their results _OR_ the value NO_MEMORY_INFO into Memory_Info[]
|
||||
*/
|
||||
static t_memsize Memory_Info[MEM_LAST_ENTRY];
|
||||
|
||||
#define MEMORY(x) ((t_memsize) (x)) /* it's easier... */
|
||||
#define NO_MEMORY_INFO MEMORY(-1) /* DO NOT CHANGE */
|
||||
#define ZERO_IF_NO_INFO(value) ((value) != NO_MEMORY_INFO ? (value) : 0)
|
||||
|
||||
|
||||
/******************/
|
||||
/* Implementation */
|
||||
/******************/
|
||||
|
||||
static QLabel *MemSizeLabel[MEM_LAST_ENTRY][2];
|
||||
|
||||
enum { MEM_RAM_AND_HDD, MEM_RAM, MEM_HDD, MEM_LAST };
|
||||
static QLabel *Graph[MEM_LAST];
|
||||
static QLabel *GraphLabel[MEM_LAST];
|
||||
|
||||
#define SPACING 16
|
||||
|
||||
static QString formatted_unit(t_memsize value)
|
||||
{
|
||||
if (value > (1024 * 1024))
|
||||
if (value > (1024 * 1024 * 1024))
|
||||
return i18n("%1 GiB", KGlobal::locale()->formatNumber(value / (1024 * 1024 * 1024.0), 2));
|
||||
else
|
||||
return i18n("%1 MiB", KGlobal::locale()->formatNumber(value / (1024 * 1024.0), 2));
|
||||
else
|
||||
return i18n("%1 KiB", KGlobal::locale()->formatNumber(value / 1024.0, 2));
|
||||
}
|
||||
|
||||
K_PLUGIN_FACTORY_DECLARATION(KInfoModulesFactory)
|
||||
|
||||
KMemoryWidget::KMemoryWidget(QWidget *parent, const QVariantList &)
|
||||
: KCModule(KInfoModulesFactory::componentData(),parent)
|
||||
{
|
||||
|
||||
KAboutData *about =
|
||||
new KAboutData(I18N_NOOP("kcminfo"), 0,
|
||||
ki18n("KDE Panel Memory Information Control Module"),
|
||||
0, KLocalizedString(), KAboutData::License_GPL,
|
||||
ki18n("(c) 1998 - 2002 Helge Deller"));
|
||||
|
||||
about->addAuthor(ki18n("Helge Deller"), KLocalizedString(), "deller@gmx.de");
|
||||
setAboutData( about );
|
||||
|
||||
QString title, initial_str;
|
||||
QLabel *Widget = 0;
|
||||
int i, j;
|
||||
|
||||
ram_colors_initialized =
|
||||
swap_colors_initialized =
|
||||
all_colors_initialized = false;
|
||||
|
||||
setButtons(Help);
|
||||
|
||||
/* default string for no Information... */
|
||||
Not_Available_Text = i18n("Not available.");
|
||||
|
||||
QVBoxLayout *top = new QVBoxLayout(this);
|
||||
top->setMargin(0);
|
||||
top->setSpacing(KDialog::spacingHint());
|
||||
|
||||
QHBoxLayout *hbox = new QHBoxLayout();
|
||||
top->addLayout(hbox);
|
||||
|
||||
/* stretch the left side */
|
||||
hbox->addStretch();
|
||||
|
||||
/* first create the Informationtext-Widget */
|
||||
QVBoxLayout *vbox = new QVBoxLayout();
|
||||
hbox->addItem( vbox );
|
||||
vbox->setSpacing(0);
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
|
||||
switch (i) {
|
||||
case TOTAL_MEM:
|
||||
title = i18n("Total physical memory:");
|
||||
break;
|
||||
case FREE_MEM:
|
||||
title = i18n("Free physical memory:");
|
||||
break;
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
case SHARED_MEM:
|
||||
title = i18n("Shared memory:");
|
||||
break;
|
||||
case BUFFER_MEM:
|
||||
title = i18n("Disk buffers:");
|
||||
break;
|
||||
#else
|
||||
case ACTIVE_MEM:
|
||||
title = i18n("Active memory:");
|
||||
break;
|
||||
case INACTIVE_MEM:
|
||||
title = i18n("Inactive memory:");
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
case CACHED_MEM:
|
||||
title = i18n("Disk cache:");
|
||||
break;
|
||||
case SWAP_MEM:
|
||||
vbox->addSpacing(SPACING);
|
||||
title = i18n("Total swap memory:");
|
||||
break;
|
||||
case FREESWAP_MEM:
|
||||
title = i18n("Free swap memory:");
|
||||
break;
|
||||
default:
|
||||
title = "";
|
||||
break;
|
||||
};
|
||||
Widget = new QLabel(title, this);
|
||||
Widget->setAlignment( Qt::AlignLeft );
|
||||
vbox->addWidget(Widget, 1);
|
||||
}
|
||||
|
||||
/* then the memory-content-widgets */
|
||||
for (j = 0; j < 2; j++) {
|
||||
vbox = new QVBoxLayout();
|
||||
hbox->addItem( vbox );
|
||||
vbox->setSpacing(0);
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
|
||||
if (i == SWAP_MEM)
|
||||
vbox->addSpacing(SPACING);
|
||||
Widget = new QLabel(this);
|
||||
Widget->setAlignment( Qt::AlignRight );
|
||||
MemSizeLabel[i][j] = Widget;
|
||||
vbox->addWidget(Widget, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* stretch the right side */
|
||||
hbox->addStretch();
|
||||
|
||||
KSeparator *line = new KSeparator(Qt::Horizontal, this);
|
||||
top->addWidget(line);
|
||||
|
||||
/* now the Graphics */
|
||||
QString hint;
|
||||
hbox = new QHBoxLayout();
|
||||
top->addItem(hbox);
|
||||
hbox->setSpacing(1);
|
||||
for (i = MEM_RAM_AND_HDD; i < MEM_LAST; i++) {
|
||||
hbox->addSpacing(SPACING);
|
||||
vbox = new QVBoxLayout();
|
||||
hbox->addItem( vbox );
|
||||
|
||||
switch (i) {
|
||||
case MEM_RAM_AND_HDD:
|
||||
title = i18n("Total Memory");
|
||||
hint = i18n("This graph gives you an overview of the "
|
||||
"<b>total sum of physical and virtual memory</b> "
|
||||
"in your system.");
|
||||
break;
|
||||
case MEM_RAM:
|
||||
title = i18n("Physical Memory");
|
||||
hint = i18n("This graph gives you an overview of "
|
||||
"the <b>usage of physical memory</b> in your system."
|
||||
"<p>Most operating systems (including Linux) "
|
||||
"will use as much of the available physical "
|
||||
"memory as possible as disk cache, "
|
||||
"to speed up the system performance.</p>"
|
||||
"<p>This means that if you have a small amount "
|
||||
"of <b>Free Physical Memory</b> and a large amount of "
|
||||
"<b>Disk Cache Memory</b>, your system is well "
|
||||
"configured.</p>");
|
||||
break;
|
||||
case MEM_HDD:
|
||||
title = i18n("Swap Space");
|
||||
hint = i18n("The swap space is the <b>virtual memory</b> "
|
||||
"available to the system. "
|
||||
"<p>It will be used on demand and is provided "
|
||||
"through one or more swap partitions and/or swap files.</p>");
|
||||
break;
|
||||
default:
|
||||
hint = title = QString();
|
||||
break;
|
||||
};
|
||||
|
||||
if (hint.length())
|
||||
hint = "<qt>" + hint + "</qt>";
|
||||
|
||||
Widget = new QLabel("<b>" + title + "</b>", this);
|
||||
Widget->setAlignment( Qt::AlignCenter );
|
||||
Widget->setToolTip( hint);
|
||||
vbox->addWidget(Widget);
|
||||
vbox->addSpacing(SPACING / 2);
|
||||
|
||||
QLabel *g = new QLabel(this);
|
||||
g->setMinimumWidth(2 * SPACING);
|
||||
g->setMinimumHeight(3 * SPACING);
|
||||
g->setAttribute(Qt::WA_NoSystemBackground, true);
|
||||
g->setToolTip( hint); // add the tooltip
|
||||
Graph[i] = g;
|
||||
vbox->addWidget(g, 2);
|
||||
vbox->addSpacing(SPACING / 2);
|
||||
|
||||
Widget = new QLabel(this); /* xx MB used. */
|
||||
Widget->setAlignment( Qt::AlignCenter );
|
||||
Widget->setToolTip( hint);
|
||||
GraphLabel[i] = Widget;
|
||||
vbox->addWidget(Widget);
|
||||
}
|
||||
hbox->addSpacing(SPACING);
|
||||
|
||||
timer = new QTimer(this);
|
||||
timer->start(100);
|
||||
QObject::connect(timer, SIGNAL(timeout()), this,
|
||||
SLOT(update()));
|
||||
|
||||
fetchValues();
|
||||
}
|
||||
|
||||
KMemoryWidget::~KMemoryWidget()
|
||||
{
|
||||
/* stop the timer */
|
||||
timer->stop();
|
||||
}
|
||||
|
||||
|
||||
QString KMemoryWidget::quickHelp() const
|
||||
{
|
||||
return i18n("<h1>Memory Information</h1>"
|
||||
" This display shows you the current memory usage of your system."
|
||||
" The values are updated on a regular basis and give you an"
|
||||
" overview of the physical and virtual used memory." );
|
||||
}
|
||||
|
||||
|
||||
/* Graphical Memory Display */
|
||||
bool KMemoryWidget::Display_Graph(int widgetindex,
|
||||
int count,
|
||||
t_memsize total,
|
||||
t_memsize * used,
|
||||
QColor * color,
|
||||
QString *text)
|
||||
{
|
||||
QLabel *graph = Graph[widgetindex];
|
||||
int width = graph->width();
|
||||
int height = graph->height();
|
||||
QPixmap pm(width, height);
|
||||
QPainter paint;
|
||||
|
||||
paint.begin(&pm, this);
|
||||
|
||||
QPen pen(QColor(0, 0, 0));
|
||||
|
||||
if (! ZERO_IF_NO_INFO(total)) {
|
||||
paint.fillRect(1, 1, width - 2, height - 2,
|
||||
QBrush(QColor(128, 128, 128)));
|
||||
paint.setPen(pen);
|
||||
paint.drawRect(graph->rect());
|
||||
GraphLabel[widgetindex]->setText(Not_Available_Text);
|
||||
paint.end();
|
||||
bitBlt(graph, 0, 0, &pm);
|
||||
return false;
|
||||
}
|
||||
|
||||
int startline = height-2;
|
||||
int percent, localheight;
|
||||
t_memsize last_used = 0;
|
||||
|
||||
while (count--) {
|
||||
last_used = *used;
|
||||
|
||||
percent = (((qint64)last_used) * 100) / total;
|
||||
|
||||
if (count)
|
||||
localheight = ((height-2) * percent) / 100;
|
||||
else
|
||||
localheight = startline;
|
||||
|
||||
if (localheight>0) {
|
||||
paint.fillRect(1, startline, width-2, -localheight, *color);
|
||||
|
||||
if (localheight >= SPACING) {
|
||||
paint.drawText(0, startline-localheight, width, localheight,
|
||||
Qt::AlignCenter | Qt::TextWordWrap,
|
||||
QString("%1 %2%").arg(*text).arg(percent));
|
||||
}
|
||||
}
|
||||
|
||||
startline -= localheight;
|
||||
|
||||
++used;
|
||||
++color;
|
||||
++text;
|
||||
}
|
||||
|
||||
/* draw surrounding box */
|
||||
paint.setPen(pen);
|
||||
QRect r = graph->rect();
|
||||
qDrawShadePanel(&paint, r.x(), r.y(), r.width(), r.height(), palette().active(), true, 1);
|
||||
paint.end();
|
||||
graph->setPixmap(pm);
|
||||
//bitBlt(graph, 0, 0, &pm);
|
||||
|
||||
GraphLabel[widgetindex]->setText(i18n("%1 free", formatted_unit(last_used)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* update_Values() is the main-loop for updating the Memory-Information */
|
||||
void KMemoryWidget::paintEvent(QPaintEvent *)
|
||||
{
|
||||
int i;
|
||||
bool ok1;
|
||||
QLabel *label;
|
||||
t_memsize used[5];
|
||||
|
||||
fetchValues(); /* get the Information from memory_linux, memory_fbsd */
|
||||
|
||||
/* update the byte-strings */
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; i++) {
|
||||
label = MemSizeLabel[i][0];
|
||||
if (Memory_Info[i] == NO_MEMORY_INFO)
|
||||
label->clear();
|
||||
else
|
||||
label->setText(i18n("%1 bytes =",
|
||||
KGlobal::locale()->
|
||||
formatNumber(Memory_Info[i], 0)));
|
||||
}
|
||||
|
||||
/* update the MB-strings */
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; i++) {
|
||||
label = MemSizeLabel[i][1];
|
||||
label->setText((Memory_Info[i] != NO_MEMORY_INFO)
|
||||
? formatted_unit(Memory_Info[i])
|
||||
: Not_Available_Text);
|
||||
}
|
||||
|
||||
/* display graphical output (ram, hdd, at last: HDD+RAM) */
|
||||
/* be careful ! Maybe we have not all info available ! */
|
||||
|
||||
/* RAM usage: */
|
||||
/* don't rely on the SHARED_MEM value since it may refer to
|
||||
* the size of the System V sharedmem in 2.4.x. Calculate instead! */
|
||||
|
||||
used[1] = 0;
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
used[1] = ZERO_IF_NO_INFO(Memory_Info[BUFFER_MEM]);
|
||||
#endif
|
||||
#endif
|
||||
used[2] = ZERO_IF_NO_INFO(Memory_Info[CACHED_MEM]);
|
||||
used[3] = ZERO_IF_NO_INFO(Memory_Info[FREE_MEM]);
|
||||
used[0] = ZERO_IF_NO_INFO(Memory_Info[TOTAL_MEM]) - used[1] - used[2] - used[3];
|
||||
if (!ram_colors_initialized) {
|
||||
ram_colors_initialized = true;
|
||||
ram_text[0] = i18n("Application Data");
|
||||
ram_colors[0] = COLOR_USED_MEMORY; /* used+shared */
|
||||
ram_text[1] = i18n("Disk Buffers");
|
||||
ram_colors[1] = QColor(24,131,5); /* buffer */
|
||||
ram_text[2] = i18n("Disk Cache");
|
||||
ram_colors[2] = QColor(33,180,7); /* cached */
|
||||
ram_text[3] = i18n("Free Physical Memory");
|
||||
ram_colors[3] = COLOR_FREE_MEMORY; /* free */
|
||||
}
|
||||
ok1 = Display_Graph(MEM_RAM, 4, Memory_Info[TOTAL_MEM],
|
||||
used, ram_colors, ram_text);
|
||||
|
||||
/* SWAP usage: */
|
||||
used[1] = ZERO_IF_NO_INFO(Memory_Info[FREESWAP_MEM]);
|
||||
used[0] = ZERO_IF_NO_INFO(Memory_Info[SWAP_MEM]) - used[1];
|
||||
if (!swap_colors_initialized) {
|
||||
swap_colors_initialized = true;
|
||||
swap_text[0] = i18n("Used Swap");
|
||||
swap_colors[0] = COLOR_USED_SWAP; /* used */
|
||||
swap_text[1] = i18n("Free Swap");
|
||||
swap_colors[1] = COLOR_FREE_MEMORY; /* free */
|
||||
}
|
||||
Display_Graph(MEM_HDD, 2, Memory_Info[SWAP_MEM],
|
||||
used, swap_colors, swap_text);
|
||||
|
||||
/* RAM + SWAP usage: */
|
||||
if (Memory_Info[SWAP_MEM] == NO_MEMORY_INFO ||
|
||||
Memory_Info[FREESWAP_MEM] == NO_MEMORY_INFO)
|
||||
Memory_Info[SWAP_MEM] = Memory_Info[FREESWAP_MEM] = 0;
|
||||
|
||||
used[1] = Memory_Info[SWAP_MEM] - Memory_Info[FREESWAP_MEM];
|
||||
used[2] = Memory_Info[FREE_MEM] + Memory_Info[FREESWAP_MEM];
|
||||
used[0] = (Memory_Info[TOTAL_MEM]+Memory_Info[SWAP_MEM])-used[1]-used[2];
|
||||
if (!all_colors_initialized) {
|
||||
all_colors_initialized = true;
|
||||
all_text[0] = i18n("Used Physical Memory");
|
||||
all_colors[0] = COLOR_USED_MEMORY; /* used ram */
|
||||
all_text[1] = i18n("Used Swap");
|
||||
all_colors[1] = COLOR_USED_SWAP; /* used swap */
|
||||
all_text[2] = i18n("Total Free Memory");
|
||||
all_colors[2] = COLOR_FREE_MEMORY; /* free ram+swap*/
|
||||
}
|
||||
Display_Graph(MEM_RAM_AND_HDD, 3,
|
||||
ok1 ? Memory_Info[TOTAL_MEM] + Memory_Info[SWAP_MEM]
|
||||
: NO_MEMORY_INFO,
|
||||
used, all_colors, all_text);
|
||||
}
|
||||
|
||||
|
||||
/* Include system-specific code */
|
||||
|
||||
#ifdef __linux__
|
||||
#include "memory_linux.cpp"
|
||||
#elif defined(__APPLE__)
|
||||
#include "memory_osx.cpp"
|
||||
#elif defined(sgi) && sgi
|
||||
#include "memory_sgi.cpp"
|
||||
#elif defined(__svr4__) && defined(sun)
|
||||
#include "memory_solaris.cpp"
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
#include "memory_fbsd.cpp"
|
||||
#elif defined(__hpux)
|
||||
#include "memory_hpux.cpp"
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
#include "memory_netbsd.cpp"
|
||||
#elif __osf__
|
||||
#include "memory_tru64.cpp"
|
||||
#else
|
||||
|
||||
/* Default for unsupported systems */
|
||||
void KMemoryWidget::fetchValues()
|
||||
{
|
||||
int i;
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i)
|
||||
Memory_Info[i] = NO_MEMORY_INFO;
|
||||
}
|
||||
|
||||
#endif
|
||||
#include "memory.moc"
|
|
@ -1,61 +0,0 @@
|
|||
#ifndef _MEMORY_H_KDEINFO_INCLUDED_
|
||||
#define _MEMORY_H_KDEINFO_INCLUDED_
|
||||
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
|
||||
#include <kcmodule.h>
|
||||
#include <kaboutdata.h>
|
||||
class QStringList;
|
||||
|
||||
/* better to use quint64, because some 32bit-machines have more total
|
||||
memory (with swap) than just the 4GB which fits into a 32bit-long */
|
||||
typedef quint64 t_memsize;
|
||||
|
||||
#define COLOR_USED_MEMORY QColor(255,0,0)
|
||||
#define COLOR_USED_SWAP QColor(255,134,64)
|
||||
#define COLOR_FREE_MEMORY QColor(127,255,212)
|
||||
|
||||
class KMemoryWidget:public KCModule {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
KMemoryWidget(QWidget *parent, const QVariantList &);
|
||||
~KMemoryWidget();
|
||||
|
||||
QString quickHelp() const;
|
||||
|
||||
private:
|
||||
QString Not_Available_Text;
|
||||
QTimer *timer;
|
||||
|
||||
bool ram_colors_initialized,
|
||||
swap_colors_initialized,
|
||||
all_colors_initialized;
|
||||
|
||||
QColor ram_colors[4];
|
||||
QString ram_text[4];
|
||||
|
||||
QColor swap_colors[2];
|
||||
QString swap_text[2];
|
||||
|
||||
QColor all_colors[3];
|
||||
QString all_text[3];
|
||||
|
||||
void fetchValues();
|
||||
|
||||
bool Display_Graph(int widgetindex,
|
||||
int count,
|
||||
t_memsize total,
|
||||
t_memsize *used,
|
||||
QColor *color,
|
||||
QString *text);
|
||||
|
||||
void paintEvent(QPaintEvent *);
|
||||
};
|
||||
|
||||
|
||||
#endif // _MEMORY_H_KDEINFO_INCLUDED_
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
#include "kcrootonly.h"
|
||||
|
||||
#include <klocale.h>
|
||||
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
KCRootOnly::KCRootOnly(const KComponentData &componentData, QWidget *parent)
|
||||
: KCModule( componentData, parent )
|
||||
{
|
||||
QVBoxLayout *layout=new QVBoxLayout(this);
|
||||
QLabel *label = new QLabel(i18n("<big>You need super user privileges to run this control module.</big><br />"
|
||||
"Click on the \"Administrator Mode\" button below."), this);
|
||||
layout->addWidget(label);
|
||||
label->setAlignment(Qt::AlignCenter);
|
||||
label->setTextFormat(Qt::RichText);
|
||||
label->setMinimumSize(label->sizeHint());
|
||||
}
|
||||
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2001 Waldo Bastian <bastian@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef _kinfocenter_kcrootonly_
|
||||
#define _kinfocenter_kcrootonly_
|
||||
|
||||
#include <kcmodule.h>
|
||||
class KComponentData;
|
||||
|
||||
class KCRootOnly: public KCModule {
|
||||
public:
|
||||
KCRootOnly(const KComponentData &inst, QWidget *parent);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,18 +1,6 @@
|
|||
<!DOCTYPE kpartgui>
|
||||
<kpartgui name="kinfocenter" version="2">
|
||||
<MenuBar>
|
||||
<Menu name="view"><text>&View</text>
|
||||
<Menu name="view_mode"><text>&Mode</text>
|
||||
<Action name="activate_iconview"/>
|
||||
<Action name="activate_treeview"/>
|
||||
</Menu>
|
||||
<Menu name="view_iconsize"><text>Icon &Size</text>
|
||||
<Action name="activate_smallicons"/>
|
||||
<Action name="activate_mediumicons"/>
|
||||
<Action name="activate_largeicons"/>
|
||||
<Action name="activate_hugeicons"/>
|
||||
</Menu>
|
||||
</Menu>
|
||||
<Menu name="help">
|
||||
<Action name="help_about_module" append="about_merge"/>
|
||||
</Menu>
|
||||
|
|
|
@ -17,7 +17,6 @@
|
|||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Howto debug:
|
||||
* start "kinfocenter --nofork" in a debugger.
|
||||
|
@ -33,10 +32,8 @@
|
|||
*/
|
||||
|
||||
#include "main.h"
|
||||
#include "version.h"
|
||||
#include "toplevel.h"
|
||||
#include "global.h"
|
||||
#include "moduleIface.h"
|
||||
|
||||
#include <kcmdlineargs.h>
|
||||
#include <kaboutdata.h>
|
||||
|
@ -46,27 +43,18 @@
|
|||
#include <kdebug.h>
|
||||
#include <kglobal.h>
|
||||
#include <klocale.h>
|
||||
#include <kapplication.h>
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "main.moc"
|
||||
|
||||
KInfoCenterApp::KInfoCenterApp()
|
||||
: KUniqueApplication()
|
||||
, toplevel(0)
|
||||
{
|
||||
KInfoCenterApp::KInfoCenterApp() :
|
||||
KUniqueApplication() {
|
||||
|
||||
toplevel = new TopLevel();
|
||||
|
||||
// hmm? KApplication registers its KComponentData as the main and active component. Why is this
|
||||
// needed?
|
||||
//KGlobal::setActiveComponent(this);
|
||||
|
||||
// KUniqueApplication does dcop regitration for us
|
||||
ModuleIface *modIface = new ModuleIface(toplevel, "moduleIface");
|
||||
|
||||
connect (modIface, SIGNAL(helpClicked()), toplevel, SLOT(slotHelpRequest()));
|
||||
|
||||
QRect desk = KGlobalSettings::desktopGeometry(toplevel);
|
||||
KConfigGroup config(KGlobal::config(), "General");
|
||||
// Initial size is:
|
||||
|
@ -78,18 +66,16 @@ KInfoCenterApp::KInfoCenterApp()
|
|||
int fontSize = toplevel->fontInfo().pointSize();
|
||||
if (fontSize == 0)
|
||||
fontSize = (toplevel->fontInfo().pixelSize() * 72) / toplevel->logicalDpiX();
|
||||
int x = config.readEntry(QString::fromLatin1("InitialWidth %1").arg(desk.width()),
|
||||
qMin( desk.width(), 368 + (6*toplevel->logicalDpiX()*fontSize)/12 ) );
|
||||
int y = config.readEntry(QString::fromLatin1("InitialHeight %1").arg(desk.height()),
|
||||
qMin( desk.height(), 312 + (4*toplevel->logicalDpiX()*fontSize)/12 ) );
|
||||
int x = config.readEntry(QString::fromLatin1("InitialWidth %1").arg(desk.width()), qMin(desk.width(), 368 + (6*toplevel->logicalDpiX()*fontSize)/12) );
|
||||
int y = config.readEntry(QString::fromLatin1("InitialHeight %1").arg(desk.height()), qMin(desk.height(), 312 + (4*toplevel->logicalDpiX()*fontSize)/12) );
|
||||
|
||||
toplevel->resize(x, y);
|
||||
|
||||
toplevel->show();
|
||||
}
|
||||
|
||||
KInfoCenterApp::~KInfoCenterApp()
|
||||
{
|
||||
if (toplevel)
|
||||
{
|
||||
KInfoCenterApp::~KInfoCenterApp() {
|
||||
if (toplevel!=NULL) {
|
||||
KConfigGroup config(KGlobal::config(), "General");
|
||||
QDesktopWidget *desk = QApplication::desktop();
|
||||
config.writeEntry(QString::fromLatin1("InitialWidth %1").arg(desk->width()), toplevel->width());
|
||||
|
@ -103,16 +89,14 @@ extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
|
|||
KLocale::setMainCatalog("kinfocenter");
|
||||
|
||||
KAboutData aboutKInfoCenter( "kinfocenter", 0, ki18n("KDE Info Center"),
|
||||
KINFOCENTER_VERSION, ki18n("The KDE Info Center"), KAboutData::License_GPL,
|
||||
KDE_VERSION_STRING, ki18n("The KDE Info Center"), KAboutData::License_GPL,
|
||||
ki18n("(c) 1998-2004, The KDE Control Center Developers"));
|
||||
|
||||
QByteArray argv_0 = argv[0];
|
||||
KAboutData *aboutData;
|
||||
aboutData = &aboutKInfoCenter;
|
||||
KCGlobal::setIsInfoCenter(true);
|
||||
kDebug(1208) << "Running as KInfoCenter!\n";
|
||||
KAboutData *aboutData = &aboutKInfoCenter;
|
||||
|
||||
aboutData->addAuthor(ki18n("Helge Deller"), ki18n("Current Maintainer"), "deller@kde.org");
|
||||
aboutData->addAuthor(ki18n("Nicolas Ternisien"), ki18n("Current Maintainer"), "nicolas.ternisien@gmail.com");
|
||||
aboutData->addAuthor(ki18n("Helge Deller"), ki18n("Previous Maintainer"), "deller@kde.org");
|
||||
aboutData->addAuthor(ki18n("Matthias Hoelzer-Kluepfel"),KLocalizedString(), "hoelzer@kde.org");
|
||||
aboutData->addAuthor(ki18n("Matthias Elter"),KLocalizedString(), "elter@kde.org");
|
||||
aboutData->addAuthor(ki18n("Matthias Ettrich"),KLocalizedString(), "ettrich@kde.org");
|
||||
|
@ -124,8 +108,8 @@ extern "C" KDE_EXPORT int kdemain(int argc, char *argv[])
|
|||
KCGlobal::init();
|
||||
|
||||
if (!KInfoCenterApp::start()) {
|
||||
kDebug(1208) << "kinfocenter is already running!\n";
|
||||
return (0);
|
||||
kDebug() << "kinfocenter is already running!\n";
|
||||
return 0;
|
||||
}
|
||||
|
||||
KInfoCenterApp app;
|
||||
|
|
|
@ -25,8 +25,7 @@
|
|||
|
||||
class TopLevel;
|
||||
|
||||
class KInfoCenterApp : public KUniqueApplication
|
||||
{
|
||||
class KInfoCenterApp : public KUniqueApplication {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
|
14
kinfocenter/memory/CMakeLists.txt
Normal file
14
kinfocenter/memory/CMakeLists.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
|
||||
########### next target ###############
|
||||
|
||||
set(KCM_MEMORY_PART_SRCS memory.cpp chartWidget.cpp totalMemoryChart.cpp physicalMemoryChart.cpp swapMemoryChart.cpp )
|
||||
|
||||
kde4_add_plugin(kcm_memory ${KCM_MEMORY_PART_SRCS})
|
||||
|
||||
target_link_libraries(kcm_memory ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY})
|
||||
|
||||
install(TARGETS kcm_memory DESTINATION ${PLUGIN_INSTALL_DIR})
|
||||
|
||||
########### install files ###############
|
||||
|
||||
install( FILES kcm_memory.desktop DESTINATION ${SERVICES_INSTALL_DIR})
|
2
kinfocenter/memory/Messages.sh
Normal file
2
kinfocenter/memory/Messages.sh
Normal file
|
@ -0,0 +1,2 @@
|
|||
#! /usr/bin/env bash
|
||||
$XGETTEXT *.cpp -o $podir/kcm_memory.pot
|
48
kinfocenter/memory/base.h
Normal file
48
kinfocenter/memory/base.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
#ifndef SETTINGS_H_
|
||||
#define SETTINGS_H_
|
||||
|
||||
#include <QColor>
|
||||
|
||||
#define COLOR_USED_MEMORY QColor(0x83,0xDD, 0xF5)
|
||||
//start : 0x00, 0x71, 0xBC
|
||||
//end : 0x83,0xDD, 0xF5
|
||||
|
||||
//#define COLOR_USED_MEMORY QColor(236,91,47)
|
||||
|
||||
#define COLOR_USED_SWAP QColor(255,134,64)
|
||||
|
||||
//#define COLOR_FREE_MEMORY QColor(0x00, 0x71, 0xBC)
|
||||
#define COLOR_FREE_MEMORY QColor(216, 231, 227)
|
||||
|
||||
/* better to use quint64, because some 32bit-machines have more total
|
||||
memory (with swap) than just the 4GB which fits into a 32bit-long */
|
||||
typedef quint64 t_memsize;
|
||||
|
||||
|
||||
enum { /* entries for memoryInfos[] */
|
||||
TOTAL_MEM = 0, /* total physical memory (without swaps) */
|
||||
FREE_MEM, /* total free physical memory (without swaps) */
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
SHARED_MEM, /* shared memory size */
|
||||
BUFFER_MEM, /* buffered memory size */
|
||||
#else
|
||||
ACTIVE_MEM,
|
||||
INACTIVE_MEM,
|
||||
#endif
|
||||
#endif
|
||||
CACHED_MEM, /* cache memory size (located in ram) */
|
||||
SWAP_MEM, /* total size of all swap-partitions */
|
||||
FREESWAP_MEM, /* free memory in swap-partitions */
|
||||
MEM_LAST_ENTRY
|
||||
};
|
||||
|
||||
|
||||
#define MEMORY(x) ((t_memsize) (x)) /* it's easier... */
|
||||
#define NO_MEMORY_INFO MEMORY(-1) /* DO NOT CHANGE */
|
||||
#define ZERO_IF_NO_INFO(value) ((value) != NO_MEMORY_INFO ? (value) : 0)
|
||||
|
||||
|
||||
#define SPACING 16
|
||||
|
||||
#endif /*SETTINGS_H_*/
|
152
kinfocenter/memory/chartWidget.cpp
Normal file
152
kinfocenter/memory/chartWidget.cpp
Normal file
|
@ -0,0 +1,152 @@
|
|||
/***************************************************************************
|
||||
* KT list view item task implementation. *
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 1999, Gary Meyer <gary@meyer.net> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "chartWidget.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QLinearGradient>
|
||||
#include <QLabel>
|
||||
#include <QPainter>
|
||||
#include <QPen>
|
||||
#include <QColor>
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
#include <kglobal.h>
|
||||
|
||||
Chart::Chart(QWidget* parent) :
|
||||
QWidget(parent) {
|
||||
|
||||
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::MinimumExpanding);
|
||||
|
||||
memoryInfos = NULL;
|
||||
freeMemoryLabel = NULL;
|
||||
}
|
||||
|
||||
|
||||
void Chart::setMemoryInfos(t_memsize* memoryInfos) {
|
||||
this->memoryInfos = memoryInfos;
|
||||
}
|
||||
|
||||
void Chart::setFreeMemoryLabel(QLabel* freeMemoryLabel) {
|
||||
this->freeMemoryLabel = freeMemoryLabel;
|
||||
}
|
||||
|
||||
|
||||
/* Graphical Memory Display */
|
||||
bool Chart::drawChart(t_memsize total, const QList<t_memsize>& used, const QList<QColor>& colors, const QList<QString>& texts) {
|
||||
|
||||
QPainter paint(this);
|
||||
|
||||
QPen pen(QColor(0, 0, 0));
|
||||
|
||||
if (total == NO_MEMORY_INFO) {
|
||||
paint.fillRect(1, 1, width() - 2, height() - 2, QBrush(QColor(128, 128, 128)));
|
||||
paint.setPen(pen);
|
||||
paint.drawRect(rect());
|
||||
freeMemoryLabel->setText(i18n("Not available."));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int startline = height()-2;
|
||||
|
||||
int percent, localheight;
|
||||
t_memsize last_used = 0;
|
||||
|
||||
for (int count = used.size()-1; count >=0; --count) {
|
||||
last_used = used.at(count);
|
||||
QColor color = colors.at(count);
|
||||
QString text = texts.at(count);
|
||||
|
||||
percent = (((qint64)last_used) * 100) / total;
|
||||
|
||||
if (count)
|
||||
localheight = ((height()-2) * percent) / 100;
|
||||
else
|
||||
localheight = startline;
|
||||
|
||||
//kDebug() << "Count : " << count << " Percent : " << percent << "%" << " Localheight:" << localheight << endl;
|
||||
|
||||
if (localheight>0) {
|
||||
QLinearGradient gradient(QPointF(1, startline), QPointF(width()-2, -localheight));
|
||||
|
||||
QColor endProgressColor(0xFF, 0xFF, 0xFF, 100);
|
||||
gradient.setColorAt(0, color);
|
||||
gradient.setColorAt(1, endProgressColor);
|
||||
paint.fillRect(1, startline, width()-2, -localheight, gradient);
|
||||
|
||||
//paint.fillRect(1, startline, width()-2, -localheight, color);
|
||||
|
||||
if (localheight >= SPACING) {
|
||||
paint.drawText(0, startline-localheight, width(), localheight, Qt::AlignCenter | Qt::TextWordWrap, QString("%1 %2%").arg(text).arg(percent));
|
||||
}
|
||||
}
|
||||
|
||||
startline -= localheight;
|
||||
|
||||
}
|
||||
|
||||
// draw surrounding box
|
||||
paint.setPen(pen);
|
||||
QRect r = rect();
|
||||
qDrawShadePanel(&paint, r.x(), r.y(), r.width(), r.height(), palette(), true, 1);
|
||||
|
||||
freeMemoryLabel->setText(i18n("%1 free", formattedUnit(last_used)));
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
QString Chart::formattedUnit(t_memsize value) {
|
||||
if (value > (1024 * 1024))
|
||||
if (value > (1024 * 1024 * 1024))
|
||||
return i18n("%1 GiB", KGlobal::locale()->formatNumber(value / (1024 * 1024 * 1024.0), 2));
|
||||
else
|
||||
return i18n("%1 MiB", KGlobal::locale()->formatNumber(value / (1024 * 1024.0), 2));
|
||||
else
|
||||
return i18n("%1 KiB", KGlobal::locale()->formatNumber(value / 1024.0, 2));
|
||||
}
|
||||
|
||||
ChartWidget::ChartWidget(const QString& title, const QString& hint, Chart* chartImplementation, QWidget* parent) :
|
||||
QWidget(parent) {
|
||||
|
||||
QVBoxLayout* mainLayout = new QVBoxLayout(this);
|
||||
|
||||
titleLabel = new QLabel("<strong>" + title + "</strong>", this);
|
||||
titleLabel->setAlignment(Qt::AlignHCenter);
|
||||
titleLabel->setToolTip(hint);
|
||||
mainLayout->addWidget(titleLabel);
|
||||
|
||||
chart = chartImplementation;
|
||||
chart->setToolTip(hint);
|
||||
mainLayout->addWidget(chart);
|
||||
|
||||
freeMemoryLabel = new QLabel("", this);
|
||||
freeMemoryLabel->setAlignment(Qt::AlignHCenter);
|
||||
freeMemoryLabel->setToolTip(hint);
|
||||
mainLayout->addWidget(freeMemoryLabel);
|
||||
|
||||
chart->setFreeMemoryLabel(freeMemoryLabel);
|
||||
}
|
||||
|
||||
void ChartWidget::setMemoryInfos(t_memsize* memoryInfos) {
|
||||
chart->setMemoryInfos(memoryInfos);
|
||||
}
|
||||
|
||||
void ChartWidget::refresh() {
|
||||
//The update() method will launch paintEvent() automatically
|
||||
chart->update();
|
||||
|
||||
}
|
||||
|
||||
|
65
kinfocenter/memory/chartWidget.h
Normal file
65
kinfocenter/memory/chartWidget.h
Normal file
|
@ -0,0 +1,65 @@
|
|||
/***************************************************************************
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 2008, Nicolas Ternisien <nicolas.ternisien@gmail.com> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef CHART_WIDGET_H
|
||||
#define CHART_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QFrame>
|
||||
#include <QString>
|
||||
#include <QColor>
|
||||
#include <QList>
|
||||
|
||||
class QLabel;
|
||||
class QWidget;
|
||||
|
||||
#include "base.h"
|
||||
|
||||
class Chart : public QWidget {
|
||||
public:
|
||||
Chart(QWidget* parent = NULL);
|
||||
|
||||
void setMemoryInfos(t_memsize* memoryInfos);
|
||||
void setFreeMemoryLabel(QLabel* freeMemoryLabel);
|
||||
|
||||
static QString formattedUnit(t_memsize value);
|
||||
|
||||
protected:
|
||||
|
||||
bool drawChart(t_memsize total, const QList<t_memsize>& used, const QList<QColor>& colors, const QList<QString>& texts);
|
||||
|
||||
t_memsize* memoryInfos;
|
||||
|
||||
QLabel* freeMemoryLabel;
|
||||
|
||||
};
|
||||
|
||||
class ChartWidget : public QWidget {
|
||||
public:
|
||||
|
||||
/**
|
||||
* Initialize the list view item and task.
|
||||
*/
|
||||
ChartWidget(const QString& title, const QString& hint, Chart* chartImplementation, QWidget* parent = NULL);
|
||||
|
||||
void setMemoryInfos(t_memsize* memoryInfos);
|
||||
void refresh();
|
||||
|
||||
private:
|
||||
|
||||
QLabel* titleLabel;
|
||||
|
||||
Chart* chart;
|
||||
|
||||
QLabel* freeMemoryLabel;
|
||||
|
||||
};
|
||||
|
||||
#endif // CHART_WIDGET_H
|
|
@ -1,13 +1,12 @@
|
|||
[Desktop Entry]
|
||||
Exec=kcmshell4 memory
|
||||
Icon=kcmmemory
|
||||
Exec=kcmshell4 kcm_memory
|
||||
Icon=memory
|
||||
Type=Service
|
||||
X-KDE-ServiceTypes=KCModule
|
||||
X-DocPath=kinfocenter/memory/index.html
|
||||
|
||||
|
||||
X-KDE-Library=kcm_info
|
||||
X-KDE-PluginKeyword=memory
|
||||
X-KDE-Library=kcm_memory
|
||||
X-KDE-ParentApp=kinfocenter
|
||||
|
||||
Name=Memory
|
326
kinfocenter/memory/memory.cpp
Normal file
326
kinfocenter/memory/memory.cpp
Normal file
|
@ -0,0 +1,326 @@
|
|||
/*
|
||||
* memory.cpp
|
||||
*
|
||||
* Copyright (C) 2008 Ivo Anjo <knuckles@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
#include <QtGui>
|
||||
#include <QStringList>
|
||||
|
||||
#include <QLayout>
|
||||
#include <QPainter>
|
||||
#include <QPixmap>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLinearGradient>
|
||||
|
||||
#include <kaboutdata.h>
|
||||
#include <kdialog.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include <sys/param.h> /* for BSD */
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kglobal.h>
|
||||
#include <kdialog.h>
|
||||
|
||||
#include <KPluginFactory>
|
||||
#include <KPluginLoader>
|
||||
|
||||
#include "chartWidget.h"
|
||||
|
||||
#include "physicalMemoryChart.h"
|
||||
#include "totalMemoryChart.h"
|
||||
#include "swapMemoryChart.h"
|
||||
|
||||
/*
|
||||
all fetchValues()-functions should put either
|
||||
their results _OR_ the value NO_MEMORY_INFO into memoryInfos[]
|
||||
*/
|
||||
static t_memsize memoryInfos[MEM_LAST_ENTRY];
|
||||
|
||||
/******************/
|
||||
/* Implementation */
|
||||
/******************/
|
||||
|
||||
static QLabel *memorySizeLabels[MEM_LAST_ENTRY][2];
|
||||
|
||||
|
||||
K_PLUGIN_FACTORY(KCMMemoryFactory,
|
||||
registerPlugin<KCMMemory>();
|
||||
)
|
||||
K_EXPORT_PLUGIN(KCMMemoryFactory("kcm_memory"))
|
||||
|
||||
KCMMemory::KCMMemory(QWidget *parent, const QVariantList &) :
|
||||
KCModule(KCMMemoryFactory::componentData(), parent) {
|
||||
|
||||
KAboutData *about = new KAboutData(I18N_NOOP("kcm_memory"), 0,
|
||||
ki18n("KDE Panel Memory Information Control Module"),
|
||||
0, KLocalizedString(), KAboutData::License_GPL,
|
||||
ki18n("(c) 1998 - 2002 Helge Deller"));
|
||||
|
||||
about->addAuthor(ki18n("Helge Deller"), KLocalizedString(), "deller@gmx.de");
|
||||
setAboutData(about);
|
||||
|
||||
QString title, initial_str;
|
||||
|
||||
setButtons(Help);
|
||||
|
||||
QVBoxLayout *top = new QVBoxLayout(this);
|
||||
top->setMargin(0);
|
||||
top->setSpacing(1);
|
||||
|
||||
QGroupBox* informationGroup = initializeText();
|
||||
top->addWidget(informationGroup, 1);
|
||||
|
||||
// Now the Graphics
|
||||
QGroupBox* graphicsGroup = initializeCharts();
|
||||
top->addWidget(graphicsGroup, 2);
|
||||
|
||||
timer = new QTimer(this);
|
||||
timer->start(100);
|
||||
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(updateDatas()));
|
||||
|
||||
updateDatas();
|
||||
}
|
||||
|
||||
KCMMemory::~KCMMemory() {
|
||||
/* stop the timer */
|
||||
timer->stop();
|
||||
}
|
||||
|
||||
QString KCMMemory::quickHelp() const {
|
||||
return i18n(" This display shows you the current memory usage of your system."
|
||||
" The values are updated on a regular basis and give you an"
|
||||
" overview of the physical and virtual used memory.");
|
||||
}
|
||||
|
||||
QGroupBox* KCMMemory::initializeText() {
|
||||
QGroupBox* informationGroup = new QGroupBox("Memory");
|
||||
|
||||
QHBoxLayout *hbox = new QHBoxLayout(informationGroup);
|
||||
|
||||
/* stretch the left side */
|
||||
hbox->addStretch();
|
||||
|
||||
QString title;
|
||||
|
||||
//TODO Use the more smart QGridLayout !!!
|
||||
|
||||
/* first create the Informationtext-Widget */
|
||||
QVBoxLayout *vbox = new QVBoxLayout();
|
||||
hbox->addLayout(vbox);
|
||||
vbox->setSpacing(0);
|
||||
for (int i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
|
||||
switch (i) {
|
||||
case TOTAL_MEM:
|
||||
title = i18n("Total physical memory:");
|
||||
break;
|
||||
case FREE_MEM:
|
||||
title = i18n("Free physical memory:");
|
||||
break;
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
case SHARED_MEM:
|
||||
title = i18n("Shared memory:");
|
||||
break;
|
||||
case BUFFER_MEM:
|
||||
title = i18n("Disk buffers:");
|
||||
break;
|
||||
#else
|
||||
case ACTIVE_MEM:
|
||||
title = i18n("Active memory:");
|
||||
break;
|
||||
case INACTIVE_MEM:
|
||||
title = i18n("Inactive memory:");
|
||||
break;
|
||||
#endif
|
||||
#endif
|
||||
case CACHED_MEM:
|
||||
title = i18n("Disk cache:");
|
||||
break;
|
||||
case SWAP_MEM:
|
||||
vbox->addSpacing(SPACING);
|
||||
title = i18n("Total swap memory:");
|
||||
break;
|
||||
case FREESWAP_MEM:
|
||||
title = i18n("Free swap memory:");
|
||||
break;
|
||||
default:
|
||||
title = "";
|
||||
break;
|
||||
};
|
||||
QLabel* labelWidget = new QLabel(title, this);
|
||||
labelWidget->setAlignment(Qt::AlignLeft);
|
||||
vbox->addWidget(labelWidget);
|
||||
}
|
||||
|
||||
vbox->addStretch();
|
||||
|
||||
/* then the memory-content-widgets */
|
||||
for (int j = 0; j < 2; j++) {
|
||||
vbox = new QVBoxLayout();
|
||||
hbox->addLayout(vbox);
|
||||
vbox->setSpacing(0);
|
||||
for (int i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
|
||||
if (i == SWAP_MEM)
|
||||
vbox->addSpacing(SPACING);
|
||||
QLabel* labelWidget = new QLabel(this);
|
||||
labelWidget->setAlignment(Qt::AlignRight);
|
||||
memorySizeLabels[i][j] = labelWidget;
|
||||
vbox->addWidget(labelWidget);
|
||||
}
|
||||
|
||||
vbox->addStretch();
|
||||
|
||||
}
|
||||
|
||||
/* stretch the right side */
|
||||
hbox->addStretch();
|
||||
|
||||
return informationGroup;
|
||||
|
||||
}
|
||||
|
||||
QGroupBox* KCMMemory::initializeCharts() {
|
||||
QGroupBox* chartsGroup = new QGroupBox("Charts");
|
||||
|
||||
QHBoxLayout* chartsLayout = new QHBoxLayout(chartsGroup);
|
||||
chartsLayout->setSpacing(1);
|
||||
chartsLayout->setMargin(1);
|
||||
|
||||
//chartsLayout->addStretch(1);
|
||||
|
||||
|
||||
|
||||
totalMemory = new ChartWidget(i18n("Total Memory"),
|
||||
i18n("This graph gives you an overview of the "
|
||||
"<b>total sum of physical and virtual memory</b> "
|
||||
"in your system."),
|
||||
new TotalMemoryChart(this), this);
|
||||
|
||||
chartsLayout->addWidget(totalMemory);
|
||||
chartsLayout->addSpacing(SPACING);
|
||||
|
||||
|
||||
physicalMemory = new ChartWidget(i18n("Physical Memory"),
|
||||
i18n("This graph gives you an overview of "
|
||||
"the <b>usage of physical memory</b> in your system."
|
||||
"<p>Most operating systems (including Linux) "
|
||||
"will use as much of the available physical "
|
||||
"memory as possible as disk cache, "
|
||||
"to speed up the system performance.</p>"
|
||||
"<p>This means that if you have a small amount "
|
||||
"of <b>Free Physical Memory</b> and a large amount of "
|
||||
"<b>Disk Cache Memory</b>, your system is well "
|
||||
"configured.</p>"),
|
||||
new PhysicalMemoryChart(this), this);
|
||||
|
||||
chartsLayout->addWidget(physicalMemory);
|
||||
chartsLayout->addSpacing(SPACING);
|
||||
|
||||
swapMemory = new ChartWidget(i18n("Swap Space"),
|
||||
i18n("<p>The swap space is the <b>virtual memory</b> "
|
||||
"available to the system.</p> "
|
||||
"<p>It will be used on demand and is provided "
|
||||
"through one or more swap partitions and/or swap files.</p>"),
|
||||
new SwapMemoryChart(this), this);
|
||||
|
||||
|
||||
chartsLayout->addWidget(swapMemory);
|
||||
|
||||
//chartsLayout->addStretch(1);
|
||||
|
||||
return chartsGroup;
|
||||
}
|
||||
|
||||
void KCMMemory::updateDatas() {
|
||||
|
||||
/* get the Information from memory_linux, memory_fbsd */
|
||||
fetchValues();
|
||||
|
||||
updateMemoryText();
|
||||
updateMemoryGraphics();
|
||||
}
|
||||
|
||||
|
||||
void KCMMemory::updateMemoryText() {
|
||||
/* update the byte-strings */
|
||||
for (int i = TOTAL_MEM; i < MEM_LAST_ENTRY; i++) {
|
||||
QLabel* label = memorySizeLabels[i][0];
|
||||
if (memoryInfos[i] == NO_MEMORY_INFO)
|
||||
label->clear();
|
||||
else
|
||||
label->setText(i18n("%1 bytes =", KGlobal::locale()->
|
||||
formatNumber(memoryInfos[i], 0)));
|
||||
}
|
||||
|
||||
/* update the MB-strings */
|
||||
for (int i = TOTAL_MEM; i < MEM_LAST_ENTRY; i++) {
|
||||
QLabel* label = memorySizeLabels[i][1];
|
||||
label->setText((memoryInfos[i] != NO_MEMORY_INFO) ? Chart::formattedUnit(memoryInfos[i]) : i18n("Not available."));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void KCMMemory::updateMemoryGraphics() {
|
||||
totalMemory->setMemoryInfos(memoryInfos);
|
||||
totalMemory->refresh();
|
||||
|
||||
physicalMemory->setMemoryInfos(memoryInfos);
|
||||
physicalMemory->refresh();
|
||||
|
||||
swapMemory->setMemoryInfos(memoryInfos);
|
||||
swapMemory->refresh();
|
||||
|
||||
}
|
||||
|
||||
/* Include system-specific code */
|
||||
|
||||
#ifdef __linux__
|
||||
#include "memory_linux.cpp"
|
||||
#elif defined(__APPLE__)
|
||||
#include "memory_osx.cpp"
|
||||
#elif defined(sgi) && sgi
|
||||
#include "memory_sgi.cpp"
|
||||
#elif defined(__svr4__) && defined(sun)
|
||||
#include "memory_solaris.cpp"
|
||||
#elif defined(__FreeBSD__) || defined(__DragonFly__)
|
||||
#include "memory_fbsd.cpp"
|
||||
#elif defined(__hpux)
|
||||
#include "memory_hpux.cpp"
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
#include "memory_netbsd.cpp"
|
||||
#elif __osf__
|
||||
#include "memory_tru64.cpp"
|
||||
#else
|
||||
|
||||
/* Default for unsupported systems */
|
||||
void KCMMemory::fetchValues() {
|
||||
int i;
|
||||
for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
|
||||
memoryInfos[i] = NO_MEMORY_INFO;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#include "memory.moc"
|
71
kinfocenter/memory/memory.h
Normal file
71
kinfocenter/memory/memory.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* memory.h
|
||||
*
|
||||
* Copyright (C) 2008 Nicolas Ternisien <nicolas.ternisien@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef KCONTROL_MEMORY_H
|
||||
#define KCONTROL_MEMORY_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
|
||||
#include <kcmodule.h>
|
||||
#include <kaboutdata.h>
|
||||
|
||||
#include "base.h"
|
||||
|
||||
class QGroupBox;
|
||||
class QStringList;
|
||||
class QPushButton;
|
||||
class QTreeWidget;
|
||||
class ChartWidget;
|
||||
|
||||
class KCMMemory : public KCModule {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit KCMMemory(QWidget *parent = NULL, const QVariantList &list = QVariantList());
|
||||
~KCMMemory();
|
||||
|
||||
QString quickHelp() const;
|
||||
|
||||
private slots:
|
||||
void updateMemoryText();
|
||||
void updateMemoryGraphics();
|
||||
|
||||
void updateDatas();
|
||||
private:
|
||||
|
||||
QGroupBox* initializeText();
|
||||
QGroupBox* initializeCharts();
|
||||
|
||||
QTimer *timer;
|
||||
|
||||
ChartWidget* totalMemory;
|
||||
ChartWidget* physicalMemory;
|
||||
ChartWidget* swapMemory;
|
||||
|
||||
|
||||
void fetchValues();
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
char blah[10], buf[80], *used_str, *total_str;
|
||||
/* Stuff for sysctl */
|
||||
|
@ -26,14 +26,14 @@ void KMemoryWidget::fetchValues()
|
|||
// Numerical values
|
||||
|
||||
// total physical memory (without swap space)
|
||||
Memory_Info[TOTAL_MEM] = MEMORY(memory);
|
||||
memoryInfos[TOTAL_MEM] = MEMORY(memory);
|
||||
|
||||
// added by Brad Hughes bhughes@trolltech.com
|
||||
struct vmtotal vmem;
|
||||
#ifdef __GNUC__
|
||||
#warning "FIXME: Memory_Info[CACHED_MEM]"
|
||||
#warning "FIXME: memoryInfos[CACHED_MEM]"
|
||||
#endif
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
|
||||
// The sysctls don't work in a nice manner under FreeBSD v2.2.x
|
||||
// so we assume that if sysctlbyname doesn't return what we
|
||||
|
@ -43,24 +43,24 @@ void KMemoryWidget::fetchValues()
|
|||
|
||||
len = sizeof(vmem);
|
||||
if (sysctlbyname("vm.vmmeter", &vmem, &len, NULL, 0) == 0)
|
||||
Memory_Info[SHARED_MEM] = MEMORY(vmem.t_armshr) * PAGE_SIZE;
|
||||
memoryInfos[SHARED_MEM] = MEMORY(vmem.t_armshr) * PAGE_SIZE;
|
||||
else
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
|
||||
int buffers;
|
||||
len = sizeof (buffers);
|
||||
if ((sysctlbyname("vfs.bufspace", &buffers, &len, NULL, 0) == -1) || !len)
|
||||
Memory_Info[BUFFER_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[BUFFER_MEM] = NO_MEMORY_INFO;
|
||||
else
|
||||
Memory_Info[BUFFER_MEM] = MEMORY(buffers);
|
||||
memoryInfos[BUFFER_MEM] = MEMORY(buffers);
|
||||
|
||||
// total free physical memory (without swap space)
|
||||
int free;
|
||||
len = sizeof (buffers);
|
||||
if ((sysctlbyname("vm.stats.vm.v_free_count", &free, &len, NULL, 0) == -1) || !len)
|
||||
Memory_Info[FREE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREE_MEM] = NO_MEMORY_INFO;
|
||||
else
|
||||
Memory_Info[FREE_MEM] = MEMORY(free) * getpagesize();
|
||||
memoryInfos[FREE_MEM] = MEMORY(free) * getpagesize();
|
||||
|
||||
// Q&D hack for swap display. Borrowed from xsysinfo-1.4
|
||||
if ((pipe = popen("/usr/sbin/pstat -ks", "r")) == NULL) {
|
||||
|
@ -83,8 +83,8 @@ void KMemoryWidget::fetchValues()
|
|||
_free=total-used;
|
||||
|
||||
// total size of all swap-partitions
|
||||
Memory_Info[SWAP_MEM] = MEMORY(total) * 1024;
|
||||
memoryInfos[SWAP_MEM] = MEMORY(total) * 1024;
|
||||
|
||||
// free memory in swap-partitions
|
||||
Memory_Info[FREESWAP_MEM] = MEMORY(_free) * 1024;
|
||||
memoryInfos[FREESWAP_MEM] = MEMORY(_free) * 1024;
|
||||
}
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
#define MAX_SWAP_AREAS 16
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
int page_size,i;
|
||||
unsigned long total_mem, total_free,
|
||||
|
@ -79,14 +79,14 @@ void KMemoryWidget::fetchValues()
|
|||
total_mem = total_physical; // + total_swap;
|
||||
total_free = (total_physical - used_physical);// + free_swap;
|
||||
|
||||
Memory_Info[TOTAL_MEM] = MEMORY(total_mem); // total physical memory (without swaps)
|
||||
Memory_Info[FREE_MEM] = MEMORY(total_free);// total free physical memory (without swaps)
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
Memory_Info[BUFFER_MEM] = MEMORY(fields_[2])*page_size; /* FIXME ?? */
|
||||
Memory_Info[SWAP_MEM] = MEMORY(total_swap); // total size of all swap-partitions
|
||||
Memory_Info[FREESWAP_MEM] = MEMORY(free_swap); // free memory in swap-partitions
|
||||
memoryInfos[TOTAL_MEM] = MEMORY(total_mem); // total physical memory (without swaps)
|
||||
memoryInfos[FREE_MEM] = MEMORY(total_free);// total free physical memory (without swaps)
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
memoryInfos[BUFFER_MEM] = MEMORY(fields_[2])*page_size; /* FIXME ?? */
|
||||
memoryInfos[SWAP_MEM] = MEMORY(total_swap); // total size of all swap-partitions
|
||||
memoryInfos[FREESWAP_MEM] = MEMORY(free_swap); // free memory in swap-partitions
|
||||
#ifdef __GNUC__
|
||||
#warning "FIXME: Memory_Info[CACHED_MEM]"
|
||||
#warning "FIXME: memoryInfos[CACHED_MEM]"
|
||||
#endif
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <QFile>
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
struct sysinfo info;
|
||||
|
||||
|
@ -16,12 +16,12 @@ void KMemoryWidget::fetchValues()
|
|||
|
||||
const int mem_unit = info.mem_unit;
|
||||
|
||||
Memory_Info[TOTAL_MEM] = MEMORY(info.totalram) * mem_unit; // total physical memory (without swaps)
|
||||
Memory_Info[FREE_MEM] = MEMORY(info.freeram) * mem_unit; // total free physical memory (without swaps)
|
||||
Memory_Info[SHARED_MEM] = MEMORY(info.sharedram) * mem_unit;
|
||||
Memory_Info[BUFFER_MEM] = MEMORY(info.bufferram) * mem_unit;
|
||||
Memory_Info[SWAP_MEM] = MEMORY(info.totalswap) * mem_unit; // total size of all swap-partitions
|
||||
Memory_Info[FREESWAP_MEM] = MEMORY(info.freeswap) * mem_unit; // free memory in swap-partitions
|
||||
memoryInfos[TOTAL_MEM] = MEMORY(info.totalram) * mem_unit; // total physical memory (without swaps)
|
||||
memoryInfos[FREE_MEM] = MEMORY(info.freeram) * mem_unit; // total free physical memory (without swaps)
|
||||
memoryInfos[SHARED_MEM] = MEMORY(info.sharedram) * mem_unit;
|
||||
memoryInfos[BUFFER_MEM] = MEMORY(info.bufferram) * mem_unit;
|
||||
memoryInfos[SWAP_MEM] = MEMORY(info.totalswap) * mem_unit; // total size of all swap-partitions
|
||||
memoryInfos[FREESWAP_MEM] = MEMORY(info.freeswap) * mem_unit; // free memory in swap-partitions
|
||||
|
||||
QFile file("/proc/meminfo");
|
||||
if (file.open(QIODevice::ReadOnly)) {
|
||||
|
@ -30,7 +30,7 @@ void KMemoryWidget::fetchValues()
|
|||
if (strncmp(buf,"Cached:",7)==0) {
|
||||
unsigned long v;
|
||||
v = strtoul(&buf[7],NULL,10);
|
||||
Memory_Info[CACHED_MEM] = MEMORY(v) * 1024; // Cached memory in RAM
|
||||
memoryInfos[CACHED_MEM] = MEMORY(v) * 1024; // Cached memory in RAM
|
||||
break;
|
||||
}
|
||||
}
|
|
@ -17,7 +17,7 @@
|
|||
#include <vm/vm_swap.h>
|
||||
#endif
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
int mib[2];
|
||||
size_t len;
|
||||
|
@ -47,9 +47,9 @@ void KMemoryWidget::fetchValues()
|
|||
#endif
|
||||
len = sizeof(memory);
|
||||
if( sysctl(mib,2,&memory,&len,NULL,0)< 0 )
|
||||
Memory_Info[TOTAL_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[TOTAL_MEM] = NO_MEMORY_INFO;
|
||||
else
|
||||
Memory_Info[TOTAL_MEM] = memory;
|
||||
memoryInfos[TOTAL_MEM] = memory;
|
||||
|
||||
#ifdef UVM
|
||||
mib[0] = CTL_VM;
|
||||
|
@ -60,29 +60,29 @@ void KMemoryWidget::fetchValues()
|
|||
#endif
|
||||
len = sizeof(uvmexp);
|
||||
if ( sysctl(mib, 2, &uvmexp, &len, NULL, 0) < 0 ) {
|
||||
Memory_Info[FREE_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[ACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[INACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[SWAP_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[ACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[INACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[SWAP_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
} else {
|
||||
t_memsize pgsz = MEMORY(uvmexp.pagesize);
|
||||
Memory_Info[FREE_MEM] = pgsz * uvmexp.free;
|
||||
Memory_Info[ACTIVE_MEM] = pgsz * uvmexp.active;
|
||||
Memory_Info[INACTIVE_MEM] = pgsz * uvmexp.inactive;
|
||||
Memory_Info[SWAP_MEM] = pgsz * uvmexp.swpages;
|
||||
Memory_Info[FREESWAP_MEM] = pgsz * (uvmexp.swpages - uvmexp.swpginuse);
|
||||
memoryInfos[FREE_MEM] = pgsz * uvmexp.free;
|
||||
memoryInfos[ACTIVE_MEM] = pgsz * uvmexp.active;
|
||||
memoryInfos[INACTIVE_MEM] = pgsz * uvmexp.inactive;
|
||||
memoryInfos[SWAP_MEM] = pgsz * uvmexp.swpages;
|
||||
memoryInfos[FREESWAP_MEM] = pgsz * (uvmexp.swpages - uvmexp.swpginuse);
|
||||
#if __NetBSD_Version__ > 106000000
|
||||
Memory_Info[CACHED_MEM] = pgsz * (uvmexp.filepages + uvmexp.execpages);
|
||||
memoryInfos[CACHED_MEM] = pgsz * (uvmexp.filepages + uvmexp.execpages);
|
||||
#else
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
Memory_Info[FREE_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[ACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[INACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[ACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[INACTIVE_MEM] = NO_MEMORY_INFO;
|
||||
|
||||
/* swap */
|
||||
totalswap = freeswap = usedswap = 0;
|
||||
|
@ -103,11 +103,11 @@ void KMemoryWidget::fetchValues()
|
|||
totalswap = freeswap = -1; /* Error */
|
||||
|
||||
if ( totalswap == -1 ) {
|
||||
Memory_Info[SWAP_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[SWAP_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
} else {
|
||||
Memory_Info[SWAP_MEM] = MEMORY(totalswap);
|
||||
Memory_Info[FREESWAP_MEM] = MEMORY(freeswap);
|
||||
memoryInfos[SWAP_MEM] = MEMORY(totalswap);
|
||||
memoryInfos[FREESWAP_MEM] = MEMORY(freeswap);
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -29,7 +29,7 @@
|
|||
#include <dirent.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
|
||||
vm_statistics_data_t vm_info;
|
||||
|
@ -44,12 +44,12 @@ void KMemoryWidget::fetchValues()
|
|||
return;
|
||||
}
|
||||
|
||||
Memory_Info[TOTAL_MEM] = MEMORY(vm_info.active_count + vm_info.inactive_count +
|
||||
memoryInfos[TOTAL_MEM] = MEMORY(vm_info.active_count + vm_info.inactive_count +
|
||||
vm_info.free_count + vm_info.wire_count) * vm_page_size;
|
||||
Memory_Info[FREE_MEM] = MEMORY(vm_info.free_count) * vm_page_size;
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[BUFFER_MEM] = NO_MEMORY_INFO;
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREE_MEM] = MEMORY(vm_info.free_count) * vm_page_size;
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[BUFFER_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO;
|
||||
|
||||
dirp = opendir("/private/var/vm");
|
||||
if (!dirp) {
|
||||
|
@ -81,9 +81,9 @@ void KMemoryWidget::fetchValues()
|
|||
kDebug() << "unable to get VM info";
|
||||
}
|
||||
|
||||
Memory_Info[SWAP_MEM] = total;
|
||||
memoryInfos[SWAP_MEM] = total;
|
||||
// off_t used = (vm_info.pageouts - vm_info.pageins) * vm_page_size;
|
||||
Memory_Info[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[FREESWAP_MEM] = NO_MEMORY_INFO;
|
||||
|
||||
/* free = MEMORY(vm_info.free_count) * vm_page_size;
|
||||
used = MEMORY(vm_info.active_count) * vm_page_size;
|
|
@ -16,35 +16,35 @@
|
|||
#endif
|
||||
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
int pagesize = getpagesize();
|
||||
|
||||
struct rminfo rmi;
|
||||
if( sysmp(MP_SAGET, MPSA_RMINFO, &rmi, sizeof(rmi)) == -1 )
|
||||
return;
|
||||
Memory_Info[TOTAL_MEM] = MEMORY(rmi.physmem) * pagesize; // total physical memory (without swaps)
|
||||
Memory_Info[FREE_MEM] = MEMORY(rmi.freemem) * pagesize; // total free physical memory (without swaps)
|
||||
Memory_Info[BUFFER_MEM] = MEMORY(rmi.bufmem) * pagesize;
|
||||
memoryInfos[TOTAL_MEM] = MEMORY(rmi.physmem) * pagesize; // total physical memory (without swaps)
|
||||
memoryInfos[FREE_MEM] = MEMORY(rmi.freemem) * pagesize; // total free physical memory (without swaps)
|
||||
memoryInfos[BUFFER_MEM] = MEMORY(rmi.bufmem) * pagesize;
|
||||
|
||||
|
||||
//FIXME: Memory_Info[CACHED_MEM]"
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
//FIXME: memoryInfos[CACHED_MEM]"
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
|
||||
long val;
|
||||
swapctl(SC_GETSWAPTOT, &val);
|
||||
Memory_Info[SWAP_MEM] = MEMORY(val) * UBSIZE; // total size of all swap-partitions
|
||||
memoryInfos[SWAP_MEM] = MEMORY(val) * UBSIZE; // total size of all swap-partitions
|
||||
|
||||
swapctl(SC_GETFREESWAP, &val);
|
||||
Memory_Info[FREESWAP_MEM] = MEMORY(val) * UBSIZE; // free memory in swap-partitions
|
||||
memoryInfos[FREESWAP_MEM] = MEMORY(val) * UBSIZE; // free memory in swap-partitions
|
||||
|
||||
#ifndef MPKA_SHMINFO
|
||||
/* Irix 6.5 (also 6.4?) */
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
#else
|
||||
FILE *kmem = fopen("/dev/kmem", "r");
|
||||
if( kmem == 0 ) {
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ void KMemoryWidget::fetchValues()
|
|||
val += shmid.shm_segsz;
|
||||
}
|
||||
}
|
||||
Memory_Info[SHARED_MEM] = MEMORY(val);
|
||||
memoryInfos[SHARED_MEM] = MEMORY(val);
|
||||
|
||||
fclose(kmem);
|
||||
#endif
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
#define PAGETOK(a) (( (t_memsize) sysconf( _SC_PAGESIZE )) * (t_memsize) a)
|
||||
|
||||
void KMemoryWidget::fetchValues() {
|
||||
void KCMMemory::fetchValues() {
|
||||
|
||||
kstat_ctl_t *kctl;
|
||||
kstat_t *ksp;
|
||||
|
@ -50,18 +50,18 @@ void KMemoryWidget::fetchValues() {
|
|||
#if 0
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "physmem" );
|
||||
if( kdata != NULL ) {
|
||||
Memory_Info[TOTAL_MEM] = PAGETOK(kdata->value.ui32);
|
||||
memoryInfos[TOTAL_MEM] = PAGETOK(kdata->value.ui32);
|
||||
}
|
||||
#endif
|
||||
Memory_Info[TOTAL_MEM] = PAGETOK(sysconf(_SC_PHYS_PAGES));
|
||||
memoryInfos[TOTAL_MEM] = PAGETOK(sysconf(_SC_PHYS_PAGES));
|
||||
|
||||
kdata = (kstat_named_t *) kstat_data_lookup( ksp, "freemem" );
|
||||
if( kdata != NULL )
|
||||
Memory_Info[FREE_MEM] = PAGETOK(kdata->value.ui32);
|
||||
memoryInfos[FREE_MEM] = PAGETOK(kdata->value.ui32);
|
||||
#ifdef __GNUC__
|
||||
#warning "FIXME: Memory_Info[CACHED_MEM]"
|
||||
#warning "FIXME: memoryInfos[CACHED_MEM]"
|
||||
#endif
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
|
||||
|
||||
kstat_close( kctl );
|
||||
|
||||
|
@ -90,6 +90,6 @@ void KMemoryWidget::fetchValues() {
|
|||
swapused = am_swap.ani_resv;
|
||||
swapfree = swaptotal - swapused;
|
||||
|
||||
Memory_Info[SWAP_MEM] = PAGETOK(swaptotal);
|
||||
Memory_Info[FREESWAP_MEM] = PAGETOK(swapfree);
|
||||
memoryInfos[SWAP_MEM] = PAGETOK(swaptotal);
|
||||
memoryInfos[FREESWAP_MEM] = PAGETOK(swapfree);
|
||||
}
|
|
@ -27,7 +27,7 @@ extern "C" {
|
|||
|
||||
extern "C" void vm_statistics(task_t, vm_statistics_data_t*);
|
||||
|
||||
void KMemoryWidget::fetchValues()
|
||||
void KCMMemory::fetchValues()
|
||||
{
|
||||
int pageshift; /* log base 2 of the pagesize */
|
||||
register int pagesize;
|
||||
|
@ -67,17 +67,17 @@ void KMemoryWidget::fetchValues()
|
|||
swap_free += swbuf.free;
|
||||
i++;
|
||||
}
|
||||
Memory_Info[TOTAL_MEM] = pagetob((vmstats.free_count +
|
||||
memoryInfos[TOTAL_MEM] = pagetob((vmstats.free_count +
|
||||
vmstats.active_count +
|
||||
vmstats.inactive_count +
|
||||
vmstats.wire_count));
|
||||
Memory_Info[FREE_MEM] = pagetob(vmstats.free_count);
|
||||
Memory_Info[SHARED_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
Memory_Info[BUFFER_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
memoryInfos[FREE_MEM] = pagetob(vmstats.free_count);
|
||||
memoryInfos[SHARED_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
memoryInfos[BUFFER_MEM] = NO_MEMORY_INFO; /* FIXME ?? */
|
||||
#ifdef __GNUC__
|
||||
#warning "FIXME: Memory_Info[CACHED_MEM]"
|
||||
#warning "FIXME: memoryInfos[CACHED_MEM]"
|
||||
#endif
|
||||
Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; /* cached memory in ram */
|
||||
Memory_Info[SWAP_MEM] = pagetob(swap_pages);
|
||||
Memory_Info[FREESWAP_MEM] = pagetob(swap_free);
|
||||
memoryInfos[CACHED_MEM] = NO_MEMORY_INFO; /* cached memory in ram */
|
||||
memoryInfos[SWAP_MEM] = pagetob(swap_pages);
|
||||
memoryInfos[FREESWAP_MEM] = pagetob(swap_free);
|
||||
}
|
63
kinfocenter/memory/physicalMemoryChart.cpp
Normal file
63
kinfocenter/memory/physicalMemoryChart.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
/***************************************************************************
|
||||
* KT list view item task implementation. *
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 1999, Gary Meyer <gary@meyer.net> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "physicalMemoryChart.h"
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "base.h"
|
||||
|
||||
|
||||
PhysicalMemoryChart::PhysicalMemoryChart(QWidget* parent) :
|
||||
Chart(parent) {
|
||||
|
||||
colorsInitialized = false;
|
||||
}
|
||||
|
||||
void PhysicalMemoryChart::paintEvent(QPaintEvent* /*event*/) {
|
||||
/* RAM usage: */
|
||||
/* don't rely on the SHARED_MEM value since it may refer to
|
||||
* the size of the System V sharedmem in 2.4.x. Calculate instead! */
|
||||
|
||||
t_memsize bufferMemory;
|
||||
|
||||
bufferMemory = 0;
|
||||
#if !defined(__svr4__) || !defined(sun)
|
||||
#if !defined(__NetBSD__) && !defined(__OpenBSD__)
|
||||
bufferMemory = ZERO_IF_NO_INFO(memoryInfos[BUFFER_MEM]);
|
||||
#endif
|
||||
#endif
|
||||
t_memsize cachedMemory = ZERO_IF_NO_INFO(memoryInfos[CACHED_MEM]);
|
||||
t_memsize freeMemory = ZERO_IF_NO_INFO(memoryInfos[FREE_MEM]);
|
||||
t_memsize totalMemory = ZERO_IF_NO_INFO(memoryInfos[TOTAL_MEM]) - bufferMemory - cachedMemory - freeMemory;
|
||||
|
||||
QList<t_memsize> used;
|
||||
used.append(freeMemory);
|
||||
used.append(cachedMemory);
|
||||
used.append(bufferMemory);
|
||||
used.append(totalMemory);
|
||||
|
||||
if (!colorsInitialized) {
|
||||
colorsInitialized = true;
|
||||
texts.append(i18n("Free Physical Memory"));
|
||||
colors.append(COLOR_FREE_MEMORY); // free
|
||||
texts.append(i18n("Disk Cache"));
|
||||
colors.append(QColor(88, 176, 36)); // cached
|
||||
texts.append(i18n("Disk Buffers"));
|
||||
colors.append(QColor(118, 237, 49)); // buffer
|
||||
texts.append(i18n("Application Data"));
|
||||
colors.append(COLOR_USED_MEMORY); // used+shared
|
||||
}
|
||||
|
||||
drawChart(memoryInfos[TOTAL_MEM], used, colors, texts);
|
||||
|
||||
}
|
42
kinfocenter/memory/physicalMemoryChart.h
Normal file
42
kinfocenter/memory/physicalMemoryChart.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/***************************************************************************
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 2008, Nicolas Ternisien <nicolas.ternisien@gmail.com> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef PHYSICAL_MEMORY_CHART_H
|
||||
#define PHYSICAL_MEMORY_CHART_H
|
||||
|
||||
#include <QFrame>
|
||||
#include <QList>
|
||||
|
||||
#include "chartWidget.h"
|
||||
|
||||
class QWidget;
|
||||
class QPaintEvent;
|
||||
|
||||
class PhysicalMemoryChart : public Chart {
|
||||
public:
|
||||
|
||||
/**
|
||||
* Initialize the list view item and task.
|
||||
*/
|
||||
PhysicalMemoryChart(QWidget* parent = NULL);
|
||||
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent* event);
|
||||
|
||||
private:
|
||||
bool colorsInitialized;
|
||||
|
||||
QList<QColor> colors;
|
||||
QList<QString> texts;
|
||||
|
||||
};
|
||||
|
||||
#endif // PHYSICAL_MEMORY_CHART_H
|
51
kinfocenter/memory/swapMemoryChart.cpp
Normal file
51
kinfocenter/memory/swapMemoryChart.cpp
Normal file
|
@ -0,0 +1,51 @@
|
|||
/***************************************************************************
|
||||
* KT list view item task implementation. *
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 1999, Gary Meyer <gary@meyer.net> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "swapMemoryChart.h"
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "base.h"
|
||||
|
||||
|
||||
SwapMemoryChart::SwapMemoryChart(QWidget* parent) :
|
||||
Chart(parent) {
|
||||
|
||||
colorsInitialized = false;
|
||||
}
|
||||
|
||||
void SwapMemoryChart::paintEvent(QPaintEvent* /*event*/) {
|
||||
|
||||
/* display graphical output (ram, hdd, at last: HDD+RAM) */
|
||||
/* be careful ! Maybe we have not all info available ! */
|
||||
|
||||
// SWAP usage:
|
||||
|
||||
t_memsize freeSwap = ZERO_IF_NO_INFO(memoryInfos[FREESWAP_MEM]);
|
||||
t_memsize swap = ZERO_IF_NO_INFO(memoryInfos[SWAP_MEM]) - freeSwap;
|
||||
|
||||
QList<t_memsize> used;
|
||||
|
||||
used.append(freeSwap);
|
||||
used.append(swap);
|
||||
|
||||
if (!colorsInitialized) {
|
||||
colorsInitialized = true;
|
||||
texts.append(i18n("Free Swap"));
|
||||
colors.append(COLOR_FREE_MEMORY); // free
|
||||
texts.append(i18n("Used Swap"));
|
||||
colors.append(COLOR_USED_SWAP); // used swap
|
||||
}
|
||||
|
||||
drawChart(memoryInfos[SWAP_MEM], used, colors, texts);
|
||||
|
||||
}
|
42
kinfocenter/memory/swapMemoryChart.h
Normal file
42
kinfocenter/memory/swapMemoryChart.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/***************************************************************************
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 2008, Nicolas Ternisien <nicolas.ternisien@gmail.com> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef SWAP_MEMORY_CHART_H
|
||||
#define SWAP_MEMORY_CHART_H
|
||||
|
||||
#include <QFrame>
|
||||
#include <QList>
|
||||
|
||||
#include "chartWidget.h"
|
||||
|
||||
class QWidget;
|
||||
class QPaintEvent;
|
||||
|
||||
class SwapMemoryChart : public Chart {
|
||||
public:
|
||||
|
||||
/**
|
||||
* Initialize the list view item and task.
|
||||
*/
|
||||
SwapMemoryChart(QWidget* parent = NULL);
|
||||
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent* event);
|
||||
|
||||
private:
|
||||
bool colorsInitialized;
|
||||
|
||||
QList<QColor> colors;
|
||||
QList<QString> texts;
|
||||
|
||||
};
|
||||
|
||||
#endif // SWAP_MEMORY_CHART_H
|
53
kinfocenter/memory/totalMemoryChart.cpp
Normal file
53
kinfocenter/memory/totalMemoryChart.cpp
Normal file
|
@ -0,0 +1,53 @@
|
|||
/***************************************************************************
|
||||
* KT list view item task implementation. *
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 1999, Gary Meyer <gary@meyer.net> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#include "totalMemoryChart.h"
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "base.h"
|
||||
|
||||
|
||||
TotalMemoryChart::TotalMemoryChart(QWidget* parent) :
|
||||
Chart(parent) {
|
||||
|
||||
colorsInitialized = false;
|
||||
}
|
||||
|
||||
void TotalMemoryChart::paintEvent(QPaintEvent* /*event*/) {
|
||||
// RAM + SWAP usage:
|
||||
if (memoryInfos[SWAP_MEM] == NO_MEMORY_INFO || memoryInfos[FREESWAP_MEM] == NO_MEMORY_INFO)
|
||||
memoryInfos[SWAP_MEM] = memoryInfos[FREESWAP_MEM] = 0;
|
||||
|
||||
t_memsize usedSwap = memoryInfos[SWAP_MEM] - memoryInfos[FREESWAP_MEM];
|
||||
t_memsize totalFree = memoryInfos[FREE_MEM] + memoryInfos[FREESWAP_MEM];
|
||||
t_memsize usedPhysical = (memoryInfos[TOTAL_MEM]+memoryInfos[SWAP_MEM])-usedSwap-totalFree;
|
||||
|
||||
QList<t_memsize> used;
|
||||
|
||||
used.append(totalFree);
|
||||
used.append(usedSwap);
|
||||
used.append(usedPhysical);
|
||||
|
||||
if (!colorsInitialized) {
|
||||
colorsInitialized = true;
|
||||
texts.append(i18n("Total Free Memory"));
|
||||
colors.append(COLOR_FREE_MEMORY); // free ram+swap
|
||||
texts.append(i18n("Used Swap"));
|
||||
colors.append(COLOR_USED_SWAP); // used swap
|
||||
texts.append(i18n("Used Physical Memory"));
|
||||
colors.append(COLOR_USED_MEMORY); // used ram
|
||||
}
|
||||
|
||||
drawChart(memoryInfos[TOTAL_MEM] + memoryInfos[SWAP_MEM], used, colors, texts);
|
||||
|
||||
}
|
42
kinfocenter/memory/totalMemoryChart.h
Normal file
42
kinfocenter/memory/totalMemoryChart.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
/***************************************************************************
|
||||
* -------------------------------------------------------------------- *
|
||||
* Copyright (C) 2008, Nicolas Ternisien <nicolas.ternisien@gmail.com> *
|
||||
* -------------------------------------------------------------------- *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef TOTAL_MEMORY_CHART_H
|
||||
#define TOTAL_MEMORY_CHART_H
|
||||
|
||||
#include <QFrame>
|
||||
#include <QList>
|
||||
|
||||
#include "chartWidget.h"
|
||||
|
||||
class QWidget;
|
||||
class QPaintEvent;
|
||||
|
||||
class TotalMemoryChart : public Chart {
|
||||
public:
|
||||
|
||||
/**
|
||||
* Initialize the list view item and task.
|
||||
*/
|
||||
TotalMemoryChart(QWidget* parent = NULL);
|
||||
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent* event);
|
||||
|
||||
private:
|
||||
bool colorsInitialized;
|
||||
|
||||
QList<QColor> colors;
|
||||
QList<QString> texts;
|
||||
|
||||
};
|
||||
|
||||
#endif // TOTAL_MEMORY_CHART_H
|
|
@ -1,58 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "moduleIface.h"
|
||||
#include "moduleIface.moc"
|
||||
#include <QtDBus/qdbusconnection.h>
|
||||
#include <kdebug.h>
|
||||
#include <kconfig.h>
|
||||
#include <kconfiggroup.h>
|
||||
|
||||
ModuleIface::ModuleIface(QObject *parent, const char *name)
|
||||
: QObject(parent) {
|
||||
QDBusConnection::sessionBus().registerObject('/'+QString(name), this, QDBusConnection::ExportScriptableSlots);
|
||||
setObjectName( name );
|
||||
_parent = static_cast<QWidget *>(parent);
|
||||
|
||||
}
|
||||
|
||||
ModuleIface::~ModuleIface() {
|
||||
}
|
||||
#ifdef __GNUC__
|
||||
#warning "kde4: DBUS port "
|
||||
#endif
|
||||
#if 0
|
||||
QFont ModuleIface::getFont() {
|
||||
return _parent->font();
|
||||
}
|
||||
|
||||
QPalette ModuleIface::getPalette(){
|
||||
kDebug(1208) << "Returned Palette";
|
||||
return _parent->palette();
|
||||
}
|
||||
#endif
|
||||
QString ModuleIface::getStyle() const {
|
||||
KConfig _config( "kdeglobals" );
|
||||
KConfigGroup config(&_config, "General" );
|
||||
return config.readEntry("widgetStyle");
|
||||
}
|
||||
|
||||
void ModuleIface::invokeHelp() {
|
||||
emit helpClicked();
|
||||
}
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2001 Daniel Molkentin <molkentin@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __moduleIface_h__
|
||||
#define __moduleIface_h__
|
||||
|
||||
|
||||
|
||||
#include <QFont>
|
||||
#include <QPalette>
|
||||
#include <QWidget>
|
||||
|
||||
class ModuleIface : public QObject {
|
||||
|
||||
Q_OBJECT
|
||||
Q_CLASSINFO("D-Bus Interface", "org.kde.kinfocenter")
|
||||
public:
|
||||
ModuleIface(QObject *parent, const char *name);
|
||||
~ModuleIface();
|
||||
|
||||
public Q_SLOTS:
|
||||
#if 0
|
||||
Q_SCRIPTABLE QFont getFont();
|
||||
Q_SCRIPTABLE QPalette getPalette();
|
||||
#endif
|
||||
Q_SCRIPTABLE QString getStyle() const;
|
||||
Q_SCRIPTABLE void invokeHelp();
|
||||
|
||||
signals:
|
||||
void helpClicked();
|
||||
|
||||
private:
|
||||
QWidget *_parent;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,171 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
Copyright (c) 2003 Daniel Molkentin <molkentin@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "moduleiconview.h"
|
||||
#include "modules.h"
|
||||
#include "global.h"
|
||||
|
||||
#include <Qt3Support/Q3Header>
|
||||
#include <QPixmap>
|
||||
#include <QKeyEvent>
|
||||
#include <Q3PtrList>
|
||||
#include <QApplication>
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kstandarddirs.h>
|
||||
#include <kservicegroup.h>
|
||||
#include <kiconloader.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include "moduleiconview.moc"
|
||||
|
||||
ModuleIconView::ModuleIconView(ConfigModuleList *list, QWidget * parent)
|
||||
: K3ListView(parent)
|
||||
, _path(KCGlobal::baseGroup())
|
||||
, _modules(list)
|
||||
{
|
||||
setSorting(1, true);
|
||||
addColumn(QString());
|
||||
|
||||
// Needed to enforce a cut of the items label rather than
|
||||
// showing a horizontal scrollbar
|
||||
setResizeMode(LastColumn);
|
||||
|
||||
header()->hide();
|
||||
|
||||
// This is intentionally _not_ connected with executed(), since
|
||||
// honoring doubleclick doesn't make any sense here (changed by
|
||||
// large user demand)
|
||||
connect(this, SIGNAL(clicked(Q3ListViewItem*)),
|
||||
this, SLOT(slotItemSelected(Q3ListViewItem*)));
|
||||
}
|
||||
|
||||
void ModuleIconView::makeSelected(ConfigModule *m)
|
||||
{
|
||||
if (!m) return;
|
||||
|
||||
for (Q3ListViewItem *i = firstChild(); i; i = i->nextSibling())
|
||||
{
|
||||
if(static_cast<ModuleIconItem*>(i)->module() == m)
|
||||
{
|
||||
setSelected(i, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleIconView::makeVisible(ConfigModule *m)
|
||||
{
|
||||
if (!m) return;
|
||||
QString tmp = _modules->findModule(m);
|
||||
if (tmp.isEmpty())
|
||||
return;
|
||||
|
||||
_path = tmp;
|
||||
fill();
|
||||
}
|
||||
|
||||
void ModuleIconView::fill()
|
||||
{
|
||||
clear();
|
||||
|
||||
QPixmap icon;
|
||||
// add our "up" icon if we aren't top level
|
||||
if (_path != KCGlobal::baseGroup())
|
||||
{
|
||||
icon = loadIcon( "go-previous" );
|
||||
// go-back node
|
||||
ModuleIconItem *i = new ModuleIconItem(this, i18nc("go back", "Back"), icon);
|
||||
i->setOrderNo(0);
|
||||
int last_slash = _path.lastIndexOf('/', -2);
|
||||
if (last_slash == -1)
|
||||
i->setTag(QString());
|
||||
else
|
||||
i->setTag(_path.left(last_slash+1));
|
||||
}
|
||||
|
||||
int c = 0;
|
||||
QStringList submenus = _modules->submenus(_path);
|
||||
for (QStringList::Iterator it = submenus.begin(); it != submenus.end(); ++it )
|
||||
{
|
||||
QString path = (*it);
|
||||
|
||||
KServiceGroup::Ptr group = KServiceGroup::group(path);
|
||||
if (!group || !group->isValid())
|
||||
continue;
|
||||
|
||||
icon = loadIcon( group->icon() );
|
||||
|
||||
ModuleIconItem *i = new ModuleIconItem(this, group->caption(), icon);
|
||||
i->setTag(path);
|
||||
i->setOrderNo(++c);
|
||||
}
|
||||
|
||||
c = 0;
|
||||
Q3PtrList<ConfigModule> moduleList = _modules->modules(_path);
|
||||
for (ConfigModule *module=moduleList.first(); module != 0; module=moduleList.next())
|
||||
{
|
||||
icon = loadIcon( module->icon() );
|
||||
|
||||
ModuleIconItem *i = new ModuleIconItem(this, module->moduleName(), icon, module);
|
||||
i->setOrderNo(++c);
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleIconView::slotItemSelected(Q3ListViewItem* item)
|
||||
{
|
||||
QApplication::restoreOverrideCursor();
|
||||
if (!item) return;
|
||||
|
||||
if (static_cast<ModuleIconItem*>(item)->module())
|
||||
{
|
||||
emit moduleSelected(static_cast<ModuleIconItem*>(item)->module());
|
||||
}
|
||||
else
|
||||
{
|
||||
_path = static_cast<ModuleIconItem*>(item)->tag();
|
||||
fill();
|
||||
setCurrentItem(firstChild());
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleIconView::keyPressEvent(QKeyEvent *e)
|
||||
{
|
||||
if( e->key() == Qt::Key_Return
|
||||
|| e->key() == Qt::Key_Enter
|
||||
|| e->key() == Qt::Key_Space)
|
||||
{
|
||||
if (currentItem())
|
||||
slotItemSelected(currentItem());
|
||||
}
|
||||
else
|
||||
{
|
||||
K3ListView::keyPressEvent(e);
|
||||
}
|
||||
}
|
||||
|
||||
QPixmap ModuleIconView::loadIcon( const QString &name )
|
||||
{
|
||||
QPixmap icon = DesktopIcon( name, KCGlobal::iconSize() );
|
||||
|
||||
if(icon.isNull())
|
||||
icon = DesktopIcon( "folder", KCGlobal::iconSize() );
|
||||
|
||||
return icon;
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __moduleiconview_h__
|
||||
#define __moduleiconview_h__
|
||||
|
||||
#include <k3listview.h>
|
||||
//Added by qt3to4:
|
||||
#include <QPixmap>
|
||||
#include <QKeyEvent>
|
||||
|
||||
class ConfigModule;
|
||||
class ConfigModuleList;
|
||||
|
||||
class ModuleIconItem : public K3ListViewItem
|
||||
{
|
||||
|
||||
public:
|
||||
ModuleIconItem(Q3ListView *parent, const QString& text, const QPixmap& pm, ConfigModule *m = 0)
|
||||
: K3ListViewItem(parent, text)
|
||||
, _tag(QString())
|
||||
, _module(m)
|
||||
{
|
||||
setPixmap(0, pm);
|
||||
}
|
||||
|
||||
void setConfigModule(ConfigModule* m) { _module = m; }
|
||||
void setTag(const QString& t) { _tag = t; }
|
||||
void setOrderNo(int order)
|
||||
{
|
||||
QString s;
|
||||
setText(1, s.sprintf( "%02d", order ) );
|
||||
}
|
||||
|
||||
ConfigModule* module() { return _module; }
|
||||
QString tag() { return _tag; }
|
||||
|
||||
|
||||
private:
|
||||
QString _tag;
|
||||
ConfigModule *_module;
|
||||
};
|
||||
|
||||
class ModuleIconView : public K3ListView
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ModuleIconView(ConfigModuleList *list, QWidget * parent = 0);
|
||||
|
||||
void makeSelected(ConfigModule* module);
|
||||
void makeVisible(ConfigModule *module);
|
||||
void fill();
|
||||
|
||||
Q_SIGNALS:
|
||||
void moduleSelected(ConfigModule*);
|
||||
|
||||
protected Q_SLOTS:
|
||||
void slotItemSelected(Q3ListViewItem*);
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *);
|
||||
QPixmap loadIcon( const QString &name );
|
||||
|
||||
private:
|
||||
QString _path;
|
||||
ConfigModuleList *_modules;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -19,7 +19,6 @@
|
|||
#include "modules.h"
|
||||
#include "global.h"
|
||||
#include "proxywidget.h"
|
||||
#include "kcrootonly.h"
|
||||
|
||||
#include <kapplication.h>
|
||||
#include <kdebug.h>
|
||||
|
@ -35,7 +34,6 @@
|
|||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QFrame>
|
||||
#include <Q3PtrList>
|
||||
|
||||
#ifdef Q_WS_X11
|
||||
#include <X11/Xlib.h>
|
||||
|
@ -47,291 +45,95 @@
|
|||
|
||||
#include "modules.moc"
|
||||
|
||||
template class Q3PtrList<ConfigModule>;
|
||||
|
||||
|
||||
ConfigModule::ConfigModule(const KService::Ptr &s)
|
||||
: KCModuleInfo(s), _changed(false), _module(0), _embedWidget(0),
|
||||
_rootProcess(0), _embedLayout(0), _embedFrame(0)
|
||||
{
|
||||
ConfigModule::ConfigModule(const KService::Ptr &s) :
|
||||
KCModuleInfo(s), _module(0) {
|
||||
}
|
||||
|
||||
ConfigModule::~ConfigModule()
|
||||
{
|
||||
ConfigModule::~ConfigModule() {
|
||||
deleteClient();
|
||||
}
|
||||
|
||||
ProxyWidget *ConfigModule::module()
|
||||
{
|
||||
ProxyWidget *ConfigModule::module() {
|
||||
if (_module)
|
||||
return _module;
|
||||
#ifdef __GNUC__
|
||||
#warning I expect KControl in its current form to disappear, if not a real port is needed
|
||||
#endif
|
||||
// root KCMs are gone, clean up all of the related code
|
||||
bool run_as_root = false; //needsRootPrivileges() && (getuid() != 0);
|
||||
|
||||
kDebug() << "Finding proxy..." << endl;
|
||||
|
||||
KCModule *modWidget = 0;
|
||||
|
||||
modWidget = KCModuleLoader::loadModule(*this,/*KCModuleLoader::None*/(KCModuleLoader::ErrorReporting)0);
|
||||
modWidget = KCModuleLoader::loadModule(*this,/*KCModuleLoader::None*/(KCModuleLoader::ErrorReporting)NULL);
|
||||
|
||||
if (modWidget)
|
||||
{
|
||||
if (modWidget==NULL) {
|
||||
|
||||
_module = new ProxyWidget(modWidget, moduleName(), run_as_root);
|
||||
connect(_module, SIGNAL(changed(bool)), this, SLOT(clientChanged(bool)));
|
||||
connect(_module, SIGNAL(closed()), this, SLOT(clientClosed()));
|
||||
connect(_module, SIGNAL(helpRequest()), this, SIGNAL(helpRequest()));
|
||||
connect(_module, SIGNAL(runAsRoot()), this, SLOT(runAsRoot()));
|
||||
kWarning() << "Unable to load KCM Module" << endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_module = new ProxyWidget(modWidget);
|
||||
|
||||
return _module;
|
||||
}
|
||||
|
||||
return 0;
|
||||
QPixmap ConfigModule::realIcon(KIconLoader::StdSizes size) {
|
||||
//The next line is identical as SmallIcon(module->icon()), but is able to return a isNull() QPixmap
|
||||
QPixmap providedIcon = KIconLoader::global()->loadIcon(icon(), KIconLoader::Small, size, KIconLoader::DefaultState, QStringList(), 0L, true);
|
||||
if (providedIcon.isNull()) {
|
||||
kDebug() << "Icon is null" << icon() << endl;
|
||||
return SmallIcon("computer", size);
|
||||
|
||||
}
|
||||
return providedIcon;
|
||||
|
||||
}
|
||||
|
||||
void ConfigModule::deleteClient()
|
||||
{
|
||||
#ifdef Q_WS_X11
|
||||
if (_embedWidget)
|
||||
XKillClient(QX11Info::display(), _embedWidget->containerWinId());
|
||||
#endif
|
||||
delete _rootProcess;
|
||||
_rootProcess = 0;
|
||||
|
||||
delete _embedWidget;
|
||||
_embedWidget = 0;
|
||||
delete _embedFrame;
|
||||
_embedFrame = 0;
|
||||
void ConfigModule::deleteClient() {
|
||||
kapp->syncX();
|
||||
|
||||
if (_module)
|
||||
_module->close();
|
||||
_module = 0;
|
||||
_module = NULL;
|
||||
|
||||
delete _embedLayout;
|
||||
_embedLayout = 0;
|
||||
|
||||
_changed = false;
|
||||
}
|
||||
|
||||
void ConfigModule::clientClosed()
|
||||
{
|
||||
deleteClient();
|
||||
|
||||
emit changed(this);
|
||||
emit childClosed();
|
||||
}
|
||||
|
||||
|
||||
void ConfigModule::clientChanged(bool state)
|
||||
{
|
||||
setChanged(state);
|
||||
emit changed(this);
|
||||
}
|
||||
|
||||
|
||||
void ConfigModule::runAsRoot()
|
||||
{
|
||||
const KAboutData *ConfigModule::aboutData() const {
|
||||
if (!_module)
|
||||
return;
|
||||
|
||||
delete _rootProcess;
|
||||
delete _embedWidget;
|
||||
delete _embedLayout;
|
||||
|
||||
// create an embed widget that will embed the
|
||||
// kcmshell4 running as root
|
||||
_embedLayout = new QVBoxLayout(_module->parentWidget());
|
||||
_embedFrame = new KVBox( _module->parentWidget() );
|
||||
#ifdef __GNUC__
|
||||
#warning "KDE4 porting ";
|
||||
#endif
|
||||
//_embedFrame->setFrameStyle( QFrame::Box | QFrame::Raised );
|
||||
QPalette pal( Qt::red );
|
||||
pal.setColor( QPalette::Background,
|
||||
_module->parentWidget()->palette().color( QPalette::Background ) );
|
||||
#ifdef __GNUC__
|
||||
#warning "KDE4 porting"
|
||||
#endif
|
||||
//_embedFrame->setPalette( pal );
|
||||
//_embedFrame->setLineWidth( 2 );
|
||||
//_embedFrame->setMidLineWidth( 2 );
|
||||
_embedLayout->addWidget(_embedFrame,1);
|
||||
_embedWidget = new QX11EmbedWidget(_embedFrame );
|
||||
|
||||
_module->hide();
|
||||
_embedFrame->show();
|
||||
QLabel *_busy = new QLabel(i18n("<big>Loading...</big>"), _embedWidget);
|
||||
_busy->setAlignment(Qt::AlignCenter);
|
||||
_busy->setTextFormat(Qt::RichText);
|
||||
_busy->setGeometry(0,0, _module->width(), _module->height());
|
||||
_busy->show();
|
||||
|
||||
// prepare the process to run the kcmshell4
|
||||
QString cmd = service()->exec().trimmed();
|
||||
bool kdeshell = false;
|
||||
if (cmd.left(5) == "kdesu")
|
||||
{
|
||||
cmd = cmd.remove(0,5).trimmed();
|
||||
// remove all kdesu switches
|
||||
while( cmd.length() > 1 && cmd[ 0 ] == '-' )
|
||||
{
|
||||
int pos = cmd.indexOf( ' ' );
|
||||
cmd = cmd.remove( 0, pos ).trimmed();
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd.left(8) == "kcmshell4")
|
||||
{
|
||||
cmd = cmd.remove(0,8).trimmed();
|
||||
kdeshell = true;
|
||||
}
|
||||
|
||||
// run the process
|
||||
QString kdesu = KStandardDirs::findExe("kdesu");
|
||||
if (!kdesu.isEmpty())
|
||||
{
|
||||
_rootProcess = new K3Process;
|
||||
*_rootProcess << kdesu;
|
||||
#ifdef __GNUC__
|
||||
#warning "--nonewdcop doesn't exist now";
|
||||
#endif
|
||||
//*_rootProcess << "--nonewdcop";
|
||||
// We have to disable the keep-password feature because
|
||||
// in that case the modules is started through kdesud and kdesu
|
||||
// returns before the module is running and that doesn't work.
|
||||
// We also don't have a way to close the module in that case.
|
||||
*_rootProcess << "--n"; // Don't keep password.
|
||||
if (kdeshell) {
|
||||
*_rootProcess << QString("kcmshell4 %1 --embed %2 --lang %3").arg(cmd).arg(_embedWidget->winId()).arg(KGlobal::locale()->language());
|
||||
}
|
||||
else {
|
||||
*_rootProcess << QString("%1 --embed %2 --lang %3").arg(cmd).arg(_embedWidget->winId()).arg( KGlobal::locale()->language() );
|
||||
}
|
||||
|
||||
connect(_rootProcess, SIGNAL(processExited(K3Process*)), this, SLOT(rootExited(K3Process*)));
|
||||
|
||||
if ( !_rootProcess->start(K3Process::NotifyOnExit) )
|
||||
{
|
||||
delete _rootProcess;
|
||||
_rootProcess = 0L;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// clean up in case of failure
|
||||
delete _embedFrame;
|
||||
_embedWidget = 0;
|
||||
delete _embedLayout;
|
||||
_embedLayout = 0;
|
||||
_module->show();
|
||||
}
|
||||
|
||||
|
||||
void ConfigModule::rootExited(K3Process *)
|
||||
{
|
||||
|
||||
if (_embedWidget->containerWinId())
|
||||
XDestroyWindow(QX11Info::display(), _embedWidget->containerWinId());
|
||||
|
||||
delete _embedWidget;
|
||||
_embedWidget = 0;
|
||||
|
||||
delete _rootProcess;
|
||||
_rootProcess = 0;
|
||||
|
||||
delete _embedLayout;
|
||||
_embedLayout = 0;
|
||||
|
||||
delete _module;
|
||||
_module=0;
|
||||
|
||||
_changed = false;
|
||||
emit changed(this);
|
||||
emit childClosed();
|
||||
}
|
||||
|
||||
const KAboutData *ConfigModule::aboutData() const
|
||||
{
|
||||
if (!_module) return 0;
|
||||
return 0;
|
||||
return _module->aboutData();
|
||||
}
|
||||
|
||||
|
||||
ConfigModuleList::ConfigModuleList()
|
||||
{
|
||||
setAutoDelete(true);
|
||||
subMenus.setAutoDelete(true);
|
||||
ConfigModuleList::ConfigModuleList() {
|
||||
foreach(ConfigModule* configModule, *this) {
|
||||
delete configModule;
|
||||
}
|
||||
|
||||
void ConfigModuleList::readDesktopEntries()
|
||||
{
|
||||
readDesktopEntriesRecursive( KCGlobal::baseGroup() );
|
||||
this->clear();
|
||||
}
|
||||
|
||||
bool ConfigModuleList::readDesktopEntriesRecursive(const QString &path)
|
||||
{
|
||||
bool ConfigModuleList::readDesktopEntries() {
|
||||
KService::List list = KServiceTypeTrader::self()->query("KCModule", "[X-KDE-ParentApp] == 'kinfocenter'");
|
||||
|
||||
if( list.isEmpty() )
|
||||
if (list.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Menu *menu = new Menu;
|
||||
subMenus.insert(path, menu);
|
||||
|
||||
foreach(const KService::Ptr &s, list)
|
||||
{
|
||||
if (s->isType(KST_KService))
|
||||
{
|
||||
if (!KAuthorized::authorizeControlModule(s->menuId()))
|
||||
foreach(const KService::Ptr &s, list) {
|
||||
if (s->isType(KST_KService) == false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!KAuthorized::authorizeControlModule(s->menuId())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ConfigModule *module = new ConfigModule(s);
|
||||
if (module->library().isEmpty())
|
||||
{
|
||||
if (module->library().isEmpty()) {
|
||||
delete module;
|
||||
continue;
|
||||
}
|
||||
|
||||
append(module);
|
||||
menu->modules.append(module);
|
||||
}
|
||||
else if (s->isType(KST_KServiceGroup) &&
|
||||
readDesktopEntriesRecursive(s->entryPath()) )
|
||||
menu->submenus.append(s->entryPath());
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Q3PtrList<ConfigModule> ConfigModuleList::modules(const QString &path)
|
||||
{
|
||||
Menu *menu = subMenus.find(path);
|
||||
if (menu)
|
||||
return menu->modules;
|
||||
|
||||
return Q3PtrList<ConfigModule>();
|
||||
}
|
||||
|
||||
QStringList ConfigModuleList::submenus(const QString &path)
|
||||
{
|
||||
Menu *menu = subMenus.find(path);
|
||||
if (menu)
|
||||
return menu->submenus;
|
||||
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QString ConfigModuleList::findModule(ConfigModule *module)
|
||||
{
|
||||
Q3DictIterator<Menu> it(subMenus);
|
||||
Menu *menu;
|
||||
for(;(menu = it.current());++it)
|
||||
{
|
||||
if (menu->modules.containsRef(module))
|
||||
return it.currentKey();
|
||||
}
|
||||
return QString();
|
||||
}
|
||||
|
|
|
@ -20,26 +20,21 @@
|
|||
#ifndef MODULES_H
|
||||
#define MODULES_H
|
||||
|
||||
#include <kcmoduleinfo.h>
|
||||
#include <QObject>
|
||||
#include <Qt3Support/Q3Dict>
|
||||
//Added by qt3to4:
|
||||
#include <QVBoxLayout>
|
||||
#include <Q3PtrList>
|
||||
#include <kvbox.h>
|
||||
|
||||
template<class ConfigModule> class Q3PtrList;
|
||||
#include <kcmoduleinfo.h>
|
||||
#include <kiconloader.h>
|
||||
|
||||
class QStringList;
|
||||
class KAboutData;
|
||||
class KCModule;
|
||||
class ProxyWidget;
|
||||
class K3Process;
|
||||
class QX11EmbedWidget;
|
||||
class QVBoxLayout;
|
||||
class KVBox;
|
||||
|
||||
class ConfigModule : public QObject, public KCModuleInfo
|
||||
{
|
||||
class ConfigModule : public QObject, public KCModuleInfo {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
@ -47,79 +42,33 @@ public:
|
|||
ConfigModule(const KService::Ptr &s);
|
||||
~ConfigModule();
|
||||
|
||||
bool isChanged() { return _changed; }
|
||||
void setChanged(bool changed) { _changed = changed; }
|
||||
|
||||
bool isActive() { return _module != 0; }
|
||||
bool isActive() {
|
||||
return _module != 0;
|
||||
}
|
||||
ProxyWidget *module();
|
||||
const KAboutData *aboutData() const;
|
||||
|
||||
QPixmap realIcon(KIconLoader::StdSizes size);
|
||||
|
||||
public Q_SLOTS:
|
||||
public slots:
|
||||
|
||||
void deleteClient();
|
||||
|
||||
|
||||
private Q_SLOTS:
|
||||
|
||||
void clientClosed();
|
||||
void clientChanged(bool state);
|
||||
void runAsRoot();
|
||||
void rootExited(K3Process *proc);
|
||||
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
void changed(ConfigModule *module);
|
||||
void childClosed();
|
||||
void helpRequest();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
bool _changed;
|
||||
ProxyWidget *_module;
|
||||
QX11EmbedWidget *_embedWidget;
|
||||
K3Process *_rootProcess;
|
||||
QVBoxLayout *_embedLayout;
|
||||
KVBox *_embedFrame;
|
||||
|
||||
};
|
||||
|
||||
class ConfigModuleList : public Q3PtrList<ConfigModule>
|
||||
{
|
||||
class ConfigModuleList : public QList<ConfigModule*> {
|
||||
public:
|
||||
|
||||
ConfigModuleList();
|
||||
|
||||
void readDesktopEntries();
|
||||
bool readDesktopEntriesRecursive(const QString &path);
|
||||
bool readDesktopEntries();
|
||||
|
||||
/**
|
||||
* Returns all submenus of the submenu identified by path
|
||||
*/
|
||||
Q3PtrList<ConfigModule> modules(const QString &path);
|
||||
|
||||
/**
|
||||
* Returns all modules of the submenu identified by path
|
||||
*/
|
||||
QStringList submenus(const QString &path);
|
||||
|
||||
/**
|
||||
* Returns the path of the submenu the module is in
|
||||
*/
|
||||
QString findModule(ConfigModule *module);
|
||||
|
||||
protected:
|
||||
|
||||
class Menu
|
||||
{
|
||||
public:
|
||||
Q3PtrList<ConfigModule> modules;
|
||||
QStringList submenus;
|
||||
};
|
||||
|
||||
Q3Dict<Menu> subMenus;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -25,353 +25,120 @@
|
|||
#include <kiconloader.h>
|
||||
#include <kservicegroup.h>
|
||||
#include <kdebug.h>
|
||||
#include <kicon.h>
|
||||
|
||||
#include <Qt3Support/Q3Header>
|
||||
#include <Qt3Support/Q3WhatsThis>
|
||||
#include <QImage>
|
||||
#include <QPainter>
|
||||
#include <QBitmap>
|
||||
#include <QPixmap>
|
||||
#include <Q3PtrList>
|
||||
#include <QKeyEvent>
|
||||
|
||||
#include "moduletreeview.moc"
|
||||
|
||||
static QPixmap appIcon(const QString &iconName)
|
||||
{
|
||||
QString path;
|
||||
QPixmap normal = KIconLoader::global()->loadIcon(iconName, KIconLoader::Small, 0, KIconLoader::DefaultState, QStringList(), &path, true);
|
||||
// make sure they are not larger than KIconLoader::SizeSmall
|
||||
if (normal.width() > KIconLoader::SizeSmall || normal.height() > KIconLoader::SizeSmall)
|
||||
{
|
||||
QImage tmp = normal.toImage();
|
||||
tmp = tmp.scaled(KIconLoader::SizeSmall, KIconLoader::SizeSmall, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||
normal = QPixmap::fromImage(tmp);
|
||||
}
|
||||
return normal;
|
||||
ModuleTreeView::ModuleTreeView(ConfigModuleList *modules, QWidget * parent) :
|
||||
QListWidget(parent), _modules(modules) {
|
||||
|
||||
connect(this, SIGNAL(itemSelectionChanged()), this, SLOT(selectItem()));
|
||||
|
||||
setSortingEnabled(false);
|
||||
_generalItem = NULL;
|
||||
}
|
||||
|
||||
class ModuleTreeWhatsThis : public Q3WhatsThis
|
||||
{
|
||||
public:
|
||||
ModuleTreeWhatsThis( ModuleTreeView* tree)
|
||||
: Q3WhatsThis( tree ), treeView( tree ) {}
|
||||
~ModuleTreeWhatsThis(){}
|
||||
void ModuleTreeView::fill() {
|
||||
_generalItem = new QListWidgetItem(KIcon(KINFOCENTER_ICON_NAME), i18n("General Information"), this);
|
||||
|
||||
|
||||
QString text( const QPoint & p) {
|
||||
ModuleTreeItem* i = (ModuleTreeItem*) treeView->itemAt( p );
|
||||
if ( i && i->module() ) {
|
||||
return i->module()->comment();
|
||||
} else if ( i ) {
|
||||
return i18n("The %1 configuration group. Click to open it.", i->text(0) );
|
||||
}
|
||||
return i18n("This treeview displays all available control modules. Click on one of the modules to receive more detailed information.");
|
||||
}
|
||||
|
||||
private:
|
||||
ModuleTreeView* treeView;
|
||||
};
|
||||
|
||||
ModuleTreeView::ModuleTreeView(ConfigModuleList *list, QWidget * parent)
|
||||
: K3ListView(parent)
|
||||
, _modules(list)
|
||||
{
|
||||
addColumn(QString());
|
||||
setColumnWidthMode (0, Q3ListView::Maximum);
|
||||
setAllColumnsShowFocus(true);
|
||||
setResizeMode(Q3ListView::AllColumns);
|
||||
setRootIsDecorated(true);
|
||||
setHScrollBarMode(AlwaysOff);
|
||||
header()->hide();
|
||||
|
||||
new ModuleTreeWhatsThis( this );
|
||||
|
||||
connect(this, SIGNAL(clicked(Q3ListViewItem*)),
|
||||
this, SLOT(slotItemSelected(Q3ListViewItem*)));
|
||||
}
|
||||
|
||||
void ModuleTreeView::fill()
|
||||
{
|
||||
clear();
|
||||
|
||||
QStringList subMenus = _modules->submenus(KCGlobal::baseGroup());
|
||||
for(QStringList::ConstIterator it = subMenus.begin();
|
||||
it != subMenus.end(); ++it)
|
||||
{
|
||||
QString path = *it;
|
||||
ModuleTreeItem* menu = new ModuleTreeItem(this);
|
||||
menu->setGroup(path);
|
||||
fill(menu, path);
|
||||
}
|
||||
|
||||
ConfigModule *module;
|
||||
Q3PtrList<ConfigModule> moduleList = _modules->modules(KCGlobal::baseGroup());
|
||||
for (module=moduleList.first(); module != 0; module=moduleList.next())
|
||||
{
|
||||
new ModuleTreeItem(this, module);
|
||||
foreach(ConfigModule* configModule, *_modules) {
|
||||
new ModuleTreeItem(this, configModule);
|
||||
}
|
||||
}
|
||||
|
||||
void ModuleTreeView::fill(ModuleTreeItem *parent, const QString &parentPath)
|
||||
{
|
||||
QStringList subMenus = _modules->submenus(parentPath);
|
||||
for(QStringList::ConstIterator it = subMenus.begin();
|
||||
it != subMenus.end(); ++it)
|
||||
{
|
||||
QString path = *it;
|
||||
ModuleTreeItem* menu = new ModuleTreeItem(parent);
|
||||
menu->setGroup(path);
|
||||
fill(menu, path);
|
||||
}
|
||||
void ModuleTreeView::selectItem() {
|
||||
QListWidgetItem* item = this->currentItem();
|
||||
if (item==NULL)
|
||||
return;
|
||||
|
||||
ConfigModule *module;
|
||||
Q3PtrList<ConfigModule> moduleList = _modules->modules(parentPath);
|
||||
for (module=moduleList.first(); module != 0; module=moduleList.next())
|
||||
{
|
||||
new ModuleTreeItem(parent, module);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
QSize ModuleTreeView::sizeHint() const
|
||||
{
|
||||
return Q3ListView::sizeHint().boundedTo(
|
||||
QSize( fontMetrics().maxWidth()*35, QWIDGETSIZE_MAX) );
|
||||
}
|
||||
|
||||
void ModuleTreeView::makeSelected(ConfigModule *module)
|
||||
{
|
||||
ModuleTreeItem *item = static_cast<ModuleTreeItem*>(firstChild());
|
||||
|
||||
updateItem(item, module);
|
||||
}
|
||||
|
||||
void ModuleTreeView::updateItem(ModuleTreeItem *item, ConfigModule *module)
|
||||
{
|
||||
while (item)
|
||||
{
|
||||
if (item->childCount() != 0)
|
||||
updateItem(static_cast<ModuleTreeItem*>(item->firstChild()), module);
|
||||
if (item->module() == module)
|
||||
{
|
||||
setSelected(item, true);
|
||||
break;
|
||||
}
|
||||
item = static_cast<ModuleTreeItem*>(item->nextSibling());
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void ModuleTreeView::expandItem(QListViewItem *item, QPtrList<QListViewItem> *parentList)
|
||||
{
|
||||
while (item)
|
||||
{
|
||||
setOpen(item, parentList->contains(item));
|
||||
|
||||
if (item->childCount() != 0)
|
||||
expandItem(item->firstChild(), parentList);
|
||||
item = item->nextSibling();
|
||||
}
|
||||
}
|
||||
*/
|
||||
void ModuleTreeView::makeVisible(ConfigModule *module)
|
||||
{
|
||||
QString path = _modules->findModule(module);
|
||||
if (path.startsWith(KCGlobal::baseGroup()))
|
||||
path = path.mid(KCGlobal::baseGroup().length());
|
||||
|
||||
QStringList groups = path.split( '/');
|
||||
|
||||
ModuleTreeItem *item = 0;
|
||||
QStringList::ConstIterator it;
|
||||
for (it=groups.begin(); it != groups.end(); ++it)
|
||||
{
|
||||
if (item)
|
||||
item = static_cast<ModuleTreeItem*>(item->firstChild());
|
||||
else
|
||||
item = static_cast<ModuleTreeItem*>(firstChild());
|
||||
|
||||
while (item)
|
||||
{
|
||||
if (item->tag() == *it)
|
||||
{
|
||||
setOpen(item, true);
|
||||
break;
|
||||
}
|
||||
item = static_cast<ModuleTreeItem*>(item->nextSibling());
|
||||
}
|
||||
if (!item)
|
||||
break; // Not found (?)
|
||||
}
|
||||
|
||||
// make the item visible
|
||||
if (item)
|
||||
ensureItemVisible(item);
|
||||
}
|
||||
|
||||
void ModuleTreeView::slotItemSelected(Q3ListViewItem* item)
|
||||
{
|
||||
if (!item) return;
|
||||
|
||||
if (static_cast<ModuleTreeItem*>(item)->module())
|
||||
{
|
||||
emit moduleSelected(static_cast<ModuleTreeItem*>(item)->module());
|
||||
if (isGeneralItem(item)) {
|
||||
kDebug() << "General Selected" << endl;
|
||||
emit generalSelected();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
emit categorySelected(item);
|
||||
}
|
||||
|
||||
setOpen(item, !item->isOpen());
|
||||
kDebug() << "Select item" << endl;
|
||||
ModuleTreeItem* moduleItem = static_cast<ModuleTreeItem*>(item);
|
||||
|
||||
/*
|
||||
else
|
||||
{
|
||||
QPtrList<QListViewItem> parents;
|
||||
|
||||
QListViewItem* i = item;
|
||||
while(i)
|
||||
{
|
||||
parents.append(i);
|
||||
i = i->parent();
|
||||
}
|
||||
|
||||
//int oy1 = item->itemPos();
|
||||
//int oy2 = mapFromGlobal(QCursor::pos()).y();
|
||||
//int offset = oy2 - oy1;
|
||||
|
||||
expandItem(firstChild(), &parents);
|
||||
|
||||
//int x =mapFromGlobal(QCursor::pos()).x();
|
||||
//int y = item->itemPos() + offset;
|
||||
//QCursor::setPos(mapToGlobal(QPoint(x, y)));
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void ModuleTreeView::keyPressEvent(QKeyEvent *e)
|
||||
{
|
||||
if (!currentItem()) return;
|
||||
|
||||
if(e->key() == Qt::Key_Return
|
||||
|| e->key() == Qt::Key_Enter
|
||||
|| e->key() == Qt::Key_Space)
|
||||
{
|
||||
//QCursor::setPos(mapToGlobal(QPoint(10, currentItem()->itemPos()+5)));
|
||||
slotItemSelected(currentItem());
|
||||
}
|
||||
else
|
||||
K3ListView::keyPressEvent(e);
|
||||
emit moduleSelected(moduleItem->module());
|
||||
kDebug() << "Select item end" << endl;
|
||||
}
|
||||
|
||||
|
||||
ModuleTreeItem::ModuleTreeItem(Q3ListViewItem *parent, ConfigModule *module)
|
||||
: Q3ListViewItem(parent)
|
||||
, _module(module)
|
||||
, _tag(QString())
|
||||
, _maxChildIconWidth(0)
|
||||
{
|
||||
if (_module)
|
||||
{
|
||||
setText(0, ' ' + module->moduleName());
|
||||
setPixmap(0, appIcon(module->icon()));
|
||||
}
|
||||
bool ModuleTreeView::isGeneralItem(const QListWidgetItem* item) const {
|
||||
if (item == _generalItem)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
ModuleTreeItem::ModuleTreeItem(Q3ListView *parent, ConfigModule *module)
|
||||
: Q3ListViewItem(parent)
|
||||
, _module(module)
|
||||
, _tag(QString())
|
||||
, _maxChildIconWidth(0)
|
||||
{
|
||||
if (_module)
|
||||
{
|
||||
setText(0, ' ' + module->moduleName());
|
||||
setPixmap(0, appIcon(module->icon()));
|
||||
}
|
||||
QListWidgetItem* ModuleTreeView::generalItem() const {
|
||||
return _generalItem;
|
||||
}
|
||||
|
||||
ModuleTreeItem::ModuleTreeItem(Q3ListViewItem *parent, const QString& text)
|
||||
: Q3ListViewItem(parent, ' ' + text)
|
||||
, _module(0)
|
||||
, _tag(QString())
|
||||
, _maxChildIconWidth(0)
|
||||
{}
|
||||
|
||||
ModuleTreeItem::ModuleTreeItem(Q3ListView *parent, const QString& text)
|
||||
: Q3ListViewItem(parent, ' ' + text)
|
||||
, _module(0)
|
||||
, _tag(QString())
|
||||
, _maxChildIconWidth(0)
|
||||
{}
|
||||
|
||||
void ModuleTreeItem::setPixmap(int column, const QPixmap& pm)
|
||||
{
|
||||
if (!pm.isNull())
|
||||
{
|
||||
ModuleTreeItem* p = dynamic_cast<ModuleTreeItem*>(parent());
|
||||
if (p)
|
||||
p->regChildIconWidth(pm.width());
|
||||
ModuleTreeItem* ModuleTreeView::findMatchingItem(ConfigModule* configModule) const {
|
||||
for (int i = 0; i < count() ; ++i) {
|
||||
QListWidgetItem* tempItem = item(i);
|
||||
if (isGeneralItem(tempItem)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Q3ListViewItem::setPixmap(column, pm);
|
||||
ModuleTreeItem* moduleItem = static_cast<ModuleTreeItem*>(tempItem);
|
||||
if (moduleItem->module()==configModule)
|
||||
return moduleItem;
|
||||
|
||||
}
|
||||
|
||||
void ModuleTreeItem::regChildIconWidth(int width)
|
||||
{
|
||||
if (width > _maxChildIconWidth)
|
||||
_maxChildIconWidth = width;
|
||||
}
|
||||
|
||||
void ModuleTreeItem::paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align )
|
||||
{
|
||||
if (!pixmap(0))
|
||||
{
|
||||
int offset = 0;
|
||||
ModuleTreeItem* parentItem = dynamic_cast<ModuleTreeItem*>(parent());
|
||||
if (parentItem)
|
||||
{
|
||||
offset = parentItem->maxChildIconWidth();
|
||||
}
|
||||
|
||||
if (offset > 0)
|
||||
{
|
||||
QPixmap pixmap(offset, offset);
|
||||
pixmap.fill(Qt::color0);
|
||||
pixmap.setMask(pixmap.createHeuristicMask());
|
||||
QBitmap mask( pixmap.size() );
|
||||
mask.clear();
|
||||
pixmap.setMask( mask );
|
||||
Q3ListViewItem::setPixmap(0, pixmap);
|
||||
}
|
||||
}
|
||||
|
||||
Q3ListViewItem::paintCell( p, cg, column, width, align );
|
||||
kDebug() << "Unable to find the matching item" << endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void ModuleTreeItem::setGroup(const QString &path)
|
||||
{
|
||||
KServiceGroup::Ptr group = KServiceGroup::group(path);
|
||||
QString defName = path.left(path.length()-1);
|
||||
int pos = defName.lastIndexOf('/');
|
||||
if (pos >= 0)
|
||||
defName = defName.mid(pos+1);
|
||||
if (group && group->isValid())
|
||||
{
|
||||
setPixmap(0, appIcon(group->icon()));
|
||||
setText(0, ' ' + group->caption());
|
||||
setTag(defName);
|
||||
setCaption(group->caption());
|
||||
ModuleTreeItem::ModuleTreeItem(QListWidget *parent, ConfigModule *module) :
|
||||
QListWidgetItem(parent), _module(module) {
|
||||
|
||||
setText(module->moduleName());
|
||||
|
||||
setIcon(module->realIcon(KIconLoader::SizeSmall));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Should not happen: Installation problem
|
||||
// Let's try to fail softly.
|
||||
setText(0, ' ' + defName);
|
||||
setTag(defName);
|
||||
|
||||
ConfigModule* ModuleTreeItem::module() const {
|
||||
return _module;
|
||||
}
|
||||
|
||||
|
||||
ModuleWidgetSearchLine::ModuleWidgetSearchLine(QWidget* parent, ModuleTreeView* listWidget) :
|
||||
KListWidgetSearchLine(parent, listWidget) {
|
||||
|
||||
}
|
||||
|
||||
bool ModuleWidgetSearchLine::itemMatches(const QListWidgetItem* item, const QString& search) const {
|
||||
|
||||
const ModuleTreeView* moduleTree = static_cast<const ModuleTreeView*>(listWidget());
|
||||
if (moduleTree->isGeneralItem(item)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const ModuleTreeItem* moduleItem = static_cast<const ModuleTreeItem*>(item);
|
||||
|
||||
QStringList itemMatches;
|
||||
itemMatches << moduleItem->module()->moduleName();
|
||||
//kDebug() << "Module name " << moduleItem->module()->moduleName() << endl;
|
||||
|
||||
QStringList keywords = moduleItem->module()->keywords();
|
||||
foreach(QString keyword, keywords) {
|
||||
//kDebug() << "Key word " << keyword << endl;
|
||||
itemMatches.append(keyword);
|
||||
}
|
||||
|
||||
|
||||
foreach(QString itemMatch, itemMatches) {
|
||||
if (itemMatch.contains(search, Qt::CaseInsensitive)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -20,76 +20,60 @@
|
|||
#ifndef __moduletreeview_h__
|
||||
#define __moduletreeview_h__
|
||||
|
||||
#include <Qt3Support/Q3PtrList>
|
||||
#include <Qt3Support/Q3CheckListItem>
|
||||
//Added by qt3to4:
|
||||
#include <QListWidget>
|
||||
#include <QPixmap>
|
||||
#include <QKeyEvent>
|
||||
#include <k3listview.h>
|
||||
#include <Qt3Support/Q3Dict>
|
||||
|
||||
#include <klistwidgetsearchline.h>
|
||||
|
||||
class ConfigModule;
|
||||
class ConfigModuleList;
|
||||
class QPainter;
|
||||
|
||||
class ModuleTreeItem : public Q3ListViewItem
|
||||
{
|
||||
class ModuleTreeItem : public QListWidgetItem {
|
||||
|
||||
public:
|
||||
explicit ModuleTreeItem(Q3ListViewItem *parent, ConfigModule *module = 0);
|
||||
ModuleTreeItem(Q3ListViewItem *parent, const QString& text);
|
||||
explicit ModuleTreeItem(Q3ListView *parent, ConfigModule *module = 0);
|
||||
ModuleTreeItem(Q3ListView *parent, const QString& text);
|
||||
explicit ModuleTreeItem(QListWidget* parent, ConfigModule* module = NULL);
|
||||
|
||||
void setTag(const QString& tag) { _tag = tag; }
|
||||
void setCaption(const QString& caption) { _caption = caption; }
|
||||
void setModule(ConfigModule *m) { _module = m; }
|
||||
QString tag() const { return _tag; }
|
||||
QString caption() const { return _caption; }
|
||||
ConfigModule *module() { return _module; }
|
||||
void regChildIconWidth(int width);
|
||||
int maxChildIconWidth() { return _maxChildIconWidth; }
|
||||
|
||||
void setPixmap(int column, const QPixmap& pm);
|
||||
void setGroup(const QString &path);
|
||||
|
||||
protected:
|
||||
void paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int align );
|
||||
ConfigModule* module() const;
|
||||
|
||||
private:
|
||||
ConfigModule *_module;
|
||||
QString _tag;
|
||||
QString _caption;
|
||||
int _maxChildIconWidth;
|
||||
|
||||
};
|
||||
|
||||
class ModuleTreeView : public K3ListView
|
||||
{
|
||||
class ModuleTreeView : public QListWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ModuleTreeView(ConfigModuleList *list, QWidget * parent = 0);
|
||||
explicit ModuleTreeView(ConfigModuleList* configModules, QWidget* parent = NULL);
|
||||
|
||||
void makeSelected(ConfigModule* module);
|
||||
void makeVisible(ConfigModule *module);
|
||||
void fill();
|
||||
QSize sizeHint() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void moduleSelected(ConfigModule*);
|
||||
void categorySelected(Q3ListViewItem*);
|
||||
bool isGeneralItem(const QListWidgetItem* item) const;
|
||||
|
||||
protected Q_SLOTS:
|
||||
void slotItemSelected(Q3ListViewItem*);
|
||||
QListWidgetItem* generalItem() const;
|
||||
|
||||
protected:
|
||||
void updateItem(ModuleTreeItem *item, ConfigModule* module);
|
||||
void keyPressEvent(QKeyEvent *);
|
||||
void fill(ModuleTreeItem *parent, const QString &parentPath);
|
||||
ModuleTreeItem* findMatchingItem(ConfigModule* configModule) const;
|
||||
|
||||
signals:
|
||||
void moduleSelected(ConfigModule* configModule);
|
||||
void generalSelected();
|
||||
|
||||
private slots:
|
||||
void selectItem();
|
||||
|
||||
private:
|
||||
QListWidgetItem* _generalItem;
|
||||
|
||||
ConfigModuleList* _modules;
|
||||
};
|
||||
|
||||
class ModuleWidgetSearchLine : public KListWidgetSearchLine {
|
||||
public:
|
||||
ModuleWidgetSearchLine(QWidget* parent, ModuleTreeView* listWidget);
|
||||
|
||||
protected:
|
||||
|
||||
virtual bool itemMatches(const QListWidgetItem* item, const QString& search) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -18,7 +18,7 @@ set(kcm_nic_PART_SRCS nic.cpp )
|
|||
kde4_add_plugin(kcm_nic ${kcm_nic_PART_SRCS})
|
||||
|
||||
|
||||
target_link_libraries(kcm_nic ${KDE4_KIO_LIBS} ${QT_QT3SUPPORT_LIBRARY} )
|
||||
target_link_libraries(kcm_nic ${KDE4_KIO_LIBS} )
|
||||
|
||||
install(TARGETS kcm_nic DESTINATION ${PLUGIN_INSTALL_DIR} )
|
||||
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
#include <QTimer>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <Q3PtrList>
|
||||
#include <QTreeWidget>
|
||||
|
||||
#include "nic.h"
|
||||
|
@ -77,8 +76,7 @@ K_PLUGIN_FACTORY(KCMNicFactory,
|
|||
)
|
||||
K_EXPORT_PLUGIN(KCMNicFactory("kcmnic"))
|
||||
|
||||
struct MyNIC
|
||||
{
|
||||
struct MyNIC {
|
||||
QString name;
|
||||
QString addr;
|
||||
QString netmask;
|
||||
|
@ -87,13 +85,10 @@ struct MyNIC
|
|||
QString HWaddr;
|
||||
};
|
||||
|
||||
typedef Q3PtrList<MyNIC> NICList;
|
||||
QList<MyNIC*> findNICs();
|
||||
|
||||
NICList* findNICs();
|
||||
|
||||
KCMNic::KCMNic(QWidget *parent, const QVariantList &)
|
||||
:KCModule(KCMNicFactory::componentData(), parent)
|
||||
{
|
||||
KCMNic::KCMNic(QWidget *parent, const QVariantList &) :
|
||||
KCModule(KCMNicFactory::componentData(), parent) {
|
||||
QVBoxLayout *box=new QVBoxLayout(this);
|
||||
box->setMargin(0);
|
||||
box->setSpacing(KDialog::spacingHint());
|
||||
|
@ -113,8 +108,7 @@ KCMNic::KCMNic(QWidget *parent, const QVariantList &)
|
|||
connect(m_updateButton, SIGNAL(clicked()), this, SLOT(update()));
|
||||
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
|
||||
update();
|
||||
KAboutData *about =
|
||||
new KAboutData(I18N_NOOP("kcminfo"), 0,
|
||||
KAboutData *about = new KAboutData(I18N_NOOP("kcminfo"), 0,
|
||||
ki18n("KDE Panel System Information Control Module"),
|
||||
0, KLocalizedString(), KAboutData::License_GPL,
|
||||
ki18n("(c) 2001 - 2002 Alexander Neundorf"));
|
||||
|
@ -124,24 +118,25 @@ KCMNic::KCMNic(QWidget *parent, const QVariantList &)
|
|||
|
||||
}
|
||||
|
||||
void KCMNic::update()
|
||||
{
|
||||
void KCMNic::update() {
|
||||
m_list->clear();
|
||||
NICList *nics=findNICs();
|
||||
nics->setAutoDelete(true);
|
||||
for (MyNIC* tmp=nics->first(); tmp!=0; tmp=nics->next()) {
|
||||
QList<MyNIC*> nics=findNICs();
|
||||
|
||||
foreach(MyNIC* tmp, nics) {
|
||||
QStringList lst;
|
||||
lst << tmp->name<<tmp->addr<<tmp->netmask<<tmp->type<<tmp->state<<tmp->HWaddr;
|
||||
new QTreeWidgetItem(m_list,lst);
|
||||
}
|
||||
delete nics;
|
||||
|
||||
delete tmp;
|
||||
}
|
||||
|
||||
static QString HWaddr2String(const char *hwaddr )
|
||||
{
|
||||
nics.clear();
|
||||
|
||||
}
|
||||
|
||||
static QString HWaddr2String(const char *hwaddr) {
|
||||
QString ret;
|
||||
for (int i=0; i<6; i++, hwaddr++)
|
||||
{
|
||||
for (int i=0; i<6; i++, hwaddr++) {
|
||||
int v = (*hwaddr & 0xff);
|
||||
QString num = QString("%1").arg(v, 0, 16);
|
||||
if (num.length() < 2)
|
||||
|
@ -153,13 +148,11 @@ static QString HWaddr2String(const char *hwaddr )
|
|||
return ret;
|
||||
}
|
||||
|
||||
NICList* findNICs()
|
||||
{
|
||||
QList<MyNIC*> findNICs() {
|
||||
QString upMessage(i18nc("State of network card is connected", "Up") );
|
||||
QString downMessage(i18nc("State of network card is disconnected", "Down") );
|
||||
|
||||
NICList* nl=new NICList;
|
||||
nl->setAutoDelete(true);
|
||||
QList<MyNIC*> nl;
|
||||
|
||||
#if !defined(HAVE_GETIFADDRS) || !defined(HAVE_GETNAMEINFO)
|
||||
|
||||
|
@ -171,8 +164,7 @@ NICList* findNICs()
|
|||
ifc.ifc_req = (struct ifreq *) buf;
|
||||
int result=ioctl(sockfd, SIOCGIFCONF, &ifc);
|
||||
|
||||
for (char* ptr = buf; ptr < buf + ifc.ifc_len; )
|
||||
{
|
||||
for (char* ptr = buf; ptr < buf + ifc.ifc_len;) {
|
||||
struct ifreq *ifr =(struct ifreq *) ptr;
|
||||
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
|
||||
int len = sizeof(struct sockaddr);
|
||||
|
@ -186,8 +178,7 @@ NICList* findNICs()
|
|||
int flags;
|
||||
struct sockaddr_in *sinptr;
|
||||
MyNIC *tmp=0;
|
||||
switch (ifr->ifr_addr.sa_family)
|
||||
{
|
||||
switch (ifr->ifr_addr.sa_family) {
|
||||
case AF_INET:
|
||||
sinptr = (struct sockaddr_in *) &ifr->ifr_addr;
|
||||
flags=0;
|
||||
|
@ -218,21 +209,17 @@ NICList* findNICs()
|
|||
|
||||
ifcopy=*ifr;
|
||||
result=ioctl(sockfd, SIOCGIFNETMASK, &ifcopy);
|
||||
if (result==0)
|
||||
{
|
||||
if (result==0) {
|
||||
sinptr = (struct sockaddr_in *) &ifcopy.ifr_addr;
|
||||
tmp->netmask=inet_ntoa(sinptr->sin_addr);
|
||||
}
|
||||
else
|
||||
} else
|
||||
tmp->netmask=i18nc("Unknown network mask", "Unknown");
|
||||
|
||||
|
||||
ifcopy=*ifr;
|
||||
result=-1; // if none of the two #ifs below matches, ensure that result!=0 so that "Unknown" is returned as result
|
||||
#ifdef SIOCGIFHWADDR
|
||||
result=ioctl(sockfd, SIOCGIFHWADDR, &ifcopy);
|
||||
if (result==0)
|
||||
{
|
||||
if (result==0) {
|
||||
char *n = &ifcopy.ifr_ifru.ifru_hwaddr.sa_data[0];
|
||||
tmp->HWaddr = HWaddr2String(n);
|
||||
}
|
||||
|
@ -244,12 +231,11 @@ NICList* findNICs()
|
|||
tmp->HWaddr = HWaddr2String(n);
|
||||
}
|
||||
#endif
|
||||
if (result!=0)
|
||||
{
|
||||
if (result!=0) {
|
||||
tmp->HWaddr = i18nc("Unknown HWaddr", "Unknown");
|
||||
}
|
||||
|
||||
nl->append(tmp);
|
||||
nl.append(tmp);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -285,7 +271,7 @@ NICList* findNICs()
|
|||
tmp->state= (ifa->ifa_flags & IFF_UP) ? upMessage : downMessage;
|
||||
tmp->type = flags_tos(ifa->ifa_flags);
|
||||
|
||||
nl->append(tmp);
|
||||
nl.append(tmp);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -298,7 +284,6 @@ NICList* findNICs()
|
|||
return nl;
|
||||
}
|
||||
|
||||
|
||||
#if defined(HAVE_GETNAMEINFO) && defined(HAVE_GETIFADDRS)
|
||||
QString flags_tos (unsigned int flags)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
|
||||
if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
ADD_DEFINITIONS(-DINFO_OPENGL_AVAILABLE ) # added manually
|
||||
include_directories( ${OPENGL_INCLUDE_DIR} ${OPENGL_GLU_INCLUDE_DIR} )
|
||||
|
||||
########### next target ###############
|
||||
|
@ -19,6 +17,3 @@ if(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
|||
########### install files ###############
|
||||
|
||||
install(FILES opengl.desktop DESTINATION ${SERVICES_INSTALL_DIR})
|
||||
else(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
MESSAGE(STATUS "OpenGL information module has been disabled.")
|
||||
endif(OPENGL_FOUND AND OPENGL_GLU_FOUND)
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
[Desktop Entry]
|
||||
Exec=kcmshell4 kcmopengl
|
||||
Exec=kcmshell4 opengl
|
||||
Type=Service
|
||||
X-KDE-ServiceTypes=KCModule
|
||||
X-DocPath=kinfocenter/opengl/index.html
|
||||
Icon=kcmopengl
|
||||
|
||||
X-KDE-Library=kcm_opengl
|
||||
X-KDE-PluginKeyword=opengl
|
||||
X-KDE-ParentApp=kinfocenter
|
||||
|
||||
Name=OpenGL
|
||||
|
|
37
kinfocenter/pci/CMakeLists.txt
Normal file
37
kinfocenter/pci/CMakeLists.txt
Normal file
|
@ -0,0 +1,37 @@
|
|||
|
||||
# OS Base includes
|
||||
include(../base/CMakeLists.txt)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../base
|
||||
)
|
||||
|
||||
########### next target ###############
|
||||
|
||||
|
||||
if(PCIUTILS_FOUND)
|
||||
MESSAGE(STATUS "Enabling PCI module based on pciutils library")
|
||||
|
||||
add_definitions( -DHAVE_PCIUTILS )
|
||||
|
||||
set(KCM_PCI_PART_SRCS kcm_pci.cpp ../base/os_current.cpp pci.cpp )
|
||||
|
||||
kde4_add_plugin(kcm_pci ${KCM_PCI_PART_SRCS})
|
||||
|
||||
target_link_libraries(kcm_pci ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} ${PCIUTILS_LIBRARIES})
|
||||
|
||||
|
||||
else(PCIUTILS_FOUND)
|
||||
|
||||
set(KCM_PCI_PART_SRCS kcm_pci.cpp ../base/os_current.cpp )
|
||||
|
||||
kde4_add_plugin(kcm_pci ${KCM_PCI_PART_SRCS})
|
||||
|
||||
target_link_libraries(kcm_pci ${KDE4_KDEUI_LIBS} ${QT_QTGUI_LIBRARY} )
|
||||
endif(PCIUTILS_FOUND)
|
||||
|
||||
install(TARGETS kcm_pci DESTINATION ${PLUGIN_INSTALL_DIR})
|
||||
|
||||
########### install files ###############
|
||||
|
||||
install( FILES kcm_pci.desktop DESTINATION ${SERVICES_INSTALL_DIR})
|
2
kinfocenter/pci/Messages.sh
Normal file
2
kinfocenter/pci/Messages.sh
Normal file
|
@ -0,0 +1,2 @@
|
|||
#! /usr/bin/env bash
|
||||
$XGETTEXT *.cpp -o $podir/kcm_pci.pot
|
90
kinfocenter/pci/kcm_pci.cpp
Normal file
90
kinfocenter/pci/kcm_pci.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
/*
|
||||
* Copyright (C) 2008 Nicolas Ternisien <nicolas.ternisien@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "kcm_pci.h"
|
||||
|
||||
#include <QtGui>
|
||||
#include <QStringList>
|
||||
|
||||
#include <KPluginFactory>
|
||||
#include <KPluginLoader>
|
||||
|
||||
#include <kaboutdata.h>
|
||||
#include <kdialog.h>
|
||||
#include <kdebug.h>
|
||||
|
||||
#include <QLayout>
|
||||
#include <QPainter>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
|
||||
#include <klocale.h>
|
||||
#include <kglobal.h>
|
||||
#include <kdialog.h>
|
||||
#include <kseparator.h>
|
||||
|
||||
K_PLUGIN_FACTORY(KCMPciFactory,
|
||||
registerPlugin<KCMPci>();
|
||||
)
|
||||
K_EXPORT_PLUGIN(KCMPciFactory("kcm_pci"))
|
||||
|
||||
KCMPci::KCMPci(QWidget *parent, const QVariantList &) :
|
||||
KCModule(KCMPciFactory::componentData(), parent) {
|
||||
|
||||
KAboutData *about = new KAboutData(I18N_NOOP("kcm_pci"), 0,
|
||||
ki18n("KDE PCI Information Control Module"),
|
||||
0, KLocalizedString(), KAboutData::License_GPL,
|
||||
ki18n( "(c) 2008 Nicolas Ternisien"
|
||||
"(c) 1998 - 2002 Helge Deller"));
|
||||
|
||||
about->addAuthor(ki18n("Nicolas Ternisien"), KLocalizedString(), "nicolas.ternisien@gmail.com");
|
||||
about->addAuthor(ki18n("Helge Deller"), KLocalizedString(), "deller@gmx.de");
|
||||
setAboutData(about);
|
||||
|
||||
|
||||
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||
layout->setSpacing(0);
|
||||
layout->setMargin(0);
|
||||
|
||||
tree = new QTreeWidget(this);
|
||||
layout->addWidget(tree);
|
||||
tree->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
tree->setAllColumnsShowFocus(true);
|
||||
tree->setRootIsDecorated(false);
|
||||
tree->setWhatsThis(i18n("This list displays PCI information.") );
|
||||
|
||||
|
||||
}
|
||||
|
||||
KCMPci::~KCMPci() {
|
||||
|
||||
}
|
||||
|
||||
void KCMPci::load() {
|
||||
kDebug() << "Loading PCI information..." << endl;
|
||||
GetInfo_PCI(tree);
|
||||
}
|
||||
|
||||
QString KCMPci::quickHelp() const {
|
||||
return i18n("This display shows information about PCI slots of your computer and the related connected devices.");
|
||||
}
|
||||
|
||||
#include "kcm_pci.moc"
|
|
@ -1,13 +1,11 @@
|
|||
[Desktop Entry]
|
||||
Exec=kcmshell4 pci
|
||||
Icon=kcmpci
|
||||
Exec=kcmshell4 kcm_pci
|
||||
Icon=memory
|
||||
Type=Service
|
||||
X-KDE-ServiceTypes=KCModule
|
||||
X-DocPath=kinfocenter/pci/index.html
|
||||
|
||||
|
||||
X-KDE-Library=kcm_info
|
||||
X-KDE-PluginKeyword=pci
|
||||
X-KDE-Library=kcm_pci
|
||||
X-KDE-ParentApp=kinfocenter
|
||||
|
||||
Name=PCI
|
53
kinfocenter/pci/kcm_pci.h
Normal file
53
kinfocenter/pci/kcm_pci.h
Normal file
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* memory.h
|
||||
*
|
||||
* Copyright (C) 2008 Nicolas Ternisien <nicolas.ternisien@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef KCONTROL_PCI_H
|
||||
#define KCONTROL_PCI_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <kcmodule.h>
|
||||
#include <kaboutdata.h>
|
||||
|
||||
#include "os_current.h"
|
||||
|
||||
class QStringList;
|
||||
|
||||
class QPushButton;
|
||||
class QTreeWidget;
|
||||
|
||||
class KCMPci : public KCModule {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit KCMPci(QWidget *parent = NULL, const QVariantList &list = QVariantList());
|
||||
~KCMPci();
|
||||
|
||||
virtual void load();
|
||||
virtual QString quickHelp() const;
|
||||
|
||||
private:
|
||||
QTreeWidget* tree;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
808
kinfocenter/pci/pci.cpp
Normal file
808
kinfocenter/pci/pci.cpp
Normal file
|
@ -0,0 +1,808 @@
|
|||
/* Retreive information about PCI subsystem trough libpci library from
|
||||
pciutils package. This should be possible on Linux, BSD and AIX.
|
||||
|
||||
This code is based on example.c, lspci.c and pci.ids from pciutils.
|
||||
|
||||
Device classes, subclasses and programing interfaces are hardcoded
|
||||
here, since there are only few of them, and they are important and
|
||||
should their names be translated.
|
||||
|
||||
Author: Konrad Rzepecki <hannibal@megapolis.pl>
|
||||
*/
|
||||
#include "pci_private.h"
|
||||
|
||||
//extern "C" is needed to proper linking with libpci
|
||||
extern "C" {
|
||||
#include <pci/pci.h>
|
||||
}
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h> //getuid
|
||||
#include <ctype.h> //isxdigit
|
||||
#include <string.h> //memcpy
|
||||
#include <QTreeWidget>
|
||||
#include <QTreeWidgetItem>
|
||||
#include <QFile>
|
||||
|
||||
static const QString& getNameById(const id2name *const table, int id) {
|
||||
for (int i=0;; i++) {
|
||||
if ((table[i].id==id)||(table[i].id==-1)) {
|
||||
return table[i].name;
|
||||
}//if
|
||||
}//while
|
||||
}//getNameById
|
||||
|
||||
static const QString& getNameBy2Id(const id3name *const table, int id, int id2) {
|
||||
for (int i=0;; i++) {
|
||||
if (((table[i].id==id)&&(table[i].id2==id2))|| ((table[i].id==id)&&(table[i].id2==-1))|| (table[i].id==-1)) {
|
||||
return table[i].name;
|
||||
}//if
|
||||
}//while
|
||||
}//getNameBy2Id
|
||||
|
||||
static const QString& getNameBy3Id(const id4name *const table, int id, int id2, int id3) {
|
||||
for (int i=0;; i++) {
|
||||
if (((table[i].id==id)&&(table[i].id2==id2)&&(table[i].id3==id3))|| ((table[i].id==id)&&(table[i].id2==id2)&&(table[i].id3==-1))|| ((table[i].id==id)&&(table[i].id2==-1))|| (table[i].id==-1)) {
|
||||
return table[i].name;
|
||||
}//if
|
||||
}//while
|
||||
}//getNameBy3Id
|
||||
|
||||
static QTreeWidgetItem* create(QTreeWidgetItem* parent, const QString& title, const QString& value) {
|
||||
QStringList list;
|
||||
list << title << value;
|
||||
return new QTreeWidgetItem(parent, list);
|
||||
}
|
||||
|
||||
static QTreeWidgetItem* createTitle(QTreeWidgetItem* parent, const QString& title) {
|
||||
QStringList list;
|
||||
list << title;
|
||||
return new QTreeWidgetItem(parent, list);
|
||||
}
|
||||
|
||||
static QTreeWidgetItem* addDeviceClass(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QString value;
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
after=create(parent, i18n("Device Class"), getNameById(devClass, info->devClass)+value.sprintf(" (0x%02X)", info->devClass));
|
||||
after=create(parent, i18n("Device Subclass"), getNameBy2Id(devSubclass, info->devClass, info->devSubClass)+value.sprintf(" (0x%02X)", info->devSubClass));
|
||||
after=create(parent, i18n("Device Programming Interface"), getNameBy3Id(devInterface, info->devClass, info->devSubClass, info->devProgIface)+value.sprintf(" (0x%02X)", info->devProgIface));
|
||||
if ((info->devClass==0x01)&&(info->devSubClass==0x01)) { //programming interface for IDE
|
||||
localAfter=create(after, i18n("Master IDE Device"), (info->progIdeMaster ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Secondary programmable indicator"), (info->progSecProgInd ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Secondary operating mode"), (info->progSecOperMode ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Primary programmable indicator"), (info->progPriProgInd ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Primary operating mode"), (info->progPriOperMode ? i18n(strYes) : i18n(strNo)));
|
||||
}//if
|
||||
return after;
|
||||
}//addDeviceClass
|
||||
|
||||
static QTreeWidgetItem* addVendor(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, pci_access *PCIAccess) {
|
||||
char nameBuffer[NAME_BUFFER_SIZE];
|
||||
QString line, value, topname;
|
||||
short int subvendor=0, subdevice=0;
|
||||
bool isVendor=false, isDevice=false, isSub=false;
|
||||
|
||||
memset((void*)nameBuffer, 0, NAME_BUFFER_SIZE);
|
||||
if (info->headerType==PCI_HEADER_TYPE_CARDBUS) {
|
||||
subvendor=info->cbSubVendor;
|
||||
subdevice=info->cbSubDevice;
|
||||
}//if
|
||||
else {
|
||||
subvendor=info->subVendor;
|
||||
subdevice=info->subDevice;
|
||||
}//else
|
||||
|
||||
//WARNING all pci_lookup_name calls should have 4 extra args for compatibility with older pcilib !
|
||||
if (pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR, info->vendor, 0, 0, 0)!=NULL) {
|
||||
// line.setAscii(nameBuffer); //not work, workaround below
|
||||
line = QString::fromAscii(pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR, info->vendor, 0, 0, 0));
|
||||
if (line.contains("Unknown")==0) {
|
||||
isVendor=true;
|
||||
topname=line;
|
||||
after=create(parent, i18n("Vendor"), line+value.sprintf(" (0x%04X)", info->vendor));
|
||||
if (pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_DEVICE, info->vendor, info->device, 0, 0)!=NULL) {
|
||||
// line.setAscii(nameBuffer); //not work, workaround below
|
||||
line = QString::fromAscii(pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_DEVICE, info->vendor, info->device, 0, 0));
|
||||
if (line.contains("Unknown")==0) {
|
||||
isDevice=true;
|
||||
topname+=QString(" ")+line;
|
||||
after=create(parent, i18n("Device"), line+value.sprintf(" (0x%04X)", info->device));
|
||||
if (info->headerType==PCI_HEADER_TYPE_BRIDGE) {
|
||||
isSub=true;
|
||||
}//if
|
||||
else if (pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR|PCI_LOOKUP_DEVICE|PCI_LOOKUP_SUBSYSTEM, info->vendor, info->device, subvendor, subdevice)!=NULL) {
|
||||
// line.setAscii(nameBuffer); //not work, workaround below
|
||||
line = QString::fromAscii(pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR|PCI_LOOKUP_DEVICE|PCI_LOOKUP_SUBSYSTEM, info->vendor, info->device, subvendor, subdevice));
|
||||
if (line.contains("Unknown")==0) {
|
||||
isSub=true;
|
||||
after=create(parent, i18n("Subsystem"), line+value.sprintf(" (0x%04X:0x%04X)", subvendor, subdevice));
|
||||
}//if
|
||||
}//eliif
|
||||
}//if
|
||||
}//iif
|
||||
}//if
|
||||
}//if
|
||||
if (!isVendor) {
|
||||
after=create(parent, i18n("Vendor"), i18n(strUnknown)+value.sprintf(" (0x%04X)", info->vendor));
|
||||
if (!isDevice) {
|
||||
after=create(parent, i18n("Device"), i18n(strUnknown)+value.sprintf(" (0x%04X)", info->device));
|
||||
}//if
|
||||
topname=i18n(strUnknown);
|
||||
}//if
|
||||
if ((!isSub)&&(info->headerType!=PCI_HEADER_TYPE_BRIDGE)) { //if entire subsytem was not found, search at least for subvendor
|
||||
if (pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR, subvendor, 0, 0, 0)!=NULL) {
|
||||
// line.setAscii(nameBuffer); //not work, workaround below
|
||||
line = QString::fromAscii(pci_lookup_name(PCIAccess, nameBuffer, NAME_BUFFER_SIZE, PCI_LOOKUP_VENDOR, subvendor, 0, 0, 0));
|
||||
if (line.contains("Unknown")==0) {
|
||||
after=create(parent, i18n("Subsystem"), line+i18n(" - device:")+value.sprintf(" 0x%04X (0x%04X:0x%04X)", subdevice, subvendor, subdevice));
|
||||
}//if
|
||||
else {
|
||||
after=create(parent, i18n("Subsystem"), i18n(strUnknown)+value.sprintf(" (0x%04X:0x%04X)", subvendor, subdevice));
|
||||
}//else
|
||||
}//if
|
||||
else {
|
||||
after=create(parent, i18n("Subsystem"), i18n(strUnknown)+value.sprintf(" (0x%04X:0x%04X)", subvendor, subdevice));
|
||||
}//else
|
||||
}//if
|
||||
parent->setText(1, topname);
|
||||
return after;
|
||||
}//addVendor
|
||||
|
||||
static QTreeWidgetItem* addInterrupt(QTreeWidgetItem *parent, QTreeWidgetItem *after, int irq, int pin) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if ((irq!=0)||(pin!=0)) {
|
||||
after=createTitle(parent, i18n("Interrupt"));
|
||||
localAfter=create(after, i18n("IRQ"), value.sprintf("%i", irq));
|
||||
localAfter=create(after, i18n("Pin"), value.sprintf("%c", (pin==0 ? '?' : 'A'-1+pin)));
|
||||
}//if
|
||||
return after;
|
||||
}//addInterrupt
|
||||
|
||||
static QTreeWidgetItem* addControl(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
after=create(parent, i18n("Control"), value.sprintf("0x%04X", info->command));
|
||||
localAfter=create(after, i18n("Response in I/O space"), (info->comIo ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Response in memory space"), (info->comMemory ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Bus mastering"), (info->comMaster ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Response to special cycles"), (info->comSpecial ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Memory write and invalidate"), (info->comInvalidate ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Palette snooping"), (info->comVgaPalette ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Parity checking"), (info->comParity ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Address/data stepping"), (info->comWait ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("System error"), (info->comSerr ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Back-to-back writes"), (info->comFastBack ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Interrupt"), (info->comInterrupt ? i18n(strDisabled) : i18n(strEnabled))); //reverse order is intentional
|
||||
return after;
|
||||
}//addControl
|
||||
|
||||
static QTreeWidgetItem* addStatus(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
after=create(parent, i18n("Status"), value.sprintf("0x%04X", info->status));
|
||||
localAfter=create(after, i18n("Interrupt status"), (info->statCapList ? i18n(strEnabled) : i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Capability list"), (info->statCapList ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("66 MHz PCI 2.1 bus"), (info->stat66MHz ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("User definable features"), (info->statUdf ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Accept fast-back to back"), (info->statFastBack ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Data parity error"), (info->statParity ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Device selection timing"), getNameById(devSel, info->statDevsel));
|
||||
localAfter=create(after, i18n("Signaled target abort"), (info->statSigTargetAbort ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received target abort"), (info->statRecTargetAbort ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received master abort"), (info->statRecMasterAbort ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Signaled system error"), (info->statSigSystemError ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Parity error"), (info->statDetectedParity ? i18n(strYes) : i18n(strNo)));
|
||||
return after;
|
||||
}//addStatus
|
||||
|
||||
static QTreeWidgetItem* addLatency(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
after=create(parent, i18n("Latency"), value.sprintf("%u", info->latencyTimer));
|
||||
if (info->headerType==PCI_HEADER_TYPE_NORMAL) {
|
||||
if (info->minGnt==0) {
|
||||
localAfter=create(after, i18n("MIN_GNT"), i18n("No major requirements (0x00)"));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(after, i18n("MIN_GNT"), value.sprintf("%u ns (0x%02X)", info->minGnt*250, info->minGnt));
|
||||
}//else
|
||||
if (info->maxLat==0) {
|
||||
localAfter=create(after, i18n("MAX_LAT"), i18n("No major requirements (0x00)"));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(after, i18n("MAX_LAT"), value.sprintf("%u ns (0x%02X)", info->maxLat*250, info->maxLat));
|
||||
}//else
|
||||
}//if
|
||||
return after;
|
||||
}//addLatency
|
||||
|
||||
static QTreeWidgetItem* addHeaderType(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
after=create(parent, i18n("Header"),value.sprintf("0x%02X",info->headerTypeFull));
|
||||
localAfter=create(after, i18n("Type"),getNameById(headerType,info->headerType)+value.sprintf(" (0x%02X)",info->headerType));
|
||||
localAfter=create(after, i18n("Multifunctional"),(info->multifunctional?i18n(strYes):i18n(strNo)));
|
||||
return after;
|
||||
}//addHeaderType
|
||||
|
||||
static QTreeWidgetItem* addBist(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
after=create(parent, i18n("Build-in self test"), value.sprintf("0x%02X", info->bist));
|
||||
localAfter=create(after, i18n("BIST Capable"), (info->bistCapable ? i18n(strYes) : i18n(strNo)));
|
||||
if (info->bistCapable==1) {
|
||||
localAfter=create(after, i18n("BIST Start"), (info->bistStart ? i18n(strYes) : i18n(strNo)));
|
||||
localAfter=create(after, i18n("Completion code"), value.sprintf("0x%01X", info->bistCode));
|
||||
}//if
|
||||
return after;
|
||||
}//addBist
|
||||
|
||||
static QTreeWidgetItem* addSize(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciaddr_t size) {
|
||||
if (size<0x400) {
|
||||
after=create(parent, i18n("Size"), QString::QString("%1 B").arg(static_cast<unsigned long>(size)));
|
||||
}//if
|
||||
else if (size<0x100000) {
|
||||
after=create(parent, i18n("Size"), QString::QString("%1 kiB").arg(static_cast<unsigned long>(size/0x400)));
|
||||
}//elif
|
||||
else if (size<0x40000000) {
|
||||
after=create(parent, i18n("Size"), QString::QString("%1 MiB").arg(static_cast<unsigned long>(size/0x100000)));
|
||||
}//elif
|
||||
|
||||
#ifdef HAVE_PCIADDR_T64
|
||||
|
||||
else if (size<0x10000000000LL) {
|
||||
after=create(parent, i18n("Size"),QString::QString("%1 GiB").arg(static_cast<unsigned long>(size/0x40000000)));
|
||||
}//elif
|
||||
else if (size<0x4000000000000LL) {
|
||||
after=create(parent, i18n("Size"),QString::QString("%1 PiB").arg(static_cast<unsigned long>(size/0x10000000000LL)));
|
||||
}//elif
|
||||
else if (size<0x1000000000000000LL) {
|
||||
after=create(parent, i18n("Size"),QString::QString("%1 EiB").arg(static_cast<unsigned long>(size/0x4000000000000LL)));
|
||||
}//elif
|
||||
|
||||
#else //HAVE_PCIADDR_T64
|
||||
else {
|
||||
after=create(parent, i18n("Size"), QString::QString("%1 GiB").arg(static_cast<unsigned long>(size/0x40000000)));
|
||||
}//else
|
||||
|
||||
#endif //HAVE_PCIADDR_T64
|
||||
return after;
|
||||
}//addSize
|
||||
|
||||
static QTreeWidgetItem* addMapping(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, pci_dev* PCIDevice) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QTreeWidgetItem *topLocalAfter=NULL;
|
||||
QString value;
|
||||
bool is64b=false;
|
||||
after=createTitle(parent, i18n("Address mappings"));
|
||||
for (int i=0; i<6; i++) {
|
||||
if (((info->headerType==PCI_HEADER_TYPE_BRIDGE)&&(i>1))||((info->headerType==PCI_HEADER_TYPE_CARDBUS)&&(i>0))) {
|
||||
break;
|
||||
}//if
|
||||
if (is64b) { //skip one range
|
||||
continue;
|
||||
}//if
|
||||
topLocalAfter=createTitle(after, i18n("Mapping %1").arg(i));
|
||||
localAfter=create(topLocalAfter, i18n("Space"), (info->mapping[i].baseAddressMap ? i18n("I/O") : i18n("Memory")));
|
||||
if (info->mapping[i].baseAddressMap==0) { //memory only
|
||||
localAfter=create(topLocalAfter, i18n("Type"), getNameById(mappingType, info->mapping[i].baseAddressType));
|
||||
localAfter=create(topLocalAfter, i18n("Prefetchable"), (info->mapping[i].baseAddressPref ? i18n(strYes) : i18n(strNo)));
|
||||
}//if
|
||||
if (is64b) { //there is no long long support in Qt so we need compose value
|
||||
topLocalAfter->setText(1, value.sprintf("0x%08X%08X", info->mapping[i+1].baseAddress, info->mapping[i].baseAddress));
|
||||
if (info->mapping[i+1].baseAddress==0) { //no top 4 bytes
|
||||
if ((info->mapping[i].baseAddress&(~(info->mapping[i].baseAddressMap ? 0x3 : 0xF)))==0) { //no address at all
|
||||
localAfter=create(topLocalAfter, i18n("Address"), i18n("Unassigned"));
|
||||
localAfter=create(topLocalAfter, i18n("Size"), i18n("Unassigned"));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(topLocalAfter, i18n("Address"), value.sprintf("0x%X", (info->mapping[i].baseAddress&(~(info->mapping[i].baseAddressMap ? 0x3 : 0xF)))));
|
||||
localAfter=addSize(topLocalAfter, localAfter, PCIDevice->size[i]);
|
||||
}//else
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(topLocalAfter, i18n("Address"), value.sprintf("0x%X%08X", info->mapping[i+1].baseAddress, (~(info->mapping[i].baseAddress&(info->mapping[i].baseAddressMap ? 0x3 : 0xF)))));
|
||||
localAfter=addSize(topLocalAfter, localAfter, PCIDevice->size[i]);
|
||||
}//else
|
||||
}//if
|
||||
else {
|
||||
topLocalAfter->setText(1, value.sprintf("0x%08X", info->mapping[i].baseAddress));
|
||||
if ((info->mapping[i].baseAddress&(~(info->mapping[i].baseAddressMap ? 0x3 : 0xF)))==0) { //no address at all
|
||||
localAfter=create(topLocalAfter, i18n("Address"), i18n("Unassigned"));
|
||||
localAfter=create(topLocalAfter, i18n("Size"), i18n("Unassigned"));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(topLocalAfter, i18n("Address"), value.sprintf("0x%X", (info->mapping[i].baseAddress&(~(info->mapping[i].baseAddressMap ? 0x3 : 0xF)))));
|
||||
localAfter=addSize(topLocalAfter, localAfter, PCIDevice->size[i]);
|
||||
}//else
|
||||
}//else
|
||||
}//for
|
||||
return after;
|
||||
}//addMapping
|
||||
|
||||
static QTreeWidgetItem* addBus(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if (info->headerType==PCI_HEADER_TYPE_BRIDGE) {
|
||||
after=createTitle(parent, i18n("Bus"));
|
||||
localAfter=create(after, i18n("Primary bus number"), value.sprintf("0x%02X", info->primaryBus));
|
||||
localAfter=create(after, i18n("Secondary bus number"), value.sprintf("0x%02X", info->secondaryBus));
|
||||
localAfter=create(after, i18n("Subordinate bus number"), value.sprintf("0x%02X", info->subordinateBus));
|
||||
localAfter=create(after, i18n("Secondary latency timer"), value.sprintf("0x%02X", info->secLatencyTimer));
|
||||
}//if
|
||||
else if (info->headerType==PCI_HEADER_TYPE_CARDBUS) { //should be checked
|
||||
after=createTitle(parent, i18n("Bus"));
|
||||
localAfter=create(after, i18n("Primary bus number"), value.sprintf("0x%02X", info->cbPrimaryBus));
|
||||
localAfter=create(after, i18n("CardBus number"), value.sprintf("0x%02X", info->cbCardBus));
|
||||
localAfter=create(after, i18n("Subordinate bus number"), value.sprintf("0x%02X", info->cbSubordinateBus));
|
||||
localAfter=create(after, i18n("CardBus latency timer"), value.sprintf("0x%02X", info->cbLatencyTimer));
|
||||
}//elif
|
||||
return after;
|
||||
}//addBus
|
||||
|
||||
static QTreeWidgetItem* addSecStatus(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if (info->headerType==PCI_HEADER_TYPE_BRIDGE) {
|
||||
after=create(parent, i18n("Secondary status"), value.sprintf("0x%04X", info->secStatus));
|
||||
localAfter=create(after, i18n("Interrupt status"),(info->secStatCapList?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Capability list"),(info->secStatCapList?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("66 MHz PCI 2.1 bus"),(info->secStat66MHz?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("User definable features"),(info->secStatUdf?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Accept fast-back to back"),(info->secStatFastBack?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Data parity error"),(info->secStatParity?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Device selection timing"),getNameById(devSel,info->secStatDevsel));
|
||||
localAfter=create(after, i18n("Signaled target abort"),(info->secStatSigTargetAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received target abort"),(info->secStatRecTargetAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received master abort"),(info->secStatRecMasterAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Signaled system error"),(info->secStatSigSystemError?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Parity error"),(info->secStatDetectedParity?i18n(strYes):i18n(strNo)));
|
||||
}//if
|
||||
else if (info->headerType==PCI_HEADER_TYPE_CARDBUS) { //should be checked
|
||||
after=create(parent,i18n("Secondary status"),value.sprintf("0x%04X",info->cbSecStatus));
|
||||
localAfter=create(after, i18n("Interrupt status"),(info->cbSecStatCapList?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Capability list"),(info->cbSecStatCapList?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("66 MHz PCI 2.1 bus"),(info->cbSecStat66MHz?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("User definable features"),(info->cbSecStatUdf?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Accept fast-back to back"),(info->cbSecStatFastBack?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Data parity error"),(info->cbSecStatParity?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Device selection timing"),getNameById(devSel,info->cbSecStatDevsel));
|
||||
localAfter=create(after, i18n("Signaled target abort"),(info->cbSecStatSigTargetAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received target abort"),(info->cbSecStatRecTargetAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Received master abort"),(info->cbSecStatRecMasterAbort?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Signaled system error"),(info->cbSecStatSigSystemError?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Parity error"),(info->cbSecStatDetectedParity?i18n(strYes):i18n(strNo)));
|
||||
}//elif
|
||||
return after;
|
||||
}//addSecStatus
|
||||
|
||||
static QTreeWidgetItem* addBridgeBehind(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if (info->headerType==PCI_HEADER_TYPE_BRIDGE) {
|
||||
after=createTitle(parent, i18n("I/O behind bridge"));
|
||||
localAfter=create(after, i18n("32 bit"),(info->ioBaseType?i18n(strYes):i18n(strNo)));
|
||||
if (info->ioBaseType==0) {
|
||||
localAfter=create(after, i18n("Base"),value.sprintf("0x%04X",info->ioBase&0xFFF0));
|
||||
localAfter=create(after, i18n("Limit"),value.sprintf("0x%04X",info->ioLimit|0x0F));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(after, i18n("Base"),value.sprintf("0x%04X%04X",info->ioBaseUpper16,info->ioBase&0xFFF0));
|
||||
localAfter=create(after, i18n("Limit"),value.sprintf("0x%04X%04X",info->ioLimitUpper16,info->ioLimit|0x0F));
|
||||
}//else
|
||||
after=createTitle(parent, i18n("Memory behind bridge"));
|
||||
localAfter=create(after, i18n("Base"),value.sprintf("0x%08X",(info->memoryBase<<16)&0xFFFFFFF0));
|
||||
localAfter=create(after, i18n("Limit"),value.sprintf("0x%08X",(info->memoryLimit<<16)|0x0FFFFF));
|
||||
after=createTitle(parent, i18n("Prefetchable memory behind bridge"));
|
||||
localAfter=create(after, i18n("64 bit"),(info->ioBaseType?i18n(strYes):i18n(strNo)));
|
||||
if (info->ioBaseType==0) {
|
||||
localAfter=create(after, i18n("Base"),value.sprintf("0x%08X",(info->prefMemoryBase<<16)&0xFFFFFFF0));
|
||||
localAfter=create(after, i18n("Limit"),value.sprintf("0x%08X",(info->prefMemoryLimit<<16)|0x0FFFFF));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(after, i18n("Base"),value.sprintf("0x%08X%08X",info->prefBaseUpper32,(info->prefMemoryBase<<16)&0xFFFFFFF0));
|
||||
localAfter=create(after, i18n("Limit"),value.sprintf("0x%0x8X%08X",info->prefLimitUpper32,(info->prefMemoryLimit<<16)|0x0FFFFF));
|
||||
}//else
|
||||
}//if
|
||||
return after;
|
||||
}//addBridgeBechind
|
||||
|
||||
static QTreeWidgetItem* addBridgeControl(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if (info->headerType==PCI_HEADER_TYPE_BRIDGE) {
|
||||
after=create(parent, i18n("Bridge control"),value.sprintf("0x%04X",info->bridgeControl));
|
||||
localAfter=create(after, i18n("Secondary parity checking"),(info->bridgeControlParity?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Secondary system error"),(info->bridgeControlSerr?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("ISA ports forwarding"),(info->bridgeControlIsa?i18n(strDisabled):i18n(strEnabled))); //reverse order is intentional
|
||||
localAfter=create(after, i18n("VGA forwarding"),(info->bridgeControlVga?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Master abort"),(info->bridgeControlMasterAbort?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Secondary bus reset"),(info->bridgeControlBusReset?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Secondary back-to-back writes"),(info->bridgeControlFastBack?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Primary discard timer counts"),(info->bridgeControlPriDisTim?i18n("2e10 PCI clocks"):i18n("2e15 PCI clocks")));
|
||||
localAfter=create(after, i18n("Secondary discard timer counts"),(info->bridgeControlSecDisTim?i18n("2e10 PCI clocks"):i18n("2e15 PCI clocks")));
|
||||
localAfter=create(after, i18n("Discard timer error"),(info->bridgeControlDisTimStat?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Discard timer system error"),(info->bridgeControlDisTimeSerr?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
return after;
|
||||
}//addBridgeControl
|
||||
|
||||
static QTreeWidgetItem* addRom(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, pci_dev* PCIDevice) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if ((info->headerType==PCI_HEADER_TYPE_NORMAL)||(info->headerType==PCI_HEADER_TYPE_BRIDGE)) {
|
||||
after=createTitle(parent, i18n("Expansion ROM"));
|
||||
localAfter=create(after, i18n("Status"),(info->romEnabled?i18n(strEnabled):i18n(strDisabled)));
|
||||
if (PCIDevice->rom_base_addr==0) { //no address at all
|
||||
localAfter=create(after, i18n("Address"),i18n("Unassigned"));
|
||||
localAfter=create(after, i18n("Size"),i18n("Unassigned"));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(after, i18n("Address"),value.sprintf("0x%X",static_cast<unsigned>(PCIDevice->rom_base_addr)));
|
||||
localAfter=addSize(after, localAfter, PCIDevice->rom_size);
|
||||
}//else
|
||||
}//if
|
||||
return after;
|
||||
}//addRom
|
||||
|
||||
static QTreeWidgetItem* addCardbusResource(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QTreeWidgetItem *topLocalAfter=NULL;
|
||||
QString value;
|
||||
int pref=0;
|
||||
if (info->headerType==PCI_HEADER_TYPE_CARDBUS) {
|
||||
after=createTitle(parent, i18n("Memory windows"));
|
||||
for (int i=0; i<2; i++) {
|
||||
pref=(i ? info->cbControlPref1 : info->cbControlPref0);
|
||||
topLocalAfter=createTitle(after, i18n("Window %1").arg(i));
|
||||
localAfter=create(topLocalAfter, i18n("Prefetchable"),(pref?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(topLocalAfter, i18n("Base"),value.sprintf("0x%08X",info->cbMemory[i].cbMemoryBase));
|
||||
localAfter=create(topLocalAfter, i18n("Limit"),value.sprintf("0x%08X",info->cbMemory[i].cbMemoryLimit));
|
||||
}//for
|
||||
after=createTitle(parent, i18n("I/O windows"));
|
||||
for (int i=0; i<2; i++) {
|
||||
topLocalAfter=createTitle(after, i18n("Window %1").arg(i));
|
||||
localAfter=create(topLocalAfter, i18n("Type"),(info->cbIo[i].cbIoBaseType?i18n("32 bit"):i18n("16 bit")));
|
||||
if (info->cbIo[i].cbIoBaseType==1) {
|
||||
localAfter=create(topLocalAfter, i18n("Base"),value.sprintf("0x%08X",info->cbIo[i].cbIoBase&0xFFFFFFFC));
|
||||
localAfter=create(topLocalAfter, i18n("Limit"),value.sprintf("0x%08X",info->cbIo[i].cbIoLimit|0x03));
|
||||
}//if
|
||||
else {
|
||||
localAfter=create(topLocalAfter, i18n("Base"),value.sprintf("0x%04X",info->cbIo[i].cbIoBase&0xFFFC));
|
||||
localAfter=create(topLocalAfter, i18n("Limit"),value.sprintf("0x%04X",(info->cbIo[i].cbIoLimit&0xFFFF)|0x03));
|
||||
}//else
|
||||
}//for
|
||||
after=create(parent, i18n("16-bit legacy interface ports"),value.sprintf("0x%04X",info->cbLegacyModeBase));
|
||||
}//if
|
||||
return after;
|
||||
}//addCardbusResource
|
||||
|
||||
static QTreeWidgetItem* addCardbusControl(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
if (info->headerType==PCI_HEADER_TYPE_CARDBUS) {
|
||||
after=create(parent, i18n("CardBus control"),value.sprintf("0x%04X",info->cbControl));
|
||||
localAfter=create(after, i18n("Secondary parity checking"),(info->cbControlParity?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Secondary system error"),(info->cbControlSerr?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("ISA ports forwarding"),(info->cbControlIsa?i18n(strDisabled):i18n(strEnabled))); //reverse order is intentional
|
||||
localAfter=create(after, i18n("VGA forwarding"),(info->cbControlVga?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Master abort"),(info->cbControlMasterAbort?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Interrupts for 16 bit cards"),(info->cbControl16Int?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Window 0 prefetchable memory"),(info->cbControlPref0?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Window 1 prefetchable memory"),(info->cbControlPref1?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Post writes"),(info->cbControlPostWrites?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
return after;
|
||||
}//addCardbusControl
|
||||
|
||||
static QTreeWidgetItem* addRaw(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value, temp;
|
||||
after=createTitle(parent, i18n("Raw PCI config space"));
|
||||
for (int i=0; i<(getuid()==0 ? 16 : 4); i++) {
|
||||
for (int j=0; j<16; j++) {
|
||||
if (j!=0) {
|
||||
value+=temp.sprintf(" %02X", info->raw[i*16+j]);
|
||||
}//if
|
||||
else {
|
||||
value.sprintf("%02X", info->raw[i*16+j]);
|
||||
}//if
|
||||
}//for
|
||||
localAfter=create(after, temp.sprintf("0x%02X:",i*16),value);
|
||||
}//for
|
||||
return after;
|
||||
}//addRaw
|
||||
|
||||
static QTreeWidgetItem* addCapsPm(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, int offset) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QTreeWidgetItem *subLocalAfter=NULL;
|
||||
QString value;
|
||||
pmInfo infoPm;
|
||||
if ((offset+2+sizeof(pmInfo))<256) {
|
||||
memcpy(reinterpret_cast<void*>(&infoPm.raw[0]), reinterpret_cast<void*>(&info->raw[offset+2]), sizeof(pmInfo));
|
||||
after=create(parent, i18n("Capabilities"),value.sprintf("0x%04X",infoPm.caps));
|
||||
localAfter=create(after, i18n("Version"),QString::number(infoPm.capsVer));
|
||||
localAfter=create(after, i18n("Clock required for PME generation"),(infoPm.capsClock?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Device specific initialization required"),(infoPm.capsDsi?i18n(strYes):i18n(strNo)));
|
||||
localAfter=create(after, i18n("Maximum auxiliary current required in D3 cold"),getNameById(auxCur,infoPm.capsAuxCur));
|
||||
localAfter=create(after, i18n("D1 support"),(infoPm.capsD1Supp?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("D2 support"),(infoPm.capsD2Supp?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=createTitle(after, i18n("Power management events"));
|
||||
subLocalAfter=create(localAfter, i18n("D0"),(infoPm.capsPmeD0?i18n(strEnabled):i18n(strDisabled)));
|
||||
subLocalAfter=create(localAfter, i18n("D1"),(infoPm.capsPmeD1?i18n(strEnabled):i18n(strDisabled)));
|
||||
subLocalAfter=create(localAfter, i18n("D2"),(infoPm.capsPmeD2?i18n(strEnabled):i18n(strDisabled)));
|
||||
subLocalAfter=create(localAfter, i18n("D3 hot"),(infoPm.capsPmeD3hot?i18n(strEnabled):i18n(strDisabled)));
|
||||
subLocalAfter=create(localAfter, i18n("D3 cold"),(infoPm.capsPmeD3cold?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=NULL;
|
||||
after=create(parent, i18n("Status"),value.sprintf("0x%04X",infoPm.status));
|
||||
localAfter=create(after, i18n("Power state"),getNameById(powerState,infoPm.statPower));
|
||||
localAfter=create(after, i18n("Power management"),(infoPm.statPme?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Data select"),QString::number(infoPm.statDataSelect));
|
||||
localAfter=create(after, i18n("Data scale"),QString::number(infoPm.statDataScale));
|
||||
localAfter=create(after, i18n("Power management status"),(infoPm.statPmeStat?i18n(strEnabled):i18n(strDisabled)));
|
||||
if ((info->devClass==0x06)&&(info->devSubClass==0x04)) { //PCI bridge
|
||||
subLocalAfter=NULL;
|
||||
localAfter=create(after, i18n("Bridge status"),value.sprintf("0x%02X",infoPm.statusBridge));
|
||||
subLocalAfter=create(localAfter, i18n("Secondary bus state in D3 hot"),(infoPm.statBridgeBx?i18n("B2"):i18n("B3")));
|
||||
subLocalAfter=create(localAfter, i18n("Secondary bus power & clock control"),(infoPm.statBridgeClock?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
}//if
|
||||
after=create(parent, i18n("Data"),value.sprintf("0x%02X",infoPm.data));
|
||||
return after;
|
||||
}//addCapsPm
|
||||
|
||||
static QTreeWidgetItem* addCapsAgp(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, int offset) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
agpInfo infoAgp;
|
||||
int i, cycleSize;
|
||||
if ((offset+2+sizeof(agpInfo))<256) {
|
||||
memcpy(reinterpret_cast<void*>(&infoAgp.raw[0]), reinterpret_cast<void*>(&info->raw[offset+2]), sizeof(agpInfo));
|
||||
// after=create(parent, i18n("Revision"),value.sprintf("%i.%i",infoAgp.revMaior,infoAgp.revMinor));
|
||||
after=create(parent, i18n("Revision"),QString::QString("%1.%2").arg(infoAgp.revMaior).arg(infoAgp.revMinor));
|
||||
after=create(parent, i18n("Status"),value.sprintf("0x%08X",infoAgp.status));
|
||||
localAfter=create(after, i18n("Rate"),getNameById(agpRate,infoAgp.statusEnhRate));
|
||||
localAfter=create(after, i18n("AGP 3.0 mode"),(infoAgp.statusMode?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Fast Writes"),(infoAgp.statusFastWrite?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Address over 4 GiB"),(infoAgp.statusOver4gb?i18n(strEnabled):i18n(strDisabled)));
|
||||
if (infoAgp.statusMode==1) {
|
||||
localAfter=create(after, i18n("Translation of host processor access"),(infoAgp.statusHtrans?i18n(strDisabled):i18n(strEnabled))); //reverse order is intentional
|
||||
localAfter=create(after, i18n("64 bit GART"),(infoAgp.statusGart64b?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Cache Coherency"),(infoAgp.statusItaCoh?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
localAfter=create(after, i18n("Side band addressing"),(infoAgp.statusSba?i18n(strEnabled):i18n(strDisabled)));
|
||||
if (infoAgp.statusMode==1) {
|
||||
localAfter=create(after, i18n("Calibrating cycle"),getNameById(calCycle,infoAgp.statusCalCycle));
|
||||
for (i=0, cycleSize=1; i<(infoAgp.statusOptReqSize+4); i++) {
|
||||
cycleSize*=2;
|
||||
}//for
|
||||
localAfter=create(after, i18n("Optimum asynchronous request size"),value.sprintf("%i (0x%02X)",cycleSize,infoAgp.statusOptReqSize));
|
||||
localAfter=create(after, i18n("Isochronous transactions"),(infoAgp.statusIsochSupp?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
localAfter=create(after, i18n("Maximum number of AGP command"),value.sprintf("%i (0x%02X)",infoAgp.statusReq+1,infoAgp.statusReq));
|
||||
localAfter=NULL;
|
||||
after=create(parent, i18n("Configuration"),value.sprintf("0x%08X",infoAgp.config));
|
||||
localAfter=create(after, i18n("Rate"),getNameById(agpRate,infoAgp.configEnhRate));
|
||||
localAfter=create(after, i18n("Fast Writes"),(infoAgp.configFastWrite?i18n(strEnabled):i18n(strDisabled)));
|
||||
if (infoAgp.statusMode==1) {
|
||||
localAfter=create(after, i18n("Address over 4 GiB"),(infoAgp.configOver4gb?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("64 bit GART"),(infoAgp.configGart64b?i18n(strEnabled):i18n(strDisabled)));
|
||||
}//if
|
||||
localAfter=create(after, i18n("AGP"),(infoAgp.configAgp?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Side band addressing"),(infoAgp.configSba?i18n(strEnabled):i18n(strDisabled)));
|
||||
if (infoAgp.statusMode==1) {
|
||||
localAfter=create(after, i18n("Calibrating cycle"),getNameById(calCycle,infoAgp.configCalCycle));
|
||||
for (i=0, cycleSize=1; i<(infoAgp.configOptReqSize+4); i++) {
|
||||
cycleSize*=2;
|
||||
}//for
|
||||
localAfter=create(after, i18n("Optimum asynchronous request size"),value.sprintf("%i (0x%02X)",cycleSize,infoAgp.configOptReqSize));
|
||||
}//if
|
||||
localAfter=create(after, i18n("Maximum number of AGP command"),value.sprintf("%i (0x%02X)",infoAgp.configReq+1,infoAgp.configReq));
|
||||
}//if
|
||||
return after;
|
||||
}//addCapsAgp
|
||||
|
||||
static QTreeWidgetItem* addCapsVpd(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, int offset) {
|
||||
QString value;
|
||||
vpdInfo infoVpd;
|
||||
if ((offset+2+sizeof(vpdInfo))<256) {
|
||||
memcpy(reinterpret_cast<void*>(&infoVpd.raw[0]), reinterpret_cast<void*>(&info->raw[offset+2]), sizeof(vpdInfo));
|
||||
after=create(parent, i18n("Data address"),value.sprintf("0x%04X",infoVpd.vpdAddress));
|
||||
after=create(parent, i18n("Transfer completed"),(infoVpd.vpdTransfer?i18n(strYes):i18n(strNo)));
|
||||
after=create(parent, i18n("Data"),value.sprintf("0x%08X",infoVpd.vpdData));
|
||||
}//if
|
||||
return after;
|
||||
}//addCapsVpd
|
||||
|
||||
static QTreeWidgetItem* addCapsMsi(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, int offset) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QString value;
|
||||
msiInfo infoMsi;
|
||||
int size=10;
|
||||
if ((offset+4)<256) { //copy control only (for now)
|
||||
memcpy(reinterpret_cast<void*>(&infoMsi.raw[0]), reinterpret_cast<void*>(&info->raw[offset+2]), 2);
|
||||
after=create(parent, i18n("Message control"),value.sprintf("0x%04X",infoMsi.msiControl));
|
||||
localAfter=create(after, i18n("Message signaled interrupts"),(infoMsi.msiEnable?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Multiple message capable"),getNameById(multipleMessage,infoMsi.msiMmCapable));
|
||||
localAfter=create(after, i18n("Multiple message enable"),getNameById(multipleMessage,infoMsi.msiMmEnable));
|
||||
localAfter=create(after, i18n("64 bit address"),(infoMsi.msi64bit?i18n(strEnabled):i18n(strDisabled)));
|
||||
localAfter=create(after, i18n("Per vector masking"),(infoMsi.msiPerVector?i18n(strEnabled):i18n(strDisabled)));
|
||||
size+=(infoMsi.msi64bit ? 4 : 0)+(infoMsi.msiPerVector ? 8 : 0);
|
||||
if ((offset+size)<256) { //copy all MSI data
|
||||
memcpy(reinterpret_cast<void*>(&infoMsi.raw[0]), reinterpret_cast<void*>(&info->raw[offset+size]), 2);
|
||||
if (infoMsi.msi64bit==1) {
|
||||
after=create(parent, i18n("Address"),value.sprintf("0x%08X%08X",infoMsi.msiUpperAddress,infoMsi.msiAddress));
|
||||
after=create(parent, i18n("Data"),value.sprintf("0x%04X",infoMsi.msiData64));
|
||||
if (infoMsi.msiPerVector==1) {
|
||||
after=create(parent, i18n("Mask"),value.sprintf("0x%08X",infoMsi.msiMask64));
|
||||
after=create(parent, i18n("Pending"),value.sprintf("0x%08X",infoMsi.msiPending64));
|
||||
}//if
|
||||
}//if
|
||||
else {
|
||||
after=create(parent, i18n("Address"),value.sprintf("0x%08X",infoMsi.msiAddress));
|
||||
after=create(parent, i18n("Data"),value.sprintf("0x%04X",infoMsi.msiData));
|
||||
if (infoMsi.msiPerVector==1) {
|
||||
after=create(parent, i18n("Mask"),value.sprintf("0x%08X",infoMsi.msiMask));
|
||||
after=create(parent, i18n("Pending"),value.sprintf("0x%08X",infoMsi.msiPending));
|
||||
}//if
|
||||
}//else
|
||||
}//if
|
||||
}//if
|
||||
return after;
|
||||
}//addCapsMsi
|
||||
|
||||
static QTreeWidgetItem* addCapsVendor(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info, int offset) {
|
||||
QString value, temp;
|
||||
after=create(parent, i18n("Length"),value.sprintf("0x%02X",info->raw[offset+2]));
|
||||
if ((offset+3)<256) { //check partial size
|
||||
if (info->raw[offset+2]<=2) {
|
||||
after=create(parent, i18n("Data"),i18n("None"));
|
||||
}//if
|
||||
else {
|
||||
if ((offset+info->raw[offset+2])<256) { //check full size
|
||||
for (int i=3; i<(info->raw[offset+2]); i++) {
|
||||
if (i!=3) {
|
||||
value+=temp.sprintf(" 0x%02X", info->raw[offset+i]);
|
||||
}//if
|
||||
else {
|
||||
value.sprintf("0x%02X", info->raw[offset+i]);
|
||||
}//if
|
||||
}//for
|
||||
after=create(parent, i18n("Data"),value);
|
||||
}//if
|
||||
}//else
|
||||
}//if
|
||||
return after;
|
||||
}//addCapsVendor
|
||||
|
||||
static QTreeWidgetItem* addCaps(QTreeWidgetItem *parent, QTreeWidgetItem *after, pciInfo *info) {
|
||||
QTreeWidgetItem *localAfter=NULL;
|
||||
QTreeWidgetItem *topLocalAfter=NULL;
|
||||
QString value;
|
||||
unsigned char offset;
|
||||
if ((info->headerType==PCI_HEADER_TYPE_NORMAL)||(info->headerType==PCI_HEADER_TYPE_BRIDGE)) {
|
||||
if ((info->capabilityList!=0)&&(info->statCapList!=0)) {
|
||||
after=create(parent, i18n("Capabilities"),value.sprintf("0x%02X",info->capabilityList));
|
||||
if (getuid()==0) {
|
||||
for (offset=info->capabilityList; offset!=0; offset=info->raw[offset+1]) {
|
||||
topLocalAfter=create(after, getNameById(capNames,info->raw[offset]),value.sprintf("0x%02X",info->raw[offset]));
|
||||
localAfter=create(topLocalAfter, i18n("Next"),(info->raw[offset+1]==0?i18n("0x00 (None)"):value.sprintf("0x%02X",info->raw[offset+1])));
|
||||
switch (info->raw[offset]) {
|
||||
case 0x01: //Power Managemet
|
||||
addCapsPm(topLocalAfter, localAfter, info, offset);
|
||||
break;
|
||||
case 0x02: //AGP
|
||||
addCapsAgp(topLocalAfter, localAfter, info, offset);
|
||||
break;
|
||||
case 0x03: //VPD
|
||||
addCapsVpd(topLocalAfter, localAfter, info, offset);
|
||||
break;
|
||||
case 0x05: //MSI
|
||||
addCapsMsi(topLocalAfter, localAfter, info, offset);
|
||||
break;
|
||||
case 0x09: //vendor specific
|
||||
addCapsVendor(topLocalAfter, localAfter, info, offset);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}//switch
|
||||
}//for
|
||||
}//if
|
||||
else {
|
||||
topLocalAfter=createTitle(after, i18n("Root only"));
|
||||
}//else
|
||||
}//if
|
||||
else {
|
||||
after=create(parent, i18n("Capabilities"),i18n("0x00 (None)"));
|
||||
}//else
|
||||
}//if
|
||||
return after;
|
||||
}//addCaps
|
||||
|
||||
bool GetInfo_PCIUtils(QTreeWidget* tree) {
|
||||
|
||||
QStringList headers;
|
||||
headers << i18n("Information") << i18n("Value");
|
||||
tree->setHeaderLabels(headers);
|
||||
tree->setRootIsDecorated(true);
|
||||
|
||||
pci_access *PCIAccess=NULL;
|
||||
pci_dev *PCIDevice=NULL;
|
||||
|
||||
//init libpci
|
||||
PCIAccess=pci_alloc();
|
||||
if (PCIAccess==NULL) {
|
||||
return false;
|
||||
}//if
|
||||
|
||||
pci_init(PCIAccess);
|
||||
pci_scan_bus(PCIAccess);
|
||||
|
||||
QTreeWidgetItem *DeviceName=NULL, *after=NULL;
|
||||
QString value;
|
||||
pciInfo info;
|
||||
|
||||
//proces all devices
|
||||
for (PCIDevice=PCIAccess->devices; PCIDevice; PCIDevice=PCIDevice->next) {
|
||||
//get PCI data
|
||||
pci_fill_info(PCIDevice, PCI_FILL_IDENT|PCI_FILL_IRQ|PCI_FILL_BASES|PCI_FILL_ROM_BASE|PCI_FILL_SIZES);
|
||||
if (getuid()==0) {
|
||||
pci_read_block(PCIDevice, 0, info.raw, 256);
|
||||
}//if
|
||||
else {
|
||||
pci_read_block(PCIDevice, 0, info.raw, 64);
|
||||
}//else
|
||||
|
||||
QStringList deviceList;
|
||||
deviceList << value.sprintf("%02X:%02X.%d", PCIDevice->bus, PCIDevice->dev, PCIDevice->func);
|
||||
//create device tree
|
||||
DeviceName=new QTreeWidgetItem(tree, deviceList);
|
||||
//adding class, subclass and programing intrface info
|
||||
after=addDeviceClass(DeviceName, NULL, &info);
|
||||
|
||||
//adding revision
|
||||
after=create(DeviceName, i18n("Revision"), value.sprintf("0x%02X", info.revision));
|
||||
//adding vendor, device, and subvendor/sudevice info
|
||||
after=addVendor(DeviceName, after, &info, PCIAccess);
|
||||
//adding control
|
||||
after=addControl(DeviceName, after, &info);
|
||||
//adding status
|
||||
after=addStatus(DeviceName, after, &info);
|
||||
|
||||
//adding cache line size
|
||||
after=create(DeviceName, i18n("Cache line size"), value.sprintf("0x%02X", info.cacheLineSize));
|
||||
//adding latency
|
||||
after=addLatency(DeviceName, after, &info);
|
||||
//adding header type
|
||||
after=addHeaderType(DeviceName, after, &info);
|
||||
//adding BIST
|
||||
after=addBist(DeviceName, after, &info);
|
||||
//adding address mapping
|
||||
after=addMapping(DeviceName, after, &info, PCIDevice);
|
||||
//adding bus info
|
||||
after=addBus(DeviceName, after, &info);
|
||||
//adding secondary status
|
||||
after=addSecStatus(DeviceName, after, &info);
|
||||
//adding resourece behind bridge
|
||||
after=addBridgeBehind(DeviceName, after, &info);
|
||||
//adding bridge control
|
||||
after=addBridgeControl(DeviceName, after, &info);
|
||||
//adding cardbus resource
|
||||
after=addCardbusResource(DeviceName, after, &info);
|
||||
//adding cardbus control
|
||||
after=addCardbusControl(DeviceName, after, &info);
|
||||
//adding ROM
|
||||
after=addRom(DeviceName, after, &info, PCIDevice);
|
||||
//adding capabilites
|
||||
after=addCaps(DeviceName, after, &info);
|
||||
|
||||
//adding interrupt info (IRQ, pin)
|
||||
after=addInterrupt(DeviceName, after, PCIDevice->irq, info.interruptPin); //PCI data have wrong IRQ ?!?
|
||||
//add raw PCI config data
|
||||
after=addRaw(DeviceName, after, &info);
|
||||
}//for
|
||||
|
||||
pci_cleanup(PCIAccess);
|
||||
return true;
|
||||
} //GetInfo_PCIUtils
|
||||
|
14
kinfocenter/pci/pci.h
Normal file
14
kinfocenter/pci/pci.h
Normal file
|
@ -0,0 +1,14 @@
|
|||
/* Retrieve information about PCI subsystem trough libpci library from
|
||||
pciutils package. This should be possible on Linux, BSD and AIX.
|
||||
|
||||
Author: Konrad Rzepecki <hannibal@megapolis.pl>
|
||||
*/
|
||||
|
||||
#ifndef _PCI_H_
|
||||
#define _PCI_H_
|
||||
|
||||
#include <QTreeWidget>
|
||||
|
||||
bool GetInfo_PCIUtils(QTreeWidget* tree);
|
||||
|
||||
#endif //_PCI_H_
|
783
kinfocenter/pci/pci_private.h
Normal file
783
kinfocenter/pci/pci_private.h
Normal file
|
@ -0,0 +1,783 @@
|
|||
/* Retrive information about PCI subsystem trough libpci library from
|
||||
pciutils package. This should be possible on Linux, BSD and AIX.
|
||||
|
||||
Device classes, subclasses and programing interfaces are hardcoded
|
||||
here, since there are only few of them, and they are important and
|
||||
should their names be translated.
|
||||
|
||||
pci.cpp private header, don't include in other files.
|
||||
|
||||
Author: Konrad Rzepecki <hannibal@megapolis.pl>
|
||||
*/
|
||||
#ifndef _PCI_PRIVATE_H_
|
||||
#define _PCI_PRIVATE_H_
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
#include <QString>
|
||||
|
||||
#include <klocale.h>
|
||||
|
||||
//pci lookup buffer size
|
||||
#define NAME_BUFFER_SIZE 256
|
||||
|
||||
//common used strings
|
||||
static const char* strEnabled=I18N_NOOP("Enabled");
|
||||
static const char* strDisabled=I18N_NOOP("Disabled");
|
||||
static const char* strYes=I18N_NOOP("Yes");
|
||||
static const char* strNo=I18N_NOOP("No");
|
||||
static const char* strUnknown=I18N_NOOP("Unknown");
|
||||
|
||||
struct id2name {
|
||||
int id;
|
||||
QString name;
|
||||
};
|
||||
|
||||
struct id3name {
|
||||
int id,id2;
|
||||
QString name;
|
||||
};
|
||||
|
||||
struct id4name {
|
||||
int id,id2,id3;
|
||||
QString name;
|
||||
};
|
||||
|
||||
union pciInfo{
|
||||
unsigned char raw[256];
|
||||
struct {
|
||||
unsigned short vendor;
|
||||
unsigned short device;
|
||||
union {
|
||||
unsigned short command;
|
||||
struct {
|
||||
unsigned comIo:1;
|
||||
unsigned comMemory:1;
|
||||
unsigned comMaster:1;
|
||||
unsigned comSpecial:1;
|
||||
unsigned comInvalidate:1;
|
||||
unsigned comVgaPalette:1;
|
||||
unsigned comParity:1;
|
||||
unsigned comWait:1;
|
||||
unsigned comSerr:1;
|
||||
unsigned comFastBack:1;
|
||||
unsigned comInterrupt:1;
|
||||
unsigned comUnk:5;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned short status;
|
||||
struct {
|
||||
unsigned statUnk:3;
|
||||
unsigned statInterrupt:1;
|
||||
unsigned statCapList:1;
|
||||
unsigned stat66MHz:1;
|
||||
unsigned statUdf:1;
|
||||
unsigned statFastBack:1;
|
||||
unsigned statParity:1;
|
||||
unsigned statDevsel:2;
|
||||
unsigned statSigTargetAbort:1;
|
||||
unsigned statRecTargetAbort:1;
|
||||
unsigned statRecMasterAbort:1;
|
||||
unsigned statSigSystemError:1;
|
||||
unsigned statDetectedParity:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char revision;
|
||||
union {
|
||||
unsigned char devProgIface;
|
||||
struct {
|
||||
unsigned progPriOperMode:1;
|
||||
unsigned progPriProgInd:1;
|
||||
unsigned progSecOperMode:1;
|
||||
unsigned progSecProgInd:1;
|
||||
unsigned progUnk:3;
|
||||
unsigned progIdeMaster:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char devSubClass;
|
||||
unsigned char devClass;
|
||||
unsigned char cacheLineSize;
|
||||
unsigned char latencyTimer;
|
||||
union {
|
||||
unsigned char headerTypeFull:1;
|
||||
struct {
|
||||
unsigned headerType:7;
|
||||
unsigned multifunctional:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned char bist;
|
||||
struct {
|
||||
unsigned bistCode:4;
|
||||
unsigned bistUnk:2;
|
||||
unsigned bistStart:1;
|
||||
unsigned bistCapable:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
struct { //header0
|
||||
union {
|
||||
unsigned baseAddress;
|
||||
struct {
|
||||
unsigned baseAddressMap:1;
|
||||
unsigned baseAddressType:2;
|
||||
unsigned baseAddressPref:1;
|
||||
unsigned baseAddressAddr:28;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED mapping[6];
|
||||
unsigned cardbusCis;
|
||||
unsigned short subVendor;
|
||||
unsigned short subDevice;
|
||||
union {
|
||||
unsigned romAddress;
|
||||
struct {
|
||||
unsigned romEnabled:1;
|
||||
unsigned romUnk:10;
|
||||
unsigned romAddr:21;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char capabilityList;
|
||||
unsigned char reserved1[7];
|
||||
unsigned char interruptLine;
|
||||
unsigned char interruptPin;
|
||||
unsigned char minGnt;
|
||||
unsigned char maxLat;
|
||||
} KDE_PACKED;
|
||||
struct{ //header1
|
||||
unsigned baseAddress0_2;
|
||||
unsigned baseAddress1_2;
|
||||
unsigned char primaryBus;
|
||||
unsigned char secondaryBus;
|
||||
unsigned char subordinateBus;
|
||||
unsigned char secLatencyTimer;
|
||||
union {
|
||||
unsigned char ioBase;
|
||||
struct {
|
||||
unsigned ioBaseType:1;
|
||||
unsigned ioBaseUnk:3;
|
||||
unsigned ioBaseAddr:4;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char ioLimit;
|
||||
union {
|
||||
unsigned short secStatus;
|
||||
struct {
|
||||
unsigned secStatUnk:3;
|
||||
unsigned secStatInterrupt:1;
|
||||
unsigned secStatCapList:1;
|
||||
unsigned secStat66MHz:1;
|
||||
unsigned secStatUdf:1;
|
||||
unsigned secStatFastBack:1;
|
||||
unsigned secStatParity:1;
|
||||
unsigned secStatDevsel:2;
|
||||
unsigned secStatSigTargetAbort:1;
|
||||
unsigned secStatRecTargetAbort:1;
|
||||
unsigned secStatRecMasterAbort:1;
|
||||
unsigned secStatSigSystemError:1;
|
||||
unsigned secStatDetectedParity:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned short memoryBase;
|
||||
struct {
|
||||
unsigned memoryType:1;
|
||||
unsigned memoryUnk:3;
|
||||
unsigned memoryAddr:4;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned short memoryLimit;
|
||||
union {
|
||||
unsigned short prefMemoryBase;
|
||||
struct {
|
||||
unsigned prefMemoryType:1;
|
||||
unsigned prefMemoryUnk:3;
|
||||
unsigned prefMemoryAddr:4;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned short prefMemoryLimit;
|
||||
unsigned prefBaseUpper32;
|
||||
unsigned prefLimitUpper32;
|
||||
unsigned short ioBaseUpper16;
|
||||
unsigned short ioLimitUpper16;
|
||||
unsigned char capabilityList_2;
|
||||
unsigned char reserved2[3];
|
||||
unsigned romAddress1;
|
||||
unsigned char interruptLine_2;
|
||||
unsigned char interruptPin_2;
|
||||
union {
|
||||
unsigned short bridgeControl;
|
||||
struct {
|
||||
unsigned bridgeControlParity:1;
|
||||
unsigned bridgeControlSerr:1;
|
||||
unsigned bridgeControlIsa:1;
|
||||
unsigned bridgeControlVga:1;
|
||||
unsigned bridgeControlUnk:1;
|
||||
unsigned bridgeControlMasterAbort:1;
|
||||
unsigned bridgeControlBusReset:1;
|
||||
unsigned bridgeControlFastBack:1;
|
||||
unsigned bridgeControlPriDisTim:1;
|
||||
unsigned bridgeControlSecDisTim:1;
|
||||
unsigned bridgeControlDisTimStat:1;
|
||||
unsigned bridgeControlDisTimeSerr:1;
|
||||
unsigned bridgeControlUnk2:4;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
struct{ //header2
|
||||
unsigned baseAddress0_3;
|
||||
union {
|
||||
unsigned short cbSecStatus;
|
||||
struct {
|
||||
unsigned cbSecStatUnk:3;
|
||||
unsigned cbSecStatInterrupt:1;
|
||||
unsigned cbSecStatCapList:1;
|
||||
unsigned cbSecStat66MHz:1;
|
||||
unsigned cbSecStatUdf:1;
|
||||
unsigned cbSecStatFastBack:1;
|
||||
unsigned cbSecStatParity:1;
|
||||
unsigned cbSecStatDevsel:2;
|
||||
unsigned cbSecStatSigTargetAbort:1;
|
||||
unsigned cbSecStatRecTargetAbort:1;
|
||||
unsigned cbSecStatRecMasterAbort:1;
|
||||
unsigned cbSecStatSigSystemError:1;
|
||||
unsigned cbSecStatDetectedParity:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char cbPrimaryBus;
|
||||
unsigned char cbCardBus;
|
||||
unsigned char cbSubordinateBus;
|
||||
unsigned char cbLatencyTimer;
|
||||
struct {
|
||||
unsigned cbMemoryBase;
|
||||
unsigned cbMemoryLimit;
|
||||
} KDE_PACKED cbMemory[2];
|
||||
struct {
|
||||
union {
|
||||
unsigned cbIoBase;
|
||||
struct {
|
||||
unsigned cbIoBaseType:1;
|
||||
unsigned coIoBaseUnk:1;
|
||||
unsigned cbIoBaseAddr:30;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned cbIoLimit;
|
||||
} KDE_PACKED cbIo[2];
|
||||
unsigned char interruptLine_3;
|
||||
unsigned char interruptPin_3;
|
||||
union {
|
||||
unsigned short cbControl;
|
||||
struct {
|
||||
unsigned cbControlParity:1;
|
||||
unsigned cbControlSerr:1;
|
||||
unsigned cbControlIsa:1;
|
||||
unsigned cbControlVga:1;
|
||||
unsigned cbControlUnk:1;
|
||||
unsigned cbControlMasterAbort:1;
|
||||
unsigned cbControlBusReset:1;
|
||||
unsigned cbControl16Int:1;
|
||||
unsigned cbControlPref0:1;
|
||||
unsigned cbControlPref1:1;
|
||||
unsigned cbControlPostWrites:1;
|
||||
unsigned cbControlUnk2:5;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned short cbSubVendor;
|
||||
unsigned short cbSubDevice;
|
||||
unsigned short cbLegacyModeBase;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
|
||||
union agpInfo{
|
||||
unsigned char raw[10];
|
||||
struct {
|
||||
struct {
|
||||
unsigned revMinor:4;
|
||||
unsigned revMaior:4;
|
||||
unsigned char unk;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned status;
|
||||
struct {
|
||||
unsigned statusEnhRate:4;
|
||||
unsigned statusUnk:28;
|
||||
} KDE_PACKED;
|
||||
struct {
|
||||
unsigned statusRate:3;
|
||||
unsigned statusMode:1;
|
||||
unsigned statusFastWrite:1;
|
||||
unsigned statusOver4gb:1;
|
||||
unsigned statusHtrans:1;
|
||||
unsigned statusGart64b:1;
|
||||
unsigned statusItaCoh:1;
|
||||
unsigned statusSba:1;
|
||||
unsigned statusCalCycle:3;
|
||||
unsigned statusOptReqSize:3;
|
||||
unsigned statusUnk1:1;
|
||||
unsigned statusIsochSupp:1;
|
||||
unsigned statusUnk2:6;
|
||||
unsigned statusReq:8;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned config;
|
||||
struct {
|
||||
unsigned configEnhRate:4;
|
||||
unsigned configUnk:28;
|
||||
} KDE_PACKED;
|
||||
struct {
|
||||
unsigned configRate:3;
|
||||
unsigned configUnk1:1;
|
||||
unsigned configFastWrite:1;
|
||||
unsigned configOver4gb:1;
|
||||
unsigned configUnk2:1;
|
||||
unsigned configGart64b:1;
|
||||
unsigned configAgp:1;
|
||||
unsigned configSba:1;
|
||||
unsigned configCalCycle:3;
|
||||
unsigned configOptReqSize:3;
|
||||
unsigned configUnk3:8;
|
||||
unsigned configReq:8;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
|
||||
union pmInfo {
|
||||
unsigned char raw[6];
|
||||
struct {
|
||||
union {
|
||||
unsigned short caps;
|
||||
struct {
|
||||
unsigned capsVer:3;
|
||||
unsigned capsClock:1;
|
||||
unsigned capsUnk:1;
|
||||
unsigned capsDsi:1;
|
||||
unsigned capsAuxCur:3;
|
||||
unsigned capsD1Supp:1;
|
||||
unsigned capsD2Supp:1;
|
||||
unsigned capsPmeD0:1;
|
||||
unsigned capsPmeD1:1;
|
||||
unsigned capsPmeD2:1;
|
||||
unsigned capsPmeD3hot:1;
|
||||
unsigned capsPmeD3cold:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned short status;
|
||||
struct {
|
||||
unsigned statPower:2;
|
||||
unsigned statUnk:6;
|
||||
unsigned statPme:1;
|
||||
unsigned statDataSelect:4;
|
||||
unsigned statDataScale:2;
|
||||
unsigned statPmeStat:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
union {
|
||||
unsigned char statusBridge;
|
||||
struct {
|
||||
unsigned statBridgeUnk:6;
|
||||
unsigned statBridgeBx:1;
|
||||
unsigned statBridgeClock:1;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned char data;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
|
||||
union vpdInfo {
|
||||
unsigned char raw[6];
|
||||
struct {
|
||||
unsigned vpdAddress:15;
|
||||
unsigned vpdTransfer:1;
|
||||
unsigned vpdData;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
|
||||
union msiInfo {
|
||||
unsigned char raw[22];
|
||||
struct {
|
||||
union {
|
||||
unsigned short msiControl;
|
||||
struct {
|
||||
unsigned msiEnable:1;
|
||||
unsigned msiMmCapable:3;
|
||||
unsigned msiMmEnable:3;
|
||||
unsigned msi64bit:1;
|
||||
unsigned msiPerVector:1;
|
||||
unsigned msiUnk0:7;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
unsigned msiAddress;
|
||||
union {
|
||||
struct {
|
||||
unsigned msiUpperAddress;
|
||||
unsigned short msiData64;
|
||||
unsigned short msiUnk64;
|
||||
unsigned msiMask64;
|
||||
unsigned msiPending64;
|
||||
} KDE_PACKED;
|
||||
struct {
|
||||
unsigned short msiData;
|
||||
unsigned short msiUnk;
|
||||
unsigned msiMask;
|
||||
unsigned msiPending;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
} KDE_PACKED;
|
||||
|
||||
//In following arrays -1 mean default value
|
||||
|
||||
//keep -1 in last position
|
||||
//device classes list
|
||||
static const id2name devClass[]={{ 0x00, i18n("Unclassified device")},
|
||||
{ 0x01, i18n("Mass storage controller")},
|
||||
{ 0x02, i18n("Network controller")},
|
||||
{ 0x03, i18n("Display controller")},
|
||||
{ 0x04, i18n("Multimedia controller")},
|
||||
{ 0x05, i18n("Memory controller")},
|
||||
{ 0x06, i18n("Bridge")},
|
||||
{ 0x07, i18n("Communication controller")},
|
||||
{ 0x08, i18n("Generic system peripheral")},
|
||||
{ 0x09, i18n("Input device controller")},
|
||||
{ 0x0A, i18n("Docking station")},
|
||||
{ 0x0B, i18n("Processor")},
|
||||
{ 0x0C, i18n("Serial bus controller")},
|
||||
{ 0x0D, i18n("Wireless controller")},
|
||||
{ 0x0E, i18n("Intelligent controller")},
|
||||
{ 0x0F, i18n("Satellite communications controller")},
|
||||
{ 0x10, i18n("Encryption controller")},
|
||||
{ 0x11, i18n("Signal processing controller")},
|
||||
{ -1, i18n("Unknown device class")}
|
||||
};
|
||||
|
||||
//keep -1 in last position in "id"
|
||||
//and in last position in "id2" with certain "id"
|
||||
//subdevice classes list
|
||||
static const id3name devSubclass[]={ { 0x00, 0x00, i18n("Non-VGA unclassified device")},
|
||||
{ 0x00, 0x01, i18n("VGA unclassified device")},
|
||||
{ 0x00, -1, i18n("Unknown unclassified device")},
|
||||
|
||||
{ 0x01, 0x00, i18n("SCSI storage controller")},
|
||||
{ 0x01, 0x01, i18n("IDE controller")},
|
||||
{ 0x01, 0x02, i18n("Floppy disk controller")},
|
||||
{ 0x01, 0x03, i18n("IPI bus controller")},
|
||||
{ 0x01, 0x04, i18n("RAID bus controller")},
|
||||
{ 0x01, 0x05, i18n("ATA controller")},
|
||||
{ 0x01, 0x06, i18n("Serial ATA direct port access")},
|
||||
{ 0x01, 0x80, i18n("Mass storage controller")},
|
||||
{ 0x01, -1, i18n("Unknown storage controller")},
|
||||
|
||||
{ 0x02, 0x00, i18n("Ethernet controller")},
|
||||
{ 0x02, 0x01, i18n("Token ring network controller")},
|
||||
{ 0x02, 0x02, i18n("FDDI network controller")},
|
||||
{ 0x02, 0x03, i18n("ATM network controller")},
|
||||
{ 0x02, 0x04, i18n("ISDN controller")},
|
||||
{ 0x02, 0x05, i18n("WorldFip controller")},
|
||||
{ 0x02, 0x06, i18n("PICMG 2.14 multi computing")},
|
||||
{ 0x02, 0x80, i18n("Network controller")},
|
||||
{ 0x02, -1, i18n("Unknown network controller")},
|
||||
|
||||
{ 0x03, 0x00, i18n("VGA compatible controller")},
|
||||
{ 0x03, 0x01, i18n("XGA compatible controller")},
|
||||
{ 0x03, 0x02, i18n("3D controller")},
|
||||
{ 0x03, 0x80, i18n("Display controller")},
|
||||
{ 0x03, -1, i18n("Unknown display controller")},
|
||||
|
||||
{ 0x04, 0x00, i18n("Multimedia video controller")},
|
||||
{ 0x04, 0x01, i18n("Multimedia audio controller")},
|
||||
{ 0x04, 0x02, i18n("Computer telephony device")},
|
||||
{ 0x04, 0x80, i18n("Multimedia controller")},
|
||||
{ 0x04, -1, i18n("Unknown multimedia controller")},
|
||||
|
||||
{ 0x05, 0x00, i18n("RAM memory")},
|
||||
{ 0x05, 0x01, i18n("FLASH memory")},
|
||||
{ 0x05, 0x80, i18n("Memory controller")},
|
||||
{ 0x05, -1, i18n("Unknown memory controller")},
|
||||
|
||||
{ 0x06, 0x00, i18n("Host bridge")},
|
||||
{ 0x06, 0x01, i18n("ISA bridge")},
|
||||
{ 0x06, 0x02, i18n("EISA bridge")},
|
||||
{ 0x06, 0x03, i18n("MicroChannel bridge")},
|
||||
{ 0x06, 0x04, i18n("PCI bridge")},
|
||||
{ 0x06, 0x05, i18n("PCMCIA bridge")},
|
||||
{ 0x06, 0x06, i18n("NuBus bridge")},
|
||||
{ 0x06, 0x07, i18n("CardBus bridge")},
|
||||
{ 0x06, 0x08, i18n("RACEway bridge")},
|
||||
{ 0x06, 0x09, i18n("Semi-transparent PCI-to-PCI bridge")},
|
||||
{ 0x06, 0x0A, i18n("InfiniBand to PCI host bridge")},
|
||||
{ 0x06, 0x80, i18n("Bridge")},
|
||||
{ 0x06, -1, i18n("Unknown bridge")},
|
||||
|
||||
{ 0x07, 0x00, i18n("Serial controller")},
|
||||
{ 0x07, 0x01, i18n("Parallel controller")},
|
||||
{ 0x07, 0x02, i18n("Multiport serial controller")},
|
||||
{ 0x07, 0x03, i18n("Modem")},
|
||||
{ 0x07, 0x04, i18n("GPIB (IEEE 488.1/2) controller")},
|
||||
{ 0x07, 0x05, i18n("Smart card")},
|
||||
{ 0x07, 0x80, i18n("Communication controller")},
|
||||
{ 0x07, -1, i18n("Unknown communication controller")},
|
||||
|
||||
{ 0x08, 0x00, i18n("PIC")},
|
||||
{ 0x08, 0x01, i18n("DMA controller")},
|
||||
{ 0x08, 0x02, i18n("Timer")},
|
||||
{ 0x08, 0x03, i18n("RTC")},
|
||||
{ 0x08, 0x04, i18n("PCI Hot-plug controller")},
|
||||
{ 0x08, 0x80, i18n("System peripheral")},
|
||||
{ 0x08, -1, i18n("Unknown system peripheral")},
|
||||
|
||||
{ 0x09, 0x00, i18n("Keyboard controller")},
|
||||
{ 0x09, 0x01, i18n("Digitizer Pen")},
|
||||
{ 0x09, 0x02, i18n("Mouse controller")},
|
||||
{ 0x09, 0x03, i18n("Scanner controller")},
|
||||
{ 0x09, 0x04, i18n("Gameport controller")},
|
||||
{ 0x09, 0x80, i18n("Input device controller")},
|
||||
{ 0x09, -1, i18n("Unknown input device controller")},
|
||||
|
||||
{ 0x0A, 0x00, i18n("Generic docking station")},
|
||||
{ 0x0A, 0x80, i18n("Docking station")},
|
||||
{ 0x0A, -1, i18n("Unknown docking station")},
|
||||
|
||||
{ 0x0B, 0x00, i18n("386")},
|
||||
{ 0x0B, 0x01, i18n("486")},
|
||||
{ 0x0B, 0x02, i18n("Pentium")},
|
||||
{ 0x0B, 0x10, i18n("Alpha")},
|
||||
{ 0x0B, 0x20, i18n("Power PC")},
|
||||
{ 0x0B, 0x30, i18n("MIPS")},
|
||||
{ 0x0B, 0x40, i18n("Co-processor")},
|
||||
{ 0x0B, -1, i18n("Unknown processor")},
|
||||
|
||||
{ 0x0C, 0x00, i18n("FireWire (IEEE 1394)")},
|
||||
{ 0x0C, 0x01, i18n("ACCESS bus")},
|
||||
{ 0x0C, 0x02, i18n("SSA")},
|
||||
{ 0x0C, 0x03, i18n("USB controller")},
|
||||
{ 0x0C, 0x04, i18n("Fibre channel")},
|
||||
{ 0x0C, 0x05, i18n("SMBus")},
|
||||
{ 0x0C, 0x06, i18n("InfiniBand")},
|
||||
{ 0x0C, 0x07, i18n("IPMI interface")},
|
||||
{ 0x0C, 0x08, i18n("SERCOS interface")},
|
||||
{ 0x0C, 0x09, i18n("CANbus")},
|
||||
{ 0x0C, -1, i18n("Unknown serial bus controller")},
|
||||
|
||||
{ 0x0D, 0x00, i18n("IRDA controller")},
|
||||
{ 0x0D, 0x01, i18n("Consumer IR controller")},
|
||||
{ 0x0D, 0x10, i18n("RF controller")},
|
||||
{ 0x0D, 0x11, i18n("Bluetooth")},
|
||||
{ 0x0D, 0x12, i18n("Broadband")},
|
||||
{ 0x0D, 0x20, i18n("Ethernet (802.11a - 5 GHz)")},
|
||||
{ 0x0D, 0x21, i18n("Ethernet (802.11b - 2.4 GHz)")},
|
||||
{ 0x0D, 0x80, i18n("Wireless controller")},
|
||||
{ 0x0D, -1, i18n("Unknown wireless controller")},
|
||||
|
||||
{ 0x0E, 0x00, i18n("I2O")},
|
||||
{ 0x0E, -1, i18n("Unknown intelligent controller")},
|
||||
|
||||
{ 0x0F, 0x01, i18n("Satellite TV controller")},
|
||||
{ 0x0F, 0x02, i18n("Satellite audio communication controller")},
|
||||
{ 0x0F, 0x03, i18n("Satellite voice communication controller")},
|
||||
{ 0x0F, 0x04, i18n("Satellite data communication controller")},
|
||||
{ 0x0F, -1, i18n("Unknown satellite communications controller")},
|
||||
|
||||
{ 0x10, 0x00, i18n("Network and computing encryption device")},
|
||||
{ 0x10, 0x10, i18n("Entertainment encryption device")},
|
||||
{ 0x10, 0x80, i18n("Encryption controller")},
|
||||
{ 0x10, -1, i18n("Unknown encryption controller")},
|
||||
|
||||
{ 0x11, 0x00, i18n("DPIO module")},
|
||||
{ 0x11, 0x01, i18n("Performance counters")},
|
||||
{ 0x11, 0x10, i18n("Communication synchronizer")},
|
||||
{ 0x11, 0x20, i18n("Management card")},
|
||||
{ 0x11, 0x80, i18n("Signal processing controller")},
|
||||
{ 0x11, -1, i18n("Unknown signal processing controller")},
|
||||
|
||||
{ -1, -1, i18n("Unknown subdevice class")}
|
||||
};
|
||||
|
||||
//keep -1 in last position in "id",
|
||||
//in last position in "id2" with certain "id",
|
||||
//and in last position in "id3" with certain "id2"
|
||||
//device programming interface list
|
||||
static const id4name devInterface[]={ { 0x01, 0x05, 0x20, i18n("single DMA")},
|
||||
{ 0x01, 0x05, 0x30, i18n("chained DMA")},
|
||||
|
||||
{ 0x03, 0x00, 0x00, i18n("VGA compatible")},
|
||||
{ 0x03, 0x00, 0x01, i18n("8514 compatible")},
|
||||
|
||||
{ 0x06, 0x04, 0x00, i18n("Normal decode")},
|
||||
{ 0x06, 0x04, 0x01, i18n("Subtractive decode")},
|
||||
|
||||
{ 0x06, 0x08, 0x00, i18n("Transparent mode")},
|
||||
{ 0x06, 0x08, 0x01, i18n("Endpoint mode")},
|
||||
|
||||
{ 0x06, 0x09, 0x40, i18n("Primary bus towards host CPU")},
|
||||
{ 0x06, 0x09, 0x40, i18n("Secondary bus towards host CPU")},
|
||||
|
||||
{ 0x07, 0x00, 0x00, i18n("8250")},
|
||||
{ 0x07, 0x00, 0x01, i18n("16450")},
|
||||
{ 0x07, 0x00, 0x02, i18n("16550")},
|
||||
{ 0x07, 0x00, 0x03, i18n("16650")},
|
||||
{ 0x07, 0x00, 0x04, i18n("16750")},
|
||||
{ 0x07, 0x00, 0x05, i18n("16850")},
|
||||
{ 0x07, 0x00, 0x06, i18n("16950")},
|
||||
|
||||
{ 0x07, 0x01, 0x00, i18n("SPP")},
|
||||
{ 0x07, 0x01, 0x01, i18n("BiDir")},
|
||||
{ 0x07, 0x01, 0x02, i18n("ECP")},
|
||||
{ 0x07, 0x01, 0x03, i18n("IEEE1284")},
|
||||
{ 0x07, 0x01, 0xFE, i18n("IEEE1284 Target")},
|
||||
|
||||
{ 0x07, 0x03, 0x00, i18n("Generic")},
|
||||
{ 0x07, 0x03, 0x01, i18n("Hayes/16450")},
|
||||
{ 0x07, 0x03, 0x02, i18n("Hayes/16550")},
|
||||
{ 0x07, 0x03, 0x03, i18n("Hayes/16650")},
|
||||
{ 0x07, 0x03, 0x04, i18n("Hayes/16750")},
|
||||
|
||||
{ 0x08, 0x00, 0x00, i18n("8259")},
|
||||
{ 0x08, 0x00, 0x01, i18n("ISA PIC")},
|
||||
{ 0x08, 0x00, 0x02, i18n("EISA PIC")},
|
||||
{ 0x08, 0x00, 0x03, i18n("IO-APIC")},
|
||||
{ 0x08, 0x00, 0x04, i18n("IO(X)-APIC")},
|
||||
|
||||
{ 0x08, 0x01, 0x00, i18n("8237")},
|
||||
{ 0x08, 0x01, 0x01, i18n("ISA DMA")},
|
||||
{ 0x08, 0x01, 0x01, i18n("EISA DMA")},
|
||||
|
||||
{ 0x08, 0x02, 0x00, i18n("8254")},
|
||||
{ 0x08, 0x02, 0x01, i18n("ISA timer")},
|
||||
{ 0x08, 0x02, 0x01, i18n("EISA timers")},
|
||||
|
||||
{ 0x08, 0x03, 0x00, i18n("Generic")},
|
||||
{ 0x08, 0x03, 0x01, i18n("ISA RTC")},
|
||||
|
||||
{ 0x09, 0x04, 0x00, i18n("Generic")},
|
||||
{ 0x09, 0x04, 0x01, i18n("Extended")},
|
||||
|
||||
{ 0x0C, 0x00, 0x00, i18n("Generic")},
|
||||
{ 0x0C, 0x00, 0x01, i18n("OHCI")},
|
||||
|
||||
{ 0x0C, 0x03, 0x00, i18n("UHCI")},
|
||||
{ 0x0C, 0x03, 0x10, i18n("OHCI")},
|
||||
{ 0x0C, 0x03, 0x20, i18n("EHCI")},
|
||||
{ 0x0C, 0x03, 0x80, i18n("Unspecified")},
|
||||
{ 0x0C, 0x03, 0xFE, i18n("USB Device")},
|
||||
|
||||
{ 0x0C, 0x07, 0x00, i18n("SMIC")},
|
||||
{ 0x0C, 0x07, 0x01, i18n("Keyboard controller style")},
|
||||
{ 0x0C, 0x07, 0x02, i18n("Block transfer")},
|
||||
|
||||
{ -1, -1, -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
|
||||
//keep -1 in last position
|
||||
//capabilities list
|
||||
static const id2name capNames[]={{ 0x01, i18n("Power management")},
|
||||
{ 0x02, i18n("AGP")},
|
||||
{ 0x03, i18n("Vital product data")},
|
||||
{ 0x04, i18n("Slot identification")},
|
||||
{ 0x05, i18n("Message signaled interrupts")},
|
||||
{ 0x06, i18n("CompactPCI hot swap")},
|
||||
{ 0x07, i18n("PCI-X")},
|
||||
{ 0x08, i18n("HyperTransport")},
|
||||
{ 0x09, i18n("Vendor specific")},
|
||||
{ 0x0A, i18n("Debug port")},
|
||||
{ 0x0B, i18n("CompactPCI central resource control")},
|
||||
{ 0x0C, i18n("PCI hot-plug")},
|
||||
{ 0x0E, i18n("AGP x8")},
|
||||
{ 0x0F, i18n("Secure device")},
|
||||
{ 0x10, i18n("PCI express")},
|
||||
{ 0x11, i18n("MSI-X")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//device selection timing
|
||||
static const id2name devSel[]={ { 0x00, i18n("Fast")},
|
||||
{ 0x01, i18n("Medium")},
|
||||
{ 0x02, i18n("Slow")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//mapping type
|
||||
static const id2name mappingType[]={{ 0x00, i18n("32 bit")},
|
||||
{ 0x01, i18n("Below 1M")},
|
||||
{ 0x02, i18n("64 bit")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//header type
|
||||
static const id2name headerType[]={ { 0x00, i18n("Standard")},
|
||||
{ 0x01, i18n("Bridge")},
|
||||
{ 0x02, i18n("CardBus")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//AGP rate
|
||||
static const id2name agpRate[]={{ 0x01, i18n("1X")},
|
||||
{ 0x02, i18n("2X")},
|
||||
{ 0x03, i18n("1X & 2X")},
|
||||
{ 0x04, i18n("4X")},
|
||||
{ 0x05, i18n("1X & 4X")},
|
||||
{ 0x06, i18n("2X & 4X")},
|
||||
{ 0x07, i18n("1X & 2X & 4X")},
|
||||
{ 0x09, i18n("4X")},
|
||||
{ 0x0A, i18n("8X")},
|
||||
{ 0x0B, i18n("4X & 8X")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//AGP calibrating cycle
|
||||
static const id2name calCycle[]={ { 0x00, i18n("4 ms")},
|
||||
{ 0x01, i18n("16 ms")},
|
||||
{ 0x02, i18n("64 ms")},
|
||||
{ 0x03, i18n("256 ms")},
|
||||
{ 0x07, i18n("Not needed")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//PM auxiliary current
|
||||
static const id2name auxCur[]={ { 0x00, i18n("0 (self powered)")},
|
||||
{ 0x01, i18n("55 mA")},
|
||||
{ 0x02, i18n("100 mA")},
|
||||
{ 0x03, i18n("160 mA")},
|
||||
{ 0x04, i18n("220 mA")},
|
||||
{ 0x05, i18n("270 mA")},
|
||||
{ 0x06, i18n("320 mA")},
|
||||
{ 0x07, i18n("375 mA")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//PM power state
|
||||
static const id2name powerState[]={ { 0x00, i18n("D0")},
|
||||
{ 0x01, i18n("D1")},
|
||||
{ 0x02, i18n("D2")},
|
||||
{ 0x03, i18n("D3 hot")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
//keep -1 in last position
|
||||
//MSI multiple message
|
||||
static const id2name multipleMessage[]={{ 0x00, i18n("1 vector")},
|
||||
{ 0x01, i18n("2 vectors")},
|
||||
{ 0x02, i18n("4 vectors")},
|
||||
{ 0x03, i18n("8 vectors")},
|
||||
{ 0x04, i18n("16 vectors")},
|
||||
{ 0x05, i18n("32 vectors")},
|
||||
{ -1, i18n(strUnknown)}
|
||||
};
|
||||
|
||||
static const QString& getNameById(const id2name *const table,int id);
|
||||
static const QString& getNameBy2Id(const id3name *const table,int id,int id2);
|
||||
static const QString& getNameBy3Id(const id4name *const table,int id,int id2, int id3);
|
||||
|
||||
#endif //_PCI_PRIVATE_H_
|
|
@ -18,19 +18,16 @@
|
|||
|
||||
#include "proxywidget.h"
|
||||
#include "global.h"
|
||||
#include "kinfocenter_interface.h"
|
||||
|
||||
#include <kpushbutton.h>
|
||||
#include <QByteArray>
|
||||
#include <QFrame>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
#include <QResizeEvent>
|
||||
#include <Q3ScrollView>
|
||||
#include <QScrollArea>
|
||||
#include <QLabel>
|
||||
#include <QtDBus/QtDBus>
|
||||
#include <Q3WhatsThis>
|
||||
|
||||
#include <kpushbutton.h>
|
||||
#include <klocale.h>
|
||||
#include <kapplication.h>
|
||||
#include <kcmodule.h>
|
||||
|
@ -40,282 +37,38 @@
|
|||
#include <kdebug.h>
|
||||
|
||||
#include <unistd.h> // for getuid()
|
||||
|
||||
#include "proxywidget.moc"
|
||||
|
||||
class WhatsThis : public Q3WhatsThis
|
||||
{
|
||||
public:
|
||||
WhatsThis( ProxyWidget* parent )
|
||||
: Q3WhatsThis( parent ), proxy( parent ) {}
|
||||
~WhatsThis(){}
|
||||
|
||||
ProxyWidget::ProxyWidget(KCModule *client) :
|
||||
QWidget(), _changed(false), _client(client) {
|
||||
|
||||
QString text( const QPoint & ) {
|
||||
if ( !proxy->quickHelp().isEmpty() )
|
||||
return proxy->quickHelp();
|
||||
kDebug() << "Creating Proxy Widget..." << endl;
|
||||
|
||||
if (_client->quickHelp().isEmpty() == false )
|
||||
setWhatsThis(_client->quickHelp());
|
||||
else
|
||||
return i18n("The currently loaded configuration module.");
|
||||
}
|
||||
|
||||
private:
|
||||
ProxyWidget* proxy;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
class RootInfoWidget : public QLabel
|
||||
{
|
||||
public:
|
||||
RootInfoWidget(QWidget *parent, const char *name);
|
||||
void setRootMessage(const QString& s) { setText(s); }
|
||||
};
|
||||
|
||||
RootInfoWidget::RootInfoWidget(QWidget *parent, const char *name = 0)
|
||||
: QLabel(parent)
|
||||
{
|
||||
setObjectName( name );
|
||||
setFrameShape(QFrame::Box);
|
||||
setFrameShadow(QFrame::Raised);
|
||||
|
||||
setText(i18n("<b>Changes in this module require root access.</b><br />"
|
||||
"Click the \"Administrator Mode\" button to "
|
||||
"allow modifications in this module."));
|
||||
|
||||
this->setWhatsThis( i18n("This module requires special permissions, probably "
|
||||
"for system-wide modifications; therefore, it is "
|
||||
"required that you provide the root password to be "
|
||||
"able to change the module's properties. If you "
|
||||
"do not provide the password, the module will be "
|
||||
"disabled."));
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
class ProxyView : public Q3ScrollView
|
||||
{
|
||||
public:
|
||||
ProxyView(KCModule *client, const QString& title, QWidget *parent, bool run_as_root, const char *name);
|
||||
|
||||
private:
|
||||
virtual void resizeEvent(QResizeEvent *);
|
||||
|
||||
QWidget *contentWidget;
|
||||
KCModule *client;
|
||||
bool scroll;
|
||||
};
|
||||
|
||||
class ProxyContentWidget : public QWidget
|
||||
{
|
||||
public:
|
||||
ProxyContentWidget( QWidget* parent ) : QWidget( parent ) {}
|
||||
~ProxyContentWidget(){}
|
||||
|
||||
// this should be really done by qscrollview in AutoOneFit mode!
|
||||
QSize sizeHint() const { return minimumSizeHint(); }
|
||||
};
|
||||
|
||||
|
||||
ProxyView::ProxyView(KCModule *_client, const QString&, QWidget *parent, bool run_as_root, const char *name)
|
||||
: Q3ScrollView(parent, name), client(_client)
|
||||
{
|
||||
setResizePolicy(Q3ScrollView::AutoOneFit);
|
||||
setFrameStyle( NoFrame );
|
||||
contentWidget = new ProxyContentWidget( viewport() );
|
||||
|
||||
QVBoxLayout* vbox = new QVBoxLayout( contentWidget );
|
||||
vbox->setMargin(0);
|
||||
|
||||
if (run_as_root && _client->useRootOnlyMessage()) // notify the user
|
||||
{
|
||||
RootInfoWidget *infoBox = new RootInfoWidget(contentWidget);
|
||||
vbox->addWidget( infoBox );
|
||||
QString msg = _client->rootOnlyMessage();
|
||||
if (!msg.isEmpty())
|
||||
infoBox->setRootMessage(msg);
|
||||
vbox->setSpacing(KDialog::spacingHint());
|
||||
}
|
||||
client->setParent(contentWidget);
|
||||
client->move(0,0);
|
||||
client->show();
|
||||
vbox->addWidget( client );
|
||||
vbox->activate(); // make sure we have a proper minimumSizeHint
|
||||
addChild(contentWidget);
|
||||
}
|
||||
|
||||
void ProxyView::resizeEvent(QResizeEvent *e)
|
||||
{
|
||||
Q3ScrollView::resizeEvent(e);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
ProxyWidget::ProxyWidget(KCModule *client, const QString &title,
|
||||
bool run_as_root)
|
||||
: QWidget(0)
|
||||
, _client(client)
|
||||
{
|
||||
setWindowTitle(title);
|
||||
#ifdef __GNUC__
|
||||
#warning "kde4: DBUS port"
|
||||
#endif
|
||||
#if 0
|
||||
if (getuid()==0 ) {
|
||||
// Make root modules look as similar as possible...
|
||||
DCOPCString replyType;
|
||||
QByteArray replyData;
|
||||
|
||||
if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getPalette()", QByteArray(),
|
||||
replyType, replyData))
|
||||
if ( replyType == "QPalette") {
|
||||
QDataStream reply( replyData );
|
||||
QPalette pal;
|
||||
reply >> pal;
|
||||
setPalette(pal);
|
||||
}
|
||||
/* // Doesn't work ...
|
||||
if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getStyle()", QByteArray(),
|
||||
replyType, replyData))
|
||||
if ( replyType == "QString") {
|
||||
QDataStream reply( replyData, QIODevice::ReadOnly );
|
||||
QString style;
|
||||
reply >> style;
|
||||
setStyle(style);
|
||||
}
|
||||
*/
|
||||
if (kapp->dcopClient()->call("kcontrol", "moduleIface", "getFont()", QByteArray(),
|
||||
replyType, replyData))
|
||||
if ( replyType == "QFont") {
|
||||
QDataStream reply( replyData );
|
||||
QFont font;
|
||||
reply >> font;
|
||||
setFont(font);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
view = new ProxyView(client, title, this, run_as_root, "proxyview");
|
||||
(void) new WhatsThis( this );
|
||||
|
||||
connect(_client, SIGNAL(changed(bool)), SLOT(clientChanged(bool)));
|
||||
connect(_client, SIGNAL(quickHelpChanged()), SIGNAL(quickHelpChanged()));
|
||||
|
||||
_sep = new KSeparator(Qt::Horizontal, this);
|
||||
|
||||
_help = new KPushButton( KStandardGuiItem::help(), this );
|
||||
_default = new KPushButton( KStandardGuiItem::defaults(), this );
|
||||
_apply = new KPushButton( KStandardGuiItem::apply(), this );
|
||||
_reset = new KPushButton( KStandardGuiItem::reset(), this );
|
||||
_root = new KPushButton( KGuiItem(i18n( "&Administrator Mode" )), this );
|
||||
|
||||
bool mayModify = (!run_as_root || !_client->useRootOnlyMessage()) && !KCGlobal::isInfoCenter();
|
||||
|
||||
// only enable the requested buttons
|
||||
int b = _client->buttons();
|
||||
_help->setVisible(false & (b & KCModule::Help));
|
||||
_default->setVisible(mayModify && (b & KCModule::Default));
|
||||
_apply->setVisible(mayModify && (b & KCModule::Apply));
|
||||
_reset->setVisible(mayModify && (b & KCModule::Apply));
|
||||
_root->setVisible(run_as_root);
|
||||
|
||||
// disable initial buttons
|
||||
_apply->setEnabled( false );
|
||||
_reset->setEnabled( false );
|
||||
|
||||
connect(_help, SIGNAL(clicked()), SLOT(helpClicked()));
|
||||
connect(_default, SIGNAL(clicked()), SLOT(defaultClicked()));
|
||||
connect(_apply, SIGNAL(clicked()), SLOT(applyClicked()));
|
||||
connect(_reset, SIGNAL(clicked()), SLOT(resetClicked()));
|
||||
connect(_root, SIGNAL(clicked()), SLOT(rootClicked()));
|
||||
setWhatsThis(i18n("The currently loaded configuration module."));
|
||||
|
||||
QVBoxLayout *top = new QVBoxLayout(this);
|
||||
top->setMargin(KDialog::marginHint());
|
||||
top->setSpacing(KDialog::spacingHint());
|
||||
top->addWidget(view);
|
||||
top->addWidget(_sep);
|
||||
top->setMargin(0);
|
||||
top->setSpacing(0);
|
||||
top->addWidget(_client);
|
||||
|
||||
QHBoxLayout *buttons = new QHBoxLayout();
|
||||
top->addItem(buttons);
|
||||
buttons->setSpacing(4);
|
||||
buttons->addWidget(_help);
|
||||
buttons->addWidget(_default);
|
||||
if (run_as_root)
|
||||
{
|
||||
buttons->addWidget(_root);
|
||||
kDebug() << "Proxy Widget created" << endl;
|
||||
}
|
||||
|
||||
buttons->addStretch(1);
|
||||
if (mayModify)
|
||||
{
|
||||
buttons->addWidget(_apply);
|
||||
buttons->addWidget(_reset);
|
||||
}
|
||||
|
||||
top->activate();
|
||||
}
|
||||
|
||||
ProxyWidget::~ProxyWidget()
|
||||
{
|
||||
ProxyWidget::~ProxyWidget() {
|
||||
delete _client;
|
||||
}
|
||||
|
||||
QString ProxyWidget::quickHelp() const
|
||||
{
|
||||
QString ProxyWidget::quickHelp() const {
|
||||
if (_client)
|
||||
return _client->quickHelp();
|
||||
else
|
||||
return "";
|
||||
}
|
||||
|
||||
void ProxyWidget::helpClicked()
|
||||
{
|
||||
if (getuid()!=0)
|
||||
emit helpRequest();
|
||||
else
|
||||
{
|
||||
OrgKdeKinfocenterInterface kinfocenter("org.kde.kinfocenter", "/moduleIface", QDBusConnection::sessionBus());
|
||||
kinfocenter.invokeHelp();
|
||||
}
|
||||
}
|
||||
|
||||
void ProxyWidget::defaultClicked()
|
||||
{
|
||||
clientChanged(true);
|
||||
_client->defaults();
|
||||
}
|
||||
|
||||
void ProxyWidget::applyClicked()
|
||||
{
|
||||
_client->save();
|
||||
clientChanged(false);
|
||||
}
|
||||
|
||||
void ProxyWidget::resetClicked()
|
||||
{
|
||||
_client->load();
|
||||
clientChanged(false);
|
||||
}
|
||||
|
||||
void ProxyWidget::rootClicked()
|
||||
{
|
||||
emit runAsRoot();
|
||||
}
|
||||
|
||||
void ProxyWidget::clientChanged(bool state)
|
||||
{
|
||||
_apply->setEnabled(state);
|
||||
_reset->setEnabled(state);
|
||||
|
||||
// forward the signal
|
||||
emit changed(state);
|
||||
}
|
||||
|
||||
const KAboutData *ProxyWidget::aboutData() const
|
||||
{
|
||||
const KAboutData *ProxyWidget::aboutData() const {
|
||||
return _client->aboutData();
|
||||
}
|
||||
|
||||
// vim: sw=2 sts=2 et
|
||||
|
|
|
@ -30,49 +30,33 @@ class KAboutData;
|
|||
|
||||
#include <QPointer>
|
||||
|
||||
class ProxyView;
|
||||
|
||||
class ProxyWidget : public QWidget
|
||||
{
|
||||
class ProxyWidget : public QWidget {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
ProxyWidget(KCModule *client, const QString &title, bool run_as_root = false);
|
||||
ProxyWidget(KCModule *client);
|
||||
~ProxyWidget();
|
||||
|
||||
QString quickHelp() const;
|
||||
const KAboutData *aboutData() const;
|
||||
|
||||
public Q_SLOTS:
|
||||
bool isChanged() {
|
||||
return _changed;
|
||||
}
|
||||
void setChanged(bool changed) {
|
||||
_changed = changed;
|
||||
}
|
||||
|
||||
void helpClicked();
|
||||
void defaultClicked();
|
||||
void applyClicked();
|
||||
void resetClicked();
|
||||
void rootClicked();
|
||||
|
||||
void clientChanged(bool state);
|
||||
|
||||
|
||||
Q_SIGNALS:
|
||||
|
||||
void closed();
|
||||
void helpRequest();
|
||||
void changed(bool state);
|
||||
void runAsRoot();
|
||||
void quickHelpChanged();
|
||||
|
||||
private:
|
||||
|
||||
QPushButton *_help, *_default, *_apply, *_reset, *_root;
|
||||
KSeparator *_sep;
|
||||
bool _changed;
|
||||
|
||||
// Just in case the module was deleted from outside (i.e. by unloading the module)
|
||||
QPointer<KCModule> _client;
|
||||
|
||||
ProxyView *view;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,43 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "quickhelp.h"
|
||||
#include "quickhelp.moc"
|
||||
|
||||
#include <QFrame>
|
||||
|
||||
QuickHelp::QuickHelp(QWidget *parent)
|
||||
: KTextBrowser( parent )
|
||||
{
|
||||
setFrameStyle( QFrame::Panel | QFrame::Sunken );
|
||||
setFocusPolicy( Qt::ClickFocus );
|
||||
setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOff );
|
||||
setNotifyClick(true);
|
||||
}
|
||||
|
||||
void QuickHelp::setText(const QString &text)
|
||||
{
|
||||
QString s(text);
|
||||
//lukas: no need to change the font -- it breaks for
|
||||
//those not having it in the right encoding!
|
||||
//s.replace(QRegExp("<[Hh]1>"),"<font face=utopia><h1>");
|
||||
//s.replace(QRegExp("</[Hh]1>"),"</h1></font>");
|
||||
KTextBrowser::setHtml(s);
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __quickhelp_h__
|
||||
#define __quickhelp_h__
|
||||
|
||||
#include <ktextbrowser.h>
|
||||
|
||||
class QuickHelp : public KTextBrowser
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
QuickHelp(QWidget *parent);
|
||||
|
||||
virtual void setText(const QString &text);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,222 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
Copyright (c) 2004 Daniel Molkentin <molkentin@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include "searchwidget.h"
|
||||
|
||||
#include <Q3PtrList>
|
||||
#include <QLabel>
|
||||
#include <QListWidgetItem>
|
||||
#include <QRegExp>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include <klineedit.h>
|
||||
#include <kiconloader.h>
|
||||
#include <klocale.h>
|
||||
#include <klistwidget.h>
|
||||
|
||||
#include "searchwidget.moc"
|
||||
|
||||
/**
|
||||
* Helper class for sorting icon modules by name without losing the fileName ID
|
||||
*/
|
||||
class ModuleItem : public QListWidgetItem
|
||||
{
|
||||
public:
|
||||
ModuleItem(ConfigModule *module, QListWidget * listbox = 0) :
|
||||
QListWidgetItem(listbox)
|
||||
, m_module(module)
|
||||
{
|
||||
setText( module->moduleName() );
|
||||
setIcon( KIconLoader::global()->loadIcon(module->icon(), KIconLoader::Desktop, KIconLoader::SizeSmall) );
|
||||
}
|
||||
|
||||
ConfigModule *module() const { return m_module; }
|
||||
|
||||
protected:
|
||||
ConfigModule *m_module;
|
||||
|
||||
};
|
||||
|
||||
KeywordListEntry::KeywordListEntry(const QString& name, ConfigModule* module)
|
||||
: _name(name)
|
||||
{
|
||||
if(module)
|
||||
_modules.append(module);
|
||||
}
|
||||
|
||||
void KeywordListEntry::addModule(ConfigModule* module)
|
||||
{
|
||||
if(module)
|
||||
_modules.append(module);
|
||||
}
|
||||
|
||||
SearchWidget::SearchWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
_keywords.setAutoDelete(true);
|
||||
|
||||
QVBoxLayout * l = new QVBoxLayout(this);
|
||||
l->setMargin(0);
|
||||
l->setSpacing(2);
|
||||
|
||||
// input
|
||||
_input = new KLineEdit(this);
|
||||
_input->setFocus();
|
||||
QLabel *inputl = new QLabel(i18n("Se&arch:"), this);
|
||||
inputl->setBuddy(_input);
|
||||
|
||||
l->addWidget(inputl);
|
||||
l->addWidget(_input);
|
||||
|
||||
// keyword list
|
||||
_keyList = new KListWidget(this);
|
||||
QLabel *keyl = new QLabel(i18n("&Keywords:"), this);
|
||||
keyl->setBuddy(_keyList);
|
||||
|
||||
l->addWidget(keyl);
|
||||
l->addWidget(_keyList);
|
||||
|
||||
// result list
|
||||
_resultList = new KListWidget(this);
|
||||
QLabel *resultl = new QLabel(i18n("&Results:"), this);
|
||||
resultl->setBuddy(_resultList);
|
||||
|
||||
l->addWidget(resultl);
|
||||
l->addWidget(_resultList);
|
||||
|
||||
// set stretch factors
|
||||
l->setStretchFactor(_resultList, 1);
|
||||
l->setStretchFactor(_keyList, 2);
|
||||
|
||||
|
||||
connect(_input, SIGNAL(textChanged(const QString&)),
|
||||
this, SLOT(slotSearchTextChanged(const QString&)));
|
||||
|
||||
connect(_keyList, SIGNAL(currentTextChanged(const QString&)),
|
||||
this, SLOT(slotKeywordSelected(const QString&)));
|
||||
|
||||
connect(_resultList, SIGNAL(itemChanged (QListWidgetItem*)),
|
||||
this, SLOT(slotModuleSelected(QListWidgetItem *)));
|
||||
connect(_resultList, SIGNAL(executed(QListWidgetItem *)),
|
||||
this, SLOT(slotModuleClicked(QListWidgetItem *)));
|
||||
}
|
||||
|
||||
void SearchWidget::populateKeywordList(ConfigModuleList *list)
|
||||
{
|
||||
ConfigModule *module;
|
||||
|
||||
// loop through all control modules
|
||||
for (module=list->first(); module != 0; module=list->next())
|
||||
{
|
||||
if (module->library().isEmpty())
|
||||
continue;
|
||||
|
||||
// get the modules keyword list
|
||||
QStringList kw = module->keywords();
|
||||
|
||||
// loop through the keyword list to populate _keywords
|
||||
for(QStringList::ConstIterator it = kw.begin(); it != kw.end(); ++it)
|
||||
{
|
||||
QString name = (*it).toLower();
|
||||
bool found = false;
|
||||
|
||||
// look if _keywords already has an entry for this keyword
|
||||
for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
|
||||
{
|
||||
// if there is an entry for this keyword, add the module to the entries module list
|
||||
if (k->moduleName() == name)
|
||||
{
|
||||
k->addModule(module);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if there is entry for this keyword, create a new one
|
||||
if (!found)
|
||||
{
|
||||
KeywordListEntry *k = new KeywordListEntry(name, module);
|
||||
_keywords.append(k);
|
||||
}
|
||||
}
|
||||
}
|
||||
populateKeyListBox("*");
|
||||
}
|
||||
|
||||
void SearchWidget::populateKeyListBox(const QString& s)
|
||||
{
|
||||
_keyList->clear();
|
||||
|
||||
QStringList matches;
|
||||
|
||||
for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
|
||||
{
|
||||
if ( QRegExp(s, Qt::CaseInsensitive, QRegExp::Wildcard).indexIn(k->moduleName()) >= 0)
|
||||
matches.append(k->moduleName().trimmed());
|
||||
}
|
||||
|
||||
for(QStringList::ConstIterator it = matches.begin(); it != matches.end(); ++it)
|
||||
_keyList->addItem(*it);
|
||||
|
||||
_keyList->model()->sort(0);
|
||||
}
|
||||
|
||||
void SearchWidget::populateResultListBox(const QString& s)
|
||||
{
|
||||
_resultList->clear();
|
||||
|
||||
Q3PtrList<ModuleItem> results;
|
||||
|
||||
for(KeywordListEntry *k = _keywords.first(); k != 0; k = _keywords.next())
|
||||
{
|
||||
if (k->moduleName() == s)
|
||||
{
|
||||
Q3PtrList<ConfigModule> modules = k->modules();
|
||||
|
||||
for(ConfigModule *m = modules.first(); m != 0; m = modules.next())
|
||||
new ModuleItem(m, _resultList);
|
||||
}
|
||||
}
|
||||
|
||||
_resultList->model()->sort(0);
|
||||
}
|
||||
|
||||
void SearchWidget::slotSearchTextChanged(const QString & s)
|
||||
{
|
||||
QString regexp = s;
|
||||
regexp += '*';
|
||||
populateKeyListBox(regexp);
|
||||
}
|
||||
|
||||
void SearchWidget::slotKeywordSelected(const QString & s)
|
||||
{
|
||||
populateResultListBox(s);
|
||||
}
|
||||
|
||||
void SearchWidget::slotModuleSelected(QListWidgetItem *item)
|
||||
{
|
||||
if (item)
|
||||
emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
|
||||
}
|
||||
|
||||
void SearchWidget::slotModuleClicked(QListWidgetItem *item)
|
||||
{
|
||||
if (item)
|
||||
emit moduleSelected( static_cast<ModuleItem*>(item)->module() );
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
/*
|
||||
Copyright (c) 2000 Matthias Elter <elter@kde.org>
|
||||
Copyright (c) 2004 Daniel Molkentin <molkentin@kde.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program 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 General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
along with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __searchwidget_h__
|
||||
#define __searchwidget_h__
|
||||
|
||||
#include <QWidget>
|
||||
#include <Qt3Support/Q3PtrList>
|
||||
|
||||
#include "modules.h"
|
||||
|
||||
class KListWidget;
|
||||
class KLineEdit;
|
||||
class QListWidgetItem;
|
||||
|
||||
class KeywordListEntry
|
||||
{
|
||||
public:
|
||||
KeywordListEntry(const QString& name, ConfigModule* module);
|
||||
|
||||
void addModule(ConfigModule* module);
|
||||
|
||||
QString moduleName() { return _name; }
|
||||
Q3PtrList<ConfigModule> modules() { return _modules; }
|
||||
|
||||
private:
|
||||
QString _name;
|
||||
Q3PtrList<ConfigModule> _modules;
|
||||
|
||||
};
|
||||
|
||||
class SearchWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SearchWidget(QWidget *parent);
|
||||
|
||||
void populateKeywordList(ConfigModuleList *list);
|
||||
|
||||
Q_SIGNALS:
|
||||
void moduleSelected(ConfigModule *);
|
||||
|
||||
protected:
|
||||
void populateKeyListBox(const QString& regexp);
|
||||
void populateResultListBox(const QString& keyword);
|
||||
|
||||
protected Q_SLOTS:
|
||||
void slotSearchTextChanged(const QString &);
|
||||
void slotKeywordSelected(const QString &);
|
||||
void slotModuleSelected(QListWidgetItem *item);
|
||||
void slotModuleClicked(QListWidgetItem *item);
|
||||
|
||||
private:
|
||||
KListWidget *_keyList, *_resultList;
|
||||
KLineEdit *_input;
|
||||
Q3PtrList<KeywordListEntry> _keywords;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -25,4 +25,6 @@ Name[x-test]=xxProcessor Informationxx
|
|||
Name[zh_CN]=处理器信息
|
||||
Name[zh_TW]=處理器資訊
|
||||
|
||||
Comment=Processor Information
|
||||
|
||||
Categories=Qt;KDE;X-KDE-information;
|
||||
|
|
|
@ -20,11 +20,10 @@
|
|||
|
||||
#include "toplevel.h"
|
||||
#include "indexwidget.h"
|
||||
#include "searchwidget.h"
|
||||
#include "helpwidget.h"
|
||||
#include "aboutwidget.h"
|
||||
#include "proxywidget.h"
|
||||
#include "moduletreeview.h"
|
||||
#include "modules.h"
|
||||
|
||||
#include <kaboutapplicationdialog.h>
|
||||
#include <kactioncollection.h>
|
||||
|
@ -42,6 +41,8 @@
|
|||
#include <kwindowsystem.h>
|
||||
#include <kxmlguifactory.h>
|
||||
|
||||
#include <kdebug.h>
|
||||
|
||||
#include <QTabWidget>
|
||||
#include <QSplitter>
|
||||
|
||||
|
@ -49,88 +50,45 @@
|
|||
|
||||
#include "toplevel.moc"
|
||||
|
||||
TopLevel::TopLevel()
|
||||
: KXmlGuiWindow( 0, Qt::WindowContextHelpButtonHint )
|
||||
, _active(0), dummyAbout(0)
|
||||
{
|
||||
TopLevel::TopLevel() :
|
||||
KXmlGuiWindow( 0, Qt::WindowContextHelpButtonHint), _active(NULL), dummyAbout(NULL) {
|
||||
setCaption(QString());
|
||||
|
||||
report_bug = 0;
|
||||
|
||||
// read settings
|
||||
KConfigGroup config(KGlobal::config(), "Index");
|
||||
QString viewmode = config.readEntry("ViewMode", "Tree");
|
||||
|
||||
if (viewmode == "Tree")
|
||||
KCGlobal::setViewMode(Tree);
|
||||
else
|
||||
KCGlobal::setViewMode(Icon);
|
||||
|
||||
QString size = config.readEntry("IconSize", "Medium");
|
||||
if (size == "Small")
|
||||
KCGlobal::setIconSize(KIconLoader::SizeSmall);
|
||||
else if (size == "Large")
|
||||
KCGlobal::setIconSize(KIconLoader::SizeLarge);
|
||||
else if (size == "Huge")
|
||||
KCGlobal::setIconSize(KIconLoader::SizeHuge);
|
||||
else
|
||||
KCGlobal::setIconSize(KIconLoader::SizeMedium);
|
||||
report_bug = NULL;
|
||||
|
||||
// initialize the entries
|
||||
_modules = new ConfigModuleList();
|
||||
_modules->readDesktopEntries();
|
||||
|
||||
for ( ConfigModule* m = _modules->first(); m; m = _modules->next() )
|
||||
connect( m, SIGNAL( helpRequest() ), this, SLOT( slotHelpRequest() ) );
|
||||
|
||||
// create the layout box
|
||||
_splitter = new QSplitter( Qt::Horizontal, this );
|
||||
|
||||
// create the left hand side (the tab view)
|
||||
_tab = new QTabWidget( _splitter );
|
||||
|
||||
_tab->setWhatsThis( i18n("Choose between Index, Search and Quick Help") );
|
||||
_splitter->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
// index tab
|
||||
_indextab = new IndexWidget(_modules, 0L);
|
||||
connect(_indextab, SIGNAL(moduleActivated(ConfigModule*)),
|
||||
this, SLOT(activateModule(ConfigModule*)));
|
||||
_tab->addTab(_indextab, KIcon("kinfocenter"), i18n("&Index"));
|
||||
_indextab = new IndexWidget(_modules, this);
|
||||
connect(_indextab, SIGNAL(moduleActivated(ConfigModule*)), this, SLOT(activateModule(ConfigModule*)));
|
||||
connect(_indextab, SIGNAL(generalActivated()), this, SLOT(activateGeneral()));
|
||||
_splitter->addWidget(_indextab);
|
||||
|
||||
connect(_indextab, SIGNAL(categorySelected(Q3ListViewItem*)),
|
||||
this, SLOT(categorySelected(Q3ListViewItem*)));
|
||||
|
||||
// search tab
|
||||
_searchtab = new SearchWidget(0L);
|
||||
_searchtab->populateKeywordList(_modules);
|
||||
connect(_searchtab, SIGNAL(moduleSelected(ConfigModule *)),
|
||||
this, SLOT(activateModule(ConfigModule *)));
|
||||
|
||||
_tab->addTab(_searchtab, KIcon("edit-find"), i18n("Sear&ch"));
|
||||
|
||||
// help tab
|
||||
_helptab = new HelpWidget(0L);
|
||||
_tab->addTab(_helptab, KIcon("help-contents"), i18n("Hel&p"));
|
||||
|
||||
_tab->setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ) );
|
||||
_indextab->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred) );
|
||||
|
||||
// Restore sizes
|
||||
config = KConfigGroup(KGlobal::config(),"General");
|
||||
KConfigGroup config = KConfigGroup(KGlobal::config(), "General");
|
||||
QList<int> sizes = config.readEntry("SplitterSizes", QList<int>() );
|
||||
if (!sizes.isEmpty())
|
||||
_splitter->setSizes(sizes);
|
||||
|
||||
AboutWidget* aboutWidget = new AboutWidget( this, _modules);
|
||||
connect(aboutWidget, SIGNAL( moduleSelected( ConfigModule * ) ), _indextab, SLOT(selectModule(ConfigModule*)));
|
||||
|
||||
// set up the right hand side (the docking area)
|
||||
_dock = new DockContainer( _splitter );
|
||||
_dock = new DockContainer(aboutWidget, _splitter);
|
||||
|
||||
// That one does the trick ...
|
||||
_splitter->setStretchFactor( _splitter->indexOf( _tab ), 0 );
|
||||
_splitter->setStretchFactor(_splitter->indexOf(_indextab), 0);
|
||||
_splitter->setStretchFactor(_splitter->indexOf(_dock), 1);
|
||||
|
||||
connect(_dock, SIGNAL(newModule(const QString&, const QString&, const QString&)),
|
||||
this, SLOT(newModule(const QString&, const QString&, const QString&)));
|
||||
connect(_dock, SIGNAL(changedModule(ConfigModule*)),
|
||||
SLOT(changedModule(ConfigModule*)));
|
||||
connect(_indextab, SIGNAL(generalActivated()), _dock, SLOT(showAboutWidget()));
|
||||
|
||||
// set the main view
|
||||
setCentralWidget(_splitter);
|
||||
|
@ -138,61 +96,14 @@ TopLevel::TopLevel()
|
|||
// initialize the GUI actions
|
||||
setupActions();
|
||||
|
||||
// activate defaults
|
||||
if (KCGlobal::viewMode() == Tree) {
|
||||
activateTreeView();
|
||||
tree_view->setChecked(true);
|
||||
}
|
||||
else {
|
||||
activateIconView();
|
||||
icon_view->setChecked(true);
|
||||
KWindowSystem::setIcons(winId(), KIconLoader::global()->loadIcon(KINFOCENTER_ICON_NAME, KIconLoader::NoGroup, 32), KIconLoader::global()->loadIcon("hwinfo", KIconLoader::NoGroup, 16) );
|
||||
|
||||
_indextab->selectGeneral();
|
||||
}
|
||||
|
||||
// insert the about widget
|
||||
if (KCGlobal::isInfoCenter())
|
||||
{
|
||||
AboutWidget *aw = new AboutWidget( this, _indextab->firstTreeViewItem());
|
||||
connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
|
||||
SLOT( activateModule( ConfigModule * ) ) );
|
||||
_dock->setBaseWidget( aw );
|
||||
KWindowSystem::setIcons( winId(),
|
||||
KIconLoader::global()->loadIcon("hwinfo", KIconLoader::NoGroup, 32 ),
|
||||
KIconLoader::global()->loadIcon("hwinfo", KIconLoader::NoGroup, 16 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
AboutWidget *aw = new AboutWidget(this);
|
||||
connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
|
||||
SLOT( activateModule( ConfigModule * ) ) );
|
||||
_dock->setBaseWidget(aw);
|
||||
}
|
||||
}
|
||||
TopLevel::~TopLevel() {
|
||||
|
||||
TopLevel::~TopLevel()
|
||||
{
|
||||
KConfigGroup config(KGlobal::config(), "Index");
|
||||
if (KCGlobal::viewMode() == Tree)
|
||||
config.writeEntry("ViewMode", "Tree");
|
||||
else
|
||||
config.writeEntry("ViewMode", "Icon");
|
||||
|
||||
switch (KCGlobal::iconSize())
|
||||
{
|
||||
case KIconLoader::SizeSmall:
|
||||
config.writeEntry("IconSize", "Small");
|
||||
break;
|
||||
case KIconLoader::SizeLarge:
|
||||
config.writeEntry("IconSize", "Large");
|
||||
break;
|
||||
case KIconLoader::SizeHuge:
|
||||
config.writeEntry("IconSize", "Huge");
|
||||
break;
|
||||
default:
|
||||
config.writeEntry("IconSize", "Medium");
|
||||
break;
|
||||
}
|
||||
|
||||
config = KConfigGroup(KGlobal::config(),"General");
|
||||
KConfigGroup config = KConfigGroup(KGlobal::config(), "General");
|
||||
config.writeEntry("SplitterSizes", _splitter->sizes());
|
||||
|
||||
config.sync();
|
||||
|
@ -200,55 +111,14 @@ TopLevel::~TopLevel()
|
|||
delete _modules;
|
||||
}
|
||||
|
||||
bool TopLevel::queryClose()
|
||||
{
|
||||
return _dock->dockModule(0);
|
||||
}
|
||||
|
||||
void TopLevel::setupActions()
|
||||
{
|
||||
void TopLevel::setupActions() {
|
||||
KStandardAction::quit(this, SLOT(close()), actionCollection());
|
||||
KStandardAction::keyBindings(guiFactory(), SLOT(configureShortcuts()),
|
||||
actionCollection());
|
||||
|
||||
QActionGroup* viewModeGroup = new QActionGroup(this);
|
||||
|
||||
icon_view = new KToggleAction(i18n("&Icon View"), this);
|
||||
actionCollection()->addAction("activate_iconview", icon_view);
|
||||
connect(icon_view, SIGNAL(triggered(bool) ), SLOT(activateIconView()));
|
||||
icon_view->setActionGroup(viewModeGroup);
|
||||
|
||||
tree_view = new KToggleAction(i18n("&Tree View"), this);
|
||||
actionCollection()->addAction("activate_treeview", tree_view);
|
||||
connect(tree_view, SIGNAL(triggered(bool) ), SLOT(activateTreeView()));
|
||||
tree_view->setActionGroup(viewModeGroup);
|
||||
|
||||
QActionGroup* iconSizeGroup = new QActionGroup(this);
|
||||
|
||||
icon_small = new KToggleAction(i18nc("@option activate small size icons", "&Small"), this);
|
||||
actionCollection()->addAction("activate_smallicons", icon_small);
|
||||
connect(icon_small, SIGNAL(triggered(bool) ), SLOT(activateSmallIcons()));
|
||||
icon_small->setActionGroup(iconSizeGroup);
|
||||
|
||||
icon_medium = new KToggleAction(i18nc("@option activate medium size icons", "&Medium"), this);
|
||||
actionCollection()->addAction("activate_mediumicons", icon_medium);
|
||||
connect(icon_medium, SIGNAL(triggered(bool) ), SLOT(activateMediumIcons()));
|
||||
icon_medium->setActionGroup(iconSizeGroup);
|
||||
|
||||
icon_large = new KToggleAction(i18nc("@option activate large size icons", "&Large"), this);
|
||||
actionCollection()->addAction("activate_largeicons", icon_large);
|
||||
connect(icon_large, SIGNAL(triggered(bool) ), SLOT(activateLargeIcons()));
|
||||
icon_large->setActionGroup(iconSizeGroup);
|
||||
|
||||
icon_huge = new KToggleAction(i18nc("@option activate huge size icons", "&Huge"), this);
|
||||
actionCollection()->addAction("activate_hugeicons", icon_huge);
|
||||
connect(icon_huge, SIGNAL(triggered(bool) ), SLOT(activateHugeIcons()));
|
||||
icon_huge->setActionGroup(iconSizeGroup);
|
||||
KStandardAction::keyBindings(guiFactory(), SLOT(configureShortcuts()), actionCollection());
|
||||
|
||||
about_module = actionCollection()->addAction("help_about_module");
|
||||
about_module->setText(i18n("About Current Module"));
|
||||
about_module->setVisible(false);
|
||||
connect(about_module, SIGNAL(triggered(bool) ), SLOT(aboutModule()));
|
||||
about_module->setEnabled(false);
|
||||
|
||||
createGUI("kinfocenterui.rc");
|
||||
|
||||
|
@ -258,202 +128,58 @@ void TopLevel::setupActions()
|
|||
connect(report_bug, SIGNAL(activated()), SLOT(reportBug()));
|
||||
}
|
||||
|
||||
void TopLevel::activateIconView()
|
||||
{
|
||||
KCGlobal::setViewMode(Icon);
|
||||
_indextab->activateView(Icon);
|
||||
void TopLevel::activateModule(ConfigModule *configModule) {
|
||||
kDebug() << "Activating module..." << endl;
|
||||
|
||||
icon_small->setEnabled(true);
|
||||
icon_medium->setEnabled(true);
|
||||
icon_large->setEnabled(true);
|
||||
icon_huge->setEnabled(true);
|
||||
|
||||
switch(KCGlobal::iconSize())
|
||||
{
|
||||
case KIconLoader::SizeSmall:
|
||||
icon_small->setChecked(true);
|
||||
break;
|
||||
case KIconLoader::SizeLarge:
|
||||
icon_large->setChecked(true);
|
||||
break;
|
||||
case KIconLoader::SizeHuge:
|
||||
icon_huge->setChecked(true);
|
||||
break;
|
||||
default:
|
||||
icon_medium->setChecked(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void TopLevel::activateTreeView()
|
||||
{
|
||||
KCGlobal::setViewMode(Tree);
|
||||
_indextab->activateView(Tree);
|
||||
|
||||
icon_small->setEnabled(false);
|
||||
icon_medium->setEnabled(false);
|
||||
icon_large->setEnabled(false);
|
||||
icon_huge->setEnabled(false);
|
||||
}
|
||||
|
||||
void TopLevel::activateSmallIcons()
|
||||
{
|
||||
KCGlobal::setIconSize(KIconLoader::SizeSmall);
|
||||
_indextab->reload();
|
||||
}
|
||||
|
||||
void TopLevel::activateMediumIcons()
|
||||
{
|
||||
KCGlobal::setIconSize(KIconLoader::SizeMedium);
|
||||
_indextab->reload();
|
||||
}
|
||||
|
||||
void TopLevel::activateLargeIcons()
|
||||
{
|
||||
KCGlobal::setIconSize(KIconLoader::SizeLarge);
|
||||
_indextab->reload();
|
||||
}
|
||||
|
||||
void TopLevel::activateHugeIcons()
|
||||
{
|
||||
KCGlobal::setIconSize(KIconLoader::SizeHuge);
|
||||
_indextab->reload();
|
||||
}
|
||||
|
||||
void TopLevel::newModule(const QString &name, const QString& docPath, const QString &quickhelp)
|
||||
{
|
||||
setCaption(name, false);
|
||||
|
||||
_helptab->setText( docPath, quickhelp );
|
||||
|
||||
if (!report_bug) return;
|
||||
|
||||
if(name.isEmpty())
|
||||
report_bug->setText(i18n("&Report Bug..."));
|
||||
else
|
||||
report_bug->setText(i18n("Report Bug on Module %1...", handleAmpersand( name)));
|
||||
}
|
||||
|
||||
void TopLevel::changedModule(ConfigModule *changed)
|
||||
{
|
||||
if (!changed)
|
||||
return;
|
||||
setCaption(changed->moduleName(), changed->isChanged() );
|
||||
}
|
||||
|
||||
void TopLevel::categorySelected(Q3ListViewItem *category)
|
||||
{
|
||||
if (_active)
|
||||
{
|
||||
if (_active->isChanged())
|
||||
{
|
||||
int res = KMessageBox::warningYesNoCancel(this, _active ?
|
||||
i18n("There are unsaved changes in the active module.\n"
|
||||
"Do you want to apply the changes before running "
|
||||
"the new module or discard the changes?") :
|
||||
i18n("There are unsaved changes in the active module.\n"
|
||||
"Do you want to apply the changes before exiting "
|
||||
"the Control Center or discard the changes?"),
|
||||
i18n("Unsaved Changes"),
|
||||
KStandardGuiItem::apply(),
|
||||
KStandardGuiItem::discard());
|
||||
if (res == KMessageBox::Yes)
|
||||
_active->module()->applyClicked();
|
||||
else if (res == KMessageBox::Cancel)
|
||||
return;
|
||||
}
|
||||
}
|
||||
_dock->removeModule();
|
||||
about_module->setText( i18n( "About Current Module" ) );
|
||||
about_module->setIcon( KIcon() );
|
||||
about_module->setEnabled( false );
|
||||
|
||||
// insert the about widget
|
||||
Q3ListViewItem *firstItem = category->firstChild();
|
||||
QString caption = static_cast<ModuleTreeItem*>(category)->caption();
|
||||
if( qstrcmp(_dock->baseWidget()->metaObject()->className(), "AboutWidget" ) == 0)
|
||||
{
|
||||
static_cast<AboutWidget *>( _dock->baseWidget() )->setCategory( firstItem, caption);
|
||||
}
|
||||
else
|
||||
{
|
||||
AboutWidget *aw = new AboutWidget( this, firstItem, caption );
|
||||
connect( aw, SIGNAL( moduleSelected( ConfigModule * ) ),
|
||||
SLOT( activateModule( ConfigModule * ) ) );
|
||||
_dock->setBaseWidget( aw );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void TopLevel::activateModule(ConfigModule *mod)
|
||||
{
|
||||
if ( _dock->module() == mod )
|
||||
return;
|
||||
|
||||
// tell the index to display the module
|
||||
_indextab->makeVisible(mod);
|
||||
|
||||
// tell the index to mark this module as loaded
|
||||
_indextab->makeSelected(mod);
|
||||
_active=configModule;
|
||||
|
||||
// dock it
|
||||
if (!_dock->dockModule(mod))
|
||||
{
|
||||
if ( _dock->module() )
|
||||
{
|
||||
_indextab->makeVisible(_active);
|
||||
_indextab->makeSelected(_active);
|
||||
}
|
||||
if (!_dock->dockModule(configModule)) {
|
||||
kDebug() << "Activating module by docking it." << endl;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_active=mod;
|
||||
kDebug() << "Modifying About Module." << endl;
|
||||
|
||||
if (mod->aboutData())
|
||||
{
|
||||
about_module->setText(i18nc("Help menu->about <modulename>", "About %1",
|
||||
handleAmpersand( mod->moduleName())));
|
||||
about_module->setIcon(KIcon(mod->icon()));
|
||||
about_module->setEnabled(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (configModule->aboutData()) {
|
||||
about_module->setText(i18nc("Help menu->about <modulename>", "About %1", handleAmpersand(configModule->moduleName())));
|
||||
about_module->setIcon(configModule->realIcon(KIconLoader::SizeSmall));
|
||||
about_module->setVisible(true);
|
||||
} else {
|
||||
about_module->setText(i18n("About Current Module"));
|
||||
about_module->setIcon(KIcon());
|
||||
about_module->setEnabled(false);
|
||||
}
|
||||
about_module->setVisible(false);
|
||||
}
|
||||
|
||||
void TopLevel::deleteDummyAbout()
|
||||
{
|
||||
setCaption(configModule->moduleName(), false);
|
||||
|
||||
if (configModule->moduleName().isEmpty())
|
||||
report_bug->setText(i18n("&Report Bug..."));
|
||||
else
|
||||
report_bug->setText(i18n("Report Bug on Module %1...", handleAmpersand(configModule->moduleName())));
|
||||
|
||||
|
||||
kDebug() << "Activating module done." << endl;
|
||||
}
|
||||
|
||||
void TopLevel::deleteDummyAbout() {
|
||||
delete dummyAbout;
|
||||
dummyAbout = 0;
|
||||
}
|
||||
|
||||
|
||||
void TopLevel::slotHelpRequest()
|
||||
{
|
||||
_tab->setCurrentIndex( _tab->indexOf( _helptab ) );
|
||||
}
|
||||
|
||||
void TopLevel::reportBug()
|
||||
{
|
||||
// this assumes the user only opens one bug report at a time
|
||||
static char buffer[128];
|
||||
|
||||
dummyAbout = 0;
|
||||
void TopLevel::reportBug() {
|
||||
dummyAbout = NULL;
|
||||
bool deleteit = false;
|
||||
|
||||
if (!_active) // report against kinfocenter
|
||||
dummyAbout = const_cast<KAboutData*>(KGlobal::mainComponent().aboutData());
|
||||
else
|
||||
{
|
||||
else {
|
||||
if (_active->aboutData())
|
||||
dummyAbout = const_cast<KAboutData*>(_active->aboutData());
|
||||
else
|
||||
{
|
||||
snprintf(buffer, sizeof(buffer), "kcm%s", _active->library().toLatin1().constData());
|
||||
dummyAbout = new KAboutData(buffer, 0, ki18n(_active->moduleName().toUtf8()), "2.0");
|
||||
else {
|
||||
QString kcmLibrary = "kcm" + _active->library();
|
||||
dummyAbout = new KAboutData(kcmLibrary.toLatin1(), 0, ki18n(_active->moduleName().toUtf8()), "2.0");
|
||||
deleteit = true;
|
||||
}
|
||||
}
|
||||
|
@ -461,26 +187,39 @@ void TopLevel::reportBug()
|
|||
if (deleteit)
|
||||
connect(br, SIGNAL(finished()), SLOT(deleteDummyAbout()));
|
||||
else
|
||||
dummyAbout = 0;
|
||||
dummyAbout = NULL;
|
||||
|
||||
br->show();
|
||||
}
|
||||
|
||||
void TopLevel::aboutModule()
|
||||
{
|
||||
void TopLevel::aboutModule() {
|
||||
kDebug() << "About " << _active->moduleName() << endl;
|
||||
|
||||
KAboutApplicationDialog dlg(_active->aboutData());
|
||||
dlg.exec();
|
||||
}
|
||||
|
||||
QString TopLevel::handleAmpersand( const QString &modName ) const
|
||||
{
|
||||
QString TopLevel::handleAmpersand(const QString& modName) const {
|
||||
QString modulename = modName;
|
||||
if( modulename.contains( '&' )) // double it
|
||||
{
|
||||
for( int i = modulename.length();
|
||||
i >= 0;
|
||||
--i )
|
||||
// double it
|
||||
if (modulename.contains( '&')) {
|
||||
for (int i = modulename.length(); i >= 0; --i)
|
||||
if (modulename[ i ] == '&')
|
||||
modulename.insert(i, "&");
|
||||
}
|
||||
|
||||
return modulename;
|
||||
}
|
||||
|
||||
void TopLevel::activateGeneral() {
|
||||
kDebug() << "Activating General..." << endl;
|
||||
|
||||
about_module->setText(i18n("About Current Module"));
|
||||
about_module->setIcon(KIcon());
|
||||
about_module->setVisible(false);
|
||||
|
||||
setCaption(i18n("General Information"), false);
|
||||
|
||||
report_bug->setText(i18n("&Report Bug..."));
|
||||
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue