summaryrefslogtreecommitdiffstats
path: root/kcontrol/info
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit4aed2c8219774f5d797760606b8489a92ddc5163 (patch)
tree3f8c130f7d269626bf6a9447407ef6c35954426a /kcontrol/info
downloadtdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz
tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kcontrol/info')
-rw-r--r--kcontrol/info/AUTHORS32
-rw-r--r--kcontrol/info/ChangeLog27
-rw-r--r--kcontrol/info/Makefile.am22
-rw-r--r--kcontrol/info/cdinfo.desktop166
-rw-r--r--kcontrol/info/configure.in.bot13
-rw-r--r--kcontrol/info/configure.in.in22
-rw-r--r--kcontrol/info/devices.desktop246
-rw-r--r--kcontrol/info/dma.desktop248
-rw-r--r--kcontrol/info/info.cpp495
-rw-r--r--kcontrol/info/info.h53
-rw-r--r--kcontrol/info/info_aix.cpp486
-rw-r--r--kcontrol/info/info_fbsd.cpp457
-rw-r--r--kcontrol/info/info_generic.cpp88
-rw-r--r--kcontrol/info/info_hpux.cpp785
-rw-r--r--kcontrol/info/info_linux.cpp595
-rw-r--r--kcontrol/info/info_netbsd.cpp353
-rw-r--r--kcontrol/info/info_openbsd.cpp313
-rw-r--r--kcontrol/info/info_osx.cpp176
-rw-r--r--kcontrol/info/info_sgi.cpp82
-rw-r--r--kcontrol/info/info_solaris.cpp705
-rw-r--r--kcontrol/info/info_svr4.cpp132
-rw-r--r--kcontrol/info/interrupts.desktop240
-rw-r--r--kcontrol/info/ioports.desktop242
-rw-r--r--kcontrol/info/main.cpp151
-rw-r--r--kcontrol/info/memory.cpp480
-rw-r--r--kcontrol/info/memory.desktop248
-rw-r--r--kcontrol/info/memory.h67
-rw-r--r--kcontrol/info/memory_fbsd.cpp89
-rw-r--r--kcontrol/info/memory_hpux.cpp92
-rw-r--r--kcontrol/info/memory_linux.cpp39
-rw-r--r--kcontrol/info/memory_netbsd.cpp114
-rw-r--r--kcontrol/info/memory_osx.cpp93
-rw-r--r--kcontrol/info/memory_sgi.cpp75
-rw-r--r--kcontrol/info/memory_solaris.cpp94
-rw-r--r--kcontrol/info/memory_tru64.cpp83
-rw-r--r--kcontrol/info/opengl.cpp673
-rw-r--r--kcontrol/info/opengl.desktop147
-rw-r--r--kcontrol/info/partitions.desktop246
-rw-r--r--kcontrol/info/pci.desktop180
-rw-r--r--kcontrol/info/processor.desktop249
-rw-r--r--kcontrol/info/scsi.desktop177
-rw-r--r--kcontrol/info/sound.desktop243
-rw-r--r--kcontrol/info/xserver.desktop227
43 files changed, 9745 insertions, 0 deletions
diff --git a/kcontrol/info/AUTHORS b/kcontrol/info/AUTHORS
new file mode 100644
index 000000000..752630926
--- /dev/null
+++ b/kcontrol/info/AUTHORS
@@ -0,0 +1,32 @@
+Info Module:
+
+ Original (means: insufficient) implementation:
+
+ Matthias Hoelzer <[email protected]>
+
+
+Various authors contributed the code for non-Linux systems, among them:
+
+ David Brownlee <[email protected]> [NetBSD]
+ Jaromir Dolecek <[email protected]> [NetBSD]
+ Paul Kendall <[email protected]> [IRIX]
+ Vladimir Kushnir <[email protected]> [FreeBSD]
+ Aubert Pierre <[email protected]> [HP-UX]
+ Alex Zepeda <[email protected]> [FreeBSD]
+ Sebestyen Zoltan <[email protected]> [FreeBSD]
+
+Conversion to kcontrol applet:
+
+ Matthias Hoelzer <[email protected]>
+
+
+Added more informations for Linux and HP-UX (empty functions for the other systems):
+
+ Helge Deller <[email protected]>
+ (Added: pci, dma, interrupts, sound, X-server, devices, ioports, partitions, SCSI)
+
+ Hey! FreeBSD's got Sound, XServer, devices, partitions and SCSI info for
+ FreeBSD now too, compliments of your truly.
+ Alex Zepeda <[email protected]>
+
+Have YOU seen the glove of K?
diff --git a/kcontrol/info/ChangeLog b/kcontrol/info/ChangeLog
new file mode 100644
index 000000000..675fc34c9
--- /dev/null
+++ b/kcontrol/info/ChangeLog
@@ -0,0 +1,27 @@
+1998-11-09 Alex Zepeda <[email protected]>
+
+ * info_fbsd.cpp: Fix the SCSI information, so that it's actually
+ displayed (only if info can be found). However, either kcminfo or
+ camcontrol needs to be suid root. Your choice.
+
+ * info_fbsd.cpp: Add a few (hopefully) useful comments, and tidy up
+ some of the code.
+
+1998-12-08 Helge Deller <[email protected]>
+
+ * info.cpp:
+ fixed the column-width of KTabListboxes, where only one column was/is visible.
+ If more than one column is used, then the called function should set the width !
+
+ * added sections to the online-help in the /doc-directory
+
+1998-12-08 Duncan Haldane <[email protected]>
+
+ * info_linux.cpp:
+ made the sound info look first for /dev/sndstat, before /proc/sound.
+ Introduced #defines for all the hard-coded /proc/* files to make subsequent
+ changes easier.
+
+ * expanded the descriptions in the online help.
+
+ * deleted processor.xpm and memory.xpm (no longer needed)
diff --git a/kcontrol/info/Makefile.am b/kcontrol/info/Makefile.am
new file mode 100644
index 000000000..4b65dc07f
--- /dev/null
+++ b/kcontrol/info/Makefile.am
@@ -0,0 +1,22 @@
+kde_module_LTLIBRARIES = kcm_info.la
+
+if COMPILE_GL_INFO
+AM_CXXFLAGS = -DINFO_OPENGL_AVAILABLE
+endif
+
+kcm_info_la_SOURCES = main.cpp memory.cpp opengl.cpp
+
+kcm_info_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined $(FRAMEWORK_COREAUDIO)
+kcm_info_la_LIBADD = $(LIBALIB) $(LIB_KDEUI) $(LIB_TRU64_MACH) $(LIBCFG) $(LIBODM) $(LIBKSTAT) $(LIBDEVINFO) $(GLLIB)
+METASOURCES = AUTO
+
+AM_CPPFLAGS= $(all_includes) $(GLINC)
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kcminfo.pot
+
+
+xdg_apps_DATA = memory.desktop processor.desktop dma.desktop \
+ interrupts.desktop ioports.desktop opengl.desktop pci.desktop sound.desktop \
+ devices.desktop scsi.desktop partitions.desktop xserver.desktop \
+ cdinfo.desktop
diff --git a/kcontrol/info/cdinfo.desktop b/kcontrol/info/cdinfo.desktop
new file mode 100644
index 000000000..b5a441e47
--- /dev/null
+++ b/kcontrol/info/cdinfo.desktop
@@ -0,0 +1,166 @@
+[Desktop Entry]
+Exec=kcmshell cdinfo
+Icon=kcmdevices
+Type=Application
+DocPath=kinfocenter/cdinfo/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=cdinfo
+X-KDE-ParentApp=kinfocenter
+
+Name=CD-ROM Information
+Name[bg]=CD-ROM
+Name[bn]=সিডি-রম তথ্য
+Name[ca]=Informació del CD-ROM
+Name[cs]=Informace o CD-ROM
+Name[csb]=Wëdowiédzô ò CD-ROMie
+Name[da]=Cd-rom-information
+Name[de]=CD-ROM-Information
+Name[el]=Πληροφορίες CD-ROM
+Name[eo]=Lumdiska Informo
+Name[es]=Información de CD-ROM
+Name[et]=CD-seadme info
+Name[fa]=اطلاعات دیسک فشرده
+Name[fi]=CD-ROM tiedot
+Name[fr]=Informations sur le CD-Rom
+Name[fy]=Kompaktskiif ynformaasje
+Name[gl]=Información do CD-ROM
+Name[he]=מידע אודות תקליטורים
+Name[hr]=CD-ROM podaci
+Name[hu]=CD-ROM-jellemzők
+Name[id]=Informasi CD-ROM
+Name[is]=Upplýsingar um CD-ROM
+Name[it]=Informazioni CD-ROM
+Name[ja]=CD-ROM 情報
+Name[kk]=CD-ROM мәліметі
+Name[km]=ព័ត៌មាន​ស៊ីឌីរ៉ូម
+Name[ko]=DMA 정보
+Name[lt]=CD-ROM informacija
+Name[nb]=Informasjon om CD-ROM
+Name[nds]=CD-ROM-Informatschonen
+Name[ne]=सीडी रोम जानकारी
+Name[nl]=Informatie over CD-ROM
+Name[nn]=CD-ROM-informasjon
+Name[pa]=CD-ROM ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o CD-ROM-ie
+Name[pt]=Informação do CD-ROM
+Name[pt_BR]=Informações do CD-ROM
+Name[ro]=Informații CD-ROM
+Name[ru]=Сведения о CD-ROM
+Name[sk]=Informácie o CD-ROM
+Name[sl]=Podatki o CD-ROMu
+Name[sr]=Информације о CD-ROM-у
+Name[sr@Latn]=Informacije o CD-ROM-u
+Name[sv]=Cdrom-Information
+Name[te]=సీడీ-రామ్ సమాచారం
+Name[tg]=Иттилооти CD-ROM
+Name[th]=ข้อมูลของ CD-ROM
+Name[tr]=CD-ROM Bilgisi
+Name[uk]=Інформація CD-ROM
+Name[uz]=CD-ROM uskunasi
+Name[uz@cyrillic]=CD-ROM ускунаси
+Name[vi]=Thông tin đĩa CD-ROM
+Name[wa]=Informåcions do CD-ROM
+Name[zh_TW]=光碟機資訊
+
+Comment=CD/DVD Drive Capabilites
+Comment[bg]=Информация за CD/DVD устройството
+Comment[bn]=সিডি/ডিভিডি ড্রাইভ-এর ক্ষমতাবলী
+Comment[ca]=Capacitats del dispositiu CD/DVD
+Comment[cs]=Kompatibilita CD/DVD mechaniky
+Comment[csb]=Mòżlëwòtë nëka CD/DVD
+Comment[da]=Cd- eller dvd-enhedens formåen
+Comment[de]=CD/DVD-Laufwerkeigenschaften
+Comment[el]=Δυνατότητες οδηγού CD/DVD
+Comment[eo]=LD/DVDa legilaj eblecoj
+Comment[es]=Posibilidades del dispositivo CD/ DVD
+Comment[et]=CD/DVD-seadme omadused
+Comment[fa]=قابلیتهای گردانندۀ CD/DVD
+Comment[fi]=CD/DVD-aseman ominaisuudet
+Comment[fr]=Capacités du lecteur de CD / DVD
+Comment[fy]=Kompakt-/Dûbelskiif skriuwmooglikheden
+Comment[gl]=Funcións do Dispositivo de CD/DVD
+Comment[he]=מאפייני תקליטור או צורב
+Comment[hr]=CD/DVD mogućnosti pogona
+Comment[hu]=CD/DVD-meghajtó jellemzői
+Comment[is]=Geta CD/DVD tækis
+Comment[it]=Caratteristiche lettore CD/DVD
+Comment[ja]=CD/DVD ドライブの機能
+Comment[kk]=CD/DVD дискжетек мүмкіндіктері
+Comment[km]=សមត្ថភាព​ដ្រាយ​ស៊ីឌី/ឌីវីឌី
+Comment[lt]=CD/DVD įrenginio galimybės
+Comment[nb]=CD/DVD-drevets muligheter
+Comment[nds]=CD/DVD-Loopwarkkönen
+Comment[ne]=सीडी/डीभीडी ड्राइभ क्षमता
+Comment[nl]=Mogelijkheden van CD/DVD-station
+Comment[nn]=Eigenskapar til CD/DVD-spelar
+Comment[pa]=CD/DVD ਡਰਾਇਵ ਸਮੱਰਥਾ
+Comment[pl]=Możliwości napędu CD/DVD
+Comment[pt]=Capacidades da Unidade de CD/DVD
+Comment[pt_BR]=Capacidades do Drive de CD/DVD
+Comment[ro]=Capabilități unitate CD/DVD
+Comment[ru]=Возможности привода CD/DVD
+Comment[sk]=Schopnosti CD/DVD zariadenia
+Comment[sl]=Zmožnosti pogona CD/DVD
+Comment[sr]=Могућности CD/DVD уређаја
+Comment[sr@Latn]=Mogućnosti CD/DVD uređaja
+Comment[sv]=Cd- eller dvd-enhetens förmågor
+Comment[te]=సీడి/డివిడి డ్రైవ్ సామర్ద్యాలు
+Comment[tg]=Захираҳои дастгоҳи CD/DVD
+Comment[th]=ความสามารถของไดรฟ CD/DVD
+Comment[tr]=CD/DVD Sürücü Becerileri
+Comment[uk]=Можливості приводу КД/DVD
+Comment[uz]=CD/DVD uskunasi haqida maʼlumot
+Comment[uz@cyrillic]=CD/DVD ускунаси ҳақида маълумот
+Comment[vi]=Khả năng ổ đĩa CD/DVD
+Comment[wa]=Usteyes di léjheu CD/DVD
+Comment[zh_TW]=CD/DVD 相容性
+
+Keywords=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities
+Keywords[bg]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities, информация за CD-ROM, CD устройство
+Keywords[ca]=Informació del CD-ROM,CD-ROM,CD,Dispositiu CD ,Capacitats d'escriptura
+Keywords[cs]=Informace o CD, mechanice a možnostech vypalovačky
+Keywords[csb]=Wëdowiédzô CD-ROM,CD-ROM,CD,Nëk CD,Mòżlëwòtë nagrëwôcza
+Keywords[da]=Cdrom-information,cdrom,cd,cd-enhed,brænderens formåen
+Keywords[de]=CD-ROM-Information,CD-ROM,CD,CD Drive,Writer Capabilities
+Keywords[el]=Πληροφορίες CD-ROM,CD-ROM,CD,Οδηγός CD,Δυνατότητες εγγραφέα
+Keywords[eo]=Lumdiska informoj,Lumdikso,Lumdiskigilo,Lumdiska registrilo
+Keywords[es]=Información CD-ROM,CD-ROM,CD,Dispositivo CD,Capacidades de escritura
+Keywords[et]=CD-seadme info,CD-ROM,CD,CD-seade,kirjuti omadused
+Keywords[fa]=اطلاعات دیسک فشرده، دیسک فشرده، دیسک فشرده، گردانندۀ دیسک فشرده، قابلیتهای رایتر
+Keywords[fi]=CD-ROM tiedot,CD-ROM,CD,CD-asema,Kirjoitusominaisuudet
+Keywords[fr]=CD-ROM Informations,CD-ROM,CD,lecteur CD,capacités,graveur,fonctionnalités
+Keywords[fy]=Kompaktskiif ynformaasje,CD-ROM,CD,CD stasjon,Skriuwmooglikheden
+Keywords[gl]=Información do CD-ROM,CD-ROM,CD,Dispositivo de CD,Funcións de Gravación
+Keywords[he]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities, מידע אודות תקליטורים, תקליטור, תקליטור, צורב, סידי, סידי־רום, סידי-רום
+Keywords[hr]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,CD-ROM podaci, CD pogon,mogućnosti pogona
+Keywords[hu]=CD-ROM-jellemzők,CD-ROM,CD,CD-meghajtó,CD-író,írási jellemzők
+Keywords[is]=CD-ROM upplýsingar,CD-ROM,CD,CD drif,geta skrifara
+Keywords[it]=Informazioni CD-ROM,CD-ROM,CD,Lettore CD,Caratteristiche del masterizzatore
+Keywords[ja]=CD-ROM情報,CD-ROM,CD,CDドライブ,ライター機能
+Keywords[km]=ព័ត៌មាន​ស៊ីឌីរ៉ូម,ស៊ីឌីរ៉ូម,ស៊ីឌី,ដ្រាយស៊ីឌី,សមត្ថភាព​ក្បាល​សរសេរ
+Keywords[lt]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,rašymas,diskas, CD įrenginys
+Keywords[nb]=CD-ROM informasjon,CD-ROM,CD,CD-drev, skrivermuligheter
+Keywords[nds]=CD-ROM-Informatschonen,CD-ROM,CD,CD-Loopwark,Loopwarkkönen,Könen
+Keywords[ne]=सीडी रोम जानकारी, सीडी रोम,सीडी,सीडी ड्राइभ, लेखकको क्षमता
+Keywords[nl]=Informatie over CD-ROM,CD-ROM,CD,CD station,schrijver,CD-schrijver,schrijfmogelijkheden,CD-station
+Keywords[nn]=CD-ROM-informasjon,CD-ROM,CD,CD-spelar,brennareigenskapar
+Keywords[pl]=Informacja CD-ROM,CD-ROM,CD,Napęd CD,Możliwości nagrywarki
+Keywords[pt]=Informação do CD-ROM,CD-ROM,CD,Leitor de CD,Capacidades do Gravador
+Keywords[pt_BR]=Informações do CD-ROM,CD-ROM,CD,Drive de CD,Capacidades do Gravador
+Keywords[ro]=Informații CD-ROM Information,CD-ROM,CD,Unitate CD,Capabilități inscriptor
+Keywords[ru]=Сведения о CD-ROM, CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,возможности привода,привод
+Keywords[sk]=CD-ROM informácie,CD-ROM,CD,CD Drive,Writer Capabilities
+Keywords[sl]=Podatki o CD-ROMu,CD,Pogon CD,Zmožnosti zapisovalnika,DVD
+Keywords[sr]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,информације CD,уређај,могућности,писач
+Keywords[sr@Latn]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,informacije CD,uređaj,mogućnosti,pisač
+Keywords[sv]=cdrom-information,cdrom,cd,cd-enhet,brännarens förmåga
+Keywords[tg]=Иттилооти CD-ROM,CD-ROM,CD,Дастгоҳи CD, Захираҳои сабткунӣ
+Keywords[th]=-ข้อมูล CD-ROM,CD-ROM,CD,ไดรฟ CD,ความสามารถของเครื่องเขียน
+Keywords[tr]=CD-ROM Bilgileri,CD-ROM,CD,CD Drive,Yazıcının Özellikleri
+Keywords[uk]=CD-ROM Information,CD-ROM,CD,CD Drive,Writer Capabilities,Інформація CD-ROM,CD-ROM,КД,Привід КД,Можливості приводу запису
+Keywords[vi]=Thông tin đĩa CD-ROM,CD-ROM,CD, ổ đĩa CD, Khả năng ổ ghi
+Keywords[wa]=Informåcion do CD-ROM,CD-ROM,CD,léjheu d' CD,Usteyes di scrijhaedje
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/configure.in.bot b/kcontrol/info/configure.in.bot
new file mode 100644
index 000000000..c66a13f88
--- /dev/null
+++ b/kcontrol/info/configure.in.bot
@@ -0,0 +1,13 @@
+if test x$have_gl = xno; then
+ echo ""
+ echo "You are missing"
+ if test "$ac_cv_header_GL_gl_h" = "no"; then
+ echo " - OpenGL (mesa)"
+ fi
+ if test "$ac_cv_header_GL_glu_h" = "no"; then
+ echo " - GLU"
+ fi
+ echo "OpenGL information module has been disabled."
+ echo ""
+ all_tests=bad
+fi
diff --git a/kcontrol/info/configure.in.in b/kcontrol/info/configure.in.in
new file mode 100644
index 000000000..9bc6d1c4b
--- /dev/null
+++ b/kcontrol/info/configure.in.in
@@ -0,0 +1,22 @@
+# libmach for Tru64
+# linux/raw.h for Linux
+# devinfo.h, libdevinfo for the list of {IRQ,DMA,IOPORTS/MEMRANGES} for FreeBSD
+
+case "$host" in
+ *-*-osf*)
+ AC_CHECK_LIB(mach, vm_statistics, LIB_TRU64_MACH="-lmach")dnl
+ ;;
+ *-*-linux*)
+ AC_CHECK_HEADERS(linux/raw.h sys/raw.h)dnl
+ ;;
+ *-*-freebsd*)
+ AC_CHECK_HEADERS(devinfo.h)
+ AC_CHECK_LIB(devinfo, devinfo_foreach_rman, LIBDEVINFO="-ldevinfo")
+ ;;
+esac
+AC_SUBST(LIB_TRU64_MACH)
+
+AC_HAVE_GL( have_gl=yes, have_gl=no )
+AM_CONDITIONAL(COMPILE_GL_INFO, test x$have_gl = xyes)
+
+KDE_CHECK_LONG_LONG
diff --git a/kcontrol/info/devices.desktop b/kcontrol/info/devices.desktop
new file mode 100644
index 000000000..171224aa6
--- /dev/null
+++ b/kcontrol/info/devices.desktop
@@ -0,0 +1,246 @@
+[Desktop Entry]
+Exec=kcmshell devices
+Icon=kcmdevices
+Type=Application
+DocPath=kinfocenter/devices/index.html
+Categories=Qt;KDE;X-KDE-information;
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=devices
+X-KDE-ParentApp=kinfocenter
+
+Name=Devices
+Name[af]=Toestelle
+Name[ar]=الأجهزة
+Name[az]=Avadanlıqlar
+Name[be]=Прылады
+Name[bg]=Устройства
+Name[bn]=ডিভাইস
+Name[br]=Trobarzhelloù
+Name[bs]=Uređaji
+Name[ca]=Dispositius
+Name[cs]=Zařízení
+Name[csb]=Ùrządzenia
+Name[cy]=Dyfeisiau
+Name[da]=Enheder
+Name[de]=Geräte
+Name[el]=Συσκευές
+Name[eo]=Aparatoj
+Name[es]=Dispositivos
+Name[et]=Seadmed
+Name[eu]=Gailuak
+Name[fa]=دستگاهها
+Name[fi]=Laitteet
+Name[fr]=Périphériques
+Name[fy]=Apparaten
+Name[ga]=Gléasanna
+Name[gl]=Dispositivos
+Name[he]=התקנים
+Name[hi]=औज़ार
+Name[hr]=Uređaji
+Name[hu]=Eszközök
+Name[id]=Divais
+Name[is]=Tæki
+Name[it]=Periferiche
+Name[ja]=デバイス
+Name[ka]=მოწყობილობები
+Name[kk]=Құрылғылар
+Name[km]=ឧបករណ៍
+Name[ko]=장치
+Name[lo]=ອຸປະກອນ
+Name[lt]=Įrenginiai
+Name[lv]=Iekārtas
+Name[mk]=Уреди
+Name[mn]=Төхөөрөмж
+Name[ms]=Peranti
+Name[nb]=Enheter
+Name[nds]=Reedschappen
+Name[ne]=यन्त्र
+Name[nl]=Apparaten
+Name[nn]=Einingar
+Name[nso]=Maano
+Name[oc]=Dispositius
+Name[pa]=ਜੰਤਰ
+Name[pl]=Urządzenia
+Name[pt]=Dispositivos
+Name[pt_BR]=Dispositivos
+Name[ro]=Dispozitive
+Name[ru]=Устройства
+Name[rw]=Apareye
+Name[se]=Ovttadagat
+Name[sk]=Zariadenia
+Name[sl]=Enote
+Name[sr]=Уређаји
+Name[sr@Latn]=Uređaji
+Name[ss]=Tisetjentiswa
+Name[sv]=Enheter
+Name[ta]=சாதனங்கள்
+Name[te]=పరికరాలు
+Name[tg]=Дастгоҳҳо
+Name[th]=อุปกรณ์
+Name[tr]=Aygıtlar
+Name[tt]=Cıhazlar
+Name[uk]=Пристрої
+Name[uz]=Uskunalar
+Name[uz@cyrillic]=Ускуналар
+Name[ven]=Maano
+Name[vi]=Thiết bị
+Name[wa]=Éndjins
+Name[xh]=Amacebo
+Name[zh_CN]=设备
+Name[zh_TW]=設備
+Name[zu]=Amathuluzi anenjongo
+
+Comment=Attached devices information
+Comment[af]=Gekoppelde toestelle informasie
+Comment[ar]=معلومات الأجهزة المرتبطة
+Comment[az]=Bağlanmış avadanlıqlar haqqında mə'lumat
+Comment[be]=Інфармацыя аб далучаных прыладах
+Comment[bg]=Информация за системните устройства
+Comment[bn]=সংলগ্ন ডিভাইস সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn an trobarzhelloù luget
+Comment[bs]=Informacije o priključenim uređajima
+Comment[ca]=Informació dels dispositius connectats
+Comment[cs]=Informace o připojených zařízeních
+Comment[csb]=Wëdowiédzô ò włączonëch ùrządzeniach
+Comment[cy]=Gwybodaeth am ddyfeisiau wedi'i gysylltu
+Comment[da]=Information om tilkoblede enheder
+Comment[de]=Informationen zu angeschlossenen Geräten
+Comment[el]=Πληροφορίες για τις συνδεδεμένες συσκευές
+Comment[eo]=Informo pri kunmetitaj aparatoj
+Comment[es]=Información sobre los dispositivos conectados
+Comment[et]=Info ühendatud seadmete kohta
+Comment[eu]=Uztartuta dauden gailuei buruzko informazioa
+Comment[fa]=اطلاعات دستگاههای پیوست‌شده
+Comment[fi]=Tietoja liitetyistä laitteista
+Comment[fr]=Informations sur les périphériques montés
+Comment[fy]=Ynformaasje oer oansletten apparaten
+Comment[gl]=Información dos dispositivos conectados
+Comment[he]=מידע על ההתקנים המחוברים
+Comment[hi]=औज़ार जानकारी संलग्न
+Comment[hr]=Podaci o priključenim uređajima
+Comment[hu]=A csatlakoztatott eszközök jellemzői
+Comment[id]=Informasi divais terkait
+Comment[is]=Upptalning á tækjum tölvu
+Comment[it]=Informazioni sulle periferiche connesse
+Comment[ja]=接続されているデバイスの情報
+Comment[ka]=ცნობები მიერთებულ მოწყობილობებზე
+Comment[kk]=Қосылған құрылғылар туралы
+Comment[km]=ព័ត៌មាន​ឧបករណ៍​ដែល​បាន​ភ្ជាប់
+Comment[ko]=장착된 장치 정보
+Comment[lo]=ຂໍ້ມູນອຸປະກອນທີ່ຕໍ່ຢູ່
+Comment[lt]=Prijungtų įrenginių informacija
+Comment[lv]=Pievienoto iekārtu informācija
+Comment[mk]=Информации за прикачени уреди
+Comment[mn]=Залгаатай төхөөрөмжийн мэдээллүүд
+Comment[ms]=Maklumat Peranti Terlampir
+Comment[mt]=Informazzjoni dwar devices imwaħħlin
+Comment[nb]=Informasjon om tilkoblede enheter
+Comment[nds]=Informatschoon över de tokoppelten Reedschappen
+Comment[ne]=सङ्लग्न गरिएका यन्त्रहरू सूचना
+Comment[nl]=Informatie over aangesloten apparaten
+Comment[nn]=Informasjon om tilkopla einingar
+Comment[nso]=Tshedimoso ya maano yeo e kgwathisitswego
+Comment[oc]=Informacion dèus dispositius connectats
+Comment[pa]=ਜੁੜੇ ਜੰਤਰਾਂ ਬਾਰੇ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o włączonych urządzeniach
+Comment[pt]=Informações sobre os Dispositivos
+Comment[pt_BR]=Informações sobre dispositivos conectados
+Comment[ro]=Informații despre dispozitivele instalate
+Comment[ru]=Сведения о подключенных устройствах
+Comment[rw]=Ibisobanuro by'amapareye afasheho
+Comment[se]=Dieđuid laktašuvvon ovttadagaid birra
+Comment[sk]=Informácie o pripojených zariadeniach
+Comment[sl]=Informacije o priklopljenih enotah
+Comment[sr]=Информације о прикаченим уређајима
+Comment[sr@Latn]=Informacije o prikačenim uređajima
+Comment[sv]=Information om anslutna enheter
+Comment[ta]=சேர்க்கப்பட்ட சாதனங்கள் தகவல்
+Comment[te]=చేర్చిన పరికరాల సమాచారం
+Comment[tg]=Иттилооти дастгоҳҳои бастанд
+Comment[th]=ข้อมูลอุปกรณ์ที่ต่ออยู่
+Comment[tr]=Bağlanmış aygıtlar hakkında bilgi
+Comment[tt]=Totaştırılğan cıhazlar turında belem
+Comment[uk]=Інформація щодо приєднаних пристроїв
+Comment[uz]=Ulangan uskunalar haqida maʼlumot
+Comment[uz@cyrillic]=Уланган ускуналар ҳақида маълумот
+Comment[ven]=Maitele a mafhungo o kwamanywaho
+Comment[vi]=Thông tin về thiết bị kèm
+Comment[wa]=Informåcion des éndjins d' ataetchîs
+Comment[xh]=Ulwazi lwamacebo afakelweyo
+Comment[zh_CN]=附加的设备信息
+Comment[zh_TW]=附加的設備資訊
+Comment[zu]=Ulwazi lwamathuluzi anenjongo ananyathiseliwe
+
+Keywords=dev,Devices,System Information,Information
+Keywords[ar]=dev,Devices,System Information,Information,أجهزة,معلومات النظام,معلومات
+Keywords[az]=dev,Avadanlıqlar,Sistem Haqqında Mə'lumat, Mə'lumat
+Keywords[be]=прылады,прылада,сістэмная інфармацыя,інфармацыя,dev,Devices,System Information,Information
+Keywords[bg]=информация, система, системна, устройства, устройство, dev, Devices, System Information, Information
+Keywords[br]=trobarzhell,titouroù reizhiad,titouroù
+Keywords[bs]=dev,Devices,System Information,Information,uređaji,uređaj,sustav,informacije o sustavu
+Keywords[ca]=dev,dispositius,Informació del sistema,Informació
+Keywords[cs]=dev,Zařízení,Systémové informace,Informace
+Keywords[csb]=dev,systemòwé ùrządzenia,wëdowiédzô ò systemie,wëdowiédzô, infòrmacëjô
+Keywords[cy]=dyf,Dyfeisiau,Gwybodaeth Cysawd,Gwybodaeth
+Keywords[da]=dev,Enheder,Systeminformation,Information
+Keywords[de]=Geräte,Devices,Systeminformation,Information
+Keywords[el]=dev,Συσκευές,Πληροφορίες συστήματος,Πληροφορίες
+Keywords[eo]=aparato,dev,sistemo,operaciumo,informo
+Keywords[es]=Dispositivos,Información del sistema
+Keywords[et]=dev,Seadmed,Süsteemi informatsioon,Informatsioon
+Keywords[eu]=dev,Dispositiboak,Sistemaren informazioa,informazioa
+Keywords[fa]=dev،دستگاهها، اطلاعات سیستم، اطلاعات
+Keywords[fi]=dev,Laitteet,Järjestelmätiedot,Tiedot
+Keywords[fr]=dev,périphériques,information,informations système
+Keywords[fy]=dev,devices,systeemynformaasje,ynformaasje,apparaten,apparaatbehear
+Keywords[ga]=dev,Gléasanna,Eolas faoin Chóras,Eolas
+Keywords[gl]=dev,Dispositivo,Información do Sistema,Información
+Keywords[he]=התקנים,מידע מערכת,מידע,dev,Devices,System Information,Information
+Keywords[hi]=डेव,औज़ार,तंत्र जानकारी,जानकारी
+Keywords[hr]=dev,Devices,System Information,Information,uređaji,uređaj,sustav,podaci o sustavu,podaci
+Keywords[hu]=dev,eszközök,rendszerinformáci,információ
+Keywords[id]=dev,Devices,Informasi Sistem,Informasi
+Keywords[is]=dev,tæki,jaðartæki,upplýsingar,kerfi
+Keywords[it]=dev,dispositivi,periferiche,informazioni sul sistema,informazioni
+Keywords[ja]=dev,デバイスシステム,システムの情報,情報
+Keywords[km]=ឧបករណ៍,ព័ត៌មាន​ប្រព័ន្ធ,ព័ត៌មាន
+Keywords[lt]=dev,Įrenginiai,Sistemos Informacija,Informacija
+Keywords[lv]=iek,Iekārtas,Sistēmas Informācija,Informācija
+Keywords[mk]=dev,Devices,System Information,Information,Уреди,Информации за системот,Информација
+Keywords[mn]=dev,Төхөөрөмж,Системийн мэдээлэл,Мэдээлэл
+Keywords[nb]=dev,enheter,systeminformasjon,Informasjon
+Keywords[nds]=dev,Reedschappen,Systeeminformatschoon,Informatschoon
+Keywords[ne]=डेभ, यन्त्र, प्रणाली सूचना, सूचना
+Keywords[nl]=dev,devices,systeeminformatie,informatie,apparaten,apparaatbeheer
+Keywords[nn]=dev,eining,einingar,systeminformasjon,informasjon
+Keywords[nso]=dev,Maano,Tshedimoso ya System,Tshedimoso
+Keywords[oc]=dev,dispositius,Informacion dèu sistemo,Informacion
+Keywords[pa]=dev,ਜੰਤਰ,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=dev,Urządzenia systemowe,informacja o systemie,Informacja
+Keywords[pt]=dev,dispositivos,informações de sistema,informação
+Keywords[pt_BR]=dev,Dispositivos,Informações de sistema,Informações,Informação
+Keywords[ro]=dev,dispozitive,informații sistem,informații
+Keywords[rw]=dev,Apareye,Amakuru Sisitemu,Amakuru
+Keywords[se]=dev,ovttadat,ovttadagat,vuogádatdiehtu,diehtu
+Keywords[sk]=dev,Zariadenia,Systém Informácie
+Keywords[sl]=dev,naprave,informacije o sistemu,informacije
+Keywords[sr]=dev,Devices,System Information,Information,уређаји,системске информације,информације
+Keywords[sr@Latn]=dev,Devices,System Information,Information,uređaji,sistemske informacije,informacije
+Keywords[sv]=enhet,Enheter,Systeminformation,Information
+Keywords[ta]=dev,சாதனங்கள், கணினித் தகவல், தகவல்
+Keywords[tg]=dev,Дастгоҳҳо,Иттилооти система,Иттилоот
+Keywords[th]=dev,อุปกรณ์,ข้อมูลระบบ,ข้อมูล
+Keywords[tr]=dev,Aygıtlar,Sistem Hakkında Bilgi, Bilgi
+Keywords[uk]=пристрої,інформація,dev,devices,system-information,information
+Keywords[uz]=dev,Uskunalar,Maʼlumot,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=dev,Ускуналар,Маълумот,Тизим ҳақида маълумот
+Keywords[ven]=dev,Maano,Mafhungo a sisitemu,Mafhungo
+Keywords[vi]=dev,Thiết bị,Thông tin Hệ thống,Thông tin
+Keywords[wa]=dev,Devices,System Information,Information,informåcion do sistinme, informåcion,éndjins
+Keywords[xh]=dev,Amacebo,Ulwazi lwendlela,Ulwazi
+Keywords[zh_CN]=dev,Devices,System Information,Information,设备,系统信息,信息
+Keywords[zh_TW]=dev,Devices,System Information,Information,設備,系統資訊,資訊
+Keywords[zu]=dev,Amathuluzi anenjongo,Ulwazi lwesistimu,Ulwazi
+
diff --git a/kcontrol/info/dma.desktop b/kcontrol/info/dma.desktop
new file mode 100644
index 000000000..e420acaea
--- /dev/null
+++ b/kcontrol/info/dma.desktop
@@ -0,0 +1,248 @@
+[Desktop Entry]
+Exec=kcmshell dma
+Icon=kcmmemory
+Type=Application
+DocPath=kinfocenter/dma/index.html
+Categories=Qt;KDE;X-KDE-information;
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=dma
+X-KDE-ParentApp=kinfocenter
+
+Name=DMA-Channels
+Name[af]=Dma-kanale
+Name[az]=DMA Kanalları
+Name[be]=Каналы DMA
+Name[bg]=DMA канали
+Name[bn]=ডি.এম.এ-চ্যানেল
+Name[br]=Kanolioù DMA
+Name[bs]=DMA-Kanali
+Name[ca]=Canals DMA
+Name[cs]=DMA kanály
+Name[csb]=Kanałë DMA
+Name[cy]=Sianeli DMA
+Name[da]=DMA-kanaler
+Name[de]=DMA-Kanäle
+Name[el]=Κανάλια DMA
+Name[eo]=DMA-kanaloj
+Name[es]=Canales DMA
+Name[et]=DMA kanalid
+Name[eu]=DMA-Kanalak
+Name[fa]=مجراهای دستیابی مستقیم به حافظه
+Name[fi]=DMA-kanavat
+Name[fr]=Canaux DMA
+Name[fy]=DMA-kanalen
+Name[ga]=Cainéil-DMA
+Name[gl]=Canles de DMA
+Name[he]=גישה ישירה לזיכרון
+Name[hi]=डीएमए-चैनल्स
+Name[hr]=DMA kanali
+Name[hu]=DMA-csatornák
+Name[id]=Channels-DMA
+Name[is]=DMA-brautir
+Name[it]=Canali DMA
+Name[ja]=DMA チャンネル
+Name[ka]=DMA არხები
+Name[kk]=DMA-арналар
+Name[km]=ផ្លូវ DMA
+Name[ko]=DMA 채널
+Name[lo]=ຊາແນລDMA
+Name[lt]=DMA-Kanalai
+Name[lv]=DMA-Kanāli
+Name[mk]=DMA-канали
+Name[mn]=DMA-Сувгууд
+Name[ms]=Saluran DMA
+Name[nb]=DMA-kanaler
+Name[nds]=DMA-Kanaals
+Name[ne]=DMA-च्यानल
+Name[nl]=DMA-kanalen
+Name[nn]=DMA-kanalar
+Name[nso]=Dikanale tsa DMA
+Name[oc]=Canals DMA
+Name[pa]=DMA-ਚੈਨਲ
+Name[pl]=Kanały DMA
+Name[pt]=Canais de DMA
+Name[pt_BR]=Canais DMA
+Name[ro]=Canale DMA
+Name[ru]=Каналы DMA
+Name[rw]=Imirongomakuru-DMA
+Name[se]=DMA-kanálat
+Name[sk]=DMA kanály
+Name[sl]=Kanali DMA
+Name[sr]=DMA канали
+Name[sr@Latn]=DMA kanali
+Name[ss]=Migudvu ye DMa
+Name[sv]=DMA-kanaler
+Name[ta]=DMA-வழிமுறைகள்
+Name[te]=డిఎంఏ-చానెళ్ళు
+Name[tg]=Каналҳои-DMA
+Name[th]=ช่อง DMA
+Name[tr]=DMA Kanalları
+Name[tt]=DMA-Yullar
+Name[uk]=Канали ПДП
+Name[uz]=DMA kanallari
+Name[uz@cyrillic]=DMA каналлари
+Name[ven]=Tshanele ya DMA
+Name[vi]=Kênh DMA
+Name[wa]=Canås DMA
+Name[xh]=DMA-Imijelo
+Name[zh_CN]=DMA 通道
+Name[zh_TW]=DMA 通道
+Name[zu]=Imigudu-DMA
+
+Comment=DMA information
+Comment[af]=Dma informasie
+Comment[ar]=معلومات DMA
+Comment[az]=DMA haqqında mə'lumat
+Comment[be]=Інфармацыя аб DMA
+Comment[bg]=Информация за DMA
+Comment[bn]=ডি.এম.এ. সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn an DMA
+Comment[bs]=DMA informacije
+Comment[ca]=Informació de la DMA
+Comment[cs]=Informace o DMA
+Comment[csb]=Wëdowiédzô ò DMA
+Comment[cy]=Gwybodaeth DMA
+Comment[da]=DMA-information
+Comment[de]=Informationen zu DMA
+Comment[el]=Πληροφορίες για τα DMA
+Comment[eo]=DMA-informo
+Comment[es]=Información sobre DMA
+Comment[et]=DMA kanalite info
+Comment[eu]=DMAri buruzko informazioa
+Comment[fa]=اطلاعات دسترسی مستقیم به حافظه
+Comment[fi]=DMA-tietoja
+Comment[fr]=Informations DMA
+Comment[fy]=DMA-ynformatie
+Comment[ga]=Eolas faoi DMA
+Comment[gl]=Información de DMA
+Comment[he]=מידע על ערוצי הגישה הישירה לזיכרון
+Comment[hi]=डीएमए जानकारी
+Comment[hr]=DMA podaci
+Comment[hu]=DMA-információk
+Comment[id]=Informasi DMA
+Comment[is]=Upplýsingar um DMA-brautir
+Comment[it]=Informazioni sul DMA
+Comment[ja]=DMA 情報
+Comment[ka]=ინფორმაცია DMA–ს შესახებ
+Comment[kk]=DMA мәліметі
+Comment[km]=ព័ត៌មាន DMA
+Comment[ko]=DMA 정보
+Comment[lt]=DMA informacija
+Comment[lv]=DMA informācija
+Comment[mk]=Информации за DMA
+Comment[mn]=DMA-н мэдээлэл
+Comment[ms]=Maklumat DMA
+Comment[mt]=Informazzjoni dwar DMA
+Comment[nb]=DMA-informasjon
+Comment[nds]=Informatschoon över DMA
+Comment[ne]=DMA सूचना
+Comment[nl]=DMA-informatie
+Comment[nn]=DMA-informasjon
+Comment[nso]=Tshedimoso ya DMA
+Comment[oc]=Informacion de DMA
+Comment[pa]=DMA ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o DMA
+Comment[pt]=Informação do DMA
+Comment[pt_BR]=Informações de DMA
+Comment[ro]=Informații despre canalele DMA
+Comment[ru]=Сведения о DMA
+Comment[rw]=Ibisobanuro DMA
+Comment[se]=DMA-diehtu
+Comment[sk]=Informácie o DMA
+Comment[sl]=Informacija o neposrednem dostopu do pomnilnika (DMA)
+Comment[sr]=DMA информације
+Comment[sr@Latn]=DMA informacije
+Comment[ss]=Imininingwaneye DMA
+Comment[sv]=DMA-information
+Comment[ta]=DMA தகவல்
+Comment[te]=డిఎంఏ సమాచారం
+Comment[tg]=Иттилооти DMA
+Comment[th]=ข้อมูล DMA
+Comment[tr]=DMA hakkında bilgi
+Comment[tt]=DMA turında
+Comment[uk]=Інформація щодо ПДП
+Comment[uz]=DMA haqida maʼlumot
+Comment[uz@cyrillic]=DMA ҳақида маълумот
+Comment[ven]=Mafhungo a DMA
+Comment[vi]=Thông tin DMA
+Comment[wa]=Informåcion so les canås DMA
+Comment[xh]=DMA ulwazi
+Comment[zh_CN]=DMA 信息
+Comment[zh_TW]=DMA 資訊
+Comment[zu]=Ulwazi lwe-DMA
+
+Keywords=dma,DMA-Channels,System Information
+Keywords[af]=dma,DMA-Channels,System Informasie
+Keywords[az]=dma,DMA-Kanalları,Sistem Haqqında Mə'lumat
+Keywords[be]=каналы DMA,сістэмная інфармацыя,dma,DMA-Channels,System Information
+Keywords[bg]=информация, система, системна, канали, канал, dma, DMA-Channels, System Information
+Keywords[br]=dma,kanolioù DMA,titoutoù reizhoad
+Keywords[bs]=dma,DMA-Channels,System Information,DMA-kanali,informacije o sustavu
+Keywords[ca]=dma,Canals DMA,informació del sistema
+Keywords[cs]=dma,DMA kanály,Informace o systému
+Keywords[csb]=dma,kanałë DMA,wëdowiédzô ò systemie
+Keywords[cy]=dma,Sianeli DMA,Gwybodaeth Cysawd
+Keywords[da]=dma,DMA-kanaler,Systeminformation
+Keywords[de]=DMA,DMA-Kanäle,Systeminformation,Information
+Keywords[el]=dma,Κανάλια DMA,Πληροφορίες συστήματος
+Keywords[eo]=DMA,kanaloj,sistemo,operaciumo,informo
+Keywords[es]=DMA,Canales DMA,Información del sistema
+Keywords[et]=dma,DMA kanalid,süsteemi informatsioon
+Keywords[eu]=dma,DMA-Kanalak,Sistemaren informazioa
+Keywords[fa]=dma ،مجراهای دستیابی مستقیم به حافظه، اطلاعات سیستم
+Keywords[fi]=dma,DMA-kanavat,Järjestelmätiedot
+Keywords[fr]=dma,canaux DMA,informations système
+Keywords[fy]=dma,DMA-channels,systeemynformaasje,DMA-kanalen
+Keywords[ga]=dma,Cainéil-DMA,Eolas faoin Chóras
+Keywords[gl]=dma,Canles de DMA,Canales DMA,Información do Sistema
+Keywords[he]=ערוצי גישה ישירה לזיכרון,מידע מערכת,DMA,DMA-Channels,System Information
+Keywords[hi]=डीएमए,डीएमए-चैनल्स,तंत्र जानकारी
+Keywords[hr]=dma,DMA-Channels,System Information,DMA kanali,podaci o sustavu
+Keywords[hu]=DMA,DMA-csatornák,DMA-csatorna,rendszerinformáció
+Keywords[id]=dma,DMA-Channels,Informasi Sistem
+Keywords[is]=DMA-brautir,DMA-rásir
+Keywords[it]=DMA,canali DMA,informazioni sul sistema
+Keywords[ja]=dma,DMA-チャンネル,システムの情報
+Keywords[ka]=dma,DMA-არხები,ინფორმაცია სისტემის შესახებ
+Keywords[km]=dma,ផ្លូវ DMA,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=dma,DMA-Channels,System InformationKeywords=dma,DMA-Channels,System Information
+Keywords[lt]=dma,DMA-Kanalai,Sistemos Informacija
+Keywords[lv]=dma,DMA-Kanāli,Sistēmas Informācija
+Keywords[mk]=dma,DMA-Channels,System Information,DMA канали,канали,Информации за системот
+Keywords[mn]=DMA,DMA-сувгууд,Системийн мэдээлэл,Мэдээлэл
+Keywords[nb]=dma,DMA-kanaler,Systeminformasjon
+Keywords[nds]=dms,DMA-Kanaals,Systeeminformatschoon
+Keywords[ne]=dma, DMA-च्यानल, प्रणाली सूचना
+Keywords[nl]=dma,DMA-channels,systeeminformatie,DMA-kanalen
+Keywords[nn]=dma,DMA-kanalar,systeminformasjon
+Keywords[nso]=dma,Dikanale tsa DMA,Tshedimoso ya System
+Keywords[oc]=dma,Canals DMA,informacion dèu sistemo
+Keywords[pa]=dma,DMA-Channels,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=dma,kanały DMA,informacja o systemie
+Keywords[pt]=dma,canais dma,informações de sistema
+Keywords[pt_BR]=DMA,canais DMA,canal DMA,informações de sistema
+Keywords[ro]=dma,canale DMA,informații despre sistem
+Keywords[rw]=dma,Imirongomakuru-DMA,Amakuru Sisitemu
+Keywords[se]=dma,DMA-kanálat,vuogádatdiehtu
+Keywords[sk]=dma,DMA-kanály,Systémové Informácie
+Keywords[sl]=dma,kanali DMA,informacije o sistemu
+Keywords[sr]=dma,DMA-Channels,System Information,канали,системске информације
+Keywords[sr@Latn]=dma,DMA-Channels,System Information,kanali,sistemske informacije
+Keywords[sv]=dma,DMA-kanaler,Systeminformation
+Keywords[ta]=dma,DMA-வழிமுறைகள்,அமைப்பு தகவல்
+Keywords[tg]=dma,Каналҳои-DMA,Иттилооти система
+Keywords[th]=dma,ช่อง DMA,ข้อมูลระบบ
+Keywords[tr]=dma,DMA-Kanalları,Sistem Hakkında Bilgi
+Keywords[uk]=dma,канал ПДП, інформація,system-information,information
+Keywords[uz]=dma,DMA kanallari,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=dma,DMA каналлари,Тизим ҳақида маълумот
+Keywords[ven]=dma,Dzitshanele dza DMA,Mafhungo a sisitemu
+Keywords[vi]=dma,Kênh DMA,Thông tin Hệ thống
+Keywords[wa]=informåcion do sistinme,dma,Canås DMA
+Keywords[xh]=dma,DMA-Imijelo,Ulwazi Lwendlela yokusebenza
+Keywords[zh_CN]=dma,DMA-Channels,System Information,DMA 通道,系统信息
+Keywords[zh_TW]=dma,DMA-Channels,System Information,DMA通道,系統資訊
+Keywords[zu]=dma,Imigudu-DMA,Ulwazi lwesistimu
+
diff --git a/kcontrol/info/info.cpp b/kcontrol/info/info.cpp
new file mode 100644
index 000000000..ea74ed9ac
--- /dev/null
+++ b/kcontrol/info/info.cpp
@@ -0,0 +1,495 @@
+/*
+ Main Widget for showing system-dependent information.
+ (But all functions in THIS FILE should be system independent !)
+
+ (C) 1998-2003 by Helge Deller <[email protected]>
+
+ ** 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 <qheader.h>
+#include <qwhatsthis.h>
+#include <qlayout.h>
+
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <kdialog.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::null /* i18n("Maybe the proc-filesystem is not enabled in Linux-Kernel.") */
+#elif defined(__hpux)
+# define DEFAULT_ERRORSTRING QString::null
+#else
+#define DEFAULT_ERRORSTRING i18n("Maybe this system is not 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).rightJustify(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 QListViewItem* XServer_fill_screen_info( QListViewItem *lBox, QListViewItem *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 */
+ QListViewItem *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 QListViewItem(lBox,last, i18n("Screen # %1").arg((int)scr,-1),
+ (scr==default_scr) ? i18n("(Default Screen)") : QString::null );
+ item->setExpandable(true);
+ if (scr==default_scr)
+ item->setOpen(true);
+ last = new QListViewItem(item, i18n("Dimensions"),
+ i18n("%1 x %2 Pixel (%3 x %4 mm)")
+ .arg( (int)DisplayWidth(dpy,scr) )
+ .arg( (int)DisplayHeight(dpy,scr) )
+ .arg( (int)DisplayWidthMM(dpy,scr) )
+ .arg( (int)DisplayHeightMM (dpy,scr) ));
+
+ last = new QListViewItem(item, last, i18n("Resolution"),
+ i18n("%1 x %2 dpi")
+ .arg( (int)(xres+0.5) )
+ .arg( (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 + QString::fromLatin1(", ");
+ }
+
+ last = new QListViewItem(item, last, i18n("Depths (%1)").arg(ndepths,-1), txt);
+ XFree((char *) depths);
+ }
+
+ last = new QListViewItem(item, last, i18n("Root Window ID"),
+ HexStr((unsigned long)RootWindow(dpy,scr),HEXDIGITS));
+ last = new QListViewItem(item, last, i18n("Depth of Root Window"),
+ (DisplayPlanes (dpy, scr) == 1)
+ ? i18n("%1 plane").arg(DisplayPlanes(dpy,scr)) /*singular*/
+ : i18n("%1 planes").arg(DisplayPlanes(dpy,scr)));/*plural*/
+ last = new QListViewItem(item, last, i18n("Number of Colormaps"),
+ i18n("minimum %1, maximum %2")
+ .arg((int)MinCmapsOfScreen(s)).arg((int)MaxCmapsOfScreen(s)));
+ last = new QListViewItem(item, last, i18n("Default Colormap"),
+ Value((int)DefaultColormap(dpy,scr)));
+ last = new QListViewItem(item, last, i18n("Default Number of Colormap Cells"),
+ Value((int)DisplayCells(dpy, scr)));
+ last = new QListViewItem(item, last, i18n("Preallocated Pixels"),
+ i18n("Black %1, White %2")
+ .arg(KGlobal::locale()->formatNumber(BlackPixel(dpy,scr), 0))
+ .arg(KGlobal::locale()->formatNumber(WhitePixel(dpy,scr), 0)));
+
+ QString YES(i18n("Yes"));
+ QString NO(i18n("No"));
+ last = new QListViewItem(item, last, i18n("Options"),
+ i18n("backing-store: %1, save-unders: %2")
+ .arg( (DoesBackingStore(s) == NotUseful) ? NO :
+ ((DoesBackingStore(s) == Always) ? YES : i18n("When mapped")) )
+ .arg( DoesSaveUnders(s) ? YES : NO ));
+
+ XQueryBestSize (dpy, CursorShape, RootWindow(dpy,scr), 65535, 65535,
+ &width, &height);
+ last = new QListViewItem(item, last, i18n("Largest Cursor"),
+ (width == 65535 && height == 65535)
+ ? i18n("unlimited") : QString::fromLatin1("%1 x %2").arg(width).arg(height));
+
+ last = new QListViewItem(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 QListViewItem(last, item,
+ i18n("Event = %1").arg(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").arg(order);
+}
+
+static const QString BitString( unsigned long n )
+{
+ return i18n("1 Bit", "%n 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's "1", not "%1"!)
+
+ return i18n("%1 Bytes") // plural form: "%1 Bytes"
+ .arg(KGlobal::locale()->formatNumber(n,0));
+}
+
+static bool GetInfo_XServer_Generic( QListView *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;
+ QListViewItem *last, *item, *next;
+
+ dpy = XOpenDisplay(0);
+ if (!dpy)
+ return false;
+
+ lBox->addColumn(i18n("Information") );
+ lBox->addColumn(i18n("Value") );
+ sorting_allowed = false;
+
+ next = new QListViewItem(lBox, i18n("Server Information"));
+ next->setPixmap(0, SmallIcon("kcmx"));
+ next->setOpen(true);
+ next->setSelectable(false);
+ next->setExpandable(false);
+
+ last = new QListViewItem(next, i18n("Name of the Display"),
+ DisplayString(dpy));
+
+ last = new QListViewItem(next, last, i18n("Vendor String"), QString::fromLatin1(ServerVendor(dpy)));
+ last = new QListViewItem(next, last, i18n("Vendor Release Number"),
+ Value((int)VendorRelease(dpy)));
+
+ last = new QListViewItem(next, last, i18n("Version Number"),
+ QString::fromLatin1("%1.%2").arg((int)ProtocolVersion(dpy))
+ .arg((int)ProtocolRevision(dpy)));
+
+ last = item = new QListViewItem(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 QListViewItem( next, last, i18n("Supported Extensions") );
+ item = last;
+
+ int extCount;
+ char **extensions = XListExtensions( dpy, &extCount );
+ for ( i = 0; i < extCount; i++ ) {
+ item = new QListViewItem( last, item, QString::fromLatin1( extensions[i] ) );
+ }
+ XFreeExtensionList( extensions );
+
+ pmf = XListPixmapFormats(dpy, &n);
+ last = item = new QListViewItem(next, last, i18n("Supported Pixmap Formats"));
+ if (pmf) {
+ last->setExpandable(true);
+ for (i=0; i<n; i++) {
+ item = new QListViewItem(last, item,
+ i18n("Pixmap Format #%1").arg(i+1),
+ i18n("%1 BPP, Depth: %2, Scanline padding: %3")
+ .arg(pmf[i].bits_per_pixel)
+ .arg(BitString(pmf[i].depth))
+ .arg(BitString(pmf[i].scanline_pad)));
+ }
+ XFree ((char *)pmf);
+ }
+
+ req_size = XExtendedMaxRequestSize(dpy);
+ if (!req_size) req_size = XMaxRequestSize(dpy);
+ last = new QListViewItem(next, last, i18n("Maximum Request Size"),
+ ByteString(req_size*4));
+ last = new QListViewItem(next, last, i18n("Motion Buffer Size"),
+ ByteString(XDisplayMotionBufferSize(dpy)));
+
+ last = item = new QListViewItem(next, last, i18n("Bitmap"));
+ last->setExpandable(true);
+ item = new QListViewItem(last, item, i18n("Unit"),
+ Value(BitmapUnit(dpy)) );
+ item = new QListViewItem(last, item, i18n("Order"),
+ Order(BitmapBitOrder(dpy)));
+ item = new QListViewItem(last, item, i18n("Padding"),
+ Value(BitmapPad(dpy)));
+
+ last = new QListViewItem(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.").arg(title)
+ + QString::fromLatin1("\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->raiseWidget(lBox);
+ }
+ else
+ {
+ NoInfoText->setText(ErrorString);
+ widgetStack->raiseWidget(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 QString &_title, QWidget *parent, const char *name,
+ bool _getlistbox(QListView *lbox))
+ : KCModule(parent, name),
+ title(_title)
+{
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcminfo"),
+ I18N_NOOP("KDE Panel System Information Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1998 - 2002 Helge Deller"));
+
+ about->addAuthor("Helge Deller", 0, "[email protected]");
+ setAboutData( about );
+
+ setButtons(KCModule::Help);
+ getlistbox = _getlistbox;
+ GetInfo_ErrorString = 0;
+ QHBoxLayout *layout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+ widgetStack = new QWidgetStack(this);
+ layout->addWidget(widgetStack);
+ lBox = new QListView(widgetStack);
+ widgetStack->addWidget(lBox, 0);
+ lBox->setMinimumSize(200,120);
+ lBox->setFont(KGlobalSettings::generalFont()); /* default font */
+ lBox->setAllColumnsShowFocus(true);
+ QWhatsThis::add( lBox, i18n( "This list displays system information on the selected category." ) );
+ NoInfoText = new QLabel(widgetStack);
+ widgetStack->addWidget(NoInfoText, 1);
+ NoInfoText->setAlignment(AlignCenter | WordBreak);
+ widgetStack->raiseWidget(NoInfoText);
+ load();
+}
+
+
+
+/* Helper-function to read output from an external program */
+static int GetInfo_ReadfromPipe( QListView *lBox, const char *FileName, bool WithEmptyLines = true )
+{
+ FILE *pipe;
+ QListViewItem* olditem = 0L;
+ QString s;
+
+ if ((pipe = popen(FileName, "r")) == NULL) {
+ pclose(pipe);
+ return 0;
+ }
+
+ QTextStream t(pipe, IO_ReadOnly);
+
+ while (!t.atEnd()) {
+ s = t.readLine();
+ if (!WithEmptyLines && s.length()==0)
+ continue;
+ olditem = new QListViewItem(lBox, olditem, s);
+ }
+
+ pclose(pipe);
+
+ 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 unsupportet systems.... */
+#endif
+
+/*
+***************************************************************************
+** End of: Include system-specific code **
+***************************************************************************
+*/
diff --git a/kcontrol/info/info.h b/kcontrol/info/info.h
new file mode 100644
index 000000000..c55c1b2a5
--- /dev/null
+++ b/kcontrol/info/info.h
@@ -0,0 +1,53 @@
+#ifndef _INFO_H_
+#define _INFO_H_
+
+#include <qwidget.h>
+#include <qwidgetstack.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qtabdialog.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qlistview.h>
+#include <qfile.h>
+#include <qevent.h>
+
+#include <kcmodule.h>
+#include <kaboutdata.h>
+
+#include "config.h"
+
+/* function call-back-prototypes... */
+
+bool GetInfo_CPU( QListView *lBox );
+bool GetInfo_IRQ( QListView *lBox );
+bool GetInfo_DMA( QListView *lBox );
+bool GetInfo_PCI( QListView *lBox );
+bool GetInfo_IO_Ports( QListView *lBox );
+bool GetInfo_Sound( QListView *lBox );
+bool GetInfo_Devices( QListView *lBox );
+bool GetInfo_SCSI( QListView *lBox );
+bool GetInfo_Partitions( QListView *lBox );
+bool GetInfo_XServer_and_Video( QListView *lBox );
+bool GetInfo_CD_ROM( QListView *lBox ); /* New CD-ROM Info */
+extern bool GetInfo_OpenGL( QListView *lBox );
+
+class KInfoListWidget : public KCModule
+{
+public:
+ KInfoListWidget(const QString &_title, QWidget *parent, const char *name=0, bool _getlistbox (QListView *)=0);
+
+ virtual void load();
+ virtual QString quickHelp() const;
+
+private:
+ QListView *lBox;
+ bool (*getlistbox) (QListView *);
+ QString title;
+
+ QLabel *NoInfoText;
+ QString ErrorString;
+ QWidgetStack *widgetStack;
+};
+
+#endif
diff --git a/kcontrol/info/info_aix.cpp b/kcontrol/info/info_aix.cpp
new file mode 100644
index 000000000..8aaee4f6d
--- /dev/null
+++ b/kcontrol/info/info_aix.cpp
@@ -0,0 +1,486 @@
+/*
+ * info_aix.cpp
+ *
+ * Reza Arbab <[email protected]>
+ *
+ * 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)
+ {
+ kdError(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();
+ kdError(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();
+ kdError(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)
+ {
+ kdError(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)
+ kdError(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;
+}
diff --git a/kcontrol/info/info_fbsd.cpp b/kcontrol/info/info_fbsd.cpp
new file mode 100644
index 000000000..6e936801a
--- /dev/null
+++ b/kcontrol/info/info_fbsd.cpp
@@ -0,0 +1,457 @@
+/*
+ * info_fbsd.cpp is part of the KDE program kcminfo. This displays
+ * various information about the system (hopefully a FreeBSD system)
+ * it's running on.
+ *
+ * All of the devinfo bits were blatantly stolen from the devinfo utility
+ * provided with FreeBSD 5.0 (and later). No gross hacks were harmed
+ * 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
+ * information was not available.
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+//#if __FreeBSD_version >= 500042
+// #define we should have devinfo.h
+//#else
+// #define we probably don't have devinfo.h
+//#endif
+
+#ifdef HAVE_DEVINFO_H
+ extern "C" {
+ #include <devinfo.h>
+ }
+#endif
+
+#include <errno.h>
+#include <fstab.h>
+#include <string.h>
+
+#include <qdict.h>
+#include <qfile.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+class Device {
+public:
+ Device (QString n=QString::null, QString d=QString::null)
+ {name=n; description=d;}
+ QString name, description;
+};
+
+void ProcessChildren(QString name);
+QString GetController(const QString &line);
+Device *GetDevice(const QString &line);
+
+#ifdef HAVE_DEVINFO_H
+extern "C" {
+ int print_irq(struct devinfo_rman *rman, void *arg);
+ int print_dma(struct devinfo_rman *rman, void *arg);
+ int print_ioports(struct devinfo_rman *rman, void *arg);
+ int print_resource(struct devinfo_res *res, void *arg);
+}
+#endif
+
+bool GetInfo_CPU (QListView *lBox)
+{
+ // Modified 13 July 2000 for SMP by Brad Hughes - [email protected]
+
+ int ncpu;
+ size_t len;
+
+ len = sizeof(ncpu);
+ sysctlbyname("hw.ncpu", &ncpu, &len, NULL, 0);
+
+ QString cpustring;
+ for (int i = ncpu; i > 0; i--) {
+ /* Stuff for sysctl */
+ char *buf;
+ int i_buf;
+
+ // get the processor model
+ sysctlbyname("hw.model", NULL, &len, NULL, 0);
+ buf = new char[len];
+ sysctlbyname("hw.model", buf, &len, NULL, 0);
+
+ // get the TSC speed if we can
+ len = sizeof(i_buf);
+ if (sysctlbyname("machdep.tsc_freq", &i_buf, &len, NULL, 0) != -1) {
+ cpustring = i18n("CPU %1: %2, %3 MHz").arg(i).arg(buf).arg(i_buf/1000000);
+ } else {
+ cpustring = i18n("CPU %1: %2, unknown speed").arg(i).arg(buf);
+ }
+
+ /* Put everything in the listbox */
+ new QListViewItem(lBox, cpustring);
+
+ /* Clean up after ourselves, this time I mean it ;-) */
+ delete buf;
+ }
+
+ return true;
+}
+
+bool GetInfo_IRQ (QListView *lbox)
+{
+#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
+ enema. The best idea would probably be to rip out the guts of systat.
+ Too bad it's not very well commented */
+ /* Oh neat, current now has a neat little utility called devinfo */
+ if (devinfo_init())
+ return false;
+ devinfo_foreach_rman(print_irq, lbox);
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool GetInfo_DMA (QListView *lbox)
+{
+#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);
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool GetInfo_IO_Ports (QListView *lbox)
+{
+#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);
+ return true;
+#else
+ return false;
+#endif
+}
+
+bool GetInfo_Sound (QListView *lbox)
+{
+ QFile *sndstat = new QFile("/dev/sndstat");
+ QTextStream *t;
+ QString s;
+ QListViewItem *olditem = 0;
+
+ if (!sndstat->exists() || !sndstat->open(IO_ReadOnly)) {
+
+ s = i18n("Your sound system could not be queried. /dev/sndstat does not exist or is not readable.");
+ olditem = new QListViewItem(lbox, olditem, s);
+ } else {
+ t = new QTextStream(sndstat);
+ while (!(s=t->readLine()).isNull()) {
+ olditem = new QListViewItem(lbox, olditem, s);
+ }
+
+ delete t;
+ sndstat->close();
+ }
+
+ delete sndstat;
+ return true;
+}
+
+bool GetInfo_SCSI (QListView *lbox)
+{
+ FILE *pipe;
+ QFile *camcontrol = new QFile("/sbin/camcontrol");
+ QTextStream *t;
+ QString s;
+ QListViewItem *olditem = 0;
+
+ if (!camcontrol->exists()) {
+ s = i18n ("SCSI subsystem could not be queried: /sbin/camcontrol could not be found");
+ olditem = new QListViewItem(lbox, olditem, s);
+ } 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 QListViewItem(lbox, olditem, s);
+ } else {
+
+ /* This prints out a list of all the scsi devies, perhaps eventually we could
+ parse it as opposed to schlepping it into a listbox */
+
+ t = new QTextStream(pipe, IO_ReadOnly);
+
+ while (true) {
+ s = t->readLine();
+ if ( s.isEmpty() )
+ break;
+ olditem = new QListViewItem(lbox, olditem, s);
+ }
+
+ delete t;
+ pclose(pipe);
+ }
+
+ delete camcontrol;
+
+ if (!lbox->childCount())
+ return false;
+
+ return true;
+}
+
+bool GetInfo_PCI (QListView *lbox)
+{
+ FILE *pipe;
+ QFile *pcicontrol;
+ QString s, cmd;
+ QListViewItem *olditem = 0;
+
+ pcicontrol = new QFile("/usr/sbin/pciconf");
+
+ if (!pcicontrol->exists()) {
+ delete pcicontrol;
+ pcicontrol = new QFile("/usr/X11R6/bin/scanpci");
+ if (!pcicontrol->exists()) {
+ 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 QListViewItem(lbox, 0, s);
+ delete pcicontrol;
+ return true;
+ } else {
+ cmd = "/usr/X11R6/bin/pcitweak -l 2>&1";
+ }
+ } else {
+ cmd = "/usr/X11R6/bin/scanpci";
+ }
+ } else {
+ cmd = "/usr/sbin/pciconf -l -v 2>&1";
+ }
+ delete pcicontrol;
+
+ if ((pipe = popen(cmd.latin1(), "r")) == NULL) {
+ s = i18n ("PCI subsystem could not be queried: %1 could not be executed").arg(cmd);
+ olditem = new QListViewItem(lbox, olditem, s);
+ } 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.latin1(), true);
+ }
+
+ if (!lbox->childCount()) {
+ s = i18n("The PCI subsystem could not be queried, this may need root privileges.");
+ olditem = new QListViewItem(lbox, olditem, s);
+ return true;
+ }
+
+ return true;
+}
+
+bool GetInfo_Partitions (QListView *lbox)
+{
+ struct fstab *fstab_ent;
+
+ if (setfsent() != 1) /* Try to open fstab */ {
+ int s_err = errno;
+ QString s;
+ s = i18n("Could not check filesystem info: ");
+ s += strerror(s_err);
+ (void)new QListViewItem(lbox, 0, s);
+ } else {
+ lbox->addColumn(i18n("Device"));
+ lbox->addColumn(i18n("Mount Point"));
+ lbox->addColumn(i18n("FS Type"));
+ lbox->addColumn(i18n("Mount Options"));
+
+ while ((fstab_ent=getfsent())!=NULL) {
+ new QListViewItem(lbox, fstab_ent->fs_spec,
+ fstab_ent->fs_file, fstab_ent->fs_vfstype,
+ fstab_ent->fs_mntops);
+ }
+
+ lbox->setSorting(0);
+ lbox->header()->setClickEnabled(true);
+
+ endfsent(); /* Close fstab */
+ }
+ return true;
+}
+
+bool GetInfo_XServer_and_Video (QListView *lBox)
+{
+ return GetInfo_XServer_Generic( lBox );
+}
+
+bool GetInfo_Devices (QListView *lbox)
+{
+ QFile *f = new QFile("/var/run/dmesg.boot");
+ if (f->open(IO_ReadOnly)) {
+ QTextStream qts(f);
+ QDict<QListViewItem> lv_items;
+ Device *dev;
+ QString line, controller;
+ lbox->setRootIsDecorated(true);
+ lbox->addColumn("Device");
+ lbox->addColumn("Description");
+ while ( !(line=qts.readLine()).isNull() ) {
+ controller = GetController(line);
+ if (controller.isNull())
+ continue;
+ dev=GetDevice(line);
+ if (!dev)
+ 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 QListViewItem(lbox, dev->name, dev->description) );
+ }
+ } else {
+ QListViewItem *parent=lv_items[controller];
+ if (parent && !lv_items[dev->name]) {
+ lv_items.insert(dev->name, new QListViewItem(parent, dev->name, dev->description) );
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+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);
+ if (controller.find("-slave") != -1) {
+ controller.remove(controller.find("-slave"), controller.length());
+ } else if (controller.find("-master") != -1) {
+ controller.remove(controller.find("-master"), controller.length());
+ } else
+ controller=QString::null;
+ if (!controller.isNull())
+ return controller;
+ }
+ if (line.find(" on ") != -1) {
+ QString controller;
+ controller = line;
+ controller.remove(0, controller.find(" on ")+4);
+ if (controller.find(" ") != -1)
+ controller.remove(controller.find(" "), controller.length());
+ return controller;
+ }
+ return QString::null;
+}
+
+Device *GetDevice(const QString &line)
+{
+ Device *dev;
+ int colon = line.find(":");
+ if (colon == -1)
+ return 0;
+ dev = new Device;
+ dev->name = line.mid(0, colon);
+ dev->description = line.mid(line.find("<")+1, line.length());
+ dev->description.remove(dev->description.find(">"), dev->description.length());
+ return dev;
+}
+
+#ifdef HAVE_DEVINFO_H
+
+int print_irq(struct devinfo_rman *rman, void *arg)
+{
+ QListView *lbox = (QListView *)arg;
+ if (strcmp(rman->dm_desc, "Interrupt request lines")==0) {
+ (void)new QListViewItem(lbox, 0, rman->dm_desc);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ return(0);
+}
+
+int print_dma(struct devinfo_rman *rman, void *arg)
+{
+ QListView *lbox = (QListView *)arg;
+ if (strcmp(rman->dm_desc, "DMA request lines")==0) {
+ (void)new QListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ return(0);
+}
+
+int print_ioports(struct devinfo_rman *rman, void *arg)
+{
+ QListView *lbox = (QListView *)arg;
+
+ if (strcmp(rman->dm_desc, "I/O ports")==0) {
+ (void)new QListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ else if (strcmp(rman->dm_desc, "I/O memory addresses")==0) {
+ (void)new QListViewItem(lbox, lbox->lastItem(), rman->dm_desc);
+ devinfo_foreach_rman_resource(rman, print_resource, arg);
+ }
+ return(0);
+}
+
+int print_resource(struct devinfo_res *res, void *arg)
+{
+ struct devinfo_dev *dev;
+ struct devinfo_rman *rman;
+ int hexmode;
+
+ QListView *lbox;
+
+ lbox = (QListView *)arg;
+
+ QString s, tmp;
+
+ rman = devinfo_handle_to_rman(res->dr_rman);
+ hexmode = (rman->dm_size > 100) || (rman->dm_size == 0);
+ tmp.sprintf(hexmode ? "0x%lx" : "%lu", res->dr_start);
+ s += tmp;
+ if (res->dr_size > 1) {
+ tmp.sprintf(hexmode ? "-0x%lx" : "-%lu",
+ res->dr_start + res->dr_size - 1);
+ s += tmp;
+ }
+
+ dev = devinfo_handle_to_device(res->dr_device);
+ if ((dev != NULL) && (dev->dd_name[0] != 0)) {
+ tmp.sprintf(" (%s)", dev->dd_name);
+ } else {
+ tmp.sprintf(" ----");
+ }
+ s += tmp;
+
+ (void)new QListViewItem(lbox, lbox->lastItem(), s);
+ return(0);
+}
+
+#endif
diff --git a/kcontrol/info/info_generic.cpp b/kcontrol/info/info_generic.cpp
new file mode 100644
index 000000000..5ef80dcca
--- /dev/null
+++ b/kcontrol/info/info_generic.cpp
@@ -0,0 +1,88 @@
+/*
+
+ 1998 by Helge Deller ([email protected])
+ 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
+#define INFO_CD_ROM_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( QListView * )
+{
+ return false;
+}
+
+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 );
+}
+
+/* Generic GetInfo? ~Jahshan */
+bool GetInfo_CD_ROM(QListView * lBox)
+{
+ return false;
+}
diff --git a/kcontrol/info/info_hpux.cpp b/kcontrol/info/info_hpux.cpp
new file mode 100644
index 000000000..dc0684ab5
--- /dev/null
+++ b/kcontrol/info/info_hpux.cpp
@@ -0,0 +1,785 @@
+
+/*
+ !!!!! this file will be included by info.cpp !!!!!
+
+ Mostly written 1998-1999 by Helge Deller ([email protected]),
+ 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.h>
+#include <qfontmetrics.h>
+#include <qtextstream.h>
+
+
+#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, IO_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(IO_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)
diff --git a/kcontrol/info/info_linux.cpp b/kcontrol/info/info_linux.cpp
new file mode 100644
index 000000000..9d29e890e
--- /dev/null
+++ b/kcontrol/info/info_linux.cpp
@@ -0,0 +1,595 @@
+/*
+
+ Linux-specific Information about the Hardware.
+
+ (C) Copyright 1998-2006 by Helge Deller <[email protected]>
+ (C) Copyright 2006 by Jahshan Bhatti <[email protected]> (CD-ROM Info)
+
+ To do (maybe?):
+ - include Information about XFree86 and/or Accelerated X
+ (needs to change configure-skript, 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 ([email protected])
+
+*/
+
+#include <unistd.h>
+#include <syscall.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <linux/kernel.h>
+#include <ctype.h>
+#include <config.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.h>
+
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kstdguiitem.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 INFO_CD_ROM_AVAILABLE
+#define INFO_CD_ROM "/proc/sys/dev/cdrom/info" /* Feature 47242 */
+
+
+#define MAXCOLUMNWIDTH 600
+
+bool GetInfo_ReadfromFile(QListView * lbox, const char *FileName,
+ const QChar& splitChar,
+ QListViewItem * lastitem = 0,
+ QListViewItem ** newlastitem = 0)
+{
+ bool added = false;
+ QFile file(FileName);
+
+ if (!file.exists()) {
+ return false;
+ }
+
+ if (!file.open(IO_ReadOnly)) {
+ /* *GetInfo_ErrorString =
+ i18n("You do not have read-access for the file %1!\nPlease ask your system-administrator for advice!")
+ .arg(FileName);
+ */
+ return false;
+ }
+ QTextStream stream(&file);
+ QString line;
+
+ while (!stream.atEnd()) {
+ QString s1, s2;
+ line = stream.readLine();
+ if (!line.isEmpty()) {
+ if (!splitChar.isNull()) {
+ int pos = line.find(splitChar);
+ s1 = line.left(pos-1).stripWhiteSpace();
+ s2 = line.mid(pos+1).stripWhiteSpace();
+ }
+ else
+ s1 = line;
+ }
+ lastitem = new QListViewItem(lbox, lastitem, s1, s2);
+ added = true;
+ }
+
+ file.close();
+ if (newlastitem)
+ *newlastitem = lastitem;
+
+ return added;
+}
+
+
+
+
+bool GetInfo_CPU(QListView * lBox)
+{
+ lBox->addColumn(i18n("Information"));
+ lBox->addColumn(i18n("Value"));
+ return GetInfo_ReadfromFile(lBox, INFO_CPU, ':');
+}
+
+
+bool GetInfo_IRQ(QListView * lBox)
+{
+ lBox->setFont(KGlobalSettings::fixedFont());
+ return GetInfo_ReadfromFile(lBox, INFO_IRQ, 0);
+}
+
+bool GetInfo_DMA(QListView * lBox)
+{
+ QFile file(INFO_DMA);
+
+ lBox->addColumn(i18n("DMA-Channel"));
+ lBox->addColumn(i18n("Used By"));
+
+ if (file.exists() && file.open(IO_ReadOnly)) {
+ QTextStream stream(&file);
+ QString line;
+ QListViewItem *child=0L;
+
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ if (!line.isEmpty()) {
+ QRegExp rx("^\\s*(\\S+)\\s*:\\s*(\\S+)");
+ if (-1 != rx.search(line)) {
+ child = new QListViewItem(lBox,child,rx.cap(1),rx.cap(2));
+ }
+ }
+ }
+ file.close();
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
+bool GetInfo_PCI(QListView * 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)))
+ return num;
+
+ /* if lspci failed, read the contents of /proc/pci */
+ return GetInfo_ReadfromFile(lBox, INFO_PCI, 0);
+}
+
+bool GetInfo_IO_Ports(QListView * lBox)
+{
+ lBox->addColumn(i18n("I/O-Range"));
+ lBox->addColumn(i18n("Used By"));
+ return GetInfo_ReadfromFile(lBox, INFO_IOPORTS, ':');
+}
+
+bool GetInfo_Sound(QListView * 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(QListView * lBox)
+{
+ QFile file;
+ QListViewItem *misc=0L;
+
+ lBox->setRootIsDecorated(true);
+ lBox->addColumn(i18n("Devices"));
+ lBox->addColumn(i18n("Major Number"));
+ lBox->addColumn(i18n("Minor Number"));
+
+ file.setName(INFO_DEVICES);
+ if (file.exists() && file.open(IO_ReadOnly)) {
+ QTextStream stream(&file);
+ QString line;
+ QListViewItem *parent=0L, *child=0L;
+
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ if (!line.isEmpty()) {
+ if (-1 != line.find("character device",0,false)) {
+ parent = new QListViewItem(lBox,parent,i18n("Character Devices"));
+ parent->setPixmap(0,SmallIcon("chardevice"));
+ parent->setOpen(true);
+ } else if (-1 != line.find("block device",0,false)) {
+ parent = new QListViewItem(lBox,parent,i18n("Block Devices"));
+ parent->setPixmap(0,SmallIcon("blockdevice"));
+ parent->setOpen(true);
+ } else {
+ QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
+ if (-1 != rx.search(line)) {
+ if (parent) {
+ child = new QListViewItem(parent,child,rx.cap(2),rx.cap(1));
+ } else {
+ child = new QListViewItem(lBox,parent,rx.cap(2),rx.cap(1));
+ }
+ if (rx.cap(2)=="misc") {
+ misc=child;
+ }
+ }
+ }
+ }
+ }
+ file.close();
+ } else {
+ return false;
+ }
+
+ file.setName(INFO_MISC);
+ if (misc && file.exists() && file.open(IO_ReadOnly)) {
+ QTextStream stream(&file);
+ QString line;
+ QListViewItem *child=0L;
+
+ misc->setText(0,i18n("Miscellaneous Devices"));
+ misc->setPixmap(0,SmallIcon("memory"));
+ misc->setOpen(true);
+
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ if (!line.isEmpty()) {
+ QRegExp rx("^\\s*(\\S+)\\s+(\\S+)");
+ if (-1 != rx.search(line)) {
+ child = new QListViewItem(misc,child,rx.cap(2),"10",rx.cap(1));
+ }
+ }
+ }
+ file.close();
+ }
+
+ return true;
+}
+
+bool GetInfo_SCSI(QListView * lBox)
+{
+ return GetInfo_ReadfromFile(lBox, INFO_SCSI, 0);
+}
+
+static void cleanPassword(QString & str)
+{
+ int index = 0;
+ QString passwd("password=");
+
+ while (index >= 0)
+ {
+ index = str.find(passwd, index, FALSE);
+ 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(QListView * 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 SIZEOF_LONG > 4
+#define LONG_TYPE unsigned long
+#else
+#ifdef HAVE_LONG_LONG
+#define LONG_TYPE unsigned long long
+#else
+/* On 32-bit systems we would get an overflow in unsigned int for
+ drives bigger than 4GB. Let's use the ugly type double ! */
+#define LONG_TYPE double
+#endif
+#endif
+
+
+
+#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(QListView *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 QListViewItem(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(QListView * 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;
+ LONG_TYPE 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(IO_ReadOnly)) {
+ char buf[1024];
+ while (file->readLine(buf, sizeof( buf )) > 0) {
+ str = QString::fromLocal8Bit(buf);
+ if (str.length()) {
+ int p = str.find(' '); /* 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 = ((LONG_TYPE) sfs.f_blocks) * sfs.f_bsize;
+ avail = (getuid()? sfs.f_bavail : sfs.f_bfree)
+ * ((LONG_TYPE) 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 QListViewItem(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 QListViewItem(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(QListView * lBox)
+{
+ return GetInfo_XServer_Generic(lBox);
+}
+
+/* GetInfo for CD-ROM Info by Jahshan Bhatti */
+bool GetInfo_CD_ROM(QListView * lBox)
+{
+ QFile file(INFO_CD_ROM);
+ lBox->addColumn(i18n("Information"));
+ lBox->addColumn(i18n("Value"));
+
+ if (file.exists() && file.open(IO_ReadOnly)) {
+ QRegExp rx("(.+):\\s+(\\S.*)");
+ QTextStream stream(&file);
+ QString line;
+ QListViewItem *child = NULL;
+
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ if (!line.isEmpty()) {
+ if (-1 != rx.search(line)) {
+ QString text = rx.cap(1);
+ QString value = rx.cap(2);
+ if (!text.contains('#')) {
+ if (value == "0")
+ value = KStdGuiItem::no().plainText();
+ if (value == "1")
+ value = KStdGuiItem::yes().plainText();
+ }
+ child = new QListViewItem(lBox,child,text,value);
+ }
+ } else {
+ child = new QListViewItem(lBox,child,QString::null,QString::null);
+ }
+ }
+ file.close();
+ } else {
+ return false;
+ }
+
+ return true;
+}
+
diff --git a/kcontrol/info/info_netbsd.cpp b/kcontrol/info/info_netbsd.cpp
new file mode 100644
index 000000000..228e32fb0
--- /dev/null
+++ b/kcontrol/info/info_netbsd.cpp
@@ -0,0 +1,353 @@
+/*
+ * info_netbsd.cpp is part of the KDE program kcminfo. This displays
+ * various information about the NetBSD system it's running on.
+ *
+ * Originally written by Jaromir Dolecek <[email protected]>. CPU info
+ * code has been imported from implementation of processor.cpp for KDE 1.0
+ * by David Brownlee <[email protected]> as found in NetBSD packages collection.
+ * Hubert Feyer <[email protected]> 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 <sys/mount.h>
+#include <stdio.h> /* for NULL */
+#include <stdlib.h> /* for malloc(3) */
+#include <fstab.h>
+
+#include <qfile.h>
+#include <qfontmetrics.h>
+#include <qstrlist.h>
+#include <qtextstream.h>
+
+#include <kdebug.h>
+#include <kio/global.h> /* for KIO::convertSize() */
+
+typedef struct
+ {
+ int string;
+ int name;
+ const char *title;
+ } hw_info_mib_list_t;
+
+bool GetInfo_CPU(QListView *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 }
+ };
+ 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 = QString::number(num);
+ }
+ new QListViewItem(lBox, hw_info_mib->title, value);
+ }
+
+ return true;
+}
+
+// this is used to find out which devices are currently
+// on system
+static bool GetDmesgInfo(QListView *lBox, const char *filter,
+ void func(QListView *, QString s))
+{
+ QFile *dmesg = new QFile("/var/run/dmesg.boot");
+ bool usepipe = false;
+ FILE *pipe = NULL;
+ QTextStream *t;
+ bool seencpu = false;
+ QString s;
+ bool found = false;
+
+ if (dmesg->exists() && dmesg->open(IO_ReadOnly)) {
+ t = new QTextStream(dmesg);
+ }
+ else {
+ delete dmesg;
+ pipe = popen("/sbin/dmesg", "r");
+ if (!pipe) return false;
+ usepipe = true;
+ t = new QTextStream(pipe, IO_ReadOnly);
+ }
+
+ QListViewItem *olditem = NULL;
+ while(!(s = t->readLine().local8Bit()).isEmpty()) {
+ 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
+ || (filter[0] == '^' && s.find(&filter[1]) == 0)
+ || (filter[0] != '^' && s.contains(filter))) {
+ if (func)
+ func(lBox, s);
+ else
+ olditem = new QListViewItem(lBox, olditem, s);
+ found = true;
+ }
+ }
+
+ delete t;
+ if (pipe)
+ pclose(pipe);
+ else {
+ dmesg->close();
+ delete dmesg;
+ }
+
+ return found;
+}
+
+
+void
+AddIRQLine(QListView *lBox, QString s)
+{
+ int pos, irqnum;
+ char numstr[3];
+
+ pos = s.find(" irq ");
+ irqnum = (pos < 0) ? 0 : atoi(&s.ascii()[pos+5]);
+ if (irqnum)
+ snprintf(numstr, 3, "%02d", irqnum);
+ else {
+ // this should never happen
+ strcpy(numstr, "??");
+ }
+
+ new QListViewItem(lBox, numstr, s);
+}
+
+bool GetInfo_IRQ (QListView *lBox)
+{
+ lBox->addColumn(i18n("IRQ"));
+ lBox->addColumn(i18n("Device"));
+ lBox->setSorting(0);
+ lBox->setShowSortIndicator(FALSE);
+ (void) GetDmesgInfo(lBox, " irq ", AddIRQLine);
+ return true;
+}
+
+bool GetInfo_DMA (QListView *)
+{
+ return false;
+}
+
+bool GetInfo_PCI (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "at pci", NULL))
+ new QListViewItem(lbox, i18n("No PCI devices found."));
+ return true;
+}
+
+bool GetInfo_IO_Ports (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "port 0x", NULL))
+ new QListViewItem(lbox, i18n("No I/O port devices found."));
+ return true;
+}
+
+bool GetInfo_Sound (QListView *lbox)
+{
+ lbox->setSorting(false);
+
+ if (!GetDmesgInfo(lbox, "audio", NULL))
+ new QListViewItem(lbox, i18n("No audio devices found."));
+
+ // append information for each audio devices found
+ QListViewItem *lvitem = lbox->firstChild();
+ for(; lvitem; lvitem = lvitem->nextSibling()) {
+ QString s;
+ int pos, len;
+ const char *start;
+ char *dev;
+
+ s = lvitem->text(0);
+ // The autoconf message is in form 'audio0 at auvia0: ...'
+ if (s.find("audio") == 0 && (pos = s.find(" at ")) > 0) {
+ pos += 4; // skip " at "
+ start = s.ascii() + pos;
+ len = (int) strcspn(start, ":\n\t ");
+ dev = (char *) malloc(1 + len + 1);
+ sprintf(dev, "^%.*s", len, start); /* safe */
+
+ GetDmesgInfo(lbox, dev, NULL);
+
+ free(dev);
+ }
+ }
+
+ return true;
+}
+
+bool GetInfo_Devices (QListView *lBox)
+{
+ (void) GetDmesgInfo(lBox, NULL, NULL);
+ return true;
+}
+
+bool GetInfo_SCSI (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "scsibus", NULL))
+ new QListViewItem(lbox, i18n("No SCSI devices found."));
+
+ // remove the 'waiting %d seconds for devices to settle' message
+ QListViewItem *lvitem = lbox->firstChild();
+ for(; lvitem; lvitem = lvitem->nextSibling()) {
+ QString s = lvitem->text(0);
+
+ if (s.contains("seconds for devices to settle")) {
+ lbox->removeItem(lvitem);
+ break;
+ }
+ }
+
+ return true;
+}
+
+bool GetInfo_Partitions (QListView *lbox)
+{
+ int num; // number of mounts
+ // FIXME: older pkgsrc patches checked ST_RDONLY for this declaration
+ // what is ST_RDONLY and how does it affect getmntinfo?
+ struct statfs *mnt; // mount data pointer
+
+ // get mount info
+ if (!(num=getmntinfo(&mnt, MNT_WAIT))) {
+ kdError() << "getmntinfo failed" << endl;
+ return false;
+ }
+
+ // 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"));
+
+ // mnt points into a static array (no need to free it)
+ for(; num--; ++mnt) {
+ unsigned long long big[2];
+ QString vv[5];
+
+ big[0] = big[1] = mnt->f_bsize; // coerce the product
+ big[0] *= mnt->f_blocks;
+ big[1] *= mnt->f_bavail; // FIXME: use f_bfree if root?
+
+ // convert to strings
+ vv[0] = KIO::convertSize(big[0]);
+ vv[1] = QString::fromLatin1("%1 (%2%%)")
+ .arg(KIO::convertSize(big[1]))
+ .arg(mnt->f_blocks ? mnt->f_bavail*100/mnt->f_blocks : 0);
+
+ // FIXME: these two are large enough to punctuate
+ vv[2] = QString::number(mnt->f_files);
+ vv[3] = QString::fromLatin1("%1 (%2%%) ")
+ .arg(mnt->f_ffree)
+ .arg(mnt->f_files ? mnt->f_ffree*100/mnt->f_files : 0);
+
+ vv[4] = QString::null;
+#define MNTF(x) if (mnt->f_flags & MNT_##x) vv[4] += QString::fromLatin1(#x " ");
+ MNTF(ASYNC)
+ MNTF(DEFEXPORTED)
+ MNTF(EXKERB)
+ MNTF(EXNORESPORT)
+ MNTF(EXPORTANON)
+ MNTF(EXPORTED)
+ MNTF(EXPUBLIC)
+ MNTF(EXRDONLY)
+ MNTF(IGNORE)
+ MNTF(LOCAL)
+ MNTF(NOATIME)
+ MNTF(NOCOREDUMP)
+ MNTF(NODEV)
+ MNTF(NODEVMTIME)
+ MNTF(NOEXEC)
+ MNTF(NOSUID)
+ MNTF(QUOTA)
+ MNTF(RDONLY)
+ MNTF(ROOTFS)
+ MNTF(SOFTDEP)
+ MNTF(SYMPERM)
+ MNTF(SYNCHRONOUS)
+ MNTF(UNION)
+#undef MNTF
+
+ // put it in the table
+ // FIXME: there're more data but we have limited args (this is wrong! just add!)
+ new QListViewItem(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]);
+ }
+
+ // job well done
+ return true;
+}
+
+bool GetInfo_XServer_and_Video (QListView *lBox)
+{
+ return GetInfo_XServer_Generic( lBox );
+}
diff --git a/kcontrol/info/info_openbsd.cpp b/kcontrol/info/info_openbsd.cpp
new file mode 100644
index 000000000..92995fd78
--- /dev/null
+++ b/kcontrol/info/info_openbsd.cpp
@@ -0,0 +1,313 @@
+/*
+ * 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 <[email protected]>. CPU info
+ * code has been imported from implementation of processor.cpp for KDE 1.0
+ * by David Brownlee <[email protected]> as found in NetBSD packages collection.
+ * Hubert Feyer <[email protected]> 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.h>
+#include <qfontmetrics.h>
+#include <qstrlist.h>
+#include <qtextstream.h>
+
+#include <kdebug.h>
+
+typedef struct
+ {
+ int string;
+ int name;
+ const char *title;
+ } hw_info_mib_list_t;
+
+bool GetInfo_CPU(QListView *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 QListViewItem(lBox, hw_info_mib->title, value);
+ }
+
+ return true;
+}
+
+// this is used to find out which devices are currently
+// on system
+static bool GetDmesgInfo(QListView *lBox, const char *filter,
+ void func(QListView *, 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(IO_ReadOnly)) {
+ t = new QTextStream(dmesg);
+ }
+ else {
+ delete dmesg;
+ pipe = popen("/sbin/dmesg", "r");
+ if (!pipe) return false;
+ usepipe = true;
+ t = new QTextStream(pipe, IO_ReadOnly);
+ }
+
+ QListViewItem *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 QListViewItem(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(QListView *lBox, QString s, void **opaque, bool ending)
+{
+ QStrList *strlist = (QStrList *) *opaque;
+ const char *str;
+ int pos, irqnum=0;
+ const char *p;
+ p = s.latin1();
+
+ if (!strlist) {
+ strlist = new QStrList();
+ *opaque = (void *) strlist;
+ }
+ if (ending) {
+ str = strlist->first();
+ for(;str; str = strlist->next()) {
+ new QListViewItem(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.latin1());
+}
+
+bool GetInfo_IRQ (QListView *lBox)
+{
+ lBox->addColumn(i18n("IRQ"));
+ lBox->addColumn(i18n("Device"));
+ (void) GetDmesgInfo(lBox, " irq ", AddIRQLine);
+ return true;
+}
+
+bool GetInfo_DMA (QListView *)
+{
+ return false;
+}
+
+bool GetInfo_PCI (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "at pci", NULL))
+ new QListViewItem(lbox, i18n("No PCI devices found."));
+ return true;
+}
+
+bool GetInfo_IO_Ports (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "port 0x", NULL))
+ new QListViewItem(lbox, i18n("No I/O port devices found."));
+ return true;
+}
+
+bool GetInfo_Sound (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "audio", NULL))
+ new QListViewItem(lbox, i18n("No audio devices found."));
+
+ // append information on any audio devices found
+ QListViewItem *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.ascii();
+ for(; (*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 (QListView *lBox)
+{
+ (void) GetDmesgInfo(lBox, NULL, NULL);
+ return true;
+}
+
+bool GetInfo_SCSI (QListView *lbox)
+{
+ if (!GetDmesgInfo(lbox, "scsibus", NULL))
+ new QListViewItem(lbox, i18n("No SCSI devices found."));
+ return true;
+}
+
+bool GetInfo_Partitions (QListView *lbox)
+{
+ QString s;
+ char *line, *orig_line;
+ const char *device, *mountpoint, *type, *flags;
+ FILE *pipe = popen("/sbin/mount", "r");
+ QTextStream *t;
+
+ if (!pipe) {
+ kdError(0) << i18n("Unable to run /sbin/mount.") << endl;
+ return false;
+ }
+ t = new QTextStream(pipe, IO_ReadOnly);
+
+ lbox->addColumn(i18n("Device"));
+ lbox->addColumn(i18n("Mount Point"));
+ lbox->addColumn(i18n("FS Type"));
+ lbox->addColumn(i18n("Mount Options"));
+
+ QListViewItem *olditem = 0;
+ while (!(s = t->readLine()).isNull()) {
+ orig_line = line = strdup(s.latin1());
+
+ 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 QListViewItem(lbox, olditem, device, mountpoint,
+ type, flags);
+
+ free(orig_line);
+ }
+
+ delete t;
+ pclose(pipe);
+ return true;
+}
+
+bool GetInfo_XServer_and_Video (QListView *lBox)
+{
+ return GetInfo_XServer_Generic( lBox );
+}
diff --git a/kcontrol/info/info_osx.cpp b/kcontrol/info/info_osx.cpp
new file mode 100644
index 000000000..25f23c2d9
--- /dev/null
+++ b/kcontrol/info/info_osx.cpp
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2003 Benjamin Reed <[email protected]>
+ *
+ * info_osx.cpp is part of the KDE program kcminfo. Copied wholesale
+ * from info_fbsd.cpp =)
+ *
+ * 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.
+ */
+
+#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/sysctl.h>
+
+#include <fstab.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <iostream.h>
+
+#include <qdict.h>
+#include <qfile.h>
+#include <qfontmetrics.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+#include <kdebug.h>
+
+#include <mach/mach.h>
+#include <mach-o/arch.h>
+
+#ifdef HAVE_COREAUDIO
+#include <CoreAudio/CoreAudio.h>
+#endif
+
+#include <machine/limits.h>
+
+bool GetInfo_CPU (QListView *lBox)
+{
+
+ QString cpustring;
+
+ kern_return_t ret;
+ 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);
+ if (ret != KERN_SUCCESS) {
+ kdDebug() << "unable to get host information from mach" << endl;
+ return false;
+ } else {
+ kdDebug() << "got Host Info: (" << basic_info.avail_cpus << ") CPUs available" << endl;
+ const NXArchInfo *archinfo;
+ archinfo=NXGetArchInfoFromCpuType(basic_info.cpu_type, basic_info.cpu_subtype);
+ new QListViewItem(lBox, i18n("Kernel is configured for %1 CPUs").arg(basic_info.max_cpus));
+ for (int i = 1; i <= basic_info.avail_cpus; i++) {
+ cpustring = i18n("CPU %1: %2").arg(i).arg(archinfo->description);
+ new QListViewItem(lBox, cpustring);
+ }
+ return true;
+ }
+ return false;
+}
+
+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 *lBox)
+{
+#ifdef HAVE_COREAUDIO
+#define kMaxStringSize 1024
+ OSStatus status;
+ AudioDeviceID gOutputDeviceID;
+ unsigned long propertySize;
+ char deviceName[kMaxStringSize];
+ char manufacturer[kMaxStringSize];
+ propertySize = sizeof(gOutputDeviceID);
+ status = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &propertySize, &gOutputDeviceID);
+ if (status) {
+ kdDebug() << "get default output device failed, status = " << (int)status << endl;
+ return false;
+ }
+
+ if (gOutputDeviceID != kAudioDeviceUnknown) {
+
+ propertySize = kMaxStringSize;
+
+ /* Device Name */
+ status = AudioDeviceGetProperty(gOutputDeviceID, 1, 0, kAudioDevicePropertyDeviceName, &propertySize, deviceName);
+ if (status) {
+ kdDebug() << "get device name failed, status = " << (int)status << endl;
+ return false;
+ }
+ new QListViewItem(lBox, i18n("Device Name: %1").arg(deviceName));
+
+ /* Manufacturer */
+ status = AudioDeviceGetProperty(gOutputDeviceID, 1, 0, kAudioDevicePropertyDeviceManufacturer, &propertySize, manufacturer);
+ if (status) {
+ kdDebug() << "get manufacturer failed, status = " << (int)status << endl;
+ return false;
+ }
+ new QListViewItem(lBox, i18n("Manufacturer: %1").arg(manufacturer));
+ return true;
+ } else {
+ return false;
+ }
+#else
+ return false;
+#endif
+}
+
+bool GetInfo_SCSI (QListView *lbox)
+{
+ return false;
+}
+
+bool GetInfo_Partitions (QListView *lbox)
+{
+ return false;
+}
+
+bool GetInfo_XServer_and_Video (QListView *lBox)
+{
+ return GetInfo_XServer_Generic( lBox );
+}
+
+bool GetInfo_Devices (QListView *lbox)
+{
+ return false;
+}
diff --git a/kcontrol/info/info_sgi.cpp b/kcontrol/info/info_sgi.cpp
new file mode 100644
index 000000000..2cd1a1e30
--- /dev/null
+++ b/kcontrol/info/info_sgi.cpp
@@ -0,0 +1,82 @@
+/* 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 );
+}
+
diff --git a/kcontrol/info/info_solaris.cpp b/kcontrol/info/info_solaris.cpp
new file mode 100644
index 000000000..761200e75
--- /dev/null
+++ b/kcontrol/info/info_solaris.cpp
@@ -0,0 +1,705 @@
+/*
+ * info_solaris.cpp
+ *
+ * Torsten Kasch <[email protected]>
+ */
+
+#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( QListView *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 QListViewItem( lBox, inst, cputype, fputype, mhz, state );
+ }
+
+ // sorting_allowed = true;
+ lBox->setSorting( 0 );
+
+ 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_SCSI( QListView * ) {
+ return false;
+}
+
+bool GetInfo_Partitions( QListView *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 QListViewItem
+ */
+ mnttime = (time_t) atol( mnt.mnt_time );
+ if( (timetxt = ctime( &mnttime )) != NULL ) {
+ ptr = strrchr( timetxt, '\n' );
+ *ptr = '\0';
+ }
+
+ new QListViewItem(
+ 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( QListView *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
+ */
+QListViewItem *mktree( QListViewItem *top, const char *path ) {
+
+ QListViewItem *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 ).latin1()) == 0 )
+ break;
+ previous = result;
+ result = (*result).nextSibling();
+ }
+ if( result == NULL ) {
+ /*
+ * we haven't found the node, create a new one
+ */
+ result = new QListViewItem( 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 ) {
+
+ QListViewItem *item;
+ QString majmin;
+ char *type;
+ dev_t dev;
+
+ item = new QListViewItem( (QListViewItem *) arg,
+ di_minor_name( minor ));
+ item->setExpandable( true );
+ item->setOpen( false );
+ new QListViewItem( item, i18n( "Spectype:" ),
+ (di_minor_spectype( minor ) == S_IFCHR)
+ ? i18n( "character special" )
+ : i18n( "block special" ));
+ type = di_minor_nodetype( minor );
+ new QListViewItem( 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 QListViewItem( 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 ) {
+
+ QListViewItem *top = (QListViewItem *) 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 QListViewItem( parent,
+ i18n( "Driver Name:" ),
+ (drivername == NULL)
+ ? i18n( "(driver not attached)" )
+ : drivername );
+ previous = new QListViewItem( 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 QListViewItem( parent, previous,
+ i18n( "Compatible Names:" ), compatnames );
+
+ previous = new QListViewItem( 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 QListViewItem( parent, previous, i18n( "Properties" ));
+ previous->setExpandable( true );
+ previous->setOpen( false );
+ do {
+ /*
+ * property type & value
+ */
+ QListViewItem *tmp,
+ *prev;
+ tmp = new QListViewItem( previous, di_prop_name( prop ));
+ tmp->setExpandable( true );
+ tmp->setOpen( false );
+ prev = new QListViewItem( tmp, i18n( "Type:" ),
+ prop_type_str( prop ));
+ new QListViewItem( 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 QListViewItem( 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( QListView *lBox ) {
+
+ QListViewItem *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 QListViewItem( 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( QListView * ) {
+ return false;
+}
+#endif /* ! HAVE_LIBDEVINFO_H */
diff --git a/kcontrol/info/info_svr4.cpp b/kcontrol/info/info_svr4.cpp
new file mode 100644
index 000000000..2509aa062
--- /dev/null
+++ b/kcontrol/info/info_svr4.cpp
@@ -0,0 +1,132 @@
+/*
+ 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 ([email protected])
+ 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(IO_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 );
+}
+
diff --git a/kcontrol/info/interrupts.desktop b/kcontrol/info/interrupts.desktop
new file mode 100644
index 000000000..a18bde656
--- /dev/null
+++ b/kcontrol/info/interrupts.desktop
@@ -0,0 +1,240 @@
+[Desktop Entry]
+Exec=kcmshell interrupts
+Icon=kcmmemory
+Type=Application
+DocPath=kinfocenter/interrupts/index.html
+Categories=Qt;KDE;X-KDE-information;
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=irq
+X-KDE-ParentApp=kinfocenter
+
+Name=Interrupts
+Name[ar]=مفاتيح الإنقطاع
+Name[az]=Kəsmələr
+Name[be]=Перапыненні
+Name[bg]=Прекъсвания
+Name[bn]=ইনটরাপ্ট
+Name[br]=Spanoù
+Name[bs]=Interapti
+Name[ca]=Interrupcions
+Name[cs]=Přerušení
+Name[csb]=Przerwania
+Name[cy]=Ymyriadau
+Name[el]=Διακοπές
+Name[eo]=Interrompoj
+Name[es]=Interrupciones
+Name[et]=Katkestused
+Name[eu]=Etenaldiak
+Name[fa]=وقفه‌ها
+Name[fi]=Keskeytykset
+Name[fr]=Interruptions
+Name[fy]=Underbrekkings
+Name[ga]=Idirbhristeacha
+Name[gl]=Interrupcións
+Name[he]=פסיקה
+Name[hi]=इंटरप्ट
+Name[hr]=Presretanja
+Name[hu]=Megszakítások
+Name[is]=Ígrip
+Name[it]=Interrupt
+Name[ja]=割り込み
+Name[ka]=წყვიტავს
+Name[kk]=Үзілімдер
+Name[km]=រំខាន
+Name[ko]=인터럽트
+Name[lo]=ອິນເຕີຣັບ
+Name[lt]=Pertrauktys
+Name[lv]=Pārtraukumi
+Name[mk]=Прекини
+Name[mn]=Тасалдлууд
+Name[ms]=Sampukan
+Name[nb]=Avbruddslinjer
+Name[ne]=रोकावट
+Name[nn]=Avbrot
+Name[nso]=Ditshitiso
+Name[oc]=Interrupcions
+Name[pa]=ਰੁਕਾਵਟ
+Name[pl]=Przerwania
+Name[pt]=Interrupções
+Name[pt_BR]=Interrupções
+Name[ro]=Întreruperi
+Name[ru]=Прерывания
+Name[rw]=Amarogoya
+Name[se]=Gaskkaldumit
+Name[sk]=Prerušenia
+Name[sl]=Prekinitve
+Name[sr]=Прекиди
+Name[sr@Latn]=Prekidi
+Name[sv]=Avbrott
+Name[ta]=குறுக்கீடுகள்
+Name[te]=ఇంటెరప్టులు
+Name[tg]=Қатъ шудан
+Name[th]=อินเตอร์รัพต์
+Name[tr]=Kesmeler
+Name[tt]=Özderülär
+Name[uk]=Перепини
+Name[uz]=Toʻxtalishlar
+Name[uz@cyrillic]=Тўхталишлар
+Name[ven]=Dzithithiso
+Name[vi]=Gián đoạn
+Name[xh]=Iziphazamiso
+Name[zh_CN]=中断
+Name[zh_TW]=中斷
+Name[zu]=Iziphazamiso
+
+Comment=Interrupt information
+Comment[af]=Interrupt informasie
+Comment[ar]=معلومات مفاتيح الإنقطاع
+Comment[az]=Kəsmələr haqqında mə'lumat
+Comment[be]=Інфармацыя аб перапыненнях
+Comment[bg]=Информация за прекъсванията в системата
+Comment[bn]=ইনটরাপ্ট তথ্য
+Comment[br]=Titouroù diwar-benn ar spanoù
+Comment[bs]=Informacije o interaptima
+Comment[ca]=Informació de les interrupcions
+Comment[cs]=Informace o přerušeních
+Comment[csb]=Wëdowiédzô ò przerwaniach
+Comment[cy]=Gwybodaeth Ymyriadau
+Comment[da]=Interrupt-information
+Comment[de]=Informationen zu Interrupts
+Comment[el]=Πληροφορίες για τις διακοπές
+Comment[eo]=Informo pri interrompoj
+Comment[es]=Información sobre las interrupciones
+Comment[et]=Katkestuste info
+Comment[eu]=Etenaldiei buruzko informazioa
+Comment[fa]=اطلاعات وقفه
+Comment[fi]=Keskeytystietoja
+Comment[fr]=Informations sur les interruptions
+Comment[fy]=Underbrekking ynformaasje
+Comment[gl]=Información das interrupcións
+Comment[he]=מידע על בקשת הפסיקה
+Comment[hi]=इंटरप्ट जानकारी
+Comment[hr]=Podaci o presretanjima
+Comment[hu]=A megszakítások jellemzői
+Comment[id]=Informasi interrupt
+Comment[is]=Upplýsingar um ígrip (IRQ)
+Comment[it]=Informazioni sugli interrupt
+Comment[ja]=割り込みの情報
+Comment[ka]=ინფორმაცია შეწყვეტყის შესახებ
+Comment[kk]=Үзілім мәліметі
+Comment[km]=ព័ត៌មាន​រំខាន
+Comment[ko]=인터럽트 정보
+Comment[lo]=ຂໍ້ມູນອິນເຕີຣັບ
+Comment[lt]=Pertraukčių informacija
+Comment[lv]=Pārtraukumu informācija
+Comment[mk]=Информации за прекините
+Comment[mn]=Тасалдлын мэдээллүүд
+Comment[ms]=Maklumat Sampukan
+Comment[mt]=Informazzjoni dwar l-interrupts
+Comment[nb]=Avbruddslinjeinformasjon
+Comment[nds]=Interruptinformatschoon
+Comment[ne]=रोकावट सूचना
+Comment[nl]=Interrupt-informatie
+Comment[nn]=Avbrotsinformasjon
+Comment[nso]=Tshedimoso ya Tshitiso
+Comment[oc]=Informacion de les interrupcions
+Comment[pa]=ਰੁਕਾਵਟ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o przerwaniach
+Comment[pt]=Informação das interrupções
+Comment[pt_BR]=Informações sobre as interrupções
+Comment[ro]=Informații despre întreruperile alocate
+Comment[ru]=Сведения о прерываниях
+Comment[rw]=Ibisobanuro by'irogoya
+Comment[se]=Dieđut gaskkaldumiid birra
+Comment[sk]=Informácie o prerušeniach
+Comment[sl]=Podatki o prekinitvah
+Comment[sr]=Информације о прекидима
+Comment[sr@Latn]=Informacije o prekidima
+Comment[sv]=Avbrottsinformation
+Comment[ta]=குறுக்கீட்டுத தகவல்
+Comment[te]=ఇంటెరప్ట్ సమాచారం
+Comment[tg]=Ахборот дар бораи қатъ шавӣ
+Comment[th]=ข้อมูลอินเตอร์รัพต์
+Comment[tr]=Kesmeler hakkında bilgi
+Comment[tt]=Özgeçlär turında
+Comment[uk]=Інформація щодо перепини
+Comment[uz]=Toʻxtalish haqida maʼlumot
+Comment[uz@cyrillic]=Тўхталиш ҳақида маълумот
+Comment[ven]=U thithisa mafhungo
+Comment[vi]=Thông tin về các gián đoạn
+Comment[wa]=Informåcion so Interrupt
+Comment[xh]=Phazamisa ulwazi
+Comment[zh_CN]=中断信息
+Comment[zh_TW]=中斷資訊
+Comment[zu]=Ulwazi lweziphazamiso
+
+Keywords=Interrupts,IRQ,System Information
+Keywords[af]=Interrupts,IRQ,System Informasie
+Keywords[az]=Kəsmələr,IRQ,Sistem haqqında mə'lumat
+Keywords[be]=Перапыненні,сістэмная інфармацыя,Interrupts,IRQ,System Information
+Keywords[bg]=информация, система, системна, прекъсване, прекъсвания, програмни, Interrupts, IRQ, System Information
+Keywords[br]=spanoù,IRQ,titouroù reizhiad
+Keywords[bs]=Interrupts,IRQ,System Information,informacije o sustavu,interupti
+Keywords[ca]=Interrupcions, IRQ, informació del sistema
+Keywords[cs]=Přerušení,IRQ,Informace o systému
+Keywords[csb]=Przerwania,IRQ,wëdowiédzô ò systemie
+Keywords[cy]=Ymyriadau,IRQ,Gwybodaeth Cysawd
+Keywords[da]=Interrupts,IRQ,Systeminformation
+Keywords[de]=Interrupts,IRQ,Systeminformation
+Keywords[el]=Διακοπές,IRQ,Πληροφορίες συστήματος
+Keywords[eo]=Interrompoj,IRQ,sistemo,informo,operaciumo
+Keywords[es]=Interrupciones,IRQ,Información del sistema
+Keywords[et]=Katkestused,IRQ,Süsteemi informatsioon
+Keywords[eu]=Etenaldiak,IRQ,Sistemaren informazioa
+Keywords[fa]=وقفه‌ها، IRQ، اطلاعات سیستم
+Keywords[fi]=Keskeytykset,IRQ,Järjestelmätiedot
+Keywords[fr]=interruptions,IRQ,informations système,irq
+Keywords[fy]=Underbrekkings,IRQ,systeemynformaasje
+Keywords[gl]=Interrupcións,IRQ,Información do Sistema
+Keywords[he]=בקשת פסיקה,מידע מערכת,IRQ,פסיקה,Interrupts,IRQ,System Information
+Keywords[hi]=इंटरप्ट्स,आईआरक्यू,तंत्र जानकारी
+Keywords[hr]=Interrupts,IRQ,System Information,Presretanja,Podaci o sustavu
+Keywords[hu]=megszakítások,IRQ,rendszerinformáció
+Keywords[id]=Interrupts,IRQ,Informasi Sistem
+Keywords[is]=rofbeiðni,ígrip,IRQ,Interrupt,kerfi,upplýsingar
+Keywords[it]=interrupt,IRQ,informazioni sul sistema
+Keywords[ja]=割り込み,IRQ,システムの情報
+Keywords[ka]=წყვიტავს,IRQ,ინფორმაცია სისტემის შესახებ
+Keywords[km]=រំខាន,IRQ,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[ko]=인터럽트,IRQ,시스템 정보
+Keywords[lo]=ອິນເຕີຣັບ,IRQ,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=Pertrauktys,IRQ,Sistemos Informacija
+Keywords[lv]=Pārtraukumi,IRQ,Sistēmas Informācija
+Keywords[mk]=Interrupts,IRQ,System Information,Прекини,Информации за системот
+Keywords[mn]=Тасалдлууд,IRQ,Системийн мэдээлэл
+Keywords[nb]=Avbrudd,IRQ,Systeminformasjon
+Keywords[nds]=Interrupts,IRQ,Systeeminformatschoon
+Keywords[ne]=रोकावट, IRQ, प्रणाली सूचना
+Keywords[nl]=interrupts,IRQ,systeeminformatie
+Keywords[nn]=avbrot,IRQ,systeminformasjon
+Keywords[nso]=Ditshitiso,IRQ,Tshedimoso ya System
+Keywords[oc]=Interrupcions, IRQ, informacion dèu sistemo
+Keywords[pa]=Interrupts,IRQ,ਸਿਸਟਮ ਜਾਣਕਾਰੀ,ਰੁਕਾਵਟ
+Keywords[pl]=Przerwania,IRQ,informacja o systemie
+Keywords[pt]=interrupções,IRQ,informações sobre o sistema
+Keywords[pt_BR]=Interrupções,IRQ,Informações do sistema
+Keywords[ro]=întreruperi,IRQ,informații despre sistem
+Keywords[rw]=Amarogoya,IRQ,Amakuru Sisitemu
+Keywords[se]=Gaskkaldumit,IRQ,vuogádatdieđut
+Keywords[sk]=Prerušenia,IRQ,Systémové informácie
+Keywords[sl]=prekinitve,IRQ,sistemski podatki
+Keywords[sr]=Interrupts,IRQ,System Information,прекиди,системске информације
+Keywords[sr@Latn]=Interrupts,IRQ,System Information,prekidi,sistemske informacije
+Keywords[sv]=Avbrott,IRQ,Systeminformation
+Keywords[ta]=குறுக்கீடுகள்,IRQ, கணினித் தகவல்
+Keywords[te]=ఇంటెరప్ట్, ఐ ఆర్ క్యు, వ్యవస్థ సమాచారం
+Keywords[th]=อินเตอร์รัพต์,IRQ,ข้อมูลระบบ
+Keywords[tr]=Kesmeler,IRQ,Sistem hakkında bilgi
+Keywords[uk]=перепини,interrupts,irq,system-information
+Keywords[uz]=Toʻxtalishlar,IRQ,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=Тўхталишлар,IRQ,Тизим ҳақида маълумот
+Keywords[ven]=U thithisa,IRQ,Mafhungo a Sisitemu
+Keywords[vi]=Gián đoạn,IRQ,Thông tin Hệ thống
+Keywords[wa]=Interrupts,IRQ,informåcion do sistinme
+Keywords[xh]=Iziphazamiso,IRQ,Ulwazi lwendlela
+Keywords[zh_CN]=Interrupts,中断,IRQ,System Information,系统信息
+Keywords[zh_TW]=Interrupts,IRQ,System Information,中斷,系統資訊
+Keywords[zu]=Iziphazamiso,IRQ,Ulwazi lwesistimu
+
diff --git a/kcontrol/info/ioports.desktop b/kcontrol/info/ioports.desktop
new file mode 100644
index 000000000..f66b81288
--- /dev/null
+++ b/kcontrol/info/ioports.desktop
@@ -0,0 +1,242 @@
+[Desktop Entry]
+Exec=kcmshell ioports
+Icon=kcmmemory
+Type=Application
+DocPath=kinfocenter/ioports/index.html
+Categories=Qt;KDE;X-KDE-information;
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=ioports
+X-KDE-ParentApp=kinfocenter
+
+Name=IO-Ports
+Name[af]=Io-poorte
+Name[ar]=منافذ الإدخال و الإخراج
+Name[az]=G/Ç Qapıları
+Name[be]=Парты ўводу/вываду
+Name[bg]=Вход/изход
+Name[br]=Porzhioù ED
+Name[bs]=IO-Portovi
+Name[ca]=Ports E/S
+Name[cs]=Vstupně/výstupní-porty
+Name[csb]=Pòrtë wéńdzeniô/wińdzeniô
+Name[cy]=Pyrth-IO
+Name[da]=IO-porte
+Name[de]=Ein/Ausgabe-Ports
+Name[el]=Θύρες Ι/Ο
+Name[eo]=Eneligaj-pordoj
+Name[es]=Puertos de E/S
+Name[et]=IO pordid
+Name[eu]=IO-atakak
+Name[fa]=درگاههای ورودی خروجی
+Name[fi]=IO-portit
+Name[fr]=Ports d'entrées / sorties
+Name[fy]=IO-Poarten
+Name[ga]=Poirt I/A
+Name[gl]=Portos de E/S
+Name[he]=קלט־פלט
+Name[hi]=आईओ-पोर्ट्
+Name[hr]=IO portovi
+Name[hu]=IO-portok
+Name[id]=Port-IO
+Name[is]=Inn-/úttaksport
+Name[it]=Porte di I/O
+Name[ja]=IO ポート
+Name[ka]=IO–პორტები
+Name[kk]=Енгізу-шығару порттары
+Name[km]=ច្រក IO
+Name[ko]=IO 포트
+Name[lo]=ພອດ IO
+Name[lt]=IO-portai
+Name[lv]=IO-Porti
+Name[mk]=В/И-порти
+Name[mn]=Оролт/Гаралтын-портууд
+Name[ms]=Port IO
+Name[nb]=IO-porter
+Name[nds]=IO-Porten
+Name[ne]=IO-पोर्ट
+Name[nl]=IO-Poorten
+Name[nn]=IU-portar
+Name[nso]=Maboemong a IO
+Name[oc]=Ports E/S
+Name[pa]=IO-ਪੋਰਟ
+Name[pl]=Porty wejścia/wyjścia
+Name[pt]=Portos de E/S
+Name[pt_BR]=Portas de E/S
+Name[ro]=Porturi I/O
+Name[ru]=Порты ввода/вывода
+Name[rw]=Imiyoboro-IO
+Name[se]=SO-verráhat
+Name[sk]=V/V porty
+Name[sl]=V/I vrata
+Name[sr]=IO портови
+Name[sr@Latn]=IO portovi
+Name[ss]=Tikhungo te-IO
+Name[sv]=I/O-portar
+Name[ta]=IO-முனையங்கள்
+Name[te]=ఐఓ-పోర్టులు
+Name[tg]=Даргоҳҳои дохил/баромад
+Name[th]=พอร์ตข้อมูลเข้า/ออก
+Name[tr]=G/Ç Portları
+Name[tt]=Kerü/Çığu Portları
+Name[uk]=Порти В/В
+Name[uz]=K/Ch portlar
+Name[uz@cyrillic]=К/Ч портлар
+Name[vi]=Cổng vào ra (VR)
+Name[wa]=Pôrts I/R
+Name[xh]=IO-Ufako
+Name[zh_CN]=IO 端口
+Name[zu]=Izikhumulo-IO
+
+Comment=IO-port information
+Comment[af]=Io-poort informasie
+Comment[ar]=معلومات منافذ الإدخال و الإخارج
+Comment[az]=Giriş Çıktı portları haqqında mə'lumat
+Comment[be]=Інфармацыя аб партах уводу/вываду
+Comment[bg]=Информация за входно-изходните портове
+Comment[bn]=আই-ও পোর্ট সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn ar porzhioù ED
+Comment[bs]=Informacije o IO-portovima
+Comment[ca]=Informació dels ports E/S
+Comment[cs]=Informace o vstupně/výstupních-portech
+Comment[csb]=Wëdowiédzô ò pòrtach wéńdzeniô/wińdzeniô
+Comment[cy]=Gwybodaeth Porth-IO
+Comment[da]=IO-portinformation
+Comment[de]=Informationen zu benutzten Ein/Ausgabe-Ports
+Comment[el]=Πληροφορίες για τις θύρες εισόδου-εξόδου
+Comment[eo]=Informo pri Eneligaj-pordoj
+Comment[es]=Información sobre los puertos de E/S
+Comment[et]=IO portide info
+Comment[eu]=IO-atakei buruzko informazioa
+Comment[fa]=اطلاعات درگاههای ورودی خروجی
+Comment[fi]=IO-porttitiedot
+Comment[fr]=Informations sur les ports d'entrées / sorties
+Comment[fy]=IO-poarteynformaasje
+Comment[ga]=Eolas faoi Phoirt I/A
+Comment[gl]=Información dos portos de E/S
+Comment[he]=מידע על יציאות הקלט־פלט
+Comment[hi]=आईओ-पोर्ट् जानकारी
+Comment[hr]=Podaci o IO portovima
+Comment[hu]=A ki- és bemeneti portok jellemzői
+Comment[id]=Informasi Port-IO
+Comment[is]=Upplýsingar um inn-/úttaksport
+Comment[it]=Informazioni sulle porte di I/O
+Comment[ja]=IO ポートの情報
+Comment[ka]=ინფორმაცია IO–პორტების შესახებ
+Comment[kk]=Енгізу-шығару порттар мәліметі
+Comment[km]=ព័ត៌មាន​ច្រក IO
+Comment[ko]=IO-주소 정보
+Comment[lo]=ຂໍ້ມູນພັອດ IO
+Comment[lt]=IO-porto informacija
+Comment[lv]=IO-portu informācija
+Comment[mk]=Информации за влезно/излезните порти
+Comment[mn]=Хэрэглэгдсэн Оролт/Гаралтын-портын мэдээлэл
+Comment[ms]=Maklumat port IO
+Comment[mt]=Informazzjoni dwar IO-port
+Comment[nb]=IO-portinformasjon
+Comment[nds]=IO-Port-Informatschoon
+Comment[ne]=IO-पोर्ट सूचना
+Comment[nl]=IO-poortinformatie
+Comment[nn]=IU-port-informasjon
+Comment[nso]=Tshedimoso ya maboemong a IO
+Comment[oc]=Informacion dèus ports E/S
+Comment[pa]=IO-ਪੋਰਟ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o portach wejścia/wyjścia
+Comment[pt]=Informação sobre os portos de E/S
+Comment[pt_BR]=Informações sobre as portas de E/S
+Comment[ro]=Informații despre porturile I/O
+Comment[ru]=Сведения о портах ввода/вывода
+Comment[rw]=Ibisobanuro by'umuyoboro-IO
+Comment[se]=SO-verráhatdieđut
+Comment[sk]=Informácie o IO portoch
+Comment[sl]=Podatki o vhodno/izhodnih vratih
+Comment[sr]=Информације о IO портовима
+Comment[sr@Latn]=Informacije o IO portovima
+Comment[sv]=Information om I/O-portar
+Comment[ta]=IO-முனைய தகவல்
+Comment[te]=ఐఓ-పోర్టుల సమాచారం
+Comment[tg]=Иттилооти даргоҳиҳои дохил/баромад
+Comment[th]=ข้อมูลพอร์ตข้อมูลเข้า/ออก
+Comment[tr]=Girdi Çıktı portları hakkında bilgi
+Comment[tt]=Kerü/çığu portları turında
+Comment[uk]=Інформація щодо портів вводу/виводу
+Comment[uz]=Kirish/chiqish portlar haqida maʼlumot
+Comment[uz@cyrillic]=Кириш/чиқиш портлар ҳақида маълумот
+Comment[ven]=Mafhungo a IO-port
+Comment[vi]=Thông tin về cổng VR
+Comment[wa]=Informåcion so les pôrts d' Intrêye/Rexhowe
+Comment[xh]=IO-ulwazi lwezibuko
+Comment[zh_CN]=IO 端口信息
+Comment[zh_TW]=IO-Port 資訊
+Comment[zu]=Ulwazi lwe-isikhumulo-IO
+
+Keywords=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information
+Keywords[af]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Informasie
+Keywords[az]=GÇ,G/Ç,GÇ Qapıları,G/Ç Qapıları, Qapılar,GÇ-Aralığı,G/Ç-Aralığı,Sistem
+Keywords[be]=Увод'вывад,парты ўводу/вываду,парты,сістэмная інфармацыя,IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information
+Keywords[bg]=информация, система, системна, вход, входно, изход, изходно, порт, портове, IO, I/O, IO-Ports, I/O-Ports, Ports, IO-Range, I/O-Range, System Information
+Keywords[br]=ED,E/D,porzhioù E/D,porzhioù,rummad ED,rummadE/D,titouroù ar reizhiad
+Keywords[bs]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,IO-portovi,I/O-portovi,portovi,IO-raspon,I/O-raspon,informacije o sustavu
+Keywords[ca]=ES,E/S,Ports d'ES,Ports d'E/S,Ports,Abast d'ES,Abast d'E/S,Informació del sistema
+Keywords[cs]=IO,I/O,IO-porty,I/O-porty,Porty,Rozsah IO,Rozsah I/O,Informace o systému
+Keywords[csb]=IO,I/O,pòrtë IO,pòrtë I/O,portë,òbjim IO,òbjim I/O,wëdowiédzô ò systemie
+Keywords[cy]=IO,I/O,Pyrth-IO,Pyrth-I/O,Pyrth,Amrediad-IO,Amrediad-I/O,Gwybodaeth Cysawd
+Keywords[da]=IO,I/O,IO-porte,I/O-Porte,Porte,IO-område,I/O-område,Systeminformation
+Keywords[de]=Ein/Ausgabe,IO,I/O,IO-ports,I/O-Ports,Ports,IO-Bereich,I/O-Bereich,Systeminformation
+Keywords[el]=ΕΕ,Ε/Ε,Θύρες ΕΕ,Θύρες Ε/Ε,Θύρες,Εύρος ΕΕ,Εύρος Ε/Ε,Πληροφορίες συστήματος
+Keywords[eo]=IO,I/O,en,el,eneligo,pordoj,sistemo,operaciumo,informo
+Keywords[es]=ES,E/S,Puertos de ES,Puertos de E/S,Puertos,Intervalo de ES,Intervalo de E/S,Información del sistema
+Keywords[et]=IO,I/O,IO pordid,I/O pordid,pordid,IO piirkond,I/O piirkond,Süsteemi info
+Keywords[eu]=IO,I/O,IO-atakak,Atakak,IO-barrutia,I/O-barrutia,Sistemaren informazioa
+Keywords[fa]=ورودی خروجی، ورودی/خروجی، درگاههای ورودی خروجی، درگاهها، گسترۀ ورودی خروجی، گسترۀ ورودی/خروجی، اطلاعات سیستم
+Keywords[fi]=IO,I/O,IO-Portit,I/O-Portit,Portit,I/O-alue,Järjestelmätiedot
+Keywords[fr]=io,i/o,entrées-sorties,ports,ports d'entrées-sorties,informations système,plage d'entrées-sorties
+Keywords[fy]=IO,I/O,IO-Ports,I/O-Ports,ports,IO-Range,I/O-Range,systeemynformaasje,IO-poarten
+Keywords[gl]=IO,I/O,E/S,Portos IO,Portos E/S,Rango IO,Rango E/S,Información do Sistema
+Keywords[he]=קלט־פלט,יציאות קלט־פלט,יציאות,טווח קלט־פלט,מידע,מערכת,IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information
+Keywords[hi]=आईओ,आई/ओ,आईओ-पोर्ट्,आई/ओ-पोर्ट्,पोर्ट्,आईओ-रेंज,आई/ओ-रेंज,तंत्र जानकारी
+Keywords[hr]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,IO portovi,IO raspon,Podaci o sustavu
+Keywords[hu]=IO,I/O,IO-portok,I/O-portok,portok,IO-tartomány,I/O tartomány,rendszerinformáció
+Keywords[id]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,Informasi Sistem
+Keywords[is]=Inntak,úttak,I/O,Port,upplýsingar,kerfi
+Keywords[it]=IO,I/O,porte di IO,porte di I/O,porte,intervallo di IO,intervallo di I/O,informazioni sul sistema
+Keywords[ja]=IO,I/O,IO-ポート,I/O-ポート,ポート,IO-レンジ,I/O-レンジ,システムの情報
+Keywords[km]=IO,I/O,ច្រក IO,ច្រក I/O,ច្រក,ជួរ IO,ជួរ I/O,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lt]=IO,I/O,IO-Ports,IO-portai,I/O-Ports,I/O-prievadai,Ports,prievadai,IO-Range,IO zona,I/O-Range,I/O zona,System Information,sisteminė informacija
+Keywords[lv]=IO,I/O,IO-Porti,I/O-Porti,Porti,IO-Diapazons,I/O-Diapazons,Sistēmas Informācija
+Keywords[mk]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,ВИ,В/И,ВИ-порти,В/И-порти,Порти,В/И-опсег,В/И-опсег,Информации за системот
+Keywords[mn]=Оролт/Гаралт,IO,I/O,IO-порт,I/O-Порт,Портууд,IO-талбар,I/O-талбар, Системийн мэдээлэл
+Keywords[nb]=IO,I/O,IO-porter,I/O-porter,port,IO-område,I/O-område,IU,I/U,IU-porter,I/U-porter,port,IU-område,I/U-område,Systeminformasjon
+Keywords[nds]=IO,I/O,IO-Porten,I/O-Porten,Porten,IO-Range,I/O-Range,IO-Rebeet,I/O-Rebeet,Systeeminformatschoon
+Keywords[ne]=IO, I/O, IO-पोर्टहरू, I/O-पोर्टहरू, पोर्टहरू, IO-दायरा, आगत/निर्गत दायरा, प्रणाली सूचना
+Keywords[nl]=IO,I/O,IO-Ports,I/O-Ports,ports,IO-Range,I/O-Range,systeeminformatie,IO-poorten
+Keywords[nn]=IU,I/U,IO,I/O,IU-portar,I/U-portar,portar,IU-område,I/U-område,systeminformasjon
+Keywords[nso]=IO,I/O,Maboemong a IO,Maboemong a I/O,Maboemong,IO-Range, Tshedimoso ya I/O-Range,Tshedimoso ya System
+Keywords[oc]=ES,E/S,Ports d'ES,Ports d'E/S,Ports,Rang d'ES,Rang d'E/S,Informacion dèu sistemo
+Keywords[pa]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=IO,I/O,porty IO,porty I/O,porty,zakres IO,zakres I/O,informacja o systemie
+Keywords[pt]=ES,E/S,portos E/S,portos,gama de E/S,informações de sistema
+Keywords[pt_BR]=ES,E/S,Portas E/S,Portas de E/S,Portas,Faixa de E/S,Faixa de E/S,Informações de sistema
+Keywords[ro]=I/E,IE,IO,I/O,porturi IO,porturi,domeniu IO,domeniu I/O,informații despre sistem
+Keywords[rw]=IO,I/O,Imiyoboro-IO,Imiyoboro-I/O,Imiyoboro,Igice-IO,Igice-I/O, Amakuru Sisitemu
+Keywords[se]=SO,S/O,IO,I/O,SO-verráhat,S/O-verráhat,verráhat,SO-gaska,S/O-gaska, vuogádatdiehtu
+Keywords[sk]=IO,I/O,IO-Ports,I/O-Porty,Porty,IO-Range,I/O-Range,Systém Informácie
+Keywords[sl]=VI,V/I,V/I-vrata,VI-vrata,vrata,VI-obseg,V/I-obseg,informacije o sistemu
+Keywords[sr]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,портови,порт,системске информације
+Keywords[sr@Latn]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,portovi,port,sistemske informacije
+Keywords[sv]=IO,I/O,IO-portar,I/O-portar,Ports,IO-område,I/O-område,Systeminformation
+Keywords[ta]=IO,I/O,IO-முனையங்கள்,I/O-முனையங்கள்,முனையங்கள்,IO-நிலை,I/O-நிலை,அமைப்பு தகவல்
+Keywords[th]=นำเข้านำออก,นำเข้า/นำออก,พอร์ตนำเข้านำออก,พอร์ตนำเข้า/นำออก,พอร์ต, แนวการนำเข้านำออก,แนวการนำเข้า/นำออก,ข้อมูลระบบ
+Keywords[tr]=GÇ,G/Ç,GÇ Portları,G/Ç Portları, Portlar,GÇ-Aralığı,G/Ç-Aralığı,Sistem
+Keywords[uk]=порти вводу/виводу,ВВ,в/в,порти,io,i/o,io-ports,i/p-ports,ports,system information
+Keywords[uz]=K/Ch portlar,Portlar,K/Ch chegarasi,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=К/Ч портлар,Портлар,К/Ч чегараси,Тизим ҳақида маълумот
+Keywords[ven]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,Mafhungo a Sisitemu
+Keywords[vi]=VR,V/R,Cổng VR,Cổng V/R,Cổng,Vùng VR,Vùng VR,Thông tin Hệ thống
+Keywords[wa]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,Sinformåcion do sistinme,I/R,poirts I/R,pôrts I/R,pôrts,poirts
+Keywords[xh]=IO,I/O,IO-Amazibuko,I/O-Amazibuko,Amazibuko,IO-Beka ngendlela,Ulwazi lwendlela
+Keywords[zh_CN]=IO,I/O,IO-Ports,I/O-Ports,Ports,IO-Range,I/O-Range,System Information,IO 端口,I/O 端口,端口,IO 范围,I/O 范围,系统信息
+Keywords[zh_TW]=IO,I/O,IO-Ports,Ports,IO-Range,I/O-Range,System Information,IO 範圍,I/O 範圍,系統資訊
+Keywords[zu]=IO,I/O,Izikhumulo-IO,Izikhumulo-I/O,Izikhumulo,IO-Umbandela,I/O-Umbandela, Ulwazi Lwesistimu
+
diff --git a/kcontrol/info/main.cpp b/kcontrol/info/main.cpp
new file mode 100644
index 000000000..7992fbc37
--- /dev/null
+++ b/kcontrol/info/main.cpp
@@ -0,0 +1,151 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <[email protected]>
+ *
+ * Requires the Qt widget libraries, available at no cost at
+ * http://www.troll.no/
+ *
+ * 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"
+
+
+/* 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"
+
+
+extern "C"
+{
+
+ KDE_EXPORT KCModule *create_cpu(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_CPU_AVAILABLE
+ return new KInfoListWidget(i18n("Processor(s)"), parent, "kcminfo", GetInfo_CPU);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_irq(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_IRQ_AVAILABLE
+ return new KInfoListWidget(i18n("Interrupt"), parent, "kcminfo", GetInfo_IRQ);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_pci(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_PCI_AVAILABLE
+ return new KInfoListWidget(i18n("PCI"), parent, "kcminfo", GetInfo_PCI);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_dma(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_DMA_AVAILABLE
+ return new KInfoListWidget(i18n("DMA-Channel"), parent, "kcminfo", GetInfo_DMA);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_ioports(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_IOPORTS_AVAILABLE
+ return new KInfoListWidget(i18n("I/O-Port"), parent, "kcminfo", GetInfo_IO_Ports);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_sound(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_SOUND_AVAILABLE
+ return new KInfoListWidget(i18n("Soundcard"), parent, "kcminfo", GetInfo_Sound);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_scsi(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_SCSI_AVAILABLE
+ return new KInfoListWidget(i18n("SCSI"), parent, "kcminfo", GetInfo_SCSI);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_devices(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_DEVICES_AVAILABLE
+ return new KInfoListWidget(i18n("Devices"), parent, "kcminfo", GetInfo_Devices);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_partitions(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_PARTITIONS_AVAILABLE
+ return new KInfoListWidget(i18n("Partitions"), parent, "kcminfo", GetInfo_Partitions);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_xserver(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_XSERVER_AVAILABLE
+ return new KInfoListWidget(i18n("X-Server"), parent, "kcminfo", GetInfo_XServer_and_Video);
+#else
+ return 0;
+#endif
+ }
+
+ KDE_EXPORT KCModule *create_memory(QWidget *parent, const char * /*name*/)
+ {
+ return new KMemoryWidget(parent, "kcminfo");
+ }
+
+ KDE_EXPORT KCModule *create_opengl(QWidget *parent, const char * )
+ {
+#ifdef INFO_OPENGL_AVAILABLE
+ return new KInfoListWidget(i18n("OpenGL"), parent, "kcminfo", GetInfo_OpenGL);
+#else
+ return 0;
+#endif
+ }
+
+/* create_cdinfo function for CD-ROM Info ~Jahshan */
+ KDE_EXPORT KCModule *create_cdinfo(QWidget *parent, const char * /*name*/)
+ {
+#ifdef INFO_CD_ROM_AVAILABLE
+ return new KInfoListWidget(i18n("CD-ROM Info"), parent, "kcminfo", GetInfo_CD_ROM);
+#else
+ return 0;
+#endif
+ }
+
+}
diff --git a/kcontrol/info/memory.cpp b/kcontrol/info/memory.cpp
new file mode 100644
index 000000000..9743087dd
--- /dev/null
+++ b/kcontrol/info/memory.cpp
@@ -0,0 +1,480 @@
+/*
+ * memory.cpp
+ *
+ * prints memory-information and shows a graphical display.
+ *
+ * Copyright (c) 1999-2002 Helge Deller <[email protected]>
+ *
+ * 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.h>
+#include <qpainter.h>
+#include <qdrawutil.h>
+#include <qtooltip.h>
+
+#include <kglobal.h>
+#include <kdialog.h>
+#include <kseparator.h>
+
+#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 update()-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 QWidget *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 GB").arg(KGlobal::locale()->formatNumber(value / (1024 * 1024 * 1024.0), 2));
+ else
+ return i18n("%1 MB").arg(KGlobal::locale()->formatNumber(value / (1024 * 1024.0), 2));
+ else
+ return i18n("%1 KB").arg(KGlobal::locale()->formatNumber(value / 1024.0, 2));
+}
+
+KMemoryWidget::KMemoryWidget(QWidget * parent, const char *name)
+: KCModule(parent, name)
+{
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcminfo"),
+ I18N_NOOP("KDE Panel Memory Information Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1998 - 2002 Helge Deller"));
+
+ about->addAuthor("Helge Deller", 0, "[email protected]");
+ 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, 0, 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, 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(AlignLeft);
+ vbox->addWidget(Widget, 1);
+ }
+
+ /* then the memory-content-widgets */
+ for (j = 0; j < 2; j++) {
+ vbox = new QVBoxLayout(hbox, 0);
+ for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i) {
+ if (i == SWAP_MEM)
+ vbox->addSpacing(SPACING);
+ Widget = new QLabel(this);
+ Widget->setAlignment(AlignRight);
+ MemSizeLabel[i][j] = Widget;
+ vbox->addWidget(Widget, 1);
+ }
+ }
+
+ /* stretch the right side */
+ hbox->addStretch();
+
+ KSeparator *line = new KSeparator(KSeparator::HLine, this);
+ top->addWidget(line);
+
+ /* now the Graphics */
+ QString hint;
+ hbox = new QHBoxLayout(top, 1);
+ for (i = MEM_RAM_AND_HDD; i < MEM_LAST; i++) {
+ hbox->addSpacing(SPACING);
+ vbox = new QVBoxLayout(hbox);
+
+ 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>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.");
+ 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.");
+ break;
+ default:
+ hint = title = QString::null;
+ break;
+ };
+
+ if (hint.length())
+ hint = "<qt>" + hint + "</qt>";
+
+ Widget = new QLabel("<b>" + title + "</b>", this);
+ Widget->setAlignment(AlignCenter);
+ QToolTip::add(Widget, hint);
+ vbox->addWidget(Widget);
+ vbox->addSpacing(SPACING / 2);
+
+ QWidget *g = new QWidget(this);
+ g->setMinimumWidth(2 * SPACING);
+ g->setMinimumHeight(3 * SPACING);
+ g->setBackgroundMode(NoBackground);
+ QToolTip::add(g, hint); // add the tooltip
+ Graph[i] = g;
+ vbox->addWidget(g, 2);
+ vbox->addSpacing(SPACING / 2);
+
+ Widget = new QLabel(this); /* xx MB used. */
+ Widget->setAlignment(AlignCenter);
+ QToolTip::add(Widget, 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_Values()));
+
+ update();
+}
+
+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)
+{
+ QWidget *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;
+
+#ifdef HAVE_LONG_LONG
+ percent = (((long long)last_used) * 100) / total;
+#else
+ /* prevent integer overflow with usage of double type */
+ percent = (int) ((((double)last_used) * 100) / total);
+#endif
+
+ 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,
+ AlignCenter | WordBreak,
+ 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();
+ bitBlt(graph, 0, 0, &pm);
+
+ GraphLabel[widgetindex]->setText(i18n("%1 free").arg(formatted_unit(last_used)));
+
+ return true;
+}
+
+/* update_Values() is the main-loop for updating the Memory-Information */
+void KMemoryWidget::update_Values()
+{
+ int i;
+ bool ok1;
+ QLabel *label;
+ t_memsize used[5];
+
+ update(); /* 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 =").
+ arg(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::update()
+{
+ int i;
+ for (i = TOTAL_MEM; i < MEM_LAST_ENTRY; ++i)
+ Memory_Info[i] = NO_MEMORY_INFO;
+}
+
+#endif
+#include "memory.moc"
diff --git a/kcontrol/info/memory.desktop b/kcontrol/info/memory.desktop
new file mode 100644
index 000000000..f9aca9869
--- /dev/null
+++ b/kcontrol/info/memory.desktop
@@ -0,0 +1,248 @@
+[Desktop Entry]
+Exec=kcmshell memory
+Icon=kcmmemory
+Type=Application
+DocPath=kinfocenter/memory/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=memory
+X-KDE-ParentApp=kinfocenter
+
+Name=Memory
+Name[af]=Geheue
+Name[ar]=الذاكرة
+Name[az]=Yaddaş
+Name[be]=Памяць
+Name[bg]=Памет
+Name[bn]=মেমরি
+Name[br]=Memor
+Name[bs]=Memorija
+Name[ca]=Memòria
+Name[cs]=Paměť
+Name[csb]=Pamiãc
+Name[cy]=Cof
+Name[da]=Hukommelse
+Name[de]=Speicher
+Name[el]=Μνήμη
+Name[eo]=Memoro
+Name[es]=Memoria
+Name[et]=Mälu
+Name[eu]=Memoria
+Name[fa]=حافظه
+Name[fi]=Muisti
+Name[fr]=Mémoire
+Name[fy]=Unthâld
+Name[ga]=Cuimhne
+Name[gl]=Memória
+Name[he]=זיכרון
+Name[hi]=मेमोरी
+Name[hr]=Memorija
+Name[hu]=Memória
+Name[is]=Minni
+Name[it]=Memoria
+Name[ja]=メモリ
+Name[ka]=მეხსიერება
+Name[kk]=Жады
+Name[km]=សតិ
+Name[ko]=메모리
+Name[lo]=ຫນ່ວຍຄວາມຈຳ
+Name[lt]=Atmintis
+Name[lv]=Atmiņa
+Name[mk]=Меморија
+Name[mn]=Санах ой
+Name[ms]=Ingatan
+Name[mt]=Memorja
+Name[nb]=Minne
+Name[nds]=Spieker
+Name[ne]=स्मृति
+Name[nl]=Geheugen
+Name[nn]=Minne
+Name[nso]=Kelelo
+Name[oc]=Memòria
+Name[pa]=ਮੈਮੋਰੀ
+Name[pl]=Pamięć
+Name[pt]=Memória
+Name[pt_BR]=Memória
+Name[ro]=Memorie
+Name[ru]=Память
+Name[rw]=Umwanyabubiko
+Name[se]=Muitu
+Name[sk]=Pamäť
+Name[sl]=Pomnilnik
+Name[sr]=Меморија
+Name[sr@Latn]=Memorija
+Name[ss]=Inkhumbulo
+Name[sv]=Minne
+Name[ta]=நினைவு
+Name[te]=మెమొరి
+Name[tg]=Хотира
+Name[th]=หน่วยความจำ
+Name[tr]=Bellek
+Name[tt]=Xäter
+Name[uk]=Пам'ять
+Name[uz]=Xotira
+Name[uz@cyrillic]=Хотира
+Name[ven]=Muhumbulo
+Name[vi]=Bộ nhớ
+Name[wa]=Memwere
+Name[xh]=Inkumbulo
+Name[zh_CN]=内存
+Name[zh_TW]=記憶體
+Name[zu]=Inkumbulo
+
+Comment=Memory information
+Comment[af]=Geheue informasie
+Comment[ar]=معلومات الذاكرة
+Comment[az]=Yaddaş haqqında mə'lumat
+Comment[be]=Інфармацыя аб памяці
+Comment[bg]=Информация за системната памет
+Comment[bn]=মেমরি সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn ar memor
+Comment[bs]=Informacije o memoriji
+Comment[ca]=Informació de la memòria
+Comment[cs]=Informace o paměti
+Comment[csb]=Wëdowiédzô ò pamiãcë
+Comment[cy]=Gwybodaeth Cof
+Comment[da]=Information om hukommelsen
+Comment[de]=Informationen zum Speicher
+Comment[el]=Πληροφορίες για τη Μνήμη
+Comment[eo]=Informo pri memoro
+Comment[es]=Información sobre la memoria
+Comment[et]=Mäluga seotud info
+Comment[eu]=Memoriari buruzko informazioa
+Comment[fa]=اطلاعات حافظه
+Comment[fi]=Tietoja muistista
+Comment[fr]=Informations sur la mémoire
+Comment[fy]=Unthâld ynformaasje
+Comment[gl]=Información da memória
+Comment[he]=מידע על הזיכרון
+Comment[hi]=मेमोरी जानकारी
+Comment[hr]=Podaci o memoriji
+Comment[hu]=A memória jellemzői
+Comment[id]=Informasi Memory
+Comment[is]=Upplýsingar um vinnsluminni
+Comment[it]=Informazioni sulla memoria
+Comment[ja]=メモリの情報
+Comment[ka]=ინფორმაცია მეხსიერების შესახებ
+Comment[kk]=Жад мәліметі
+Comment[km]=ព័ត៌មាន​សតិ
+Comment[ko]=메모리 정보
+Comment[lo]=ຂໍ້ມູນຫນ່ວຍຄວາມຈຳ
+Comment[lt]=Atminties informacija
+Comment[lv]=Atmiņas informācija
+Comment[mk]=Информации за меморијата
+Comment[mn]=Санах ойн мэдээлэл
+Comment[ms]=Maklumat ingatan
+Comment[mt]=Informazzjoni dwar memorja
+Comment[nb]=Minneinformasjon
+Comment[nds]=Informatschoon över den Spieker
+Comment[ne]=स्मृति सूचना
+Comment[nl]=Geheugeninformatie
+Comment[nn]=Minneinformasjon
+Comment[nso]=Tshedimoso ya Kelelo
+Comment[oc]=Informacion de la memòria
+Comment[pa]=ਮੈਮੋਰੀ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o pamięci
+Comment[pt]=Informações sobre a memória
+Comment[pt_BR]=Informações sobre memória
+Comment[ro]=Informații despre utilizarea memoriei
+Comment[ru]=Сведения о использовании памяти
+Comment[rw]=Ibisobanuro by'umwanyabubiko
+Comment[se]=Muitodiehtu
+Comment[sk]=Informácie o pamäti
+Comment[sl]=Podatki o pomnilniku
+Comment[sr]=Информације о меморији
+Comment[sr@Latn]=Informacije o memoriji
+Comment[ss]=Umniningwane wenkhumbulo
+Comment[sv]=Minnesinformation
+Comment[ta]=நினைவுத் தகவல்
+Comment[te]=మెమొరి సమాచారం
+Comment[tg]=Иттилооти хотира
+Comment[th]=ข้อมูลหน่วยความจำ
+Comment[tr]=Bellek hakkında bilgi
+Comment[tt]=Xäter turında
+Comment[uk]=Інформація щодо пам'яті
+Comment[uz]=Xotira haqida maʼlumot
+Comment[uz@cyrillic]=Хотира ҳақида маълумот
+Comment[ven]=Muhumbulo wa mafhungo
+Comment[vi]=Thông tin về bộ nhớ
+Comment[wa]=Informåcion sol memwere
+Comment[xh]=Ulwazi lwenkumbulo
+Comment[zh_CN]=内存信息
+Comment[zh_TW]=記憶體資訊資訊
+Comment[zu]=Ulwazi lwenkumbulo
+
+Keywords=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information
+Keywords[af]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Informasie
+Keywords[ar]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,الذاكرة,ذاكرة,لاذاكرة العشوائية,الذاكرة الافتراضية,الذاكرة المادية,الذاكرة المشتركة,التبديل, معلومات النظام
+Keywords[az]=Yaddaş,RAM,Virtual yaddaş,Fiziki yaddaş,Paylaşılan yaddaş,Dəyiş-toqquş Haqqında Mə'lumat
+Keywords[be]=Памяць,віртуальная памяць,фізічная памяць,падкачка,сістэмная інфармацыя,Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information
+Keywords[bg]=информация, система, системна, памет, физическа, виртуална, кеш, реална, Memory, RAM, Virtual memory, Physical memory, Shared memory, Swap, System Information
+Keywords[br]=memor,RAM,memor c'halloudel,memor fizikel,memor rannet,disloañ,titouroù reizhiad
+Keywords[bs]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,memorija,fizička memorija,informacije o sustavu,dijeljena memorija
+Keywords[ca]=Memòria,RAM,Memòria virtual,memòria física,memòria compartida,intercanvi,Informació del sistema
+Keywords[cs]=Paměť,RAM,Virtuální paměť,Fyzická paměť,Sdílená paměť,Swap,Informace o systému
+Keywords[csb]=pamiãc,RAM,wirtualnô pamiãc,fizycznô pamiãc,zbiérnô pamiãc,lopk wëmianë,particëjô wëmianë,wëdowiédzô ò systemie
+Keywords[cy]=Cof,RAM,Cof rhith,Cof corfforol,Cof cyfrannol,Swap,Gwybodaeth Cysawd
+Keywords[da]=Hukommelse,Ram,Virtuel hukommelse,Fysisk hukommelse,Delt hukommelse,Swap,Systeminformation
+Keywords[de]=Speicher,RAM,Virtueller Speicher,Physischer Speicher,Shared Memory,Auslagerung,Swap,Systeminformation
+Keywords[el]=Μνήμη,RAM,Εικονική μνήμη,Φυσική μνήμη,Μοιρασμένη μνήμη,Αντιμετάθεση,Πληροφορίες συστήματος
+Keywords[eo]=memoro,RAM,virtuala,fizika,komunuza,sistemo,operaciumo,informo
+Keywords[es]=Memoria,RAM,Memoria virtual,Memoria física,Memoria compartida,Swap,Intercambio,Información del sistema
+Keywords[et]=Mälu,RAM,Virtuaalmälu,Füüsiline mälu,Jagatud mälu,Swap,Saaleala,Süsteemi info
+Keywords[eu]=Memoria,RAM,Memoria birtuala,Memoria fisikoa,Partekatutako memoria, Swap,Sistemaren informazioa
+Keywords[fa]=حافظه، حافظه با دستیابی تصادفی، حافظۀ مجازی، حافظۀ فیزیکی، حافظۀ مشترک، مبادله کردن، اطلاعات سیستم
+Keywords[fi]=Muisti,RAM,Virtuaalimuisti,Fyysinen muisti,Jaettu muisti,Järjestelmätiedot
+Keywords[fr]=mémoire,RAM,mémoire virtuelle,mémoire physique,mémoire partagée,swap,partition d'échange,informations système,ram
+Keywords[fy]=memory,RAM,virtual memory,physical memory,shared memory,swap,systeemynformaasje,ûnthâld,wikselûnthâld,,virtueel ûnthâld,fysiek ûnthâld,dield ûnthâld,
+Keywords[ga]=Cuimhne,RAM,Cuimhne fhíorúil,Cuimhne ábhartha,Comhchuimhne,Cuimhne bhabhtála,Eolas faoin Chóras
+Keywords[gl]=Memória,RAM,Memória virtual,Memória física,Memória compartida,Swap,Intercámbio,Información do Sistema
+Keywords[he]=זיכרון פנימי,זיכרון וירטואלי,זיכרון משותף,תחלופה,מידע, מערכת,RAM,זיכרון,Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information
+Keywords[hi]=मेमोरी,रैम,आभासी मेमोरी,वास्तविक मेमोरी,साझेदारी मेमोरी,अदला-बदली(स्वैप),तंत्र जानकारी
+Keywords[hr]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,Memorija,Virtualana memorija,Fizička memorija,Dijeljena memorija,Podaci o sustavu
+Keywords[hu]=memória,RAM,virtuális memória,fizikai memória,megosztott memória,lapozómemória,lapozó,swap,rendszerinformáció
+Keywords[id]=Memory,RAM,Memory Virtual,Memory fisik,memory shared,Swap,Informasi Sistem
+Keywords[is]=Minni,vinnsluminni,sýndarminni,samnýtt minni,biðminni,diskminni,kerfi,upplýsingar
+Keywords[it]=memoria,RAM,memoria virtuale,memoria fisica,memoria condivisa,swap,informazioni sul sistema
+Keywords[ja]=メモリ,RAM,仮想メモリ,物理メモリ,共有メモリ, スワップ, システム情報
+Keywords[ka]=მეხსიერება,RAM,ვირტუალური მეხსეირება,ფიზიკური მეხსიერება,საერთო მეხსიერება,მიმოცვლის ფაილია,ინფორმაცია სისტემის შესახებ
+Keywords[km]=សតិ,RAM,សតិ​និមិត្ត,សតិ​ពិត,សតិ​រួម,Swap,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=ຫນ່ວຍຄວາມຈຳ,ແຣມ,ຫນ່ວຍຄວາມຈຳສະເຫມືອນ,ຫນ່ວຍຄວາມຈຳຈິງ,ຫນ່ວຍຄວາມຈຳທີ່ໃໍຊ້ຮ່ວມກັນ,ສະວອປ,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=Memory,atmintis,RAM,atmintinė,Virtual memory,virtuali atmintis,Physical memory,fizinė atmintis,Shared memory,bendro naudojimo atmintis,Swap,System Information,sisteminė informacija
+Keywords[lv]=Atmiņa,RAM,Virtuālā atmiņa,Fiziskā atmiņa,Koplietošanas atmiņa,Svaps,Sistēmas Informācija
+Keywords[mk]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,Меморија,Виртуелна меморија,Физичка меморија,Заедничка меморија,Информации за системот
+Keywords[mn]=Санах ой,RAM,Виртуал санах ой,Физик санах ой,Хамтарсан санах ой,Хадгалалт,Зөөлт,Системийн мэдээлэл
+Keywords[nb]=Minne,RAM,Kunstig minne,Fysisk minne,Delt minne,Vekselsminne,Systeminformasjon
+Keywords[nds]=Spieker,RAM,Virtuell Spieker,Physikaalsch Spieker,Deelt Spieker,Swap,Utlager-Spieker,utlagern,Systeeminformatschoon
+Keywords[ne]=स्मृति, RAM, अवास्तविक स्मृति, भौतीक स्मृति, साझेदारी स्मृति, स्वाप, प्रणाली सूचना
+Keywords[nl]=memory,RAM,virtual memory,physical memory,shared memory,swap,systeeminformatie,geheugen,wisselgeheugen,virtueel geheugen,fysiek geheugen,gedeeld geheugen
+Keywords[nn]=minne,RAM,virtuelt minne,fysisk minne,delt minne,veksleminne,systeminformasjon
+Keywords[nso]=Kelelo,RAM,Kelelo ye Maatla,Kelelo ya kantle,Kelelo yeo e abaganwego,Swap,Tshedimoso ya System
+Keywords[oc]=Memòria,RAM,Memòria virtual,memòria física,memòria compartida,intercanvi,Informacion dèu sistemo
+Keywords[pa]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,ਮੈਮੋਰੀ,ਭੌਤਿਕ ਮੈਮੋਰੀ,ਸਾਂਝੀ ਮੈਮੋਰੀ,ਸਵੈਪ,ਸਿਸਟਮ ਜਾਣਕਾਰੀ,ਰੈਮ
+Keywords[pl]=pamięć,RAM,pamięć wirtualna,pamięć fizyczna,pamięć współdzielona,plik wymiany,partycja wymiany,informacja o systemie
+Keywords[pt]=memória,RAM,memória virtual,memória física,memória partilhada,swap,informações do sistema
+Keywords[pt_BR]=Memória,RAM,Memória virtual,Memória física,Memória compartilhada,Swap,Troca,Informações de sistema
+Keywords[ro]=memorie,RAM,memorie virtuală,memorie fizică,memorie partajată,swap,informații despre sistem
+Keywords[rw]=Umwanyabubiko,RAM,Umwanyabubiko utagaragara,Ububiko bufatika,Ububiko busangiwe,Guhinduranya,Ibisobanuro Sisitemu
+Keywords[se]=muitu,RAM,virtuella muitu,fysálaš muitu,juohkojuvvon muitu,vuorromuitu, vuogádatdiehtu
+Keywords[sk]=Pamäť,RAM,Virtuálna pamäť,zdieľaná pamäť,swap,Systémové informácie
+Keywords[sl]=pomnilnik,RAM,navidezni pomnilnik,fizični pomnilnik,deljeni pomnilnik,izmenjalni prostor,informacije o sistemu
+Keywords[sr]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,меморија,виртуелна меморија,физичка меморија,дељена меморија,системске информације
+Keywords[sr@Latn]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,memorija,virtuelna memorija,fizička memorija,deljena memorija,sistemske informacije
+Keywords[sv]=Minne,RAM,Virtuellt minne,Fysiskt minne,Delat minne,Swapp,Systeminformation
+Keywords[ta]=நினைவகம், RAM,மய் நிகர் நினைவகம், பருநிலை நினைவகம், பகிர்வு நினைவகம், மாறுகொள், அமைப்புத்தகவல்
+Keywords[th]=หน่วยความจำ,แรม,หน่วยความจำเสมือน,หน่วยความจำจริง,หน่วยความจำที่ใช้ร่วมกัน,สว้อป,ข้อมูลระบบ
+Keywords[tr]=Bellek,RAM,Sanal bellek,Fiziksel bellek,Paylaşılan bellek,Takas,Sistem Hakkında Bilgi
+Keywords[uk]=пам'ять,RAM,віртуальна пам'ять,фізична пам'ять,спільна пам'ять,свопінг,swap,інформація,система
+Keywords[uz]=Xotira,RAM,Virtual xotira,Physical memory,Boʻlishilgan xotira,Svop,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=Хотира,RAM,Виртуал хотира,Physical memory,Бўлишилган хотира,Своп,Тизим ҳақида маълумот
+Keywords[ven]=Muhumbulo,RAM,Muhumbulo wa vitshuala,muhumbulo zwao,muhumbulo wo kovhekanywaho,swap,mafhungo a sisitemu
+Keywords[vi]=Bộ nhớ,RAM,Bộ nhớ ảo,Bộ nhớ vật lý,Bộ nhớ dùng chung,Bộ nhỡ tráo đổi,Thông tin Hệ thống
+Keywords[wa]=memwere,RAM,forveyowememwere,memwere fizike,pårtaedjeye memwere,Swap,informåcion do sistinme
+Keywords[xh]=Inkumbulo,RAM,Inkumbulo yobume,Inkumbulo yomzimba,Inkumbulo yokwahlulelana,Ukutshintshiselana,Ulwazi lwendlela
+Keywords[zh_CN]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,内存,虚拟存储,物理存储,共享内存,交换,系统信息
+Keywords[zh_TW]=Memory,RAM,Virtual memory,Physical memory,Shared memory,Swap,System Information,記憶體,虛擬記憶體,實體記憶體,共享記憶體,系統資訊
+Keywords[zu]=Inkumbulo,RAM,Inkumbulo yamanga,Inkumbulo siqu,Inkumbulo yokwabelana,Shintshanisa,Ulwazi Lwesistimu
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/memory.h b/kcontrol/info/memory.h
new file mode 100644
index 000000000..7f6778c75
--- /dev/null
+++ b/kcontrol/info/memory.h
@@ -0,0 +1,67 @@
+#ifndef _MEMORY_H_KDEINFO_INCLUDED_
+#define _MEMORY_H_KDEINFO_INCLUDED_
+
+#include <qwidget.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qtabdialog.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+
+#include <kcmodule.h>
+#include <kaboutdata.h>
+#include <config.h>
+
+#ifdef HAVE_LONG_LONG
+/* better to use long-long, because some 32bit-machines have more total
+ memory (with swap) than just the 4GB which fits into a 32bit-long */
+typedef unsigned long long t_memsize;
+#else
+typedef unsigned long t_memsize;
+#endif
+
+#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 char *name = 0);
+ ~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 update();
+
+ bool Display_Graph(int widgetindex,
+ int count,
+ t_memsize total,
+ t_memsize *used,
+ QColor *color,
+ QString *text);
+ public slots:
+ void update_Values();
+};
+
+
+#endif // _MEMORY_H_KDEINFO_INCLUDED_
+
diff --git a/kcontrol/info/memory_fbsd.cpp b/kcontrol/info/memory_fbsd.cpp
new file mode 100644
index 000000000..80a28749e
--- /dev/null
+++ b/kcontrol/info/memory_fbsd.cpp
@@ -0,0 +1,89 @@
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/vmmeter.h>
+
+#include <vm/vm_param.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+void KMemoryWidget::update()
+{
+ char blah[10], buf[80], *used_str, *total_str;
+ /* Stuff for sysctl */
+ int memory;
+ size_t len;
+ /* Stuff for swap display */
+ int used, total, _free;
+ FILE *pipe;
+
+ len=sizeof(memory);
+ sysctlbyname("hw.physmem", &memory, &len, NULL, 0);
+
+ snprintf(blah, 10, "%d", memory);
+ // Numerical values
+
+ // total physical memory (without swap space)
+ Memory_Info[TOTAL_MEM] = MEMORY(memory);
+
+ // added by Brad Hughes [email protected]
+ struct vmtotal vmem;
+
+ #warning "FIXME: Memory_Info[CACHED_MEM]"
+ Memory_Info[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
+ // prefer, assume it's the old data types. FreeBSD prior
+ // to 4.0-R isn't supported by the rest of KDE, so what is
+ // this code doing here.
+
+ len = sizeof(vmem);
+ if (sysctlbyname("vm.vmmeter", &vmem, &len, NULL, 0) == 0)
+ Memory_Info[SHARED_MEM] = MEMORY(vmem.t_armshr) * PAGE_SIZE;
+ else
+ Memory_Info[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;
+ else
+ Memory_Info[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;
+ else
+ Memory_Info[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) {
+ used = total = 1;
+ return;
+ }
+
+ fgets(buf, sizeof(buf), pipe);
+ fgets(buf, sizeof(buf), pipe);
+ fgets(buf, sizeof(buf), pipe);
+ fgets(buf, sizeof(buf), pipe);
+ pclose(pipe);
+
+ strtok(buf, " ");
+ total_str = strtok(NULL, " ");
+ used_str = strtok(NULL, " ");
+ used = atoi(used_str);
+ total = atoi(total_str);
+
+ _free=total-used;
+
+ // total size of all swap-partitions
+ Memory_Info[SWAP_MEM] = MEMORY(total) * 1024;
+
+ // free memory in swap-partitions
+ Memory_Info[FREESWAP_MEM] = MEMORY(_free) * 1024;
+}
diff --git a/kcontrol/info/memory_hpux.cpp b/kcontrol/info/memory_hpux.cpp
new file mode 100644
index 000000000..4fefdfb35
--- /dev/null
+++ b/kcontrol/info/memory_hpux.cpp
@@ -0,0 +1,92 @@
+/*
+
+ This file will be included by memory.cpp !
+
+ HP-UX is really ugly to retrieve information from !
+ Implemented on 24.04.1999 by Helge Deller ([email protected])
+ Tested on an HP9000/715/64 under HPUX-10.20.
+ Updated for QT 2.0 on 27.04.1999 (deller)
+
+ Sorry, but I don't know, who implemented the first (little) version of
+ update(), but it showed wrong sizes !
+
+ Many thanks goes also to Mike Romberg, who implemented such functions in
+ the program "xosview". Here's his copyright:
+ Copyright (c) 1994, 1995 by Mike Romberg ( [email protected] )
+
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <sys/pstat.h>
+
+
+#define MAX_SWAP_AREAS 16
+
+void KMemoryWidget::update()
+{
+ int page_size,i;
+ unsigned long total_mem, total_free,
+ total_physical, total_swap, free_physical,
+ used_physical, used_swap, free_swap;
+
+ struct pst_static pststatic;
+ struct pst_dynamic stats;
+ struct pst_vminfo vmstats;
+ unsigned long fields_[4];
+ struct pst_swapinfo swapinfo;
+
+ pstat_getstatic( &pststatic, sizeof( struct pst_static ), (size_t)1, 0);
+ total_physical = pststatic.physical_memory;
+ page_size = (int)pststatic.page_size;
+
+ pstat_getdynamic(&stats, sizeof( pst_dynamic ), (size_t)1, 0);
+ pstat_getvminfo(&vmstats, sizeof(vmstats), (size_t)1, 0);
+
+ fields_[0] = stats.psd_rmtxt + stats.psd_arm; // TEXT
+ fields_[1] = stats.psd_rm - stats.psd_rmtxt; // USED
+ fields_[2] = total_physical - fields_[0] - fields_[1] - stats.psd_free; //OTHER
+ fields_[3] = stats.psd_free; // FREE
+
+ used_physical = (total_physical - fields_[3]) * page_size;
+ total_physical *= page_size;
+ free_physical = (total_physical - used_physical);
+
+
+ /* Now check the SWAP-AREAS !! */
+
+ total_swap = free_swap = 0;
+
+ for (i = 0 ; i < MAX_SWAP_AREAS ; i++)
+ {
+ pstat_getswap(&swapinfo, sizeof(swapinfo), (size_t)1, i);
+ if (swapinfo.pss_idx == (unsigned)i)
+ {
+ swapinfo.pss_nfpgs *= 4; // nfpgs is in 512 Byte Blocks....
+ if (swapinfo.pss_nblksenabled == 0) // == 0 ??
+ swapinfo.pss_nblksenabled = swapinfo.pss_nfpgs;
+ total_swap += (((unsigned long)swapinfo.pss_nblksenabled) * 1024);
+ free_swap += (((unsigned long)swapinfo.pss_nfpgs ) * 1024);
+ }
+ }
+
+ used_swap = total_swap - free_swap;
+
+
+ /* Now display the results */
+
+ 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
+#ifdef __GNUC__
+#warning "FIXME: Memory_Info[CACHED_MEM]"
+#endif
+ Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
+}
diff --git a/kcontrol/info/memory_linux.cpp b/kcontrol/info/memory_linux.cpp
new file mode 100644
index 000000000..c393c01e7
--- /dev/null
+++ b/kcontrol/info/memory_linux.cpp
@@ -0,0 +1,39 @@
+#include <sys/sysinfo.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <qfile.h>
+
+void KMemoryWidget::update()
+{
+ struct sysinfo info;
+
+ sysinfo(&info); /* Get Information from system... */
+
+ /*
+ * The sysinfo.mem_unit member variable is not available in older 2.4 kernels.
+ * If you have troubles compiling this code, set mem_unit to "1".
+ */
+
+ 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
+
+ QFile file("/proc/meminfo");
+ if (file.open(IO_ReadOnly)) {
+ char buf[512];
+ while (file.readLine(buf, sizeof(buf) - 1) > 0) {
+ 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
+ }
+ }
+ file.close();
+ }
+}
+
diff --git a/kcontrol/info/memory_netbsd.cpp b/kcontrol/info/memory_netbsd.cpp
new file mode 100644
index 000000000..39beeaa33
--- /dev/null
+++ b/kcontrol/info/memory_netbsd.cpp
@@ -0,0 +1,114 @@
+
+#include <sys/param.h>
+#if __NetBSD_Version__ > 103080000
+#define UVM
+#endif
+#if defined(__OpenBSD__)
+#define UVM
+#endif
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#ifdef UVM
+#include <uvm/uvm_extern.h>
+#else
+#include <vm/vm_swap.h>
+#endif
+
+void KMemoryWidget::update()
+{
+ int mib[2];
+ size_t len;
+#ifdef UVM
+#if __NetBSD_Version__ > 499000100 /* 4.99.2+ */
+ struct uvmexp_sysctl uvmexp;
+#else
+ struct uvmexp uvmexp;
+#endif
+#else /* !UVM */
+ struct swapent *swaplist;
+ int64_t nswap, rnswap, totalswap, freeswap, usedswap;
+#endif
+#if __NetBSD_Version__ > 106170000 /* 1.6Q+ */
+ quad_t memory;
+#else
+ int memory;
+#endif
+
+ /* memory */
+#if __NetBSD_Version__ > 106170000 /* 1.6Q+ */
+ mib[0] = CTL_HW;
+ mib[1] = HW_PHYSMEM64;
+#else
+ mib[0] = CTL_HW;
+ mib[1] = HW_PHYSMEM;
+#endif
+ len = sizeof(memory);
+ if( sysctl(mib,2,&memory,&len,NULL,0)< 0 )
+ Memory_Info[TOTAL_MEM] = NO_MEMORY_INFO;
+ else
+ Memory_Info[TOTAL_MEM] = memory;
+
+#ifdef UVM
+ mib[0] = CTL_VM;
+#if __NetBSD_Version__ > 499000100 /* 4.99.2+ */
+ mib[1] = VM_UVMEXP2;
+#else
+ mib[1] = VM_UVMEXP;
+#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;
+ } 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);
+#if __NetBSD_Version__ > 106000000
+ Memory_Info[CACHED_MEM] = pgsz * (uvmexp.filepages + uvmexp.execpages);
+#else
+ Memory_Info[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;
+
+ /* swap */
+ totalswap = freeswap = usedswap = 0;
+ nswap = swapctl(SWAP_NSWAP,0,0);
+ if ( nswap > 0 ) {
+ if ( (swaplist = (struct swapent *)malloc(nswap * sizeof(*swaplist))) ) {
+ rnswap = swapctl(SWAP_STATS,swaplist,nswap);
+ if ( rnswap < 0 || rnswap > nswap )
+ totalswap = freeswap = -1; /* Error */
+ else {
+ while ( rnswap-- > 0 ) {
+ totalswap += swaplist[rnswap].se_nblks;
+ usedswap += swaplist[rnswap].se_inuse;
+ }
+ freeswap = totalswap - usedswap;
+ }
+ } else
+ totalswap = freeswap = -1; /* Error */
+
+ if ( totalswap == -1 ) {
+ Memory_Info[SWAP_MEM] = NO_MEMORY_INFO;
+ Memory_Info[FREESWAP_MEM] = NO_MEMORY_INFO;
+ } else {
+ Memory_Info[SWAP_MEM] = MEMORY(totalswap);
+ Memory_Info[FREESWAP_MEM] = MEMORY(freeswap);
+ }
+ }
+#endif
+}
diff --git a/kcontrol/info/memory_osx.cpp b/kcontrol/info/memory_osx.cpp
new file mode 100644
index 000000000..9c18c4a6e
--- /dev/null
+++ b/kcontrol/info/memory_osx.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2003 Benjamin Reed <[email protected]>
+ *
+ * memory_osx.cpp is part of the KDE program kcminfo. Copied wholesale
+ * from memory_fbsd.cpp =)
+ *
+ * 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 <unistd.h>
+#include <stdlib.h>
+#include <qfile.h>
+#include <mach/mach_init.h>
+#include <mach/mach_host.h>
+#include <mach/host_info.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <kdebug.h>
+
+void KMemoryWidget::update()
+{
+
+ vm_statistics_data_t vm_info;
+ mach_msg_type_number_t info_count;
+ DIR *dirp;
+ struct dirent *dp;
+ t_memsize total;
+
+ info_count = HOST_VM_INFO_COUNT;
+ if (host_statistics(mach_host_self (), HOST_VM_INFO, (host_info_t)&vm_info, &info_count)) {
+ kdDebug() << "could not get memory statistics" << endl;
+ return;
+ }
+
+ Memory_Info[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;
+
+ dirp = opendir("/private/var/vm");
+ if (!dirp) {
+ kdDebug() << "unable to open /private/var/vm" << endl;
+ return;
+ }
+
+ total = 0;
+
+ while ((dp = readdir (dirp)) != NULL) {
+ struct stat sb;
+ char fname [MAXNAMLEN];
+
+ if (strncmp (dp->d_name, "swapfile", 8))
+ continue;
+
+ strcpy (fname, "/private/var/vm/");
+ strcat (fname, dp->d_name);
+ if (stat (fname, &sb) < 0)
+ continue;
+
+ total += sb.st_size;
+ }
+ closedir (dirp);
+
+ info_count = HOST_VM_INFO_COUNT;
+ if (host_statistics (mach_host_self (), HOST_VM_INFO,
+ (host_info_t) &vm_info, &info_count)) {
+ kdDebug() << "unable to get VM info" << endl;
+ }
+
+ Memory_Info[SWAP_MEM] = total;
+ // off_t used = (vm_info.pageouts - vm_info.pageins) * vm_page_size;
+ Memory_Info[FREESWAP_MEM] = NO_MEMORY_INFO;
+
+ /* free = MEMORY(vm_info.free_count) * vm_page_size;
+ used = MEMORY(vm_info.active_count) * vm_page_size;
+ total = MEMORY(vm_info.active_count + vm_info.inactive_count +
+ vm_info.free_count + vm_info.wire_count) * vm_page_size; */
+
+}
diff --git a/kcontrol/info/memory_sgi.cpp b/kcontrol/info/memory_sgi.cpp
new file mode 100644
index 000000000..2bc0d0c65
--- /dev/null
+++ b/kcontrol/info/memory_sgi.cpp
@@ -0,0 +1,75 @@
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/sysmp.h>
+#include <sys/ipc.h>
+
+// The following define is needed for SGI IRIX 6.2
+#define _KMEMUSER
+#include <sys/shm.h>
+
+#include <sys/param.h>
+#include <sys/swap.h>
+
+#ifndef UBSIZE
+#define UBSIZE 512
+#endif
+
+
+void KMemoryWidget::update()
+{
+ 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;
+
+
+ //FIXME: Memory_Info[CACHED_MEM]"
+ Memory_Info[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
+
+ swapctl(SC_GETFREESWAP, &val);
+ Memory_Info[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;
+#else
+ FILE *kmem = fopen("/dev/kmem", "r");
+ if( kmem == 0 ) {
+ Memory_Info[SHARED_MEM] = NO_MEMORY_INFO;
+ return;
+ }
+
+ long shmip = sysmp(MP_KERNADDR, MPKA_SHMINFO);
+ fseek( kmem, shmip, 0 );
+ struct shminfo shmi;
+ fread( &shmi, sizeof(shmi), 1, kmem );
+
+ long shmem = sysmp(MP_KERNADDR, MPKA_SHM);
+
+ val = 0;
+ long pos;
+ struct shmid_ds shmid;
+ for( int i=0 ; i<shmi.shmmni ; i++ ) {
+ fseek( kmem, shmem, 0 );
+ shmem += sizeof(shmem);
+ fread( &pos, sizeof(shmem), 1, kmem );
+ if(pos != 0) {
+ fseek( kmem, pos, 0 );
+ fread( &shmid, sizeof(shmid), 1, kmem );
+ val += shmid.shm_segsz;
+ }
+ }
+ Memory_Info[SHARED_MEM] = MEMORY(val);
+
+ fclose(kmem);
+#endif
+}
diff --git a/kcontrol/info/memory_solaris.cpp b/kcontrol/info/memory_solaris.cpp
new file mode 100644
index 000000000..a82b830d4
--- /dev/null
+++ b/kcontrol/info/memory_solaris.cpp
@@ -0,0 +1,94 @@
+/*
+ * memory_solaris.cpp
+ *
+ * Torsten Kasch <[email protected]>
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <kstat.h>
+
+/* Stop <sys/swap.h> from crapping out on 32-bit architectures. */
+
+#if !defined(_LP64) && _FILE_OFFSET_BITS == 64
+# undef _FILE_OFFSET_BITS
+# define _FILE_OFFSET_BITS 32
+#endif
+
+#include <sys/stat.h>
+#include <sys/swap.h>
+#include <vm/anon.h>
+
+#define PAGETOK(a) (( (t_memsize) sysconf( _SC_PAGESIZE )) * (t_memsize) a)
+
+void KMemoryWidget::update() {
+
+ kstat_ctl_t *kctl;
+ kstat_t *ksp;
+ kstat_named_t *kdata;
+
+ /*
+ * get a kstat handle first and update the user's kstat chain
+ */
+ if( (kctl = kstat_open()) == NULL )
+ return;
+ while( kstat_chain_update( kctl ) != 0 )
+ ;
+
+ /*
+ * traverse the kstat chain to find the appropriate kstat
+ */
+ if( (ksp = kstat_lookup( kctl, "unix", 0, "system_pages" )) == NULL )
+ return;
+
+ if( kstat_read( kctl, ksp, NULL ) == -1 )
+ return;
+
+ /*
+ * lookup the data
+ */
+#if 0
+ kdata = (kstat_named_t *) kstat_data_lookup( ksp, "physmem" );
+ if( kdata != NULL ) {
+ Memory_Info[TOTAL_MEM] = PAGETOK(kdata->value.ui32);
+ }
+#endif
+ Memory_Info[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);
+
+#warning "FIXME: Memory_Info[CACHED_MEM]"
+ Memory_Info[CACHED_MEM] = NO_MEMORY_INFO; // cached memory in ram
+
+ kstat_close( kctl );
+
+ /*
+ * Swap Info
+ */
+
+ struct anoninfo am_swap;
+ long swaptotal;
+ long swapfree;
+ long swapused;
+
+ swaptotal = swapused = swapfree = 0L;
+
+ /*
+ * Retrieve overall swap information from anonymous memory structure -
+ * which is the same way "swap -s" retrieves it's statistics.
+ *
+ * swapctl(SC_LIST, void *arg) does not return what we are looking for.
+ */
+
+ if (swapctl(SC_AINFO, &am_swap) == -1)
+ return;
+
+ swaptotal = am_swap.ani_max;
+ swapused = am_swap.ani_resv;
+ swapfree = swaptotal - swapused;
+
+ Memory_Info[SWAP_MEM] = PAGETOK(swaptotal);
+ Memory_Info[FREESWAP_MEM] = PAGETOK(swapfree);
+}
diff --git a/kcontrol/info/memory_tru64.cpp b/kcontrol/info/memory_tru64.cpp
new file mode 100644
index 000000000..667ffbcca
--- /dev/null
+++ b/kcontrol/info/memory_tru64.cpp
@@ -0,0 +1,83 @@
+/*
+ * This is memory_tru64.cpp to retrieve memory information under Tru64/Alpha.
+ *
+ * Implemented by Tom Leitner, [email protected]
+ *
+ * WARNING: This module requires linking with -lmach
+ *
+ * This routine is based on m_decosf1.c from the "top" program written by:
+ *
+ * AUTHOR: Anthony Baxter, <[email protected]>
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/mbuf.h>
+#include <net/route.h>
+#include <sys/table.h>
+extern "C" {
+#include <mach/mach_traps.h>
+}
+#include <mach/vm_statistics.h>
+
+#define pagetob(size) (MEMORY(1024L) * ((long) (size) << (long) pageshift))
+#define LOG1024 10
+
+extern "C" void vm_statistics(task_t, vm_statistics_data_t*);
+
+void KMemoryWidget::update()
+{
+ int pageshift; /* log base 2 of the pagesize */
+ register int pagesize;
+ vm_statistics_data_t vmstats;
+ int swap_pages=0,swap_free=0,i;
+ struct tbl_swapinfo swbuf;
+
+ /* get the page size with "getpagesize" and calculate pageshift from it */
+
+ pagesize = getpagesize();
+ pageshift = 0;
+ while (pagesize > 1) {
+ pageshift++;
+ pagesize >>= 1;
+ }
+
+ /* we only need the amount of log(2)1024 for our conversion */
+
+ pageshift -= LOG1024;
+
+ /* memory information */
+ /* this is possibly bogus - we work out total # pages by */
+ /* adding up the free, active, inactive, wired down, and */
+ /* zero filled. Anyone who knows a better way, TELL ME! */
+ /* Change: dont use zero filled. */
+
+ (void) ::vm_statistics(::task_self(), &vmstats);
+
+ /* thanks DEC for the table() command. No thanks at all for */
+ /* omitting the man page for it from OSF/1 1.2, and failing */
+ /* to document SWAPINFO in the 1.3 man page. Lets hear it for */
+ /* include files. */
+
+ i=0;
+ while(table(TBL_SWAPINFO,i,&swbuf,1,sizeof(struct tbl_swapinfo))>0) {
+ swap_pages += swbuf.size;
+ swap_free += swbuf.free;
+ i++;
+ }
+ Memory_Info[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 ?? */
+#ifdef __GNUC__
+#warning "FIXME: Memory_Info[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);
+}
diff --git a/kcontrol/info/opengl.cpp b/kcontrol/info/opengl.cpp
new file mode 100644
index 000000000..66266abdf
--- /dev/null
+++ b/kcontrol/info/opengl.cpp
@@ -0,0 +1,673 @@
+/***************************************************************************
+ * *
+ * Copyright (C) 2004 by Ilya Korniyko <[email protected]> *
+ * Adapted from Brian Paul's glxinfo from Mesa demos (http:/www.mesa3d.org)
+ * Copyright (C) 1999-2002 Brian Paul *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+#if defined(INFO_OPENGL_AVAILABLE)
+
+#define KCMGL_DO_GLU
+
+#include <qregexp.h>
+#include <qlistview.h>
+#include <qfile.h>
+#include <qstring.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#ifdef KCMGL_DO_GLU
+#include <GL/glu.h>
+#endif
+
+#include <GL/gl.h>
+#include <GL/glext.h>
+#include <GL/glx.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+static bool IsDirect;
+
+static struct glinfo {
+ const char *serverVendor;
+ const char *serverVersion;
+ const char *serverExtensions;
+ const char *clientVendor;
+ const char *clientVersion;
+ const char *clientExtensions;
+ const char *glxExtensions;
+ const char *glVendor;
+ const char *glRenderer;
+ const char *glVersion;
+ const char *glExtensions;
+ const char *gluVersion;
+ const char *gluExtensions;
+ char *displayName;
+} gli;
+
+static struct {
+ QString module,
+ pci,
+ vendor,
+ device,
+ subvendor,
+ rev;
+} dri_info;
+
+static int ReadPipe(QString FileName, QStringList &list)
+{
+ FILE *pipe;
+
+ if ((pipe = popen(FileName.ascii(), "r")) == NULL) {
+ pclose(pipe);
+ return 0;
+ }
+
+ QTextStream t(pipe, IO_ReadOnly);
+
+ while (!t.atEnd()) list.append(t.readLine());
+
+ pclose(pipe);
+ return list.count();
+}
+
+#if defined(Q_OS_LINUX)
+
+#define INFO_DRI "/proc/dri/0/name"
+
+static bool get_dri_device()
+{
+ QFile file;
+ file.setName(INFO_DRI);
+ if (!file.exists() || !file.open(IO_ReadOnly))
+ return false;
+
+ QTextStream stream(&file);
+ QString line = stream.readLine();
+ if (!line.isEmpty()) {
+ dri_info.module = line.mid(0, line.find(0x20));
+
+ // possible formats, for regression testing
+ // line = " PCI:01:00:0";
+ // line = " pci:0000:01:00.0"
+ QRegExp rx = QRegExp("\\b[Pp][Cc][Ii][:]([0-9a-fA-F]+[:])?([0-9a-fA-F]+[:][0-9a-fA-F]+[:.][0-9a-fA-F]+)\\b");
+ if (rx.search(line)>0) {
+ dri_info.pci = rx.cap(2);
+ int end = dri_info.pci.findRev(':');
+ int end2 = dri_info.pci.findRev('.');
+ if (end2>end) end=end2;
+ dri_info.pci[end]='.';
+
+ QString cmd = QString("lspci -m -v -s ") + dri_info.pci;
+ QStringList pci_info;
+ int num;
+ if (((num = ReadPipe(cmd, pci_info)) ||
+ (num = ReadPipe("/sbin/"+cmd, pci_info)) ||
+ (num = ReadPipe("/usr/sbin/"+cmd, pci_info)) ||
+ (num = ReadPipe("/usr/local/sbin/"+cmd, pci_info))) && num>=7) {
+ for (int i=2; i<=6; i++) {
+ line = pci_info[i];
+ line.remove(QRegExp("[^:]*:[ ]*"));
+ switch (i){
+ case 2: dri_info.vendor = line; break;
+ case 3: dri_info.device = line; break;
+ case 4: dri_info.subvendor = line; break;
+ case 6: dri_info.rev = line; break;
+ }
+ }
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+#elif defined(Q_OS_FREEBSD)
+
+static bool get_dri_device() {
+
+ QStringList pci_info;
+ if (ReadPipe("sysctl -n hw.dri.0.name",pci_info)) {
+ dri_info.module = pci_info[0].mid(0, pci_info[0].find(0x20));
+ }
+ return false;
+}
+
+#else
+
+static bool get_dri_device() { return false; }
+
+#endif
+
+static void
+mesa_hack(Display *dpy, int scrnum)
+{
+ static int attribs[] = {
+ GLX_RGBA,
+ GLX_RED_SIZE, 1,
+ GLX_GREEN_SIZE, 1,
+ GLX_BLUE_SIZE, 1,
+ GLX_DEPTH_SIZE, 1,
+ GLX_STENCIL_SIZE, 1,
+ GLX_ACCUM_RED_SIZE, 1,
+ GLX_ACCUM_GREEN_SIZE, 1,
+ GLX_ACCUM_BLUE_SIZE, 1,
+ GLX_ACCUM_ALPHA_SIZE, 1,
+ GLX_DOUBLEBUFFER,
+ None
+ };
+ XVisualInfo *visinfo;
+
+ visinfo = glXChooseVisual(dpy, scrnum, attribs);
+ if (visinfo)
+ XFree(visinfo);
+}
+
+
+static void
+print_extension_list(const char *ext, QListViewItem *l1)
+{
+ int i, j;
+
+ if (!ext || !ext[0])
+ return;
+ QString qext = QString::fromLatin1(ext);
+ QListViewItem *l2 = NULL;
+
+ i = j = 0;
+ while (1) {
+ if (ext[j] == ' ' || ext[j] == 0) {
+ /* found end of an extension name */
+ const int len = j - i;
+ /* print the extension name between ext[i] and ext[j] */
+ if (!l2) l2 = new QListViewItem(l1, qext.mid(i, len));
+ else l2 = new QListViewItem(l1, l2, qext.mid(i, len));
+ i=j;
+ if (ext[j] == 0) {
+ break;
+ }
+ else {
+ i++;
+ j++;
+ if (ext[j] == 0)
+ break;
+ }
+ }
+ j++;
+ }
+}
+
+#if defined(GLX_ARB_get_proc_address) && defined(__GLXextFuncPtr)
+extern "C" {
+ extern __GLXextFuncPtr glXGetProcAddressARB (const GLubyte *);
+}
+#endif
+
+static void
+print_limits(QListViewItem *l1, const char * glExtensions, bool GetProcAddress)
+{
+ /* TODO
+ GL_SAMPLE_BUFFERS
+ GL_SAMPLES
+ GL_COMPRESSED_TEXTURE_FORMATS
+*/
+
+ if (!glExtensions)
+ return;
+
+ struct token_name {
+ GLuint type; // count and flags, !!! count must be <=2 for now
+ GLenum token;
+ const QString name;
+ };
+
+ struct token_group {
+ int count;
+ int type;
+ const token_name *group;
+ const QString descr;
+ const char *ext;
+ };
+
+ QListViewItem *l2 = NULL, *l3 = NULL;
+#if defined(PFNGLGETPROGRAMIVARBPROC)
+ PFNGLGETPROGRAMIVARBPROC kcm_glGetProgramivARB = NULL;
+#endif
+
+ #define KCMGL_FLOAT 128
+ #define KCMGL_PROG 256
+ #define KCMGL_COUNT_MASK(x) (x & 127)
+ #define KCMGL_SIZE(x) (sizeof(x)/sizeof(x[0]))
+
+ const struct token_name various_limits[] = {
+ { 1, GL_MAX_LIGHTS, i18n("Max. number of light sources") },
+ { 1, GL_MAX_CLIP_PLANES, i18n("Max. number of clipping planes") },
+ { 1, GL_MAX_PIXEL_MAP_TABLE, i18n("Max. pixel map table size") },
+ { 1, GL_MAX_LIST_NESTING, i18n("Max. display list nesting level") },
+ { 1, GL_MAX_EVAL_ORDER, i18n("Max. evaluator order") },
+ { 1, GL_MAX_ELEMENTS_VERTICES, i18n("Max. recommended vertex count") },
+ { 1, GL_MAX_ELEMENTS_INDICES, i18n("Max. recommended index count") },
+#ifdef GL_QUERY_COUNTER_BITS
+ { 1, GL_QUERY_COUNTER_BITS, i18n("Occlusion query counter bits")},
+#endif
+#ifdef GL_MAX_VERTEX_UNITS_ARB
+ { 1, GL_MAX_VERTEX_UNITS_ARB, i18n("Max. vertex blend matrices") },
+#endif
+#ifdef GL_MAX_PALETTE_MATRICES_ARB
+ { 1, GL_MAX_PALETTE_MATRICES_ARB, i18n("Max. vertex blend matrix palette size") },
+#endif
+ {0,0,0}
+ };
+
+ const struct token_name texture_limits[] = {
+ { 1, GL_MAX_TEXTURE_SIZE, i18n("Max. texture size") },
+ { 1, GL_MAX_TEXTURE_UNITS_ARB, i18n("Num. of texture units") },
+ { 1, GL_MAX_3D_TEXTURE_SIZE, i18n("Max. 3D texture size") },
+#ifdef GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB
+ { 1, GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB, i18n("Max. cube map texture size") },
+#endif
+#ifdef GL_MAX_RECTANGLE_TEXTURE_SIZE_NV
+ { 1, GL_MAX_RECTANGLE_TEXTURE_SIZE_NV, i18n("Max. rectangular texture size") },
+#endif
+#ifdef GL_MAX_TEXTURE_LOD_BIAS_EXT
+ { 1 | KCMGL_FLOAT, GL_MAX_TEXTURE_LOD_BIAS_EXT, i18n("Max. texture LOD bias") },
+#endif
+#ifdef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
+ { 1, GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, i18n("Max. anisotropy filtering level") },
+#endif
+#ifdef GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB
+ { 1, GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB, i18n("Num. of compressed texture formats") },
+#endif
+ {0,0,0}
+ };
+
+ const struct token_name float_limits[] = {
+ { 2 | KCMGL_FLOAT, GL_ALIASED_POINT_SIZE_RANGE, "ALIASED_POINT_SIZE_RANGE" },
+ { 2 | KCMGL_FLOAT, GL_SMOOTH_POINT_SIZE_RANGE, "SMOOTH_POINT_SIZE_RANGE" },
+ { 1 | KCMGL_FLOAT, GL_SMOOTH_POINT_SIZE_GRANULARITY,"SMOOTH_POINT_SIZE_GRANULARITY"},
+ { 2 | KCMGL_FLOAT, GL_ALIASED_LINE_WIDTH_RANGE, "ALIASED_LINE_WIDTH_RANGE" },
+ { 2 | KCMGL_FLOAT, GL_SMOOTH_LINE_WIDTH_RANGE, "SMOOTH_LINE_WIDTH_RANGE" },
+ { 1 | KCMGL_FLOAT, GL_SMOOTH_LINE_WIDTH_GRANULARITY,"SMOOTH_LINE_WIDTH_GRANULARITY"},
+ {0,0,0}
+ };
+
+ const struct token_name stack_depth[] = {
+ { 1, GL_MAX_MODELVIEW_STACK_DEPTH, "MAX_MODELVIEW_STACK_DEPTH" },
+ { 1, GL_MAX_PROJECTION_STACK_DEPTH, "MAX_PROJECTION_STACK_DEPTH" },
+ { 1, GL_MAX_TEXTURE_STACK_DEPTH, "MAX_TEXTURE_STACK_DEPTH" },
+ { 1, GL_MAX_NAME_STACK_DEPTH, "MAX_NAME_STACK_DEPTH" },
+ { 1, GL_MAX_ATTRIB_STACK_DEPTH, "MAX_ATTRIB_STACK_DEPTH" },
+ { 1, GL_MAX_CLIENT_ATTRIB_STACK_DEPTH, "MAX_CLIENT_ATTRIB_STACK_DEPTH" },
+ { 1, GL_MAX_COLOR_MATRIX_STACK_DEPTH, "MAX_COLOR_MATRIX_STACK_DEPTH" },
+#ifdef GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB
+ { 1, GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB,"MAX_MATRIX_PALETTE_STACK_DEPTH"},
+#endif
+ {0,0,0}
+ };
+
+#ifdef GL_ARB_fragment_program
+ const struct token_name arb_fp[] = {
+ { 1, GL_MAX_TEXTURE_COORDS_ARB, "MAX_TEXTURE_COORDS" },
+ { 1, GL_MAX_TEXTURE_IMAGE_UNITS_ARB, "MAX_TEXTURE_IMAGE_UNITS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, "MAX_PROGRAM_ENV_PARAMETERS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, "MAX_PROGRAM_LOCAL_PARAMETERS" },
+ { 1, GL_MAX_PROGRAM_MATRICES_ARB, "MAX_PROGRAM_MATRICES" },
+ { 1, GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB, "MAX_PROGRAM_MATRIX_STACK_DEPTH" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, "MAX_PROGRAM_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, "MAX_PROGRAM_ALU_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, "MAX_PROGRAM_TEX_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, "MAX_PROGRAM_TEX_INDIRECTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_TEMPORARIES_ARB, "MAX_PROGRAM_TEMPORARIES" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_PARAMETERS_ARB, "MAX_PROGRAM_PARAMETERS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_ATTRIBS_ARB, "MAX_PROGRAM_ATTRIBS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, "MAX_PROGRAM_NATIVE_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, "MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, "MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, "MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, "MAX_PROGRAM_NATIVE_TEMPORARIES" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, "MAX_PROGRAM_NATIVE_PARAMETERS" },
+ { 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, "MAX_PROGRAM_NATIVE_ATTRIBS" },
+ {0,0,0}
+ };
+#endif
+
+#ifdef GL_ARB_vertex_program
+ const struct token_name arb_vp[] = {
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB,"MAX_PROGRAM_ENV_PARAMETERS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB,"MAX_PROGRAM_LOCAL_PARAMETERS"},
+{ 1, GL_MAX_VERTEX_ATTRIBS_ARB, "MAX_VERTEX_ATTRIBS"},
+{ 1, GL_MAX_PROGRAM_MATRICES_ARB,"MAX_PROGRAM_MATRICES"},
+{ 1, GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB,"MAX_PROGRAM_MATRIX_STACK_DEPTH"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_INSTRUCTIONS_ARB,"MAX_PROGRAM_INSTRUCTIONS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_TEMPORARIES_ARB,"MAX_PROGRAM_TEMPORARIES"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_PARAMETERS_ARB,"MAX_PROGRAM_PARAMETERS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_ATTRIBS_ARB,"MAX_PROGRAM_ATTRIBS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB,"MAX_PROGRAM_ADDRESS_REGISTERS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB,"MAX_PROGRAM_NATIVE_INSTRUCTIONS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB,"MAX_PROGRAM_NATIVE_TEMPORARIES"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB,"MAX_PROGRAM_NATIVE_PARAMETERS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB,"MAX_PROGRAM_NATIVE_ATTRIBS"},
+{ 1 | KCMGL_PROG, GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB ,"MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS"},
+{0,0,0}
+};
+#endif
+
+#ifdef GL_ARB_vertex_shader
+ const struct token_name arb_vs[] = {
+ { 1, GL_MAX_VERTEX_ATTRIBS_ARB,"MAX_VERTEX_ATTRIBS"},
+ { 1, GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB,"MAX_VERTEX_UNIFORM_COMPONENTS"},
+ { 1, GL_MAX_VARYING_FLOATS_ARB,"MAX_VARYING_FLOATS"},
+ { 1, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB,"MAX_COMBINED_TEXTURE_IMAGE_UNITS"},
+ { 1, GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB,"MAX_VERTEX_TEXTURE_IMAGE_UNITS"},
+ { 1, GL_MAX_TEXTURE_IMAGE_UNITS_ARB,"MAX_TEXTURE_IMAGE_UNITS"},
+ { 1, GL_MAX_TEXTURE_COORDS_ARB,"MAX_TEXTURE_COORDS"},
+ {0,0,0}
+ };
+#endif
+
+#ifdef GL_ARB_fragment_shader
+ const struct token_name arb_fs[] = {
+ { 1, GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB,"MAX_FRAGMENT_UNIFORM_COMPONENTS"},
+ { 1, GL_MAX_TEXTURE_IMAGE_UNITS_ARB,"MAX_TEXTURE_IMAGE_UNITS"},
+ { 1, GL_MAX_TEXTURE_COORDS_ARB,"MAX_TEXTURE_COORDS"},
+ {0,0,0}
+ };
+#endif
+
+ const struct token_name frame_buffer_props[] = {
+ { 2, GL_MAX_VIEWPORT_DIMS, i18n("Max. viewport dimensions") },
+ { 1, GL_SUBPIXEL_BITS, i18n("Subpixel bits") },
+ { 1, GL_AUX_BUFFERS, i18n("Aux. buffers")},
+ {0,0,0}
+ };
+
+ const struct token_group groups[] =
+ {
+ {KCMGL_SIZE(frame_buffer_props), 0, frame_buffer_props, i18n("Frame buffer properties"), NULL},
+ {KCMGL_SIZE(various_limits), 0, texture_limits, i18n("Texturing"), NULL},
+ {KCMGL_SIZE(various_limits), 0, various_limits, i18n("Various limits"), NULL},
+ {KCMGL_SIZE(float_limits), 0, float_limits, i18n("Points and lines"), NULL},
+ {KCMGL_SIZE(stack_depth), 0, stack_depth, i18n("Stack depth limits"), NULL},
+#ifdef GL_ARB_vertex_program
+ {KCMGL_SIZE(arb_vp), GL_VERTEX_PROGRAM_ARB, arb_vp, "ARB_vertex_program", "GL_ARB_vertex_program"},
+#endif
+#ifdef GL_ARB_fragment_program
+ {KCMGL_SIZE(arb_fp), GL_FRAGMENT_PROGRAM_ARB, arb_fp, "ARB_fragment_program", "GL_ARB_fragment_program"},
+#endif
+#ifdef GL_ARB_vertex_shader
+ {KCMGL_SIZE(arb_vs), 0, arb_vs, "ARB_vertex_shader", "GL_ARB_vertex_shader"},
+#endif
+#ifdef GL_ARB_fragment_shader
+ {KCMGL_SIZE(arb_fs), 0, arb_fs, "ARB_fragment_shader", "GL_ARB_fragment_shader"},
+#endif
+ };
+
+#if defined(GLX_ARB_get_proc_address) && defined(PFNGLGETPROGRAMIVARBPROC)
+ if (GetProcAddress && strstr(glExtensions, "GL_ARB_vertex_program"))
+ kcm_glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC) glXGetProcAddressARB((const GLubyte *)"glGetProgramivARB");
+#endif
+
+ for (uint i = 0; i<KCMGL_SIZE(groups); i++) {
+ if (groups[i].ext && !strstr(glExtensions, groups[i].ext)) continue;
+
+ if (l2) l2 = new QListViewItem(l1, l2, groups[i].descr);
+ else l2 = new QListViewItem(l1, groups[i].descr);
+ l3 = NULL;
+ const struct token_name *cur_token;
+ for (cur_token = groups[i].group; cur_token->type; cur_token++) {
+
+ bool tfloat = cur_token->type & KCMGL_FLOAT;
+ int count = KCMGL_COUNT_MASK(cur_token->type);
+ GLint max[2]={0,0};
+ GLfloat fmax[2]={0.0,0.0};
+
+#if defined(PFNGLGETPROGRAMIVARBPROC) && defined(GL_ARB_vertex_program)
+ bool tprog = cur_token->type & KCMGL_PROG;
+ if (tprog && kcm_glGetProgramivARB)
+ kcm_glGetProgramivARB(groups[i].type, cur_token->token, max);
+ else
+#endif
+ if (tfloat) glGetFloatv(cur_token->token, fmax);
+ else glGetIntegerv(cur_token->token, max);
+
+ if (glGetError() == GL_NONE) {
+ QString s;
+ if (!tfloat && count == 1) s = QString::number(max[0]); else
+ if (!tfloat && count == 2) s = QString("%1, %2").arg(max[0]).arg(max[1]); else
+ if (tfloat && count == 2) s = QString("%1 - %2").arg(fmax[0],0,'f',6).arg(fmax[1],0,'f',6); else
+ if (tfloat && count == 1) s = QString::number(fmax[0],'f',6);
+ if (l3) l3 = new QListViewItem(l2, l3, cur_token->name, s);
+ else l3 = new QListViewItem(l2, cur_token->name, s);
+
+ }
+ }
+
+ }
+}
+
+
+static QListViewItem *print_screen_info(QListViewItem *l1, QListViewItem *after)
+{
+ QListViewItem *l2 = NULL, *l3 = NULL;
+
+ if (after) l1= new QListViewItem(l1,after,IsDirect ? i18n("Direct Rendering") : i18n("Indirect Rendering"));
+ else l1= new QListViewItem(l1,IsDirect ? i18n("Direct Rendering") : i18n("Indirect Rendering"));
+ if (IsDirect)
+ if (get_dri_device()) {
+ l2 = new QListViewItem(l1, i18n("3D Accelerator"));
+ l2->setOpen(true);
+ l3 = new QListViewItem(l2, l3, i18n("Vendor"), dri_info.vendor);
+ l3 = new QListViewItem(l2, l3, i18n("Device"), dri_info.device);
+ l3 = new QListViewItem(l2, l3, i18n("Subvendor"), dri_info.subvendor);
+ l3 = new QListViewItem(l2, l3, i18n("Revision"), dri_info.rev);
+ }
+ else l2=new QListViewItem(l1, l2, i18n("3D Accelerator"),i18n("unknown"));
+ if (l2) l2 = new QListViewItem(l1, l2, i18n("Driver"));
+ else l2 = new QListViewItem(l1, i18n("Driver"));
+ l2->setOpen(true);
+
+ l3 = new QListViewItem(l2, i18n("Vendor"),gli.glVendor);
+ l3 = new QListViewItem(l2, l3, i18n("Renderer"), gli.glRenderer);
+ l3 = new QListViewItem(l2, l3, i18n("OpenGL version"), gli.glVersion);
+
+ if (IsDirect) {
+ if (!dri_info.module) dri_info.module = i18n("unknown");
+ l3 = new QListViewItem(l2, l3, i18n("Kernel module"), dri_info.module);
+ }
+
+ l3 = new QListViewItem(l2, l3, i18n("OpenGL extensions"));
+ print_extension_list(gli.glExtensions,l3);
+
+ l3 = new QListViewItem(l2, l3, i18n("Implementation specific"));
+ print_limits(l3, gli.glExtensions, strstr(gli.clientExtensions, "GLX_ARB_get_proc_address") != NULL);
+
+ return l1;
+}
+
+void print_glx_glu(QListViewItem *l1, QListViewItem *l2)
+{
+ QListViewItem *l3;
+
+ l2=new QListViewItem(l1, l2, i18n("GLX"));
+ l3 = new QListViewItem(l2, i18n("server GLX vendor"),gli.serverVendor);
+ l3 = new QListViewItem(l2, l3, i18n("server GLX version"),gli.serverVersion);
+ l3 = new QListViewItem(l2, l3, i18n("server GLX extensions"));
+ print_extension_list(gli.serverExtensions,l3);
+
+ l3 = new QListViewItem(l2, l3, i18n("client GLX vendor"),gli.clientVendor);
+ l3 = new QListViewItem(l2, l3, i18n("client GLX version"),gli.clientVersion);
+ l3 = new QListViewItem(l2, l3, i18n("client GLX extensions"));
+ print_extension_list(gli.clientExtensions,l3);
+ l3 = new QListViewItem(l2, l3, i18n("GLX extensions"));
+ print_extension_list(gli.glxExtensions,l3);
+
+#ifdef KCMGL_DO_GLU
+ l2 = new QListViewItem(l1, l2, i18n("GLU"));
+ l3 = new QListViewItem(l2, i18n("GLU version"), gli.gluVersion);
+ l3 = new QListViewItem(l2, l3, i18n("GLU extensions"));
+ print_extension_list(gli.gluExtensions,l3);
+#endif
+
+}
+
+static QListViewItem *get_gl_info(Display *dpy, int scrnum, Bool allowDirect,QListViewItem *l1, QListViewItem *after)
+{
+ Window win;
+ int attribSingle[] = {
+ GLX_RGBA,
+ GLX_RED_SIZE, 1,
+ GLX_GREEN_SIZE, 1,
+ GLX_BLUE_SIZE, 1,
+ None };
+ int attribDouble[] = {
+ GLX_RGBA,
+ GLX_RED_SIZE, 1,
+ GLX_GREEN_SIZE, 1,
+ GLX_BLUE_SIZE, 1,
+ GLX_DOUBLEBUFFER,
+ None };
+
+ XSetWindowAttributes attr;
+ unsigned long mask;
+ Window root;
+ GLXContext ctx;
+ XVisualInfo *visinfo;
+ int width = 100, height = 100;
+ QListViewItem *result = after;
+
+ root = RootWindow(dpy, scrnum);
+
+ visinfo = glXChooseVisual(dpy, scrnum, attribSingle);
+ if (!visinfo) {
+ visinfo = glXChooseVisual(dpy, scrnum, attribDouble);
+ if (!visinfo) {
+ kdDebug() << "Error: couldn't find RGB GLX visual\n";
+ return result;
+ }
+ }
+
+ attr.background_pixel = 0;
+ attr.border_pixel = 0;
+ attr.colormap = XCreateColormap(dpy, root, visinfo->visual, AllocNone);
+ attr.event_mask = StructureNotifyMask | ExposureMask;
+ mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+ win = XCreateWindow(dpy, root, 0, 0, width, height,
+ 0, visinfo->depth, InputOutput,
+ visinfo->visual, mask, &attr);
+
+ ctx = glXCreateContext( dpy, visinfo, NULL, allowDirect );
+ if (!ctx) {
+ kdDebug() << "Error: glXCreateContext failed\n";
+ XDestroyWindow(dpy, win);
+ return result;
+ }
+
+ if (glXMakeCurrent(dpy, win, ctx)) {
+ gli.serverVendor = glXQueryServerString(dpy, scrnum, GLX_VENDOR);
+ gli.serverVersion = glXQueryServerString(dpy, scrnum, GLX_VERSION);
+ gli.serverExtensions = glXQueryServerString(dpy, scrnum, GLX_EXTENSIONS);
+ gli.clientVendor = glXGetClientString(dpy, GLX_VENDOR);
+ gli.clientVersion = glXGetClientString(dpy, GLX_VERSION);
+ gli.clientExtensions = glXGetClientString(dpy, GLX_EXTENSIONS);
+ gli.glxExtensions = glXQueryExtensionsString(dpy, scrnum);
+ gli.glVendor = (const char *) glGetString(GL_VENDOR);
+ gli.glRenderer = (const char *) glGetString(GL_RENDERER);
+ gli.glVersion = (const char *) glGetString(GL_VERSION);
+ gli.glExtensions = (const char *) glGetString(GL_EXTENSIONS);
+ gli.displayName = NULL;
+#ifdef KCMGL_DO_GLU
+ gli.gluVersion = (const char *) gluGetString(GLU_VERSION);
+ gli.gluExtensions = (const char *) gluGetString(GLU_EXTENSIONS);
+#endif
+ IsDirect = glXIsDirect(dpy, ctx);
+
+ result = print_screen_info(l1, after);
+ }
+ else {
+ kdDebug() << "Error: glXMakeCurrent failed\n";
+ }
+
+ glXDestroyContext(dpy, ctx);
+ XDestroyWindow(dpy, win);
+ return result;
+
+}
+
+
+static bool GetInfo_OpenGL_Generic( QListView *lBox )
+{
+ QListViewItem *l1, *l2 = NULL;
+
+ char *displayName = NULL;
+ Display *dpy;
+ int numScreens, scrnum;
+
+ dpy = XOpenDisplay(displayName);
+ if (!dpy) {
+// kdDebug() << "Error: unable to open display " << displayName << endl;
+ return false;
+ }
+
+ lBox->addColumn(i18n("Information") );
+ lBox->addColumn(i18n("Value") );
+
+ l1 = new QListViewItem(lBox, i18n("Name of the Display"), DisplayString(dpy));
+ l1->setOpen(true);
+ l1->setSelectable(false);
+ l1->setExpandable(false);
+
+ numScreens = ScreenCount(dpy);
+
+ scrnum = 0;
+#ifdef KCMGL_MANY_SCREENS
+ for (; scrnum < numScreens; scrnum++)
+#endif
+ {
+ mesa_hack(dpy, scrnum);
+
+ l2 = get_gl_info(dpy, scrnum, true, l1, l2);
+ if (l2) l2->setOpen(true);
+
+ if (IsDirect) l2 = get_gl_info(dpy, scrnum, false, l1, l2);
+
+// TODO print_visual_info(dpy, scrnum, mode);
+ }
+ if (l2)
+ print_glx_glu(l1, l2);
+ else
+ KMessageBox::error(0, i18n("Could not initialize OpenGL"));
+
+ XCloseDisplay(dpy);
+ return true;
+ }
+
+bool GetInfo_OpenGL(QListView * lBox)
+{
+ return GetInfo_OpenGL_Generic(lBox);
+}
+
+#endif /* INFO_OPENGL_AVAILABLE */
+
diff --git a/kcontrol/info/opengl.desktop b/kcontrol/info/opengl.desktop
new file mode 100644
index 000000000..07d6b76ce
--- /dev/null
+++ b/kcontrol/info/opengl.desktop
@@ -0,0 +1,147 @@
+[Desktop Entry]
+Exec=kcmshell opengl
+Icon=kcmopengl
+Type=Application
+DocPath=kinfocenter/opengl/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=opengl
+X-KDE-ParentApp=kinfocenter
+
+Name=OpenGL
+Name[bn]=ওপেন-জি-এল
+Name[hi]=ओपन-जीएल
+Name[ne]=खुला GL
+Name[rw]=GufunguraGL
+Name[ta]=ஓபன் ஜிஎல்
+Name[te]=ఓపెన్ జిఎల్
+
+Comment=OpenGL information
+Comment[af]=OpenGL informasie
+Comment[ar]=معلومات OpenGL
+Comment[az]=OpenGL mə'lumatı
+Comment[be]=Інфармацыя аб OpenGL
+Comment[bg]=Информация за OpenGL
+Comment[bn]=ওপেন-জি-এল সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn OpenGL
+Comment[bs]=Informacije o OpenGL-u
+Comment[ca]=Informació OpenGL
+Comment[cs]=Informace o OpenGL
+Comment[csb]=Wëdowiédzô ò OpenGL
+Comment[da]=OpenGL-information
+Comment[de]=Informationen zu OpenGL
+Comment[el]=Πληροφορίες OpenGL
+Comment[eo]=OpenGLa informo
+Comment[es]=Información OpenGL
+Comment[et]=OpenGL info
+Comment[eu]=OpenGL informazioa
+Comment[fa]=اطلاعات OpenGL
+Comment[fi]=OpenGL-tiedot
+Comment[fr]=Informations OpenGL
+Comment[fy]=OpenGL-ynformaasje
+Comment[ga]=Eolas faoi OpenGL
+Comment[gl]=Información de OpenGL
+Comment[he]=מידע אודות OpenGL
+Comment[hi]=ओपन-जीएल जानकारी
+Comment[hr]=OpenGL podaci
+Comment[hu]=OpenGL-jellemzők
+Comment[id]=Informasi OpenGL
+Comment[is]=OpenGL upplýsingar
+Comment[it]=Informazioni sull'OpenGL
+Comment[ja]=OpenGL 情報
+Comment[ka]=ცნობები OpenGL -ს შესახებ
+Comment[kk]=OpenGL мәліметі
+Comment[km]=ព័ត៌មាន OpenGL
+Comment[ko]=OpenGL 정보
+Comment[lt]=OpenGL informacija
+Comment[lv]=OpenGL informācija
+Comment[mk]=Информации за OpenGL
+Comment[ms]=Maklumat OpenGL
+Comment[mt]=Informazzjoni dwar OpenGL
+Comment[nb]=OpenGL-informasjon
+Comment[nds]=OpenGL-Informatschoon
+Comment[ne]=खुला GL सूचना
+Comment[nl]=OpenGL-informatie
+Comment[nn]=OpenGL-informasjon
+Comment[pa]=OpenGL ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje OpenGL
+Comment[pt]=Informação sobre OpenGL
+Comment[pt_BR]=Informações sobre OpenGL
+Comment[ro]=Informații OpenGL
+Comment[ru]=Сведения о OpenGL
+Comment[rw]= Ibisobanuro GufunguraGL
+Comment[se]=OpenGL-diehtu
+Comment[sk]=Informácie o OpenGL
+Comment[sl]=Informacije o OpenGL
+Comment[sr]=Информације о OpenGL-у
+Comment[sr@Latn]=Informacije o OpenGL-u
+Comment[sv]=Information om OpenGL
+Comment[ta]=ஓபன் ஜிஎல் தகவல்
+Comment[te]=ఓపెన్ జిఎల్ సమాచారం
+Comment[tg]=КушоданGL ахбор
+Comment[th]=ข้อมูล OpenGL
+Comment[tr]=OpenGL Bilgisi
+Comment[tt]=OpenGL turında
+Comment[uk]=Інформація про OpenGL
+Comment[uz]=OpenGL haqida maʼlumot
+Comment[uz@cyrillic]=OpenGL ҳақида маълумот
+Comment[vi]=Thông tin về OpenGL
+Comment[wa]=Informåcion so OpenGL
+Comment[zh_CN]=OpenGL 信息
+Comment[zh_TW]=OpenGL 資訊
+
+Keywords=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display
+Keywords[az]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display, Displey, Avadanlıq,Qrafika
+Keywords[be]=Відэакарта,паскарэнне,графіка,сервер X,дысплей,экран,OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display
+Keywords[bg]=видеокарта, хардуер,екран, ускорение, графика, OpenGL, DRI, GLX, 3D, VideoCard, Hardware Acceleration, Graphics, X, X11, Xserver, X-Server, XFree86, Display
+Keywords[bs]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,Grafika
+Keywords[ca]=OpenGL,DRI,GLX,3D,Targeta de vídeo,Hardware Acceleració,Gràfics,X,X11,Xserver,Servidor X,XFree86,Pantalla
+Keywords[cs]=OpenGL,DRI,GLX,3D,videokarta,akcelerace,grafika,X,X11,Xserver,X-Server,XFree86,Display
+Keywords[csb]=OpenGL,DRI,GLX,3D,graficznô karta,grafika,X,X11,Xserver,X-Server,XFree86,ekran
+Keywords[da]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Grafik,X,X11,Xserver,X-Server,XFree86,Skærm
+Keywords[el]=OpenGL,DRI,GLX,3D,Κάρτα Γραφικών,Υλικό Επιτάχυνση,Γραφικά,X,X11,Xserver,X-Server,XFree86,Οθόνη
+Keywords[eo]=OpenGL,DRI,GLX,3D,VideoCard,Hardware akcelo,grafikoj,X,X11,Xserver,X-Server,XFree86,ekrano
+Keywords[es]=OpenGL,DRI,GLX,3D,Tarjeta, Grafica,Hardware Aceleradora,Gráficos,X,X11,Xserver,X-Server,XFree86,Monitor
+Keywords[et]=OpenGL,DRI,GLX,3D,Videokaart,Riistvaraline kiirendus,Graafika,X,X11,Xserver,X-Server,XFree86,Kuva
+Keywords[fa]=OpenGL، DRI، GLX، سه بعدی، کارت ویدیو، شتاب‌دهی سخت‌افزار، نگاره‌ای ، X، X11، Xserver، کارساز، XFree86، صفحه نمایش
+Keywords[fr]=OpenGL,DRI,GLX,3D,carte graphique,carte vidéo,accélération matérielle,graphismes,X,X11,serveur X,XServer,XFree86,affichage
+Keywords[fy]=OpenGL,DRI,GLX,3D,grafyske kaart,hurd guod -fersnelling,grafysk,graphics,X,X11,Xserver,X-Server,XFree86,display,byldskerm
+Keywords[ga]=OpenGL,DRI,GLX,3D,FísChárta,Luasú Crua-Earraí,Grafaic,X,X11,Freastalaí-X,XFree86,Scáileán
+Keywords[gl]=OpenGL,DRI,GLX,3D,Tarxeta de Vídeo,Aceleración por Hardware,Graficos,X,X11,Xserver,X-Server,XFree86,Display,Pantalla
+Keywords[he]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration, Graphics,X,X11,Xserver,X-Server,XFree86,Display,האצה, כרטיס, כרטיס מסך, מסך, תצוגה
+Keywords[hi]=ओपन-जीएल,डीआरआई,जीएलएक्स,3डी,वीडियो-कार्ड,हार्डवेयर एस्सेलरेशन,ग्राफिक्स,एक्स,एक्स11,एक्स-सर्वर,एक्ससर्वर,एक्सफ्री86,प्रदर्शक
+Keywords[hr]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,Video kartica,Grafička kartica,Hradversko ubrzavanje,Grafika,X poslužitelj,Zaslon
+Keywords[hu]=OpenGL,DRI,GLX,3D,videokártya,hardveres gyorsítás,grafika,X,X11,Xserver,X-Server,XFree86,képernyő
+Keywords[is]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,vélbúnaðarhröðun,Graphics,grafík,X,X11,Xserver,Xþjónn, X-Server,X-þjónn,XFree86,Display,skjár
+Keywords[it]=OpenGL,DRI,GLX,3D,SchedaVideo,Video,Accelerazione Hardware,Grafica,X,X11,Xserver,X-Server,XFree86,Display,Server X
+Keywords[ka]=OpenGL,DRI,GLX,3D,ვიდეოდაფა,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display
+Keywords[km]=OpenGL,DRI,GLX,3D,ប័ណ្ណ​វីដេអូ,បន្ទះ​បង្កើន​ល្បឿន​ផ្នែក​រឹង,Graphics,X,X11,Xserver,X-Server,XFree86,បង្ហាញ
+Keywords[lt]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,Video plokštė,aparatūros greitinimas,grafika
+Keywords[lv]=OpenGL,DRI,GLX,3D,VideoKarte,Dzelžu paātrināšana,Grafika,X,X11,Xserveris,X-Serveris,XFree86,Ekrāns
+Keywords[mk]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,Видео-картичка,Хардверско забрзување,Графика,екран,приказ
+Keywords[nb]=OpenGL,DRI,GLX,3D,skjermkort,maskinvareakselerasjon,bilde,X,X11,X-tenar,XFree86,skjerm
+Keywords[nds]=OpenGL,DRI,GLX,3D,Videokort,Hardware Acceleration,Grafik,X,X11,Xserver,X-Server,XFree86,Display,Dorstellen,Beslünigen
+Keywords[ne]=खुला GL, DRI, GLX, 3D,भिडियो कार्ड, हार्डवेयर गतिवर्धन, ग्राफिक्स, X, X11, Xसर्भर, X-सर्भर, X स्वतन्त्र 86, प्रदर्शन गर्नुहोस्
+Keywords[nl]=OpenGL,DRI,GLX,3D,videokaart,hardware-acceleratie,grafisch,graphics,X,X11,Xserver,X-Server,XFree86,display,beeldscherm
+Keywords[nn]=OpenGL,DRI,GLX,3D,skjermkort,maskinvareakselerasjon,grafikk,X,X11,X-tenar,XFree86,skjerm
+Keywords[pa]=OpenGL,DRI,GLX,3D,ਵੀਡਿਓਕਾਰਡ, ਹਾਰਡਵੇਅਰ ਪਰਵੇਸ਼ਕ,ਗਰਾਫਿਕਸ,X,X11,Xserver,X-Server,XFree86,ਦਰਿਸ਼
+Keywords[pl]=OpenGL,DRI,GLX,3D,karta graficzna,grafika,X,X11,Xserver,X-Server,XFree86,ekran
+Keywords[pt]=OpenGL,DRI,GLX,3D,Placa Vídeo,Aceleração por Hardware,Gráficos,X,X11,Servidor X,XFree86,Ecrã
+Keywords[pt_BR]=OpenGL,DRI,GLX,3D,Placa de Vídeo,Aceleração de Hardware,Gráficos,X,X11,Servidor X,X Server,XFree86,Display
+Keywords[ro]=OpenGL,DRI,GLX,3D,placă video,accelerare hardware,grafică,X,X11,Xserver,X-Server,XFree86,monitor
+Keywords[rw]=GufunguraGL,DRI,GLX,3D,IkaritaVidewo,Ukwihutisha Imashini,Ibishushanyo,X,X11,Xseriveri,X-Seriveri,XFree86,Kwerekana
+Keywords[sl]=OpenGL,DRI,GLX,3D,Strojna pospešitev,Grafika,X,X11,Xserver,X-Server,X-stežnik,X,XFree86,Zaslon
+Keywords[sr]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,видео картица,хардверско убрзање,графика
+Keywords[sr@Latn]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,video kartica,hardversko ubrzanje,grafika
+Keywords[sv]=OpenGL,DRI,GLX,3D,videokort,hårdvaruacceleration,grafik,X,X11,Xserver,X-server,Xfree86,skärm
+Keywords[ta]=ஓபன் ஜிஎல்,டிஆரை,ஜிஎல்X,முப்பரிமாணம்,வீடியோஅட்டை,வன்பொருள் முடுக்கம்,சித்திரங்கள்,X,X11,Xசேவகன்,X-சேவகன்,XFree86,காட்டு
+Keywords[th]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,จอแสดงผล
+Keywords[tr]=OpenGL,DRI,GLX,3D,VideoCard,Video kartı,Donanım Hızlandırma,Grafik,X,X11,Xserver,X-Server,X-Sunucu,Xsunucu,XFree86,Görüntü
+Keywords[uk]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,відео карта,3D акселерація,графіка,X сервер,монітор
+Keywords[vi]=OpenGL,DRI,GLX,3D,Bo mạch Video,Tăng tốc Phần cứng,Đồ hoạ,X,X11,Trình phục vụ Xserver,Trình phục vụ - X,XFree86,Hiển thị
+Keywords[wa]=OpenGL,DRI,GLX,3D,VideoCard,cåte videyo,Hardware Acceleration,Graphike,X,X11,Xserver,sierveu X,X-Server,XFree86,Display,håynaedje
+Keywords[zh_CN]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,显卡,硬件加速,图形,X 服务器,显示
+Keywords[zh_TW]=OpenGL,DRI,GLX,3D,VideoCard,Hardware Acceleration,Graphics,X,X11,Xserver,X-Server,XFree86,Display,顯示卡,硬體加速,圖形,顯示
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/partitions.desktop b/kcontrol/info/partitions.desktop
new file mode 100644
index 000000000..89851a34e
--- /dev/null
+++ b/kcontrol/info/partitions.desktop
@@ -0,0 +1,246 @@
+[Desktop Entry]
+Exec=kcmshell partitions
+Icon=kcmpartitions
+Type=Application
+DocPath=kinfocenter/partitions/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=partitions
+X-KDE-ParentApp=kinfocenter
+
+
+Name=Partitions
+Name[af]=Partisies
+Name[ar]=أقسام القرص الصلب
+Name[az]=Sabit Disk Bölmələri
+Name[be]=Раздзелы
+Name[bg]=Дялове
+Name[bn]=পার্টিশন
+Name[br]=Parzhadurioù
+Name[bs]=Particije
+Name[ca]=Particions
+Name[cs]=Oddíly disků
+Name[csb]=Particëje
+Name[cy]=Rhaniadau
+Name[da]=Partitioner
+Name[de]=Partitionen
+Name[el]=Κατατμήσεις
+Name[eo]=Subdiskoj
+Name[es]=Particiones
+Name[et]=Partitsioonid
+Name[eu]=Zatiketak
+Name[fa]=افرازها
+Name[fi]=Osiot
+Name[fy]=Partities
+Name[ga]=Deighiltí
+Name[gl]=Particións
+Name[he]=מחיצות
+Name[hi]=पार्टीशन्स
+Name[hr]=Particije
+Name[hu]=Partíciók
+Name[id]=Partisi
+Name[is]=Disksneiðar
+Name[it]=Partizioni
+Name[ja]=パーティション
+Name[ka]=განაყოფები
+Name[kk]=Бөлімдері
+Name[km]=ភាគ
+Name[ko]=파티션
+Name[lo]=ພາຕີຊັນ
+Name[lt]=Skirsniai
+Name[lv]=Partīcijas
+Name[mk]=Партиции
+Name[mn]=Хуваалтууд
+Name[ms]=Petak
+Name[mt]=Partitizzjonijiet
+Name[nb]=Partisjoner
+Name[nds]=Partitschonen
+Name[ne]=विभाजन
+Name[nl]=Partities
+Name[nn]=Partisjonar
+Name[nso]=Dikaroganyo
+Name[oc]=Particions
+Name[pa]=ਭਾਗ
+Name[pl]=Partycje
+Name[pt]=Partições
+Name[pt_BR]=Partições
+Name[ro]=Partiții
+Name[ru]=Разделы
+Name[rw]=Ibicedisiki
+Name[se]=Partišuvnnat
+Name[sk]=Diskové oddiely
+Name[sl]=Particije
+Name[sr]=Партиције
+Name[sr@Latn]=Particije
+Name[sv]=Partitioner
+Name[ta]=பகுதிகள்(பங்கீடுகள்)
+Name[te]=విభజనలు
+Name[tg]=Тақсимоти диски сахт
+Name[th]=พาร์ติชัน
+Name[tr]=Disk Bölümleri
+Name[tt]=Bülemnär
+Name[uk]=Розділи диску
+Name[uz]=Diskning qismlari
+Name[uz@cyrillic]=Дискнинг қисмлари
+Name[vi]=Phân vùng
+Name[wa]=Pårticions
+Name[xh]=Ulwahlulo ngokwamaqhekeza
+Name[zh_CN]=分区
+Name[zh_TW]=磁碟分割區
+Name[zu]=Izahluko
+
+Comment=Partition information
+Comment[af]=Partisie informasie
+Comment[ar]=معلومات أقسام القرص الصلب
+Comment[az]=Bölmələr Haqqında Mə'lumat
+Comment[be]=Інфармацыя аб раздзелах
+Comment[bg]=Информация за дяловете и дисковете
+Comment[bn]=পার্টিশন সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn ar parzhadur
+Comment[bs]=Informacije o particijama
+Comment[ca]=Informació de particions
+Comment[cs]=Informace o oddílech disků
+Comment[csb]=Wëdowiédzô ò particëjach
+Comment[cy]=Gwybodaeth rhaniad
+Comment[da]=Information om partitionerne
+Comment[de]=Informationen zur Partitionierung
+Comment[el]=Πληροφορίες για τις κατατμήσεις
+Comment[eo]=Informo pri subdiskoj
+Comment[es]=Información sobre las particiones
+Comment[et]=Partitsioonide info
+Comment[eu]=Zatiketei buruzko informazioa
+Comment[fa]=اطلاعات افرازها
+Comment[fi]=Osiotiedot
+Comment[fr]=Informations sur les partitions
+Comment[fy]=Partitie-ynformaasje
+Comment[gl]=Información das particións
+Comment[he]=מידע על מחיצות
+Comment[hi]=पार्टीशन जानकारी
+Comment[hr]=Podaci o particijama
+Comment[hu]=A partíciók adatai
+Comment[id]=Informasi partisi
+Comment[is]=Upplýsingar um skipulag disksneiða
+Comment[it]=Informazioni sulle partizioni
+Comment[ja]=パーティションの情報
+Comment[ka]=ცნობები გამოყენებული რესურსების შესახებ
+Comment[kk]=Диск бөлімдер мәліметі
+Comment[km]=ព័ត៌មាន​ភាគ
+Comment[ko]=파티션 정보
+Comment[lo]=ຂໍ້ມູນພາຕີຊັນ
+Comment[lt]=Skirsnių informacija
+Comment[lv]=Partīciju informācija
+Comment[mk]=Информации за партициите
+Comment[mn]=Хуваалтын мэдээлэл
+Comment[ms]=Maklumat petak
+Comment[mt]=Informazzjoni dwar partizzjonijiet
+Comment[nb]=Partisjoninformasjon
+Comment[nds]=Informatschoon över de Partitschonen
+Comment[ne]=विभाजन सूचना
+Comment[nl]=Partitie-informatie
+Comment[nn]=Partisjonsinformasjon
+Comment[nso]=Tshedimoso ya Dikaroganyo
+Comment[oc]=Informacion de particions
+Comment[pa]=ਭਾਗ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o partycjach dyskowych
+Comment[pt]=Informação sobre as partições
+Comment[pt_BR]=Informações sobre partições
+Comment[ro]=Informații despre partiții
+Comment[ru]=Сведения о использовании разделов
+Comment[rw]=Ibisobanuro Igicedisiki
+Comment[se]=Partišuvdnadiehtu
+Comment[sk]=Informácie o diskových oddieloch
+Comment[sl]=Podatki o particijah
+Comment[sr]=Информације о партицијама
+Comment[sr@Latn]=Informacije o particijama
+Comment[sv]=Partitionsinformation
+Comment[ta]=பகுதி தகவல்
+Comment[te]=విభజనల సమాచారం
+Comment[tg]=Иттилооти тақсимот
+Comment[th]=ข้อมูลพาร์ติชัน
+Comment[tr]=Bölümleme hakkında bilgi
+Comment[tt]=Bülemnär turında
+Comment[uk]=Інформація щодо розділів диску
+Comment[uz]=Diskning qismlari haqida maʼlumot
+Comment[uz@cyrillic]=Дискнинг қисмлари ҳақида маълумот
+Comment[ven]=Mafhungo au kovhekana
+Comment[vi]=Thông tin về phân vùng
+Comment[wa]=Informåcion sol pårtixhaedje del deure plake
+Comment[xh]=Ulwazi lowahlulelwano ngokwamaqhekeza
+Comment[zh_CN]=分区信息
+Comment[zh_TW]=磁碟分割區資訊
+Comment[zu]=Ulwazi Lokwehlukanisa
+
+Keywords=Partitions,Harddrive,HD,System Information
+Keywords[af]=Partitions,Harddrive,HD,System Informasie
+Keywords[ar]=Partitions,Harddrive,HD,System Information,القرص الصلب,الأقراص الصلبة,معلومات النظام
+Keywords[az]=Partitions,Harddrive,HD,System Information,Bölmələr,Sabit disk,HD,Sistem Haqqında Mə'lumat
+Keywords[be]=Раздзелы,Жорсткі дыск,Сістэмная інфармацыя,Partitions,Harddrive,HD,System Information
+Keywords[bg]=информация, система, системна, дял, дялове, диск, твърд, хард, Partitions, Harddrive, HD, System Information
+Keywords[br]=Parzhadur,pladenn galet,HD,titouroù reizhiad
+Keywords[bs]=Partitions,Harddrive,HD,System Information,Particije,hard disk,informacije o sustavu
+Keywords[ca]=Particions,disc dur,HD,Informació del sistema
+Keywords[cs]=Oddíly disku,Pevný disk,HD,Informace o systému
+Keywords[csb]=particëje,cwiardi disk,HD,wëdowiédzô ò systemie
+Keywords[cy]=Rhaniadau,Disg Caled,DC,Gwybodaeth Cysawd
+Keywords[da]=Partitioner,Harddisk,HD,Systeminformation
+Keywords[de]=Partitionen,Festplatten,Laufwerke,HD,Systeminformation
+Keywords[el]=Κατατμήσεις,Σκληρός Δίσκος,HD,Πληροφορίες συστήματος
+Keywords[eo]=subdisko,disko,sistemo,operaciumo,informo
+Keywords[es]=Particiones,Disco duro,Información del sistema
+Keywords[et]=Partitsioonid,kõvaketas,HD,Süsteemi info
+Keywords[eu]=Zatiketak,Disko gogorra,HD,Sistemaren informazioa
+Keywords[fa]=افرازها، گردانندۀ سخت ،HD ،اطلاعات سیستم
+Keywords[fi]=Osiot,Kiintolevy,HD,Järjestelmätiedot
+Keywords[fr]=partitions,disque dur,HD,DD,informations système
+Keywords[fy]=partities,Hardrive, HD,systeemynformaasje,fêste skiif
+Keywords[ga]=Deighiltí,Tiomántán Crua,HD,Eolas faoin Chóras
+Keywords[gl]=Particións,Disco duro,HD,Información do Sistema
+Keywords[he]=מחיצות,כונן קשיח,מידע מערכת, Partitions,Harddrive,HD,System Information
+Keywords[hi]=पार्टीशन्स,हार्डड्राइव,एचडी,तंत्र जानकारी
+Keywords[hr]=Partitions,Harddrive,HD,System Information,Particije,hard disk,Podaci o sustavu,Tvrdi disk
+Keywords[hu]=partíciók,merevlemez,HD,rendszerinformáció
+Keywords[id]=Partisi,Harddrive,HD,Informasi Sistem
+Keywords[is]=Sneiðar,Disksneiðar,Harðir diskar,Harður diskur,kerfi,upplýsingar
+Keywords[it]=partizioni,disco rigido,hard disk,HD,informazioni sul sistema
+Keywords[ja]=パーティション,ハードドライブ,HD,システムの情報
+Keywords[km]=ភាគ,ដ្រាយ​រឹង,HD,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=ພາຕີຊັນ,ຮາດໄດຣຟ์,HD,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=Skirsniai,Kietasis diskas,HD,Sistemos Informacija
+Keywords[lv]=Partīcijas,CietaisDisks,HD,Sistēmas Informācija
+Keywords[mk]=Partitions,Harddrive,HD,System Information,Партиции,Тврд диск,Информации за системот
+Keywords[mn]=Хуваалтууд,Хатуу диск,Диск хөтлөгч,HD,Системийн мэдээлэл
+Keywords[nb]=Partisjoner,Platelager,Harddisk,HD,Systeminformasjon
+Keywords[nds]=Partitschonen,Fastplaat,HD,Systeeminformatschoon
+Keywords[ne]=विभाजन, हार्ड ड्राइभ,HD, प्रणाली सूचना
+Keywords[nl]=partities,harddrive,HD,systeeminformatie,harde schijf
+Keywords[nn]=partisjonar,harddisk,HD,systeminformasjon
+Keywords[nso]=Dikaroganyo,Kotlelo ye Bothata,HD,Tshedimoso ya System
+Keywords[oc]=Particions,disc dur,HD,Informacion dèu sistemo
+Keywords[pa]=Partitions,Harddrive,HD,ਸਿਸਟਮ ਜਾਣਕਾਰੀ,ਭਾਗ,ਹਾਰਡ ਡਿਸਕ
+Keywords[pl]=partycje,twardy dysk,HD,informacja o systemie
+Keywords[pt]=partições,disco rígido,HD,informações do sistema
+Keywords[pt_BR]=Partições,Disco Rígido,Informações de sistema
+Keywords[ro]=partiții,harddisk,hard-disk,HD,hdd,informații despre sistem
+Keywords[rw]=Ibicedisiki,Ububikodisiki,HD,Amakuru Sisitemu
+Keywords[se]=partišuvnnat,garraskearru,HD,vuogádatdieđut
+Keywords[sk]=Partície,oddiely,Pevný disk,HD,Systémové informácie
+Keywords[sl]=particije,trdi disk,HD,informacije o sistemu
+Keywords[sr]=Partitions,Harddrive,HD,System Information,партиције,харддиск,системске информације
+Keywords[sr@Latn]=Partitions,Harddrive,HD,System Information,particije,harddisk,sistemske informacije
+Keywords[sv]=Partitioner,Hårddisk,HD,Systeminformation
+Keywords[ta]=பகுதிகள், வன் சாதனம்,எச்டி,அமைப்பு தகவல்
+Keywords[th]=พาร์ติชัน,ฮาร์ดไดรฟ์,HD,ข้อมูลระบบ
+Keywords[tr]=Bölümleme,Sabitdisk,HD,Sistem Hakkında Bilgi
+Keywords[uk]=розділи диску,жорсткий диск,HD,системна інформація
+Keywords[uz]=Diskning qismlari,qattiq disk,HD,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=Дискнинг қисмлари,қаттиқ диск,HD,Тизим ҳақида маълумот
+Keywords[ven]=Partitions,Harddrive,HD,Mafhungo a sisitemu
+Keywords[vi]=Phân vùng,Ổ cứng,HD,Thông tin Hệ thống
+Keywords[wa]=pårticions,deure plake,HD,informåcion do sistinme
+Keywords[xh]=Ulwahlulelwano ngokwamaqhekeza,Harddrive,HD,Ulwazi lwendlela yokusebenza
+Keywords[zh_CN]=Partitions,Harddrive,HD,System Information,分区,硬盘,系统信息
+Keywords[zh_TW]=Partitions,Harddrive,HD,System Information,磁碟分割區,硬式磁碟機,硬碟,系統資訊
+Keywords[zu]=Izahluko,Harddrive,HD,Ulwazi Lwesistimu
+
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/pci.desktop b/kcontrol/info/pci.desktop
new file mode 100644
index 000000000..9ee4452b3
--- /dev/null
+++ b/kcontrol/info/pci.desktop
@@ -0,0 +1,180 @@
+[Desktop Entry]
+Exec=kcmshell pci
+Icon=kcmpci
+Type=Application
+DocPath=kinfocenter/pci/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=pci
+X-KDE-ParentApp=kinfocenter
+
+Name=PCI
+Name[bn]=পি-সি-আই
+Name[cs]=PCI sběrnice
+Name[he]=התקני PCI
+Name[hi]=पीसीआई
+Name[is]=PCI-braut
+Name[lo]=ອຸປະກອນ PCI
+Name[ne]=पीसीआई
+Name[ro]=Magistrala PCI
+Name[ru]=Шина PCI
+Name[te]=పిసిఐ
+Name[th]=อุปกรณ์ PCI
+Name[uk]=Шина PCI
+
+Comment=PCI information
+Comment[af]=PCI informasie
+Comment[ar]=معلومات PCI
+Comment[az]=PCI haqqında mə'lumat
+Comment[be]=Інфармацыя аб PCI
+Comment[bg]=Информация за PCI шината
+Comment[bn]=পি-সি-আই তথ্য
+Comment[br]=Titouroù diwar-benn ar PCI
+Comment[bs]=Informacije o PCI uređajima
+Comment[ca]=Informació de PCI
+Comment[cs]=Informace o PCI
+Comment[csb]=Wëdowiédzô ò PCI
+Comment[cy]=Gwybodaeth PCI
+Comment[da]=PCI-information
+Comment[de]=Informationen zu PCI
+Comment[el]=Πληροφορίες PCI
+Comment[eo]=Informo pri PCI
+Comment[es]=Información sobre los dispositivos PCI
+Comment[et]=PCI info
+Comment[eu]=PCIri buruzko informazioa
+Comment[fa]=اطلاعات PCI
+Comment[fi]=PCI-tietoja
+Comment[fr]=Informations PCI
+Comment[fy]=PCI-Ynformaasje
+Comment[ga]=Eolas PCI
+Comment[gl]=Información de PCI
+Comment[he]=מידע על התקני PCI
+Comment[hi]=पीसीआई जानकारी
+Comment[hr]=Podaci o PCI sabirnici
+Comment[hu]=PCI-információk
+Comment[id]=Informasi PCI
+Comment[is]=Upplýsingar um PCI-braut
+Comment[it]=Informazioni sul bus PCI
+Comment[ja]=PCI の情報
+Comment[ka]=ცნობები PCI მოწყობილობების შესახებ
+Comment[kk]=PCI құрылғылар мәліметі
+Comment[km]=ព័ត៌មាន PCI
+Comment[ko]=PCI 정보
+Comment[lo]=ຂໍ້ມູນອຸປະກອນ PCI
+Comment[lt]=PCI informacija
+Comment[lv]=PCI informācija
+Comment[mk]=Информации за PCI
+Comment[mn]=PCI-н мэдээлэл
+Comment[ms]=Maklumat PCI
+Comment[mt]=Informazzjoni dwar PCI
+Comment[nb]=PCI-informasjon
+Comment[nds]=Informatschoon över PCI
+Comment[ne]=पीसीआई सूचना
+Comment[nl]=PCI-informatie
+Comment[nn]=PCI-informasjon
+Comment[nso]=Tshedimoso ya PCI
+Comment[oc]=Informacion de PCI
+Comment[pa]=PCI ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o PCI
+Comment[pt]=Informação sobre o PCI
+Comment[pt_BR]=Informações PCI
+Comment[ro]=Informații despre magistrala PCI
+Comment[ru]=Сведения о устройствах PCI
+Comment[rw]= Ibisobanuro PCI
+Comment[se]=PCI-diehtu
+Comment[sk]=Informácie o PCI
+Comment[sl]=Podatki o vodilu PCI
+Comment[sr]=PCI информације
+Comment[sr@Latn]=PCI informacije
+Comment[ss]=Umniningwane we PCI
+Comment[sv]=PCI-information
+Comment[ta]=PCI தகவல்
+Comment[te]=పిసిఐ సమాచారం
+Comment[tg]=Иттилооти PCI
+Comment[th]=ข้อมูลอุปกรณ์ PCI
+Comment[tr]=PCI hakkında bilgi
+Comment[tt]=PCI turında
+Comment[uk]=Інформація щодо шини PCI
+Comment[uz]=PCI uskunalar haqida maʼlumot
+Comment[uz@cyrillic]=PCI ускуналар ҳақида маълумот
+Comment[ven]=Mafhungo a PCI
+Comment[vi]=Thông tin về PCI
+Comment[wa]=Informåcion so PCI
+Comment[xh]=Inkcukacha ye PCI
+Comment[zh_CN]=PCI 信息
+Comment[zh_TW]=PCI 資訊
+Comment[zu]=Ulwazi lwe-PCI
+
+Keywords=PCI,PCI-Devices,PCI-Bus,System Information
+Keywords[af]=PCI,PCI-Devices,PCI-Bus,System Informasie
+Keywords[ar]=PCI,أجهزة PCI,PCI-Bus,معلومات النظام
+Keywords[az]=PCI,PCI-Avadanlıqları,PCI-Bus,Sistem Haqqında Mə'lumat
+Keywords[be]=Прылады PCI,Сістэмная інфармацыя,PCI,PCI-Devices,PCI-Bus,System Information
+Keywords[bg]=информация, система, системна, шина, PCI, PCI-Devices, PCI-Bus, System Information
+Keywords[br]=PCI,trobarzhelloù PCI,bus PCI,titouroù reizhiad
+Keywords[bs]=PCI,PCI-Devices,PCI-Bus,System Information,PCI uređaji,PCI-uređaji,PCI-sabirnica,informacije o sustavu
+Keywords[ca]=PCI,Dispositius PCI,Bus PCI,Informació del sistema
+Keywords[cs]=PCI,PCI-zařízení,PCI-sběrnice,Informace o systému
+Keywords[csb]=PCI,ùrządzenia PCI,magistrala PCI,wëdowiédzô ò systemie
+Keywords[cy]=PCI,Dyfeisiau-PCI,Bws-PCI,Gwybodaeth Cysawd
+Keywords[da]=PCI,PCI-enheder,PCI-bus,Systeminformation
+Keywords[de]=PCI,PCI-Geräte,PCI-Bus,Systeminformation
+Keywords[el]=PCI,Συσκευές PCI,Δίαυλος PCI,Πληροφορίες συστήματος
+Keywords[eo]=PCI,aparato,buso,sistemo,operaciumo,informo
+Keywords[es]=PCI,Dispositivos PCI,Bus PCI,Información del sistema
+Keywords[et]=PCI,PCi seadmed,PCI siin,Süsteemi info
+Keywords[eu]=PCI,PCI-gailuak,PCI busa,Sistemaren informazioa
+Keywords[fa]=PCI ،دستگاههای PCI ،گذرگاه PCI ،اطلاعات سیستم
+Keywords[fi]=PCI,PCI-Laitteet,PCI-Väylä,Järjestelmätiedot
+Keywords[fr]=PCI,périphériques PCI,bus PCI,informations système,pci
+Keywords[fy]=PCI,PCI-devices,PCI-bus,systeemynformaasje,PCI-apparaten
+Keywords[gl]=PCI,Dispositivos PCI,Bus PCI,Información do Sistema
+Keywords[he]=מידע מערכת,אפיק PCI,התקני PCI,PCI,System Information
+Keywords[hi]=पीसीआई,पीसीआई-औज़ार,पीसीआई-बस,तंत्र जानकारी
+Keywords[hr]=PCI,PCI-Devices,PCI-Bus,System Information,PCI uređaji,PCI sabirnica,Podaci o sustavu
+Keywords[hu]=PCI,PCI-eszközök,PCI-busz,rendszerinformáció
+Keywords[id]=PCI,PCI-Divais,PCI-Bus,Informasi Sistem
+Keywords[is]=PCI-tæki,PCI-braut,kerfi,upplýsingar
+Keywords[it]=PCI,dispositivi PCI,bus PCI,informazioni sul sistema
+Keywords[ja]=PCI,PCI-デバイス,PCI-バス,システムの情報
+Keywords[km]=PCI,ឧបករណ៍ PCI,ខ្សែ​បញ្ជូន PCI,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=ອຸປະກອນ PCI,ບັສ PCI,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=PCI,PCI-įrenginiai,PCI-Bus,Sistemos Informacija
+Keywords[lv]=PCI,PCI-Iekārtas,PCI-Šina,Sistēmas Informācija
+Keywords[mk]=PCI,PCI-Devices,PCI-Bus,System Information,PCI уреди,PCI магистрала,PCI собирница,Информации за системот
+Keywords[mn]=PCI,PCI-төхөөрөмж,PCI-Bus,Системийн мэдээлэл
+Keywords[nb]=PCI,PCI-enheter,PCI-buss,Systeminformasjon
+Keywords[nds]=PCI,PCI-Reedschappen,PCI Bus,Systeeminformatschoon
+Keywords[ne]=पीसीआई, पीसीआई-यन्त्र, पीसीआई-बस, प्रणाली सूचना
+Keywords[nl]=PCI,PCI-devices,PCI-bus,systeeminformatie,PCI-apparaten
+Keywords[nn]=PCI,PCI-einingar,PCI-buss,systeminformasjon
+Keywords[nso]=PCI,Maano a PCI,PCI-Bus,Tshedimoso ya System
+Keywords[oc]=PCI,Dispositius PCI,Bus PCI,Informacion dèu sistemo
+Keywords[pa]=PCI,PCI-ਜੰਤਰ,PCI-Bus,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=PCI,urządzenia PCI,magistrala PCI,informacja o systemie
+Keywords[pt]=PCI,dispositivos PCI,bus PCI,informações do sistema
+Keywords[pt_BR]=PCI,dispositivos PCI,Barramento PCI,Barramento PCI,Informações de sistema
+Keywords[ro]=PCI,dispozitive PCI,bus PCI,informații despre sistem
+Keywords[rw]=PCI,Apareye-PCI,Bisi-PCI,Amakuru Sisitemu
+Keywords[se]=PCI,PCI-ovttadagat,PCI-bussa,vuogádatdiehtu
+Keywords[sk]=PCI,PCI-zariadenia,PCI-zbernica,Systémové informácie
+Keywords[sl]=PCI,naprave PCI,vodilo PCI,informacije o sistemu
+Keywords[sr]=PCI,PCI-Devices,PCI-Bus,System Information,PCI уређаји,PCI магистрала,системске информације
+Keywords[sr@Latn]=PCI,PCI-Devices,PCI-Bus,System Information,PCI uređaji,PCI magistrala,sistemske informacije
+Keywords[sv]=PCI,PCI-enheter,PCI-buss,Systeminformation
+Keywords[ta]=PCI,PCI-சாதனங்கள்,PCI-பஸ்,சாதன தகவல்
+Keywords[te]=పిసిఐ,పిసిఐ-పరికరాలు,పిసిఐ-బస్, వ్యవస్థ సమాచారం
+Keywords[th]=อุปกรณ์ PCI,บัส PCI,ข้อมูลระบบ
+Keywords[tr]=PCI,PCI-Aygıtları,PCI-Bus,Sistem Hakkında Bilgi
+Keywords[uk]=PCI,пристрої PCI,шина PCI,системна інформація
+Keywords[uz]=PCI,PCI uskunalari,PCI-Bus,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=PCI,PCI ускуналари,PCI-Bus,Тизим ҳақида маълумот
+Keywords[ven]=PCI,Maano a PCI,PCI Bus,Mafhungo a sisitemu
+Keywords[vi]=PCI,Thiết bị PCI,Thông tin Hệ thống
+Keywords[wa]=PCI,éndjins PCI,Bus PCI,informåcion do sistinme
+Keywords[xh]=PCI,PCI-Amacebo,PCI-Ibhasi,Ulwazi lwendlela
+Keywords[zh_CN]=PCI,PCI-Devices,PCI-Bus,System Information,PCI 设备,PCI 总线,系统信息
+Keywords[zh_TW]=PCI,PCI-Devices,PCI-Bus,System Information,PCI 設備,PCI 匯流排,系統資訊
+Keywords[zu]=PCI,Amathuluzi-PCI,Ibhasi-PCI,Ulwaz Lwesistimu
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/processor.desktop b/kcontrol/info/processor.desktop
new file mode 100644
index 000000000..580aa7e3a
--- /dev/null
+++ b/kcontrol/info/processor.desktop
@@ -0,0 +1,249 @@
+[Desktop Entry]
+Exec=kcmshell processor
+Icon=kcmprocessor
+Type=Application
+DocPath=kinfocenter/processor/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=cpu
+X-KDE-ParentApp=kinfocenter
+
+Name=Processor
+Name[af]=Verwerker
+Name[ar]=المعالج
+Name[az]=İşlədici
+Name[be]=Працэсар
+Name[bg]=Процесор
+Name[bn]=প্রসেসর
+Name[br]=Kewerier
+Name[bs]=Procesor
+Name[ca]=Processador
+Name[cs]=Procesor
+Name[csb]=Procesora
+Name[cy]=Prosesydd
+Name[de]=Prozessor
+Name[el]=Επεξεργαστής
+Name[eo]=Procezilo
+Name[es]=Procesador
+Name[et]=Protsessor
+Name[eu]=Prozesagailua
+Name[fa]=پردازنده
+Name[fi]=Prosessori
+Name[fr]=Processeur
+Name[fy]=Ferwurkingsienheid
+Name[ga]=Próiseálaí
+Name[gl]=Procesador
+Name[he]=מעבד
+Name[hi]=प्रोसेसर
+Name[hr]=Procesor
+Name[hu]=Processzor
+Name[id]=Prosesor
+Name[is]=Örgjörvi
+Name[it]=Processore
+Name[ja]=プロセッサ
+Name[ka]=პროცესორი
+Name[kk]=Процессор
+Name[km]=ខួរក្បាល
+Name[ko]=프로세서
+Name[lo]=ໂພຣເຊັດເຊີ
+Name[lt]=Procesorius
+Name[lv]=Procesors
+Name[mk]=Процесор
+Name[mn]=Процессор
+Name[ms]=Pemproses
+Name[mt]=CPU
+Name[nb]=Prosessor
+Name[nds]=Perzesser
+Name[ne]=प्रोसेसर
+Name[nn]=Prosessor
+Name[nso]=Mophethagatsi
+Name[oc]=Processador
+Name[pa]=ਪਰੋਸੈਸਰ
+Name[pl]=Procesor
+Name[pt]=Processador
+Name[pt_BR]=Processador
+Name[ro]=Procesor
+Name[ru]=Процессор
+Name[rw]=Munonosora
+Name[se]=Doaimmár
+Name[sk]=Procesor
+Name[sl]=Procesor
+Name[sr]=Процесор
+Name[sr@Latn]=Procesor
+Name[ss]=Sichubi
+Name[ta]=செயல்முறையாக்கம்
+Name[te]=ప్రాసెసర్
+Name[tg]=Протсессор
+Name[th]=หน่วยประมวลผล
+Name[tr]=İşlemci
+Name[tt]=Prosessor
+Name[uk]=Процесор
+Name[uz]=Protsessor
+Name[uz@cyrillic]=Процессор
+Name[ven]=Mubveledzi
+Name[vi]=Bộ vi xử lý
+Name[wa]=Processeu
+Name[xh]=Umqhubekekisi phambili
+Name[zh_CN]=处理器
+Name[zh_TW]=處理器
+Name[zu]=Umqhubekisi
+
+Comment=Processor information
+Comment[af]=Verwerker informasie
+Comment[ar]=معلومات المعالج
+Comment[az]=İşlədici haqqında mə'lumat
+Comment[be]=Інфармацыя аб працэсары
+Comment[bg]=Информация за процесора(ите) на системата
+Comment[bn]=প্রসেসর তথ্য
+Comment[br]=Titouroù diwar-benn ar c'hewerier
+Comment[bs]=Informacije o procesoru
+Comment[ca]=Informació del processador
+Comment[cs]=Informace o procesoru
+Comment[csb]=Wëdowiédzô ò procesorze
+Comment[cy]=Gwybodaeth prosesydd
+Comment[da]=Information om processoren
+Comment[de]=Informationen zum Prozessor
+Comment[el]=Πληροφορίες για τον επεξεργαστή
+Comment[eo]=Informo pri procezilo
+Comment[es]=Información sobre el procesador
+Comment[et]=Protsessori info
+Comment[eu]=Prozesagailuari buruzko informazioa
+Comment[fa]=اطلاعات پردازنده
+Comment[fi]=Tietoja prosessorista
+Comment[fr]=Informations sur le processeur
+Comment[fy]=Ferwurkingsienheid ynformaasje
+Comment[ga]=Eolas faoin phróiseálaí
+Comment[gl]=Información do Procesador
+Comment[he]=מידע על המעבד
+Comment[hi]=प्रोसेसर जानकारी
+Comment[hr]=Podaci o procesoru
+Comment[hu]=A processzor jellemzői
+Comment[id]=Informasi Prosesor
+Comment[is]=Upplýsingar um örgjörva
+Comment[it]=Informazioni sul processore
+Comment[ja]=プロセッサの情報
+Comment[ka]=ინფორმაცია პროცესორის შესახებ
+Comment[kk]=Процессор мәліметі
+Comment[km]=ព័ត៌មាន​ខួរក្បាល
+Comment[ko]=프로세서 정보
+Comment[lo]=ຂໍ້ມູນໂພຣເຊັດເຊີ
+Comment[lt]=Procesoriaus informacija
+Comment[lv]=Procesora informācija
+Comment[mk]=Информации за процесорот
+Comment[mn]=Процессорын мэдээлэл
+Comment[ms]=Maklumat pemproses
+Comment[mt]=Informazzjoni dwar CPU
+Comment[nb]=Prosessorinformasjon
+Comment[nds]=Informatschoon över den Perzesser
+Comment[ne]=प्रोसेसर सूचना
+Comment[nl]=Processorinformatie
+Comment[nn]=Prosessorinformasjon
+Comment[nso]=Tshedimoso ya Mophethagatsi
+Comment[oc]=Informacion dèu processador
+Comment[pa]=ਪਰੋਸੈਸਰ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o procesorze
+Comment[pt]=Informação sobre o processador
+Comment[pt_BR]=Informações sobre o processador
+Comment[ro]=Informații despre parametrii microprocesorului
+Comment[ru]=Сведения о процессоре
+Comment[rw]= Ibisobanuro bya Munonosora
+Comment[se]=Doaimmárdieđut
+Comment[sk]=Informácie o procesore
+Comment[sl]=Podatki o procesorju
+Comment[sr]=Информације о процесору
+Comment[sr@Latn]=Informacije o procesoru
+Comment[ss]=Umniningwane wesichubi
+Comment[sv]=Processorinformation
+Comment[ta]=செயல்முறை தகவல்
+Comment[te]=ప్రాసెసర్ సమాచారం
+Comment[tg]=Иттилооти Протсессор
+Comment[th]=ข้อมูลหน่วยประมวลผล
+Comment[tr]=İşlemci hakkında bilgi
+Comment[tt]=Processor turında
+Comment[uk]=Інформація щодо процесора
+Comment[uz]=Protsessor haqida maʼlumot
+Comment[uz@cyrillic]=Процессор ҳақида маълумот
+Comment[ven]=Mafhungo a mubveledzi
+Comment[vi]=Thông tin về bộ vi xử lý
+Comment[wa]=Informåcion sol processeu
+Comment[xh]=Inkcukacha yenkcukacha
+Comment[zh_CN]=处理器信息
+Comment[zh_TW]=處理器資訊
+Comment[zu]=Ulwazi lomqhubekisi
+
+Keywords=Processor,CPU,FPU,MHz,System Information
+Keywords[af]=Processor,CPU,FPU,MHz,System Informasie
+Keywords[ar]=المعالج,CPU,FPU,MHz,معلومات النظام
+Keywords[az]=İşlədici,MİB,FPU,MHz,Sistem Haqqında Mə'lumat
+Keywords[be]=Працэсар,МГц,Сістэмная інфармацыя,Processor,CPU,FPU,MHz,System Information
+Keywords[bg]=информация, система, системна, процесор, Processor, CPU, FPU, MHz, System Information
+Keywords[br]=Kewerier,UTK,UNS,MHz,titouroù reizhiad
+Keywords[bs]=Processor,CPU,FPU,MHz,System Information,procesor,informacije o sustavu
+Keywords[ca]=Processador,CPU,FPU,MHz,Informació del sistema
+Keywords[cs]=Procesor,CPU,FPU,MHz,Informace o systému
+Keywords[csb]=procesora,CPU,JAL,FPU,MHz,wëdowiédzô ò systemie
+Keywords[cy]=Prosesydd,CPU,FPU,MHz,Gwybodaeth Cysawd
+Keywords[da]=Processor,CPU,FPU,MHz,Systeminformation
+Keywords[de]=Prozessor,CPU,FPU,MHz,Systeminformation
+Keywords[el]=Επεξεργαστής,KME,FPU,Πληροφορίες συστήματος
+Keywords[eo]=procezilo,CPU,FPU,MHz,frekvenco,sistemo,operaciumo,informo
+Keywords[es]=Procesador,CPU,FPU,MHz,Información del sistema
+Keywords[et]=Protsessor,CPU,FPU,MHz,Süsteemi info
+Keywords[eu]=Prozesagailua,CPU,FPU,MHz,Sistemaren informazioa
+Keywords[fa]=پردازنده، واحد پردازش مرکزی، FPU، مگاهرتز، اطلاعات سیستم
+Keywords[fi]=Prosessori,CPU,FPU,MHz,Järjestelmätiedot
+Keywords[fr]=processeur,CPU,FPU,MHz,informations système,cpu
+Keywords[fy]=Processor,Ferwurkingsienheid,CPU,FPU,MHz,Systeemynformaasje
+Keywords[ga]=Próiseálaí,CPU,LAP,FPU,MHz,Eolas faoin Chóras
+Keywords[gl]=Procesador,CPU,FPU,MHz,Información do Sistema
+Keywords[he]=FPU,מעבד,מעבד מתמטי,מגה־הרץ,מידע מערכת,System Information
+Keywords[hi]=प्रोसेसर,सीपीयू,एफपीयू,एमएचज़ेड,तंत्र जानकारी
+Keywords[hr]=Processor,CPU,FPU,MHz,System Information,procesor,Podaci o sustavu
+Keywords[hu]=processzor,CPU,FPU,MHz,rendszerinformáció
+Keywords[id]=Prosesor,CPU,FPU,MHz,Informasi Sistem
+Keywords[is]=örgjörvi,örgjörfi,Gjörvi,kerfi,upplýsingar,CPU,MHz,FPUz
+Keywords[it]=processore,CPU,FPU,MHz,informazioni sul sistema
+Keywords[ja]=プロセッサ,CPU,FPU,MHz,システムの情報
+Keywords[ka]=პროცესორი,CPU,FPU,MHz,ინფორმაცია სისტემის შესახებ
+Keywords[km]=ខួរក្បាល,CPU,FPU,MHz,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=ໂພຣເຊັດເຊີ,CPU,FPU,MHz,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=Procesorius,CPU,FPU,MHz,Sistemos Informacija
+Keywords[lv]=Procesors,CPU,FPU,MHz,Sistēmas Informācija
+Keywords[mk]=Processor,CPU,FPU,MHz,System Information,Процесор,Информации за системот
+Keywords[mn]=Процессор,CPU,FPU,MHz,Системийн мэдээлэл
+Keywords[ms]=Pemproses,CPU,FPU,MHz,Maklumat Sistem
+Keywords[nb]=Prosessor,CPU,FPU,Sentralenhet,MHz,Systeminformasjon
+Keywords[nds]=Perzesser,CPU,FPU,MHz,Systeeminformatschoon
+Keywords[ne]=प्रोसेसर, सीपीयू, एफपीयू, एमएचजेड, प्रणाली सूचना
+Keywords[nl]=processor,CPU,FPU,MHz,systeeminformatie
+Keywords[nn]=prosessor,CPU,FPU,MHz,systeminformasjon
+Keywords[nso]=Mophethagatsi,CPU,FPU,MHz,Tshedimoso ya System
+Keywords[oc]=Processador,CPU,FPU,MHz,Informacion dèu sistemo
+Keywords[pa]=ਪਰੋਸੈਸਰ,CPU,FPU,MHz,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=procesor,CPU,JAL,FPU,MHz,informacja o systemie
+Keywords[pt]=processador,CPU,FPU,MHz,informações do sistema
+Keywords[pt_BR]=Processador,CPU,FPU,MHz,Informações de sistema
+Keywords[ro]=procesor,microprocesor,CPU,FPU,MHz,informații despre sistem
+Keywords[rw]=Munonosora,CPU,FPU,MHz,Amakuru Sisitemu
+Keywords[se]=Doaimmár,CPU,FPU,MHz,vuogádatdieđut
+Keywords[sk]=Procesor,CPU,FPU,MHz,Systémové Informácie
+Keywords[sl]=procesor,CPE,CPU,FPU,MHz,informacije o sistemu
+Keywords[sr]=Processor,CPU,FPU,MHz,System Information,процесор,системске информације
+Keywords[sr@Latn]=Processor,CPU,FPU,MHz,System Information,procesor,sistemske informacije
+Keywords[sv]=Processor,CPU,FPU,MHz,Systeminformation
+Keywords[ta]=செயலி,CPU,FPU,MHz,அமைப்புத் தகவல்
+Keywords[te]=ప్రాసెసర్, సిపియు, ఎఫ్ పి యు, ఎం హెర్జ్, వ్యవస్థ సమాచారం
+Keywords[th]=โพรเซสเซอร์,หน่วยประมวลผล,CPU,FPU,MHz,ข้อมูลระบบ
+Keywords[tr]=İşlemci,MİB,FPU,MHz,Sistem Hakkında Bilgi
+Keywords[uk]=процесор,CPU,FPU,МГц,системна інформація
+Keywords[uz]=Protsessor,CPU,FPU,MGs,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=Процессор,CPU,FPU,МГц,Тизим ҳақида маълумот
+Keywords[ven]=Mubveledzi,CPU,FPU,MHz,Mafhungo a sisitemu
+Keywords[vi]=Bộ vi xử lý,CPU,FPU,Mhz,Thông tin Hệ thống
+Keywords[wa]=Processeu,CPU,FPU,MHz,informåcion do sistinme
+Keywords[xh]=Umqhubekekisi,CPU,FPU,MHz,Inkcukacha Yendlela yokusebenza
+Keywords[zh_CN]=Processor,CPU,FPU,MHz,System Information,处理器,系统信息
+Keywords[zh_TW]=Processor,CPU,FPU,MHz,System Information,處理器,中央處理器,浮點運算器,系統資訊
+Keywords[zu]=Umqhubekisi,CPU,FPU,MHz,Ulwazi Lwesistimu
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/scsi.desktop b/kcontrol/info/scsi.desktop
new file mode 100644
index 000000000..9b62edbf7
--- /dev/null
+++ b/kcontrol/info/scsi.desktop
@@ -0,0 +1,177 @@
+[Desktop Entry]
+Exec=kcmshell scsi
+Icon=kcmscsi
+Type=Application
+DocPath=kinfocenter/scsi/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=scsi
+X-KDE-ParentApp=kinfocenter
+
+Name=SCSI
+Name[af]=Scsi
+Name[bn]=স্কাসি
+Name[fa]=اسکازی
+Name[he]=התקני SCSI
+Name[hi]=एससीएसआई
+Name[is]=SCSI-tæki
+Name[lo]=ອຸປະກອນ SCSI
+Name[ne]=एससीएसआई
+Name[ro]=Magistrala SCSI
+Name[th]=อุปกรณ์ SCSI
+
+Comment=SCSI information
+Comment[af]=Scsi informasie
+Comment[ar]=معلومات SCSI
+Comment[az]=SCSI haqqında mə'lumat
+Comment[be]=Інфармацыя аб SCSI
+Comment[bg]=Информация за SCSI шината
+Comment[bn]=স্কাসি (SCSI) তথ্য
+Comment[br]=Titouroù diwar-benn ar SCSI
+Comment[bs]=Informacije o SCSI uređajima
+Comment[ca]=Informació de SCSI
+Comment[cs]=Informace o SCSI
+Comment[csb]=Wëdowiédzô ò SCSI
+Comment[cy]=Gwybodaeth SCSI
+Comment[da]=SCSI-information
+Comment[de]=Informationen zu SCSI-Geräten
+Comment[el]=Πληροφορίες SCSI
+Comment[eo]=Informo pri SCSI
+Comment[es]=Información sobre los dispositivos SCSI
+Comment[et]=SCSI info
+Comment[eu]=SCSIri buruzko informazioa
+Comment[fa]=اطلاعات اسکازی
+Comment[fi]=SCSI-tietoja
+Comment[fr]=Informations SCSI
+Comment[fy]=SCSI-ynformaasje
+Comment[ga]=Eolas SCSI
+Comment[gl]=Información de SCSI
+Comment[he]=מידע על SCSI
+Comment[hi]=एससीएसआई जानकारी
+Comment[hr]=Podaci o SCSI sabirnici
+Comment[hu]=SCSI-információk
+Comment[id]=Informasi SCSI
+Comment[is]=Upplýsingar um SCSI-tæki
+Comment[it]=Informazioni sul bus SCSI
+Comment[ja]=SCSI の情報
+Comment[ka]=ინფორმაცია SCSI–ს შესახებ
+Comment[kk]=SCSI құрылғылар мәліметі
+Comment[km]=ព័ត៌មាន SCSI
+Comment[ko]=SCSI 정보
+Comment[lo]=ຂໍ້ມູນອຸປະກອນ SCSI
+Comment[lt]=SCSI informacija
+Comment[lv]=SCSI informācija
+Comment[mk]=Информации за SCSI
+Comment[mn]=SCSI-төхөөрөмжийн мэдээлэл
+Comment[ms]=Maklumat SCSI
+Comment[mt]=Informazzjoni dwar SCSI
+Comment[nb]=SCSI-informasjon
+Comment[nds]=Informatschoon över SCSI
+Comment[ne]=एससीएसआई सूचना
+Comment[nl]=SCSI-informatie
+Comment[nn]=SCSI-informasjon
+Comment[nso]=Tshedimoso ya SCSI
+Comment[oc]=Informacion de SCSI
+Comment[pa]=SCSI ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o SCSI
+Comment[pt]=Informação sobre o SCSI
+Comment[pt_BR]=Informações sobre SCSI
+Comment[ro]=Informații despre magistrala SCSI
+Comment[ru]=Сведения о устройствах SCSI
+Comment[rw]= Ibisobanuro SCSI
+Comment[se]=SCSI-diehtu
+Comment[sk]=Informácie o SCSI
+Comment[sl]=Podatki o vodilu SCSI
+Comment[sr]=Информације о SCSI уређајима
+Comment[sr@Latn]=Informacije o SCSI uređajima
+Comment[ss]=Umniningwane weSCSI
+Comment[sv]=SCSI-information
+Comment[ta]=SCSI தகவல்
+Comment[te]=SCSI సమాచారం
+Comment[tg]=Иттилооти SCSI
+Comment[th]=ข้อมูลอุปกรณ์ SCSI
+Comment[tr]=SCSI hakkında bilgi
+Comment[tt]=SCSI turında
+Comment[uk]=Інформація щодо SCSI
+Comment[uz]=SCSI uskunalar haqida maʼlumot
+Comment[uz@cyrillic]=SCSI ускуналар ҳақида маълумот
+Comment[ven]=Mafhungo a SCSI
+Comment[vi]=Thông tin về SCSI
+Comment[wa]=Informåcion so SCSI
+Comment[xh]=Inkcukacha ye SCSI
+Comment[zh_CN]=SCSI 信息
+Comment[zh_TW]=SCSI 資訊
+Comment[zu]=Ulwazi lwe-SCSI
+
+Keywords=SCSI,SCSI-Bus,System Information
+Keywords[af]=SCSI,SCSI-Bus,System Informasie
+Keywords[az]=SCSI,SCSI-Bus,Sistem Haqqında Mə'lumat
+Keywords[be]=Шына SCSI,Сістэмная інфармацыя,SCSI,SCSI-Bus,System Information
+Keywords[bg]=информация, система, системна, шина, SCSI, SCSI-Bus, System Information
+Keywords[br]=SCSI,bus SCSI,titouroù reizhiad
+Keywords[bs]=SCSI,SCSI-Bus,System Information,SCSI-sabirnica,informacije o sustavu
+Keywords[ca]=SCSI,Bus SCSI,Informació del sistema
+Keywords[cs]=SCSI,SCSI-sběrnice,Informace o systému
+Keywords[csb]=SCSI,magistrala SCSI,wëdowiédzô ò systemie
+Keywords[cy]=SCSI,Bws-SCSI,Gwybodaeth Cysawd
+Keywords[da]=SCSI,SCSI-bus,Systeminformation
+Keywords[de]=SCSI,SCSI-Bus,Systeminformation
+Keywords[el]=SCSI,Δίαυλος SCSI,Πληροφορίες συστήματος
+Keywords[eo]=SCSI,buso,sistemo,operaciumo,informo
+Keywords[es]=SCSI,Bus SCSI,Información del sistema
+Keywords[et]=SCSI,SCSI siin,Süsteemi info
+Keywords[eu]=SCSI,SCSI busa,Sistemaren informazioa
+Keywords[fa]=اسکازی، گذرگاه اسکازی، اطلاعات سیستم
+Keywords[fi]=SCSI,SCSI-Väylä,Järjestelmätiedot
+Keywords[fr]=SCSI,bus SCSI,informations système,scsi
+Keywords[fy]=SCSI,SCSI-bus,systeemynformaasje
+Keywords[ga]=SCSI,Bus SCSI,Eolas faoin Chóras
+Keywords[gl]=SCSI,Bus SCSI,Información do Sistema
+Keywords[he]=מידע מערכת,אפיק SCSI,SCSI,SCSI-Bus,System Information
+Keywords[hi]=एससीएसआई,एससीएसआई-बस,तंत्र जानकारी
+Keywords[hr]=SCSI,SCSI-Bus,System Information,Podaci o sustavu,SCSI sabirnica
+Keywords[hu]=SCSI,SCSI-busz,rendszerinformáció
+Keywords[id]=SCSI,SCSI-Bus,Informasi Sistem
+Keywords[is]=SCSI-braut,kerfi,upplýsingar
+Keywords[it]=SCSI,bus SCSI,informazioni sul sistema
+Keywords[ja]=SCSI,SCSI-バス,システムの情報
+Keywords[km]=SCSI,ខ្សែ​បញ្ជូន SCSI,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lo]=ອຸູປະກອນ SCSI,ບັສ SCSI,ຂໍ້ມູນຂອງລະບົບ
+Keywords[lt]=SCSI,SCSI-Bus,Sistemos Informacija
+Keywords[lv]=SCSI,SCSI-Šina,Sistēmas Informācija
+Keywords[mk]=SCSI,SCSI-Bus,System Information,SCSI магистрала, SCSI собирница,Информации за системот,
+Keywords[mn]=SCSI,SCSI-Bus,Системийн мэдээлэл
+Keywords[nb]=SCSI,SCSI-buss,Systeminformasjon
+Keywords[nds]=SCSI,SCSI-Bus,Systeeminformatschoon
+Keywords[ne]=एससीएसआई, एससीएसआई-बस, प्रणाली सूचना
+Keywords[nl]=SCSI,SCSI-bus,systeeminformatie
+Keywords[nn]=SCSI,SCSI-buss,systeminformasjon
+Keywords[nso]=SCSI,SCSI-Bus,Tshedimoso ya System
+Keywords[oc]=SCSI,Bus SCSI,Informacion dèu sistemo
+Keywords[pa]=SCSI,SCSI-Bus,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=SCSI,magistrala SCSI,informacja o systemie
+Keywords[pt]=SCSI,bus SCSI,informações do sistema
+Keywords[pt_BR]=SCSI,Barramento SCSI,Informações de sistema
+Keywords[ro]=SCSI,magistrala SCSI,bus SCSI,informații despre sistem
+Keywords[rw]=SCSI,Bisi-SCSI,Amakuru Sisitemu
+Keywords[se]=SCSI,SCSI-bussa,vuogádatdiehtu
+Keywords[sk]=SCSI,SCSI-zbernica,Systémové Informácie
+Keywords[sl]=SCSI,vodilo SCSI,informacije o sistemu
+Keywords[sr]=SCSI,SCSI-Bus,System Information,SCSI магистрала,системске информације
+Keywords[sr@Latn]=SCSI,SCSI-Bus,System Information,SCSI magistrala,sistemske informacije
+Keywords[sv]=SCSI,SCSI-buss,Systeminformation
+Keywords[ta]=SCSI,SCSI-பஸ்,அமைப்பு தகவல்
+Keywords[th]=อุปกรณ์ SCSI,บัส SCSI,ข้อมูลระบบ
+Keywords[tr]=SCSI,SCSI-Bus,Sistem Hakkında Bilgi
+Keywords[uk]=SCSI,шина SCSI,системна інформація
+Keywords[uz]=SCSI,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=SCSI,Тизим ҳақида маълумот
+Keywords[ven]=SCSI,SCSI-Bus,Mafhungo a sisitemu
+Keywords[vi]=SCSI,SCSI-Bus,Thông tin Hệ thống
+Keywords[wa]=SCSI,Bus SCSI,informåcion do sistinme
+Keywords[xh]=SCSI,SCSI-Ibhasi,Ulwazi lwendlela
+Keywords[zh_CN]=SCSI,SCSI-Bus,System Information,SCSI 总线,系统信息
+Keywords[zh_TW]=SCSI,SCSI-Bus,System Information,系統資訊
+Keywords[zu]=SCSI,Ibhasi-SCSI,Ulwazi Lwesistimu
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/sound.desktop b/kcontrol/info/sound.desktop
new file mode 100644
index 000000000..6a96da85d
--- /dev/null
+++ b/kcontrol/info/sound.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=kcmshell sound
+Icon=kcmsound
+Type=Application
+DocPath=kinfocenter/sound/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=sound
+X-KDE-ParentApp=kinfocenter
+
+Name=Sound
+Name[af]=Klank
+Name[ar]=الصوت
+Name[az]=Səs
+Name[be]=Гук
+Name[bg]=Аудио
+Name[bn]=সাউণ্ড
+Name[br]=Son
+Name[bs]=Zvuk
+Name[ca]=So
+Name[cs]=Zvuk
+Name[csb]=Zwãk
+Name[cy]=Sain
+Name[da]=Lyd
+Name[el]=Ήχος
+Name[eo]=Sono
+Name[es]=Sonido
+Name[et]=Heli
+Name[eu]=Soinua
+Name[fa]=صوت
+Name[fi]=Ääni
+Name[fo]=Ljóð
+Name[fr]=Son
+Name[fy]=Lûd
+Name[ga]=Fuaim
+Name[gl]=Son
+Name[he]=צליל
+Name[hi]=ध्वनि
+Name[hr]=Zvuk
+Name[hu]=Hang
+Name[id]=Suara
+Name[is]=Hljóð
+Name[it]=Suono
+Name[ja]=サウンド
+Name[ka]=ხმა
+Name[kk]=Дыбыс
+Name[km]=សំឡេង
+Name[ko]=소리
+Name[lo]=ລະບົບສງງ
+Name[lt]=Garsas
+Name[lv]=Skaņa
+Name[mk]=Звук
+Name[mn]=Чимээ
+Name[ms]=Bunyi
+Name[mt]=Ħsejjes
+Name[nb]=Lyd
+Name[nds]=Kläng
+Name[ne]=ध्वनि
+Name[nl]=Geluid
+Name[nn]=Lyd
+Name[nso]=Modumo
+Name[oc]=Son
+Name[pa]=ਧੁਨੀ
+Name[pl]=Dźwięk
+Name[pt]=Som
+Name[pt_BR]=Som
+Name[ro]=Sunet
+Name[ru]=Звук
+Name[rw]=ijwi
+Name[se]=Jietna
+Name[sk]=Zvuk
+Name[sl]=Zvok
+Name[sr]=Звук
+Name[sr@Latn]=Zvuk
+Name[ss]=Umsindvo
+Name[sv]=Ljud
+Name[ta]=ஒலி
+Name[te]=శబ్దం
+Name[tg]=Садо
+Name[th]=ระบบเสียง
+Name[tr]=Ses
+Name[tt]=Tawış
+Name[uk]=Звук
+Name[uz]=Tovush
+Name[uz@cyrillic]=Товуш
+Name[ven]=Mubvumo
+Name[vi]=Âm thanh
+Name[wa]=Son
+Name[xh]=Isandi
+Name[zh_CN]=音效
+Name[zh_TW]=音效
+Name[zu]=Umsindo
+
+Comment=Sound information
+Comment[af]=Klank informasie
+Comment[ar]=معلومات الصوت
+Comment[az]=Səs haqqında mə'lumat
+Comment[be]=Інфармацыя аб гуку
+Comment[bg]=Информация за аудио системата
+Comment[bn]=শব্দ সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn ar son
+Comment[bs]=Informacije o zvuku
+Comment[ca]=Informació del so
+Comment[cs]=Informace o zvuku
+Comment[csb]=Wëdowiédzô ò nastôwach zwãkù
+Comment[cy]=Gwybodaeth Sain
+Comment[da]=Information om lyd
+Comment[de]=Informationen zur Soundkarte
+Comment[el]=Πληροφορίες για τον Ήχο
+Comment[eo]=Informo pri Sono
+Comment[es]=Información sobre el sonido
+Comment[et]=Heliseadmete info
+Comment[eu]=Soinuari buruzko informazioa
+Comment[fa]=اطلاعات صوتی
+Comment[fi]=Äänitiedot
+Comment[fr]=Informations sur le son
+Comment[fy]=Lûdssysteemynformaasje
+Comment[ga]=Eolas fuaime
+Comment[gl]=Información do Son
+Comment[he]=מידע על צליל
+Comment[hi]=ध्वनि जानकारी
+Comment[hr]=Podaci o zvuku
+Comment[hu]=A hangkezelés jellemzői
+Comment[id]=Informasi Suara
+Comment[is]=Upplýsingar um hljóð
+Comment[it]=Informazioni sul suono
+Comment[ja]=サウンドの情報
+Comment[ka]=ინფორმაცია ხმის შესახებ
+Comment[kk]=Дыбыс мәліметі
+Comment[km]=ព័ត៌មាន​សំឡេង
+Comment[ko]=소리 정보
+Comment[lo]=ຂໍ້ມູນລະບົບສງງ
+Comment[lt]=Garso informacija
+Comment[lv]=Skaņas informācija
+Comment[mk]=Информации за звукот
+Comment[mn]=Дууны картын мэдээлэл
+Comment[ms]=Maklumat bunyi
+Comment[mt]=Informazzjoni dwar Ħsejjes
+Comment[nb]=Lydinformasjon
+Comment[nds]=Klang-Informatschoon
+Comment[ne]=ध्वनि सूचना
+Comment[nl]=Geluidssysteeminformatie
+Comment[nn]=Lydinformasjon
+Comment[nso]=Tshedimoso ya Modumo
+Comment[oc]=Informacion dèu son
+Comment[pa]=ਧੁਨੀ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o ustawieniach dźwięku
+Comment[pt]=Informação sobre o som
+Comment[pt_BR]=Informações sobre o Som
+Comment[ro]=Informații despre placa de sunet
+Comment[ru]=Сведения о звуке
+Comment[rw]= Ibisobanuro by'Ijwi
+Comment[se]=Jietnadiehtu
+Comment[sk]=Informácie o zvuku
+Comment[sl]=Podatki o zvoku
+Comment[sr]=Информације о звуку
+Comment[sr@Latn]=Informacije o zvuku
+Comment[ss]=Umniningwane wemsidvo
+Comment[sv]=Ljudinformation
+Comment[ta]=ஒலித் தகவல்
+Comment[te]=శబ్ద సమాచారం
+Comment[tg]=Иттилооти садо
+Comment[th]=ข้อมูลระบบเสียง
+Comment[tr]=Ses hakkında bilgi
+Comment[tt]=Tawış turında
+Comment[uk]=Інформація щодо звукової карти
+Comment[uz]=Tovush haqida maʼlumot
+Comment[uz@cyrillic]=Товуш ҳақида маълумот
+Comment[ven]=Mafhungo a mubvumo
+Comment[vi]=Thông tin về âm thanh
+Comment[wa]=Informåcion sol son
+Comment[xh]=Inkcukacha yesandi
+Comment[zh_CN]=音响效果信息
+Comment[zh_TW]=音效資訊
+Comment[zu]=Ulwazi Lomsindo
+
+Keywords=Sound,Audio,Soundcard,MIDI,OSS,System Information
+Keywords[af]=Sound,Audio,Soundcard,Midi,OSS,System Informasie
+Keywords[az]=Sound,Audio,Soundcard,MIDI,OSS,System Information,Səs,Səskartı,Midi,OSS,Sistem Haqqında Mə'lumat
+Keywords[be]=Гук,Аўдыё,Гукавая карта,Сістэмная інфармацыя,Сінтэзатар,Sound,Audio,Soundcard,MIDI,OSS,System Information
+Keywords[bg]=информация, система, системна, аудио, звук Sound, Audio, Soundcard, MIDI, OSS, System Information
+Keywords[br]=Son,klevet,kartenn son,MIDI,OSS,titouroù reizhiad
+Keywords[bs]=Sound,Audio,Soundcard,Midi,OSS,System Information,Zvuk,Informacije o sistemu,Zvučna kartica
+Keywords[ca]=So,Àudio,tarja de so,MIDI,OSS,Informació del sistema
+Keywords[cs]=Zvuk,Audio,Zvuková karta,Midi,OSS,Informace o systému
+Keywords[csb]=zwãk,audio,zwãkòwô karta,Midi,OSS,wëdowiédzô ò systemie
+Keywords[cy]=Sain,Swn,Cerdyn Sain,Midi,OSS,Gwybodaeth Gysawd
+Keywords[da]=Lyd,Audio,Lydkort,MIDI,OSS,Systeminformation
+Keywords[de]=Klänge,Sound,Audio,Soundkarte,Systemklänge,Midi,OSS,Systeminformation
+Keywords[el]=Ήχος,Μουσική,Κάρτα ήχου,MIDI,OSS,Πληροφορίες συστήματος
+Keywords[eo]=Sonoro,Sono,Aŭdio,Sonorkarto,MIDI,OSS,sistemo,informo,operaciumo
+Keywords[es]=Sonido,Audio,Tarjeta de sonido,MIDI,OSS,Información del sistema
+Keywords[et]=Heli,Audio,Helikaart,MIDI,OSS,Süsteemi info
+Keywords[eu]=Soinua,Audioa,Soinu txartela,Midi,OSS,Sistemaren informazioa
+Keywords[fa]=صوت، صوتی، کارت صوتی ،MIDI ،OSS ،اطلاعات سیستم
+Keywords[fi]=Ääni,Äänikortti,Midi,OSS,Järjestelmätiedot
+Keywords[fr]=son,audio,carte son,midi,OSS,informations système
+Keywords[fy]=lûd,audio,soundcard,midi,OSS,systeemynformaasje,ALSA,lûdskaart
+Keywords[ga]=Fuaim,Cárta Fuaime,MIDI,OSS,Eolas faoin Chóras
+Keywords[gl]=Son,Audio,Tarxeta de son,Midi,OSS,Información do Sistema
+Keywords[he]=מידע מערכת,OSS,Midi,צליל,שמע,כרטיס קול,מידי,Sound, Audio,Soundcard,MIDI,OSS,System Information
+Keywords[hi]=ध्वनि,ऑडियो,साउंडकार्ड,मिडी,ओएसएस,तंत्र जानकारी
+Keywords[hr]=Sound,Audio,Soundcard,Midi,OSS,System Information,Zvuk,Podaci o sustavu,Zvučna kartica
+Keywords[hu]=hang,audió,hangkártya,MIDI,OSS,rendszerinformáció
+Keywords[id]=Sound,Audio,KartuSuara,Midi,OSS,Informasi Sistem
+Keywords[is]=Hljóð,Hljóðkort,kerfi,upplýsingar,OSS,MIDI
+Keywords[it]=suono,audio,scheda sonora,MIDI,OSS,informazioni sul sistema
+Keywords[ja]=サウンド,オーディオ,サウンドカード,MIDI,OSS,システムの情報
+Keywords[ka]=ხმა,აუდიო,აუდიოდაბა,MIDI,OSS,ინფორმაცია სისტემის შესახებ
+Keywords[km]=សំឡេង,សោត,បន្ទះ​សំឡេង,MIDI,OSS,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lt]=Garsas,Audio,Garso korta,Midi,OSS,Sistemos informacija
+Keywords[lv]=Skaņa,Audio,Skaņaskarte,MIDI,OSS,Sistēmas Informācija
+Keywords[mk]=Sound,Audio,Soundcard,MIDI,OSS,System Information,Звук,Аудио,Звучна картичка,Информации за системот
+Keywords[mt]=Sound,Audio,Soundcard,MIDI,OSS,System Information,Ħsejjes
+Keywords[nb]=Lyd,Lydkort,Midi,OSS,Systeminformasjon
+Keywords[nds]=Klang,Audio,Soundkort,Midi,OSS,Systeeminformatschoon
+Keywords[ne]=ध्वनि, अडियो, ध्वनि कार्ड, MIDI, OSS, प्रणाली सूचना
+Keywords[nl]=geluid,audio,soundcard,midi,OSS,systeeminformatie,ALSA,geluidskaart
+Keywords[nn]=lyd,lydkort,MIDI,OSS,systeminformasjon
+Keywords[pa]=Sound,Audio,Soundcard,MIDI,OSS,ਸਿਸਟਮ ਜਾਣਕਾਰੀ,ਆਡੀਓ,ਸਾਊਂਡਕਾਰਡ
+Keywords[pl]=dźwięk,audio,karta dźwiekowa,Midi,OSS,informacja o systemie
+Keywords[pt]=som,áudio,placa de som,midi,oss,informações de sistema
+Keywords[pt_BR]=Som,Áudio,placa de som,MIDI,OSS,Informações de sistema
+Keywords[ro]=sunet,audio,placă de sunet,card de sunet,MIDI,OSS,informații despre sistem
+Keywords[rw]=Ijwi,Inyumvo,Ikaritaijwi,MIDI,OSS,Amakuru Sisitemu
+Keywords[se]=jietna,jietnagoarta,midi,OSS,vuogádatdiehtu
+Keywords[sk]=Zvuk,Zvuky,Zvuková karta,MIDI,OSS,Systémové Informácie
+Keywords[sl]=zvok,glasba,zvočna kartica,avdio,midi,OSS,informacije o sistemu
+Keywords[sr]=Sound,Аудио,Soundcard,Midi,OSS,System Information,Звук,Аудио,звучна карта,звучна картица,миди,системске информације
+Keywords[sr@Latn]=Sound,Audio,Soundcard,Midi,OSS,System Information,Zvuk,Audio,zvučna karta,zvučna kartica,midi,sistemske informacije
+Keywords[sv]=Ljud,Ljudkort,Midi,OSS,Systeminformation
+Keywords[ta]=ஒலி,ஒலி அமைப்பு,ஒலி அட்டை,மிடி,OSS,சாதன தகவல்
+Keywords[th]=เสียง,ระบบเสียง,แผงวงจรเสียง,มิดี้,OSS,ข้อมูลระบบ
+Keywords[tr]=Ses,Seskartı,Midi,OSS,Sistem Bilgisi,MIDI
+Keywords[uk]=звук,аудіо,sound,audio,звукова плата,midi,oss,системна інформація
+Keywords[uz]=MIDI,OSS,Tovush,Audio,Tovush kartasi,Tizm haqida maʼlumot
+Keywords[uz@cyrillic]=MIDI,OSS,Товуш,Аудио,Товуш картаси,Тизм ҳақида маълумот
+Keywords[vi]=Âm thanh,âm,Bo mạch âm thanh,Midi,OSS,Thông tin Hệ thống
+Keywords[wa]=Son,Audiocåte son,MIDI,OSS,informåcion do sistinme
+Keywords[zh_CN]=Sound,Audio,Soundcard,MIDI,OSS,System Information,音频,音响,声卡,系统信息
+Keywords[zh_TW]=Sound,Audio,Soundcard,Midi,OSS,系統資訊
+Categories=Qt;KDE;X-KDE-information;
diff --git a/kcontrol/info/xserver.desktop b/kcontrol/info/xserver.desktop
new file mode 100644
index 000000000..1751a4b6e
--- /dev/null
+++ b/kcontrol/info/xserver.desktop
@@ -0,0 +1,227 @@
+[Desktop Entry]
+Exec=kcmshell xserver
+Icon=kcmx
+Type=Application
+DocPath=kinfocenter/xserver/index.html
+
+
+X-KDE-Library=info
+X-KDE-FactoryName=xserver
+X-KDE-ParentApp=kinfocenter
+
+Name=X-Server
+Name[af]=X-bediener
+Name[ar]=خادم X
+Name[az]=X-Vericisi
+Name[be]=Сервер X
+Name[bg]=Сървър X
+Name[bn]=এক্স-সার্ভার
+Name[br]=Servijer X
+Name[ca]=Servidor X
+Name[csb]=X-Serwera
+Name[cy]=Gweinydd-X
+Name[da]=X-server
+Name[el]=Εξυπηρετητής-X
+Name[eo]=X-servilo
+Name[es]=Servidor X
+Name[et]=X'i server
+Name[eu]=X zerbitzaria
+Name[fa]=کارساز X
+Name[fi]=X-palvelin
+Name[fr]=Serveur X
+Name[ga]=Freastalaí X
+Name[gl]=Servidor X
+Name[he]=שרת X
+Name[hi]=एक्स-सर्वर
+Name[hr]=X-poslužitelj
+Name[hu]=X-kiszolgáló
+Name[id]=Server-X
+Name[is]=X-þjónn
+Name[it]=Server X
+Name[ja]=X サーバ
+Name[ka]=X-სერვერი
+Name[kk]=X-сервер
+Name[ko]=X 서버
+Name[lo]=ເຊີຟເວີ X
+Name[lt]=X-Serveris
+Name[lv]=X-Serveris
+Name[mk]=X-сервер
+Name[mn]=X-Сервер
+Name[ms]=Pelayan X
+Name[nb]=X-tjener
+Name[ne]=X-सर्भर
+Name[nl]=X-server
+Name[nn]=X-tenar
+Name[nso]=Moabi wa X
+Name[oc]=Servor X
+Name[pa]=X-ਸਰਵਰ
+Name[pl]=X-Serwer
+Name[pt]=Servidor X
+Name[pt_BR]=Servidor X
+Name[ro]=Server X
+Name[ru]=X-сервер
+Name[rw]=X-Seriveri
+Name[se]=X-bálvá
+Name[sl]=Strežnik X
+Name[sr]=X-Сервер
+Name[ss]=Sigcini X
+Name[sv]=X-server
+Name[ta]=X-சேவகன்
+Name[te]=ఎక్స్-సెర్వర్
+Name[tg]=Сервери-X
+Name[th]=เซิร์ฟเวอร์ X
+Name[tr]=X-Sunucusu
+Name[uz@cyrillic]=X-Сервер
+Name[ven]=Siva ya X
+Name[vi]=Trình phục vụ X
+Name[wa]=Siervieu X
+Name[xh]=Umncedisi we-X
+Name[zh_CN]=X 服务器
+Name[zh_TW]=X 伺服器
+Name[zu]=Umlekeleli we-X
+
+Comment=X-Server information
+Comment[af]=X-bediener informasie
+Comment[ar]=معلومات عن خادم X
+Comment[az]=X-Vericisi haqqında mə'lumat
+Comment[be]=Інфармацыя аб серверы X
+Comment[bg]=Информация за сървъра X
+Comment[bn]=এক্স-সার্ভার সংক্রান্ত তথ্য
+Comment[br]=Titouroù diwar-benn ar servijer X
+Comment[bs]=Informacije o X-Serveru
+Comment[ca]=Informació del servidor X
+Comment[cs]=Informace o X-Serveru
+Comment[csb]=Wëdowiédzô ò X-serwerze
+Comment[cy]=Gwybodaeth Gweinydd-X
+Comment[da]=Information om X-serveren
+Comment[de]=Informationen zum X-Server
+Comment[el]=Πληροφορίες εξυπηρετητή X
+Comment[eo]=Informo pri X-servilo
+Comment[es]=Información sobre el servidor X
+Comment[et]=X'i serveri info
+Comment[eu]=X zerbitzariari buruzko informazioa
+Comment[fa]=اطلاعات کارساز X
+Comment[fi]=X-palvelimen tiedot
+Comment[fr]=Informations sur le serveur X
+Comment[fy]=X-Server-ynformaasje
+Comment[ga]=Eolas faoin bhfreastalaí X
+Comment[gl]=Información do Servidor X
+Comment[he]=מידע על שרת ה־X
+Comment[hi]=एक्स-सर्वर जानकारी
+Comment[hr]=Podaci o X-poslužitelju
+Comment[hu]=Az X-kiszolgáló jellemzői
+Comment[id]=Informasi Server-X
+Comment[is]=Upplýsingar um X-þjón
+Comment[it]= Informazioni sul server X
+Comment[ja]=X サーバの情報
+Comment[ka]=ინფორმაცია X-სერვერის შესახებ
+Comment[kk]=X-сервер мәліметі
+Comment[km]=ព័ត៌មាន X-Server
+Comment[ko]=X 서버 정보
+Comment[lo]=ຂໍ້ມູນເຊີຟເວີ X
+Comment[lt]=X-Serverio informacija
+Comment[lv]=X-Servera informācija
+Comment[mk]=Информации за X-серверот
+Comment[mn]=X-серверийн мэдээлэл
+Comment[ms]=Maklumat Pelayan X
+Comment[mt]=Informazzjoni dwar X-Server
+Comment[nb]=X-tjenerinformasjon
+Comment[nds]=Informatschoon över den X-Server
+Comment[ne]=X-सर्भर सूचना
+Comment[nl]=X-Server-informatie
+Comment[nn]=X-tenarinformasjon
+Comment[nso]=Moabi wa Tshedimoso ya X
+Comment[oc]=Informacion dèu servor X
+Comment[pa]=X-ਸਰਵਰ ਜਾਣਕਾਰੀ
+Comment[pl]=Informacje o X-serwerze
+Comment[pt]=Informações sobre o servidor X
+Comment[pt_BR]=Informações do servidor X
+Comment[ro]=Informații despre serverul X
+Comment[ru]=Сведения об X-сервере
+Comment[rw]=Ibisobanuro bya X-Seriveri
+Comment[se]=X-bálvádiehtu
+Comment[sk]=Informácie o X serveri
+Comment[sl]=Podatki o strežniku X
+Comment[sr]=Информације о X серверу
+Comment[sr@Latn]=Informacije o X serveru
+Comment[ss]=Umniningwane wesigcini X
+Comment[sv]=X-serverinformation
+Comment[ta]=X-சேவகன் தகவல்
+Comment[te]=ఎక్స్-సెర్వర్ సమాచారం
+Comment[tg]=Иттилооти Сервери-X
+Comment[th]=ข้อมูลเซิร์ฟเวอร์ X
+Comment[tr]=X-Sunucusu hakkında bilgi
+Comment[tt]=X-Server turında
+Comment[uk]=Інформація щодо X-Server
+Comment[uz]=X-Server haqida maʼlumot
+Comment[uz@cyrillic]=X-Сервер ҳақида маълумот
+Comment[ven]=Mafhungo a siva ya X
+Comment[vi]=Thông tin về trình phục vụ X
+Comment[wa]=Informåcion sol sierveu X
+Comment[xh]=Ulwazi lomncedisi we-X
+Comment[zh_CN]=X 服务器信息
+Comment[zh_TW]=X 伺服器資訊
+Comment[zu]=Ulwazi lomlekeleli we-X
+
+Keywords=X,X-Server,XServer,XFree86,Display,VideoCard,System Information
+Keywords[az]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,X-Verici,XVerici,XFree86,Displey,Sistem Haqqında Mə'lumat
+Keywords[be]=Сервер X,Дысплей,Відэакарта,Сістэмная інфармацыя,X,X-Server,XServer,XFree86,Display,VideoCard,System Information
+Keywords[bg]=екран, видеокарта, системна информация, сървър, X, X-Server, XServer, XFree86, Display, VideoCard, System Information
+Keywords[br]=X,servijer X,XServer,XFree86,diskwel,kartenn video,titouroù reizhiad
+Keywords[bs]=X,X-Server,XServer,XFree86,VideoCard,Display,System Information, Ekran, Informacije o sistemu
+Keywords[ca]=X,Servidor X,XServer,XFree86,Monitor,Targeta de video,Informació del sistema
+Keywords[cs]=X,X-server,XServer,XFree86,Obrazovka,Informace o systému,Videokarta
+Keywords[csb]=X,X serwera,Xserwera,XFree86,graficznô karta,grafika,wëdowiédzô ò systemie
+Keywords[da]=X,X-server,Xserver,XFree86,Skærm,Videokort,Systeminformation
+Keywords[el]=X,Εξυπηρετητής-X,XServer,XFree86,Οθόνη,Κάρτα Γραφικών, Πληροφορίες συστήματος
+Keywords[eo]=X,X-servilo,XFree86,ekrano,fenestroj,sistemo,operaciumo,informo
+Keywords[es]=X,X-Server,XServer,XFree86,Monitor,Tarjeta, Gráfica,Sistema,Información
+Keywords[et]=X,X'i server,X Server,XFree86,Ekraan,Videokaart,Süsteemi info
+Keywords[eu]=X,X-Server,XServer,XFree86,Display,VideoCard,sistema informazioa
+Keywords[fa]=X، کارساز، X، XServer، XFree86، صفحه نمایش، کارت ویدیو، اطلاعات سیستم
+Keywords[fr]=X,serveur X,XFree86,XServer,moniteur,affichage,informations système,xfree,carte vidéo,carte graphique
+Keywords[fy]=X,X-Server,XServer,XFree86,display,systeemynformaasje,byldskerm,grafyske kaart
+Keywords[ga]=X,Freastalaí-X,XFree86,Scáileán,Físchárta,Eolas faoin Chóras
+Keywords[gl]=X,Servidor X,XServer,XFree86,Pantalla,Display,Información do Sistema
+Keywords[he]=תצוגה,מידע מערכת,XFree86,שרת X,X, כרטיס מסך,X-Server,XServer,XFree86,Display,VideoCard, System Information, Xorg
+Keywords[hi]=एक्स,एक्स-सर्वर,एक्ससर्वर,एक्सफ्री86,प्रदर्शक,वीडियोकार्ड,तंत्र जानकारी
+Keywords[hr]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,X-poslužitelj,X poslužitelj,Zaslon,Video kartica,Grafička kartica,Podaci o sustavu
+Keywords[hu]=X,X-kiszolgáló,XServer,XFree86,képernyő,videokártya,rendszerinformáció
+Keywords[id]=X,Server-X,XServer,XFree86,Tampilan,KartuVideo,Informasi Sistem
+Keywords[is]=X,X-Server,X-þjónn,XServer,Xþjónn,XFree86,Display,skjár, VideoCard,skjákort,System Information,kerfisupplýsingar
+Keywords[it]=X,Server X,XServer,XFree86,display,schermo,informazioni sul sistema,SchedaVideo
+Keywords[ja]=X,X-サーバ,Xサーバ,XFree86,ディスプレイ,システム情報
+Keywords[ka]=X,X-სერვერი,Xსერვერი,XFree86,დსიპლეი, ვიდეოდაფა,ინფორმაცია სისტების შესახებ
+Keywords[km]=X,X-Server,XServer,XFree86,បង្ហាញ,បន្ទះ​វីដេអូ,ព័ត៌មាន​ប្រព័ន្ធ
+Keywords[lt]=X,X-Serveris,XServer,XFree86,Displėjus,Video plokštė,Sistemos informacija
+Keywords[lv]=X,X-Serveris,XServeris,XFree86,Ekrāns,Sistēmas Informācija
+Keywords[mk]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,X сервер,Екран,Видеокартичка,Информации за системот
+Keywords[mt]=X,X-Server,XServer,XFree86,Display,System Information
+Keywords[nb]=X,X-tjener,Xtjener,XFree86,skjerm,videokort,systeminformasjon
+Keywords[nds]=X,X-Server,XServer,XFree86,Display,Dorstellen,Videokort,Systeeminformatschoon
+Keywords[ne]=X, X-सर्भर, Xसर्भर, Xस्वतन्त्र 86, प्रदर्शन गर्नुहोस्, भिडियो कार्ड, प्रणाली सूचना
+Keywords[nl]=X,X-Server,XServer,XFree86,display,systeeminformatie,beeldscherm,videokaart
+Keywords[nn]=X,X-tenar,XServer,XFree86,skjerm,skjermkort,systeminformasjon
+Keywords[pa]=X,X-Server,XServer,XFree86,ਦਰਿਸ਼,ਵੀਡਿਓ ਕਾਰਡ,ਸਿਸਟਮ ਜਾਣਕਾਰੀ
+Keywords[pl]=X,X serwer,Xserwer,XFree86,karta graficzna,grafika,informacja o systemie
+Keywords[pt]=X,servidor X,XServer,XFree86,ecrã,placa de vídeo,informações de sistema
+Keywords[pt_BR]=X,Servidor X,XFree,XFree86,Display,Tela,Placa de Vídeo,Informações do sistema
+Keywords[ro]=X,server X,XServer,XFree86,ecran,afișare,placă video,informații despre sistem
+Keywords[rw]=X,X-Seriveri,XSeriveri,XFree86,Kwerekana,IkaritaVidewo,Amakuru Sisitemu
+Keywords[sk]=X,X-Server,XServer,XFree86,Display,VideoCard,Systémové Information
+Keywords[sl]=X,strežnik X,X-strežnik,XServer,XFree86,zaslon,grafična kartica,Podatki o sistemu,sistemske informacije
+Keywords[sr]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,екран,видео картица
+Keywords[sr@Latn]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,ekran,video kartica
+Keywords[sv]=X,X-server,Xserver,Xfree86,skärm,videokort,systeminformation
+Keywords[ta]=X,X-சேவகன்,Xசேவகன்,XFree86, காட்சி,படக்காட்சிஅட்டை,அமைப்பு தகவல்
+Keywords[th]=X,เซิร์ฟเวอร์ X,XServer,XFree86,จอแสดงผล,แผงวงจรวิดีโอ,ข้อมูลระบบ
+Keywords[tr]=X,X-Server,XServer,X sunucu, X-sunucu,Xsunucu,XFree86,Görüntü,Video Kartı,Sistem Bilgisi
+Keywords[uk]=X,X-Server,XServer,XFree86,Display,системна інформація,монітор,X сервер,відео карта
+Keywords[uz]=X,X server,XFree86,xorg,X-Server,Displey,video karta,Tizim haqida maʼlumot
+Keywords[uz@cyrillic]=X,X сервер,XFree86,xorg,X-Сервер,Дисплей,видео карта,Тизим ҳақида маълумот
+Keywords[vi]=X,Trình phục vụ X,XServer,XFree86,Màn hình,Thông tin Hệ thống
+Keywords[wa]=X,X-Server,XServer,sierveu X,XFree86,håynaedje,Display,cåte videyo,informåcion do sistinme
+Keywords[zh_CN]=X,X-Server,XServer,XFree86,Display,VideoCard,System InformationX 服务器,显示器,显卡,系统信息
+Keywords[zh_TW]=X,X-Server,XServer,XFree86,Display,VideoCard,System Information,X 伺服器,X伺服器,顯示器,顯示卡,系統資訊
+
+Categories=Qt;KDE;X-KDE-information;